quiterss-0.18.3/000077500000000000000000000000001265173051100134635ustar00rootroot00000000000000quiterss-0.18.3/.travis.yml000066400000000000000000000003701265173051100155740ustar00rootroot00000000000000sudo: required language: cpp compiler: - gcc - clang env: - CONFIG=release QT=4 - CONFIG=debug QT=4 - CONFIG=release QT=5 - CONFIG=debug QT=5 before_install: buildbots/travis-ci/01-before_install.sh script: buildbots/travis-ci/02-script.sh quiterss-0.18.3/3rdparty/000077500000000000000000000000001265173051100152335ustar00rootroot00000000000000quiterss-0.18.3/3rdparty/qftp/000077500000000000000000000000001265173051100162055ustar00rootroot00000000000000quiterss-0.18.3/3rdparty/qftp/qftp.cpp000066400000000000000000002270271265173051100176750ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: https://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //#define QFTPPI_DEBUG //#define QFTPDTP_DEBUG #include "qftp.h" #include "qabstractsocket.h" #ifndef QT_NO_FTP #include "qcoreapplication.h" #include "qtcpsocket.h" #include "qurlinfo.h" #include "qstringlist.h" #include "qregexp.h" #include "qtimer.h" #include "qfileinfo.h" #include "qhash.h" #include "qtcpserver.h" #include "qlocale.h" QT_BEGIN_NAMESPACE class QFtpPI; /* The QFtpDTP (DTP = Data Transfer Process) controls all client side data transfer between the client and server. */ class QFtpDTP : public QObject { Q_OBJECT public: enum ConnectState { CsHostFound, CsConnected, CsClosed, CsHostNotFound, CsConnectionRefused }; QFtpDTP(QFtpPI* p, QObject* parent = 0); void setData(QByteArray*); void setDevice(QIODevice*); void writeData(); void setBytesTotal(qint64 bytes); bool hasError() const; QString errorMessage() const; void clearError(); void connectToHost(const QString &host, quint16 port); int setupListener(const QHostAddress &address); void waitForConnection(); QTcpSocket::SocketState state() const; qint64 bytesAvailable() const; qint64 read(char* data, qint64 maxlen); QByteArray readAll(); void abortConnection(); static bool parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo* info); signals: void listInfo(const QUrlInfo &); void readyRead(); void dataTransferProgress(qint64, qint64); void connectState(int); private slots: void socketConnected(); void socketReadyRead(); void socketError(QAbstractSocket::SocketError); void socketConnectionClosed(); void socketBytesWritten(qint64); void setupSocket(); void dataReadyRead(); private: void clearData(); QTcpSocket* socket; QTcpServer listener; QFtpPI* pi; QString err; qint64 bytesDone; qint64 bytesTotal; bool callWriteData; // If is_ba is true, ba is used; ba is never 0. // Otherwise dev is used; dev can be 0 or not. union { QByteArray* ba; QIODevice* dev; } data; bool is_ba; QByteArray bytesFromSocket; }; /********************************************************************** * * QFtpPI - Protocol Interpreter * *********************************************************************/ class QFtpPI : public QObject { Q_OBJECT public: QFtpPI(QObject* parent = 0); void connectToHost(const QString &host, quint16 port); bool sendCommands(const QStringList &cmds); bool sendCommand(const QString &cmd) { return sendCommands(QStringList(cmd)); } void clearPendingCommands(); void abort(); QString currentCommand() const { return currentCmd; } bool rawCommand; bool transferConnectionExtended; QFtpDTP dtp; // the PI has a DTP which is not the design of RFC 959, but it // makes the design simpler this way signals: void connectState(int); void finished(const QString &); void error(int, const QString &); void rawFtpReply(int, const QString &); private slots: void hostFound(); void connected(); void connectionClosed(); void delayedCloseFinished(); void readyRead(); void error(QAbstractSocket::SocketError); void dtpConnectState(int); private: // the states are modelled after the generalized state diagram of RFC 959, // page 58 enum State { Begin, Idle, Waiting, Success, Failure }; enum AbortState { None, AbortStarted, WaitForAbortToFinish }; bool processReply(); bool startNextCmd(); QTcpSocket commandSocket; QString replyText; char replyCode[3]; State state; AbortState abortState; QStringList pendingCommands; QString currentCmd; bool waitForDtpToConnect; bool waitForDtpToClose; QByteArray bytesFromSocket; friend class QFtpDTP; }; /********************************************************************** * * QFtpCommand implemenatation * *********************************************************************/ class QFtpCommand { public: QFtpCommand(QFtp::Command cmd, QStringList raw, const QByteArray &ba); QFtpCommand(QFtp::Command cmd, QStringList raw, QIODevice* dev = 0); ~QFtpCommand(); int id; QFtp::Command command; QStringList rawCmds; // If is_ba is true, ba is used; ba is never 0. // Otherwise dev is used; dev can be 0 or not. union { QByteArray* ba; QIODevice* dev; } data; bool is_ba; static QBasicAtomicInt idCounter; }; QBasicAtomicInt QFtpCommand::idCounter = Q_BASIC_ATOMIC_INITIALIZER(1); QFtpCommand::QFtpCommand(QFtp::Command cmd, QStringList raw, const QByteArray &ba) : command(cmd), rawCmds(raw), is_ba(true) { id = idCounter.fetchAndAddRelaxed(1); data.ba = new QByteArray(ba); } QFtpCommand::QFtpCommand(QFtp::Command cmd, QStringList raw, QIODevice* dev) : command(cmd), rawCmds(raw), is_ba(false) { id = idCounter.fetchAndAddRelaxed(1); data.dev = dev; } QFtpCommand::~QFtpCommand() { if (is_ba) { delete data.ba; } } /********************************************************************** * * QFtpDTP implemenatation * *********************************************************************/ QFtpDTP::QFtpDTP(QFtpPI* p, QObject* parent) : QObject(parent), socket(0), listener(this), pi(p), callWriteData(false) { clearData(); listener.setObjectName(QLatin1String("QFtpDTP active state server")); connect(&listener, SIGNAL(newConnection()), SLOT(setupSocket())); } void QFtpDTP::setData(QByteArray* ba) { is_ba = true; data.ba = ba; } void QFtpDTP::setDevice(QIODevice* dev) { is_ba = false; data.dev = dev; } void QFtpDTP::setBytesTotal(qint64 bytes) { bytesTotal = bytes; bytesDone = 0; emit dataTransferProgress(bytesDone, bytesTotal); } void QFtpDTP::connectToHost(const QString &host, quint16 port) { bytesFromSocket.clear(); if (socket) { delete socket; socket = 0; } socket = new QTcpSocket(this); #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the socket socket->setProperty("_q_networksession", property("_q_networksession")); #endif socket->setObjectName(QLatin1String("QFtpDTP Passive state socket")); connect(socket, SIGNAL(connected()), SLOT(socketConnected())); connect(socket, SIGNAL(readyRead()), SLOT(socketReadyRead())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketError(QAbstractSocket::SocketError))); connect(socket, SIGNAL(disconnected()), SLOT(socketConnectionClosed())); connect(socket, SIGNAL(bytesWritten(qint64)), SLOT(socketBytesWritten(qint64))); socket->connectToHost(host, port); } int QFtpDTP::setupListener(const QHostAddress &address) { #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the socket listener.setProperty("_q_networksession", property("_q_networksession")); #endif if (!listener.isListening() && !listener.listen(address, 0)) { return -1; } return listener.serverPort(); } void QFtpDTP::waitForConnection() { // This function is only interesting in Active transfer mode; it works // around a limitation in QFtp's design by blocking, waiting for an // incoming connection. For the default Passive mode, it does nothing. if (listener.isListening()) { listener.waitForNewConnection(); } } QTcpSocket::SocketState QFtpDTP::state() const { return socket ? socket->state() : QTcpSocket::UnconnectedState; } qint64 QFtpDTP::bytesAvailable() const { if (!socket || socket->state() != QTcpSocket::ConnectedState) { return (qint64) bytesFromSocket.size(); } return socket->bytesAvailable(); } qint64 QFtpDTP::read(char* data, qint64 maxlen) { qint64 read; if (socket && socket->state() == QTcpSocket::ConnectedState) { read = socket->read(data, maxlen); } else { read = qMin(maxlen, qint64(bytesFromSocket.size())); memcpy(data, bytesFromSocket.data(), read); bytesFromSocket.remove(0, read); } bytesDone += read; return read; } QByteArray QFtpDTP::readAll() { QByteArray tmp; if (socket && socket->state() == QTcpSocket::ConnectedState) { tmp = socket->readAll(); bytesDone += tmp.size(); } else { tmp = bytesFromSocket; bytesFromSocket.clear(); } return tmp; } void QFtpDTP::writeData() { if (!socket) { return; } if (is_ba) { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::writeData: write %d bytes", data.ba->size()); #endif if (data.ba->size() == 0) { emit dataTransferProgress(0, bytesTotal); } else { socket->write(data.ba->data(), data.ba->size()); } socket->close(); clearData(); } else if (data.dev) { callWriteData = false; const qint64 blockSize = 16 * 1024; char buf[16 * 1024]; qint64 read = data.dev->read(buf, blockSize); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::writeData: write() of size %lli bytes", read); #endif if (read > 0) { socket->write(buf, read); } else if (read == -1 || (!data.dev->isSequential() && data.dev->atEnd())) { // error or EOF if (bytesDone == 0 && socket->bytesToWrite() == 0) { emit dataTransferProgress(0, bytesTotal); } socket->close(); clearData(); } // do we continue uploading? callWriteData = data.dev != 0; } } void QFtpDTP::dataReadyRead() { writeData(); } inline bool QFtpDTP::hasError() const { return !err.isNull(); } inline QString QFtpDTP::errorMessage() const { return err; } inline void QFtpDTP::clearError() { err.clear(); } void QFtpDTP::abortConnection() { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::abortConnection, bytesAvailable == %lli", socket ? socket->bytesAvailable() : (qint64) 0); #endif callWriteData = false; clearData(); if (socket) { socket->abort(); } } static void _q_fixupDateTime(QDateTime* dateTime) { // Adjust for future tolerance. const int futureTolerance = 86400; if (dateTime->secsTo(QDateTime::currentDateTime()) < -futureTolerance) { QDate d = dateTime->date(); d.setDate(d.year() - 1, d.month(), d.day()); dateTime->setDate(d); } } static void _q_parseUnixDir(const QStringList &tokens, const QString &userName, QUrlInfo* info) { // Unix style, 7 + 1 entries // -rw-r--r-- 1 ftp ftp 17358091 Aug 10 2004 qt-x11-free-3.3.3.tar.gz // drwxr-xr-x 3 ftp ftp 4096 Apr 14 2000 compiled-examples // lrwxrwxrwx 1 ftp ftp 9 Oct 29 2005 qtscape -> qtmozilla if (tokens.size() != 8) { return; } char first = tokens.at(1).at(0).toLatin1(); if (first == 'd') { info->setDir(true); info->setFile(false); info->setSymLink(false); } else if (first == '-') { info->setDir(false); info->setFile(true); info->setSymLink(false); } else if (first == 'l') { info->setDir(true); info->setFile(false); info->setSymLink(true); } // Resolve filename QString name = tokens.at(7); if (info->isSymLink()) { int linkPos = name.indexOf(QLatin1String(" ->")); if (linkPos != -1) { name.resize(linkPos); } } info->setName(name); // Resolve owner & group info->setOwner(tokens.at(3)); info->setGroup(tokens.at(4)); // Resolve size info->setSize(tokens.at(5).toLongLong()); QStringList formats; formats << QLatin1String("MMM dd yyyy") << QLatin1String("MMM dd hh:mm") << QLatin1String("MMM d yyyy") << QLatin1String("MMM d hh:mm") << QLatin1String("MMM d yyyy") << QLatin1String("MMM dd yyyy"); QString dateString = tokens.at(6); dateString[0] = dateString[0].toUpper(); // Resolve the modification date by parsing all possible formats QDateTime dateTime; int n = 0; #ifndef QT_NO_DATESTRING do { dateTime = QLocale::c().toDateTime(dateString, formats.at(n++)); } while (n < formats.size() && (!dateTime.isValid())); #endif if (n == 2 || n == 4) { // Guess the year. dateTime.setDate(QDate(QDate::currentDate().year(), dateTime.date().month(), dateTime.date().day())); _q_fixupDateTime(&dateTime); } if (dateTime.isValid()) { info->setLastModified(dateTime); } // Resolve permissions int permissions = 0; QString p = tokens.at(2); permissions |= (p[0] == QLatin1Char('r') ? QUrlInfo::ReadOwner : 0); permissions |= (p[1] == QLatin1Char('w') ? QUrlInfo::WriteOwner : 0); permissions |= (p[2] == QLatin1Char('x') ? QUrlInfo::ExeOwner : 0); permissions |= (p[3] == QLatin1Char('r') ? QUrlInfo::ReadGroup : 0); permissions |= (p[4] == QLatin1Char('w') ? QUrlInfo::WriteGroup : 0); permissions |= (p[5] == QLatin1Char('x') ? QUrlInfo::ExeGroup : 0); permissions |= (p[6] == QLatin1Char('r') ? QUrlInfo::ReadOther : 0); permissions |= (p[7] == QLatin1Char('w') ? QUrlInfo::WriteOther : 0); permissions |= (p[8] == QLatin1Char('x') ? QUrlInfo::ExeOther : 0); info->setPermissions(permissions); bool isOwner = info->owner() == userName; info->setReadable((permissions & QUrlInfo::ReadOther) || ((permissions & QUrlInfo::ReadOwner) && isOwner)); info->setWritable((permissions & QUrlInfo::WriteOther) || ((permissions & QUrlInfo::WriteOwner) && isOwner)); } static void _q_parseDosDir(const QStringList &tokens, const QString &userName, QUrlInfo* info) { // DOS style, 3 + 1 entries // 01-16-02 11:14AM epsgroup // 06-05-03 03:19PM 1973 readme.txt if (tokens.size() != 4) { return; } Q_UNUSED(userName); QString name = tokens.at(3); info->setName(name); info->setSymLink(name.toLower().endsWith(QLatin1String(".lnk"))); if (tokens.at(2) == QLatin1String("")) { info->setFile(false); info->setDir(true); } else { info->setFile(true); info->setDir(false); info->setSize(tokens.at(2).toLongLong()); } // Note: We cannot use QFileInfo; permissions are for the server-side // machine, and QFileInfo's behavior depends on the local platform. int permissions = QUrlInfo::ReadOwner | QUrlInfo::WriteOwner | QUrlInfo::ReadGroup | QUrlInfo::WriteGroup | QUrlInfo::ReadOther | QUrlInfo::WriteOther; QString ext; int extIndex = name.lastIndexOf(QLatin1Char('.')); if (extIndex != -1) { ext = name.mid(extIndex + 1); } if (ext == QLatin1String("exe") || ext == QLatin1String("bat") || ext == QLatin1String("com")) { permissions |= QUrlInfo::ExeOwner | QUrlInfo::ExeGroup | QUrlInfo::ExeOther; } info->setPermissions(permissions); info->setReadable(true); info->setWritable(info->isFile()); QDateTime dateTime; #ifndef QT_NO_DATESTRING dateTime = QLocale::c().toDateTime(tokens.at(1), QLatin1String("MM-dd-yy hh:mmAP")); if (dateTime.date().year() < 1971) { dateTime.setDate(QDate(dateTime.date().year() + 100, dateTime.date().month(), dateTime.date().day())); } #endif info->setLastModified(dateTime); } bool QFtpDTP::parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo* info) { if (buffer.isEmpty()) { return false; } QString bufferStr = QString::fromLatin1(buffer).trimmed(); // Unix style FTP servers QRegExp unixPattern(QLatin1String("^([\\-dl])([a-zA-Z\\-]{9,9})\\s+\\d+\\s+(\\S*)\\s+" "(\\S*)\\s+(\\d+)\\s+(\\S+\\s+\\S+\\s+\\S+)\\s+(\\S.*)")); if (unixPattern.indexIn(bufferStr) == 0) { _q_parseUnixDir(unixPattern.capturedTexts(), userName, info); return true; } // DOS style FTP servers QRegExp dosPattern(QLatin1String("^(\\d\\d-\\d\\d-\\d\\d\\ \\ \\d\\d:\\d\\d[AP]M)\\s+" "(|\\d+)\\s+(\\S.*)$")); if (dosPattern.indexIn(bufferStr) == 0) { _q_parseDosDir(dosPattern.capturedTexts(), userName, info); return true; } // Unsupported return false; } void QFtpDTP::socketConnected() { bytesDone = 0; #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsConnected)"); #endif emit connectState(QFtpDTP::CsConnected); } void QFtpDTP::socketReadyRead() { if (!socket) { return; } if (pi->currentCommand().isEmpty()) { socket->close(); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsClosed)"); #endif emit connectState(QFtpDTP::CsClosed); return; } if (pi->abortState == QFtpPI::AbortStarted) { // discard data socket->readAll(); return; } if (pi->currentCommand().startsWith(QLatin1String("LIST"))) { while (socket->canReadLine()) { QUrlInfo i; QByteArray line = socket->readLine(); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP read (list): '%s'", line.constData()); #endif if (parseDir(line, QLatin1String(""), &i)) { emit listInfo(i); } else { // some FTP servers don't return a 550 if the file or directory // does not exist, but rather write a text to the data socket // -- try to catch these cases if (line.endsWith("No such file or directory\r\n")) { err = QString::fromLatin1(line); } } } } else { if (!is_ba && data.dev) { do { QByteArray ba; ba.resize(socket->bytesAvailable()); qint64 bytesRead = socket->read(ba.data(), ba.size()); if (bytesRead < 0) { // a read following a readyRead() signal will // never fail. return; } ba.resize(bytesRead); bytesDone += bytesRead; #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP read: %lli bytes (total %lli bytes)", bytesRead, bytesDone); #endif if (data.dev) { // make sure it wasn't deleted in the slot data.dev->write(ba); } emit dataTransferProgress(bytesDone, bytesTotal); // Need to loop; dataTransferProgress is often connected to // slots that update the GUI (e.g., progress bar values), and // if events are processed, more data may have arrived. } while (socket->bytesAvailable()); } else { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP readyRead: %lli bytes available (total %lli bytes read)", bytesAvailable(), bytesDone); #endif emit dataTransferProgress(bytesDone + socket->bytesAvailable(), bytesTotal); emit readyRead(); } } } void QFtpDTP::socketError(QAbstractSocket::SocketError e) { if (e == QTcpSocket::HostNotFoundError) { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsHostNotFound)"); #endif emit connectState(QFtpDTP::CsHostNotFound); } else if (e == QTcpSocket::ConnectionRefusedError) { #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsConnectionRefused)"); #endif emit connectState(QFtpDTP::CsConnectionRefused); } } void QFtpDTP::socketConnectionClosed() { if (!is_ba && data.dev) { clearData(); } bytesFromSocket = socket->readAll(); #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::connectState(CsClosed)"); #endif emit connectState(QFtpDTP::CsClosed); } void QFtpDTP::socketBytesWritten(qint64 bytes) { bytesDone += bytes; #if defined(QFTPDTP_DEBUG) qDebug("QFtpDTP::bytesWritten(%lli)", bytesDone); #endif emit dataTransferProgress(bytesDone, bytesTotal); if (callWriteData) { writeData(); } } void QFtpDTP::setupSocket() { socket = listener.nextPendingConnection(); socket->setObjectName(QLatin1String("QFtpDTP Active state socket")); connect(socket, SIGNAL(connected()), SLOT(socketConnected())); connect(socket, SIGNAL(readyRead()), SLOT(socketReadyRead())); connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(socketError(QAbstractSocket::SocketError))); connect(socket, SIGNAL(disconnected()), SLOT(socketConnectionClosed())); connect(socket, SIGNAL(bytesWritten(qint64)), SLOT(socketBytesWritten(qint64))); listener.close(); } void QFtpDTP::clearData() { is_ba = false; data.dev = 0; } /********************************************************************** * * QFtpPI implemenatation * *********************************************************************/ QFtpPI::QFtpPI(QObject* parent) : QObject(parent), rawCommand(false), transferConnectionExtended(true), dtp(this), commandSocket(0), state(Begin), abortState(None), currentCmd(QString()), waitForDtpToConnect(false), waitForDtpToClose(false) { commandSocket.setObjectName(QLatin1String("QFtpPI_socket")); connect(&commandSocket, SIGNAL(hostFound()), SLOT(hostFound())); connect(&commandSocket, SIGNAL(connected()), SLOT(connected())); connect(&commandSocket, SIGNAL(disconnected()), SLOT(connectionClosed())); connect(&commandSocket, SIGNAL(readyRead()), SLOT(readyRead())); connect(&commandSocket, SIGNAL(error(QAbstractSocket::SocketError)), SLOT(error(QAbstractSocket::SocketError))); connect(&dtp, SIGNAL(connectState(int)), SLOT(dtpConnectState(int))); } void QFtpPI::connectToHost(const QString &host, quint16 port) { emit connectState(QFtp::HostLookup); #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the socket & DTP commandSocket.setProperty("_q_networksession", property("_q_networksession")); dtp.setProperty("_q_networksession", property("_q_networksession")); #endif commandSocket.connectToHost(host, port); } /* Sends the sequence of commands \a cmds to the FTP server. When the commands are all done the finished() signal is emitted. When an error occurs, the error() signal is emitted. If there are pending commands in the queue this functions returns false and the \a cmds are not added to the queue; otherwise it returns true. */ bool QFtpPI::sendCommands(const QStringList &cmds) { if (!pendingCommands.isEmpty()) { return false; } if (commandSocket.state() != QTcpSocket::ConnectedState || state != Idle) { emit error(QFtp::NotConnected, QFtp::tr("Not connected")); return true; // there are no pending commands } pendingCommands = cmds; startNextCmd(); return true; } void QFtpPI::clearPendingCommands() { pendingCommands.clear(); dtp.abortConnection(); currentCmd.clear(); state = Idle; } void QFtpPI::abort() { pendingCommands.clear(); if (abortState != None) // ABOR already sent { return; } abortState = AbortStarted; #if defined(QFTPPI_DEBUG) qDebug("QFtpPI send: ABOR"); #endif commandSocket.write("ABOR\r\n", 6); if (currentCmd.startsWith(QLatin1String("STOR "))) { dtp.abortConnection(); } } void QFtpPI::hostFound() { emit connectState(QFtp::Connecting); } void QFtpPI::connected() { state = Begin; #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [connected()]", state); #endif // try to improve performance by setting TCP_NODELAY commandSocket.setSocketOption(QAbstractSocket::LowDelayOption, 1); emit connectState(QFtp::Connected); } void QFtpPI::connectionClosed() { commandSocket.close(); emit connectState(QFtp::Unconnected); } void QFtpPI::delayedCloseFinished() { emit connectState(QFtp::Unconnected); } void QFtpPI::error(QAbstractSocket::SocketError e) { if (e == QTcpSocket::HostNotFoundError) { emit connectState(QFtp::Unconnected); emit error(QFtp::HostNotFound, QFtp::tr("Host %1 not found").arg(commandSocket.peerName())); } else if (e == QTcpSocket::ConnectionRefusedError) { emit connectState(QFtp::Unconnected); emit error(QFtp::ConnectionRefused, QFtp::tr("Connection refused to host %1").arg(commandSocket.peerName())); } else if (e == QTcpSocket::SocketTimeoutError) { emit connectState(QFtp::Unconnected); emit error(QFtp::ConnectionRefused, QFtp::tr("Connection timed out to host %1").arg(commandSocket.peerName())); } } void QFtpPI::readyRead() { if (waitForDtpToClose) { return; } while (commandSocket.canReadLine()) { // read line with respect to line continuation QString line = QString::fromLatin1(commandSocket.readLine()); if (replyText.isEmpty()) { if (line.length() < 3) { // protocol error return; } const int lowerLimit[3] = {1, 0, 0}; const int upperLimit[3] = {5, 5, 9}; for (int i = 0; i < 3; i++) { replyCode[i] = line[i].digitValue(); if (replyCode[i] < lowerLimit[i] || replyCode[i] > upperLimit[i]) { // protocol error return; } } } QString endOfMultiLine; endOfMultiLine[0] = '0' + replyCode[0]; endOfMultiLine[1] = '0' + replyCode[1]; endOfMultiLine[2] = '0' + replyCode[2]; endOfMultiLine[3] = QLatin1Char(' '); QString lineCont(endOfMultiLine); lineCont[3] = QLatin1Char('-'); QString lineLeft4 = line.left(4); while (lineLeft4 != endOfMultiLine) { if (lineLeft4 == lineCont) { replyText += line.mid(4); // strip 'xyz-' } else { replyText += line; } if (!commandSocket.canReadLine()) { return; } line = QString::fromLatin1(commandSocket.readLine()); lineLeft4 = line.left(4); } replyText += line.mid(4); // strip reply code 'xyz ' if (replyText.endsWith(QLatin1String("\r\n"))) { replyText.chop(2); } if (processReply()) { replyText = QLatin1String(""); } } } /* Process a reply from the FTP server. Returns true if the reply was processed or false if the reply has to be processed at a later point. */ bool QFtpPI::processReply() { #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [processReply() begin]", state); if (replyText.length() < 400) { qDebug("QFtpPI recv: %d %s", 100 * replyCode[0] + 10 * replyCode[1] + replyCode[2], replyText.toLatin1().constData()); } else { qDebug("QFtpPI recv: %d (text skipped)", 100 * replyCode[0] + 10 * replyCode[1] + replyCode[2]); } #endif int replyCodeInt = 100 * replyCode[0] + 10 * replyCode[1] + replyCode[2]; // process 226 replies ("Closing Data Connection") only when the data // connection is really closed to avoid short reads of the DTP if (replyCodeInt == 226 || (replyCodeInt == 250 && currentCmd.startsWith(QLatin1String("RETR")))) { if (dtp.state() != QTcpSocket::UnconnectedState) { waitForDtpToClose = true; return false; } } switch (abortState) { case AbortStarted: abortState = WaitForAbortToFinish; break; case WaitForAbortToFinish: abortState = None; return true; default: break; } // get new state static const State table[5] = { /* 1yz 2yz 3yz 4yz 5yz */ Waiting, Success, Idle, Failure, Failure }; switch (state) { case Begin: if (replyCode[0] == 1) { return true; } else if (replyCode[0] == 2) { state = Idle; emit finished(QFtp::tr("Connected to host %1").arg(commandSocket.peerName())); break; } // reply codes not starting with 1 or 2 are not handled. return true; case Waiting: if (static_cast(replyCode[0]) < 0 || replyCode[0] > 5) { state = Failure; } else #if defined(Q_OS_IRIX) && defined(Q_CC_GNU) { // work around a crash on 64 bit gcc IRIX State* t = (State*) table; state = t[replyCode[0] - 1]; } #else if (replyCodeInt == 202) { state = Failure; } else { state = table[replyCode[0] - 1]; } #endif break; default: // ignore unrequested message return true; } #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [processReply() intermediate]", state); #endif // special actions on certain replies emit rawFtpReply(replyCodeInt, replyText); if (rawCommand) { rawCommand = false; } else if (replyCodeInt == 227) { // 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2) // rfc959 does not define this response precisely, and gives // both examples where the parenthesis are used, and where // they are missing. We need to scan for the address and host // info. QRegExp addrPortPattern(QLatin1String("(\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)")); if (addrPortPattern.indexIn(replyText) == -1) { #if defined(QFTPPI_DEBUG) qDebug("QFtp: bad 227 response -- address and port information missing"); #endif // this error should be reported } else { QStringList lst = addrPortPattern.capturedTexts(); QString host = lst[1] + QLatin1Char('.') + lst[2] + QLatin1Char('.') + lst[3] + QLatin1Char('.') + lst[4]; quint16 port = (lst[5].toUInt() << 8) + lst[6].toUInt(); waitForDtpToConnect = true; dtp.connectToHost(host, port); } } else if (replyCodeInt == 229) { // 229 Extended Passive mode OK (|||10982|) int portPos = replyText.indexOf(QLatin1Char('(')); if (portPos == -1) { #if defined(QFTPPI_DEBUG) qDebug("QFtp: bad 229 response -- port information missing"); #endif // this error should be reported } else { ++portPos; QChar delimiter = replyText.at(portPos); QStringList epsvParameters = replyText.mid(portPos).split(delimiter); waitForDtpToConnect = true; dtp.connectToHost(commandSocket.peerAddress().toString(), epsvParameters.at(3).toInt()); } } else if (replyCodeInt == 230) { if (currentCmd.startsWith(QLatin1String("USER ")) && pendingCommands.count() > 0 && pendingCommands.first().startsWith(QLatin1String("PASS "))) { // no need to send the PASS -- we are already logged in pendingCommands.pop_front(); } // 230 User logged in, proceed. emit connectState(QFtp::LoggedIn); } else if (replyCodeInt == 213) { // 213 File status. if (currentCmd.startsWith(QLatin1String("SIZE "))) { dtp.setBytesTotal(replyText.simplified().toLongLong()); } } else if (replyCode[0] == 1 && currentCmd.startsWith(QLatin1String("STOR "))) { dtp.waitForConnection(); dtp.writeData(); } // react on new state switch (state) { case Begin: // should never happen break; case Success: // success handling state = Idle; // no break! case Idle: if (dtp.hasError()) { emit error(QFtp::UnknownError, dtp.errorMessage()); dtp.clearError(); } startNextCmd(); break; case Waiting: // do nothing break; case Failure: // If the EPSV or EPRT commands fail, replace them with // the old PASV and PORT instead and try again. if (currentCmd.startsWith(QLatin1String("EPSV"))) { transferConnectionExtended = false; pendingCommands.prepend(QLatin1String("PASV\r\n")); } else if (currentCmd.startsWith(QLatin1String("EPRT"))) { transferConnectionExtended = false; pendingCommands.prepend(QLatin1String("PORT\r\n")); } else { emit error(QFtp::UnknownError, replyText); } if (state != Waiting) { state = Idle; startNextCmd(); } break; } #if defined(QFTPPI_DEBUG) // qDebug("QFtpPI state: %d [processReply() end]", state); #endif return true; } /* Starts next pending command. Returns false if there are no pending commands, otherwise it returns true. */ bool QFtpPI::startNextCmd() { if (waitForDtpToConnect) // don't process any new commands until we are connected { return true; } #if defined(QFTPPI_DEBUG) if (state != Idle) { qDebug("QFtpPI startNextCmd: Internal error! QFtpPI called in non-Idle state %d", state); } #endif if (pendingCommands.isEmpty()) { currentCmd.clear(); emit finished(replyText); return false; } currentCmd = pendingCommands.first(); // PORT and PASV are edited in-place, depending on whether we // should try the extended transfer connection commands EPRT and // EPSV. The PORT command also triggers setting up a listener, and // the address/port arguments are edited in. QHostAddress address = commandSocket.localAddress(); if (currentCmd.startsWith(QLatin1String("PORT"))) { if ((address.protocol() == QTcpSocket::IPv6Protocol) && transferConnectionExtended) { int port = dtp.setupListener(address); currentCmd = QLatin1String("EPRT |"); currentCmd += (address.protocol() == QTcpSocket::IPv4Protocol) ? QLatin1Char('1') : QLatin1Char('2'); currentCmd += QLatin1Char('|') + address.toString() + QLatin1Char('|') + QString::number(port); currentCmd += QLatin1Char('|'); } else if (address.protocol() == QTcpSocket::IPv4Protocol) { int port = dtp.setupListener(address); QString portArg; quint32 ip = address.toIPv4Address(); portArg += QString::number((ip & 0xff000000) >> 24); portArg += QLatin1Char(',') + QString::number((ip & 0xff0000) >> 16); portArg += QLatin1Char(',') + QString::number((ip & 0xff00) >> 8); portArg += QLatin1Char(',') + QString::number(ip & 0xff); portArg += QLatin1Char(',') + QString::number((port & 0xff00) >> 8); portArg += QLatin1Char(',') + QString::number(port & 0xff); currentCmd = QLatin1String("PORT "); currentCmd += portArg; } else { // No IPv6 connection can be set up with the PORT // command. return false; } currentCmd += QLatin1String("\r\n"); } else if (currentCmd.startsWith(QLatin1String("PASV"))) { if ((address.protocol() == QTcpSocket::IPv6Protocol) && transferConnectionExtended) { currentCmd = QLatin1String("EPSV\r\n"); } } pendingCommands.pop_front(); #if defined(QFTPPI_DEBUG) qDebug("QFtpPI send: %s", currentCmd.left(currentCmd.length() - 2).toLatin1().constData()); #endif state = Waiting; commandSocket.write(currentCmd.toLatin1()); return true; } void QFtpPI::dtpConnectState(int s) { switch (s) { case QFtpDTP::CsClosed: if (waitForDtpToClose) { // there is an unprocessed reply if (processReply()) { replyText = QLatin1String(""); } else { return; } } waitForDtpToClose = false; readyRead(); return; case QFtpDTP::CsConnected: waitForDtpToConnect = false; startNextCmd(); return; case QFtpDTP::CsHostNotFound: case QFtpDTP::CsConnectionRefused: emit error(QFtp::ConnectionRefused, QFtp::tr("Connection refused for data connection")); startNextCmd(); return; default: return; } } /********************************************************************** * * QFtpPrivate * *********************************************************************/ class QFtpPrivate { Q_DECLARE_PUBLIC(QFtp) public: inline QFtpPrivate(QFtp* owner) : close_waitForStateChange(false), state(QFtp::Unconnected), transferMode(QFtp::Passive), error(QFtp::NoError), q_ptr(owner) { } ~QFtpPrivate() { while (!pending.isEmpty()) { delete pending.takeFirst(); } } // private slots void _q_startNextCommand(); void _q_piFinished(const QString &); void _q_piError(int, const QString &); void _q_piConnectState(int); void _q_piFtpReply(int, const QString &); int addCommand(QFtpCommand* cmd); QFtpPI pi; QList pending; bool close_waitForStateChange; QFtp::State state; QFtp::TransferMode transferMode; QFtp::Error error; QString errorString; QString host; quint16 port; QString proxyHost; quint16 proxyPort; QFtp* q_ptr; }; int QFtpPrivate::addCommand(QFtpCommand* cmd) { pending.append(cmd); if (pending.count() == 1) { // don't emit the commandStarted() signal before the ID is returned QTimer::singleShot(0, q_func(), SLOT(_q_startNextCommand())); } return cmd->id; } /********************************************************************** * * QFtp implementation * *********************************************************************/ /*! \class QFtp \brief The QFtp class provides an implementation of the client side of FTP protocol. \ingroup network \inmodule QtNetwork This class provides a direct interface to FTP that allows you to have more control over the requests. However, for new applications, it is recommended to use QNetworkAccessManager and QNetworkReply, as those classes possess a simpler, yet more powerful API. The class works asynchronously, so there are no blocking functions. If an operation cannot be executed immediately, the function will still return straight away and the operation will be scheduled for later execution. The results of scheduled operations are reported via signals. This approach depends on the event loop being in operation. The operations that can be scheduled (they are called "commands" in the rest of the documentation) are the following: connectToHost(), login(), close(), list(), cd(), get(), put(), remove(), mkdir(), rmdir(), rename() and rawCommand(). All of these commands return a unique identifier that allows you to keep track of the command that is currently being executed. When the execution of a command starts, the commandStarted() signal with the command's identifier is emitted. When the command is finished, the commandFinished() signal is emitted with the command's identifier and a bool that indicates whether the command finished with an error. In some cases, you might want to execute a sequence of commands, e.g. if you want to connect and login to a FTP server. This is simply achieved: \snippet doc/src/snippets/code/src_network_access_qftp.cpp 0 In this case two FTP commands have been scheduled. When the last scheduled command has finished, a done() signal is emitted with a bool argument that tells you whether the sequence finished with an error. If an error occurs during the execution of one of the commands in a sequence of commands, all the pending commands (i.e. scheduled, but not yet executed commands) are cleared and no signals are emitted for them. Some commands, e.g. list(), emit additional signals to report their results. Example: If you want to download the INSTALL file from the Qt FTP server, you would write this: \snippet doc/src/snippets/code/src_network_access_qftp.cpp 1 For this example the following sequence of signals is emitted (with small variations, depending on network traffic, etc.): \snippet doc/src/snippets/code/src_network_access_qftp.cpp 2 The dataTransferProgress() signal in the above example is useful if you want to show a \link QProgressBar progress bar \endlink to inform the user about the progress of the download. The readyRead() signal tells you that there is data ready to be read. The amount of data can be queried then with the bytesAvailable() function and it can be read with the read() or readAll() function. If the login fails for the above example, the signals would look like this: \snippet doc/src/snippets/code/src_network_access_qftp.cpp 3 You can then get details about the error with the error() and errorString() functions. For file transfer, QFtp can use both active or passive mode, and it uses passive file transfer mode by default; see the documentation for setTransferMode() for more details about this. Call setProxy() to make QFtp connect via an FTP proxy server. The functions currentId() and currentCommand() provide more information about the currently executing command. The functions hasPendingCommands() and clearPendingCommands() allow you to query and clear the list of pending commands. If you are an experienced network programmer and want to have complete control you can use rawCommand() to execute arbitrary FTP commands. \warning The current version of QFtp doesn't fully support non-Unix FTP servers. \sa QNetworkAccessManager, QNetworkRequest, QNetworkReply, {FTP Example} */ /*! Constructs a QFtp object with the given \a parent. */ QFtp::QFtp(QObject* parent) : QObject(parent), d(new QFtpPrivate(this)) { d->errorString = tr("Unknown error"); connect(&d->pi, SIGNAL(connectState(int)), SLOT(_q_piConnectState(int))); connect(&d->pi, SIGNAL(finished(QString)), SLOT(_q_piFinished(QString))); connect(&d->pi, SIGNAL(error(int,QString)), SLOT(_q_piError(int,QString))); connect(&d->pi, SIGNAL(rawFtpReply(int,QString)), SLOT(_q_piFtpReply(int,QString))); connect(&d->pi.dtp, SIGNAL(readyRead()), SIGNAL(readyRead())); connect(&d->pi.dtp, SIGNAL(dataTransferProgress(qint64,qint64)), SIGNAL(dataTransferProgress(qint64,qint64))); connect(&d->pi.dtp, SIGNAL(listInfo(QUrlInfo)), SIGNAL(listInfo(QUrlInfo))); } /*! \enum QFtp::State This enum defines the connection state: \value Unconnected There is no connection to the host. \value HostLookup A host name lookup is in progress. \value Connecting An attempt to connect to the host is in progress. \value Connected Connection to the host has been achieved. \value LoggedIn Connection and user login have been achieved. \value Closing The connection is closing down, but it is not yet closed. (The state will be \c Unconnected when the connection is closed.) \sa stateChanged() state() */ /*! \enum QFtp::TransferMode FTP works with two socket connections; one for commands and another for transmitting data. While the command connection is always initiated by the client, the second connection can be initiated by either the client or the server. This enum defines whether the client (Passive mode) or the server (Active mode) should set up the data connection. \value Passive The client connects to the server to transmit its data. \value Active The server connects to the client to transmit its data. */ /*! \enum QFtp::TransferType This enum identifies the data transfer type used with get and put commands. \value Binary The data will be transferred in Binary mode. \value Ascii The data will be transferred in Ascii mode and new line characters will be converted to the local format. */ /*! \enum QFtp::Error This enum identifies the error that occurred. \value NoError No error occurred. \value HostNotFound The host name lookup failed. \value ConnectionRefused The server refused the connection. \value NotConnected Tried to send a command, but there is no connection to a server. \value UnknownError An error other than those specified above occurred. \sa error() */ /*! \enum QFtp::Command This enum is used as the return value for the currentCommand() function. This allows you to perform specific actions for particular commands, e.g. in a FTP client, you might want to clear the directory view when a list() command is started; in this case you can simply check in the slot connected to the start() signal if the currentCommand() is \c List. \value None No command is being executed. \value SetTransferMode set the \link TransferMode transfer\endlink mode. \value SetProxy switch proxying on or off. \value ConnectToHost connectToHost() is being executed. \value Login login() is being executed. \value Close close() is being executed. \value List list() is being executed. \value Cd cd() is being executed. \value Get get() is being executed. \value Put put() is being executed. \value Remove remove() is being executed. \value Mkdir mkdir() is being executed. \value Rmdir rmdir() is being executed. \value Rename rename() is being executed. \value RawCommand rawCommand() is being executed. \sa currentCommand() */ /*! \fn void QFtp::stateChanged(int state) This signal is emitted when the state of the connection changes. The argument \a state is the new state of the connection; it is one of the \l State values. It is usually emitted in response to a connectToHost() or close() command, but it can also be emitted "spontaneously", e.g. when the server closes the connection unexpectedly. \sa connectToHost() close() state() State */ /*! \fn void QFtp::listInfo(const QUrlInfo &i); This signal is emitted for each directory entry the list() command finds. The details of the entry are stored in \a i. \sa list() */ /*! \fn void QFtp::commandStarted(int id) This signal is emitted when processing the command identified by \a id starts. \sa commandFinished() done() */ /*! \fn void QFtp::commandFinished(int id, bool error) This signal is emitted when processing the command identified by \a id has finished. \a error is true if an error occurred during the processing; otherwise \a error is false. \sa commandStarted() done() error() errorString() */ /*! \fn void QFtp::done(bool error) This signal is emitted when the last pending command has finished; (it is emitted after the last command's commandFinished() signal). \a error is true if an error occurred during the processing; otherwise \a error is false. \sa commandFinished() error() errorString() */ /*! \fn void QFtp::readyRead() This signal is emitted in response to a get() command when there is new data to read. If you specify a device as the second argument in the get() command, this signal is \e not emitted; instead the data is written directly to the device. You can read the data with the readAll() or read() functions. This signal is useful if you want to process the data in chunks as soon as it becomes available. If you are only interested in the complete data, just connect to the commandFinished() signal and read the data then instead. \sa get() read() readAll() bytesAvailable() */ /*! \fn void QFtp::dataTransferProgress(qint64 done, qint64 total) This signal is emitted in response to a get() or put() request to indicate the current progress of the download or upload. \a done is the amount of data that has already been transferred and \a total is the total amount of data to be read or written. It is possible that the QFtp class is not able to determine the total amount of data that should be transferred, in which case \a total is 0. (If you connect this signal to a QProgressBar, the progress bar shows a busy indicator if the total is 0). \warning \a done and \a total are not necessarily the size in bytes, since for large files these values might need to be "scaled" to avoid overflow. \sa get(), put(), QProgressBar */ /*! \fn void QFtp::rawCommandReply(int replyCode, const QString &detail); This signal is emitted in response to the rawCommand() function. \a replyCode is the 3 digit reply code and \a detail is the text that follows the reply code. \sa rawCommand() */ /*! Connects to the FTP server \a host using port \a port. The stateChanged() signal is emitted when the state of the connecting process changes, e.g. to \c HostLookup, then \c Connecting, then \c Connected. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa stateChanged() commandStarted() commandFinished() */ int QFtp::connectToHost(const QString &host, quint16 port) { QStringList cmds; cmds << host; cmds << QString::number((uint)port); int id = d->addCommand(new QFtpCommand(ConnectToHost, cmds)); d->pi.transferConnectionExtended = true; return id; } /*! Logs in to the FTP server with the username \a user and the password \a password. The stateChanged() signal is emitted when the state of the connecting process changes, e.g. to \c LoggedIn. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::login(const QString &user, const QString &password) { QStringList cmds; cmds << (QLatin1String("USER ") + (user.isNull() ? QLatin1String("anonymous") : user) + QLatin1String("\r\n")); cmds << (QLatin1String("PASS ") + (password.isNull() ? QLatin1String("anonymous@") : password) + QLatin1String("\r\n")); return d->addCommand(new QFtpCommand(Login, cmds)); } /*! Closes the connection to the FTP server. The stateChanged() signal is emitted when the state of the connecting process changes, e.g. to \c Closing, then \c Unconnected. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa stateChanged() commandStarted() commandFinished() */ int QFtp::close() { return d->addCommand(new QFtpCommand(Close, QStringList(QLatin1String("QUIT\r\n")))); } /*! Sets the current FTP transfer mode to \a mode. The default is QFtp::Passive. \sa QFtp::TransferMode */ int QFtp::setTransferMode(TransferMode mode) { int id = d->addCommand(new QFtpCommand(SetTransferMode, QStringList())); d->pi.transferConnectionExtended = true; d->transferMode = mode; return id; } /*! Enables use of the FTP proxy on host \a host and port \a port. Calling this function with \a host empty disables proxying. QFtp does not support FTP-over-HTTP proxy servers. Use QNetworkAccessManager for this. */ int QFtp::setProxy(const QString &host, quint16 port) { QStringList args; args << host << QString::number(port); return d->addCommand(new QFtpCommand(SetProxy, args)); } /*! Lists the contents of directory \a dir on the FTP server. If \a dir is empty, it lists the contents of the current directory. The listInfo() signal is emitted for each directory entry found. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa listInfo() commandStarted() commandFinished() */ int QFtp::list(const QString &dir) { QStringList cmds; cmds << QLatin1String("TYPE A\r\n"); cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); if (dir.isEmpty()) { cmds << QLatin1String("LIST\r\n"); } else { cmds << (QLatin1String("LIST ") + dir + QLatin1String("\r\n")); } return d->addCommand(new QFtpCommand(List, cmds)); } /*! Changes the working directory of the server to \a dir. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::cd(const QString &dir) { return d->addCommand(new QFtpCommand(Cd, QStringList(QLatin1String("CWD ") + dir + QLatin1String("\r\n")))); } /*! Downloads the file \a file from the server. If \a dev is 0, then the readyRead() signal is emitted when there is data available to read. You can then read the data with the read() or readAll() functions. If \a dev is not 0, the data is written directly to the device \a dev. Make sure that the \a dev pointer is valid for the duration of the operation (it is safe to delete it when the commandFinished() signal is emitted). In this case the readyRead() signal is \e not emitted and you cannot read data with the read() or readAll() functions. If you don't read the data immediately it becomes available, i.e. when the readyRead() signal is emitted, it is still available until the next command is started. For example, if you want to present the data to the user as soon as there is something available, connect to the readyRead() signal and read the data immediately. On the other hand, if you only want to work with the complete data, you can connect to the commandFinished() signal and read the data when the get() command is finished. The data is transferred as Binary or Ascii depending on the value of \a type. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa readyRead() dataTransferProgress() commandStarted() commandFinished() */ int QFtp::get(const QString &file, QIODevice* dev, TransferType type) { QStringList cmds; if (type == Binary) { cmds << QLatin1String("TYPE I\r\n"); } else { cmds << QLatin1String("TYPE A\r\n"); } cmds << QLatin1String("SIZE ") + file + QLatin1String("\r\n"); cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); cmds << QLatin1String("RETR ") + file + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Get, cmds, dev)); } /*! \overload Writes a copy of the given \a data to the file called \a file on the server. The progress of the upload is reported by the dataTransferProgress() signal. The data is transferred as Binary or Ascii depending on the value of \a type. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. Since this function takes a copy of the \a data, you can discard your own copy when this function returns. \sa dataTransferProgress() commandStarted() commandFinished() */ int QFtp::put(const QByteArray &data, const QString &file, TransferType type) { QStringList cmds; if (type == Binary) { cmds << QLatin1String("TYPE I\r\n"); } else { cmds << QLatin1String("TYPE A\r\n"); } cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); cmds << QLatin1String("ALLO ") + QString::number(data.size()) + QLatin1String("\r\n"); cmds << QLatin1String("STOR ") + file + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Put, cmds, data)); } /*! Reads the data from the IO device \a dev, and writes it to the file called \a file on the server. The data is read in chunks from the IO device, so this overload allows you to transmit large amounts of data without the need to read all the data into memory at once. The data is transferred as Binary or Ascii depending on the value of \a type. Make sure that the \a dev pointer is valid for the duration of the operation (it is safe to delete it when the commandFinished() is emitted). */ int QFtp::put(QIODevice* dev, const QString &file, TransferType type) { QStringList cmds; if (type == Binary) { cmds << QLatin1String("TYPE I\r\n"); } else { cmds << QLatin1String("TYPE A\r\n"); } cmds << QLatin1String(d->transferMode == Passive ? "PASV\r\n" : "PORT\r\n"); if (!dev->isSequential()) { cmds << QLatin1String("ALLO ") + QString::number(dev->size()) + QLatin1String("\r\n"); } cmds << QLatin1String("STOR ") + file + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Put, cmds, dev)); } /*! Deletes the file called \a file from the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::remove(const QString &file) { return d->addCommand(new QFtpCommand(Remove, QStringList(QLatin1String("DELE ") + file + QLatin1String("\r\n")))); } /*! Creates a directory called \a dir on the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::mkdir(const QString &dir) { return d->addCommand(new QFtpCommand(Mkdir, QStringList(QLatin1String("MKD ") + dir + QLatin1String("\r\n")))); } /*! Removes the directory called \a dir from the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::rmdir(const QString &dir) { return d->addCommand(new QFtpCommand(Rmdir, QStringList(QLatin1String("RMD ") + dir + QLatin1String("\r\n")))); } /*! Renames the file called \a oldname to \a newname on the server. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa commandStarted() commandFinished() */ int QFtp::rename(const QString &oldname, const QString &newname) { QStringList cmds; cmds << QLatin1String("RNFR ") + oldname + QLatin1String("\r\n"); cmds << QLatin1String("RNTO ") + newname + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(Rename, cmds)); } /*! Sends the raw FTP command \a command to the FTP server. This is useful for low-level FTP access. If the operation you wish to perform has an equivalent QFtp function, we recommend using the function instead of raw FTP commands since the functions are easier and safer. The function does not block and returns immediately. The command is scheduled, and its execution is performed asynchronously. The function returns a unique identifier which is passed by commandStarted() and commandFinished(). When the command is started the commandStarted() signal is emitted. When it is finished the commandFinished() signal is emitted. \sa rawCommandReply() commandStarted() commandFinished() */ int QFtp::rawCommand(const QString &command) { QString cmd = command.trimmed() + QLatin1String("\r\n"); return d->addCommand(new QFtpCommand(RawCommand, QStringList(cmd))); } /*! Returns the number of bytes that can be read from the data socket at the moment. \sa get() readyRead() read() readAll() */ qint64 QFtp::bytesAvailable() const { return d->pi.dtp.bytesAvailable(); } /*! \fn qint64 QFtp::readBlock(char *data, quint64 maxlen) Use read() instead. */ /*! Reads \a maxlen bytes from the data socket into \a data and returns the number of bytes read. Returns -1 if an error occurred. \sa get() readyRead() bytesAvailable() readAll() */ qint64 QFtp::read(char* data, qint64 maxlen) { return d->pi.dtp.read(data, maxlen); } /*! Reads all the bytes available from the data socket and returns them. \sa get() readyRead() bytesAvailable() read() */ QByteArray QFtp::readAll() { return d->pi.dtp.readAll(); } /*! Aborts the current command and deletes all scheduled commands. If there is an unfinished command (i.e. a command for which the commandStarted() signal has been emitted, but for which the commandFinished() signal has not been emitted), this function sends an \c ABORT command to the server. When the server replies that the command is aborted, the commandFinished() signal with the \c error argument set to \c true is emitted for the command. Due to timing issues, it is possible that the command had already finished before the abort request reached the server, in which case, the commandFinished() signal is emitted with the \c error argument set to \c false. For all other commands that are affected by the abort(), no signals are emitted. If you don't start further FTP commands directly after the abort(), there won't be any scheduled commands and the done() signal is emitted. \warning Some FTP servers, for example the BSD FTP daemon (version 0.3), wrongly return a positive reply even when an abort has occurred. For these servers the commandFinished() signal has its error flag set to \c false, even though the command did not complete successfully. \sa clearPendingCommands() */ void QFtp::abort() { if (d->pending.isEmpty()) { return; } clearPendingCommands(); d->pi.abort(); } /*! Returns the identifier of the FTP command that is being executed or 0 if there is no command being executed. \sa currentCommand() */ int QFtp::currentId() const { if (d->pending.isEmpty()) { return 0; } return d->pending.first()->id; } /*! Returns the command type of the FTP command being executed or \c None if there is no command being executed. \sa currentId() */ QFtp::Command QFtp::currentCommand() const { if (d->pending.isEmpty()) { return None; } return d->pending.first()->command; } /*! Returns the QIODevice pointer that is used by the FTP command to read data from or store data to. If there is no current FTP command being executed or if the command does not use an IO device, this function returns 0. This function can be used to delete the QIODevice in the slot connected to the commandFinished() signal. \sa get() put() */ QIODevice* QFtp::currentDevice() const { if (d->pending.isEmpty()) { return 0; } QFtpCommand* c = d->pending.first(); if (c->is_ba) { return 0; } return c->data.dev; } /*! Returns true if there are any commands scheduled that have not yet been executed; otherwise returns false. The command that is being executed is \e not considered as a scheduled command. \sa clearPendingCommands() currentId() currentCommand() */ bool QFtp::hasPendingCommands() const { return d->pending.count() > 1; } /*! Deletes all pending commands from the list of scheduled commands. This does not affect the command that is being executed. If you want to stop this as well, use abort(). \sa hasPendingCommands() abort() */ void QFtp::clearPendingCommands() { // delete all entires except the first one while (d->pending.count() > 1) { delete d->pending.takeLast(); } } /*! Returns the current state of the object. When the state changes, the stateChanged() signal is emitted. \sa State stateChanged() */ QFtp::State QFtp::state() const { return d->state; } /*! Returns the last error that occurred. This is useful to find out what went wrong when receiving a commandFinished() or a done() signal with the \c error argument set to \c true. If you start a new command, the error status is reset to \c NoError. */ QFtp::Error QFtp::error() const { return d->error; } /*! Returns a human-readable description of the last error that occurred. This is useful for presenting a error message to the user when receiving a commandFinished() or a done() signal with the \c error argument set to \c true. The error string is often (but not always) the reply from the server, so it is not always possible to translate the string. If the message comes from Qt, the string has already passed through tr(). */ QString QFtp::errorString() const { return d->errorString; } /*! \internal */ void QFtpPrivate::_q_startNextCommand() { Q_Q(QFtp); if (pending.isEmpty()) { return; } QFtpCommand* c = pending.first(); error = QFtp::NoError; errorString = QT_TRANSLATE_NOOP(QFtp, QLatin1String("Unknown error")); if (q->bytesAvailable()) { q->readAll(); // clear the data } emit q->commandStarted(c->id); // Proxy support, replace the Login argument in place, then fall // through. if (c->command == QFtp::Login && !proxyHost.isEmpty()) { QString loginString = c->rawCmds.first().trimmed(); loginString += QLatin1Char('@') + host; if (port && port != 21) { loginString += QLatin1Char(':') + QString::number(port); } loginString += QLatin1String("\r\n"); c->rawCmds[0] = loginString; } if (c->command == QFtp::SetTransferMode) { _q_piFinished(QLatin1String("Transfer mode set")); } else if (c->command == QFtp::SetProxy) { proxyHost = c->rawCmds[0]; proxyPort = c->rawCmds[1].toUInt(); c->rawCmds.clear(); _q_piFinished(QLatin1String("Proxy set to ") + proxyHost + QLatin1Char(':') + QString::number(proxyPort)); } else if (c->command == QFtp::ConnectToHost) { #ifndef QT_NO_BEARERMANAGEMENT //copy network session down to the PI pi.setProperty("_q_networksession", q->property("_q_networksession")); #endif if (!proxyHost.isEmpty()) { host = c->rawCmds[0]; port = c->rawCmds[1].toUInt(); pi.connectToHost(proxyHost, proxyPort); } else { pi.connectToHost(c->rawCmds[0], c->rawCmds[1].toUInt()); } } else { if (c->command == QFtp::Put) { if (c->is_ba) { pi.dtp.setData(c->data.ba); pi.dtp.setBytesTotal(c->data.ba->size()); } else if (c->data.dev && (c->data.dev->isOpen() || c->data.dev->open(QIODevice::ReadOnly))) { pi.dtp.setDevice(c->data.dev); if (c->data.dev->isSequential()) { pi.dtp.setBytesTotal(0); pi.dtp.connect(c->data.dev, SIGNAL(readyRead()), SLOT(dataReadyRead())); pi.dtp.connect(c->data.dev, SIGNAL(readChannelFinished()), SLOT(dataReadyRead())); } else { pi.dtp.setBytesTotal(c->data.dev->size()); } } } else if (c->command == QFtp::Get) { if (!c->is_ba && c->data.dev) { pi.dtp.setDevice(c->data.dev); } } else if (c->command == QFtp::Close) { state = QFtp::Closing; emit q->stateChanged(state); } pi.sendCommands(c->rawCmds); } } /*! \internal */ void QFtpPrivate::_q_piFinished(const QString &) { if (pending.isEmpty()) { return; } QFtpCommand* c = pending.first(); if (c->command == QFtp::Close) { // The order of in which the slots are called is arbitrary, so // disconnect the SIGNAL-SIGNAL temporary to make sure that we // don't get the commandFinished() signal before the stateChanged() // signal. if (state != QFtp::Unconnected) { close_waitForStateChange = true; return; } } emit q_func()->commandFinished(c->id, false); pending.removeFirst(); delete c; if (pending.isEmpty()) { emit q_func()->done(false); } else { _q_startNextCommand(); } } /*! \internal */ void QFtpPrivate::_q_piError(int errorCode, const QString &text) { Q_Q(QFtp); if (pending.isEmpty()) { qWarning("QFtpPrivate::_q_piError was called without pending command!"); return; } QFtpCommand* c = pending.first(); // non-fatal errors if (c->command == QFtp::Get && pi.currentCommand().startsWith(QLatin1String("SIZE "))) { pi.dtp.setBytesTotal(0); return; } else if (c->command == QFtp::Put && pi.currentCommand().startsWith(QLatin1String("ALLO "))) { return; } error = QFtp::Error(errorCode); switch (q->currentCommand()) { case QFtp::ConnectToHost: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Connecting to host failed:\n%1")) .arg(text); break; case QFtp::Login: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Login failed:\n%1")) .arg(text); break; case QFtp::List: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Listing directory failed:\n%1")) .arg(text); break; case QFtp::Cd: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Changing directory failed:\n%1")) .arg(text); break; case QFtp::Get: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Downloading file failed:\n%1")) .arg(text); break; case QFtp::Put: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Uploading file failed:\n%1")) .arg(text); break; case QFtp::Remove: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Removing file failed:\n%1")) .arg(text); break; case QFtp::Mkdir: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Creating directory failed:\n%1")) .arg(text); break; case QFtp::Rmdir: errorString = QString::fromLatin1(QT_TRANSLATE_NOOP("QFtp", "Removing directory failed:\n%1")) .arg(text); break; default: errorString = text; break; } pi.clearPendingCommands(); q->clearPendingCommands(); emit q->commandFinished(c->id, true); pending.removeFirst(); delete c; if (pending.isEmpty()) { emit q->done(true); } else { _q_startNextCommand(); } } /*! \internal */ void QFtpPrivate::_q_piConnectState(int connectState) { state = QFtp::State(connectState); emit q_func()->stateChanged(state); if (close_waitForStateChange) { close_waitForStateChange = false; _q_piFinished(QLatin1String(QT_TRANSLATE_NOOP("QFtp", "Connection closed"))); } } /*! \internal */ void QFtpPrivate::_q_piFtpReply(int code, const QString &text) { if (q_func()->currentCommand() == QFtp::RawCommand) { pi.rawCommand = true; emit q_func()->rawCommandReply(code, text); } } /*! Destructor. */ QFtp::~QFtp() { abort(); close(); } QT_END_NAMESPACE #include "qftp.moc" #include "moc_qftp.cpp" #endif // QT_NO_FTP quiterss-0.18.3/3rdparty/qftp/qftp.h000066400000000000000000000112071265173051100173310ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: https://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QFTP_H #define QFTP_H #include #include "qurlinfo.h" #include class QFtpPrivate; class QFtp : public QObject { Q_OBJECT public: explicit QFtp(QObject* parent = 0); virtual ~QFtp(); enum State { Unconnected, HostLookup, Connecting, Connected, LoggedIn, Closing }; enum Error { NoError, UnknownError, HostNotFound, ConnectionRefused, NotConnected }; enum Command { None, SetTransferMode, SetProxy, ConnectToHost, Login, Close, List, Cd, Get, Put, Remove, Mkdir, Rmdir, Rename, RawCommand }; enum TransferMode { Active, Passive }; enum TransferType { Binary, Ascii }; int setProxy(const QString &host, quint16 port); int connectToHost(const QString &host, quint16 port = 21); int login(const QString &user = QString(), const QString &password = QString()); int close(); int setTransferMode(TransferMode mode); int list(const QString &dir = QString()); int cd(const QString &dir); int get(const QString &file, QIODevice* dev = 0, TransferType type = Binary); int put(const QByteArray &data, const QString &file, TransferType type = Binary); int put(QIODevice* dev, const QString &file, TransferType type = Binary); int remove(const QString &file); int mkdir(const QString &dir); int rmdir(const QString &dir); int rename(const QString &oldname, const QString &newname); int rawCommand(const QString &command); qint64 bytesAvailable() const; qint64 read(char* data, qint64 maxlen); QByteArray readAll(); int currentId() const; QIODevice* currentDevice() const; Command currentCommand() const; bool hasPendingCommands() const; void clearPendingCommands(); State state() const; Error error() const; QString errorString() const; public Q_SLOTS: void abort(); Q_SIGNALS: void stateChanged(int); void listInfo(const QUrlInfo &); void readyRead(); void dataTransferProgress(qint64, qint64); void rawCommandReply(int, const QString &); void commandStarted(int); void commandFinished(int, bool); void done(bool); private: Q_DISABLE_COPY(QFtp) QScopedPointer d; Q_PRIVATE_SLOT(d, void _q_startNextCommand()) Q_PRIVATE_SLOT(d, void _q_piFinished(const QString &)) Q_PRIVATE_SLOT(d, void _q_piError(int, const QString &)) Q_PRIVATE_SLOT(d, void _q_piConnectState(int)) Q_PRIVATE_SLOT(d, void _q_piFtpReply(int, const QString &)) }; #endif // QFTP_H quiterss-0.18.3/3rdparty/qftp/qftp.pri000066400000000000000000000001541265173051100176730ustar00rootroot00000000000000INCLUDEPATH += $$PWD HEADERS += $$PWD/qftp.h $$PWD/qurlinfo.h SOURCES += $$PWD/qftp.cpp $$PWD/qurlinfo.cpp quiterss-0.18.3/3rdparty/qftp/qurlinfo.cpp000066400000000000000000000410651265173051100205560ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: https://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qurlinfo.h" #include "qurl.h" #include "qdir.h" #include QT_BEGIN_NAMESPACE class QUrlInfoPrivate { public: QUrlInfoPrivate() : permissions(0), size(0), isDir(false), isFile(true), isSymLink(false), isWritable(true), isReadable(true), isExecutable(false) {} QString name; int permissions; QString owner; QString group; qint64 size; QDateTime lastModified; QDateTime lastRead; bool isDir; bool isFile; bool isSymLink; bool isWritable; bool isReadable; bool isExecutable; }; /*! \class QUrlInfo \brief The QUrlInfo class stores information about URLs. \ingroup io \ingroup network \inmodule QtNetwork The information about a URL that can be retrieved includes name(), permissions(), owner(), group(), size(), lastModified(), lastRead(), isDir(), isFile(), isSymLink(), isWritable(), isReadable() and isExecutable(). You can create your own QUrlInfo objects passing in all the relevant information in the constructor, and you can modify a QUrlInfo; for each getter mentioned above there is an equivalent setter. Note that setting values does not affect the underlying resource that the QUrlInfo provides information about; for example if you call setWritable(true) on a read-only resource the only thing changed is the QUrlInfo object, not the resource. \sa QUrl, {FTP Example} */ /*! \enum QUrlInfo::PermissionSpec This enum is used by the permissions() function to report the permissions of a file. \value ReadOwner The file is readable by the owner of the file. \value WriteOwner The file is writable by the owner of the file. \value ExeOwner The file is executable by the owner of the file. \value ReadGroup The file is readable by the group. \value WriteGroup The file is writable by the group. \value ExeGroup The file is executable by the group. \value ReadOther The file is readable by anyone. \value WriteOther The file is writable by anyone. \value ExeOther The file is executable by anyone. */ /*! Constructs an invalid QUrlInfo object with default values. \sa isValid() */ QUrlInfo::QUrlInfo() { d = 0; } /*! Copy constructor, copies \a ui to this URL info object. */ QUrlInfo::QUrlInfo(const QUrlInfo &ui) { if (ui.d) { d = new QUrlInfoPrivate; *d = *ui.d; } else { d = 0; } } /*! Constructs a QUrlInfo object by specifying all the URL's information. The information that is passed is the \a name, file \a permissions, \a owner and \a group and the file's \a size. Also passed is the \a lastModified date/time and the \a lastRead date/time. Flags are also passed, specifically, \a isDir, \a isFile, \a isSymLink, \a isWritable, \a isReadable and \a isExecutable. */ QUrlInfo::QUrlInfo(const QString &name, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable) { d = new QUrlInfoPrivate; d->name = name; d->permissions = permissions; d->owner = owner; d->group = group; d->size = size; d->lastModified = lastModified; d->lastRead = lastRead; d->isDir = isDir; d->isFile = isFile; d->isSymLink = isSymLink; d->isWritable = isWritable; d->isReadable = isReadable; d->isExecutable = isExecutable; } /*! Constructs a QUrlInfo object by specifying all the URL's information. The information that is passed is the \a url, file \a permissions, \a owner and \a group and the file's \a size. Also passed is the \a lastModified date/time and the \a lastRead date/time. Flags are also passed, specifically, \a isDir, \a isFile, \a isSymLink, \a isWritable, \a isReadable and \a isExecutable. */ QUrlInfo::QUrlInfo(const QUrl &url, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable) { d = new QUrlInfoPrivate; d->name = QFileInfo(url.path()).fileName(); d->permissions = permissions; d->owner = owner; d->group = group; d->size = size; d->lastModified = lastModified; d->lastRead = lastRead; d->isDir = isDir; d->isFile = isFile; d->isSymLink = isSymLink; d->isWritable = isWritable; d->isReadable = isReadable; d->isExecutable = isExecutable; } /*! Sets the name of the URL to \a name. The name is the full text, for example, "http://qt.nokia.com/doc/qurlinfo.html". If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setName(const QString &name) { if (!d) { d = new QUrlInfoPrivate; } d->name = name; } /*! If \a b is true then the URL is set to be a directory; if \a b is false then the URL is set not to be a directory (which normally means it is a file). (Note that a URL can refer to both a file and a directory even though most file systems do not support this.) If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setDir(bool b) { if (!d) { d = new QUrlInfoPrivate; } d->isDir = b; } /*! If \a b is true then the URL is set to be a file; if \b is false then the URL is set not to be a file (which normally means it is a directory). (Note that a URL can refer to both a file and a directory even though most file systems do not support this.) If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setFile(bool b) { if (!d) { d = new QUrlInfoPrivate; } d->isFile = b; } /*! Specifies that the URL refers to a symbolic link if \a b is true and that it does not if \a b is false. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setSymLink(bool b) { if (!d) { d = new QUrlInfoPrivate; } d->isSymLink = b; } /*! Specifies that the URL is writable if \a b is true and not writable if \a b is false. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setWritable(bool b) { if (!d) { d = new QUrlInfoPrivate; } d->isWritable = b; } /*! Specifies that the URL is readable if \a b is true and not readable if \a b is false. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setReadable(bool b) { if (!d) { d = new QUrlInfoPrivate; } d->isReadable = b; } /*! Specifies that the owner of the URL is called \a s. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setOwner(const QString &s) { if (!d) { d = new QUrlInfoPrivate; } d->owner = s; } /*! Specifies that the owning group of the URL is called \a s. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setGroup(const QString &s) { if (!d) { d = new QUrlInfoPrivate; } d->group = s; } /*! Specifies the \a size of the URL. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setSize(qint64 size) { if (!d) { d = new QUrlInfoPrivate; } d->size = size; } /*! Specifies that the URL has access permissions \a p. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setPermissions(int p) { if (!d) { d = new QUrlInfoPrivate; } d->permissions = p; } /*! Specifies that the object the URL refers to was last modified at \a dt. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setLastModified(const QDateTime &dt) { if (!d) { d = new QUrlInfoPrivate; } d->lastModified = dt; } /*! \since 4.4 Specifies that the object the URL refers to was last read at \a dt. If you call this function for an invalid URL info, this function turns it into a valid one. \sa isValid() */ void QUrlInfo::setLastRead(const QDateTime &dt) { if (!d) { d = new QUrlInfoPrivate; } d->lastRead = dt; } /*! Destroys the URL info object. */ QUrlInfo::~QUrlInfo() { delete d; } /*! Assigns the values of \a ui to this QUrlInfo object. */ QUrlInfo &QUrlInfo::operator=(const QUrlInfo &ui) { if (this == &ui) { return *this; } if (ui.d) { if (!d) { d = new QUrlInfoPrivate; } *d = *ui.d; } else { delete d; d = 0; } return *this; } /*! Returns the file name of the URL. \sa isValid() */ QString QUrlInfo::name() const { if (!d) { return QString(); } return d->name; } /*! Returns the permissions of the URL. You can use the \c PermissionSpec flags to test for certain permissions. \sa isValid() */ int QUrlInfo::permissions() const { if (!d) { return 0; } return d->permissions; } /*! Returns the owner of the URL. \sa isValid() */ QString QUrlInfo::owner() const { if (!d) { return QString(); } return d->owner; } /*! Returns the group of the URL. \sa isValid() */ QString QUrlInfo::group() const { if (!d) { return QString(); } return d->group; } /*! Returns the size of the URL. \sa isValid() */ qint64 QUrlInfo::size() const { if (!d) { return 0; } return d->size; } /*! Returns the last modification date of the URL. \sa isValid() */ QDateTime QUrlInfo::lastModified() const { if (!d) { return QDateTime(); } return d->lastModified; } /*! Returns the date when the URL was last read. \sa isValid() */ QDateTime QUrlInfo::lastRead() const { if (!d) { return QDateTime(); } return d->lastRead; } /*! Returns true if the URL is a directory; otherwise returns false. \sa isValid() */ bool QUrlInfo::isDir() const { if (!d) { return false; } return d->isDir; } /*! Returns true if the URL is a file; otherwise returns false. \sa isValid() */ bool QUrlInfo::isFile() const { if (!d) { return false; } return d->isFile; } /*! Returns true if the URL is a symbolic link; otherwise returns false. \sa isValid() */ bool QUrlInfo::isSymLink() const { if (!d) { return false; } return d->isSymLink; } /*! Returns true if the URL is writable; otherwise returns false. \sa isValid() */ bool QUrlInfo::isWritable() const { if (!d) { return false; } return d->isWritable; } /*! Returns true if the URL is readable; otherwise returns false. \sa isValid() */ bool QUrlInfo::isReadable() const { if (!d) { return false; } return d->isReadable; } /*! Returns true if the URL is executable; otherwise returns false. \sa isValid() */ bool QUrlInfo::isExecutable() const { if (!d) { return false; } return d->isExecutable; } /*! Returns true if \a i1 is greater than \a i2; otherwise returns false. The objects are compared by the value, which is specified by \a sortBy. This must be one of QDir::Name, QDir::Time or QDir::Size. */ bool QUrlInfo::greaterThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy) { switch (sortBy) { case QDir::Name: return i1.name() > i2.name(); case QDir::Time: return i1.lastModified() > i2.lastModified(); case QDir::Size: return i1.size() > i2.size(); default: return false; } } /*! Returns true if \a i1 is less than \a i2; otherwise returns false. The objects are compared by the value, which is specified by \a sortBy. This must be one of QDir::Name, QDir::Time or QDir::Size. */ bool QUrlInfo::lessThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy) { return !greaterThan(i1, i2, sortBy); } /*! Returns true if \a i1 equals to \a i2; otherwise returns false. The objects are compared by the value, which is specified by \a sortBy. This must be one of QDir::Name, QDir::Time or QDir::Size. */ bool QUrlInfo::equal(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy) { switch (sortBy) { case QDir::Name: return i1.name() == i2.name(); case QDir::Time: return i1.lastModified() == i2.lastModified(); case QDir::Size: return i1.size() == i2.size(); default: return false; } } /*! Returns true if this QUrlInfo is equal to \a other; otherwise returns false. \sa lessThan(), equal() */ bool QUrlInfo::operator==(const QUrlInfo &other) const { if (!d) { return other.d == 0; } if (!other.d) { return false; } return (d->name == other.d->name && d->permissions == other.d->permissions && d->owner == other.d->owner && d->group == other.d->group && d->size == other.d->size && d->lastModified == other.d->lastModified && d->lastRead == other.d->lastRead && d->isDir == other.d->isDir && d->isFile == other.d->isFile && d->isSymLink == other.d->isSymLink && d->isWritable == other.d->isWritable && d->isReadable == other.d->isReadable && d->isExecutable == other.d->isExecutable); } /*! \fn bool QUrlInfo::operator!=(const QUrlInfo &other) const \since 4.2 Returns true if this QUrlInfo is not equal to \a other; otherwise returns false. \sa lessThan(), equal() */ /*! Returns true if the URL info is valid; otherwise returns false. Valid means that the QUrlInfo contains real information. You should always check if the URL info is valid before relying on the values. */ bool QUrlInfo::isValid() const { return d != 0; } QT_END_NAMESPACE quiterss-0.18.3/3rdparty/qftp/qurlinfo.h000066400000000000000000000106701265173051100202210ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the QtNetwork module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and Digia. For licensing terms and ** conditions see http://qt.digia.com/licensing. For further information ** use the contact form at http://qt.digia.com/contact-us. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Digia gives you certain additional ** rights. These rights are described in the Digia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met: https://www.gnu.org/copyleft/gpl.html. ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QURLINFO_H #define QURLINFO_H #include #include #include QT_BEGIN_NAMESPACE class QUrl; class QUrlInfoPrivate; class QUrlInfo { public: enum PermissionSpec { ReadOwner = 00400, WriteOwner = 00200, ExeOwner = 00100, ReadGroup = 00040, WriteGroup = 00020, ExeGroup = 00010, ReadOther = 00004, WriteOther = 00002, ExeOther = 00001 }; QUrlInfo(); QUrlInfo(const QUrlInfo &ui); QUrlInfo(const QString &name, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable); QUrlInfo(const QUrl &url, int permissions, const QString &owner, const QString &group, qint64 size, const QDateTime &lastModified, const QDateTime &lastRead, bool isDir, bool isFile, bool isSymLink, bool isWritable, bool isReadable, bool isExecutable); QUrlInfo &operator=(const QUrlInfo &ui); virtual ~QUrlInfo(); virtual void setName(const QString &name); virtual void setDir(bool b); virtual void setFile(bool b); virtual void setSymLink(bool b); virtual void setOwner(const QString &s); virtual void setGroup(const QString &s); virtual void setSize(qint64 size); virtual void setWritable(bool b); virtual void setReadable(bool b); virtual void setPermissions(int p); virtual void setLastModified(const QDateTime &dt); void setLastRead(const QDateTime &dt); bool isValid() const; QString name() const; int permissions() const; QString owner() const; QString group() const; qint64 size() const; QDateTime lastModified() const; QDateTime lastRead() const; bool isDir() const; bool isFile() const; bool isSymLink() const; bool isWritable() const; bool isReadable() const; bool isExecutable() const; static bool greaterThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy); static bool lessThan(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy); static bool equal(const QUrlInfo &i1, const QUrlInfo &i2, int sortBy); bool operator==(const QUrlInfo &i) const; inline bool operator!=(const QUrlInfo &i) const { return !operator==(i); } private: QUrlInfoPrivate* d; }; QT_END_NAMESPACE #endif // QURLINFO_H quiterss-0.18.3/3rdparty/qtsingleapplication/000077500000000000000000000000001265173051100213055ustar00rootroot00000000000000quiterss-0.18.3/3rdparty/qtsingleapplication/qtlocalpeer.cpp000066400000000000000000000151151265173051100243270ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtlocalpeer.h" #include #include #include #if defined(Q_OS_WIN) #include #include typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); static PProcessIdToSessionId pProcessIdToSessionId = 0; #endif #if defined(Q_OS_UNIX) || defined(Q_OS_OS2) #include #include #include #endif namespace QtLP_Private { #include "qtlockedfile.cpp" #if defined(Q_OS_WIN) #include "qtlockedfile_win.cpp" #else #include "qtlockedfile_unix.cpp" #endif } const char* QtLocalPeer::ack = "ack"; QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) : QObject(parent), id(appId) { QString prefix = id; if (id.isEmpty()) { id = QCoreApplication::applicationFilePath(); #if defined(Q_OS_WIN) id = id.toLower(); #endif prefix = id.section(QLatin1Char('/'), -1); } prefix.remove(QRegExp("[^a-zA-Z]")); prefix.truncate(6); QByteArray idc = id.toUtf8(); quint16 idNum = qChecksum(idc.constData(), idc.size()); socketName = QLatin1String("qtsingleapp-") + prefix + QLatin1Char('-') + QString::number(idNum, 16); #if defined(Q_OS_WIN) if (!pProcessIdToSessionId) { QLibrary lib("kernel32"); pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); } if (pProcessIdToSessionId) { DWORD sessionId = 0; pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); socketName += QLatin1Char('-') + QString::number(sessionId, 16); } #else socketName += QLatin1Char('-') + QString::number(::getuid(), 16); #endif server = new QLocalServer(this); QString lockName = QDir(QDir::tempPath()).absolutePath() + QLatin1Char('/') + socketName + QLatin1String("-lockfile"); lockFile.setFileName(lockName); lockFile.open(QIODevice::ReadWrite); } bool QtLocalPeer::isClient() { if (lockFile.isLocked()) return false; if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) return true; bool res = server->listen(socketName); #if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) // ### Workaround if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); res = server->listen(socketName); } #endif if (!res) qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); return false; } bool QtLocalPeer::sendMessage(const QString &message, int timeout) { if (!isClient()) return false; QLocalSocket socket; bool connOk = false; for(int i = 0; i < 2; i++) { // Try twice, in case the other instance is just starting up socket.connectToServer(socketName); connOk = socket.waitForConnected(timeout/2); if (connOk || i) break; int ms = 250; #if defined(Q_OS_WIN) Sleep(DWORD(ms)); #else struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; nanosleep(&ts, NULL); #endif } if (!connOk) return false; QByteArray uMsg(message.toUtf8()); QDataStream ds(&socket); ds.writeBytes(uMsg.constData(), uMsg.size()); bool res = socket.waitForBytesWritten(timeout); if (res) { res &= socket.waitForReadyRead(timeout); // wait for ack if (res) res &= (socket.read(qstrlen(ack)) == ack); } return res; } void QtLocalPeer::receiveConnection() { QLocalSocket* socket = server->nextPendingConnection(); if (!socket) return; while (socket->bytesAvailable() < (int)sizeof(quint32)) socket->waitForReadyRead(); QDataStream ds(socket); QByteArray uMsg; quint32 remaining; ds >> remaining; uMsg.resize(remaining); int got = 0; char* uMsgBuf = uMsg.data(); do { got = ds.readRawData(uMsgBuf, remaining); remaining -= got; uMsgBuf += got; } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); if (got < 0) { qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData()); delete socket; return; } QString message(QString::fromUtf8(uMsg)); socket->write(ack, qstrlen(ack)); socket->waitForBytesWritten(1000); socket->waitForDisconnected(1000); // make sure client reads ack delete socket; emit messageReceived(message); //### (might take a long time to return) } quiterss-0.18.3/3rdparty/qtsingleapplication/qtlocalpeer.h000066400000000000000000000052051265173051100237730ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTLOCALPEER_H #define QTLOCALPEER_H #include #include #include #include "qtlockedfile.h" class QtLocalPeer : public QObject { Q_OBJECT public: QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); bool isClient(); bool sendMessage(const QString &message, int timeout); QString applicationId() const { return id; } Q_SIGNALS: void messageReceived(const QString &message); protected Q_SLOTS: void receiveConnection(); protected: QString id; QString socketName; QLocalServer* server; QtLP_Private::QtLockedFile lockFile; private: static const char* ack; }; #endif // QTLOCALPEER_H quiterss-0.18.3/3rdparty/qtsingleapplication/qtlockedfile.cpp000066400000000000000000000137421265173051100244660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtlockedfile.h" /*! \class QtLockedFile \brief The QtLockedFile class extends QFile with advisory locking functions. A file may be locked in read or write mode. Multiple instances of \e QtLockedFile, created in multiple processes running on the same machine, may have a file locked in read mode. Exactly one instance may have it locked in write mode. A read and a write lock cannot exist simultaneously on the same file. The file locks are advisory. This means that nothing prevents another process from manipulating a locked file using QFile or file system functions offered by the OS. Serialization is only guaranteed if all processes that access the file use QLockedFile. Also, while holding a lock on a file, a process must not open the same file again (through any API), or locks can be unexpectedly lost. The lock provided by an instance of \e QtLockedFile is released whenever the program terminates. This is true even when the program crashes and no destructors are called. */ /*! \enum QtLockedFile::LockMode This enum describes the available lock modes. \value ReadLock A read lock. \value WriteLock A write lock. \value NoLock Neither a read lock nor a write lock. */ /*! Constructs an unlocked \e QtLockedFile object. This constructor behaves in the same way as \e QFile::QFile(). \sa QFile::QFile() */ QtLockedFile::QtLockedFile() : QFile() { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Constructs an unlocked QtLockedFile object with file \a name. This constructor behaves in the same way as \e QFile::QFile(const QString&). \sa QFile::QFile() */ QtLockedFile::QtLockedFile(const QString &name) : QFile(name) { #ifdef Q_OS_WIN wmutex = 0; rmutex = 0; #endif m_lock_mode = NoLock; } /*! Opens the file in OpenMode \a mode. This is identical to QFile::open(), with the one exception that the Truncate mode flag is disallowed. Truncation would conflict with the advisory file locking, since the file would be modified before the write lock is obtained. If truncation is required, use resize(0) after obtaining the write lock. Returns true if successful; otherwise false. \sa QFile::open(), QFile::resize() */ bool QtLockedFile::open(OpenMode mode) { if (mode & QIODevice::Truncate) { qWarning("QtLockedFile::open(): Truncate mode not allowed."); return false; } return QFile::open(mode); } /*! Returns \e true if this object has a in read or write lock; otherwise returns \e false. \sa lockMode() */ bool QtLockedFile::isLocked() const { return m_lock_mode != NoLock; } /*! Returns the type of lock currently held by this object, or \e QtLockedFile::NoLock. \sa isLocked() */ QtLockedFile::LockMode QtLockedFile::lockMode() const { return m_lock_mode; } /*! \fn bool QtLockedFile::lock(LockMode mode, bool block = true) Obtains a lock of type \a mode. The file must be opened before it can be locked. If \a block is true, this function will block until the lock is aquired. If \a block is false, this function returns \e false immediately if the lock cannot be aquired. If this object already has a lock of type \a mode, this function returns \e true immediately. If this object has a lock of a different type than \a mode, the lock is first released and then a new lock is obtained. This function returns \e true if, after it executes, the file is locked by this object, and \e false otherwise. \sa unlock(), isLocked(), lockMode() */ /*! \fn bool QtLockedFile::unlock() Releases a lock. If the object has no lock, this function returns immediately. This function returns \e true if, after it executes, the file is not locked by this object, and \e false otherwise. \sa lock(), isLocked(), lockMode() */ /*! \fn QtLockedFile::~QtLockedFile() Destroys the \e QtLockedFile object. If any locks were held, they are released. */ quiterss-0.18.3/3rdparty/qtsingleapplication/qtlockedfile.h000066400000000000000000000063071265173051100241320ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTLOCKEDFILE_H #define QTLOCKEDFILE_H #include #ifdef Q_OS_WIN #include #endif #if defined(Q_OS_WIN) # if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) # define QT_QTLOCKEDFILE_EXPORT # elif defined(QT_QTLOCKEDFILE_IMPORT) # if defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # endif # define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) # elif defined(QT_QTLOCKEDFILE_EXPORT) # undef QT_QTLOCKEDFILE_EXPORT # define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) # endif #else # define QT_QTLOCKEDFILE_EXPORT #endif namespace QtLP_Private { class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile { public: enum LockMode { NoLock = 0, ReadLock, WriteLock }; QtLockedFile(); QtLockedFile(const QString &name); ~QtLockedFile(); bool open(OpenMode mode); bool lock(LockMode mode, bool block = true); bool unlock(); bool isLocked() const; LockMode lockMode() const; private: #ifdef Q_OS_WIN Qt::HANDLE wmutex; Qt::HANDLE rmutex; QVector rmutexes; QString mutexname; Qt::HANDLE getMutexHandle(int idx, bool doCreate); bool waitMutex(Qt::HANDLE mutex, bool doBlock); #endif LockMode m_lock_mode; }; } #endif quiterss-0.18.3/3rdparty/qtsingleapplication/qtlockedfile_unix.cpp000066400000000000000000000066141265173051100255310ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include "qtlockedfile.h" bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; int cmd = block ? F_SETLKW : F_SETLK; int ret = fcntl(handle(), cmd, &fl); if (ret == -1) { if (errno != EINTR && errno != EAGAIN) qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 0; fl.l_type = F_UNLCK; int ret = fcntl(handle(), F_SETLKW, &fl); if (ret == -1) { qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); return false; } m_lock_mode = NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); } quiterss-0.18.3/3rdparty/qtsingleapplication/qtlockedfile_win.cpp000066400000000000000000000146611265173051100253440ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtlockedfile.h" #include #include #define MUTEX_PREFIX "QtLockedFile mutex " // Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS #define MAX_READERS MAXIMUM_WAIT_OBJECTS #if QT_VERSION >= 0x050000 #define QT_WA(unicode, ansi) unicode #endif Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) { if (mutexname.isEmpty()) { QFileInfo fi(*this); mutexname = QString::fromLatin1(MUTEX_PREFIX) + fi.absoluteFilePath().toLower(); } QString mname(mutexname); if (idx >= 0) mname += QString::number(idx); Qt::HANDLE mutex; if (doCreate) { QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); return 0; } } else { QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); if (!mutex) { if (GetLastError() != ERROR_FILE_NOT_FOUND) qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); return 0; } } return mutex; } bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) { Q_ASSERT(mutex); DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); switch (res) { case WAIT_OBJECT_0: case WAIT_ABANDONED: return true; break; case WAIT_TIMEOUT: break; default: qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); } return false; } bool QtLockedFile::lock(LockMode mode, bool block) { if (!isOpen()) { qWarning("QtLockedFile::lock(): file is not opened"); return false; } if (mode == NoLock) return unlock(); if (mode == m_lock_mode) return true; if (m_lock_mode != NoLock) unlock(); if (!wmutex && !(wmutex = getMutexHandle(-1, true))) return false; if (!waitMutex(wmutex, block)) return false; if (mode == ReadLock) { int idx = 0; for (; idx < MAX_READERS; idx++) { rmutex = getMutexHandle(idx, false); if (!rmutex || waitMutex(rmutex, false)) break; CloseHandle(rmutex); } bool ok = true; if (idx >= MAX_READERS) { qWarning("QtLockedFile::lock(): too many readers"); rmutex = 0; ok = false; } else if (!rmutex) { rmutex = getMutexHandle(idx, true); if (!rmutex || !waitMutex(rmutex, false)) ok = false; } if (!ok && rmutex) { CloseHandle(rmutex); rmutex = 0; } ReleaseMutex(wmutex); if (!ok) return false; } else { Q_ASSERT(rmutexes.isEmpty()); for (int i = 0; i < MAX_READERS; i++) { Qt::HANDLE mutex = getMutexHandle(i, false); if (mutex) rmutexes.append(mutex); } if (rmutexes.size()) { DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), TRUE, block ? INFINITE : 0); if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { if (res != WAIT_TIMEOUT) qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky unlock(); return false; } } } m_lock_mode = mode; return true; } bool QtLockedFile::unlock() { if (!isOpen()) { qWarning("QtLockedFile::unlock(): file is not opened"); return false; } if (!isLocked()) return true; if (m_lock_mode == ReadLock) { ReleaseMutex(rmutex); CloseHandle(rmutex); rmutex = 0; } else { foreach(Qt::HANDLE mutex, rmutexes) { ReleaseMutex(mutex); CloseHandle(mutex); } rmutexes.clear(); ReleaseMutex(wmutex); } m_lock_mode = QtLockedFile::NoLock; return true; } QtLockedFile::~QtLockedFile() { if (isOpen()) unlock(); if (wmutex) CloseHandle(wmutex); } quiterss-0.18.3/3rdparty/qtsingleapplication/qtsingleapplication.cpp000066400000000000000000000270101265173051100260630ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtsingleapplication.h" #include "qtlocalpeer.h" #include /*! \class QtSingleApplication qtsingleapplication.h \brief The QtSingleApplication class provides an API to detect and communicate with running instances of an application. This class allows you to create applications where only one instance should be running at a time. I.e., if the user tries to launch another instance, the already running instance will be activated instead. Another usecase is a client-server system, where the first started instance will assume the role of server, and the later instances will act as clients of that server. By default, the full path of the executable file is used to determine whether two processes are instances of the same application. You can also provide an explicit identifier string that will be compared instead. The application should create the QtSingleApplication object early in the startup phase, and call isRunning() to find out if another instance of this application is already running. If isRunning() returns false, it means that no other instance is running, and this instance has assumed the role as the running instance. In this case, the application should continue with the initialization of the application user interface before entering the event loop with exec(), as normal. The messageReceived() signal will be emitted when the running application receives messages from another instance of the same application. When a message is received it might be helpful to the user to raise the application so that it becomes visible. To facilitate this, QtSingleApplication provides the setActivationWindow() function and the activateWindow() slot. If isRunning() returns true, another instance is already running. It may be alerted to the fact that another instance has started by using the sendMessage() function. Also data such as startup parameters (e.g. the name of the file the user wanted this new instance to open) can be passed to the running instance with this function. Then, the application should terminate (or enter client mode). If isRunning() returns true, but sendMessage() fails, that is an indication that the running instance is frozen. Here's an example that shows how to convert an existing application to use QtSingleApplication. It is very simple and does not make use of all QtSingleApplication's functionality (see the examples for that). \code // Original int main(int argc, char **argv) { QApplication app(argc, argv); MyMainWidget mmw; mmw.show(); return app.exec(); } // Single instance int main(int argc, char **argv) { QtSingleApplication app(argc, argv); if (app.isRunning()) return !app.sendMessage(someDataString); MyMainWidget mmw; app.setActivationWindow(&mmw); mmw.show(); return app.exec(); } \endcode Once this QtSingleApplication instance is destroyed (normally when the process exits or crashes), when the user next attempts to run the application this instance will not, of course, be encountered. The next instance to call isRunning() or sendMessage() will assume the role as the new running instance. For console (non-GUI) applications, QtSingleCoreApplication may be used instead of this class, to avoid the dependency on the QtGui library. \sa QtSingleCoreApplication */ void QtSingleApplication::sysInit(const QString &appId) { actWin = 0; peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a GUIenabled are passed on to the QAppliation constructor. If you are creating a console application (i.e. setting \a GUIenabled to false), you may consider using QtSingleCoreApplication instead. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) : QApplication(argc, argv, GUIenabled) { sysInit(); } /*! Creates a QtSingleApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) : QApplication(argc, argv) { sysInit(appId); } #if QT_VERSION < 0x050000 /*! Creates a QtSingleApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc, \a argv, and \a type are passed on to the QAppliation constructor. */ QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) : QApplication(argc, argv, type) { sysInit(); } # if defined(Q_WS_X11) /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(); } /*! Special constructor for X11, ref. the documentation of QApplication's corresponding constructor. The application identifier will be \a appId. \a dpy, \a argc, \a argv, \a visual, and \a cmap are passed on to the QApplication constructor. */ QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) : QApplication(dpy, argc, argv, visual, cmap) { sysInit(appId); } # endif // Q_WS_X11 #endif // QT_VERSION < 0x050000 /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleApplication::id() const { return peer->applicationId(); } /*! Sets the activation window of this application to \a aw. The activation window is the widget that will be activated by activateWindow(). This is typically the application's main window. If \a activateOnMessage is true (the default), the window will be activated automatically every time a message is received, just prior to the messageReceived() signal being emitted. \sa activateWindow(), messageReceived() */ void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) { actWin = aw; if (activateOnMessage) connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); else disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); } /*! Returns the applications activation window if one has been set by calling setActivationWindow(), otherwise returns 0. \sa setActivationWindow() */ QWidget* QtSingleApplication::activationWindow() const { return actWin; } /*! De-minimizes, raises, and activates this application's activation window. This function does nothing if no activation window has been set. This is a convenience function to show the user that this application instance has been activated when he has tried to start another instance. This function should typically be called in response to the messageReceived() signal. By default, that will happen automatically, if an activation window has been set. \sa setActivationWindow(), messageReceived(), initialize() */ void QtSingleApplication::activateWindow() { if (actWin) { actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); actWin->raise(); actWin->activateWindow(); } } /*! \fn void QtSingleApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage(), setActivationWindow(), activateWindow() */ /*! \fn void QtSingleApplication::initialize(bool dummy = true) \obsolete */ quiterss-0.18.3/3rdparty/qtsingleapplication/qtsingleapplication.h000066400000000000000000000076171265173051100255430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTSINGLEAPPLICATION_H #define QTSINGLEAPPLICATION_H #include class QtLocalPeer; #if defined(Q_OS_WIN) # if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) # define QT_QTSINGLEAPPLICATION_EXPORT # elif defined(QT_QTSINGLEAPPLICATION_IMPORT) # if defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # endif # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) # elif defined(QT_QTSINGLEAPPLICATION_EXPORT) # undef QT_QTSINGLEAPPLICATION_EXPORT # define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) # endif #else # define QT_QTSINGLEAPPLICATION_EXPORT #endif class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication { Q_OBJECT public: QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); QtSingleApplication(const QString &id, int &argc, char **argv); #if QT_VERSION < 0x050000 QtSingleApplication(int &argc, char **argv, Type type); # if defined(Q_WS_X11) QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); # endif // Q_WS_X11 #endif // QT_VERSION < 0x050000 bool isRunning(); QString id() const; void setActivationWindow(QWidget* aw, bool activateOnMessage = true); QWidget* activationWindow() const; // Obsolete: void initialize(bool dummy = true) { isRunning(); Q_UNUSED(dummy) } public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); void activateWindow(); Q_SIGNALS: void messageReceived(const QString &message); private: void sysInit(const QString &appId = QString()); QtLocalPeer *peer; QWidget *actWin; }; #endif // QTSINGLEAPPLICATION_H quiterss-0.18.3/3rdparty/qtsingleapplication/qtsingleapplication.pri000066400000000000000000000010651265173051100260750ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD QT *= network greaterThan(QT_MAJOR_VERSION, 4): QT *= widgets qtsingleapplication-uselib:!qtsingleapplication-buildlib { LIBS += -L$$QTSINGLEAPPLICATION_LIBDIR -l$$QTSINGLEAPPLICATION_LIBNAME } else { SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h } os2|win32 { contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT } quiterss-0.18.3/3rdparty/qtsingleapplication/qtsinglecoreapplication.cpp000066400000000000000000000123551265173051100267420ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "qtsinglecoreapplication.h" #include "qtlocalpeer.h" /*! \class QtSingleCoreApplication qtsinglecoreapplication.h \brief A variant of the QtSingleApplication class for non-GUI applications. This class is a variant of QtSingleApplication suited for use in console (non-GUI) applications. It is an extension of QCoreApplication (instead of QApplication). It does not require the QtGui library. The API and usage is identical to QtSingleApplication, except that functions relating to the "activation window" are not present, for obvious reasons. Please refer to the QtSingleApplication documentation for explanation of the usage. A QtSingleCoreApplication instance can communicate to a QtSingleApplication instance if they share the same application id. Hence, this class can be used to create a light-weight command-line tool that sends commands to a GUI application. \sa QtSingleApplication */ /*! Creates a QtSingleCoreApplication object. The application identifier will be QCoreApplication::applicationFilePath(). \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Creates a QtSingleCoreApplication object with the application identifier \a appId. \a argc and \a argv are passed on to the QCoreAppliation constructor. */ QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) : QCoreApplication(argc, argv) { peer = new QtLocalPeer(this, appId); connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); } /*! Returns true if another instance of this application is running; otherwise false. This function does not find instances of this application that are being run by a different user (on Windows: that are running in another session). \sa sendMessage() */ bool QtSingleCoreApplication::isRunning() { return peer->isClient(); } /*! Tries to send the text \a message to the currently running instance. The QtSingleCoreApplication object in the running instance will emit the messageReceived() signal when it receives the message. This function returns true if the message has been sent to, and processed by, the current instance. If there is no instance currently running, or if the running instance fails to process the message within \a timeout milliseconds, this function return false. \sa isRunning(), messageReceived() */ bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) { return peer->sendMessage(message, timeout); } /*! Returns the application identifier. Two processes with the same identifier will be regarded as instances of the same application. */ QString QtSingleCoreApplication::id() const { return peer->applicationId(); } /*! \fn void QtSingleCoreApplication::messageReceived(const QString& message) This signal is emitted when the current instance receives a \a message from another instance of this application. \sa sendMessage() */ quiterss-0.18.3/3rdparty/qtsingleapplication/qtsinglecoreapplication.h000066400000000000000000000050251265173051100264030ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "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 the name of Digia Plc and its Subsidiary(-ies) 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 THE COPYRIGHT ** OWNER 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." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef QTSINGLECOREAPPLICATION_H #define QTSINGLECOREAPPLICATION_H #include class QtLocalPeer; class QtSingleCoreApplication : public QCoreApplication { Q_OBJECT public: QtSingleCoreApplication(int &argc, char **argv); QtSingleCoreApplication(const QString &id, int &argc, char **argv); bool isRunning(); QString id() const; public Q_SLOTS: bool sendMessage(const QString &message, int timeout = 5000); Q_SIGNALS: void messageReceived(const QString &message); private: QtLocalPeer* peer; }; #endif // QTSINGLECOREAPPLICATION_H quiterss-0.18.3/3rdparty/qupzilla/000077500000000000000000000000001265173051100170745ustar00rootroot00000000000000quiterss-0.18.3/3rdparty/qupzilla/qupzilla.pri000066400000000000000000000001201265173051100214420ustar00rootroot00000000000000INCLUDEPATH += $$PWD HEADERS += $$PWD/qzregexp.h SOURCES += $$PWD/qzregexp.cpp quiterss-0.18.3/3rdparty/qupzilla/qzregexp.cpp000066400000000000000000000046431265173051100214540ustar00rootroot00000000000000/* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "qzregexp.h" #if (QT_VERSION >= 0x050000) QzRegExp::QzRegExp() : QRegularExpression(QString(), QRegularExpression::DotMatchesEverythingOption) , m_matchedLength(-1) { } QzRegExp::QzRegExp(const QString &pattern, Qt::CaseSensitivity cs) : QRegularExpression(pattern, QRegularExpression::DotMatchesEverythingOption) , m_matchedLength(-1) { if (cs == Qt::CaseInsensitive) { setPatternOptions(patternOptions() | QRegularExpression::CaseInsensitiveOption); } } QzRegExp::QzRegExp(const QzRegExp &re) : QRegularExpression(re) , m_matchedLength(-1) { } void QzRegExp::setMinimal(bool minimal) { QRegularExpression::PatternOptions opt; if (minimal) { opt = patternOptions() | QRegularExpression::InvertedGreedinessOption; } else { opt = patternOptions() & ~QRegularExpression::InvertedGreedinessOption; } setPatternOptions(opt); } int QzRegExp::indexIn(const QString &str, int offset) const { QzRegExp* that = const_cast(this); QRegularExpressionMatch m = match(str, offset); if (!m.hasMatch()) { that->m_matchedLength = -1; that->m_capturedTexts.clear(); return -1; } that->m_matchedLength = m.capturedLength(); that->m_capturedTexts = m.capturedTexts(); return m.capturedStart(); } int QzRegExp::matchedLength() const { return m_matchedLength; } QString QzRegExp::cap(int nth) const { if (!(nth >= 0 && m_capturedTexts.count() > nth)) { return QString(); } return m_capturedTexts.at(nth); } #endif // (QT_VERSION >= 0x050000) quiterss-0.18.3/3rdparty/qupzilla/qzregexp.h000066400000000000000000000030411265173051100211100ustar00rootroot00000000000000/* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef QZREGEXP_H #define QZREGEXP_H #include // Needed for QT_VERSION #if (QT_VERSION < 0x050000) // Qt 4 - use QRegExp directly #include #define QzRegExp QRegExp #else // Qt 5 #include #include class QzRegExp : public QRegularExpression { public: QzRegExp(); QzRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive); QzRegExp(const QzRegExp &re); void setMinimal(bool minimal); int indexIn(const QString &str, int offset = 0) const; int matchedLength() const; QString cap(int nth = 0) const; private: QStringList m_capturedTexts; int m_matchedLength; }; #endif // Qt 5 #endif // QZREGEXP_H quiterss-0.18.3/3rdparty/sqlite.pri000066400000000000000000000012601265173051100172470ustar00rootroot00000000000000#DEFINES += SQLITEDRIVER_DEBUG #DEFINES += SQLITEDRIVER_EXPORT INCLUDEPATH += $$PWD \ $$PWD/sqlitex os2|win32|mac { CONFIG(release, debug|release):DEFINES *= NDEBUG DEFINES += SQLITE_OMIT_LOAD_EXTENSION SQLITE_OMIT_COMPLETE HEADERS += $$PWD/sqlite/sqlite3.h SOURCES += $$PWD/sqlite/sqlite3.c INCLUDEPATH += $$PWD/sqlite } else { CONFIG += link_pkgconfig PKGCONFIG += sqlite3 } HEADERS += $$PWD/sqlitex/sqlcachedresult.h \ $$PWD/sqlitex/sqlitedriver.h \ $$PWD/sqlitex/sqliteextension.h SOURCES += $$PWD/sqlitex/sqlcachedresult.cpp \ $$PWD/sqlitex/sqlitedriver.cpp \ $$PWD/sqlitex/sqliteextension.cpp quiterss-0.18.3/3rdparty/sqlitex/000077500000000000000000000000001265173051100167245ustar00rootroot00000000000000quiterss-0.18.3/3rdparty/sqlitex/sqlcachedresult.cpp000066400000000000000000000136461265173051100226300ustar00rootroot00000000000000/************************************************************************** * Extensible SQLite driver for Qt4/Qt5 * Copyright (C) 2011-2012 MichaÅ‚ MÄ™ciÅ„ski * Copyright (C) 2011-2016 QuiteRSS Team * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. * * 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, see . * * This library is based on the QtSql module of the Qt Toolkit * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). **************************************************************************/ #include "sqlcachedresult.h" #include #include #include static const uint initial_cache_size = 128; class SqlCachedResultPrivate { public: SqlCachedResultPrivate(); bool canSeek(int i) const; inline int cacheCount() const; void init(int count, bool fo); void cleanup(); int nextIndex(); void revertLast(); SqlCachedResult::ValueCache cache; int rowCacheEnd; int colCount; bool forwardOnly; bool atEnd; }; SqlCachedResultPrivate::SqlCachedResultPrivate(): rowCacheEnd(0), colCount(0), forwardOnly(false), atEnd(false) { } void SqlCachedResultPrivate::cleanup() { cache.clear(); forwardOnly = false; atEnd = false; colCount = 0; rowCacheEnd = 0; } void SqlCachedResultPrivate::init(int count, bool fo) { Q_ASSERT(count); cleanup(); forwardOnly = fo; colCount = count; if (fo) { cache.resize(count); rowCacheEnd = count; } else { cache.resize(initial_cache_size * count); } } int SqlCachedResultPrivate::nextIndex() { if (forwardOnly) return 0; int newIdx = rowCacheEnd; if (newIdx + colCount > cache.size()) cache.resize(qMin(cache.size() * 2, cache.size() + 10000)); rowCacheEnd += colCount; return newIdx; } bool SqlCachedResultPrivate::canSeek(int i) const { if (forwardOnly || i < 0) return false; return rowCacheEnd >= (i + 1) * colCount; } void SqlCachedResultPrivate::revertLast() { if (forwardOnly) return; rowCacheEnd -= colCount; } inline int SqlCachedResultPrivate::cacheCount() const { Q_ASSERT(!forwardOnly); Q_ASSERT(colCount); return rowCacheEnd / colCount; } ////////////// SqlCachedResult::SqlCachedResult(const QSqlDriver * db): QSqlResult (db) { d = new SqlCachedResultPrivate(); } SqlCachedResult::~SqlCachedResult() { delete d; } void SqlCachedResult::init(int colCount) { d->init(colCount, isForwardOnly()); } bool SqlCachedResult::fetch(int i) { if ((!isActive()) || (i < 0)) return false; if (at() == i) return true; if (d->forwardOnly) { // speed hack - do not copy values if not needed if (at() > i || at() == QSql::AfterLastRow) return false; while(at() < i - 1) { if (!gotoNext(d->cache, -1)) return false; setAt(at() + 1); } if (!gotoNext(d->cache, 0)) return false; setAt(at() + 1); return true; } if (d->canSeek(i)) { setAt(i); return true; } if (d->rowCacheEnd > 0) setAt(d->cacheCount()); while (at() < i + 1) { if (!cacheNext()) { if (d->canSeek(i)) break; return false; } } setAt(i); return true; } bool SqlCachedResult::fetchNext() { if (d->canSeek(at() + 1)) { setAt(at() + 1); return true; } return cacheNext(); } bool SqlCachedResult::fetchPrevious() { return fetch(at() - 1); } bool SqlCachedResult::fetchFirst() { if (d->forwardOnly && at() != QSql::BeforeFirstRow) { return false; } if (d->canSeek(0)) { setAt(0); return true; } return cacheNext(); } bool SqlCachedResult::fetchLast() { if (d->atEnd) { if (d->forwardOnly) return false; else return fetch(d->cacheCount() - 1); } int i = at(); while (fetchNext()) ++i; /* brute force */ if (d->forwardOnly && at() == QSql::AfterLastRow) { setAt(i); return true; } else { return fetch(i); } } QVariant SqlCachedResult::data(int i) { int idx = d->forwardOnly ? i : at() * d->colCount + i; if (i >= d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd) return QVariant(); return d->cache.at(idx); } bool SqlCachedResult::isNull(int i) { int idx = d->forwardOnly ? i : at() * d->colCount + i; if (i >= d->colCount || i < 0 || at() < 0 || idx >= d->rowCacheEnd) return true; return d->cache.at(idx).isNull(); } void SqlCachedResult::cleanup() { setAt(QSql::BeforeFirstRow); setActive(false); d->cleanup(); } void SqlCachedResult::clearValues() { setAt(QSql::BeforeFirstRow); d->rowCacheEnd = 0; d->atEnd = false; } bool SqlCachedResult::cacheNext() { if (d->atEnd) return false; if(isForwardOnly()) { d->cache.clear(); d->cache.resize(d->colCount); } if (!gotoNext(d->cache, d->nextIndex())) { d->revertLast(); d->atEnd = true; return false; } setAt(at() + 1); return true; } int SqlCachedResult::colCount() const { return d->colCount; } SqlCachedResult::ValueCache &SqlCachedResult::cache() { return d->cache; } void SqlCachedResult::virtual_hook(int id, void *data) { #ifdef HAVE_QT5 QSqlResult::virtual_hook(id, data); #else switch (id) { case QSqlResult::DetachFromResultSet: case QSqlResult::SetNumericalPrecision: cleanup(); break; default: QSqlResult::virtual_hook(id, data); } #endif } #ifdef HAVE_QT5 void SqlCachedResult::detachFromResultSet() { cleanup(); } void SqlCachedResult::setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy) { QSqlResult::setNumericalPrecisionPolicy(policy); cleanup(); } #endif quiterss-0.18.3/3rdparty/sqlitex/sqlcachedresult.h000066400000000000000000000036311265173051100222660ustar00rootroot00000000000000/************************************************************************** * Extensible SQLite driver for Qt4/Qt5 * Copyright (C) 2011-2012 MichaÅ‚ MÄ™ciÅ„ski * Copyright (C) 2011-2016 QuiteRSS Team * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. * * 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, see . * * This library is based on the QtSql module of the Qt Toolkit * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). **************************************************************************/ #ifndef SQLCACHEDRESULT_H #define SQLCACHEDRESULT_H #include class QVariant; template class QVector; class SqlCachedResultPrivate; class SqlCachedResult: public QSqlResult { public: virtual ~SqlCachedResult(); typedef QVector ValueCache; protected: SqlCachedResult(const QSqlDriver * db); void init(int colCount); void cleanup(); void clearValues(); virtual bool gotoNext(ValueCache &values, int index) = 0; QVariant data(int i); bool isNull(int i); bool fetch(int i); bool fetchNext(); bool fetchPrevious(); bool fetchFirst(); bool fetchLast(); int colCount() const; ValueCache &cache(); #ifdef HAVE_QT5 void detachFromResultSet(); void setNumericalPrecisionPolicy(QSql::NumericalPrecisionPolicy policy); #endif void virtual_hook(int id, void *data); private: bool cacheNext(); SqlCachedResultPrivate *d; }; #endif quiterss-0.18.3/3rdparty/sqlitex/sqlitedriver.cpp000066400000000000000000000525161265173051100221560ustar00rootroot00000000000000/************************************************************************** * Extensible SQLite driver for Qt4/Qt5 * Copyright (C) 2011-2012 MichaÅ‚ MÄ™ciÅ„ski * Copyright (C) 2011-2016 QuiteRSS Team * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. * * 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, see . * * This library is based on the QtSql module of the Qt Toolkit * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). **************************************************************************/ #include "sqlitedriver.h" #include "sqliteextension.h" #include #include #include #include #include #include #include #include #include #include #if defined Q_OS_WIN # include #else # include #endif #include #ifdef HAVE_QT5 Q_DECLARE_OPAQUE_POINTER(sqlite3*) Q_DECLARE_OPAQUE_POINTER(sqlite3_stmt*) #endif Q_DECLARE_METATYPE(sqlite3*) Q_DECLARE_METATYPE(sqlite3_stmt*) static QString _q_escapeIdentifier(const QString &identifier) { QString res = identifier; if(!identifier.isEmpty() && identifier.left(1) != QString(QLatin1Char('"')) && identifier.right(1) != QString(QLatin1Char('"')) ) { res.replace(QLatin1Char('"'), QLatin1String("\"\"")); res.prepend(QLatin1Char('"')).append(QLatin1Char('"')); res.replace(QLatin1Char('.'), QLatin1String("\".\"")); } return res; } static QVariant::Type qGetColumnType(const QString &tpName) { const QString typeName = tpName.toLower(); if (typeName == QLatin1String("integer") || typeName == QLatin1String("int")) return QVariant::Int; if (typeName == QLatin1String("double") || typeName == QLatin1String("float") || typeName == QLatin1String("real") || typeName.startsWith(QLatin1String("numeric"))) return QVariant::Double; if (typeName == QLatin1String("blob")) return QVariant::ByteArray; return QVariant::String; } static QSqlError qMakeError(sqlite3 *access, const QString &descr, QSqlError::ErrorType type, int errorCode = -1) { return QSqlError(descr, QString(reinterpret_cast(sqlite3_errmsg16(access))), type, errorCode); } #if defined(SQLITEDRIVER_DEBUG) static void trace( void* /*arg*/, const char* query ) { qDebug() << "SQLite:" << QString::fromUtf8( query ); } #endif class SQLiteDriverPrivate { public: inline SQLiteDriverPrivate() : access(0) {} sqlite3 *access; QList results; }; class SQLiteResultPrivate { public: SQLiteResultPrivate(SQLiteResult *res); void cleanup(); bool fetchNext(SqlCachedResult::ValueCache &values, int idx, bool initialFetch); // initializes the recordInfo and the cache void initColumns(bool emptyResultset); void finalize(); SQLiteResult* q; sqlite3 *access; sqlite3_stmt *stmt; bool skippedStatus; // the status of the fetchNext() that's skipped bool skipRow; // skip the next fetchNext()? QSqlRecord rInf; QVector firstRow; }; SQLiteResultPrivate::SQLiteResultPrivate(SQLiteResult* res) : q(res), access(0), stmt(0), skippedStatus(false), skipRow(false) { } void SQLiteResultPrivate::cleanup() { finalize(); rInf.clear(); skippedStatus = false; skipRow = false; q->setAt(QSql::BeforeFirstRow); q->setActive(false); q->cleanup(); } void SQLiteResultPrivate::finalize() { if (!stmt) return; sqlite3_finalize(stmt); stmt = 0; } void SQLiteResultPrivate::initColumns(bool emptyResultset) { int nCols = sqlite3_column_count(stmt); if (nCols <= 0) return; q->init(nCols); for (int i = 0; i < nCols; ++i) { QString colName = QString(reinterpret_cast( sqlite3_column_name16(stmt, i)) ).remove(QLatin1Char('"')); // must use typeName for resolving the type to match SQLiteDriver::record QString typeName = QString(reinterpret_cast( sqlite3_column_decltype16(stmt, i))); // sqlite3_column_type is documented to have undefined behavior if the result set is empty int stp = emptyResultset ? -1 : sqlite3_column_type(stmt, i); QVariant::Type fieldType; if (!typeName.isEmpty()) { fieldType = qGetColumnType(typeName); } else { // Get the proper type for the field based on stp value switch (stp) { case SQLITE_INTEGER: fieldType = QVariant::Int; break; case SQLITE_FLOAT: fieldType = QVariant::Double; break; case SQLITE_BLOB: fieldType = QVariant::ByteArray; break; case SQLITE_TEXT: fieldType = QVariant::String; break; case SQLITE_NULL: default: fieldType = QVariant::Invalid; break; } } QSqlField fld(colName, fieldType); fld.setSqlType(stp); rInf.append(fld); } } bool SQLiteResultPrivate::fetchNext(SqlCachedResult::ValueCache &values, int idx, bool initialFetch) { int res; int i; if (skipRow) { // already fetched Q_ASSERT(!initialFetch); skipRow = false; for(int i=0;isetLastError(QSqlError(QCoreApplication::translate("SQLiteResult", "Unable to fetch row"), QCoreApplication::translate("SQLiteResult", "No query"), QSqlError::ConnectionError)); q->setAt(QSql::AfterLastRow); return false; } res = sqlite3_step(stmt); switch(res) { case SQLITE_ROW: // check to see if should fill out columns if (rInf.isEmpty()) // must be first call. initColumns(false); if (idx < 0 && !initialFetch) return true; for (i = 0; i < rInf.count(); ++i) { switch (sqlite3_column_type(stmt, i)) { case SQLITE_BLOB: values[i + idx] = QByteArray(static_cast( sqlite3_column_blob(stmt, i)), sqlite3_column_bytes(stmt, i)); break; case SQLITE_INTEGER: values[i + idx] = sqlite3_column_int64(stmt, i); break; case SQLITE_FLOAT: switch(q->numericalPrecisionPolicy()) { case QSql::LowPrecisionInt32: values[i + idx] = sqlite3_column_int(stmt, i); break; case QSql::LowPrecisionInt64: values[i + idx] = sqlite3_column_int64(stmt, i); break; case QSql::LowPrecisionDouble: case QSql::HighPrecision: default: values[i + idx] = sqlite3_column_double(stmt, i); break; }; break; case SQLITE_NULL: values[i + idx] = QVariant(QVariant::String); break; default: values[i + idx] = QString(reinterpret_cast( sqlite3_column_text16(stmt, i)), sqlite3_column_bytes16(stmt, i) / sizeof(QChar)); break; } } return true; case SQLITE_DONE: if (rInf.isEmpty()) // must be first call. initColumns(true); q->setAt(QSql::AfterLastRow); sqlite3_reset(stmt); return false; case SQLITE_CONSTRAINT: case SQLITE_ERROR: // SQLITE_ERROR is a generic error code and we must call sqlite3_reset() // to get the specific error message. res = sqlite3_reset(stmt); q->setLastError(qMakeError(access, QCoreApplication::translate("SQLiteResult", "Unable to fetch row"), QSqlError::ConnectionError, res)); q->setAt(QSql::AfterLastRow); return false; case SQLITE_MISUSE: case SQLITE_BUSY: default: // something wrong, don't get col info, but still return false q->setLastError(qMakeError(access, QCoreApplication::translate("SQLiteResult", "Unable to fetch row"), QSqlError::ConnectionError, res)); sqlite3_reset(stmt); q->setAt(QSql::AfterLastRow); return false; } return false; } SQLiteResult::SQLiteResult(const SQLiteDriver* db) : SqlCachedResult(db) { d = new SQLiteResultPrivate(this); d->access = db->d->access; db->d->results.append(this); } SQLiteResult::~SQLiteResult() { const SQLiteDriver * sqlDriver = qobject_cast(driver()); if (sqlDriver) sqlDriver->d->results.removeOne(this); d->cleanup(); delete d; } void SQLiteResult::virtual_hook(int id, void *data) { #ifdef HAVE_QT5 SqlCachedResult::virtual_hook(id, data); #else switch (id) { case QSqlResult::DetachFromResultSet: if (d->stmt) sqlite3_reset(d->stmt); break; default: SqlCachedResult::virtual_hook(id, data); } #endif } bool SQLiteResult::reset(const QString &query) { if (!prepare(query)) return false; return exec(); } bool SQLiteResult::prepare(const QString &query) { if (!driver() || !driver()->isOpen() || driver()->isOpenError()) return false; d->cleanup(); setSelect(false); const void *pzTail = NULL; #if (SQLITE_VERSION_NUMBER >= 3003011) int res = sqlite3_prepare16_v2(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, &pzTail); #else int res = sqlite3_prepare16(d->access, query.constData(), (query.size() + 1) * sizeof(QChar), &d->stmt, &pzTail); #endif if (res != SQLITE_OK) { #if defined(SQLITEDRIVER_DEBUG) trace(NULL, query.toUtf8().constData()); #endif setLastError(qMakeError(d->access, QCoreApplication::translate("SQLiteResult", "Unable to execute statement"), QSqlError::StatementError, res)); d->finalize(); return false; } else if (pzTail && !QString(reinterpret_cast(pzTail)).trimmed().isEmpty()) { setLastError(qMakeError(d->access, QCoreApplication::translate("SQLiteResult", "Unable to execute multiple statements at a time"), QSqlError::StatementError, SQLITE_MISUSE)); d->finalize(); return false; } return true; } bool SQLiteResult::exec() { const QVector values = boundValues(); d->skippedStatus = false; d->skipRow = false; d->rInf.clear(); clearValues(); setLastError(QSqlError()); int res = sqlite3_reset(d->stmt); if (res != SQLITE_OK) { setLastError(qMakeError(d->access, QCoreApplication::translate("SQLiteResult", "Unable to reset statement"), QSqlError::StatementError, res)); d->finalize(); return false; } int paramCount = sqlite3_bind_parameter_count(d->stmt); if (paramCount == values.count()) { for (int i = 0; i < paramCount; ++i) { res = SQLITE_OK; const QVariant value = values.at(i); if (value.isNull()) { res = sqlite3_bind_null(d->stmt, i + 1); } else { switch (value.type()) { case QVariant::ByteArray: { const QByteArray *ba = static_cast(value.constData()); res = sqlite3_bind_blob(d->stmt, i + 1, ba->constData(), ba->size(), SQLITE_STATIC); break; } case QVariant::Int: res = sqlite3_bind_int(d->stmt, i + 1, value.toInt()); break; case QVariant::Double: res = sqlite3_bind_double(d->stmt, i + 1, value.toDouble()); break; case QVariant::UInt: case QVariant::LongLong: res = sqlite3_bind_int64(d->stmt, i + 1, value.toLongLong()); break; case QVariant::String: { // lifetime of string == lifetime of its qvariant const QString *str = static_cast(value.constData()); res = sqlite3_bind_text16(d->stmt, i + 1, str->utf16(), (str->size()) * sizeof(QChar), SQLITE_STATIC); break; } default: { QString str = value.toString(); // SQLITE_TRANSIENT makes sure that sqlite buffers the data res = sqlite3_bind_text16(d->stmt, i + 1, str.utf16(), (str.size()) * sizeof(QChar), SQLITE_TRANSIENT); break; } } } if (res != SQLITE_OK) { setLastError(qMakeError(d->access, QCoreApplication::translate("SQLiteResult", "Unable to bind parameters"), QSqlError::StatementError, res)); d->finalize(); return false; } } } else { setLastError(QSqlError(QCoreApplication::translate("SQLiteResult", "Parameter count mismatch"), QString(), QSqlError::StatementError)); return false; } d->skippedStatus = d->fetchNext(d->firstRow, 0, true); if (lastError().isValid()) { setSelect(false); setActive(false); return false; } setSelect(!d->rInf.isEmpty()); setActive(true); return true; } bool SQLiteResult::gotoNext(SqlCachedResult::ValueCache& row, int idx) { return d->fetchNext(row, idx, false); } int SQLiteResult::size() { return -1; } int SQLiteResult::numRowsAffected() { return sqlite3_changes(d->access); } QVariant SQLiteResult::lastInsertId() const { if (isActive()) { qint64 id = sqlite3_last_insert_rowid(d->access); if (id) return id; } return QVariant(); } QSqlRecord SQLiteResult::record() const { if (!isActive() || !isSelect()) return QSqlRecord(); return d->rInf; } #ifdef HAVE_QT5 void SQLiteResult::detachFromResultSet() { if (d->stmt) sqlite3_reset(d->stmt); } #endif QVariant SQLiteResult::handle() const { return QVariant::fromValue(d->stmt); } void SQLiteResult::setLastError(const QSqlError& e) { #if defined(SQLITEDRIVER_DEBUG) if (e.isValid()) qDebug() << "SQLite error:" << e.driverText() << e.databaseText(); #endif SqlCachedResult::setLastError(e); } ///////////////////////////////////////////////////////// SQLiteDriver::SQLiteDriver(QObject * parent) : QSqlDriver(parent) { d = new SQLiteDriverPrivate(); } SQLiteDriver::SQLiteDriver(sqlite3 *connection, QObject *parent) : QSqlDriver(parent) { d = new SQLiteDriverPrivate(); d->access = connection; setOpen(true); setOpenError(false); } SQLiteDriver::~SQLiteDriver() { delete d; } bool SQLiteDriver::hasFeature(DriverFeature f) const { switch (f) { case BLOB: case Transactions: case Unicode: case LastInsertId: case PreparedQueries: case PositionalPlaceholders: case SimpleLocking: case FinishQuery: case LowPrecisionNumbers: return true; case QuerySize: case NamedPlaceholders: case BatchOperations: case EventNotifications: case MultipleResultSets: #ifdef HAVE_QT5 case CancelQuery: #endif return false; } return false; } /* SQLite dbs have no user name, passwords, hosts or ports. just file names. */ bool SQLiteDriver::open(const QString & db, const QString &, const QString &, const QString &, int, const QString &conOpts) { if (isOpen()) close(); if (db.isEmpty()) return false; bool sharedCache = false; int openMode = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, timeOut=5000; QStringList opts=QString(conOpts).remove(QLatin1Char(' ')).split(QLatin1Char(';')); foreach(const QString &option, opts) { if (option.startsWith(QLatin1String("QSQLITE_BUSY_TIMEOUT="))) { bool ok; int nt = option.mid(21).toInt(&ok); if (ok) timeOut = nt; } if (option == QLatin1String("QSQLITE_OPEN_READONLY")) openMode = SQLITE_OPEN_READONLY; if (option == QLatin1String("QSQLITE_ENABLE_SHARED_CACHE")) sharedCache = true; } sqlite3_enable_shared_cache(sharedCache); if (sqlite3_open_v2(db.toUtf8().constData(), &d->access, openMode, NULL) == SQLITE_OK) { sqlite3_busy_timeout(d->access, timeOut); #if defined(SQLITEDRIVER_DEBUG) sqlite3_trace(d->access, trace, NULL); #endif setOpen(true); setOpenError(false); installSQLiteExtension(d->access); return true; } else { setLastError(qMakeError(d->access, tr("Error opening database"), QSqlError::ConnectionError)); setOpenError(true); return false; } } void SQLiteDriver::close() { if (isOpen()) { foreach (SQLiteResult *result, d->results) result->d->finalize(); if (sqlite3_close(d->access) != SQLITE_OK) setLastError(qMakeError(d->access, tr("Error closing database"), QSqlError::ConnectionError)); d->access = 0; setOpen(false); setOpenError(false); } } QSqlResult *SQLiteDriver::createResult() const { return new SQLiteResult(this); } bool SQLiteDriver::beginTransaction() { if (!isOpen() || isOpenError()) return false; QSqlQuery q(createResult()); if (!q.exec(QLatin1String("BEGIN"))) { setLastError(QSqlError(tr("Unable to begin transaction"), q.lastError().databaseText(), QSqlError::TransactionError)); return false; } return true; } bool SQLiteDriver::commitTransaction() { if (!isOpen() || isOpenError()) return false; QSqlQuery q(createResult()); if (!q.exec(QLatin1String("COMMIT"))) { setLastError(QSqlError(tr("Unable to commit transaction"), q.lastError().databaseText(), QSqlError::TransactionError)); return false; } return true; } bool SQLiteDriver::rollbackTransaction() { if (!isOpen() || isOpenError()) return false; QSqlQuery q(createResult()); if (!q.exec(QLatin1String("ROLLBACK"))) { setLastError(QSqlError(tr("Unable to rollback transaction"), q.lastError().databaseText(), QSqlError::TransactionError)); return false; } return true; } QStringList SQLiteDriver::tables(QSql::TableType type) const { QStringList res; if (!isOpen()) return res; QSqlQuery q(createResult()); q.setForwardOnly(true); QString sql = QLatin1String("SELECT name FROM sqlite_master WHERE %1 " "UNION ALL SELECT name FROM sqlite_temp_master WHERE %1"); if ((type & QSql::Tables) && (type & QSql::Views)) sql = sql.arg(QLatin1String("type='table' OR type='view'")); else if (type & QSql::Tables) sql = sql.arg(QLatin1String("type='table'")); else if (type & QSql::Views) sql = sql.arg(QLatin1String("type='view'")); else sql.clear(); if (!sql.isEmpty() && q.exec(sql)) { while(q.next()) res.append(q.value(0).toString()); } if (type & QSql::SystemTables) { // there are no internal tables beside this one: res.append(QLatin1String("sqlite_master")); } return res; } static QSqlIndex qGetTableInfo(QSqlQuery &q, const QString &tableName, bool onlyPIndex = false) { QString schema; QString table(tableName); int indexOfSeparator = tableName.indexOf(QLatin1Char('.')); if (indexOfSeparator > -1) { schema = tableName.left(indexOfSeparator).append(QLatin1Char('.')); table = tableName.mid(indexOfSeparator + 1); } q.exec(QLatin1String("PRAGMA ") + schema + QLatin1String("table_info (") + _q_escapeIdentifier(table) + QLatin1String(")")); QSqlIndex ind; while (q.next()) { bool isPk = q.value(5).toInt(); if (onlyPIndex && !isPk) continue; QString typeName = q.value(2).toString().toLower(); QSqlField fld(q.value(1).toString(), qGetColumnType(typeName)); if (isPk && (typeName == QLatin1String("integer"))) // INTEGER PRIMARY KEY fields are auto-generated in sqlite // INT PRIMARY KEY is not the same as INTEGER PRIMARY KEY! fld.setAutoValue(true); fld.setRequired(q.value(3).toInt() != 0); fld.setDefaultValue(q.value(4)); ind.append(fld); } return ind; } QSqlIndex SQLiteDriver::primaryIndex(const QString &tblname) const { if (!isOpen()) return QSqlIndex(); QString table = tblname; if (isIdentifierEscaped(table, QSqlDriver::TableName)) table = stripDelimiters(table, QSqlDriver::TableName); QSqlQuery q(createResult()); q.setForwardOnly(true); return qGetTableInfo(q, table, true); } QSqlRecord SQLiteDriver::record(const QString &tbl) const { if (!isOpen()) return QSqlRecord(); QString table = tbl; if (isIdentifierEscaped(table, QSqlDriver::TableName)) table = stripDelimiters(table, QSqlDriver::TableName); QSqlQuery q(createResult()); q.setForwardOnly(true); return qGetTableInfo(q, table); } QVariant SQLiteDriver::handle() const { return QVariant::fromValue(d->access); } QString SQLiteDriver::escapeIdentifier(const QString &identifier, IdentifierType type) const { Q_UNUSED(type); return _q_escapeIdentifier(identifier); } void SQLiteDriver::setLastError(const QSqlError& e) { #if defined(SQLITEDRIVER_DEBUG) if (e.isValid()) qDebug() << "SQLite error:" << e.driverText() << e.databaseText(); #endif QSqlDriver::setLastError(e); } quiterss-0.18.3/3rdparty/sqlitex/sqlitedriver.h000066400000000000000000000054631265173051100216220ustar00rootroot00000000000000/************************************************************************** * Extensible SQLite driver for Qt4/Qt5 * Copyright (C) 2011-2012 MichaÅ‚ MÄ™ciÅ„ski * Copyright (C) 2011-2016 QuiteRSS Team * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. * * 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, see . * * This library is based on the QtSql module of the Qt Toolkit * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). **************************************************************************/ #ifndef SQLITEDRIVER_H #define SQLITEDRIVER_H #include #include #include "sqlcachedresult.h" struct sqlite3; class SQLiteDriverPrivate; class SQLiteResultPrivate; class SQLiteDriver; class SQLiteResult : public SqlCachedResult { friend class SQLiteDriver; friend class SQLiteResultPrivate; public: explicit SQLiteResult(const SQLiteDriver* db); ~SQLiteResult(); QVariant handle() const; protected: bool gotoNext(SqlCachedResult::ValueCache& row, int idx); bool reset(const QString &query); bool prepare(const QString &query); bool exec(); int size(); int numRowsAffected(); QVariant lastInsertId() const; QSqlRecord record() const; #ifdef HAVE_QT5 void detachFromResultSet(); #endif void virtual_hook(int id, void *data); void setLastError(const QSqlError& e); private: SQLiteResultPrivate* d; }; class SQLiteDriver : public QSqlDriver { Q_OBJECT friend class SQLiteResult; public: explicit SQLiteDriver(QObject *parent = 0); explicit SQLiteDriver(sqlite3 *connection, QObject *parent = 0); ~SQLiteDriver(); bool hasFeature(DriverFeature f) const; bool open(const QString & db, const QString & user, const QString & password, const QString & host, int port, const QString & conOpts); void close(); QSqlResult *createResult() const; bool beginTransaction(); bool commitTransaction(); bool rollbackTransaction(); QStringList tables(QSql::TableType) const; QSqlRecord record(const QString& tablename) const; QSqlIndex primaryIndex(const QString &table) const; QVariant handle() const; QString escapeIdentifier(const QString &identifier, IdentifierType) const; protected: void setLastError(const QSqlError& e); private: SQLiteDriverPrivate* d; }; #endif quiterss-0.18.3/3rdparty/sqlitex/sqliteextension.cpp000066400000000000000000000067471265173051100227040ustar00rootroot00000000000000/************************************************************************** * Extensible SQLite driver for Qt4/Qt5 * Copyright (C) 2011-2012 MichaÅ‚ MÄ™ciÅ„ski * Copyright (C) 2011-2016 QuiteRSS Team * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. * * 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, see . * * This library is based on the QtSql module of the Qt Toolkit * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). **************************************************************************/ #include "sqliteextension.h" #include #include #include #include static int localeCompare( void* /*arg*/, int len1, const void* data1, int len2, const void* data2 ) { QString string1 = QString::fromRawData( reinterpret_cast( data1 ), len1 / sizeof( QChar ) ); QString string2 = QString::fromRawData( reinterpret_cast( data2 ), len2 / sizeof( QChar ) ); return QString::localeAwareCompare( string1, string2 ); } static int nocaseCompare( void* /*arg*/, int len1, const void* data1, int len2, const void* data2 ) { QString string1 = QString::fromRawData( reinterpret_cast( data1 ), len1 / sizeof( QChar ) ); QString string2 = QString::fromRawData( reinterpret_cast( data2 ), len2 / sizeof( QChar ) ); return QString::compare( string1, string2, Qt::CaseInsensitive ); } static void regexpFunction( sqlite3_context* context, int /*argc*/, sqlite3_value** argv ) { int len1 = sqlite3_value_bytes16( argv[ 0 ] ); const void* data1 = sqlite3_value_text16( argv[ 0 ] ); int len2 = sqlite3_value_bytes16( argv[ 1 ] ); const void* data2 = sqlite3_value_text16( argv[ 1 ] ); if ( !data1 || !data2 ) return; // do not use fromRawData for pattern string because it may be cached internally by the regexp engine QString string1 = QString::fromRawData( reinterpret_cast( data1 ), len1 / sizeof( QChar ) ); QString string2 = QString::fromRawData( reinterpret_cast( data2 ), len2 / sizeof( QChar ) ); QzRegExp pattern( string1.toUpper(), Qt::CaseInsensitive); int pos = pattern.indexIn( string2.toUpper() ); sqlite3_result_int( context, (pos > -1) ? 1 : 0 ); } static void upperFunction(sqlite3_context* context, int /*argc*/, sqlite3_value** argv) { int len = sqlite3_value_bytes16(argv[0]); const void* data = sqlite3_value_text16(argv[0]); if (!data) return; QString string = QString::fromRawData(reinterpret_cast(data), len/sizeof(QChar)); string = string.toUpper(); sqlite3_result_text16(context, string.data(), -1, SQLITE_TRANSIENT); } void installSQLiteExtension( sqlite3* db ) { sqlite3_create_collation( db, "LOCALE", SQLITE_UTF16, NULL, &localeCompare ); sqlite3_create_collation( db, "NOCASE", SQLITE_UTF16, NULL, &nocaseCompare ); sqlite3_create_function( db, "UPPER", 1, SQLITE_UTF16, NULL, &upperFunction, NULL, NULL ); sqlite3_create_function( db, "regexp", 2, SQLITE_UTF16, NULL, ®expFunction, NULL, NULL ); } quiterss-0.18.3/3rdparty/sqlitex/sqliteextension.h000066400000000000000000000023551265173051100223400ustar00rootroot00000000000000/************************************************************************** * Extensible SQLite driver for Qt4/Qt5 * Copyright (C) 2011-2012 MichaÅ‚ MÄ™ciÅ„ski * Copyright (C) 2011-2016 QuiteRSS Team * * This library is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation. * * 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, see . * * This library is based on the QtSql module of the Qt Toolkit * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). **************************************************************************/ #ifndef SQLITEEXTENSION_H #define SQLITEEXTENSION_H struct sqlite3; /** * Install UNICODE support collation and functions for SQLite. * @param db The SQLite database handle. */ void installSQLiteExtension( sqlite3* db ); #endif quiterss-0.18.3/AUTHORS000066400000000000000000000056071265173051100145430ustar00rootroot00000000000000QuiteRSS Team: ========= Authors ========= Aleksey Khokhryakov * Leading developer and creator of project Shilyaev Egor * Leading developer and project manager ======== Assistants ======== Nikoli * Different corrections and additions Kalinin Andrey * Different corrections and additions Elbert Pol * Testing * OS/2 package maintainer TI_Eugene * Testing * Creating RPM packages for Fedora, Mandriva and OpenSUSE Glad Deschrijver * Testing Korolev Andrey aka Zavulon * Testing Elohin Igor' * Testing Vascom * Fedora package maintainer Sergey Borisov aka NaturKeks * Testing Andrey Palkin * Ubuntu package maintainer AntumDeluge * FreeBSD package maintainer Ivan Prokudin * Tech support, hosting lbartoletti * FreeBSD package maintainer Sheldon * Site support ======== Translators ======== Dutch [NL] * TeLLie French [FR] * Glad Deschrijver * jc1 Hungarian [HU] * ZityiSoft Swedish [SV] * Ã…ke Engelbrektson Serbian [SR] * Ozzii Farsi [FA] * H.Mohamadi Italian [IT] * ZeroWis Spanish [ES] * Cesar Muñoz German [DE] * Lyudmila Kremova * oxyd24 * Wasilis Mandratzis Czech [CS] * Matej Szendi Ukrainian [UK] * Сергій Левицький Polish [PL] * Piotr Pecka * Marcin PÅ‚onek Japanese [JA] * Masato Hashimoto Korean [KO] * Yonghee Lee Chinese (China) [zh_CN] * wwj402 Chinese (Taiwan) [zh_TW] * Hulen (破滅刃) Greek (Greece) [el_GR] * Dimitris Siakavelis * Wasilis Mandratzis Lithuanian [LT] * keturidu Portuguese (Brazil) [pt_BR] * Marcos M. Ribeiro Arabic [AR] * ahmadzxc Tajik (Tajikistan) [tg_TJ] * Kobilov Iskandar Portuguese (Portugal) [pt_PT] * Sérgio Marques Vietnamese [VI] * Phan Anh Romanian (Romania) [ro_RO] * Jaff (Oprea Nicolae) Turkish [TR] * Mert BaÅŸaranoÄŸlu Slovak [SK] * DAG Software (ÄŽanovský Ján) Finnish [FI] * J. S. Tuomisto Galician [GL] * Xesús M. Mosquera Carregal Bulgarian [BG] * Nikolai Tsvetkov Russian [RU] * birkoff quiterss-0.18.3/CHANGELOG000066400000000000000000001026021265173051100146760ustar00rootroot00000000000000Version 0.18.3 (26 Jan 2015) * Added: Setting to set mouse buttons to open news * Changed: Update SQLite library to 3.9.2 version * Changed: Updating news in newspaper view using descending sort * Fixed: Duplicate notification sound playback (Ubuntu) * Fixed: Application crash if quit while settins dialog is open * Fixed: Application crash while using search and filters * Fixed: Application crash while adding local feed * Fixed: News publish time of some feeds Version 0.18.2 (14 Jul 2015) * Fixed: Application crash * Fixed: Catefories. Popup menu item "Mark as Read" Version 0.18.1 (12 Jul 2015) * Fixed: Application crash Version 0.18.0 (12 Jul 2015) * Main: Switch to Qt5 * Main: Embedded browser - WebKit 538.1 * Main: SQLite Library 3.8.10 * Added: Applying folder properties to feed being added * Added: Folder property - feeds quantity * Changed: Update feed performance is increased * Changed: Feeds tree performance is increased * Changed: CPU load is reduced * Changed: Memory consumption of Webkit is reduced * Changed: AdBlock is updated * Changed: Maximum size of disk cache is increased to 300 MB * Changed: Image scale saving (news.css) * Changed: DB saving while minimizing to system tray * Fixed: Bigger font in notification * Fixed: Filter operating with Description condition of some Atom-feeds * Fixed: Action of news multiple selection * Fixed: Restoring column size in news list * Fixed: Description of some Atom-feeds * Fixed: Connect to DB using new connection name * Fixed: Setting browser scale when opening several tabs * Fixed: Shortcut "Ctrl-Shift-Backtab" * Fixed: Mark Read news when switching feed/folder/tab * Fixed: Click2Flash. Play video at YouTube Version 0.17.7 (19 Apr 2015) * Added: Tray menu item "Add feed..." * Added: News filter. Condition "News" (title + description) * Added: Displaying feed icon beside feed title when using newspaper mode * Added: Catefories. Popup menu item "Mark as Read" * Changed: CA sertificate loading * Changed: Icons correction * Changed: Displaying the wizard only if feed is added from Firefox * Fixed: Occasional capturing of links while scrolling * Fixed: Restoring application from system tray by WIN+B (Windows) * Fixed: Some content links of the news description has no "http" schema Version 0.17.6 (10 Feb 015) * Added: Progress bar button and shortcut for "Stop feeds updating" * Changed: Storing the path of files being loaded * Changed: Unique filename for files being loaded * Changed: Ability to update disabled feed manually * Fixed: SSL certificates checking at startup * Fixed: News filter. Labels assignment * Fixed: Unread category counter displaying Version 0.17.5 (18 Jan 2015) * Added: Button "Clean Up" * Fixed: Application crash Version 0.17.4 (09 Jan 2015) * Added: Saving SSL Certificates * Fixed: Application crash Version 0.17.3 (02 Jan 2015) * Fixed: Application crash * Fixed: Enable option "Stay on top" * Fixed: Operating with Cookies Version 0.17.2 (28 Dec 2014) * Added: Save page as HTML in "newspaper" mode * Added: Option to display notification on same as QuiteRSS display (option value: -1) * Added: SSL-certificate check * Added: Language: Bulgarian * Changed: Drag links from embedded browser to Firefox * Fixed: Displaying main menu when using several monitors * Fixed: Value inversion of the transparent option of notifications * Fixed: Updating some feeds (server returns 302) * Fixed: Displaying control buttons in newspaper view when images are disabled * Fixed: Dragging several feeds at once * Fixed: Determine home page of some feeds * Fixed: Displaying notifications (Mac OS) * Fixed: Opening links in external browser (Mac OS) * Fixed: Feed list navigation (Mac OS) Version 0.17.1 (15 Nov 2014) * Added: Button and shortcut to switch layout * Added: Ability to delete news in newspaper layout * Added: News list search: "Find in links" * Added: Ability to choose monitor to display notifications * Added: Notification transparency option * Added: Notification text and background colors options * Added: Notification option "Show when main window is inactive" * Added: Additional options for notification layout * Added: Scroll by page shortcuts in embedded browser * Changed: Retain search text while switching feed * Changed: Show deleted news number after clean up wizard * Changed: Multi-select behavior in news list * Fixed: Host-name absence in some feed links * Fixed: Inactive filters with "Link" field and "is" condition * Fixed: Update of the feeds which last update date is 1970 * Fixed: Occasional error of restoring feed list columns length Version 0.17.0 (03 Sep 2014) * Added: The Newspaper view (View->Layout->Newspaper) * Added: Socks5 proxy support * Changed: News opening in external browser * Fixed: Sorting by feed title in news list Version 0.16.2 (18 Aug 2014) * Added: Displaying of label markers in news description * Changed: GUI. Some visual tweaks * Changed: Printing web-page frame * Fixed: Creation of the filter with condition "State" * Fixed: Filter operation for some atom-feeds * Fixed: RTL support for new description * Fixed: Application shutdown * Fixed: Javascript operation in categories * Fixed: Application crashes while using RegExp in filter condition Version 0.16.1 (10 Jul 2014) * Added: Ability to filter news by link * Added: Share news - LinkedIn, Blogger, Printer Friendly * Added: Color adjustment of the feeds with disabled update * Added: Color adjustment of the alternating rows background of the news list * Fixed: Operating in some unix OS * Fixed: Display all columns if the new list despite of settings * Fixed: Parsing some feeds * Fixed: Application crash while shutdown Version 0.16.0 (24 May 2014) * Added: Case-insensitive filters, news searching and feed sorting * Added: Regular expressions support in user's filters * Added: Multiselect feeds * Added: Ability to set style table for news (Options->Feeds) * Added: News style "Rstyle_v1.2.css" * Added: Button "Share" in browser toolbar * Added: Option "View->Show/Hide->Status panel" * Added: Feed option "RTL" ("Display" tab) * Added: Feed option "Enable JavaScript" ("Display" tab) * Added: Ability to add action "Create backup" to toolbar * Added: Shortcut and button "Save page to DB instead of news description" * Changed: GUI. Some visual tweaks * Changed: Save path to folder of the last backup * Fixed: Data loss * Fixed: Opening links in external browser (Unix) * Fixed: Displaying incorrect time with consideration of local time * Fixed: Application autostart (PortableApps) * Fixed: Processing some feeds when authorizing using cookie Version 0.15.4 (18 Apr 2014) * Added: Ability to create backup manually (Menu->Create backup) * Changed: More robust operations on DB * Changed: More robust application shutdown * Changed: Backup operation during application update * Changed: Dialog "About". Added path to backup folder * Changed: Updating PortableApps-build is forbidden * Fixed: Feed counters in feed tree * Fixed: Default font size * Fixed: Memory-placed DB optimization Version 0.15.3 (06 Apr 2014) * Main: Support for Mac OS X platform * Changed: GUI. Some visual tweaks * Changed: Adblock. Subscribe added * Changed: Empty news title is substituted by part of the news description * Fixed: Saving DB from memory to file * Fixed: Update application (Windows) * Fixed: Generation of the news URL * Fixed: Opening news URL without host with external browser * Fixed: Some feeds have no news URL * Fixed: Notification is displayed on primary monitor * Fixed: The path of the user style table for embedded browser doesn't save * Fixed: Moving feed to itself Version 0.15.2 (13 Mar 2014) * Changed: Main toolbar (View->Show/hide->Main toolbar) * Changed: Relative path to cache (portable version) * Changed: Relative path to notification sound (portable version) * Fixed: Some links contains "amp;" instead of "&" * Fixed: Options dialog haven't fit monitors with low resolutions * Fixed: Application shutdown while OS shutdowns * Fixed: Application autostart (Windows) * Fixed: Default labels are created on every application startup * Fixed: Download manager. Incorrect size of downloaded file * Fixed: Removing symbolic link to file feeds.db Version 0.15.1 (07 Mar 2014) * Changed: Download manager. Displays size and time after downloading file * Fixed: Incorrect application startup if path to database contains a "'" * Fixed: Displays a menu bar after exit from full screen mode * Fixed: Saving toolbar feeds Version 0.15.0 (06 Mar 2014) * Main: Adblock integrated * Added: Support for feeds with local path (file://) * Added: Embedded browser. Determining and adding feeds from web sites * Added: Notifications. News grouping - display feeds title * Added: Notifications. Button to delete news * Added: Notifications. Button to mark read every news * Added: System tray. Mane item "Mark All Feeds Read" * Added: Option "Show close button on tab" * Added: Tab "Information" to "About" dialog * Added: Language: Galician * Changed: GUI. Visual tweaks * Changed: The process of news deletion is sorted by date of publication * Changed: RTL-model of news for Arabic and Persian languages * Changed: Process of displaying of the splash screen * Fixed: Wrong codepage while importing feeds * Fixed: Processing feeds that contains '&' symbol * Fixed: Processing some feeds that contains 'br' tag within the news * Fixed: Application activation after opening of the link in external browser and minimizing to tray * Fixed: Options dialog didn't fit monitors with low resolution * Fixed: Reset options while switching on tab that contains category * Fixed: Application crash when open "Options" dialog if "Downloads" tab is active * Fixed: Feed option "Disable update" Version 0.14.3 (14 Jan 2014) * Fixed: Application crash while exporting feeds * Fixed: Importing feeds from opml-file failure in some cases * Fixed: Reset zoom on switching tabs * Fixed: Processing authorization request from proxy * Fixed: RTL for arabic and persian * Fixed: Creating links in news Version 0.14.2 (30 Dec 2013) * Added: Option "Options->Browser->Load images" * Added: Feed option "Disable update" * Added: Shortcuts for main browser actions * Added: Setting for text and background colors of focused feed * Added: Language: Finnish * Changed: Load feed's favicon from main webpage * Changed: Process "dc:date" while parsing feed * Changed: Mouse gestures. Jump to news description if there is no previous page on back-action * Changed: Address bar appearance * Changed: Send whole new's text when share news by e-mail * Fixed: Adding feeds that contains "amp;" * Fixed: Parsing of some feeds * Fixed: Action "Next unread news" * Fixed: Recounting and displaying counters in categories tree * Fixed: Manual run of filter when option "Store DB in memory" is disabled * Fixed: Displaying focused feed, while switching tabs with enabled filter * Fixed: Taking account of filter text when switching news filter Version 0.14.1 (30 Nov 2013) * Main: Increase application performance * Added: Audio/video player for podcasts * Added: User filters. Sound playing (phonon) * Added: User filters. Highlight news in notification * Added: Option "Hide tab panel if only one tab is opened" * Added: Address field in browser toolbar * Added: Display news link in status bar for 3 second while switching news * Added: More color settings * Changed: Close notification if all news have been read * Changed: Store cleanup wizard settings * Changed: If images are switched off no images are displayed in news description * Fixed: Application crash while clicking "Customize news toolbar" * Fixed: Application crash while using "Next unread news" * Fixed: Can't to open feed homepage * Fixed: Switch on next unread news even if no feed is selected * Fixed: Mark feed read (while filter is enabled) Vervion 0.14.0 (15 Nov 2013) * Main: Increase application performance * Main: Feed filter is case-insensitive now * Added: Support for feeds with uTorrent-authorization * Added: Feed filter "Show broken feeds" * Added: Application option "Default page zoom" * Added: User filters. Conditions for categories has been added * Added: More shortcuts * Added: More color settings * Changed: GUI. Some visual tweaks * Fixed: Application crash * Fixed: Application crash while using JavaScript (Windows) * Fixed: Application crash while using "Next unread news" * Fixed: Application crash while starting by desktop shortcut * Fixed: Tip "All feeds" while creating new filter * Fixed: Clearing news filter on switching between feeds * Fixed: Autoreplacement "http://" on adding feed * Fixed: Confuse options names "Don't delete starred news", "Don't delete labeled news" * Fixed: User filters with apostrophe didn't work * Fixed: Files extension in save/open dialogs * Fixed: Startup. Request file storing path, if specified path isn't found Version 0.13.3 (30 Aug 2013) * Added: Option "Save DB stored in memory to file every XX minutes" * Added: Language: Turkish * Changed: Parsing categories (Atom) * Changed: Focus on news after application starts * Changed: Disabling notification disappearing by set notification delay to 0 seconds * Fixed: Codepage while parsing feeds * Fixed: Wrong news publish date (Atom) * Fixed: Importing feeds containing character '&' * Fixed: Memory leak. CPU loading is reduced * Fixed: Import feeds into present folders * Fixed: Creating links to attachments (Link to audio) Version 0.13.2 (30 Jul 2013) * Added: Options network requests when updating feeds * Added: Displaying status of an icon feed and in properties * Added: Setting font Browser * Added: Shortcuts to move page by page in the list of news * Added: Displaying links to the comment in line with author name * Added: Displaying categories (labels) in line with author name * Added: Notification window: Button to mark news as read * Added: Association QuiteRSS in unix * Added: Language: Vietnamese * Added: Language: Romanian * Changed: Labels "Default" after changing the language translated (will only work for a new DB) * Changed: Displays an error message if not found SQLite driver * Changed: Receipt icons for feed * Changed: Popup windows in a new tab * Fixed: Application crash while updating feeds! * Fixed: Application crash while context menu scrollbar in browser * Fixed: Application crash while context menu is category tree * Fixed: Updating some kind of feeds * Fixed: Browser position of could change after applying settings * Fixed: In list news would disappear pointer * Fixed: Feeds exported file is not imported into Feedly * Fixed: Reopening settings window from tray * Fixed: Notification window: When open the news in an external browser, the news is not marked as read * Fixed: Notification window: Opening news * Fixed: In status bar is not recalculated counters * Fixed: When switching to category of "unread" can be displayed read news * Fixed: Wrong codepage while parsing feed * Fixed: In some feeds was not description on feed * Fixed: When minimizing program to the system tray, news list in categories cleared * Fixed: When upgrading tapes in the category has not been updated news list * Fixed: Minimize to tray by Win+M/Win+D Version 0.13.1 (30 Jun 2013) * Added: Cleanup wizard * Added: Ability to specify feed's icon * Added: Option "Automatically mark identical news as read" * Added: Option "Open new tab next to active" * Added: Options "Enable cleanup on shutdown", "Enable DB optimization" * Added: Option "Show feeds toggle at edge of the window" * Added: Option "Main news filter" * Added: Option "Do not show notifications in fullscreen mode" (Windows) * Added: Cookies managing options * Added: Removing news from "Deleted" with categories pop up menu * Added: Share news with Google+ * Added: Backup DB-file and setting-file before application upgrade * Added: Language: Arabic * Added: Language: Tajik * Added: Language: Portuguese (Portugal) * Changed: GUI. Visual tweaks * Changed: Feed loading: CPU load is reduced * Changed: Categories could be opened in tabs as feeds * Changed: Additional colors options * Changed: Restore categories tree collapse/expand state * Changed: Support links prefix "feed://" * Changed: Feed parsing is reworked * Fixed: Release news selection after mark them Read/Unread * Fixed: Restoring columns' widths * Fixed: Updating some kind of feeds * Fixed: Support RTL in news description * Fixed: Recounting feeds counters when news * Fixed: OPML-file while exporting feeds with large nesting structure * Fixed: Displaying news list while clicking on some categories * Fixed: Restore splitter position between news list and browser * Fixed: Loading 512 news after news list sort mode is changed * Fixed: After feed has added its news is displayed as not new * Fixed: Incorrect behavior some of shortcuts * Fixed: Restore cache's default path if it is not specified * Fixed: Notification window coordinates were miscalculated Version 0.13.0 (30 May 2013) * Main: Increase application performance * Added: Individual feed update interval (feed properties) * Added: Individual columns in news list for feed (feed properties) * Added: Download manager (Program options/Browser/Downloads) * Added: "Undo"/"Redo" in browser text input field context menu * Added: Notification window preview * Added: Sort news list form main menu * Added: Tooltip appears for feed long title * Added: Settings for font and background colors * Added: Display news counters in Categories * Added: More keyboard shortcuts * Changed: GUI. Visual tweaks * Changed: Update feed three times on error * Changed: Save browser page * Changed: Search next unread news has became cyclic * Changed: Remove "http://" prefix from column "Link" * Changed: Mark news Read while switching between tabs * Changed: Opening news in new/background tab * Changed: Support RTL in news description * Changed: Comments in sources are translated to English * Fixed: Options "Don't delete starred news", "Don't delete labeled news" didn't store * Fixed: News title and description displays twice * Fixed: Some feeds didn't parse * Fixed: Wrong codepage while parsing feed * Fixed: Alternating row setting in news list * Fixed: CPU high load while application shutdown * Fixed: Application crashes while switching to next unread news in categories, where are no more unread news Version 0.12.5 (22 Apr 2013) * Added: Disk cache and pages cache for embedded browser * Added: Ability sorted feeds by name ("Feeds->Sort by Name") * Added: Option: "Simplified representation of date and time" * Added: Options: "Don't delete starred news", "Don't delete labeled news" * Added: Option: "Automatically collapse folders" * Added: Option: "Run QuiteRSS at Windows startup" (Windows) * Added: Tab context menu items: "Close tab" and "Close Other tabs" * Added: Ability to move main toolbar (toolbar context menu->Lock toolbar) * Added: "Link" and "Title Feed" columns in news list * Added: Click to Flash * Added: CSS for news (folder "style") * Added: User style for browser * Added: Alt+left click - opens news/link in external browser (Windows) * Added: Simplified news find field * Added: More buttons available for toolbar * Added: More shortcuts * Added: Language: Greek * Added: Language: Chinese (Taiwan) * Added: Language: Portuguese (Brazil) * Changed: GUI. Visual tweaks * Changed: Increase performance updating feeds * Changed: Ability assign shortcuts for "Share" * Changed: Delete folders containing feeds * Changed: Ability to edit application styles(folder "style") * Fixed: Mark all news read in categories * Fixed: Focus while opening link in external browser * Fixed: Minimize to tray on tray-click (Linux) * Fixed: Recounting feeds count after group operations * Fixed: Moving tab content while moving tabs * Fixed: Deleting default buttons from toolbar * Fixed: Application startup in Archlinux (KDE) * Fixed: Show on top in full screen mode * Fixed: Loop while adding/updating feed * Fixed: Updating some feeds * Fixed: News duplicates * Fixed: Find next/previous feed Version 0.12.4 (26 Mar 2013) * Added: Feed option "Authorization" * Added: Program option "Minimal font size in browser" * Added: Category "Unread" * Added: Share news: LiveJournal, Pocket, Twitter * Added: Language: Korean * Added: Language: Lithuanian * Changed: GUI. Visual tweaks * Changed: Increase performance of updating news * Changed: Display feed's title in "Feed" column in news list * Fixed: Application crash while dragging feeds/folders * Fixed: Application crash while pressing SPACE in tab which contains news * Fixed: Moving focus to tab just has been opened * Fixed: Import feeds with deep folder's structure * Fixed: Export feeds * Fixed: Application crash while loading flash in embedded browser * Fixed: Authorization * Fixed: Show images with relative path * Fixed: Open news with spacial chars in URL * Fixed: Restore column's width of news list when use vertical layout * Fixed: Using shortcuts for labels * Fixed: Stop automatic read timer after news has marked read * Fixed: Viewing image while flash playing (Windows) Version 0.12.3 (16 Mar 2013) * Main: Increase productivity * Main: Manual sort in feed's tree * Added: Option "Hide feed's tree when opening tabs" * Added: Option for news' list "Alternate row's background color" (Options->Feeds->General->...) * Added: Ability to open several news in external browser * Added: Ability to open several news in tabs * Added: News filters: "Show for Last Day" and "Show for Last 7 Days" * Added: Notification window: Button to open news in external browser * Added: Ability to hide feed's indentation in tree ("Feeds->Show Indentation") * Added: Ability to customize toolbar ("View->Customize toolbar->...") * Added: Option "Show default rss-icon instead of favourite one" * Added: Share news: Email, Evernote, Facebook, VK * Added: Language: Ukrainian * Added: Language: Chinese * Added: Language: Czech * Added: Language: Polish * Added: Language: Japanese * Changed: GUI. Visual tweaks * Changed: Ability to change shortcuts: "CTRL+P" and "Enter" * Changed: Dialog "Create filter": sort conditions by name * Changed: Separate options "Use embedded or external browser" and "External browser selection" * Changed: Focus unfocused window while clicking tray icon * Changed: Adjust image width from media-content to browser width * Changed: Folder properties. Added options similar to feed options * Fixed: Some feeds displays short description instead of full * Fixed: Recounting folder's counters * Fixed: Shutdown of application while PC shutdown * Fixed: Feed's tree when it contains more than 256 items * Fixed: Cursor disappear in news list when sort changing * Fixed: Import OPML-files * Fixed: Notification window displays old news * Fixed: Text encoding while parsing feed Version 0.12.2 (20 Feb 2013) * Added: Displaying news of selected folder * Added: Displaying URL of media-content * Added: Ability to save browser page as plain text * Added: Feed's option "Automatically delete news' duplicates" * Added: Ability to hide Categories ("View->Show/Hide->Panel Categories") * Changed: GUI. Visual tweaks * Changed: News list/browser size's change step set to 25 pixels instead of 5 * Changed: Password for proxy-server displays with asterisks * Changed: Date and time format are separated * Changed: Switch to next unread news * Fixed: Application crash while updating feeds! * Fixed: Some feeds aren't processed * Fixed: Application crash while using shortcuts * Fixed: Application crash while deleting passwords from empty list * Fixed: Recounting folders' counters while adding new feed * Fixed: Downloading feeds' icons for some feeds Version 0.12.1 (5 Feb 2013) * Added: Authorization support * Added: Cookies support * Added: Minimum limit of automatic update period set to 1 second * Added: Ability to save browser page ("Browser"->"Save as...") * Added: Shortcut to undelete news: "CTRL+Z" (Undo delete) * Added: More shortcuts * Added: Ability to switch on next/previous unread news * Changed: GUI. Visual tweaks * Changed: Finding unread news depends on sort * Changed: In "Deleted" category news is sorted by delete time stamp * Fixed: Error updating feeds (lasts from 0.10.3+) * Fixed: Automatic cleanup on shutdown * Fixed: Saving cursor position in news list * Fixed: Reset new news counter of feed while selecting one and choose another Version 0.12.0 (14 Jan 2013) * Main: Increased productivity of program * Added: News Categories * Added: Labels * Added: Option "Open links in embedded browser in background" * Added: Shortcuts for closing tabs and switch between tabs * Changed: GUI. Redesigned interface * Fixed: Application crash when working with tabs * Fixed: Window size is not restored when opening program from system tray * Fixed: Some feeds are not added * Fixed: Some feeds did not work Version 0.11.0 (10 Dec 2012) * Main: Feed categories (folders) * Added: View mode "Stay On Top" * Added: Feed property "Show news' description instead of loading web page" * Added: News filter "Show Not Starred" * Added: Option "Mark news as read: after switching to another news" * Added: Language: Spanish * Changed: GUI. Some Visual tweaks * Fixed: Feed opened in own tab duplicates in default tab * Fixed: Updating link containing special chars * Fixed: Shortcuts in full screen mode * Fixed: Disabling experimental option "Open link in external browser in background" Version 0.10.3 (17 Oct 2012) * Added: Full screen mode * Added: Page Up/Page Down processing in news list * Added: Zooming in browser * Added: Print browser page * Added: Ability to hide embedded browser panels * Added: Ability to report a problem (menu "Help->Report a Problem...") * Added: Automatic update application (Windows) * Added: Language: Italian * Added: Experimental option "Open link in external browser in background" * Changed: News list is scrolled when active item is in the middle * Changed: GUI. Some Visual tweaks * Fixed: CTRL+Enter available for shortcuts * Fixed: Using sqlite3 library Version 0.10.2 (18 Sep 2012) * Added: Embedded browser context menu item "Load Images" * Added: Embedded browser context menu item "Open in External Browser" * Added: News filter "Show Deleted" * Added: Option "Store database in memory" (On by default) * Added: Sorting feeds by title ("Feeds->Sort by Title") * Added: Language: Dutch * Added: Language: Farsi * Changed: GUI. Some visual tweaks * Fixed: Invisible text on OS with dark theme * Fixed: Open links from embedded browser in new tab: wrong links * Fixed: Assigning default shortcuts * Fixed: Cut link in some feeds * Fixed: News list sorting by "Star" or "Read" * Fixed: Column chooser in news list Version 0.10.1 (17 Aug 2012) * Added: Feeds filters. Show starred feeds (Feed option. Starred) * Added: Feed option. Tab "Status" * Added: Search in the tree feeds by name or link * Added: Option: "Display format for date and time"("Options->Feeds->General") * Added: Option: "Opening feed: position on unread news" * Added: Option: "Mark displayed news as read when switching feeds", "Mark displayed news as read when closing tab", "Mark displayed news as read on minimize" * Added: Options. Selecting notification sound * Added: Options. Show in the notification only selected feeds * Added: Filter news: "Show Unread or Star" * Added: Sorting user filters * Changed: GUI. Some visual tweaks * Fixed: Some news were not displayed (All news will be re-uploaded!) * Fixed: Do not work feeds that use SSL * Fixed: Opening of the news from the notification window * Fixed: Remapping shortcuts Version 0.10.0 (18 Jul 2012) * Note: Reappear news, which already have been marked read (0.8.x, 0.9.x -> 0.10.x) * Added: Tabs. Open news in new tab * Added: Tabs. Open link from news in new tab * Added: User filters (case sensitive) * Added: Feed option: "Display feed on startup". If enabled, show feed in new tab on startup * Added: Feed option: "Load images". Specific behavior for every feed * Added: Ability to subscribe to feed from Firefox * Added: Application option: External browser selection * Added: More shortcuts * Added: Quick news filter and find in browser * Added: Notification on new news * Added: Swedish translation * Added: Serbian translation * Changed: GUI. Some visual tweaks * Changed: Opening tabs in more smooth * Fixed: Some feeds did not work * Fixed: Can't detect date and time of some feeds * Fixed: Can't load icon of some feeds * Fixed: Deleting news (smaller size of database) * Fixed: Application crash in Windows, due to lack of QtSvg4.dll Version 0.9.1 (31 May 2012) * Note: Reappear news, which already have been marked read (0.8.x -> 0.9.x) * Added: Tabs. Ability to open feeds in new tab * Added: Ability to choose browser position ("View->Browser position") * Added: New columns in feeds list ("Feeds->Columns") * Added: Hotkey "Home", "End" in feeds list and news list * Changed: GUI. Some visual tweaks * Fixed: Keyboard layout in unix systems * Fixed: Default application icon instead on QuiteRSS icon in unix systems * Fixed: Hang while updating some feeds * Fixed: Duplicate news in RSS-feeds Version 0.9.0 (22 May 2012) * Main: Database reconstruction (More...) * Added: Option: action on opening feed * Added: More shortcuts * Added: Hungarian translations * Changed: GUI. Some visual tweaks * Fixed: Hang application on minimize to tray * Fixed: Duplicate news in RSS-feeds Version 0.8.7 (25 Apr 2012) * Added: Add feed wizard. Search feed URL if site URL was entered * Added: Embedded browser: control panel * Added: Mouse gestures: slide left, slide right * Added: Application style: system, system2, gray, orange, green, purple, pink (Menu "View") * Added: Clear button in LineEdits * Added: French language * Changed: Ability to choose xml-file on import feeds * Changed: GUI. Some visual tweaks * Fixed: Some kind of link in embedded browser * Fixed: Marks in column menu of news list Version 0.8.6 (02 Apr 2012) * Added: Automatic feeds clean up("Options->Feeds->Clean Up") * Added: Option "Show tray icon" * Added: Option "Reopen last opened feeds on startup" * Added: Option "Show splash screen" * Added: Option "Show news' description instead loading web page" * Added: German language * Changed: GUI. Some visual tweaks * Fixed: Improve startup time * Fixed: Load news on some resources * Fixed: After delete news, cursor jump to previous news * Fixed: Delete feed * Fixed: CTRL+A in news list * Fixed: Shortcut configuration * Fixed: Reopen news Version 0.8.5 (26 Mar 2012) * Added: Delete news with shortcut * Added: Open news on middle click * Added: Shortcut configuration * Changed: GUI. Some visual tweaks * Fixed: Improve program startup * Fixed: Resize splashscreen * Fixed: Open author-URI in embedded browser * Fixed: Parsing news-URL's and author-URI's * Fixed: Remove debug messages Version 0.8.4 (21 Mar 2012) * Added: Splash screen * Added: Check for updates at startup * Added: Ability to set update feeds interval in hours * Changed: GUI. Tune icons * Changed: GUI. Correct browser panel * Changed: Improve switch between feeds and news * Changed: Improve several news simultaneously * Fixed: On some Windows systems browser don't display images * Fixed: Improve cursor when select news, if news more than 256 * Fixed: Improve cursor, after several news make read * Fixed: News content reset after update or minimize in tray Version 0.8.3 (25 Feb 2012) * Added: Option to enable plugins and java-scripts in embedded browser * Added: Receive bytes in progress bar of embedded browser * Added: OnHover links are shown in status bar * Added: Option to play sound on news update * Changed: Copy database from memory to file and back moved to own thread * Fixed: Click on links when embedded browser enabled * Fixed: Absent create date of news replace by receive date * Fixed: Up/Down cursor keys in feeds list * Fixed: Save tuning and database while system logout/shutdown when options "minimize to system tray" checked * Fixed: Some GUI display issues * Fixed: Optimize database modifying when several news selected * Refactoring started... Version 0.8.2 (10 Feb 2012) * Added: Feed icon in feed list and tab * Added: Export feeds to OPML-file * Fixed: SQLite for Qt 4.8.0 and Qt 4.7.x * Fixed: Some feed parsing issues * Fixed: Some GUI display issues Version 0.8.1 (6 Feb 2012) * Added: Internal browser * Fixed: Cyrillic letters in application path * Fixed: SQLite for Qt 4.8.0 * Fixed: NetworkManager move to his own thread * Fixed: News list don't scroll while click on column "read/unread" if cursor is out of view * Fixed: Request url queues while update feeds * Fixed: Parsing "alternate" url of the news of Atom-feeds * Fixed: TrayMenu is not appear sometimes Version 0.8.0 (31 Jan 2012) * Added: Simultaneous update up to 8 feeds Version 0.7.6 (28 Jan 2012) * ...Old release. No need to document it ;) quiterss-0.18.3/COPYING000066400000000000000000001046371265173051100145310ustar00rootroot00000000000000QuiteRSS Copyright (C) 2011-2016 QuiteRSS Team ----- GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . quiterss-0.18.3/HISTORY_EN000066400000000000000000001232211265173051100151320ustar00rootroot00000000000000

Version 0.18.3 (26 Jan 2016)

  • Added: Setting to set mouse buttons to open news
  • Changed: Update SQLite library to 3.10.0 version
  • Changed: Updating news in newspaper view using descending sort
  • Fixed: Duplicate notification sound playback (Ubuntu)
  • Fixed: Application crash if quit while settins dialog is open
  • Fixed: Application crash while using search and filters
  • Fixed: Application crash while adding local feed
  • Fixed: News publish time of some feeds

Version 0.18.2 (14 Jul 2015)

  • Fixed: Application crash
  • Fixed: Catefories. Popup menu item "Mark as Read"

Version 0.18.1 (12 Jul 2015)

  • Fixed: Application crash

Version 0.18.0 (12 Jul 2015)

  • Main: Switch to Qt5
  • Main: Embedded browser - WebKit 538.1
  • Main: SQLite Library 3.8.10
  • Added: Applying folder properties to feed being added
  • Added: Folder property - feeds quantity
  • Changed: Update feed performance is increased
  • Changed: Feeds tree performance is increased
  • Changed: CPU load is reduced
  • Changed: Memory consumption of Webkit is reduced
  • Changed: AdBlock is updated
  • Changed: Maximum size of disk cache is increased to 300 MB
  • Changed: Image scale saving (news.css)
  • Changed: DB saving while minimizing to system tray
  • Fixed: Bigger font in notification
  • Fixed: Filter operating with Description condition of some Atom-feeds
  • Fixed: Action of news multiple selection
  • Fixed: Restoring column size in news list
  • Fixed: Description of some Atom-feeds
  • Fixed: Connect to DB using new connection name
  • Fixed: Setting browser scale when opening several tabs
  • Fixed: Shortcut "Ctrl-Shift-Backtab"
  • Fixed: Mark Read news when switching feed/folder/tab
  • Fixed: Click2Flash. Play video at YouTube

Version 0.17.7 (19 Apr 2015)

  • Added: Tray menu item "Add feed..."
  • Added: News filter. Condition "News" (title + description)
  • Added: Displaying feed icon beside feed title when using newspaper mode
  • Added: Catefories. Popup menu item "Mark as Read"
  • Changed: CA sertificate loading
  • Changed: Icons correction
  • Changed: Displaying the wizard only if feed is added from Firefox
  • Fixed: Occasional capturing of links while scrolling
  • Fixed: Restoring application from system tray by WIN+B (Windows)
  • Fixed: Some content links of the news description has no "http" schema

Version 0.17.6 (10 Feb 015)

  • Added: Progress bar button and shortcut for "Stop feeds updating"
  • Changed: Storing the path of files being loaded
  • Changed: Unique filename for files being loaded
  • Changed: Ability to update disabled feed manually
  • Fixed: SSL certificates checking at startup
  • Fixed: News filter. Labels assignment
  • Fixed: Unread category counter displaying

Version 0.17.5 (18 Jan 2015)

  • Added: Button "Clean Up"
  • Fixed: Application crash

Version 0.17.4 (09 Jan 2015)

  • Added: Saving SSL Certificates
  • Fixed: Application crash

Version 0.17.3 (02 Jan 2015)

  • Fixed: Application crash
  • Fixed: Enable option "Stay on top"
  • Fixed: Operating with Cookies

Version 0.17.2 (28 Dec 2014)

  • Added: Save page as HTML in "newspaper" mode
  • Added: Option to display notification on same as QuiteRSS display (option value: -1)
  • Added: SSL-certificate check
  • Added: Language: Bulgarian
  • Changed: Drag links from embedded browser to Firefox
  • Fixed: Displaying main menu when using several monitors
  • Fixed: Value inversion of the transparent option of notifications
  • Fixed: Updating some feeds (server returns 302)
  • Fixed: Displaying control buttons in newspaper view when images are disabled
  • Fixed: Dragging several feeds at once
  • Fixed: Determine home page of some feeds
  • Fixed: Displaying notifications (Mac OS)
  • Fixed: Opening links in external browser (Mac OS)
  • Fixed: Feed list navigation (Mac OS)

Version 0.17.1 (15 Nov 2014)

  • Added: Button and shortcut to switch layout
  • Added: Ability to delete news in newspaper layout
  • Added: News list search: "Find in links"
  • Added: Ability to choose monitor to display notifications
  • Added: Notification transparency option
  • Added: Notification text and background colors options
  • Added: Notification option "Show when main window is inactive"
  • Added: Additional options for notification layout
  • Added: Scroll by page shortcuts in embedded browser
  • Changed: Retain search text while switching feed
  • Changed: Show deleted news number after clean up wizard
  • Changed: Multi-select behavior in news list
  • Fixed: Host-name absence in some feed links
  • Fixed: Inactive filters with "Link" field and "is" condition
  • Fixed: Update of the feeds which last update date is 1970
  • Fixed: Occasional error of restoring feed list columns length

Version 0.17.0 (03 Sep 2014)

  • Added: The Newspaper view (View->Layout->Newspaper)
  • Added: Socks5 proxy support
  • Changed: News opening in external browser
  • Fixed: Sorting by feed title in news list

Version 0.16.2 (18 Aug 2014)

  • Added: Displaying of label markers in news description
  • Changed: GUI. Some visual tweaks
  • Changed: Printing web-page frame
  • Fixed: Creation of the filter with condition "State"
  • Fixed: Filter operation for some atom-feeds
  • Fixed: RTL support for new description
  • Fixed: Application shutdown
  • Fixed: Javascript operation in categories
  • Fixed: Application crashes while using RegExp in filter condition

Version 0.16.1 (10 Jul 2014)

  • Added: Ability to filter news by link
  • Added: Share news - LinkedIn, Blogger, Printer Friendly
  • Added: Color adjustment of the feeds with disabled update
  • Added: Color adjustment of the alternating rows background of the news list
  • Fixed: Operating in some unix OS
  • Fixed: Display all columns if the new list despite of settings
  • Fixed: Parsing some feeds
  • Fixed: Application crash while shutdown

Version 0.16.0 (24 May 2014)

  • Added: Case-insensitive filters, news searching and feed sorting
  • Added: Regular expressions support in user's filters
  • Added: Multi-select feeds
  • Added: Ability to set style table for news (Options->Feeds)
  • Added: News style "Rstyle_v1.2.css"
  • Added: Button "Share" in browser toolbar
  • Added: Option "View->Show/Hide->Status panel"
  • Added: Feed option "RTL" ("Display" tab)
  • Added: Feed option "Enable JavaScript" ("Display" tab)
  • Added: Ability to add action "Create backup" to toolbar
  • Added: Shortcut and button "Save page to DB instead of news description"
  • Changed: GUI. Some visual tweaks
  • Changed: Save path to folder of the last backup
  • Fixed: Data loss
  • Fixed: Opening links in external browser (Unix)
  • Fixed: Displaying incorrect time with consideration of local time
  • Fixed: Application autostart (PortableApps)
  • Fixed: Processing some feeds when authorizing using cookie

Version 0.15.4 (18 Apr 2014)

  • Added: Ability to create backup manually (Menu->Create backup)
  • Changed: More robust operations on DB
  • Changed: More robust application shutdown
  • Changed: Backup operation during application update
  • Changed: Dialog "About". Added path to backup folder
  • Changed: Updating PortableApps-build is forbidden
  • Fixed: Feed counters in feed tree
  • Fixed: Default font size
  • Fixed: Memory-placed DB optimization

Version 0.15.3 (06 Apr 2014)

  • Main: Support for Mac OS X platform
  • Changed: GUI. Some visual tweaks
  • Changed: Adblock. Subscribe added
  • Changed: Empty news title is substituted by part of the news description
  • Fixed: Saving DB from memory to file
  • Fixed: Update application (Windows)
  • Fixed: Generation of the news URL
  • Fixed: Opening news URL without host with external browser
  • Fixed: Some feeds have no news URL
  • Fixed: Notification is displayed on primary monitor
  • Fixed: The path of the user style table for embedded browser doesn't save
  • Fixed: Moving feed to itself

Version 0.15.2 (13 Mar 2014)

  • Changed: Main toolbar (View->Show/hide->Main toolbar)
  • Changed: Relative path to cache (portable version)
  • Changed: Relative path to notification sound (portable version)
  • Fixed: Some links contains "amp;" instead of "&"
  • Fixed: Options dialog haven't fit monitors with low resolutions
  • Fixed: Application shutdown while OS shutdowns
  • Fixed: Application autostart (Windows)
  • Fixed: Default labels are created on every application startup
  • Fixed: Download manager. Incorrect size of downloaded file
  • Fixed: Removing symbolic link to file feeds.db

Version 0.15.1 (07 Mar 2014)

  • Changed: Download manager. Displays size and time after downloading file
  • Fixed: Incorrect application startup if path to database contains a "'"
  • Fixed: Displays a menu bar after exit from full screen mode
  • Fixed: Saving toolbar feeds

Version 0.15.0 (06 Mar 2014)

  • Main: Adblock integrated
  • Added: Support for feeds with local path (file://)
  • Added: Embedded browser. Determining and adding feeds from web sites
  • Added: Notifications. News grouping - display feeds title
  • Added: Notifications. Button to delete news
  • Added: Notifications. Button to mark read every news
  • Added: System tray. Mane item "Mark All Feeds Read"
  • Added: Option "Show close button on tab"
  • Added: Tab "Information" to "About" dialog
  • Added: Language: Galician
  • Changed: GUI. Visual tweaks
  • Changed: The process of news deletion is sorted by date of publication
  • Changed: RTL-model of news for Arabic and Persian languages
  • Changed: Process of displaying of the splash screen
  • Fixed: Wrong codepage while importing feeds
  • Fixed: Processing feeds that contains '&' symbol
  • Fixed: Processing some feeds that contains 'br' tag within the news
  • Fixed: Application activation after opening of the link in external browser and minimizing to tray
  • Fixed: Options dialog didn't fit monitors with low resolution
  • Fixed: Reset options while switching on tab that contains category
  • Fixed: Application crash when open "Options" dialog if "Downloads" tab is active
  • Fixed: Feed option "Disable update"

Version 0.14.3 (14 Jan 2014)

  • Fixed: Application crash while exporting feeds
  • Fixed: Importing feeds from opml-file failure in some cases
  • Fixed: Reset zoom on switching tabs
  • Fixed: Processing authorization request from proxy
  • Fixed: RTL for arabic and persian
  • Fixed: Creating links in news

Version 0.14.2 (30 Dec 2013)

  • Added: Option "Options->Browser->Load images"
  • Added: Feed option "Disable update"
  • Added: Shortcuts for main browser actions
  • Added: Setting for text and background colors of focused feed
  • Added: Language: Finnish
  • Changed: Load feed's favicon from main webpage
  • Changed: Process "dc:date" while parsing feed
  • Changed: Mouse gestures. Jump to news description if there is no previous page on back-action
  • Changed: Address bar appearance
  • Changed: Send whole new's text when share news by e-mail
  • Fixed: Adding feeds that contains "amp;"
  • Fixed: Parsing of some feeds
  • Fixed: Action "Next unread news"
  • Fixed: Recounting and displaying counters in categories tree
  • Fixed: Manual run of filter when option "Store DB in memory" is disabled
  • Fixed: Displaying focused feed, while switching tabs with enabled filter
  • Fixed: Taking account of filter text when switching news filter

Version 0.14.1 (30 Nov 2013)

  • Main: Increase application performance
  • Added: Audio/video player for podcasts
  • Added: User filters. Sound playing (phonon)
  • Added: User filters. Highlight news in notification
  • Added: Option "Hide tab panel if only one tab is opened"
  • Added: Address field in browser toolbar
  • Added: Display news link in status bar for 3 second while switching news
  • Added: More color settings
  • Changed: Close notification if all news have been read
  • Changed: Store cleanup wizard settings
  • Changed: If images are switched off no images are displayed in news description
  • Fixed: Application crash while clicking "Customize news toolbar"
  • Fixed: Application crash while using "Next unread news"
  • Fixed: Can't to open feed homepage
  • Fixed: Switch on next unread news even if no feed is selected
  • Fixed: Mark feed read (while filter is enabled)

Vervion 0.14.0 (15 Nov 2013)

  • Main: Increase application performance
  • Main: Feed filter is case-insensitive now
  • Added: Support for feeds with uTorrent-authorization
  • Added: Feed filter "Show broken feeds"
  • Added: Application option "Default page zoom"
  • Added: User filters. Conditions for categories has been added
  • Added: More shortcuts
  • Added: More color settings
  • Changed: GUI. Some visual tweaks
  • Fixed: Application crash
  • Fixed: Application crash while using JavaScript (Windows)
  • Fixed: Application crash while using "Next unread news"
  • Fixed: Application crash while starting by desktop shortcut
  • Fixed: Tip "All feeds" while creating new filter
  • Fixed: Clearing news filter on switching between feeds
  • Fixed: Autoreplacement "http://" on adding feed
  • Fixed: Confuse options names "Don't delete starred news", "Don't delete labeled news"
  • Fixed: User filters with apostrophe didn't work
  • Fixed: Files extension in save/open dialogs
  • Fixed: Startup. Request file storing path, if specified path isn't found

Version 0.13.3 (30 Aug 2013)

  • Added: Option "Save DB stored in memory to file every XX minutes"
  • Added: Language: Turkish
  • Changed: Parsing categories (Atom)
  • Changed: Focus on news after application starts
  • Changed: Disabling notification disappearing by set notification delay to 0 seconds
  • Fixed: Codepage while parsing feeds
  • Fixed: Wrong news publish date (Atom)
  • Fixed: Importing feeds containing character '&'
  • Fixed: Memory leak. CPU loading is reduced
  • Fixed: Import feeds into present folders
  • Fixed: Creating links to attachments (Link to audio)

Version 0.13.2 (30 Jul 2013)

  • Added: Options network requests when updating feeds
  • Added: Displaying status of an icon feed and in properties
  • Added: Setting font Browser
  • Added: Shortcuts to move page by page in the list of news
  • Added: Displaying links to the comment in line with author name
  • Added: Displaying categories (labels) in line with author name
  • Added: Notification window: Button to mark news as read
  • Added: Association QuiteRSS in unix
  • Added: Language: Vietnamese
  • Added: Language: Romanian
  • Changed: Labels "Default" after changing the language translated (will only work for a new DB)
  • Changed: Displays an error message if not found SQLite driver
  • Changed: Receipt icons for feed
  • Changed: Popup windows in a new tab
  • Fixed: Application crash while updating feeds!
  • Fixed: Application crash while context menu scrollbar in browser
  • Fixed: Application crash while context menu is category tree
  • Fixed: Updating some kind of feeds
  • Fixed: Browser position of could change after applying settings
  • Fixed: In list news would disappear pointer
  • Fixed: Feeds exported file is not imported into Feedly
  • Fixed: Reopening settings window from tray
  • Fixed: Notification window: When open the news in an external browser, the news is not marked as read
  • Fixed: Notification window: Opening news
  • Fixed: In status bar is not recalculated counters
  • Fixed: When switching to category of "unread" can be displayed read news
  • Fixed: Wrong codepage while parsing feed
  • Fixed: In some feeds was not description on feed
  • Fixed: When minimizing program to the system tray, news list in categories cleared
  • Fixed: When upgrading tapes in the category has not been updated news list
  • Fixed: Minimize to tray by Win+M/Win+D

Version 0.13.1 (30 Jun 2013)

  • Added: Cleanup wizard
  • Added: Ability to specify feed's icon
  • Added: Option "Automatically mark identical news as read"
  • Added: Option "Open new tab next to active"
  • Added: Options "Enable cleanup on shutdown", "Enable DB optimization"
  • Added: Option "Show feeds toggle at edge of the window"
  • Added: Option "Main news filter"
  • Added: Option "Do not show notifications in fullscreen mode" (Windows)
  • Added: Cookies managing options
  • Added: Removing news from "Deleted" with categories pop up menu
  • Added: Share news with Google+
  • Added: Backup DB-file and setting-file before application upgrade
  • Added: Language: Arabic
  • Added: Language: Tajik
  • Added: Language: Portuguese (Portugal)
  • Changed: GUI. Visual tweaks
  • Changed: Feed loading: CPU load is reduced
  • Changed: Categories could be opened in tabs as feeds
  • Changed: Additional colors options
  • Changed: Restore categories tree collapse/expand state
  • Changed: Support links prefix "feed://"
  • Changed: Feed parsing is reworked
  • Fixed: Release news selection after mark them Read/Unread
  • Fixed: Restoring columns' widths
  • Fixed: Updating some kind of feeds
  • Fixed: Support RTL in news description
  • Fixed: Recounting feeds counters when news
  • Fixed: OPML-file while exporting feeds with large nesting structure
  • Fixed: Displaying news list while clicking on some categories
  • Fixed: Restore splitter position between news list and browser
  • Fixed: Loading 512 news after news list sort mode is changed
  • Fixed: After feed has added its news is displayed as not new
  • Fixed: Incorrect behavior some of shortcuts
  • Fixed: Restore cache's default path if it is not specified
  • Fixed: Notification window coordinates were miscalculated

Version 0.13.0 (30 May 2013)

  • Main: Increase application performance
  • Added: Individual feed update interval (feed properties)
  • Added: Individual columns in news list for feed (feed properties)
  • Added: Download manager (Program options/Browser/Downloads)
  • Added: "Undo"/"Redo" in browser text input field context menu
  • Added: Notification window preview
  • Added: Sort news list form main menu
  • Added: Tooltip appears for feed long title
  • Added: Settings for font and background colors
  • Added: Display news counters in Categories
  • Added: More keyboard shortcuts
  • Changed: GUI. Visual tweaks
  • Changed: Update feed three times on error
  • Changed: Save browser page
  • Changed: Search next unread news has became cyclic
  • Changed: Remove "http://" prefix from column "Link"
  • Changed: Mark news Read while switching between tabs
  • Changed: Opening news in new/background tab
  • Changed: Support RTL in news description
  • Changed: Comments in sources are translated to English
  • Fixed: Options "Don't delete starred news", "Don't delete labeled news" didn't store
  • Fixed: News title and description displays twice
  • Fixed: Some feeds didn't parse
  • Fixed: Wrong codepage while parsing feed
  • Fixed: Alternating row setting in news list
  • Fixed: CPU high load while application shutdown
  • Fixed: Application crashes while switching to next unread news in categories, where are no more unread news

Version 0.12.5 (22 Apr 2013)

  • Added: Disk cache and pages cache for embedded browser
  • Added: Ability sorted feeds by name ("Feeds->Sort by Name")
  • Added: Option: "Simplified representation of date and time"
  • Added: Options: "Don't delete starred news", "Don't delete labeled news"
  • Added: Option: "Automatically collapse folders"
  • Added: Option: "Run QuiteRSS at Windows startup" (Windows)
  • Added: Tab context menu items: "Close tab" and "Close Other tabs"
  • Added: Ability to move main toolbar (toolbar context menu->Lock toolbar)
  • Added: "Link" and "Title Feed" columns in news list
  • Added: Click to Flash
  • Added: CSS for news (folder "style")
  • Added: User style for browser
  • Added: Alt+left click - opens news/link in external browser (Windows)
  • Added: Simplified news find field
  • Added: More buttons available for toolbar
  • Added: More shortcuts
  • Added: Language: Greek
  • Added: Language: Chinese (Taiwan)
  • Added: Language: Portuguese (Brazil)
  • Changed: GUI. Visual tweaks
  • Changed: Increase performance updating feeds
  • Changed: Ability assign shortcuts for "Share"
  • Changed: Delete folders containing feeds
  • Changed: Ability to edit application styles(folder "style")
  • Fixed: Mark all news read in categories
  • Fixed: Focus while opening link in external browser
  • Fixed: Minimize to tray on tray-click (Linux)
  • Fixed: Recounting feeds count after group operations
  • Fixed: Moving tab content while moving tabs
  • Fixed: Deleting default buttons from toolbar
  • Fixed: Application startup in Archlinux (KDE)
  • Fixed: Show on top in full screen mode
  • Fixed: Loop while adding/updating feed
  • Fixed: Updating some feeds
  • Fixed: News duplicates
  • Fixed: Find next/previous feed

Version 0.12.4 (26 Mar 2013)

  • Added: Feed option "Authorization"
  • Added: Program option "Minimal font size in browser"
  • Added: Category "Unread"
  • Added: Update feed on double click
  • Added: Share news: LiveJournal, Pocket, Twitter
  • Added: Language: Korean
  • Added: Language: Lithuanian
  • Changed: GUI. Visual tweaks
  • Changed: Increase performance of updating news
  • Changed: Display feed's title in "Feed" column in news list
  • Fixed: Application crash while dragging feeds/folders
  • Fixed: Application crash while pressing SPACE in tab which contains news
  • Fixed: Moving focus to tab just has been opened
  • Fixed: Import feeds with deep folder's structure
  • Fixed: Export feeds
  • Fixed: Application crash while loading flash in embedded browser
  • Fixed: Authorization
  • Fixed: Show images with relative path
  • Fixed: Open news with spacial chars in URL
  • Fixed: Restore column's width of news list when use vertical layout
  • Fixed: Using shortcuts for labels
  • Fixed: Stop automatic read timer after news has marked read
  • Fixed: Viewing image while flash playing (Windows)
  • Fixed: Deleting folder with shortcut

Version 0.12.3 (16 Mar 2013)

  • Main: Increase productivity
  • Main: Manual sort in feed's tree
  • Added: Option "Hide feed's tree when opening tabs"
  • Added: Option for news' list "Alternate row's background color" (Options->Feeds->General->...)
  • Added: Ability to open several news in external browser
  • Added: Ability to open several news in tabs
  • Added: News filters: "Show for Last Day" and "Show for Last 7 Days"
  • Added: Notification window: Button to open news in external browser
  • Added: Ability to hide feed's indentation in tree ("Feeds->Show Indentation")
  • Added: Ability to customize toolbar ("View->Customize toolbar->...")
  • Added: Option "Show default rss-icon instead of favourite one"
  • Added: Share news: Email, Evernote, Facebook, VK
  • Added: Language: Ukrainian
  • Added: Language: Chinese
  • Added: Language: Czech
  • Added: Language: Polish
  • Added: Language: Japanese
  • Changed: GUI. Visual tweaks
  • Changed: Ability to change shortcuts: "CTRL+P" and "Enter"
  • Changed: Dialog "Create filter": sort conditions by name
  • Changed: Separate options "Use embedded or external browser" and "External browser selection"
  • Changed: Focus unfocused window while clicking tray icon
  • Changed: Adjust image width from media-content to browser width
  • Changed: Folder properties. Added options similar to feed options
  • Fixed: Some feeds displays short description instead of full
  • Fixed: Recounting folder's counters
  • Fixed: Shutdown of application while PC shutdown
  • Fixed: Feed's tree when it contains more than 256 items
  • Fixed: Cursor disappear in news list when sort changing
  • Fixed: Import OPML-files
  • Fixed: Notification window displays old news
  • Fixed: Text encoding while parsing feed

Version 0.12.2 (20 Feb 2013)

  • Added: Displaying news of selected folder
  • Added: Displaying URL of media-content
  • Added: Ability to save browser page as plain text
  • Added: Feed's option "Automatically delete news' duplicates"
  • Added: Ability to hide Categories ("View->Show/Hide->Panel Categories")
  • Changed: GUI. Visual tweaks
  • Changed: News list/browser size's change step set to 25 pixels instead of 5
  • Changed: Password for proxy-server displays with asterisks
  • Changed: Date and time format are separated
  • Changed: Switch to next unread news
  • Fixed: Application crash while updating feeds!
  • Fixed: Some feeds aren't processed
  • Fixed: Application crash while using shortcuts
  • Fixed: Application crash while deleting passwords from empty list
  • Fixed: Recounting folders' counters while adding new feed
  • Fixed: Downloading feeds' icons for some feeds

Version 0.12.1 (5 Feb 2013)

  • Added: Authorization support
  • Added: Cookies support
  • Added: Minimum limit of automatic update period set to 1 second
  • Added: Ability to save browser page ("Browser"->"Save as...")
  • Added: Shortcut to undelete news: "CTRL+Z" (Undo delete)
  • Added: More shortcuts
  • Added: Ability to switch on next/previous unread news
  • Changed: GUI. Visual tweaks
  • Changed: Finding unread news depends on sort
  • Changed: In "Deleted" category news is sorted by delete time stamp
  • Fixed: Error updating feeds (lasts from 0.10.3+)
  • Fixed: Automatic cleanup on shutdown
  • Fixed: Saving cursor position in news list
  • Fixed: Reset new news counter of feed while selecting one and choose another

Version 0.12.0 (14 Jan 2013)

  • Main: Increased productivity of program
  • Added: News Categories
  • Added: Labels
  • Added: Option "Open links in embedded browser in background"
  • Added: Shortcuts for closing tabs and switch between tabs
  • Changed: GUI. Redesigned interface
  • Fixed: Application crash when working with tabs
  • Fixed: Window size is not restored when opening program from system tray
  • Fixed: Some feeds are not added
  • Fixed: Some feeds did not work

Version 0.11.0 (10 Dec 2012)

  • Main: Feed categories (folders)
  • Added: View mode "Stay On Top"
  • Added: Feed property "Show news' description instead of loading web page"
  • Added: News filter "Show Not Starred"
  • Added: Option "Mark news as read: after switching to another news"
  • Added: Language: Spanish
  • Changed: GUI. Some Visual tweaks
  • Fixed: Feed opened in own tab duplicates in default tab
  • Fixed: Updating link containing special chars
  • Fixed: Shortcuts in full screen mode
  • Fixed: Disabling experimental option "Open link in external browser in background"

Version 0.10.3 (17 Oct 2012)

  • Added: Full screen mode
  • Added: Page Up/Page Down processing in news list
  • Added: Zooming in browser
  • Added: Print browser page
  • Added: Ability to hide embedded browser panels
  • Added: Ability to report a problem (menu "Help->Report a Problem...")
  • Added: Automatic update application (Windows)
  • Added: Language: Italian
  • Added: Experimental option "Open link in external browser in background"
  • Changed: News list is scrolled when active item is in the middle
  • Changed: GUI. Some Visual tweaks
  • Fixed: CTRL+Enter available for shortcuts
  • Fixed: Using sqlite3 library

Version 0.10.2 (18 Sep 2012)

  • Added: Embedded browser context menu item "Load Images"
  • Added: Embedded browser context menu item "Open in External Browser"
  • Added: News filter "Show Deleted"
  • Added: Option "Store database in memory" (On by default)
  • Added: Sorting feeds by title ("Feeds->Sort by Title")
  • Added: Language: Dutch
  • Added: Language: Farsi
  • Changed: GUI. Some visual tweaks
  • Fixed: Invisible text on OS with dark theme
  • Fixed: Open links from embedded browser in new tab: wrong links
  • Fixed: Assigning default shortcuts
  • Fixed: Cut link in some feeds
  • Fixed: News list sorting by "Star" or "Read"
  • Fixed: Column chooser in news list

Version 0.10.1 (17 Aug 2012)

  • Added: Feeds filters. Show starred feeds (Feed option. Starred)
  • Added: Feed option. Tab "Status"
  • Added: Search in the tree feeds by name or link
  • Added: Option: "Display format for date and time"("Options->Feeds->General")
  • Added: Option: "Opening feed: position on unread news"
  • Added: Option: "Mark displayed news as read when switching feeds", "Mark displayed news as read when closing tab", "Mark displayed news as read on minimize"
  • Added: Options. Selecting notification sound
  • Added: Options. Show in the notification only selected feeds
  • Added: Filter news: "Show Unread or Star"
  • Added: Sorting user filters
  • Changed: GUI. Some visual tweaks
  • Fixed: Some news were not displayed (All news will be re-uploaded!)
  • Fixed: Do not work feeds that use SSL
  • Fixed: Opening of the news from the notification window
  • Fixed: Remapping shortcuts

Version 0.10.0 (18 Jul 2012)

  • Note: Reappear news, which already have been marked read (0.8.x, 0.9.x -> 0.10.x) (More...)
  • Added: Tabs. Open news in new tab
  • Added: Tabs. Open link from news in new tab
  • Added: User filters (case sensitive)
  • Added: Feed option: "Display feed on startup". If enabled, show feed in new tab on startup
  • Added: Feed option: "Load images". Specific behavior for every feed
  • Added: Ability to subscribe to feed from Firefox
  • Added: Application option: External browser selection
  • Added: More shortcuts
  • Added: Quick news filter and find in browser
  • Added: Notification on new news
  • Added: Swedish translation
  • Added: Serbian translation
  • Changed: GUI. Some visual tweaks
  • Changed: Opening tabs in more smooth
  • Fixed: Some feeds did not work
  • Fixed: Can't detect date and time of some feeds
  • Fixed: Can't load icon of some feeds
  • Fixed: Deleting news (smaller size of database)
  • Fixed: Application crash in Windows, due to lack of QtSvg4.dll

Version 0.9.1 (31 May 2012)

  • Note: Reappear news, which already have been marked read (0.8.x -> 0.9.x) (More...)
  • Added: Tabs. Ability to open feeds in new tab
  • Added: Ability to choose browser position ("View->Browser position")
  • Added: New columns in feeds list ("Feeds->Columns")
  • Added: Hotkey "Home", "End" in feeds list and news list
  • Changed: GUI. Some visual tweaks
  • Fixed: Keyboard layout in unix systems
  • Fixed: Default application icon instead on QuiteRSS icon in unix systems
  • Fixed: Hang while updating some feeds
  • Fixed: Duplicate news in RSS-feeds

Version 0.9.0 (22 May 2012)

  • Main: Database reconstruction (More...)
  • Added: Option: action on opening feed
  • Added: More shortcuts
  • Added: Hungarian translations
  • Changed: GUI. Some visual tweaks
  • Fixed: Hang application on minimize to tray
  • Fixed: Duplicate news in RSS-feeds

Version 0.8.7 (25 Apr 2012)

  • Added: Add feed wizard. Search feed URL if site URL was entered
  • Added: Embedded browser: control panel
  • Added: Mouse gestures: slide left, slide right
  • Added: Application style: system, system2, gray, orange, green, purple, pink (Menu "View")
  • Added: Clear button in LineEdits
  • Added: French language
  • Changed: Ability to choose xml-file on import feeds
  • Changed: GUI. Some visual tweaks
  • Fixed: Some kind of link in embedded browser
  • Fixed: Marks in column menu of news list

Version 0.8.6 (02 Apr 2012)

  • Added: Automatic feeds clean up("Options->Feeds->Clean Up")
  • Added: Option "Show tray icon"
  • Added: Option "Reopen last opened feeds on startup"
  • Added: Option "Show splash screen"
  • Added: Option "Show news' description instead loading web page"
  • Added: German language
  • Changed: GUI. Some visual tweaks
  • Fixed: Improve startup time
  • Fixed: Load news on some resources
  • Fixed: After delete news, cursor jump to previous news
  • Fixed: Delete feed
  • Fixed: CTRL+A in news list
  • Fixed: Shortcut configuration
  • Fixed: Reopen news

Version 0.8.5 (26 Mar 2012)

  • Added: Delete news with shortcut
  • Added: Open news on middle click
  • Added: Shortcut configuration
  • Changed: GUI. Some visual tweaks
  • Fixed: Improve program startup
  • Fixed: Resize splash screen
  • Fixed: Open author-URI in embedded browser
  • Fixed: Parsing news-URL's and author-URI's
  • Fixed: Remove debug messages

Version 0.8.4 (21 Mar 2012)

  • Added: Splash screen
  • Added: Check for updates at startup
  • Added: Ability to set update feeds interval in hours
  • Changed: GUI. Tune icons
  • Changed: GUI. Correct browser panel
  • Changed: Improve switch between feeds and news
  • Changed: Improve several news simultaneously
  • Fixed: On some Windows systems browser don't display images
  • Fixed: Improve cursor when select news, if news more than 256
  • Fixed: Improve cursor, after several news make read
  • Fixed: News content reset after update or minimize in tray

Version 0.8.3 (25 Feb 2012)

  • Added: Option to enable plugins and java-scripts in embedded browser
  • Added: Receive bytes in progress bar of embedded browser
  • Added: OnHover links are shown in status bar
  • Added: Option to play sound on news update
  • Changed: Copy database from memory to file and back moved to own thread
  • Fixed: Click on links when embedded browser enabled
  • Fixed: Absent create date of news replace by receive date
  • Fixed: Up/Down cursor keys in feeds list
  • Fixed: Save tuning and database while system logout/shutdown when options "minimize to system tray" checked
  • Fixed: Some GUI display issues
  • Fixed: Optimize database modifying when several news selected
  • Refactoring started...

Version 0.8.2 (10 Feb 2012)

  • Added: Feed icon in feed list and tab(More...)
  • Added: Export feeds to OPML-file
  • Fixed: SQLite for Qt 4.8.0 and Qt 4.7.x
  • Fixed: Some feed parsing issues
  • Fixed: Some GUI display issues

Version 0.8.1 (6 Feb 2012)

  • Added: Internal browser
  • Fixed: Cyrillic letters in application path
  • Fixed: SQLite for Qt 4.8.0
  • Fixed: NetworkManager move to his own thread
  • Fixed: News list don't scroll while click on column "read/unread" if cursor is out of view
  • Fixed: Request url queues while update feeds
  • Fixed: Parsing "alternate" url of the news of Atom-feeds
  • Fixed: TrayMenu is not appear sometimes

Version 0.8.0 (31 Jan 2012)

  • Added: Simultaneous update up to 8 feeds

Version 0.7.6 (28 Jan 2012)

  • ...Old release. No need to document it ;)
quiterss-0.18.3/HISTORY_RU000066400000000000000000002337571265173051100151760ustar00rootroot00000000000000

ВерÑÐ¸Ñ 0.18.3 (26 Янв 2016)

  • Добавлено: ВозможноÑть наÑтройки кнопок мыши на открытие новоÑтей
  • Изменено: Библиотека SQLite 3.10.0
  • Изменено: Обновление новоÑтей в "Макете" Ñ Ñортировкой по убыванию
  • ИÑправлено: ВоÑпроизведение звука ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÑколько раз (Ubuntu)
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ выходе Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼Ð¸ наÑтройками
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании поиÑка и фильтров
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ добавлении локальной ленты
  • ИÑправлено: У некоторых лент неверное Ð²Ñ€ÐµÐ¼Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ð¸ новоÑтей

ВерÑÐ¸Ñ 0.18.2 (14 Июл 2015)

  • ИÑправлено: Падение приложениÑ
  • ИÑправлено: Категории. Пункт контекÑтного меню "Отметить прочитанной"

ВерÑÐ¸Ñ 0.18.1 (12 Июл 2015)

  • ИÑправлено: Падение приложениÑ

ВерÑÐ¸Ñ 0.18.0 (12 Июл 2015)

  • Главное: Переход на Qt5
  • Главное: Ядро браузера WebKit 538.1
  • Главное: Библиотека SQLite 3.8.10
  • Добавлено: Подхват наÑтроек папки при добавлении новой ленты
  • Добавлено: СвойÑтво папки. КоличеÑтво лент
  • Изменено: Увеличена производительноÑть программы при обновлении лент
  • Изменено: Увеличена производительноÑть дерева лент
  • Изменено: Уменьшение загрузки процеÑÑора
  • Изменено: Уменьшение Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти Webkit
  • Изменено: Обновлен AdBlock
  • Изменено: МакÑимальный размер диÑкового кÑша увеличен до 300 МБ
  • Изменено: Сохранение маÑштаба Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ (news.css)
  • Изменено: Сохранение БД при Ñворачивании в трей
  • ИÑправлено: Отображение ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ ÐºÑ€ÑƒÐ¿Ð½Ñ‹Ð¼ шрифтом
  • ИÑправлено: Ð”Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… лент (Atom) не работал фильтр новоÑтей Ñ ÑƒÑловием "ОпиÑание"
  • ИÑправлено: ДейÑÑ‚Ð²Ð¸Ñ Ð½Ð°Ð´ новоÑÑ‚Ñми при множеÑтвенном выборе
  • ИÑправлено: Иногда не ÑохранÑлиÑÑŒ размеры колонок ÑпиÑка новоÑтей
  • ИÑправлено: У некоторых лент (Atom) некорректно отображалоÑÑŒ опиÑание
  • ИÑправлено: Подключение БД Ñ Ð½Ð¾Ð²Ñ‹Ð¼ именем подключениÑ
  • ИÑправлено: При открытии неÑкольких вкладок не уÑтанавливалÑÑ Ð¼Ð°Ñштаб в браузере
  • ИÑправлено: Ðе работала горÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° "Ctrl-Shift-Backtab"
  • ИÑправлено: Отметка новоÑтей прочитанными при переключении ленты/папки/вкладки
  • ИÑправлено: Click2Flash. ВоÑпроизведение видео на YouTube

ВерÑÐ¸Ñ 0.17.7 (19 Ðпр 2015)

  • Добавлено: Пункт меню Ñ‚Ñ€ÐµÑ "Добавить ленту..."
  • Добавлено: Фильтр новоÑтей. УÑловие "ÐовоÑть" (заголовок + опиÑание)
  • Добавлено: Отображение иконки ленты Ñ€Ñдом Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼ в режиме газета
  • Добавлено: Категории. Пункт контекÑтного меню "Отметить прочитанной"
  • Изменено: Загрузка Ñертификатов CA
  • Изменено: Корректировка иконок
  • Изменено: При добавлении ленты из Firefox отображаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ маÑтер
  • ИÑправлено: Случайный захват ÑÑылок при Ñкролинге Ñтраницы
  • ИÑправлено: ÐÐµÐ»ÑŒÐ·Ñ Ð²Ñ‹Ð·Ð²Ð°Ñ‚ÑŒ программу из Ñ‚Ñ€ÐµÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ клавиш WIN+B (Windows)
  • ИÑправлено: Ðекоторые ÑÑылки на контент в Ñодержимом новоÑти не имеют Ñхемы ("http")

ВерÑÐ¸Ñ 0.17.6 (10 Фев 2015)

  • Добавлено: Кнопка на прогреÑÑ-баре и горÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° "ОÑтановить обновление лент"
  • Изменено: Запоминание пути загрузки файлов
  • Изменено: Уникальное Ð¸Ð¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ файлов
  • Изменено: ВозможноÑть ручного Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ ленты
  • ИÑправлено: Проверка SSL Ñертификатов при запуÑке приложениÑ
  • ИÑправлено: Фильтр новоÑтей. Ðазначение меток
  • ИÑправлено: Ðе отображалÑÑ Ñчётчик в категории "Ðепрочитанные"

ВерÑÐ¸Ñ 0.17.5 (18 Янв 2015)

  • Добавлено: Кнопка "ОчиÑтка"
  • ИÑправлено: Падение приложениÑ

ВерÑÐ¸Ñ 0.17.4 (09 Янв 2015)

  • Добавлено: Сохранение Ñертификатов SSL
  • ИÑправлено: Падение приложениÑ

ВерÑÐ¸Ñ 0.17.3 (02 Янв 2015)

  • ИÑправлено: Падение приложениÑ
  • ИÑправлено: Включение опции "Поверх вÑех окон"
  • ИÑправлено: Ðе работали Cookies

ВерÑÐ¸Ñ 0.17.2 (28 Дек 2014)

  • Добавлено: Сохранение Ñтраницы как html в режиме "Газета"
  • Добавлено: Отображение ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½Ð° одном Ñкране Ñ QuiteRSS (значение опции: -1)
  • Добавлено: Проверка SSL Ñертификатов
  • Добавлено: БолгарÑкий Ñзык
  • Изменено: ПеретаÑкивание ÑÑылок из вÑтроенного браузера в Firefox
  • ИÑправлено: Отображение главного меню при неÑкольких Ñкранах
  • ИÑправлено: ИнверÑÐ¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ прозрачноÑти уведомлениÑ
  • ИÑправлено: Ðекоторые ленты не обновлÑлиÑÑŒ (код Ñервера 302)
  • ИÑправлено: При отключенных картинках в режиме газета не отображаютÑÑ ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñющие кнопки
  • ИÑправлено: ПеретаÑкивание в дереве лент при мультивыделении
  • ИÑправлено: У некоторых лент неверно определÑлаÑÑŒ домашнÑÑ Ñтраница
  • ИÑправлено: Отображение ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ (Mac OS)
  • ИÑправлено: Ðе открывалиÑÑŒ ÑÑылки в выбранном внешнем браузере (Mac OS)
  • ИÑправлено: Перемещение по ÑпиÑку лент (Mac OS)

ВерÑÐ¸Ñ 0.17.1 (15 ÐÐ¾Ñ 2014)

  • Добавлено: Кнопка и горÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÐµÑ‚Ð°
  • Добавлено: Удаление новоÑтей в газетном виде
  • Добавлено: ПоиÑк в ÑпиÑке новоÑтей: "Ðайти в ÑÑылках"
  • Добавлено: Выбор монитора Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ
  • Добавлено: ÐаÑтройка прозрачноÑти уведомлениÑ
  • Добавлено: ÐаÑтройка цвета текÑта и фона уведомлениÑ
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ "Показывать при неактивноÑти главного окна"
  • Добавлено: Дополнительные опции Ð´Ð»Ñ Ð½Ð°Ñтройки макета уведомлениÑ
  • Добавлено: ГорÑчие клавиши поÑтраничного Ñкроллига во вÑтроенном браузере
  • Изменено: При переключении между лентами поиÑк в новоÑÑ‚ÑÑ… не ÑбраÑываетÑÑ
  • Изменено: ПоÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ð¼Ð°Ñтера очиÑтки отображаетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтво удалённых новоÑтей
  • Изменено: Поведение при мультивыборе в ÑпиÑке новоÑтей
  • ИÑправлено: Ðекоторые ленты имеют ÑÑылки без хоÑта
  • ИÑправлено: Ðе работал фильтр по ÑÑылке при уÑловии "Ñовпадает Ñ"
  • ИÑправлено: Ðе обновлÑлиÑÑŒ ленты Ñ Ð´Ð°Ñ‚Ð¾Ð¹ поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… от 1970 года
  • ИÑправлено: Иногда не воÑÑтанавливалиÑÑŒ размеры колонок ÑпиÑка лент

ВерÑÐ¸Ñ 0.17.0 (03 Сен 2014)

  • Добавлено: Вид "Газета" (Вид->Макет->Газета)
  • Добавлено: Поддержка прокÑи Socks5
  • Изменено: Открытие новоÑти при иÑпользовании внешнего браузера
  • ИÑправлено: Сортировка по заголовку лент в ÑпиÑке новоÑтей

ВерÑÐ¸Ñ 0.16.2 (18 Ðвг 2014)

  • Добавлено: Отображение меток в опиÑании новоÑти
  • Изменено: GUI. Ðебольшие визуальные изменениÑ
  • Изменено: Печать фрейма веб-Ñтраницы
  • ИÑправлено: Ðе ÑоздавалÑÑ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€ Ñ ÑƒÑловием "СоÑтоÑние"
  • ИÑправлено: Ð”Ð»Ñ atom лент мог не работать фильтр по ÑÑылке
  • ИÑправлено: Поддержка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти Ñправа налево
  • ИÑправлено: Ðекорректное завершение приложениÑ
  • ИÑправлено: Мог не работать Javascript в категориÑÑ…
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании RegExp в фильтрах

ВерÑÐ¸Ñ 0.16.1 (10 Июл 2014)

  • Добавлено: ВозможноÑть фильтрации новоÑтей по ÑÑылке
  • Добавлено: ПоделитьÑÑ Ð½Ð¾Ð²Ð¾Ñтью - LinkedIn, Blogger, Printer Friendly
  • Добавлено: ÐаÑтройка цвета текÑта ленты Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ‹Ð¼ обновлением
  • Добавлено: ÐаÑтройка цвета альтернативных Ñтрок ÑпиÑка новоÑтей
  • ИÑправлено: Ðе работало под некоторыми unix Ñиcтемами
  • ИÑправлено: Отображение вÑех Ñтолбцов в ÑпиÑке новоÑтей незавиÑимо от наÑтроек
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ закрытии

ВерÑÐ¸Ñ 0.16.0 (24 Май 2014)

  • Добавлено: РегиÑтронезавиÑимые фильтры, поиÑк новоÑтей и Ñортировка лент
  • Добавлено: Поддержка регулÑрных выражений в пользовательÑких фильтрах
  • Добавлено: МножеÑтвенный выбор в дереве лент
  • Добавлено: УÑтановка таблицы Ñтилей Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñти (ÐаÑтройки->Ленты)
  • Добавлено: Ð’ каталог Ñтилей добавлена таблица Ñтилей Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñти "Rstyle_v1.2.css"
  • Добавлено: Кнопка "ПоделитьÑÑ" в панели инÑтрументов браузера
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Вид->Показать/Ñкрыть->Панель ÑтатуÑа"
  • Добавлено: СвойÑтво ленты. ÐžÐ¿Ñ†Ð¸Ñ "Макет Ñправа налево" (вкладка "Отображение")
  • Добавлено: СвойÑтво ленты. ÐžÐ¿Ñ†Ð¸Ñ "Включить JavaScript" (вкладка "Отображение")
  • Добавлено: ВозможноÑть добавить на панель дейÑтвие "Создать бÑкап"
  • Добавлено: ГорÑÑ‡Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ° и кнопка "Сохранить Ñтраницу в БД вмеÑто опиÑÐ°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти"
  • Изменено: GUI. Ðебольшие визуальные изменениÑ
  • Изменено: Сохранение пути к каталогу поÑледнего бÑкапа
  • ИÑправлено: ÐŸÐ¾Ñ‚ÐµÑ€Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…
  • ИÑправлено: Ðе открывалиÑÑŒ ÑÑылки во внешнем браузере (Unix)
  • ИÑправлено: Ðеверно отображалоÑÑŒ Ð²Ñ€ÐµÐ¼Ñ Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ меÑтного чаÑового поÑÑа
  • ИÑправлено: Ðвтозагрузка Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (PortableApps)
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ при авторизации через cookie

ВерÑÐ¸Ñ 0.15.4 (18 Ðпр 2014)

  • Добавлено: ВозможноÑть ÑамоÑтоÑтельного ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð±Ñкапа (Меню->Создать бÑкап)
  • Изменено: Более Ð½Ð°Ð´Ñ‘Ð¶Ð½Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð° Ñ Ð‘Ð”
  • Изменено: Более надёжное завершение приложениÑ
  • Изменено: Сохранение резервной копии БД при обновлении приложениÑ
  • Изменено: Диалог "О программе". Добавлен путь к каталогу бÑкапа
  • Изменено: Запрет Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· под Ñборки PortableApps
  • ИÑправлено: Ðеверное отображение Ñчётчиков в дереве лент
  • ИÑправлено: Размер шрифтов по умолчанию
  • ИÑправлено: Ðе работала Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð‘Ð” при хранении её в памÑти

ВерÑÐ¸Ñ 0.15.3 (06 Ðпр 2014)

  • Главное: Поддержка платформы Mac OS X
  • Изменено: GUI. Ðебольшие визуальные изменениÑ
  • Изменено: Adblock. Добавлена подпиÑка
  • Изменено: ЕÑли заголовка у новоÑти нет, то подÑтавлÑетÑÑ Ñ‡Ð°Ñть опиÑаниÑ
  • ИÑправлено: Сохранение БД из памÑти в файл
  • ИÑправлено: Обновление Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (Windows)
  • ИÑправлено: Ðе верно формировалаÑÑŒ ÑÑылка на новоÑть
  • ИÑправлено: Ðе открывалаÑÑŒ ÑÑылка на новоÑть во внешнем браузере, еÑли она не имеет хоÑта
  • ИÑправлено: Ðекоторые ленты не имели ÑÑылки на новоÑть
  • ИÑправлено: Показ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð½Ð° оÑновном мониторе
  • ИÑправлено: Ðе ÑохранÑлÑÑ Ð¿ÑƒÑ‚ÑŒ пользовательÑкой таблицы Ñтилей Ð´Ð»Ñ Ð²Ñтроенного браузера
  • ИÑправлено: Перемещение ленты на Ñаму ÑебÑ

ВерÑÐ¸Ñ 0.15.2 (13 Мар 2014)

  • Изменено: ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ инÑтрументов (Вид->Показать/Ñкрыть->Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ)
  • Изменено: ОтноÑительный путь кÑша Ð´Ð»Ñ Ð²ÐµÑ€Ñии portable
  • Изменено: ОтноÑительный путь звука ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²ÐµÑ€Ñии portable
  • ИÑправлено: Ðекоторые ÑÑылки на новоÑть Ñодержат "amp;" вмеÑто "&"
  • ИÑправлено: Окно наÑтроек не влезало на Ñкран Ñ Ð¼Ð°Ð»Ñ‹Ð¼ разрешением
  • ИÑправлено: Завершение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ завершении работы ОС
  • ИÑправлено: Ðвтозагрузка Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (Windows)
  • ИÑправлено: При каждом запуÑке Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑоздаютÑÑ Ð¼ÐµÑ‚ÐºÐ¸ по умолчанию
  • ИÑправлено: Менеджер загрузок. Ðекорректный размер загруженного файла
  • ИÑправлено: Удаление Ñимвольной ÑÑылки на файл feeds.db

ВерÑÐ¸Ñ 0.15.1 (07 Мар 2014)

  • Изменено: Менеджер загрузок. Отображение размера и времени поÑле загрузки файла
  • ИÑправлено: Ðекорректный запуÑк приложениÑ, еÑли в пути к БД ÑодержитÑÑ Ñимвол "'"
  • ИÑправлено: ОтображаетÑÑ Ð¿Ð°Ð½ÐµÐ»ÑŒ меню поÑле выхода из полноÑкранного режима
  • ИÑправлено: Сохранение панели инÑтрументов лент

ВерÑÐ¸Ñ 0.15.0 (06 Мар 2014)

  • Главное: Ð˜Ð½Ñ‚ÐµÐ³Ñ€Ð°Ñ†Ð¸Ñ Adblock
  • Добавлено: Поддержка лент Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¼ путём к файлу (file://)
  • Добавлено: Ð’Ñтроенный браузер. Определение и добавление лент из Ñайтов
  • Добавлено: УведомлениÑ. Группировка новоÑтей - отображение заголовков лент
  • Добавлено: УведомлениÑ. Кнопка Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти
  • Добавлено: УведомлениÑ. Отметить вÑе новоÑти прочитанными
  • Добавлено: СиÑтемный трей. Пункт меню "Отметить вÑе ленты прочитанными"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Показывать кнопку Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð° вкладках"
  • Добавлено: О программе. Вкладка "ИнформациÑ"
  • Добавлено: ГалиÑийÑкий Ñзык
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: ОчиÑтка новоÑтей выполнÑетÑÑ Ð¿Ð¾ дате публикации
  • Изменено: Макет новоÑти Ñправа налево Ð´Ð»Ñ Ð°Ñ€Ð°Ð±Ñкого и перÑидÑкого Ñзыка
  • Изменено: ПроцеÑÑ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ñтавки
  • ИÑправлено: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° при импорте лент
  • ИÑправлено: Ðе обрабатывалиÑÑŒ ленты в данных которых приÑутÑтвует Ñимвол '&'
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ еÑли Ñодержат в новоÑти тег 'br'
  • ИÑправлено: ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ ÑÑылки во внешнем браузере и минимизации в трей
  • ИÑправлено: Окно наÑтроек не влезало на Ñкран Ñ Ð¼Ð°Ð»Ñ‹Ð¼ разрешением
  • ИÑправлено: ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ ÑƒÑтановка опций при переключении на вкладку Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸ÐµÐ¹
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ вызове окна "ÐаÑтройки", еÑли открыта вкладке "Загрузки"
  • ИÑправлено: СвойÑтво ленты. ÐžÐ¿Ñ†Ð¸Ñ "Отключить обновление"

ВерÑÐ¸Ñ 0.14.3 (14 Янв 2014)

  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ ÑкÑпорте лент
  • ИÑправлено: Иногда не импортировалиÑÑŒ ленты из opml-файла
  • ИÑправлено: Ð¡Ð±Ñ€Ð¾Ñ Ð¼Ð°ÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ переключении между вкладками
  • ИÑправлено: Обработка запроÑа авторизации от прокÑи
  • ИÑправлено: Макет Ñправа налево Ð´Ð»Ñ Ð°Ñ€Ð°Ð±Ñкого и перÑидÑкого Ñзыка
  • ИÑправлено: Ðе верно формировалиÑÑŒ ÑÑылки в новоÑÑ‚ÑÑ…

ВерÑÐ¸Ñ 0.14.2 (30 Дек 2013)

  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "ÐаÑтройки->Браузер->Загружать изображениÑ"
  • Добавлено: СвойÑтво ленты. ÐžÐ¿Ñ†Ð¸Ñ "Отключить обновление"
  • Добавлено: ГорÑчие клавиши Ð´Ð»Ñ Ð¾Ñновных дейÑтвий браузера
  • Добавлено: ÐаÑтройка цвета текÑта и фона текущей(выбранной) ленты
  • Добавлено: ФинÑкий Ñзык
  • Изменено: Загрузка значка ленты Ñ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ Ñтраницы Ñайта
  • Изменено: УчитываетÑÑ Ñлемент "dc:date" при разборе ленты
  • Изменено: ЖеÑты мышью. Перемещение на опиÑание новоÑти, еÑли при дейÑтвии "Ðазад" нет Ñтраниц в иÑтории
  • Изменено: Вид адреÑной Ñтроки браузера
  • Изменено: При отправке новоÑти через почту передаётÑÑ Ð²ÐµÑÑŒ текÑÑ‚ новоÑти
  • ИÑправлено: Ðе добавлÑлиÑÑŒ ленты в ÑÑылках которых ÑодержитÑÑ "amp;"
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ
  • ИÑправлено: ДейÑтвие "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть"
  • ИÑправлено: ПереÑчёт и отображение Ñчётчиков в дереве категорий
  • ИÑправлено: Ðе работал ручной запуÑк фильтра при отключенной опции "Хранить БД в памÑти"
  • ИÑправлено: При включенном фильтре в дереве лент не отображалаÑÑŒ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð»ÐµÐ½Ñ‚Ð°, еÑли переключитьÑÑ Ð½Ð° другую вкладку
  • ИÑправлено: При переключении фильтра новоÑтей не учитывалÑÑ Ð²Ð²ÐµÐ´Ñ‘Ð½Ð½Ñ‹Ð¹ текÑÑ‚ в поиÑке

ВерÑÐ¸Ñ 0.14.1 (30 ÐÐ¾Ñ 2013)

  • Главное: Увеличена производительноÑть программы
  • Добавлено: Ðудио/видео плеер Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ°Ñтов
  • Добавлено: ПользовательÑкие фильтры. Проигрывание звука (phonon)
  • Добавлено: ПользовательÑкие фильтры. Выделение цветом новоÑти в уведомлении
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Скрыть панель вкладок, еÑли открыта только одна вкладка"
  • Добавлено: ÐдреÑÐ½Ð°Ñ Ñтрока в панели браузера
  • Добавлено: При переходе на новоÑть отображаетÑÑ ÑÑылка в ÑтатуÑ-баре 3 Ñек
  • Добавлено: Дополнительные наÑтройки цветов
  • Изменено: Закрытие уведомлениÑ, еÑли вÑе новоÑти пометили как прочитанные
  • Изменено: Запоминание наÑтроек маÑтера очиÑтки
  • Изменено: УдалÑÑŽÑ‚ÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² опиÑании новоÑти (при отключенных изображениÑÑ…)
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ клике "ÐаÑтройка панели новоÑтей"
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть"
  • ИÑправлено: Ðе открывалаÑÑŒ домашнÑÑ Ñтраница ленты
  • ИÑправлено: ЕÑли не выбрана лента, то не переключалоÑÑŒ на Ñледующую непрочитанную новоÑть
  • ИÑправлено: Отметка ленты прочитанной (при включенном фильтре)

ВерÑÐ¸Ñ 0.14.0 (15 ÐÐ¾Ñ 2013)

  • Главное: Увеличена производительноÑть программы
  • Главное: Переделан фильтр лент (региÑтронезавиÑимый)
  • Добавлено: Поддержка лент Ñ uTorrent-авторизацией
  • Добавлено: Фильтр лент "Показать не рабочие ленты"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "МаÑштабирование Ñтраницы по умолчанию"
  • Добавлено: ПользовательÑкие фильтры. Добавлены уÑÐ»Ð¾Ð²Ð¸Ñ Ð´Ð»Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¹
  • Добавлено: Дополнительные горÑчие клавиши
  • Добавлено: Дополнительные наÑтройки цветов
  • Изменено: GUI. Ðебольшие визуальные изменениÑ
  • ИÑправлено: ÐŸÐ°Ð´ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании JavaScript (Windows)
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании "Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть"
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ запуÑке Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ Ñрлыка
  • ИÑправлено: При Ñоздании нового фильтра ÑтоÑла галочка на пункте "Ð’Ñе ленты"
  • ИÑправлено: Ðе очищалÑÑ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€ новоÑтей при переключении между лентами
  • ИÑправлено: ÐвтоподÑтановка "http://" при добавлении ленты
  • ИÑправлено: Перепутаны меÑтами опции "Ðе удалÑть избранные новоÑти", "Ðе удалÑть новоÑти Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹". ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ ÑоответÑтвовали
  • ИÑправлено: Ðе работали пользовательÑкие фильтры Ñодержащие апоÑтроф
  • ИÑправлено: РаÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² в диалогах ÑохранениÑ/открытиÑ
  • ИÑправлено: Загрузка. Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¼ÐµÑта ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°, еÑли не ÑущеÑтвует указанный путь

ВерÑÐ¸Ñ 0.13.3 (30 Ðвг 2013)

  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "СохранÑть БД из памÑти в файл каждые XX минут"
  • Добавлено: Турецкий Ñзык
  • Изменено: Получение категории в лентах Atom
  • Изменено: При запуÑке программы Ñ„Ð¾ÐºÑƒÑ ÑƒÑтанавливаетÑÑ Ð½Ð° новоÑть
  • Изменено: Отключение ÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¾ÐºÐ½Ð° ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ уÑтановке Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² 0 Ñекунд
  • ИÑправлено: ИÑпользование неверной кодировки Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð¾Ñ€Ð° лент
  • ИÑправлено: ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð´Ð°Ñ‚Ð° публикации новоÑти у лент Atom
  • ИÑправлено: Ðе импортировалиÑÑŒ ленты, которые Ñодержат Ñимвол '&'
  • ИÑправлено: Утечка памÑти. Уменьшение загрузки процеÑÑора
  • ИÑправлено: При импорте лент учитывалиÑÑŒ уже Ñозданные папки
  • ИÑправлено: Ðе верно формировалиÑÑŒ ÑÑылки на Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти (Link to audio)

ВерÑÐ¸Ñ 0.13.2 (30 Июл 2013)

  • Добавлено: Опции Ð´Ð»Ñ Ð½Ð°Ñтройки Ñетевых запроÑов при обновлении лент
  • Добавлено: Отображение ÑоÑтоÑние ленты на иконке ленты и в ÑвойÑтвах
  • Добавлено: ÐаÑтройка шрифтов Ð´Ð»Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°
  • Добавлено: ГорÑчие клавиши Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñтранично в ÑпиÑке новоÑтей
  • Добавлено: Отображение ÑÑылки на комментарий в Ñтроке Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ автора
  • Добавлено: Отображение категории (метки) в Ñтроке Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ автора
  • Добавлено: УведомлениÑ. Кнопка Ð´Ð»Ñ Ð¿Ð¾Ð¼ÐµÑ‚ÐºÐ¸ новоÑти прочитанной
  • Добавлено: ÐÑÑоциации QuiteRSS в unix
  • Добавлено: ВьетнамÑкий Ñзык
  • Добавлено: РумынÑкий Ñзык
  • Изменено: Метки "По умолчанию" переводÑÑ‚ÑÑ Ð¿Ð¾Ñле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñзыка (будет работать только Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð¹ БД)
  • Изменено: Вывод ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± ошибке еÑли не найден драйвер SQLite
  • Изменено: Получение иконки Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚Ñ‹
  • Изменено: Открытие вÑплывающих окон в новой вкладке
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ обновлении лент!
  • ИÑправлено: Падение программы при вызове контекÑтного меню Ñкроллбара в браузере
  • ИÑправлено: Падение программы при вызове контекÑтного меню дерева категорий
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ
  • ИÑправлено: Положение браузера могло изменитьÑÑ Ð¿Ð¾Ñле Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек
  • ИÑправлено: Мог пропадать курÑор в ÑпиÑке новоÑтей
  • ИÑправлено: ЭкÑпортируемый файл лент не импортировалÑÑ Ð² Feedly
  • ИÑправлено: Повторное открытие окна наÑтроек из треÑ
  • ИÑправлено: УведомлениÑ. При открытии новоÑти во внешнем браузере, новоÑть не помечалаÑÑŒ прочитанной
  • ИÑправлено: УведомлениÑ. Открытие новоÑти
  • ИÑправлено: Ðе переÑчитывалиÑÑŒ Ñчётчики в ÑтатуÑной Ñтроке
  • ИÑправлено: При переключении на категорию "Ðепрочитанные" могут отображатьÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ‹Ðµ новоÑти
  • ИÑправлено: ИÑпользование неверной кодировки Ð´Ð»Ñ Ñ€Ð°Ð·Ð±Ð¾Ñ€Ð° лент
  • ИÑправлено: Ð’ некоторых лентах не было опиÑÐ°Ð½Ð¸Ñ Ð½Ð° ленту
  • ИÑправлено: При Ñворачивании программы в трей ÑпиÑок новоÑтей в категории очищалÑÑ
  • ИÑправлено: При обновлении лент, в категории не обновлÑлÑÑ ÑпиÑок новоÑтей
  • ИÑправлено: ÐœÐ¸Ð½Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð² трей по Win+M/Win+D

ВерÑÐ¸Ñ 0.13.1 (30 Июн 2013)

  • Добавлено: МаÑтер очиÑтки
  • Добавлено: ВозможноÑть уÑтановить иконку ленты
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "ÐвтоматичеÑки помечать одинаковые новоÑти как прочитанные"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Открытие новой вкладки поÑле активной"
  • Добавлено: Опции "Включить очиÑтку при завершении", "Включить оптимизацию БД"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Показывать переключатель дерева лент"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "ОÑновной фильтр новоÑтей"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Ðе показывать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² режиме полного Ñкрана" (Windows)
  • Добавлено: Опции Ð´Ð»Ñ cookies
  • Добавлено: Удаление новоÑтей из "Удалённые" через контекÑтное меню категорий
  • Добавлено: ПоделитьÑÑ Ð½Ð¾Ð²Ð¾Ñтью: Google+
  • Добавлено: Резервирование базы данных поÑле запуÑка новой верÑии программы
  • Добавлено: ÐрабÑкий Ñзык
  • Добавлено: ТаджикÑкий Ñзык
  • Добавлено: ПортугальÑкий Ñзык (ПортугалиÑ)
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: Уменьшение нагрузки на процеÑÑор при обновлении лент
  • Изменено: Открытие категорий во вкладках по аналогии Ñ Ð»ÐµÐ½Ñ‚Ð°Ð¼Ð¸
  • Изменено: Дополнительные наÑтройки цветов
  • Изменено: Запоминание ÑоÑтоÑÐ½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ðº в дереве категорий - Ñвернуты/развернуты
  • Изменено: Поддержка ÑÑылок Ñ Ð¿Ñ€ÐµÑ„Ð¸ÐºÑом "feed://"
  • Изменено: Переработан разбор лент
  • ИÑправлено: СнимаетÑÑ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ðµ Ñ Ð½ÐµÑкольких выделенных новоÑтей при отметке "прочитанное/непрочитанное"
  • ИÑправлено: Ðе ÑохранÑлиÑÑŒ размеры колонок
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ
  • ИÑправлено: Поддержка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти Ñправа налево
  • ИÑправлено: Ðе переÑчитывалиÑÑŒ Ñчётчики при воÑÑтановлении удалённой новоÑти
  • ИÑправлено: При ÑкÑпорте лент Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ вложенноÑтью нарушалаÑÑŒ Ñтруктура opml-файла
  • ИÑправлено: При клике по категории ÑпиÑок новоÑтей мог не отображатьÑÑ
  • ИÑправлено: ВоÑÑтановление Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð¼ÐµÐ¶Ð´Ñƒ ÑпиÑком новоÑтей и браузером
  • ИÑправлено: ПоÑле Ñортировки количеÑтво новоÑтей в ÑпиÑке могло ограничиватьÑÑ 512
  • ИÑправлено: При добавлении новой ленты, новоÑти в ней отображалиÑÑŒ как не новые
  • ИÑправлено: Ðекорректное поведение при иÑпользовании некоторых горÑчих клавиш
  • ИÑправлено: ЕÑли путь к кÑшу не задан, то иÑпользуетÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ðµ по умолчанию
  • ИÑправлено: Ðеверно вычиÑлÑлиÑÑŒ координаты Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð° уведомлениÑ

ВерÑÐ¸Ñ 0.13.0 (30 Май 2013)

  • Главное: Увеличена производительноÑть программы
  • Добавлено: ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð»ÐµÐ½Ñ‚ по индивидуальным таймерам
  • Добавлено: ÐаÑтройка колонок ÑпиÑка новоÑтей Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ленты
  • Добавлено: Менеджер загрузок
  • Добавлено: Пункты "Undo" и "Redo" Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚ÐµÐºÑтного меню Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° текÑта браузера
  • Добавлено: ПредпроÑмотр окна уведомлениÑ
  • Добавлено: УÑтановка Ñортировки новоÑтного ÑпиÑка через главное меню
  • Добавлено: ПодÑказка Ð´Ð»Ñ Ð´Ð»Ð¸Ð½Ð½Ð¾Ð³Ð¾ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð»ÐµÐ½Ñ‚Ñ‹
  • Добавлено: ÐаÑтройка цветов шрифта и фона
  • Добавлено: Отображение Ñчётчиков новоÑтей у категорий
  • Добавлено: Дополнительные горÑчие клавиши
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: Обновление лент. При ошибке Ñетевого запроÑа делаем повтор 3 раза
  • Изменено: Сохранение Ñтраницы браузера
  • Изменено: ЦикличеÑкий поиÑк Ñледующей непрочитанной новоÑти
  • Изменено: Ð’ колонке "СÑылка" ÑÑылки отображаютÑÑ Ð±ÐµÐ· "http://"
  • Изменено: Пометка новоÑтей прочитанными при переключении между вкладками
  • Изменено: Открытие новоÑти во вкладке новой/фоновой
  • Изменено: Поддержка Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти Ñправа на лево
  • Изменено: Комментарии в иÑходниках переведены на английÑкий
  • ИÑправлено: Ðе ÑохранÑлиÑÑŒ опции "Ðе удалÑть избранные новоÑти", "Ðе удалÑть новоÑти Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹"
  • ИÑправлено: Заголовок и опиÑание новоÑти могут повторÑÑ‚ÑÑ Ð´Ð²Ð° раза
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ
  • ИÑправлено: ИÑпользование неправильной кодировки при разборе ленты
  • ИÑправлено: УÑтановка Ñ‡ÐµÑ€ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñтрок ÑпиÑка новоÑтей
  • ИÑправлено: Ð’Ñ‹ÑÐ¾ÐºÐ°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° процеÑÑора при завершении приложениÑ
  • ИÑправлено: Падало приложение при переходе на Ñледующую непрочитанную новоÑть в категориÑÑ…, еÑли непрочитанных новоÑтей нет

ВерÑÐ¸Ñ 0.12.5 (22 Ðпр 2013)

  • Добавлено: ДиÑковый кÑш и кÑш Ñтраниц Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ³Ð¾ браузера
  • Добавлено: ВозможноÑть отÑортировать ленты по имени ("Ленты->ОтÑортировать по имени")
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Упрощенное предÑтавление даты и времени"
  • Добавлено: Опции: "Ðе удалÑть избранные новоÑти", "Ðе удалÑть новоÑти Ñ Ð¼ÐµÑ‚ÐºÐ¾Ð¹"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "ÐвтоматичеÑки Ñворачивать папки"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "ЗапуÑкать QuiteRSS при Ñтарте ÑиÑтемы" (Windows)
  • Добавлено: КонтекÑтное меню вкладки: "Закрыть вкладку" и "Закрыть другие вкладки"
  • Добавлено: ВозможноÑть перемещать главную панель инÑтрументов
  • Добавлено: Ð’ ÑпиÑке новоÑтей добавлены две колонки: "СÑылка" и "Заголовок ленты"
  • Добавлено: Click to Flash
  • Добавлено: CSS Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñти (папка "style")
  • Добавлено: Выбор пользовательÑкого ÑÑ‚Ð¸Ð»Ñ Ð´Ð»Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°
  • Добавлено: Alt+left click - открыть новоÑть/ÑÑылку во внешнем браузере (Windows)
  • Добавлено: Упрощённый поиÑк новоÑтей
  • Добавлено: Дополнительные кнопки Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° панели инÑтрументов
  • Добавлено: Дополнительные горÑчие клавиши
  • Добавлено: ГречеÑкий Ñзык
  • Добавлено: КитайÑкий Ñзык (Тайвань)
  • Добавлено: ПортугальÑкий Ñзык (БразилиÑ)
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: Увеличена ÑкороÑть при обновлении лент
  • Изменено: ДейÑÑ‚Ð²Ð¸Ñ "ПоделитьÑÑ" доÑтупны Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð³Ð¾Ñ€Ñчих клавиш
  • Изменено: Удаление папки Ñ Ð»ÐµÐ½Ñ‚Ð°Ð¼Ð¸
  • Изменено: Стили Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупны Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (папка "style")
  • ИÑправлено: Ð’ категориÑÑ… не работала пометка вÑех новоÑтей прочитанными
  • ИÑправлено: При открытии ÑÑылки во внешнем браузере в фоне - Ñлетал фокуÑ
  • ИÑправлено: Клик по иконке в трее не Ñворачивал окно в трей (Linux)
  • ИÑправлено: При групповых операциÑÑ… в папках и категориÑÑ… не переÑчитывалиÑÑŒ Ñчётчики
  • ИÑправлено: При перемещении вкладок Ñодержимое оÑтавалоÑÑŒ на прежнем меÑте
  • ИÑправлено: С панели лент не удалÑлиÑÑŒ кнопки по умолчанию
  • ИÑправлено: Приложение не запуÑкалаÑÑŒ в Archlinux (KDE)
  • ИÑправлено: Включение поверх вÑех в полноÑкранном режиме
  • ИÑправлено: Зацикливание при добавлении/обновлении ленты
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ
  • ИÑправлено: Дубликаты новоÑтей
  • ИÑправлено: ПоиÑк Ñледующей/предыдущей ленты

ВерÑÐ¸Ñ 0.12.4 (26 Мар 2013)

  • Добавлено: СвойÑтво ленты. ÐвторизациÑ
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Минимальный размер шрифта браузера"
  • Добавлено: ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ "Ðепрочитанные"
  • Добавлено: Обновление ленты при двойном клике
  • Добавлено: ПоделитьÑÑ Ð½Ð¾Ð²Ð¾Ñтью: LiveJournal, Pocket, Twitter
  • Добавлено: КорейÑкий Ñзык
  • Добавлено: ЛитовÑкий Ñзык
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: Увеличена ÑкороÑть при обновлении лент
  • Изменено: Ð’ ÑпиÑке новоÑтей в колонке "Лента" поÑле иконки отображаетÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ ленты
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ перемещении лент/папок
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ открытой новоÑти во вкладке и нажатии пробела
  • ИÑправлено: При переключении на вкладку - Ñ„Ð¾ÐºÑƒÑ Ð¾ÑтавалÑÑ Ð½Ð° заголовке вкладки
  • ИÑправлено: Импорт лент Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ вложенноÑтью
  • ИÑправлено: Ошибка ÑкÑпорта лент
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ загрузке flash во внутреннем браузере
  • ИÑправлено: ÐвторизациÑ
  • ИÑправлено: Ð’ некоторых новоÑÑ‚ÑÑ… не отображаютÑÑ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¸ Ñ Ð¾Ñ‚Ð½Ð¾Ñительными путÑми
  • ИÑправлено: Ðе открывалиÑÑŒ новоÑти у которых ÑÑылки Ñодержат Ñпец знаки
  • ИÑправлено: При вертикальном положении браузера - ширина колонок в ÑпиÑке новоÑтей поÑле перезапуÑка Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ воÑÑтанавливалаÑÑŒ
  • ИÑправлено: ИÑпользование горÑчих клавиш Ð´Ð»Ñ Ð¼ÐµÑ‚Ð¾Ðº
  • ИÑправлено: При отмене метки прочитанной автоматичеÑкий таймер вновь помечал новоÑть
  • ИÑправлено: Отображение картинки при проигрывании flash (Windows)
  • ИÑправлено: Удаление папки Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ горÑчей клавиши

ВерÑÐ¸Ñ 0.12.3 (16 Мар 2013)

  • Главное: Увеличена производительноÑть программы
  • Главное: Ð ÑƒÑ‡Ð½Ð°Ñ Ñортировка в дереве лент
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Скрывать дерево лент при открытии вкладки"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ Ð´Ð»Ñ ÑпиÑка новоÑтей: "Чередование цвета фона Ñтрок"
  • Добавлено: Открытие неÑкольких выбранных новоÑтей во внешнем браузере
  • Добавлено: Открытие неÑкольких выбранных новоÑтей во вкладках
  • Добавлено: Фильтры новоÑтей: "Показать за поÑледний день" и "Показать за 7 дней"
  • Добавлено: Окно уведомлениÑ: Кнопка Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти во внешнем браузере
  • Добавлено: Скрытие отÑтупа в дереве лент ("ÐовоÑтные ленты->Отображать отÑтуп")
  • Добавлено: ÐаÑтройка панелей инÑтрументов ("Вид->ÐаÑтройка панели инÑтрументов")
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "ИÑпользовать Ñтандартную иконку Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚ вмеÑто уникальной"
  • Добавлено: ПоделитьÑÑ Ð½Ð¾Ð²Ð¾Ñтью: Email, Evernote, Facebook, VK
  • Добавлено: УкраинÑкий Ñзык
  • Добавлено: КитайÑкий Ñзык
  • Добавлено: ЧешÑкий Ñзык
  • Добавлено: ПольÑкий Ñзык
  • Добавлено: ЯпонÑкий Ñзык
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: ВозможноÑть переназначить горÑчие клавиши: "CTRL+P" и "Enter"
  • Изменено: У некоторых лент отображаетÑÑ ÐºÑ€Ð°Ñ‚ÐºÐ¾Ðµ опиÑание новоÑти вмеÑто полного
  • Изменено: Диалог ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°. Сортировка уÑловий по имени
  • Изменено: Выбор внешнего браузера при включенном внутреннем
  • Изменено: При клике в трее делает неактивное окно активным
  • Изменено: Ширина картинки из медиа-контента подÑтраиваетÑÑ Ð¿Ð¾Ð´ ширину браузера
  • Изменено: СвойÑтво папки. Добавлены опции аналогичные опциÑм в ÑвойÑтвах лент
  • ИÑправлено: Ðеверно переÑчитывалиÑÑŒ Ñчётчики папок
  • ИÑправлено: Ðе корректно завершалоÑÑŒ приложение при выключении ПК
  • ИÑправлено: Ðе корректно отображалоÑÑŒ дерево лент при чиÑле Ñтрок больше 256
  • ИÑправлено: При изменении Ñортировки в ÑпиÑке новоÑтей пропадал курÑор
  • ИÑправлено: Ðекорректный разбор некоторых OPML файлов при импорте лент
  • ИÑправлено: Отображение Ñтарых новоÑтей в окне уведомлениÑ
  • ИÑправлено: ИÑпользование неправильной кодировки при разборе ленты

ВерÑÐ¸Ñ 0.12.2 (20 Фев 2013)

  • Добавлено: ПроÑмотр новоÑтей выбранной папки
  • Добавлено: Поддержка медиа-контента (отображение ÑÑылки)
  • Добавлено: Сохранение открытой Ñтраницы браузера как текÑÑ‚
  • Добавлено: СвойÑтво ленты. ÐžÐ¿Ñ†Ð¸Ñ "ÐвтоматичеÑкий удалÑть дубликаты новоÑтей"
  • Добавлено: Скрытие панели новоÑтных категорий ("Вид->Показать/Ñкрыть->Панель категорий")
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: Шаг Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° ÑпиÑка новоÑтей/браузера = 25 пикÑелей (было 5)
  • Изменено: Пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾ÐºÑи-Ñервера отображаетÑÑ Ñкрытым (точками)
  • Изменено: Отдельный выбор вывода формата даты и формата времени
  • Изменено: Переход к Ñледующей непрочитанной новоÑти
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ обновлении лент!
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ иÑпользовании некоторых горÑчих клавиш
  • ИÑправлено: Падение Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ удалении паролей из пуÑтого ÑпиÑка
  • ИÑправлено: ПереÑчитывание Ñчётчиков папок при добавлении ленты
  • ИÑправлено: Загрузка иконки ленты Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… лент

ВерÑÐ¸Ñ 0.12.1 (5 Фев 2013)

  • Добавлено: Поддержка авторизации
  • Добавлено: Поддержка Cookies
  • Добавлено: Интервал автоматичеÑкого Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð»ÐµÐ½Ñ‚ от 1 Ñекунды
  • Добавлено: Сохранение открытой Ñтраницы браузера ("Браузер"->"Сохранить как")
  • Добавлено: ВоÑÑтановление удалённых новоÑтей по горÑчей клавише - "CTRL+Z" (Отмена удалениÑ)
  • Добавлено: Дополнительные горÑчие клавиши
  • Добавлено: ВозможноÑть перехода по непрочитанным новоÑÑ‚Ñм
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: ПоиÑк непрочитанной новоÑти производитÑÑ Ñ ÑƒÑ‡Ñ‘Ñ‚Ð¾Ð¼ Ñортировки
  • Изменено: Сортировка новоÑтей по дате ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð² категории "Удалённые"
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ (обнаружено в 0.10.3+)
  • ИÑправлено: ÐвтоматичеÑÐºÐ°Ñ Ñ‡Ð¸Ñтка новоÑтей при закрытии программы
  • ИÑправлено: Ðе ÑохранÑлаÑÑŒ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð² ÑпиÑке новоÑтей
  • ИÑправлено: Ðе ÑбраÑывалÑÑ Ñчётчик количеÑтва новых новоÑтей в ленте

ВерÑÐ¸Ñ 0.12.0 (14 Янв 2013)

  • Главное: Увеличена производительноÑть программы
  • Добавлено: ÐовоÑтные категории
  • Добавлено: Метки/Ñрлыки
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Открывать вкладки во вÑтроенном браузере в фоне"
  • Добавлено: ГорÑчие клавиши Ð´Ð»Ñ Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸ и Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ вкладками
  • Изменено: GUI. Переработан интерфейÑ
  • ИÑправлено: Приложение падало при работе Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸
  • ИÑправлено: Ðе воÑÑтанавливалÑÑ Ñ€Ð°Ð·Ð¼ÐµÑ€ окна при открытии программы из треÑ
  • ИÑправлено: Ðекоторые ленты не добавлÑлиÑÑŒ
  • ИÑправлено: Ðекоторые ленты не обрабатывалиÑÑŒ

ВерÑÐ¸Ñ 0.11.0 (10 Дек 2012)

  • Главное: Группировка лент (Папки)
  • Добавлено: Режим Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ "Поверх вÑех окон"
  • Добавлено: СвойÑтво ленты "Показывать краткое опиÑание новоÑти вмеÑто загрузки Ñтраницы"
  • Добавлено: Фильтр новоÑтей "Показать не отмеченные звездой"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Пометить новоÑть прочитанной: поÑле Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð° другую новоÑть"
  • Добавлено: ИÑпанÑкий Ñзык
  • Изменено: GUI. Визуальные изменениÑ
  • ИÑправлено: Лента Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð°Ñ Ð² отдельной вкладке дублировалаÑÑŒ во вкладке по умолчанию
  • ИÑправлено: Ðе обрабатывалиÑÑŒ ленты Ñ ÑÑылкой Ñодержащей Ñпец знаки
  • ИÑправлено: Ðе работали горÑчие клавиши в полноÑкранном режиме
  • ИÑправлено: СÑылки вÑегда открывалиÑÑŒ во внешнем браузере в фоне

ВерÑÐ¸Ñ 0.10.3 (17 Окт 2012)

  • Добавлено: ПолноÑкранный режим
  • Добавлено: Обработка клавиш Page Up/Page Down в ÑпиÑке новоÑтей
  • Добавлено: Изменение маÑштаба в браузере
  • Добавлено: Печать Ñтраницы вÑтроенного браузера
  • Добавлено: ВозможноÑть Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ»ÐµÐ¹ вÑтроенного браузера
  • Добавлено: ВозможноÑть Ñообщить о проблеме (меню "Помощь->Сообщить о проблеме..."
  • Добавлено: ÐвтоматичеÑкое обновление программы (Windows)
  • Добавлено: ИтальÑнÑкий Ñзык
  • Добавлено: ЭкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ "Открытие ÑÑылки во внешнем браузере в фоне"
  • Изменено: ПролиÑтывание ÑпиÑка новоÑтей начинаетÑÑ Ð¿Ñ€Ð¸ положении курÑора в Ñередине ÑпиÑка
  • Изменено: GUI. Визуальные изменениÑ
  • ИÑправлено: ÐевозможноÑть назначение CTRL+Enter Ð´Ð»Ñ Ð³Ð¾Ñ€Ñчих клавиш
  • ИÑправлено: Подключение к проекту библиотеки sqlite3

ВерÑÐ¸Ñ 0.10.2 (18 Сен 2012)

  • Добавлено: Пункт контекÑтного меню браузера "Загружать изображениÑ"
  • Добавлено: Пункт контекÑтного меню браузера "Открыть ÑÑылку во внешнем браузере"
  • Добавлено: Фильтр новоÑтей "Показать удалённые"
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ "Хранить БД в памÑти" (по умолчанию включена)
  • Добавлено: Сортировка лент по заголовку ("ÐовоÑтные ленты->Сортировать по заголовку")
  • Добавлено: ГолландÑкий Ñзык
  • Добавлено: ПерÑидÑкий Ñзык
  • Изменено: GUI. Визуальные изменениÑ
  • ИÑправлено: Ðекоторый текÑÑ‚ не отображаетÑÑ, еÑли тема ОС чёрнаÑ
  • ИÑправлено: Открытие в новой вкладке ÑÑылок из браузера: неверные ÑÑылки
  • ИÑправлено: Ðе выÑтавлÑлиÑÑŒ по умолчанию Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð³Ð¾Ñ€Ñчих клавиш
  • ИÑправлено: Ð’ некоторых лентах неполные ÑÑылки
  • ИÑправлено: Сортировка ÑпиÑка новоÑтей по "Звёздочка" или по "Прочитано"
  • ИÑправлено: Ðе работал Ñелектор колонок в ÑпиÑке новоÑтей

ВерÑÐ¸Ñ 0.10.1 (17 Ðвг 2012)

  • Добавлено: Фильтр лент. Показать избранные ленты (СвойÑтво ленты. ИзбраннаÑ)
  • Добавлено: СвойÑтво ленты. Вкладка "СоÑтоÑние"
  • Добавлено: ПоиÑк в дереве лент по имени или ÑÑылки
  • Добавлено: ОпциÑ. Формат Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹ (ÐаÑтройки->ÐовоÑтные ленты->Общие)
  • Добавлено: ОпциÑ. При открытии ленты переходить на первую непрочитанную новоÑть
  • Добавлено: Опции. Отметка ленты прочитанной при переключении на другую ленту, при закрытии вкладки и при минимизации приложениÑ
  • Добавлено: ОпциÑ. Выбор звука уведомлениÑ
  • Добавлено: ОпциÑ. Показывать в уведомлении только выбранные ленты
  • Добавлено: Фильтр новоÑтей. Показать непрочитанные или Ñо звездочкой
  • Добавлено: Сортировка пользовательÑких фильтров
  • Изменено: GUI. Визуальные изменениÑ
  • ИÑправлено: Ðе вÑе новоÑти приходили (будет Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° вÑех новоÑтей!)
  • ИÑправлено: Ðе работали ленты иÑпользующие SSL
  • ИÑправлено: Открытие новоÑти из окна уведомлениÑ
  • ИÑправлено: Переназначение горÑчих клавиш

ВерÑÐ¸Ñ 0.10.0 (18 Июл 2012)

  • Примечание: Повторное отображение новоÑтей (0.8.x,0.9.x -> 0.10.x) (More...)
  • Добавлено: Вкладки. Открытие новоÑти в новой вкладке
  • Добавлено: Вкладки. Открытие ÑÑылок ÑодержащихÑÑ Ð² новоÑти в новой вкладке
  • Добавлено: ПользовательÑкие фильтры новоÑтей (пока региÑтрозавиÑимые)
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ Ð² ÑвойÑтвах ленты. Показывать ленту в отдельной вкладке при запуÑке
  • Добавлено: ÐžÐ¿Ñ†Ð¸Ñ Ð² ÑвойÑтвах ленты. "Загружать изображениÑ"
  • Добавлено: ВозможноÑть подпиÑки на ленту из Firefox
  • Добавлено: ÐаÑтройки. Выбор внешнего браузера
  • Добавлено: Дополнительные горÑчие клавиши
  • Добавлено: БыÑтрый фильтр новоÑтей и поиÑк в браузере
  • Добавлено: Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ новых входÑщих новоÑÑ‚ÑÑ…
  • Добавлено: ШведÑкий Ñзык
  • Добавлено: СербÑкий Ñзык
  • Изменено: GUI. Визуальные изменениÑ
  • Изменено: Более плавное открытие новых вкладок
  • ИÑправлено: Ðекоторые ленты не работали
  • ИÑправлено: Ðе у вÑех новоÑтей находилаÑÑŒ дата и времÑ
  • ИÑправлено: Ðе у вÑех лент загружалаÑÑŒ иконка
  • ИÑправлено: Удаление новоÑтей (большой размер базы данных)
  • ИÑправлено: Ð’ некоторых ÑлучаÑÑ… в Windows приложение падало из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸

ВерÑÐ¸Ñ 0.9.1 (31 Май 2012)

  • Note: Повторное отображение новоÑтей, которые уже были помечаны прочитанными (0.8.x -> 0.9.x) (More...)
  • Added: Вкладки. Открытие ленты в новой вкладке
  • Added: Изменение Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°("Вид->ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð°")
  • Added: Дополнительные колонки в дереве лент("ÐовоÑтные ленты->Колонки")
  • Added: Клавиши "Home", "End" в дереве лент и в ÑпиÑке новоÑтей
  • Changed: GUI. Ðебольшие визуальные изменениÑ
  • Fixed: Ðа unix ÑиÑтемах не переключалÑÑ Ñзык
  • Fixed: Ðе отображалаÑÑŒ иконка Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² unix ÑиÑтемах
  • Fixed: ЗавиÑание программы при обновлении некоторых лент
  • Fixed: Дублирование новоÑтей в RSS-лентах

ВерÑÐ¸Ñ 0.9.0 (22 Май 2012)

  • Main: РеконÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных (More...)
  • Added: ОпциÑ: деÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ открытии ленты
  • Added: Дополнительные горÑчие клавиши
  • Added: ВенгерÑкий Ñзык
  • Changed: GUI. Ðебольшие визуальные изменениÑ
  • Fixed: ЗавиÑание программы при Ñворачивании в трей
  • Fixed: Дублирование новоÑтей в RSS-лентах

ВерÑÐ¸Ñ 0.8.7 (25 Ðпр 2012)

  • Added: МаÑтер Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð»ÐµÐ½Ñ‚Ñ‹. Можно иÑпользовать ÑÑылку Ñайта - маÑтер ищет ленту Ñам
  • Added: Панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñтроенного браузера
  • Added: Мышиные жеÑты во вÑтроенном браузере: влево, вправо
  • Added: Стили Ð¾Ñ„Ð¾Ñ€Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ: ÑиÑтемный, Ñерый, зеленый, оранжевый, фиолетовый, розовый (Меню "Вид")
  • Added: Кнопка очиÑтки во вÑе LineEdit
  • Added: ФранцузÑкий Ñзык
  • Changed: GUI. Ðебольшие визуальные изменениÑ
  • Changed: При импорте лент возможен выбор файла Ñ Ñ€Ð°Ñширением xml
  • Fixed: Открытие некоторых ÑÑылок во вÑтроенном браузере
  • Fixed: Меню вкл/выкл показа колонок ÑпиÑка новоÑтей

ВерÑÐ¸Ñ 0.8.6 (02 Ðпр 2012)

  • Added: ÐвтоматичеÑÐºÐ°Ñ Ð¾Ñ‡Ð¸Ñтка лент("ÐаÑтройка->ÐовоÑтные ленты->ОчиÑтка")
  • Added: ÐžÐ¿Ñ†Ð¸Ñ "Показывать иконку в трее"
  • Added: ÐžÐ¿Ñ†Ð¸Ñ "Повторно открывать поÑледнюю открытую ленту при запуÑке"
  • Added: ÐžÐ¿Ñ†Ð¸Ñ "Показать заÑтавку при запуÑке"
  • Added: ÐžÐ¿Ñ†Ð¸Ñ "Показывать опиÑание новоÑти вмеÑто загрузки веб-Ñтраницы"
  • Added: Ðемецкий Ñзык
  • Changed: GUI. Ðебольшие визуальные изменениÑ
  • Fixed: Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка приложениÑ
  • Fixed: У некоторых лент не загружалиÑÑŒ новоÑти
  • Fixed: При удалении новоÑти, курÑор ÑтавилÑÑ Ð½Ð° предыдущую новоÑть
  • Fixed: Удаление лент
  • Fixed: CTRL+A в ÑпиÑке новоÑтей
  • Fixed: ÐаÑтройка горÑчих клавиш
  • Fixed: Повторное открытие новоÑти

ВерÑÐ¸Ñ 0.8.5 (26 Мар 2012)

  • Added: Удаление новоÑти горÑчей клавишей
  • Added: Открытие новоÑти по нажатию Ñредней клавиши мыши
  • Added: Добавлены наÑтройки горÑчих клавиш
  • Changed: GUI. Ðебольшие визуальные изменениÑ
  • Fixed: Уменьшено Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑка приложениÑ
  • Fixed: ИзменÑющийÑÑ Ñ€Ð°Ð·Ð¼ÐµÑ€ заÑтавки
  • Fixed: Открытие домашней Ñтраницы автора во внутреннем браузере
  • Fixed: Получение URL-ÑÑылки на новоÑти и домашние Ñтраницы
  • Fixed: Убрана Ð¾Ñ‚Ð»Ð°Ð´Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ, Ð²Ñ‹Ð²Ð¾Ð´Ð¸Ð¼Ð°Ñ Ð² конÑоль поÑтоÑнно

ВерÑÐ¸Ñ 0.8.4 (21 Мар 2012)

  • Added: ЗаÑтавка при запуÑке программы
  • Added: Проверка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ при запуÑке
  • Added: ВозможноÑть Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð²Ð°Ð»Ð° Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð»ÐµÐ½Ñ‚ в чаÑах
  • Changed: GUI. Иконки приведены к общему Ñтилю
  • Changed: GUI. Подправлена панель браузера
  • Changed: УÑкорено переключение между новоÑÑ‚Ñми
  • Changed: УÑкорено удаление неÑкольких новоÑтей одновременно
  • Fixed: Ðа некоторых ÑиÑтемах Windows не отображалиÑÑŒ картинки во вÑтроенном браузере из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ¸
  • Fixed: Положение курÑора, еÑли номер выбранной новоÑти больше 256
  • Fixed: Положение курÑора, еÑли Ñразу неÑколько новоÑтей отметить прочитанными
  • Fixed: СбраÑывалоÑÑŒ отображение новоÑти при обновлении лент или Ñворачивании в трей

ВерÑÐ¸Ñ 0.8.3 (25 Фев 2012)

  • Added: ÐžÐ¿Ñ†Ð¸Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ plugins и java-scripts вÑтроенного браузера
  • Added: Отображение количеÑтва прочитанных байт в прогреÑÑ Ð±Ð°Ñ€Ðµ вÑтроенного браузера
  • Added: При наведении на ÑÑылку, она отображаетÑÑ Ð² Ñтроке ÑтатуÑа
  • Added: ÐžÐ¿Ñ†Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ñ€Ñ‹Ð²Ð°Ð½Ð¸Ñ Ð·Ð²ÑƒÐºÐ° поÑле Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñтей
  • Changed: Сохранение базы из памÑти в файл и обратно перенеÑено в отдельный поток
  • Fixed: Клик по ÑÑылкам, когда иÑпользуетÑÑ Ð²Ñтроенный браузер
  • Fixed: ОтÑутÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð´Ð°Ñ‚Ð° ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти заменÑетÑÑ Ð´Ð°Ñ‚Ð¾Ð¹ приема новоÑти
  • Fixed: Клавиши курÑора "вверх/вниз" в ÑпиÑке лент
  • Fixed: Сохранение наÑтроек и базы при завершении ÑеанÑа, когда уÑтановлена Ð¾Ð¿Ñ†Ð¸Ñ "минимизировать в трей"
  • Fixed: ИÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ GUI
  • Fixed: ÐžÐ¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ базы когда выбраны неÑколько новоÑтей
  • Рефакторинг началÑÑ...

Version 0.8.2 (10 Feb 2012)

  • Added: Feed icon in feed list and tab(More...)
  • Added: Export feeds to OPML-file
  • Fixed: SQLite for Qt 4.8.0 and Qt 4.7.x
  • Fixed: Some feed parsing issues
  • Fixed: Some GUI display issues

Version 0.8.1 (6 Feb 2012)

  • Added: Internal browser
  • Fixed: Cyrillic letters in application path
  • Fixed: SQLite for Qt 4.8.0
  • Fixed: NetworkManager move to his own thread
  • Fixed: News list don't scrool while click on column "read/unread" if cursor is out of view
  • Fixed: Request url queues while update feeds
  • Fixed: Parsing "alternate" url of the news of Atom-feeds
  • Fixed: TrayMenu is not appear sometimes

Version 0.8.0 (31 Jan 2012)

  • Added: Sumiltaneous update up to 8 feeds

Version 0.7.6 (28 Jan 2012)

  • ...Old release. No need to document it ;)
quiterss-0.18.3/INSTALL000066400000000000000000000032551265173051100145210ustar00rootroot00000000000000Build depends: GCC or Clang compiler SQLite version 3.6.19 or newer Qt version 4.7.* or 4.8.* or 5.4.* Required Qt development tools: qmake lrelease Required Qt libraries: QtCore QtGui QtNetwork QtSql compiled with sqlite support QtWebKit QtXml Instructions for Linux and other UNIX-like systems: mkdir _build && cd _build qmake CONFIG+=release PREFIX=/usr ../QuiteRSS.pro make -j3 make install Instead of -j3 make option you can use -j. For making debug build use CONFIG+=debug instead of CONFIG+=release. By default qmake uses gcc, for using clang you need to alter qmake command: qmake QMAKE_CC=clang QMAKE_CXX=clang++ QMAKE_LINK=clang++ QMAKE_LINK_C=clang CONFIG+=release PREFIX=/usr ../QuiteRSS.pro For building with system qtsingleapplication add SYSTEMQTSA=1 to qmake command. For building without phonon add DISABLE_PHONON=1 to qmake command. Instruction for Windows: Visual Studio: qmake CONFIG-=debug_and_release CONFIG-=debug -tp vc -platform win32-msvc2013 Due to a qmake bug, you will need to manually edit the generated .vcxproj and .filters file, to fix error messages on opening VS2013. To do this, identify the duplicate set of items based on the error message (all within the same item group), and delete from the starting tag, to the closing tag. Instructions for Mac OS: cd /path/to/build qmake -recursive -spec macx-g++ CONFIG+=release CONFIG+=x86_64 /path/to/quiterss/QuiteRSS.pro make -j3 make install cd /path/to/build/release/target macdeployqt quiterss.app/ -dmg Instead of -j3 make option you can use -j. quiterss-0.18.3/Info.plist000066400000000000000000000016731265173051100154420ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleIconFile @ICON@ CFBundlePackageType APPL CFBundleGetInfoString @EXECUTABLE@ (C) 2011-2016 QuiteRSS Team CFBundleSignature @TYPEINFO@ CFBundleExecutable @EXECUTABLE@ CFBundleIdentifier org.quiterss.QuiteRSS CFBundleName @EXECUTABLE@ CFBundleDisplayName @EXECUTABLE@ CFBundleShortVersionString 0.18.3 NSHumanReadableCopyright (C) 2011-2016 QuiteRSS Team quiterss-0.18.3/QuiteRSS.doxygen000066400000000000000000002334051265173051100165500ustar00rootroot00000000000000# Doxyfile 1.8.2 # 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 #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or sequence of words) that should # identify the project. Note that if you do not use Doxywizard you need # to put quotes around the project name if it contains spaces. PROJECT_NAME = QuiteRSS # 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 = v0.10.3 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer # a quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = "QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader" # With the PROJECT_LOGO tag one can specify an logo or icon that is # included in the documentation. The maximum height of the logo should not # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. PROJECT_LOGO = E:/Work/_Useful/QtProjects/QuiteRss/images/logo.png # 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 = E:/Work/_Useful/QtProjects/QuiteRss/doxygen # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # 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: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, # Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English # messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, # Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, # Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. OUTPUT_LANGUAGE = English # 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 = YES # 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 = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # 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. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. Note that you specify absolute paths here, but also # relative paths, which will be relative from the directory where doxygen is # started. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful if your file system # 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 regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # 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 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 the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = 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 = 8 # 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 = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding # "class=itcl::class" will allow you to use the command class in the # itcl::class meaning. TCL_SUBST = # 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 OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, # and language is one of the parsers supported by doxygen: IDL, Java, # Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, # C++. For instance to make doxygen treat .inc files as Fortran files (default # is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note # that for custom extensions you also need to set FILE_PATTERNS otherwise the # files are not read by doxygen. EXTENSION_MAPPING = # If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all # comments according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you # can mix doxygen, HTML, and XML commands with Markdown formatting. # Disable only in case of backward compatibilities issues. MARKDOWN_SUPPORT = YES # When enabled doxygen tries to link words that correspond to documented classes, # or namespaces to their corresponding documentation. Such a link can be # prevented in individual cases by by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also makes the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES (the # default) will make doxygen replace the get and set methods by a property in # the documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = 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 # 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 # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and # unions are shown inside the group in which they are included (e.g. using # @ingroup) instead of on a separate page (for HTML and Man pages) or # section (for LaTeX and RTF). INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and # unions with only public data fields will be shown inline in the documentation # of the scope in which they are defined (i.e. file, namespace, or group # documentation), provided this scope is documented. If set to NO (the default), # structs, classes, and unions are shown on a separate page (for HTML and Man # pages) or section (for LaTeX and RTF). INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penalty. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will roughly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. SYMBOL_CACHE_SIZE = 0 # Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be # set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given # their name and scope. Since this can be an expensive process and often the # same symbol appear multiple times in the code, doxygen keeps a cache of # pre-resolved symbols. If the cache is too small doxygen will become slower. # If the cache is too large, memory is wasted. The cache size is given by this # formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # 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 = YES # 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_PACKAGE tag is set to YES all members with package or internal # scope will be included in the documentation. EXTRACT_PACKAGE = NO # 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 # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespaces are hidden. EXTRACT_ANON_NSPACES = NO # 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 # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # 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 FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen # will list include files with double quotes in the documentation # rather than with sharp brackets. FORCE_LOCAL_INCLUDES = NO # 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 # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen # will sort the (brief and detailed) documentation of class members so that # constructors and destructors are listed first. If set to NO (the default) # the constructors will appear in the respective orders defined by # SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. # This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO # and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to # do proper type resolution of all parameters of a function it will reject a # match between the prototype and the implementation of a member function even # if there is only one candidate or it is obvious which candidate to choose # by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen # will still accept a match between prototype and implementation in such cases. STRICT_PROTO_MATCHING = NO # 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 macro 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 macros 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 # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files # containing the references data. This must be a list of .bib files. The # .bib extension is automatically appended if omitted. Using this command # requires the bibtex tool to be installed. See also # https://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style # of the bibliography can be controlled using LATEX_BIB_STYLE. To use this # feature you need bibtex and perl available in the search path. CITE_BIB_FILES = #--------------------------------------------------------------------------- # 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_NO_PARAMDOC option can be enabled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # 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. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) 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 = E:/Work/_Useful/QtProjects/QuiteRss/src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See https://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # 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++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.f90 \ *.f \ *.for \ *.vhd \ *.vhdl # 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 be # 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. # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system 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. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = # 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. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty or if # non of the patterns match the file name, INPUT_FILTER is applied. FILTER_PATTERNS = # 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 # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) # and it is also possible to disable source filtering for a specific pattern # using *.ext= (so without naming a filter). This option only has effect when # FILTER_SOURCE_FILES is enabled. FILTER_SOURCE_PATTERNS = #--------------------------------------------------------------------------- # 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, C++ and Fortran comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see https://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # 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 = YES # 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. Note that when using a custom header you are responsible # for the proper inclusion of any scripts and style sheets that doxygen # needs, which is dependent on the configuration options used. # It is advised to generate a default header using "doxygen -w html # header.html footer.html stylesheet.css YourConfigFile" and then modify # that header. Note that the header is subject to change so you typically # have to redo this when upgrading to a newer version of doxygen or when # changing the value of configuration settings such as GENERATE_TREEVIEW! 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 left blank doxygen will # generate a default style sheet. Note that it is recommended to use # HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this # tag will in the future become obsolete. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify an additional # user-defined cascading style sheet that is included after the standard # style sheets created by doxygen. Using this option one can overrule # certain style aspects. This is preferred over using HTML_STYLESHEET # since it does not replace the standard style sheet and is therefor more # robust against future updates. Doxygen will copy the style sheet file to # the output directory. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that # the files will be copied as-is; there are no commands or markers available. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. # Doxygen will adjust the colors in the style sheet and background images # according to this color. Hue is specified as an angle on a colorwheel, # see https://en.wikipedia.org/wiki/Hue for more information. # For instance the value 0 represents red, 60 is yellow, 120 is green, # 180 is cyan, 240 is blue, 300 purple, and 360 is red again. # The allowed range is 0 to 359. HTML_COLORSTYLE_HUE = 130 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of # the colors in the HTML output. For a value of 0 the output will use # grayscales only. A value of 255 will produce the most vivid colors. HTML_COLORSTYLE_SAT = 98 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to # the luminance component of the colors in the HTML output. Values below # 100 gradually make the output lighter, whereas values above 100 make # the output darker. The value divided by 100 is the actual gamma applied, # so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, # and 100 does not change the gamma. HTML_COLORSTYLE_GAMMA = 112 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting # this to NO can help when comparing the output of multiple runs. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of # entries shown in the various tree structured indices initially; the user # can expand and collapse entries dynamically later on. Doxygen will expand # the tree to such a level that at most the specified number of entries are # visible (unless a fully collapsed tree already exceeds this amount). # So setting the number of entries 1 will produce a full collapsed tree by # default. 0 is a special value representing an infinite number of entries # and will result in a full expanded tree by default. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html # for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely # identify the documentation publisher. This should be a reverse domain-name # style string, e.g. com.mycompany.MyDocSet.documentation. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. DOCSET_PUBLISHER_NAME = Publisher # 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 compiled 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 CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # 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 # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated # that can be used as input for Qt's qhelpgenerator to generate a # Qt Compressed Help (.qch) of the generated HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = doc # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to # add. For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see # # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's # filter section matches. # # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files # will be generated, which together with the HTML files, form an Eclipse help # plugin. To install this plugin and make it available under the help contents # menu in Eclipse, the contents of the directory containing the HTML and XML # files needs to be copied into the plugins directory of eclipse. The name of # the directory within the plugins directory should be the same as # the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before # the help appears. GENERATE_ECLIPSEHELP = NO # A unique identifier for the eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have # this name. ECLIPSE_DOC_ID = org.doxygen.Project # The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) # at top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. Since the tabs have the same information as the # navigation tree you can set this option to NO if you already set # GENERATE_TREEVIEW to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value 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 (i.e. any modern browser). # Windows users are probably better off using the HTML help feature. # Since the tree basically has the same information as the tab index you # could consider to set DISABLE_INDEX to NO when enabling this option. GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values # (range [0,1..20]) that doxygen will group on one line in the generated HTML # documentation. Note that a value of 0 will completely suppress the enum # values from appearing in the overview section. ENUM_VALUES_PER_LINE = 4 # 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 # When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open # links to external symbols imported via tag files in a separate window. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are # not supported properly for IE 6.0, but are supported on all modern browsers. # Note that when changing this option you need to delete any form_*.png files # in the HTML output before the changes have effect. FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax # (see https://www.mathjax.org) which uses client side Javascript for the # rendering instead of using prerendered bitmaps. Use this if you do not # have LaTeX installed or if you want to formulas look prettier in the HTML # output. When enabled you may also need to install MathJax separately and # configure the path to it using the MATHJAX_RELPATH option. USE_MATHJAX = NO # When MathJax is enabled you need to specify the location relative to the # HTML output directory using the MATHJAX_RELPATH option. The destination # directory should contain the MathJax.js script. For instance, if the mathjax # directory is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to # the MathJax Content Delivery Network so you can quickly see the result without # installing MathJax. However, it is strongly recommended to install a local # copy of MathJax from https://www.mathjax.org before deployment. MATHJAX_RELPATH = https://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension # names that should be enabled during MathJax rendering. MATHJAX_EXTENSIONS = # When the SEARCHENGINE tag is enabled doxygen will generate a search box # for the HTML output. The underlying search engine uses javascript # and DHTML and should work on any modern browser. Note that when using # HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets # (GENERATE_DOCSET) there is already a search function so this one should # typically be disabled. For large projects the javascript based search engine # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a PHP enabled web server instead of at the web client # using Javascript. Doxygen will generate the search PHP script and index # file to put on the web server. The advantage of the server # based approach is that it scales better to large projects and allows # full text search. The disadvantages are that it is more difficult to setup # and does not have live searching capabilities. SERVER_BASED_SEARCH = NO #--------------------------------------------------------------------------- # 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 = NO # 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. # Note that when enabling USE_PDFLATEX this option is only used for # generating bitmaps for formulas in the HTML output, but not in the # Makefile that is written to the output directory. 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, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4 # 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 = # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for # the generated latex document. The footer should contain everything after # the last chapter. If it is left blank doxygen will generate a # standard footer. Notice: only use this tag if you know what you are doing! LATEX_FOOTER = # 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 = YES # 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 = YES # 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 # If LATEX_SOURCE_CODE is set to YES then doxygen will include # source code with syntax highlighting in the LaTeX output. # Note that which sources are shown also depends on other settings # such as SOURCE_BROWSER. LATEX_SOURCE_CODE = NO # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See # https://en.wikipedia.org/wiki/BibTeX for more info. LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- # 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 style sheet 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_DEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # pointed to by INCLUDE_PATH will be searched when 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. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. 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 that # overrules the definition found in the source code. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all references to function-like macros # that are alone on a line, have an all uppercase name, and do not end with a # semicolon, because these will confuse the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. For each # tag file the location of the external documentation should be added. 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. 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 also works with HAVE_DOT disabled, but it is recommended to # install and use dot, since it yields more powerful graphs. CLASS_DIAGRAMS = NO # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # 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 = YES # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is # allowed to run in parallel. When set to 0 (the default) doxygen will # base this on the number of processors available in the system. You can set it # explicitly to a value larger than 0 to get control over the balance # between CPU load and processing speed. DOT_NUM_THREADS = 0 # By default doxygen will use the Helvetica font for all dot files that # doxygen generates. When you want a differently looking font you can specify # the font name using DOT_FONTNAME. You need to make sure dot is able to find # the font, which can be done by putting it in a standard location or by setting # the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. DOT_FONTNAME = Helvetica # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the Helvetica font. # If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to # set the path where dot can find it. DOT_FONTPATH = # 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 # 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 GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = 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 the UML_LOOK tag is enabled, the fields and methods are shown inside # the class node. If there are many fields or methods and many nodes the # graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS # threshold limits the number of items for each type to make the size more # managable. Set this to 0 for no limit. Note that the threshold may be # exceeded by 50% before the limit is enforced. UML_LIMIT_NUM_FIELDS = 10 # 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 options 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 = YES # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller 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 caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = YES # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will generate a graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are svg, png, jpg, or gif. # If left blank png will be used. If you choose svg you need to set # HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible in IE 9+ (other browsers do not have this requirement). DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # Note that this requires a modern browser other than Internet Explorer. # Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you # need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files # visible. Older versions of IE do not have SVG support. INTERACTIVE_SVG = NO # 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 in 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 MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the # \mscfile command). MSCFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # 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 the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # 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 quiterss-0.18.3/QuiteRSS.ico000066400000000000000000013226261265173051100156520ustar00rootroot00000000000000 ( f€€ (Ž @@ (B¶(00 ¨%Þj  ¨† h.¡( ‘‘‘˜˜˜ŸŸŸ§§§««««««¨¨¨™™™€€€gggTTTSSSLLLLLLLLLIIIIIIIIIHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII<<<“““™™™™™™™™™˜˜˜””” ‘‘‘ „„„ sss ``` RRR QQQ LLL KKK LLL III HHH III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III III IIIIIIIIIIIIIIIIIIIIIIII<<<@@@“““–––ššš“““ŒŒŒ ………  xxx ooo ddd ZZZ RRR PPP MMM KKK LLL JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ JJJ <<<@@@€€€ ƒƒƒ xxx ooo ggg___YYYSSSMMMIIIFFFDDDCCCAAAAAA@@@AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@@@@@@666===€€€€€€ ttt ddd\\\WWWQQQJJJCCC<<<777111---)))%%%%%%$$$$$$$$$###########################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################%%%%%% :::ƒƒƒƒƒƒƒƒƒ vvvXXX:::666666222---'''!!! !"!  555OOO222eeelll qqqbbbDDD((($$$$$$!!!   ""##################################################################################################################################################################################################$%&$$$"!! !!  222/// 555BBBKKKEEE444""" "#$$%&&''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''('&&%#"!!  ///¯¯¯ '''***### " # #$%'((())****************************************************************************************************************************************************************************************************))('%#"!  ///OOO///  !#$% &'(()+,,,,--.................................................................................................................................................................................................-,,+*)'%$######"!  ///  # %(***+,-..////0111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110/.-,*)'&%%&''&%$"! ///  #%(+-../011222233455555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555554210/.,+*))*++*)'%#! /// !$'*,.../000122334555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555433210/...-,++*(%#  ////// "&),-./124679;:336888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888776556520.-,*(%" ////// $'*-/ 1  ;(M4_7k7p6q5r5s6s(e'd%e$e$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$f$e$e$d$d$d$d$b$_$^$]$\$[%Z$W  @' ////// #&') / >1L%J&d=v?–IKÍKLÖILÖIKÖE‡HÍD‡GÎDˆFÐL—OÛD‰GÑ9w=¿/f2±/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2°/f2¯/f2®/f2­/f2¬/f2¬/f2¬/g3«1i3«/f1§?q  7 ////// $(()  >,W.lB„E§J’M¼T¢VæY«[ôY¬\ñX«[òU¨YëS¦WìQ¥UîP¦TòP¨T÷P©TúN¦RõN¦RñM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QðM§QïM§QïM§QïM§QïN§QïO«SðM¥Qá/f1Ÿ$F ////// #')  8=_JLÇW§ZêXª[õXª[ùXª[üW©[øV©ZôV¨YøU¨XöP¦TóN¦RõN§RúO¨SýOªSþP«TþP¬TþP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP¬TÿP­TÿP­TÿP­TÿP­TÿR±VÿO«Sî1i3¢%F ////// !'+1KA‚D³T¢WíX«\ûW¨Z÷W¨ZûX¨[úV¨ZûU§YüU§XýS§WüR§UûN§RùN§RûN§RüN§RþN§RýN¨RþN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN©RÿN©RÿO©SÿO©SÿP­TÿN§Qí/g3 $E //////  '%=*S+nOšRÝY«\úW©ZúV¨Y÷V§YùV§YúV§YûT§WüO¦SüO§SýO¨SýO¨SýO¨SþO©SþO©SþP©SþP©SþP©SÿP©SÿP©RÿP©RÿP©RÿP©RÿP©RÿP©RÿP©RÿP©SÿP©SÿO©SÿO©SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO¨SÿO©SÿO©SÿN¨RÿN¨RÿN¨RÿN¨RÿO©SÿO©SÿP­TÿM§Qí/f2 $E ////// +; WGŠJÂU¤XïXª[ýW©ZûW¨ZøV§YùV§YûS¦VöQ§TøP¨RûP©RüRªTýR«UýT¬VþU­WÿV®XÿW®YÿX¯YÿY¯ZÿZ°ZÿZ°ZÿY°ZÿY°ZÿY°ZÿY°ZÿY°ZÿY°ZÿY°ZÿX¯ZÿW®XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿV­XÿT­WÿR«UÿO©SÿN¨RÿN¨RÿO©SÿO©SÿP­TÿM§Qí/f2 $E //////   0*O,oN—QÙY¬\ûW©ZþW¨ZüW¨ZúV§YúU§XùR§UöR¨TøRªTûT«VüU­WýW®XýZ°Zþ[±\ÿ]²]ÿ_´^ÿaµ`ÿc·`ÿd·aÿc¸bÿd·bÿc·bÿc·bÿc·bÿc·bÿd·bÿc·bÿ`µ`ÿ^³^ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ\²\ÿ[±\ÿV­XÿQªTÿN¨RÿN¨RÿO©SÿO©SÿP­TÿM§Qí/f2 $E ////// 3.V/wP˜RØX¬\üX¨[ýW¨ZýW¨ZýV§YûR¦UöR¨U÷S©UùU«VûV­XüY¯YýZ°[ý^³^þ`´`ÿc¶aÿe¸cÿh¹dÿiºeÿj»fÿk¼gÿj¼gÿj¼hÿj¼hÿj¼hÿj¼hÿj¼hÿj¼hÿhºeÿf¹dÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd·bÿd¸bÿ[±\ÿQ«UÿN¨RÿN¨RÿO©SÿO©SÿP­TÿM§Qí/f2 $E ////// 4/U1yP˜SÛY¬\úX©[ùV§ZûV§YüU§XûQ§U÷R¨UøT«VúW­XüY¯Zü\±\ý^²]ýbµ`þe·cÿg¹dÿiºfÿk¼gÿl½iÿn¾jÿn¿jÿo¿kÿo¿lÿo¿lÿo¿lÿo¿lÿo¿lÿo¿kÿo¿jÿn¿jÿn¾iÿn¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¾iÿo¿jÿo¿jÿn¾iÿb¶_ÿT¬VÿM¨RÿN¨RÿN¨RÿN©RÿP­TÿM§Qí/f2 $E ////// 4/U1zQ—SØYª\ôX©\ïU§YùU§YüT§XûQ¨UúSªVúV¬XûY¯Zü\±\ü_³^ýa´`ýf¸cþiºfÿk¼gÿm½iÿo¿kÿpÀlÿrÁmÿsÂnÿtÃoÿuÃoÿuÃpÿuÃpÿuÃpÿuÃoÿuÃoÿvÄoÿwÄpÿxÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿyÅpÿxÆqÿyÆqÿwÅpÿg¹dÿV­WÿM¨QÿM¨RÿN¨RÿN©RÿP­TÿM§Qí/f2 $E ////// 5-S/yMŽOÂZ¨]êX¨[ùU§YúU§XûR§VùSªVúU¬XûY®Zü\±\ü`³^ýcµaýf·cýj»gþm½iÿp¿kÿrÁmÿtÃoÿvÄpÿwÅqÿxÅrÿyÆrÿzÇsÿ{Çsÿ{Çsÿ{ÇsÿzÇsÿzÇsÿ{Ètÿ~Éuÿ€Êvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Ëvÿ€Êwÿ~Êuÿ}ÈsÿxÆqÿj¼gÿZ±[ÿQ«TÿO©TÿN¨RÿN¨RÿP¬TÿM§Qí/f2 $E //////  5*Q,xJ‹LÂW§ZòX©[üU§XüR¦VøS¨VùT«WúX®Yû[°[ü_³^ücµaýg¸dýjºfýo¾jþrÁmÿuÃpÿxÅrÿzÇsÿ|Èuÿ}Évÿ~ÉvÿÊvÿÊvÿ€Ëvÿ€Ëvÿ€ËwÿÊwÿÊwÿËxÿ„Îzÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ð|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿ†Ï|ÿƒÍyÿ~ÊuÿxÅqÿl½iÿ`µ`ÿX¯YÿS¬VÿO¨RÿN¨RÿP¬TÿM§Qí/f2 $E ////// ((P)}I’LÓX¬[÷W¨ZüP¤TôR¦U÷UªWúX®Zü\±\ü`´_üd·býh¹eýl¼hýp¿kþsÂnþwÅqÿzÇsÿ}ÉuÿÊwÿ€ËxÿÌyÿ‚Ìyÿ‚ÍyÿƒÍyÿ„Íyÿ„Ízÿ„ÍzÿƒÍzÿƒÍzÿ…Ï|ÿˆÑ~ÿŒÔ€ÿŒÔ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿŒÓ€ÿ‹ÒÿŠÒ€ÿ‹ÓÿŠÓÿ‹Óÿ‹ÓÿŠÓÿŠÓ€ÿŠÓÿŒÓÿŒÓÿ†Ï|ÿ€ÊwÿxÅqÿn¾jÿd·cÿ\²\ÿV­XÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// (&P(G“JØS«WùR©U÷Q§T÷TªUùW­YûZ°[ü^´^üb·aügºeýk¼hýo¾lýsÁnþxÄqÿ{Çsÿ}Éuÿ€ËwÿÍxÿ‚Íyÿ„ÍzÿƒÎ{ÿ„Î{ÿ…Îzÿ…Ïzÿ…Ïzÿ…Ïzÿ…Îzÿ„Îzÿ†Ï|ÿŠÑ~ÿŒÓÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÓÿŒÒÿ‹Òÿ‰Òÿ‰Òÿ‰Ò€ÿŠÓ€ÿŠÓ€ÿŠÓÿŠÓ€ÿŒÓÿŒÓÿ‡Ï}ÿ€ÊxÿxÅqÿn¾jÿd¸cÿ\²\ÿV­XÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// *%P'ƒE“HÝQ¬UúRªUûR©TúU¬WûY¯Zü]²]üaµ`üe¸düj¼gýn¾kýsÁnýwÄqþ{Çsÿ~Êvÿ€Ìwÿ‚Íyÿ„Îzÿ…Îzÿ…Ï{ÿ…Ï{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ…Ï{ÿ…Ï{ÿ‡Ð}ÿ‰ÑÿŒÓ€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ó€ÿ‹Ò€ÿŠÒÿˆÑ~ÿˆÑ~ÿ‰Ñ~ÿ‰Òÿ‰Òÿ‰ÒÿŠÒ€ÿŒÒ€ÿ‹Ó€ÿ‡Ï}ÿÊxÿxÆrÿn¿jÿd¸cÿ\²\ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…C“HßQ¬TûR«UýS«UüV­Xü[°[ü_³^ýc¶býhºfým½iýqÁmývÄqýyÆsþ}ÉuÿËxÿ‚Íyÿ„Îzÿ…Ï{ÿ†Ï{ÿ‡Ï{ÿ†Ð{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ…Ð{ÿ†Ð|ÿˆÑ}ÿ‰ÒÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿŠÒ~ÿ‰Ò~ÿˆÑ~ÿˆÑ}ÿ‡Ð}ÿ‡Ñ}ÿ‡Ñ}ÿˆÑ~ÿˆÑ~ÿ‰ÑÿŠÒ€ÿŒÒ€ÿŒÓÿ‡Ð}ÿ€ËwÿyÆrÿo¿jÿe¸cÿ\²\ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HßQ¬TüR¬UýS«VüW®Yü\±\üa´`ýf¸dþk»hþo¿kþtÂoýxÅrý|ÈuþÊxÿ‚ÌyÿƒÎ{ÿ…Ï{ÿ…Ï{ÿ…Ï{ÿ…Ïzÿ„Ðzÿ„Ñzÿ„Ñzÿ„ÑzÿƒÑyÿƒÑyÿƒÑyÿƒÐyÿƒÐyÿ„Ð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ÿ„Ð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ÿ„Ð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ÿ„Ð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ÿ„Ðzÿ„Ðzÿ„Ðzÿ„Ðzÿ„Ðzÿ„Ðzÿ„Ðzÿ„Ðzÿ…Ð{ÿ…Ð{ÿ†Ñ|ÿ†Ñ|ÿˆÑ}ÿ‰Ñ~ÿŠÒÿŒÒ€ÿÓÿ‡Ï}ÿËxÿzÆrÿp¿kÿe¸cÿ\²\ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HßQ¬UüR¬UýS«VüX¯Zü]²^ücµaýh¹eþm½jþrÀmþvÄqý{Çtý~ÉwþÌyÿƒÎzÿ„Î{ÿ…Ï{ÿ…Ð{ÿ„Ïzÿ„ÏzÿƒÐyÿƒÐyÿƒÐyÿ‚Ðxÿ‚Ðxÿ‚Ðxÿ‚Ðxÿ‚ÐxÿÏwÿ€ÏwÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿÏvÿ€ÏwÿÏxÿ‚ÏyÿƒÐyÿ„Ðzÿ…Ñ{ÿ‡Ñ|ÿ‰Ñ~ÿŠÒÿ‹Ó€ÿÓÿˆÐ~ÿËyÿzÆsÿp¿kÿe¸cÿ]²\ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HßQ¬UüR¬VýT¬VýY¯Zý^³^ýd¶býiºfýo¾kýsÁnýxÅrý}Èuý€ÊwþƒÌzÿ„Î{ÿ„Ï{ÿ…Ï{ÿ„ÐzÿƒÏzÿƒÏyÿ‚Ïxÿ‚ÏxÿÏwÿÏwÿÏwÿÏwÿÏxÿÏwÿ€ÏvÿÏvÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏuÿÏvÿ€ÏvÿÏwÿ‚ÏxÿƒÐyÿ„Ðzÿ†Ñ|ÿˆÑ~ÿŠÒÿ‹Ô€ÿŽÔ‚ÿˆÐÿ€ÌxÿyÆsÿo¿kÿe¸cÿ]²]ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HßQ­UüS¬VýT¬VýY°Zý_³_ýd·cýj»gýp¿lýuÃpýzÆsýÉvý‚Ëxþ„Ízÿ…Î{ÿ…Ï{ÿ„Ðzÿ„ÐzÿƒÏyÿ‚ÏxÿÏxÿÏwÿ€Ïvÿ€Ïvÿ€ÏvÿÏvÿÏvÿÏvÿÏvÿÏuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿÐuÿ€Ïvÿ€ÏvÿÏwÿ‚ÏxÿƒÐyÿ…Ñ{ÿˆÑ}ÿŠÒÿ‹Ô‚ÿÔƒÿ‰Ð~ÿÌxÿyÆsÿo¿kÿe¸dÿ]²]ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D’HßQ­UüS­VþT¬VþZ°[þ_´_þe¸dþk¼hþqÀmþwÄqþ{ÇuþÊwþƒÌyþ…Ízÿ†Ï{ÿ…Ï{ÿ„ÐzÿƒÐyÿ‚ÐxÿÐxÿ€Ðwÿ€ÐvÿÐuÿÐuÿÐuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðuÿ~ÐuÿÐuÿÐuÿÏuÿ€ÏvÿÏxÿƒÐyÿ…Ð{ÿ‡Ñ}ÿ‰ÒÿŒÔ‚ÿŽÔƒÿ‰Ðÿ‚ÌyÿzÆsÿp¿kÿe¸dÿ]²]ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D’HßQ­UüS­VÿT¬VÿZ°[ÿ_³_ÿe·cÿl¼hÿrÀmÿxÄqÿ}ÈvÿËyÿ„Í{ÿ…Î{ÿ†Ï|ÿ…Ï{ÿ„ÏzÿƒÏyÿ‚Ïxÿ€Ðwÿ€ÐvÿÐvÿÐuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðvÿ~Ðuÿ~ÐuÿÐuÿÐuÿ€ÏvÿÏxÿƒÐyÿ…Ð{ÿˆÑ}ÿŠÒÿÔ‚ÿÔƒÿ‰Ð€ÿÌzÿ{Æsÿp¿lÿe¸dÿ]²]ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D’HÞQ­UüS­VÿT¬VÿZ°Zÿ_³_ÿe·cÿl¼hÿsÁnÿyÅrÿ~ÈwÿƒÌzÿ…Í|ÿ…Î|ÿ†Ï|ÿ†Ï|ÿ…Ï{ÿƒÏyÿÏxÿ€ÐwÿÐvÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðvÿ~Ðvÿ~ÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðvÿ~Ðvÿ~Ðvÿ~ÐuÿÐuÿ€ÏvÿÏxÿƒÐyÿ…Ð{ÿˆÑ}ÿŠÒÿÔÿŽÔ„ÿŠÐ€ÿ‚ÌyÿzÆtÿp¿lÿf¸dÿ]²]ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D’HÞQ­UüS¬VÿT¬VÿZ°Zÿ_³_ÿe·cÿm¼iÿtÁnÿzÆsÿ~Êwÿ„Ì{ÿ…Î{ÿ†Ï|ÿ†Ð|ÿ†Ð|ÿ…Ð{ÿƒÏzÿÏyÿ€ÐwÿÐvÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðvÿ~Ðvÿ~Ðuÿ~Ðuÿ€ÏvÿÏxÿƒÐyÿ…Ð{ÿˆÑ}ÿŠÒ€ÿŒÔÿÕƒÿŠÐ€ÿƒËzÿ{Ætÿp¿lÿf¸dÿ]²]ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞQ­UüS«VÿT¬VÿZ¯[ÿ_³_ÿe·dÿm¼iÿtÁoÿzÆsÿÉwÿ„Í{ÿ…Î|ÿ†Ï|ÿ†Ð|ÿ…Ð{ÿ„ÐzÿƒÏzÿÏyÿ€ÐxÿÐvÿ~Ðuÿ~ÐuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðuÿ~Ïuÿ~Ïuÿ~Ïuÿ~Ïuÿ}Ïtÿ}Ïtÿ}Ïtÿ}Ïtÿ}Ïsÿ|Ïsÿ|Ïsÿ|Îsÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îsÿ|Ïsÿ|Ïsÿ|Ïsÿ}Ïtÿ}Ïtÿ}Ïtÿ}Ïtÿ~Ïuÿ~Ïuÿ~Ïuÿ~Ïuÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ïuÿ~Ïuÿ~Ïuÿ~Ïuÿ}Ïtÿ}Ïsÿ|Ïsÿ|Îsÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îsÿ|Ïsÿ|Ïsÿ}Ïtÿ}Ïtÿ~Ïuÿ~Ïuÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðuÿ~Ïuÿ~Ïuÿ~Ïuÿ~Ïuÿ}Ïtÿ|Ïsÿ|Ïsÿ|Îsÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îsÿ|Ïsÿ|Ïsÿ}Ïtÿ}Ïtÿ~Ïuÿ~Ïuÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðvÿ~Ðuÿ~Ðuÿ€ÏvÿÏxÿƒÐyÿ…Ñ{ÿˆÒ~ÿŠÒ€ÿÓƒÿÔ„ÿŠÑ€ÿ‚Ëzÿ{Ætÿp¿lÿf¸dÿ]²]ÿV­XÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞQ¬UüR¬VÿT«VÿZ¯[ÿ_³_ÿe¸dÿm½jÿtÁoÿzÆtÿ€Êxÿ…Í|ÿ†Î}ÿ†Ð|ÿ†Ð|ÿ…Ð{ÿ„ÐzÿƒÏyÿÏxÿ€ÐwÿÐvÿ~Ðuÿ~ÐuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ïuÿ~Ïuÿ~Ïuÿ~Ïuÿ}Ïuÿ}Ïtÿ}Ïtÿ}Ïtÿ}Îtÿ}Ïsÿ|Îsÿ|Ïsÿ|Îsÿ|Îsÿ|Îrÿ|Îrÿ|Îsÿ|Îsÿ|Îsÿ|Îsÿ|Îsÿ}Îtÿ}Ïtÿ}Ïtÿ}Ïtÿ~Ïtÿ~Ïuÿ~Ïuÿ~Ïuÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðuÿ~Ïuÿ~Ïuÿ~Ïtÿ}Ïtÿ}Ïtÿ}Ïsÿ|Ïsÿ|Îsÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îsÿ|Îsÿ|Ïsÿ|Îsÿ}Îtÿ}Ïtÿ~Ïtÿ~Ïuÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ïuÿ~Ïuÿ~Ïuÿ}Ïtÿ}Ïtÿ}Ïtÿ}Ïtÿ|Ïsÿ|Îsÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îrÿ|Îsÿ|Îsÿ|Ïsÿ|Îsÿ}Ïtÿ}Ïtÿ}Ïuÿ~Ïuÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðuÿ~Ðuÿ€ÏvÿÏxÿƒÐyÿ…Ò{ÿˆÒ~ÿŠÓ€ÿŽÔƒÿÔ…ÿ‹Òÿ‚Ì{ÿ{Çuÿp¿lÿf¸dÿ]²]ÿU­WÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞQ¬TüQ«UÿRªUÿX®Yÿ^²^ÿe·dÿm½jÿvÂpÿ}Çvÿ‚ËzÿˆÏÿ‰ÐÿˆÑ~ÿ‡Ñ}ÿ†Ð{ÿ„Ðzÿ‚ÏyÿÏwÿÐvÿ~Ðuÿ~Ðuÿ~ÐuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðuÿ~Ïuÿ~Ïuÿ~Ïuÿ~ÏuÿÏvÿ‚Ñzÿ†Ò~ÿ‹ÔƒÿÕˆÿ“Ö‹ÿ”×ÿ–×ÿšÙ’ÿŸÛ™ÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Ýžÿ Ûšÿ›Ù•ÿ—×ÿ•×ÿ“׌ÿ‘Ö‰ÿŒÔ„ÿ‡ÒÿƒÑ{ÿ€Ðwÿ}Ïtÿ~Ïuÿ~Ïuÿ~Ïuÿ~ÐuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ïuÿ~Ïuÿ~Ïuÿ‚Ñzÿ‡ÓÿŽÔ†ÿ˜Ù‘ÿ¢Üœÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Ýžÿ ÜšÿœÚ–ÿ—×ÿÔ…ÿƒÑzÿ}Ïtÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ïuÿ~ÏuÿÏvÿƒÑzÿˆÓ€ÿÖ‰ÿšÚ“ÿ£Üÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üžÿ¤Üÿ Û™ÿœÚ”ÿ–ØŽÿŒÔ„ÿÐyÿ}Ïuÿ~ÏuÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ~Ðuÿ~ÐuÿÏvÿÏwÿƒÐyÿ†Ò{ÿˆÓ~ÿ‹Ô€ÿŽÕ‚ÿÕ„ÿ‹ÑÿƒÍ|ÿ{Çuÿq¿mÿf¸eÿ^²^ÿU­WÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿP©SÿU­Wÿ]±]ÿd¶cÿm½jÿwÃqÿÉwÿ‡Í~ÿÓƒÿÓ‚ÿŠÒ€ÿ‰Ò~ÿ†Ñ|ÿ„Ðzÿ‚Ïxÿ€Ïwÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ïuÿ~Ïuÿ}Ïtÿ}Ïtÿ|Îsÿ|ÎsÿÐxÿˆÒ€ÿÖˆÿœÚ•ÿ¨Þ¢ÿ°áªÿ´â®ÿ¹ä´ÿÂç¾ÿÍëÉÿ×ïÔÿ×ïÔÿÖïÓÿÖïÓÿ×ïÔÿ×ðÔÿÏíÍÿÄèÀÿºäµÿ´ã¯ÿ°á«ÿªß¤ÿžÛ—ÿ’Ö‹ÿŠÓ‚ÿƒÐyÿ|Îsÿ|Îsÿ}Ïtÿ~Ïtÿ~Ïuÿ~Ïuÿ~Ïuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ïuÿ}ÏtÿÏwÿ‰Ó‚ÿ•׎ÿ¦Þ ÿ¾æ¹ÿÓîÐÿ×ïÔÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿ×ïÔÿ×ðÔÿÐíÌÿÆéÂÿºäµÿ¢Üœÿ‹Óƒÿ}Ïtÿ}Ïtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ïuÿ~ÏuÿÐxÿ‹Ôƒÿ–Øÿ©ß¤ÿÀè¼ÿÖðÓÿ×ïÔÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿÖïÓÿ×ïÔÿ×ïÔÿÎìËÿÅèÀÿ·ã²ÿŸÚ™ÿˆÒÿ}Ïtÿ}Ïtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿÏvÿÏwÿƒÐyÿ†Ò{ÿ‰Ó~ÿ‹Ô€ÿŽÕƒÿ‘Õ…ÿ‹Ñ‚ÿ„Í|ÿ{Çuÿq¿mÿg¸eÿ^²^ÿU­XÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüN©RÿN¨RÿS¬Wÿ[°\ÿcµcÿn½jÿxÄrÿ‚Êyÿ‰Ïÿ‘Ô…ÿÕ…ÿŒÓÿŠÒÿ‡Ò|ÿ„ÐzÿÏxÿ€Ïvÿ~Ðuÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ïtÿ}Ïtÿ~Ïuÿ}Ïtÿ~Ïuÿ€Ðwÿ‚ÐyÿŠÓ‚ÿ•×ÿ Ûšÿ°áªÿ¿ç»ÿËëÆÿÐìÌÿÖîÓÿâóàÿñøðÿöûöÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿ÷üöÿóúóÿåõãÿ×îÔÿÐíÍÿÌëÈÿÂè¾ÿ³â®ÿ£Ýÿ˜ØÿŒÓ„ÿƒÐyÿ€ÐxÿÎvÿ}Ïtÿ~Ïuÿ~Ïuÿ}Ïtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ïtÿ|ÏsÿÐwÿÖ‡ÿ Ü™ÿ¹ä³ÿÚñ×ÿòúñÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿ÷ûöÿóúòÿåôãÿÔîÑÿ³â®ÿ‘Ö‰ÿ|Ïsÿ|Ïsÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ïtÿ}Ïsÿ‚Ðzÿ‘ÖŠÿ¢Ü›ÿ½æ¸ÿÞòÜÿóúòÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿøü÷ÿöûöÿòùñÿãóáÿÏìÌÿ®à©ÿŒÔ„ÿ|Ïsÿ|Ïsÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}ÐtÿÏvÿÏwÿƒÐyÿ†Ò{ÿ‰Ó~ÿŒÔÿÕ„ÿÕ†ÿŒÑÿƒÍ|ÿ|Çuÿq¿mÿg¸eÿ^²^ÿU­YÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿM¨RÿS¬WÿZ°\ÿcµcÿn½kÿzÄsÿ‚ÊyÿŠÐ€ÿ‘Ô†ÿÕ…ÿŒÔ‚ÿŠÓÿˆÒ}ÿ„ÐzÿÏxÿ€Ïvÿ~Ðuÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ïtÿ}Ïtÿ}Ïtÿ}ÏsÿÏuÿ€ÐwÿˆÓÿ–׎ÿ¥Ýžÿ±á«ÿ¼å·ÿÆéÂÿÐìÍÿÙðÖÿßóÞÿãóáÿæõåÿîøíÿöú÷ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿøüùÿïùïÿçôæÿãóáÿàóßÿÛñØÿÒíÏÿÈêÄÿ¾æ¹ÿ²â®ÿ§Þ¢ÿ™Ø“ÿŠÓƒÿ€Ïxÿ~Ðuÿ}Ïtÿ|Ïsÿ}Ïtÿ}Ïtÿ}Ïtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ïtÿ|Ïsÿ€ÐvÿÖ‡ÿ Ü™ÿ¹ä´ÿÚñ×ÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿôúóÿæõäÿÔîÑÿ²â®ÿÖ‰ÿ|Ïrÿ|Ïsÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ïtÿ|ÏsÿÐyÿ‘Ö‰ÿ¢Ü›ÿ½æ¸ÿÞòÛÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿòùñÿäóâÿÏìÍÿ®à¨ÿŒÔ„ÿ|Ïrÿ|Ïsÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}ÐtÿÏvÿÏwÿƒÐyÿ†Ò|ÿŠÓ~ÿŒÔÿŽÕƒÿ‘Õ…ÿŒÑ‚ÿ…Í{ÿ|Çuÿq¿mÿg¸eÿ^²^ÿU­YÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿS¬Wÿ[°\ÿcµcÿn½kÿyÄsÿ‚ÊzÿŠÐÿ‘Ô‡ÿÕ…ÿŒÔ‚ÿŠÓ€ÿˆÒ}ÿ„ÐzÿÏxÿ€Ïvÿ~Ðuÿ}Ðtÿ}Ðtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ}Ïtÿ}Ïtÿ|Ïsÿ|ÏsÿÏwÿ„Ñ{ÿ’׋ÿ®à¨ÿÊëÅÿÙðÖÿãôáÿì÷êÿïùîÿòùñÿôúóÿõúôÿõúõÿøû÷ÿûüûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿøüøÿõúõÿôúôÿôúóÿòùòÿïøîÿìøëÿåõãÿÛñÙÿÏìÌÿ´â¯ÿ—Ùÿ…Ñ|ÿ€Ðwÿ}Ïsÿ|Ïsÿ}Ïsÿ}Ïtÿ}Ïtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|ÏsÿÐvÿÖ‡ÿŸÜ˜ÿ·ä²ÿÙñÖÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿòùñÿãôâÿÒíÏÿ±á¬ÿÕ‡ÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|ÏsÿÐxÿ‘Ö‰ÿ¡Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùïÿáóßÿÎëÊÿ­à§ÿŠÔƒÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ðtÿ}ÐtÿÏvÿÏwÿƒÐyÿ†Ò|ÿŠÓÿŒÔÿŽÕ„ÿ’Õ†ÿуÿ…Í|ÿ|Çvÿr¿mÿg¸eÿ^²^ÿU­YÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿS¬Wÿ[°\ÿcµcÿn½kÿyÄsÿ‚Ê{ÿŠÏÿ’Ô†ÿÕ†ÿÔ‚ÿŠÓ€ÿ‡Ò}ÿ„ÐzÿÏxÿ€Ïvÿ~Ðuÿ}Ðtÿ}Ðtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ}Ïtÿ~ÏuÿÐxÿ…Ñ|ÿŽÕ†ÿ˜Ø‘ÿ«ß¤ÿÆéÂÿâóßÿðøïÿøû÷ÿûýûÿýþüÿýþýÿýþýÿýþýÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýþýÿýþýÿýþýÿýþýÿüþýÿüýûÿùüùÿòùñÿçõæÿÌëÉÿ°áªÿšÙ“ÿÕˆÿ†Ó~ÿÐyÿÐvÿ}Ïtÿ}Ïtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|Ïsÿ~ÐvÿÖ‡ÿžÜ˜ÿ·ä²ÿÙñÖÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿòùñÿãôâÿÒíÏÿ²á«ÿÕ‡ÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|ÏsÿÐxÿ‘Ö‰ÿ¡Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùðÿáóÞÿÍëÊÿ¬à§ÿŠÔ‚ÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ðtÿ}ÐtÿÏvÿÏwÿƒÐyÿ†Ò|ÿ‰ÓÿŒÔ‚ÿÕ…ÿ‘Õ‡ÿуÿ…Í}ÿ|Çvÿr¿nÿg¸eÿ^²^ÿU­YÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿS¬Wÿ[°\ÿcµcÿn½kÿyÄtÿ‚Ê{ÿ‹Ñ‚ÿ’Õ‡ÿ‘Õ†ÿÔƒÿŠÓ€ÿ‡Ñ}ÿ„ÐzÿÏxÿ€Ïvÿ~Ïuÿ}Ðtÿ}Ðtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ðtÿ}Ïtÿ}Ïtÿ|Ïsÿ|Ïsÿ‚Ðyÿ‹Ôƒÿ–Øÿªà¥ÿÀç»ÿÒíÏÿàòÞÿðøîÿöûöÿúýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿ÷û÷ÿòúòÿãôâÿÕïÒÿÄèÀÿ°á©ÿšÚ”ÿŽÕ…ÿ„Ñ{ÿ|Îsÿ|Ïsÿ}Ïtÿ}Ïtÿ}Ïtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|Ïsÿ~ÐvÿÖ‡ÿžÜ˜ÿ·ä²ÿÙðÖÿ÷ü÷ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿóùòÿäôâÿÒîÏÿ²á«ÿÕ‡ÿ{Ïsÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|ÏsÿÐxÿ‘Ö‰ÿ¡Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùðÿáóÞÿÍëÊÿ¬à§ÿŠÔ‚ÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ðtÿ}ÐtÿÏvÿÏwÿƒÐyÿ†Ò|ÿ‰ÓÿŒÔ‚ÿÕ…ÿ‘Ö‡ÿÒƒÿ„Í|ÿ|Çvÿr¿nÿg¸eÿ^²^ÿU­YÿN¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿS¬Wÿ[°\ÿcµcÿn½kÿyÄtÿ‚Ë{ÿ‹Ñ‚ÿ’Öˆÿ‘Õ†ÿÔƒÿ‹Òÿ‡Ñ}ÿ„ÐzÿÏxÿ€Ïvÿ~Ïuÿ}Ðtÿ}Ðtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ}Ïtÿ}Ïtÿ|Ïsÿ|ÏsÿˆÒ~ÿ—Ùÿ©ß¢ÿÇêÄÿæõåÿõûôÿùüøÿûýûÿýýýÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüýýÿûýûÿùýùÿöûöÿí÷ìÿÎìËÿ¯á©ÿšÚ“ÿ‹Ó‚ÿ|Îsÿ|Îrÿ}Ïtÿ}Ïtÿ}Ïtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|Ïsÿ~ÐvÿŽÕ‡ÿžÜ˜ÿ·ä²ÿÙðÖÿ÷û÷ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿóùòÿäôâÿÒíÏÿ²á«ÿÕ‡ÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|ÏsÿÐxÿ‘Ö‰ÿ¡Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùðÿáóÞÿÍëÊÿ¬à§ÿŠÔ‚ÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ðtÿ}ÏtÿÏvÿÏwÿƒÐyÿ†Ñ|ÿŠÓ€ÿÔ‚ÿÕ†ÿ“ÕˆÿÒ„ÿ…Í}ÿ|Çwÿr¿nÿg¸eÿ^²^ÿU­YÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿS¬Wÿ[°\ÿd¶cÿn½kÿyÄtÿ‚Ë{ÿ‹Ñ‚ÿ’Öˆÿ‘Õ‡ÿŽÓƒÿ‹Òÿ‡Ñ~ÿ„ÐzÿÐxÿ€Ïvÿ~Ïuÿ}Ðtÿ}Ðtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ðtÿ}Ïtÿ}Ïtÿ~Ïuÿ‚ÐyÿˆÒ~ÿ™Ù’ÿ®á©ÿÅéÁÿÝòÛÿóúóÿýþýÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿþþþÿøüøÿâôàÿÊëÆÿ´ã¯ÿÚ–ÿ‰Ó€ÿƒÑzÿÐvÿ|Ïsÿ}Ïtÿ}Ðtÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|ÏsÿÐvÿÕ‰ÿ¢ÝœÿºæµÿÛñØÿøü÷ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿòùñÿàóßÿÍëÊÿ¯à¨ÿÕ†ÿ|Îrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ïtÿ|ÏsÿÐxÿ‘Ö‰ÿ¡Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùðÿáóÞÿÍëÊÿ¬à§ÿŠÔ‚ÿ{Ïrÿ|Ïsÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ}Ðtÿ}ÏtÿÏvÿÏwÿƒÐyÿ†Ñ|ÿŠÒ€ÿÔƒÿÕ†ÿ“ÕˆÿŽÒ„ÿ†Í}ÿ}Çwÿr¿nÿg¸fÿ^²^ÿV­YÿO¨SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ\±\ÿd¶cÿo½lÿzÄtÿƒË|ÿ‹Ñƒÿ’Ö‰ÿ‘Ô‡ÿŽÓƒÿ‹Òÿ‡Ñ~ÿ„Ñ{ÿÐxÿ€Ïvÿ~Ïuÿ}Ðtÿ}Ðtÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ïtÿ}Ïtÿ|Ïsÿ|ÏsÿÏwÿ‹Ôƒÿ—ØŽÿ®á©ÿËëÇÿäôâÿïøíÿùüøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿñùðÿæõåÿÑîÎÿµã°ÿ™Ú’ÿÔ„ÿ‚Ðzÿ|Ïsÿ|Ïsÿ}Ïtÿ}Ïtÿ}Ðtÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ïtÿ|ÏsÿÏvÿ’ÖŠÿ¦Þ ÿ¾çºÿÝñÛÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿïøïÿÜòÚÿÈêÄÿ«ß¥ÿÔ…ÿ{Îsÿ|Ïsÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ïtÿ|ÏsÿÐxÿ‘Ö‰ÿ¡Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùðÿáóÞÿÍëÊÿ¬à§ÿŠÔ‚ÿ{Ïrÿ|Ïsÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðtÿ}ÏtÿÏvÿÐxÿƒÐzÿ†Ñ}ÿŠÒ€ÿÓƒÿÕ…ÿ“ÕˆÿŽÑ…ÿ†Í~ÿ~ÇwÿrÀoÿg¸fÿ^²^ÿW­YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±\ÿd¶cÿo½lÿzÅuÿƒË|ÿ‹Ñƒÿ’Öˆÿ‘Õ‡ÿŽÓ„ÿ‹Òÿ‡Ò~ÿ„Ñ{ÿÐxÿ€Ïwÿ~Ïuÿ}Ðtÿ}Ðtÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðtÿ|Ïtÿ}Ïtÿ|Ïsÿ|Ïtÿ„Ò|ÿ–׎ÿ©ß¢ÿÅéÁÿäôâÿ÷üöÿüýüÿýþýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþýÿüþüÿøüøÿêöéÿËëÇÿ¬à¦ÿšÙ’ÿ‰Òÿ}Ïtÿ|Ïsÿ}Ïtÿ|Ïtÿ|Ïtÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ïtÿ{ÎrÿÐwÿ•×ÿ¬à¦ÿÃéÀÿßóÝÿùüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿîøìÿØðÕÿÁç½ÿ§Þ¡ÿŒÔƒÿ{Ïrÿ{Ïsÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ïtÿ{Ïsÿ€Ðxÿ‘Ö‰ÿ¡Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùðÿáóÞÿÍëÊÿ¬à§ÿŠÔ‚ÿzÏrÿ{Ïsÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ}Ðuÿ}Ðtÿ}ÏtÿÏvÿÐxÿƒÑzÿ†Ñ}ÿŠÒÿÓƒÿÕ†ÿ’ÕˆÿŽÒ…ÿ†Ìÿ}ÇxÿsÀoÿh¹fÿ^²^ÿW®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿd¶cÿo¾lÿzÅuÿƒË|ÿŒÑ‚ÿ“Õˆÿ’ÕˆÿŽÔ„ÿ‹ÓÿˆÒ~ÿ„Ò{ÿÐxÿÏwÿ}Ïuÿ}Ðtÿ|Ðtÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðtÿ|Ïtÿ|Ïtÿ€Ïwÿ„Ñ|ÿ’Ö‹ÿ­á§ÿÇêÄÿÜòÛÿïøíÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿòùòÿáóßÿÍìÉÿ³ã®ÿ˜Ø‘ÿ…Ñ}ÿ€Ñxÿ~Ïuÿ|Ïtÿ|Ïtÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|ÏtÿzÎrÿ€ÏwÿšÙ“ÿµã°ÿÍìÊÿäõâÿùýùÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿëøéÿÑíÍÿ¶ä²ÿ Ü™ÿ‰Ôÿ{Ïsÿ{Ïsÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ïtÿ{Ïsÿ€ÐxÿÖ‰ÿ Üšÿ»æ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðùðÿáóÞÿÍëÊÿ¬à§ÿ‹Ô‚ÿzÏrÿ{Ïsÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ|Ðuÿ}Ðtÿ}ÏtÿÏvÿÐxÿƒÑzÿ†Ò}ÿŠÒ€ÿÓƒÿ‘Ô‡ÿ“Õ‰ÿŽÓ…ÿ…Íÿ}ÇxÿsÀoÿh¹fÿ^²_ÿV®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿd¶dÿo¾lÿzÅuÿƒË|ÿŒÑƒÿ“ÕŠÿ’ÖˆÿŽÕ„ÿ‹Ô‚ÿˆÓ~ÿ„Ò{ÿÐxÿÏwÿ}Ïuÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ|Ïtÿ{Ïsÿ|ÏtÿƒÑ|ÿÔ…ÿ¢ÜœÿÅêÁÿçöåÿóúóÿùüøÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùüúÿôûôÿí÷ìÿÌëÉÿ©Þ£ÿÕ‡ÿ…Ò~ÿ~Ðvÿ{Ïtÿ|Ïtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ|ÏtÿzÎrÿ€ÐxÿžÚ˜ÿ¿æºÿ×ïÔÿé÷èÿúüúÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿèöæÿÉëÆÿªà¦ÿ˜Ù’ÿ†Óÿ{Ïsÿ|Ïsÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ|Ïtÿ{Ïsÿ€ÐxÿÕˆÿ Üšÿºæ¶ÿÜñÚÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿñùðÿâóßÿÍëÊÿ¬à§ÿŠÓ‚ÿ{Ïrÿ{Ïsÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ}Ïtÿ~ÏvÿÐxÿƒÒzÿ‡Ò}ÿŠÓ€ÿÔƒÿ‘Ô‡ÿ”ÕŠÿŽÒ…ÿ†Î~ÿ}ÈxÿsÀoÿh¹fÿ^²_ÿV®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿd¶dÿo¾lÿzÅuÿƒË|ÿŒÐ„ÿ“ÕŠÿ’ÖˆÿÕ…ÿŒÔ‚ÿˆÓ~ÿ„Ò{ÿÐxÿÏwÿ}Ïuÿ|Ðtÿ|Ðtÿ|Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|Ïsÿ{Ïrÿ}Ïuÿ‹Ô„ÿ›Ù•ÿ´ã¯ÿ×ïÔÿöûõÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýþýÿ÷ü÷ÿÞòÜÿ»å¶ÿžÛ™ÿŽÖˆÿ€Ñxÿ{Ïrÿ|Ïsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|ÏsÿzÎqÿ€Ñyÿ£ÝÿÇêÃÿßóÝÿî÷íÿûýûÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúÿåõäÿÃé¿ÿ¢Ýÿ’׌ÿ„Ò|ÿ{Ïrÿ|Ïrÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|Ïsÿ{Ïrÿ€Ðxÿ׉ÿ¢Ýœÿ¼ç¸ÿÝòÛÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿðøïÿàóÜÿËëÇÿªß¥ÿŠÓ‚ÿzÏqÿ{Ïrÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|Ðsÿ|Ðtÿ|Ðtÿ|Ïtÿ~ÏvÿÐxÿƒÒzÿ‡Ó}ÿŠÔÿŽÔ„ÿ‘Ö‡ÿ”ÖŠÿÒ†ÿ‡Î~ÿ~ÈxÿsÀoÿh¹gÿ^²_ÿV®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿd¶dÿo¾mÿzÅuÿ„Ë}ÿŒÒ„ÿ”ÖŠÿ’Ö‰ÿÕ…ÿŒÔ‚ÿˆÓÿ„Ò{ÿÐxÿÏvÿ}Ïtÿ|Ðtÿ|Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|Ïsÿ|Ïsÿ|ÏsÿzÎqÿ~Ðuÿ—Ù‘ÿ²â®ÿËëÉÿäôáÿúýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýúÿèõæÿÐíÎÿ¸ä´ÿÛ—ÿƒÑ{ÿzÎqÿ{Ïrÿ|Ïsÿ|Ïsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|Ïsÿ|ÏsÿyÎpÿ€Ðxÿ§ß¢ÿÑîÎÿéöçÿòùòÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúÿäôâÿ¿ç»ÿÛ—ÿÕˆÿƒÑ{ÿ|Ïrÿ|Ïsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|Ïsÿ{Ïrÿ€Ñxÿ’ØŒÿ¦ß¡ÿÀè¼ÿßòÝÿùüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿî÷íÿÚðØÿÅéÁÿ§Þ¡ÿ‰Ô€ÿzÏqÿ{Ïrÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ}Ðsÿ|Ðsÿ|Ðtÿ|Ïtÿ~ÏvÿÐxÿƒÒzÿ‡Ó~ÿŠÔÿŽÕ„ÿ’Öˆÿ”׊ÿÓ†ÿ†Î€ÿ~ÈxÿsÀoÿh¹gÿ^²_ÿV®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿd¶dÿp¾mÿ|Åvÿ„Ì}ÿÒ„ÿ•׊ÿ“Ö‰ÿÕ…ÿŒÔƒÿˆÓÿ„Ò{ÿÐxÿÏvÿ}Ïtÿ|Ðsÿ|Ðsÿ|Ðsÿ|Ðsÿ|Ðtÿ|Ðtÿ|Ïsÿ|Ïsÿ{ÏrÿzÎpÿÐwÿ¤ÝžÿÉëÆÿâôáÿðùïÿûýûÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿòùñÿåôäÿÑîÎÿ«à¦ÿ‡ÒÿzÎqÿ{Ïrÿ|Ïsÿ|Ïsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ïsÿ|Ïsÿ{ÏrÿyÎpÿÐyÿ¬á§ÿÙñ×ÿñúðÿøü÷ÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúÿãôáÿ»æ·ÿ—Ùÿ‹Ô„ÿ‚Ñyÿ|Ïsÿ|Ïsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ïsÿ{ÏrÿÑyÿ–Ùÿ¬à¥ÿÅéÁÿáóßÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿë÷êÿÖïÓÿÀç»ÿ¤ÝÿˆÒÿ{Ïqÿ{Ïrÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðsÿ|Ðsÿ|Ðsÿ|Ðsÿ|Ïtÿ~ÏuÿÐxÿƒÒzÿ‡Ó~ÿŠÔÿŽÕ…ÿ’Ö‡ÿ•ÖŠÿÓ‡ÿ‡Îÿ~ÈyÿsÀpÿh¹gÿ^²_ÿV®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿd¶dÿp¾mÿ{Ævÿ„Ì}ÿÒ…ÿ•׊ÿ“Ö‰ÿÕ†ÿŒÔƒÿˆÓÿ„Ò{ÿÐxÿÏvÿ}Ïtÿ|Ðsÿ|Ðsÿ{Ðsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ïsÿ{Ïsÿ~Ðvÿ‚ÑyÿŒÔ„ÿ±â¬ÿØðÖÿïøîÿöûöÿýýýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿ÷üöÿðùðÿàóÞÿºåµÿ“ØŒÿƒÑ{ÿÐvÿ{Ïsÿ{Ïsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ïsÿ{Ïsÿ|Ïsÿ{Ïsÿ…Ò}ÿ±â¬ÿßóÝÿ÷üöÿûýúÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýùÿßóÞÿ´ä¯ÿÕ†ÿ…Ò|ÿ€Ðwÿ{Ïsÿ{Ïsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{ÏsÿyÏrÿ‚Ñzÿ›Ù”ÿ´ã¯ÿÍìÉÿæõãÿúýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúÿèöæÿÏíÌÿ¶ä±ÿÛ—ÿ†Ò~ÿzÏrÿzÏsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðsÿ{Ðsÿ|Ðsÿ|Ïsÿ~ÏuÿÐxÿƒÒzÿ‡Ó~ÿ‹ÔÿŽÕ…ÿ’Öˆÿ•Ö‹ÿÓ‡ÿˆÎ€ÿÈyÿsÀpÿh¹gÿ^²_ÿV®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿd¶dÿp¾mÿ{Ævÿ…Ì~ÿŽÒ…ÿ•׋ÿ“ÖŠÿÕ†ÿŒÔƒÿˆÓÿ„Ò{ÿÐxÿÏvÿ}Ïtÿ|Ðsÿ{Ðsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{ÏsÿzÏsÿƒÒ{ÿÕ†ÿœÛ–ÿÀç¼ÿäõâÿøû÷ÿúýûÿþýþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿøüøÿë÷êÿÈëÄÿ£Þžÿ׈ÿ…Ó}ÿzÏrÿzÏsÿ{Ðsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ïsÿ{Ïsÿ}Ðuÿ~ÐvÿŠÔƒÿ¶ä²ÿåõãÿúýúÿüþüÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüùÿÜòÚÿ¬à§ÿ‚Ñyÿ~Ðvÿ}Ïuÿ{Ïsÿ{Ïsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{ÏsÿyÏqÿƒÒzÿ Üšÿ¿æ»ÿÖïÓÿê÷èÿûýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýùÿäõãÿÇêÃÿ«à¦ÿ–Ø‘ÿ‚Ò{ÿzÏrÿ{Ïsÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðtÿ{Ðsÿ|Ðsÿ|Ïsÿ~ÏuÿÐxÿƒÒzÿ‡Ó~ÿ‹ÔÿÕ…ÿ’Ö‰ÿ”ÖŒÿÓ‡ÿ‡ÎÿÈyÿtÀpÿh¹gÿ^²_ÿV®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ\±]ÿe¶dÿp¾mÿ|Æwÿ…Ì~ÿŽÒ†ÿ–׌ÿ”ÖŠÿÕ†ÿÔƒÿˆÓÿ„Ò{ÿÐxÿÏvÿ}Ïtÿ|Ðsÿ{Ðsÿ{Ðtÿ{Ðtÿ|Ðtÿ|ÐtÿzÏrÿzÏrÿˆÓÿ˜Ù’ÿ¬á§ÿÍìÊÿîùíÿûýûÿþþþÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýþýÿõúôÿÕðÒÿ³ã®ÿœÛ–ÿ‹ÔƒÿzÏrÿzÏrÿ{Ðsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ{Ïsÿ{Ïsÿ~Ðwÿ‚Ñ{ÿÖ‰ÿ½æ¸ÿé÷èÿûýûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüøÿÚñØÿ¦Þ¡ÿyÎqÿxÎoÿ{Ïsÿ{Ïsÿ{Ïsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ{ÏsÿyÎqÿƒÑ{ÿ¦ÞŸÿÈéÄÿÞñÝÿîøíÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýùÿáóßÿ¿è¼ÿ¡Ýœÿ׊ÿÑzÿzÏrÿ{Ïsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ{Ðtÿ{Ðtÿ|Ðsÿ|Ïsÿ~ÏuÿÐxÿƒÒzÿ‡Ó~ÿŒÔÿÕ…ÿ“Ö‰ÿ–Ö‹ÿÓˆÿˆÎ€ÿÈzÿtÀpÿh¹gÿ^²_ÿW®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ\±]ÿe¶dÿp¾mÿ|Åwÿ…ÌÿŽÒ†ÿ–׌ÿ”ÖŠÿ‘Ô†ÿÓƒÿˆÒÿ„Ò{ÿÐxÿÏvÿ|Ïtÿ|Ðsÿ{Ðsÿ{Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿzÏrÿzÏrÿŒÔ†ÿ¥Þ ÿ¼æ¸ÿ×ðÕÿñùðÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ÷ûöÿÞñÜÿÂè¾ÿªà¥ÿ’ÖŠÿ{ÏsÿyÏqÿ{Ðsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ{Ïsÿ{Ïrÿ‚ÒzÿŠÔ„ÿ™Û”ÿÃé¾ÿë÷êÿüþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüøÿÚñÙÿ¦Þ¡ÿxÎpÿxÎpÿ{Ïsÿ{Ïsÿ{Ðsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ{ÏsÿyÎqÿƒÒ|ÿ§ß¢ÿÍëÊÿâôáÿðùïÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüùÿáóßÿ¿è¼ÿ¡Ýœÿ׊ÿÑzÿzÏrÿ{Ïsÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ{Ðtÿ{Ðtÿ{Ðsÿ|Ïsÿ~Ïuÿ€ÐxÿƒÒzÿ‡Ó~ÿŒÔ‚ÿÕ…ÿ“Ö‰ÿ–ÖŒÿ‘Ò‡ÿˆÎ€ÿÈzÿtÀpÿi¹gÿ_²_ÿW®XÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿe¶eÿq¾nÿ|Åwÿ…Ì~ÿŽÒ†ÿ—׌ÿ”Õ‹ÿÔ‡ÿÓƒÿˆÒÿ„Ñ{ÿÐxÿÏvÿ|Ïtÿ{Ïsÿ{Ïsÿ{Ïtÿ|Ïtÿ|Ïtÿ|ÏtÿzÏrÿzÏrÿ’׋ÿ°â¬ÿÍëÊÿâóßÿôúôÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùûøÿæõäÿÑíÎÿ¸ä³ÿ˜Ø‘ÿ{ÏrÿyÏqÿ{Ïsÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ{ÏsÿzÏrÿ…Ó~ÿ“ØŒÿ¥ÞŸÿÉëÆÿí÷ìÿüþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿøüøÿÛñÙÿ§Þ¢ÿyÎqÿxÎpÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ{ÏsÿyÎqÿ„Ò}ÿªà¥ÿÑîÎÿæõåÿòúñÿüþüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýùÿáóàÿÀè½ÿ¢Ýÿ‘׋ÿ‚Ñ{ÿzÏsÿ{Ïsÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ{Ïtÿ{Ïtÿ{Ïsÿ|Ïsÿ~Ïuÿ€ÐxÿƒÑzÿ‡Ò~ÿ‹Ó‚ÿÔ†ÿ“ÖŠÿ–Öÿ‘Óˆÿ‰ÍÿÈzÿtÀqÿi¹hÿ_²`ÿV®YÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿe¶eÿq¾nÿ|Æwÿ…Ìÿцÿ—Öÿ•Ö‹ÿÕ‡ÿÓ„ÿ‰Ò€ÿ„Ñ{ÿÐxÿ~Ïvÿ|Îtÿ{Îsÿ{Îsÿ{Îtÿ|Îtÿ|Îtÿ|ÎtÿzÍqÿzÍqÿ–Øÿ»å·ÿÛñØÿêöèÿ÷ü÷ÿýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúüúÿíøëÿÝòÜÿÂè¿ÿÚ—ÿ{ÎrÿyÍqÿ{Îsÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|ÎtÿzÎrÿzÎrÿ‰Ô‚ÿœÛ—ÿ±ã­ÿÐíÎÿïøïÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿûýüÿöûõÿÖðÔÿ¤ÞŸÿyÍqÿyÍpÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ{ÎsÿyÍqÿ…Ò}ÿ®á©ÿØðÖÿí÷ìÿõûôÿýýüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüùÿàóÝÿºæ·ÿ›Û•ÿŽÖ‡ÿÑzÿ{Îrÿ{Îsÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ{Îtÿ{Îsÿ{Îsÿ~Ïuÿ€ÐxÿƒÐzÿ‡Ò~ÿ‹Ó‚ÿÔ†ÿ”ÕŠÿ—׌ÿ‘Ôˆÿ‰Í‚ÿ€ÈzÿtÀqÿi¹hÿ_²`ÿW®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿe¶eÿq¾nÿ|Æwÿ†Ìÿчÿ—׌ÿ•׋ÿ‘Õ‡ÿÔ„ÿ‰Ò€ÿ„Ñ{ÿÐxÿ~Ïvÿ|Îtÿ{Îsÿ{Îsÿ|Îtÿ|Îtÿ|Îtÿ|ÎtÿyÍqÿzÍqÿ™Ù“ÿÃèÀÿåõãÿðùïÿùýùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüúÿòúñÿçöæÿËìÈÿ¢Ý›ÿ{ÎsÿyÍpÿ{Îsÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|ÎtÿzÎrÿzÎrÿŽÕˆÿ©ß¤ÿÂè¾ÿÛñØÿòùñÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúüûÿóúóÿë÷éÿËëÈÿŸÛ™ÿyÍqÿyÍqÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ{ÎrÿyÍpÿ†Òÿ´ã°ÿâôàÿõûõÿùüùÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøüøÿÚñØÿ®áªÿ‹Ô„ÿ„Ñ{ÿ~Ïuÿ{Îsÿ{Îsÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ|Îtÿ{Îtÿ{Îsÿ{Îsÿ~Ïuÿ€ÏxÿƒÐzÿ‡Ò~ÿŒÓƒÿÕ†ÿ”ÖŠÿ—Øÿ’Ó‰ÿˆÎ‚ÿ€ÈzÿuÁqÿi¹hÿ_²`ÿW®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿf·eÿq¾nÿ}Æxÿ†Ì€ÿÓ‡ÿ˜Øÿ•׌ÿ‘ÖˆÿÔ„ÿ‰Ò€ÿ„Ð{ÿÏxÿ~Îvÿ|Îtÿ{Îsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿyÎqÿyÎqÿœÚ–ÿËëÇÿïùîÿöûõÿúýúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýûÿ÷üöÿðùïÿÓïÑÿ¥Þ ÿ{ÍsÿxÍpÿ{Îsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿyÎqÿyÍqÿ“Öÿ¶ã±ÿÒîÏÿäõâÿöúõÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùûøÿë÷êÿÛñÙÿ¾æºÿ™Ø“ÿyÍqÿyÎqÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿxÍpÿ‡Ò€ÿ¹åµÿë÷ëÿûýûÿýþýÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿÔïÑÿ¢Üÿ{ÎsÿzÍrÿ{Îsÿ{Îsÿ{Îsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Îsÿ{Îsÿ~Îuÿ€ÏxÿƒÐzÿˆÒÿŒÓƒÿÕ‡ÿ”׋ÿ˜×Žÿ’Ô‰ÿ‰Ï‚ÿ€É{ÿuÁqÿi¹hÿ_²`ÿW®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿf·eÿq¾nÿ}Æxÿ‡Í€ÿÓ‡ÿ˜ØŽÿ–׌ÿ‘ÖˆÿŽÔ…ÿ‰Ò€ÿ…Ð|ÿÏxÿ~Îvÿ|Îtÿ{Îsÿ{ÏsÿzÏrÿzÏrÿzÏrÿzÏrÿwÎoÿxÎpÿžÚ˜ÿÏíÌÿôúóÿùüùÿüýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿúýúÿöûöÿÙñ×ÿ¨ß¢ÿ{ÍsÿwÍoÿzÎrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿxÎpÿxÍpÿ˜Ø’ÿÂç¾ÿâôàÿîøíÿøû÷ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ÷ûöÿãóâÿÏìÌÿ´ã±ÿ”׎ÿyÎqÿxÎpÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿyÎqÿwÍoÿˆÒÿ»å·ÿîøíÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷üöÿÒîÐÿŸÛ˜ÿwÍoÿwÍoÿzÎrÿzÎrÿzÎrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿ{Îsÿ{Îsÿ~Îuÿ€ÏxÿƒÐzÿˆÒÿŒÓ„ÿÕ‡ÿ•׋ÿ˜×ÿ’ÔŠÿ‰Ï‚ÿÊ{ÿuÂqÿi¹hÿ_²`ÿW®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿf·eÿq¾oÿ}Æxÿ‡Í€ÿÓˆÿ˜Øÿ–׌ÿ’ÖˆÿŽÔ„ÿ‰Ò€ÿ…Ð|ÿÏxÿ~Îvÿ|Îtÿ{ÎsÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿxÍoÿxÍpÿŸÛšÿÒíÏÿöûõÿüþûÿýýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüþüÿùüøÿÝòÛÿªß¥ÿzÍrÿwÍoÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÎrÿzÎrÿzÎrÿwÍoÿwÍoÿœÚ–ÿÌìÉÿñøðÿ÷û÷ÿûüûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿõúôÿÝñÛÿÅéÁÿ¬à§ÿÖŠÿyÍqÿyÎqÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÎrÿzÎrÿyÎqÿwÍnÿ†Òÿºå¶ÿíøìÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿ÷ü÷ÿÓîÐÿŸÛ™ÿxÍpÿwÍoÿzÎrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿ{Ïsÿ{Îsÿ~Îuÿ€ÏxÿƒÐzÿˆÒÿÓ„ÿ‘Õ‡ÿ•׊ÿ˜×Žÿ“ÔŠÿŠÏ‚ÿÊ{ÿuÂrÿi¹hÿ_²`ÿV®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿf·eÿr¾oÿ~Æyÿ‡Íÿ‘Óˆÿ™Øÿ–׌ÿ’ÖˆÿŽÔ„ÿŠÒ€ÿ…Ð|ÿÏxÿ~Îvÿ|Îtÿ{ÎsÿzÏrÿzÏrÿzÏrÿ{Ïsÿ{ÏsÿxÍoÿxÍpÿ Ü›ÿÔïÒÿ÷üöÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿúýùÿàóßÿ«à§ÿzÎrÿwÍoÿzÏrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿzÎrÿzÎrÿwÍoÿyÍqÿ¢ÜÿÖïÔÿöûöÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿóùóÿ×ïÕÿºå·ÿ¢ÝžÿŒÔ†ÿyÎqÿyÎqÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿzÎrÿyÎpÿwÍoÿ‡Ò€ÿ»å·ÿí÷ìÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿýýýÿõûõÿÓîÐÿŸÛšÿxÎpÿxÎpÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÏrÿzÏrÿ{Ïsÿ{Îsÿ~Îuÿ€ÏxÿƒÐzÿˆÒÿÓƒÿ‘Õ‡ÿ•׋ÿ™×ÿ“ÔŠÿ‹ÏƒÿÊ|ÿuÂrÿi¹hÿ_²`ÿW®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿf·eÿr¾oÿ~ÆzÿˆÍÿ‘Ó‰ÿ™Øÿ—×ÿ’ÕˆÿŽÔ…ÿŠÒ€ÿ…Ñ|ÿÏxÿ~Ïvÿ|Îtÿ{ÎsÿzÏrÿzÏrÿ{Ïsÿ{Ïsÿ{ÏsÿxÍoÿxÍpÿ¡ÜœÿÔïÒÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúÿàóÞÿ«à§ÿzÎrÿwÍoÿzÏrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿyÎqÿ|ÏtÿÐyÿˆÓ€ÿ®á©ÿÚñØÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿòùñÿÒíÎÿ°â«ÿšÚ•ÿˆÔ‚ÿzÎqÿyÎqÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿyÎrÿ~Ïvÿ„Ñ|ÿ–ØÿÃèÀÿïøîÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüúÿõûõÿî÷íÿÈëÅÿšÙ”ÿxÍpÿxÎpÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÏrÿzÏrÿ{Ïsÿ{Îsÿ~Îuÿ€ÏxÿƒÐzÿˆÒÿÔƒÿ‘Õ‡ÿ–׌ÿ™×Žÿ”Ó‹ÿŠÏ„ÿ‚Ê|ÿvÂrÿj¹hÿ`²`ÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿf·eÿr¾oÿ~ÆyÿˆÍÿ‘Ó‰ÿšØÿ—Öÿ’Õ‰ÿŽÔ…ÿŠÓ€ÿ…Ñ|ÿÐxÿ~Ïvÿ|Îtÿ{ÎsÿzÏrÿzÏrÿ{Ïsÿ{Ïsÿ{ÏsÿxÍoÿxÍpÿ¡Ü›ÿÔïÒÿ÷ü÷ÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿúýùÿàóÞÿ«à§ÿzÎrÿwÍoÿzÏrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿyÎqÿÐxÿ‹Ô„ÿ™Ø‘ÿºå´ÿßóÝÿùýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿðøïÿÌëÈÿ¦Þ¡ÿ’׋ÿ…Ò~ÿzÎrÿzÎrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿyÎrÿ…Ñ~ÿ’Ö‹ÿ¦Ý ÿÌëÉÿñùðÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿ÷ûöÿë÷ëÿÞòÝÿ½æ¹ÿ•×ÿxÎpÿxÎpÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÏrÿzÏrÿ{Ïsÿ{Îsÿ~Îuÿ€ÏxÿƒÐzÿˆÒÿÔ„ÿ‘Õˆÿ–׌ÿ™×ÿ”Ô‹ÿŒÎƒÿ‚É|ÿwÂrÿj¹hÿ`²`ÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Xÿ]±^ÿg·eÿs¾oÿÆyÿˆÍÿ’Ò‰ÿš×ÿ—׎ÿ“Õ‰ÿÔ†ÿŠÓÿ…Ñ|ÿÐxÿ~Ïvÿ|Îtÿ{ÎsÿzÏrÿzÏrÿ{Ïsÿ{Ïsÿ{ÏsÿxÍoÿxÍpÿ ÛšÿÔïÑÿöüöÿýþýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýþÿýþýÿùüùÿßóÝÿ«ß¦ÿzÍrÿwÍoÿzÏrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿyÎqÿƒÑ{ÿ–Øÿªà¥ÿÈêÃÿåõãÿúýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿîøíÿÅéÂÿ›Ú•ÿ‰ÓƒÿÑzÿzÎrÿzÎrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿyÎqÿyÎqÿŠÓƒÿžÛ˜ÿµã±ÿÕîÒÿóúóÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿõúôÿåõäÿÔîÓÿµã²ÿ’ÖŒÿxÍpÿxÎpÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÏrÿzÏrÿ{Ïsÿ{Îsÿ}Îuÿ€ÐwÿƒÑzÿˆÒÿÔ„ÿ‘Õˆÿ–Öÿš×ÿ”Õ‹ÿŒÎ„ÿƒÉ}ÿwÂsÿj¹hÿ`²`ÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Xÿ]±^ÿg·fÿt¾oÿ€Æyÿ‰Í‚ÿ’Ò‰ÿšØÿ˜ØŽÿ“ÖŠÿÔ†ÿŠÓÿ…Ñ|ÿÐxÿ~Ïvÿ{ÎsÿzÎrÿzÏrÿzÏrÿ{Ïsÿ{Ïsÿ{ÏsÿxÍpÿxÍpÿŸÛ™ÿÑîÎÿõûõÿûýûÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýþÿüüûÿøü÷ÿÛñÙÿ¨Þ£ÿzÍrÿwÍoÿzÏrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÎrÿzÎrÿyÎqÿxÎpÿ†Òÿ£ÝžÿÀç½ÿØïÕÿí÷ëÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿîøíÿ¿ç¼ÿ‘Ö‹ÿÐyÿ}ÏvÿzÎrÿzÎrÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿyÎqÿyÎqÿÖ‹ÿ«à¦ÿÄéÁÿÝñÛÿöúõÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿöúôÿæõåÿÕîÓÿ¶ã²ÿ’ÖŒÿyÍpÿyÎpÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿzÏrÿzÏrÿzÏrÿ{Îsÿ}Îuÿ€ÐwÿƒÑzÿˆÒÿÔ„ÿ’Õ‰ÿ–ÖÿšÙÿ•ÔŒÿŒÎ…ÿ‚É~ÿvÁsÿj¹iÿ`²`ÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±^ÿg·fÿs¾pÿ€ÆzÿˆÍ‚ÿ’ÒŠÿ›Øÿ˜ØŽÿ“ÖŠÿÔ†ÿŠÓÿ…Ñ|ÿÐxÿ~Ïvÿ{ÎsÿzÎrÿzÏrÿzÏrÿzÏsÿzÏsÿzÏsÿxÎpÿxÎpÿÚ—ÿÍìÊÿóúòÿøüøÿüýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿùüùÿôûóÿ×ðÕÿ¦Þ¡ÿzÍrÿwÍoÿzÏrÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏrÿzÎrÿzÎrÿxÎpÿxÎpÿ‹Ó„ÿ±á¬ÿÖîÔÿèõæÿóúóÿüþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿþþþÿüýüÿì÷ëÿºå¶ÿˆÒÿyÍqÿzÎrÿzÎrÿzÎrÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿxÎpÿyÎqÿ—Ø‘ÿ¸äµÿÔîÑÿæôåÿøûøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿõúõÿæõåÿÕïÓÿ¶ä²ÿ’׌ÿxÍpÿxÎqÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏrÿzÏrÿzÏrÿ{Îsÿ}Îuÿ€ÐwÿƒÑzÿˆÒÿŽÔ…ÿ’Õ‰ÿ—×ÿ›Ù‘ÿ•ÕŒÿ‹Ï…ÿ‚É~ÿvÁtÿj¹iÿ`²aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±_ÿg·fÿs¿pÿÆzÿ‰Í‚ÿ’ÓŠÿ›Ø‘ÿ˜Øÿ“ÖŠÿÔ†ÿŠÓÿ…Ñ|ÿÐxÿ~Ïvÿ{ÎsÿzÎrÿzÏrÿyÏsÿyÏsÿyÏsÿyÏsÿwÎpÿwÍpÿšÙ”ÿÇêÃÿê÷éÿóúóÿúüùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿôûôÿìøëÿÏíÌÿ£ÜžÿyÎrÿvÍoÿyÏrÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏrÿyÎrÿzÎrÿ{Îsÿ~Ïvÿ”×ÿ½æ¹ÿåôãÿñùñÿøûøÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýþýÿúýúÿöûöÿáôàÿ²â®ÿƒÑ{ÿvÍoÿxÎqÿyÎrÿyÎrÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿwÎpÿxÎqÿ›Ù•ÿÃè¿ÿàóÞÿíøìÿúüùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿôúóÿáôàÿÍíËÿ°á¬ÿÖ‰ÿxÎqÿwÎqÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏsÿyÏrÿzÏrÿzÎrÿ}Îuÿ€ÐwÿƒÑzÿˆÒ€ÿŽÔ…ÿ’Õ‰ÿ—׎ÿ›Ø‘ÿ•ÕŒÿŒÏ„ÿƒÉ}ÿwÁsÿk¹iÿ`²aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Xÿ]±_ÿg·fÿs¿pÿÇzÿ‰Í‚ÿ“ÔŠÿšÙ‘ÿ™Øÿ”ÖŠÿÔ†ÿŠÓÿ…Ñ|ÿÐyÿ~Ïvÿ{ÎsÿzÎrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿwÎpÿwÍpÿ–Ø‘ÿ¿ç¼ÿàóÞÿíøìÿøûøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿïùîÿãôáÿÇêÄÿžÛ™ÿzÍrÿwÍoÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÎrÿyÎqÿyÎrÿÐxÿ†ÒÿžÜ™ÿÈëÅÿîùîÿøüøÿúüúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿüþüÿóúôÿê÷éÿÓïÑÿªß¦ÿÐ{ÿwÍoÿyÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÎrÿyÎrÿvÍoÿwÍpÿŸÛ™ÿËìÈÿé÷èÿóúòÿûüûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿòùñÿÚðØÿÁè¾ÿ§Þ£ÿŒÕ†ÿxÎqÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿzÏrÿzÎrÿ}Îuÿ€ÐxÿƒÑ{ÿˆÒ€ÿŽÔ…ÿ’Õ‰ÿ—׎ÿ›Ø‘ÿ–ÕÿÏ…ÿ„É}ÿxÁsÿk¹iÿ`²aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Xÿ]±_ÿg·fÿs¿pÿÇzÿŠÎƒÿ“Ô‹ÿœÙ‘ÿ™Øÿ”ÖŠÿÔ†ÿŠÓ‚ÿ…Ñ}ÿÐyÿ~Ïvÿ{ÎsÿzÎrÿyÏrÿyÏqÿyÏqÿzÏqÿzÏqÿxÎoÿxÎoÿ’×ÿ¶ã³ÿÕïÓÿæõåÿöúöÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùüùÿêöéÿØðÖÿ½æºÿ™Ú”ÿyÎqÿwÎoÿyÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿyÎqÿxÎpÿzÎsÿ„Ò~ÿÖŠÿªà¥ÿÒïÐÿõûõÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿìøëÿÜòÚÿÄéÁÿ¡ÝÿÑzÿwÎoÿyÎpÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿyÏqÿyÎqÿyÎrÿvÍoÿwÍpÿ¢ÜžÿÒïÐÿòúòÿøü÷ÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿïøîÿÒîÑÿ¶ä³ÿŸÜ›ÿˆÔ‚ÿxÎpÿxÎpÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿyÏqÿyÏrÿzÏrÿzÎrÿ}Îuÿ€ÐxÿƒÑ{ÿˆÒ€ÿŽÔ…ÿ’Õ‰ÿ—׎ÿœØ’ÿ–ÕÿІÿ„Ê~ÿxÂsÿk¹iÿ`²aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Xÿ]±_ÿg·fÿs¿pÿ€Ç{ÿŠÎƒÿ“Ô‹ÿœÙ’ÿ™Øÿ”Ö‹ÿÕ‡ÿŠÓ‚ÿ…Ñ}ÿÐyÿ~Ïvÿ{ÎsÿzÎrÿyÏrÿyÏqÿzÏqÿzÏqÿzÏqÿxÎpÿxÎpÿŽÕ‡ÿªß¥ÿÅéÂÿÝòÚÿóúòÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿøû÷ÿâôàÿÊêÇÿ°á¬ÿ”ØŽÿyÎrÿwÎoÿyÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿyÎqÿyÎqÿwÍoÿ|Ïuÿ‘׋ÿ§ß£ÿÀè½ÿÞòÝÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýùÿãõâÿÉëÆÿ°â¬ÿ—Ù‘ÿ~ÐwÿwÎoÿyÎqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿyÎqÿyÎqÿzÎsÿyÎrÿ|Îuÿ¨Þ£ÿØðÖÿ÷üöÿûýûÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿíùíÿÏíÎÿ°â®ÿ›Ú–ÿ‡ÓÿxÎpÿxÎpÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿzÏqÿyÏqÿyÏqÿzÏrÿzÎrÿ}Îuÿ€ÐxÿƒÑ{ÿˆÒ€ÿŽÔ…ÿ’ÕŠÿ—׎ÿœØ’ÿ–ÔÿÐ…ÿ„Ë~ÿxÂtÿkºiÿ`³aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]±_ÿg·fÿs¿qÿÇ{ÿŠÎ„ÿ“ÔŒÿœÙ“ÿ™×ÿ”Ö‹ÿÕ‡ÿŠÓ‚ÿ…Ñ}ÿÐyÿ~Ïvÿ{ÎsÿzÎrÿyÏqÿyÏqÿyÏqÿyÏrÿyÏrÿxÎpÿxÎpÿ‰ÓÿžÛ˜ÿ´ã°ÿÒîÐÿðùïÿüþüÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿ÷úöÿÙðÖÿºå¶ÿ¢ÝÿÔ†ÿyÎqÿxÎpÿyÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÎqÿyÎqÿxÎpÿwÍoÿ}ÐvÿžÛ™ÿÀç½ÿØð×ÿë÷éÿúýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿ÷ü÷ÿÙñ×ÿ¶å³ÿœÛ—ÿ‹Ô…ÿ|ÏtÿxÎpÿyÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÎqÿyÎqÿ{Îtÿ|ÏuÿÐzÿ­à©ÿÜñÛÿøüøÿýþýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿíøìÿÌìËÿ¬à¨ÿ˜Ù’ÿ†ÓÿxÎpÿxÎpÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏqÿyÏqÿyÏqÿzÏrÿzÎrÿ}Îuÿ€ÐxÿƒÑ{ÿˆÓ€ÿŽÔ…ÿ’ÖŠÿ—ØÿœØ’ÿ–ÕŽÿφÿƒÊ~ÿwÃtÿkºjÿ`³aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]²_ÿg¸fÿs¿qÿÇ{ÿŠÎ„ÿ“ÓŒÿœØ’ÿ™Øÿ”Ö‹ÿÕ‡ÿŠÓ‚ÿ…Ñ}ÿÐyÿ~Ïvÿ{ÎsÿzÎrÿyÏqÿxÏqÿxÏqÿxÏrÿxÏrÿwÎqÿxÎpÿƒÒ|ÿ’Ö‹ÿ¤ÝžÿÇêÃÿê÷éÿúýúÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüýüÿñùðÿÎìËÿªà¦ÿ”Øÿ…ÒÿyÎqÿwÎpÿxÏqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÎqÿxÎqÿyÎrÿ{Îrÿ„Ó}ÿ«à§ÿÔïÒÿë÷êÿôúôÿüýüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýþýÿöûõÿÒïÎÿ§ß¢ÿŒÕ…ÿ‚Ñ{ÿ{ÎrÿwÎqÿxÎqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÎqÿxÎqÿ}ÏuÿÑzÿˆÓ‚ÿ³â¯ÿáôßÿùýùÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿë÷êÿÇêÄÿ¢Ýÿ‘׋ÿƒÒ|ÿxÎpÿwÎqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏqÿyÏqÿyÏrÿzÎrÿ}Îuÿ€ÐxÿƒÑ{ÿˆÓ€ÿŽÔ†ÿ’ÖŠÿ˜×ÿœØ“ÿ–ÖŽÿŒÏ‡ÿƒÊÿwÃtÿkºjÿ`³aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]²_ÿg¸gÿs¿qÿ€Ç{ÿŠÎ„ÿ”ÓŒÿœÙ“ÿ™Ùÿ”׌ÿÕ‡ÿŠÓ‚ÿ…Ñ}ÿ€Ðyÿ}ÏvÿzÎsÿyÎrÿyÏqÿxÏqÿxÏrÿxÏrÿxÏrÿxÎqÿwÎqÿ~Ðwÿ…Ò}ÿ’׌ÿ¸ä³ÿÞòÜÿóúóÿùüøÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿùûùÿõúõÿåõåÿÀç½ÿšÙ”ÿ‡Ó€ÿ~ÑxÿwÎpÿwÎqÿxÏqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÎqÿwÎqÿ~Ðwÿ†Ò~ÿ”׎ÿºå¶ÿàóÞÿôúôÿøüùÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýüÿúýûÿôûóÿÊìÇÿÛ—ÿÑzÿ}ÏvÿyÎrÿxÎqÿxÎqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÎqÿxÎqÿ~Ðwÿ‡Ó‚ÿ”ØŽÿ»æ·ÿäôâÿúýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿèöçÿ½æ¹ÿ‘ÖŒÿ„Ò~ÿ~ÐvÿxÎqÿxÎqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏqÿxÏqÿyÏrÿzÎrÿ|ÎuÿÐxÿƒÑ{ÿˆÓ€ÿŽÔ†ÿ“ÖŠÿ˜×ÿœÚ“ÿ–ÕŽÿφÿ„ÊÿwÂtÿkºjÿ`³aÿX®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿT¬Wÿ]²_ÿg¸gÿs¿qÿ€Ç{ÿŠÎ„ÿ”ÓŒÿÙ”ÿšÙ‘ÿ•׌ÿÖ‡ÿŠÓ‚ÿ„Ñ}ÿ€Ðyÿ}ÏvÿzÎsÿyÎrÿxÏqÿxÏqÿxÏrÿyÏrÿyÏrÿxÎqÿxÎqÿxÎqÿxÎqÿÑ{ÿ¨ß¤ÿÒîÐÿê÷éÿôúóÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿõúôÿì÷ëÿÙðØÿ±â®ÿ‰ÓƒÿzÎrÿyÎrÿxÎqÿxÎqÿxÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÎpÿwÎpÿ‚Ò|ÿ‘×ÿ¥Þ ÿÈêÅÿëøëÿûýûÿýýýÿýýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿûüùÿøü÷ÿïùîÿÂé¿ÿ“׌ÿxÎqÿwÎpÿxÎqÿxÎqÿxÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÎqÿwÎpÿÑzÿ׉ÿŸÜ›ÿÂé¿ÿæõåÿûýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿúýúÿäõäÿ²ã®ÿÑ{ÿxÎqÿxÎqÿxÎqÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÏrÿxÏqÿxÏqÿyÏrÿyÎrÿ|ÎuÿÐxÿ‚Ñ{ÿˆÓ€ÿŽÔ†ÿ“ÖŠÿ˜ÙÿœÚ“ÿ—ÖÿŽÐ†ÿ„ÊÿxÂtÿkºjÿ`³aÿX®YÿP©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ^²_ÿg¸gÿt¿qÿ€Ç|ÿ‹Î„ÿ”ÓÿÙ“ÿšÙ‘ÿ•׌ÿÖˆÿŠÓ‚ÿ„Ñ}ÿ€Ðyÿ}ÏvÿzÎsÿyÎrÿxÏqÿxÏqÿxÏrÿyÏrÿyÏrÿxÎqÿxÎqÿwÎpÿvÍoÿ{Îtÿ›Û—ÿ½çºÿÖðÕÿê÷éÿúüúÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿì÷ìÿÚðÚÿÄéÁÿ£ÝžÿÒ{ÿvÍoÿwÎpÿxÎqÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿwÎpÿwÎpÿŠÕ…ÿ£ÞŸÿ¼æ¹ÿØðÖÿòùòÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿ÷ûõÿïùîÿâôàÿ¸åµÿÕ‡ÿvÍoÿvÍoÿxÎqÿxÎqÿxÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿwÎpÿwÎpÿ„Ó}ÿ™Ú”ÿ¯â«ÿÌìÊÿéöèÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûüûÿøüøÿÞóÝÿ«á§ÿ{ÏtÿtÍmÿwÎpÿxÎqÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÏqÿxÏqÿyÏrÿyÎrÿ|ÎuÿÐxÿƒÑ{ÿˆÓ€ÿŽÔ†ÿ”Ö‹ÿ™ÙÿÙ”ÿ—ÖÿŽÐ‡ÿ…ÊÿxÂuÿkºjÿ`³bÿW®YÿO©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ^²_ÿg¸gÿt¿rÿ€Ç|ÿ‹Î„ÿ”ÓÿÙ”ÿšÙ‘ÿ•׌ÿ‘Öˆÿ‹Ó‚ÿ…Ñ}ÿ€Ðyÿ}ÏvÿzÎsÿyÎrÿxÏqÿxÏqÿyÏrÿyÏrÿyÏrÿxÏqÿxÎqÿxÎqÿvÍoÿzÎsÿŽÕ‰ÿ¤Þ ÿ¾ç»ÿÜñÛÿøüøÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿùýùÿâóáÿÄéÂÿ©à¦ÿ“Øÿ~ÐwÿwÎpÿxÎqÿxÎqÿxÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÎqÿxÎqÿxÎqÿvÍnÿuÍoÿ“×ÿ¹åµÿØñÖÿéöèÿ÷ü÷ÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿòùñÿãõáÿÐíÍÿ­áªÿŠÔ„ÿvÍoÿwÎpÿxÎqÿxÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿwÎpÿwÍpÿˆÓ‚ÿ¥ÞŸÿÀç½ÿØðÖÿîøíÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýýÿ÷û÷ÿðùðÿÕïÔÿ¦ß£ÿ{ÏuÿuÍnÿxÎqÿxÎqÿxÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÏqÿxÏqÿyÏrÿyÎrÿ|ÎuÿÐxÿƒÑ{ÿ‰ÓÿÔ†ÿ”Ö‹ÿ™ÙÿÙ”ÿ—ÖÿЈÿ…ÊÿxÂuÿkºkÿa³bÿW®YÿO©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Wÿ^²_ÿh¸gÿt¿rÿ€Ç|ÿ‹Î…ÿ•ÔÿžÙ•ÿ›Ù’ÿ–×ÿ‘Öˆÿ‹Óƒÿ…Ñ}ÿÐyÿ}ÏvÿzÎsÿyÎrÿxÏqÿxÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÎqÿwÎpÿxÎqÿ‚Ò|ÿŽÕˆÿ§ß¢ÿÐíÌÿñúñÿúýúÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûýûÿóúóÿ×ðÕÿ¯â«ÿ׋ÿ„Ò~ÿ{ÏtÿwÎpÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÎqÿxÎqÿxÎpÿuÍnÿvÍoÿÛ˜ÿÍíËÿñùðÿ÷ü÷ÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿíøìÿ×ðÔÿ¿è»ÿ£Þžÿ‡Ò€ÿwÎoÿwÎpÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿwÎpÿvÎoÿŒÔ†ÿ°á«ÿÒîÏÿäôâÿòùòÿüþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýûÿòøñÿæõæÿÌìÊÿ£Ýžÿ{ÏtÿvÍoÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÏqÿxÏqÿyÏrÿyÎrÿ|Îuÿ€ÐxÿƒÑ{ÿ‰ÓÿÔ†ÿ”Ö‹ÿ™ÙÿžÙ”ÿ˜ÖÿŽÐ‡ÿ„Ê€ÿxÂuÿlºkÿa³bÿW®YÿO©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Wÿ^²_ÿh¸gÿtÀrÿÈ}ÿ‹Î…ÿ•ÕŽÿžÚ•ÿ›Ù’ÿ–×ÿ‘Ö‰ÿ‹Óƒÿ…Ñ}ÿÐyÿ}ÏvÿzÎsÿyÎrÿxÏqÿxÏqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÎqÿxÎpÿyÎqÿ}Ïwÿ„Ò~ÿ—Ù’ÿ·å´ÿ×ïÕÿçöæÿôúóÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿöûöÿéöéÿÜòÚÿ¾çºÿžÜ˜ÿ†Ó€ÿÐxÿzÎsÿxÎqÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÏqÿxÎqÿwÎpÿ{ÏtÿÑ{ÿ‹Õ…ÿ®áªÿØðÖÿ÷üöÿúýúÿüþüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýúÿçõæÿÇêÄÿ©à¤ÿ•Ùÿ‚Ò{ÿwÎpÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÏqÿxÎqÿvÎoÿvÍoÿÖ‰ÿ»æ·ÿäóáÿîøíÿöû÷ÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿúüúÿé÷éÿØïÖÿ¾æ¼ÿ›Û–ÿ{ÏsÿvÍoÿxÎqÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿxÏqÿxÏqÿyÏrÿyÎrÿ|Îuÿ€ÐxÿƒÑ{ÿ‰ÓÿÔ‡ÿ”ÖŒÿšØ‘ÿžÙ•ÿ˜ÖÿЈÿ…Ê€ÿxÂuÿlºkÿa³bÿW®YÿO©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Wÿ^²_ÿh¸gÿtÀrÿÈ~ÿ‹Î†ÿ•ÕŽÿžÚ–ÿ›Ù“ÿ–×ÿ‘Õ‰ÿ‹Óƒÿ…Ñ}ÿÐyÿ}ÏvÿzÎsÿyÎrÿxÏqÿxÏqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏqÿxÎqÿxÎqÿzÎsÿ|ÏvÿˆÓ‚ÿŸÜ™ÿµä³ÿÏíÌÿé÷èÿúýúÿþþþÿþþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿþþþÿüýûÿîùîÿÕïÓÿºæ·ÿ£ÞŸÿŒÕ‡ÿ}ÏvÿzÎsÿyÎrÿxÎqÿxÎqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÎqÿxÎqÿwÎpÿwÍpÿ€Ðyÿ׊ÿ¡Ýœÿ¿è½ÿáôàÿùüøÿüþüÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿùüùÿáóßÿ¸ä´ÿ“ØŒÿ†Ó€ÿ}ÐvÿwÎpÿxÎqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÎqÿxÎqÿxÎqÿvÍoÿuÍnÿ“׎ÿÅéÁÿñùðÿùüøÿûüúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿùüùÿáóàÿÉêÆÿ°á«ÿ“׎ÿzÏsÿvÍoÿxÎqÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏqÿxÏqÿyÏrÿyÎrÿ|Îuÿ€ÐxÿƒÑ{ÿ‰ÓÿÔ‡ÿ”ÖŒÿšØ‘ÿžÙ•ÿ˜ÖÿŽÑ‰ÿ…Ê€ÿxÂvÿlºkÿa³bÿW®YÿO©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Wÿ^²_ÿh¸gÿuÀrÿÈ}ÿŒÏ†ÿ–ÕŽÿŸÚ–ÿœØ“ÿ—׎ÿ‘Õ‰ÿ‹Óƒÿ…Ñ}ÿÐyÿ}ÏvÿzÎsÿyÎrÿxÏqÿwÏqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏqÿwÎqÿwÎqÿvÎpÿvÎpÿ}Ïvÿ‹Ô…ÿšÛ–ÿ¸å´ÿØðÖÿóúòÿøüùÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿùýùÿôûôÿßóÞÿ¾ç»ÿžÜ™ÿŽÖ‰ÿ€ÐyÿvÎpÿvÎpÿwÎqÿwÎqÿwÏqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏqÿwÎqÿxÎqÿwÎpÿxÎqÿ…Ò€ÿŸÜšÿ¹åµÿÓîÐÿë÷êÿûýûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýüÿúüûÿõûôÿ×ïÔÿ©ß¥ÿ‚Ñ{ÿ|ÏuÿzÎrÿwÎpÿwÎqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÎqÿwÎqÿxÎqÿxÍqÿyÎsÿšÚ•ÿÍìÊÿõûôÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿøü÷ÿÛòÙÿ¼æ¹ÿ£ÝžÿÕ‡ÿyÍrÿvÍpÿwÎqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏqÿxÏqÿxÏrÿyÎrÿ|Îuÿ€ÐxÿƒÑ{ÿ‰ÓÿÕ‡ÿ•ÖŒÿšÙ’ÿŸÙ–ÿ™×‘ÿЈÿ…ËÿyÃvÿlºkÿa³bÿW®YÿO©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Wÿ^²_ÿh¸gÿuÀrÿƒÈ}ÿŒÏ†ÿ–ÔÿŸÙ–ÿœÙ“ÿ–׎ÿ’Ö‰ÿ‹Óƒÿ…Ñ}ÿÐyÿ}ÏvÿyÎsÿxÎrÿxÏqÿwÏqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÎqÿwÎqÿwÎqÿvÎpÿzÏtÿÑ|ÿŠÕ„ÿ¡Üœÿ»æ¸ÿÔîÒÿæõåÿöûõÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúýúÿé÷èÿ×ñÖÿÀè¾ÿ¥ß¢ÿŒÖ‡ÿƒÒ}ÿ|ÏvÿvÎpÿwÎqÿwÎqÿwÎqÿwÏqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÎqÿwÎqÿxÎpÿxÎrÿzÏtÿÖŠÿ³ã¯ÿÕïÔÿæõåÿóùóÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùüùÿïùîÿäõâÿÅéÂÿžÛ™ÿ|ÏvÿxÎrÿyÎrÿwÎqÿwÎqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÎqÿvÎqÿyÏsÿÐyÿ‰Óƒÿ§Þ£ÿÒîÑÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿ÷üöÿÕðÔÿ²ã®ÿ™Ú•ÿˆÓ‚ÿxÎrÿvÎpÿwÎqÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏrÿwÏqÿwÏqÿxÏrÿyÎrÿ|ÎuÿÐxÿƒÑ{ÿ‰ÓÿÕ‡ÿ•׌ÿšØ’ÿŸÛ–ÿ™Ö‘ÿЊÿ†ËÿyÃwÿlºkÿa³bÿW®YÿO©RÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Wÿ^²_ÿh¸gÿuÀsÿ‚È~ÿŽÏ‡ÿ—Ôÿ Ú—ÿœÚ“ÿ—ØŽÿ’Ö‰ÿŒÔƒÿ…Ñ}ÿ€Ðyÿ}ÏvÿyÎsÿxÎrÿwÏqÿwÏqÿwÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎqÿwÎqÿwÎqÿxÏrÿ{ÏuÿŠÕ…ÿžÜ™ÿ²ã°ÿÑíÏÿïùîÿùüùÿüýüÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýþýÿüþüÿûýúÿóûóÿ×ñÖÿ¹å¶ÿ¢ÝžÿŽÕ‰ÿ|ÏuÿxÎrÿxÎqÿwÎqÿwÎqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎqÿwÎpÿwÎqÿ{Ïuÿ€Ðyÿ™Ù”ÿÆêÃÿðùïÿùüùÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿöûõÿâõáÿÎíÌÿ²ã¯ÿ’×ÿwÍqÿvÍpÿwÎqÿwÎqÿwÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎqÿvÎpÿ{ÏuÿˆÓƒÿ˜Ú“ÿ´ä±ÿÙñØÿøü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿöûõÿÐíÎÿ¨ß¥ÿ׋ÿ„Ò}ÿxÎqÿvÎpÿwÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÏqÿwÏqÿwÏqÿxÏrÿxÎrÿ|ÎuÿÐxÿƒÑ{ÿŠÓÿÖ‡ÿ•׌ÿ›Ú’ÿŸÛ–ÿ™×’ÿÑŠÿ†Ë‚ÿyÃvÿlºkÿa³bÿW®YÿO©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Wÿ^²_ÿh¸hÿuÀsÿ‚È~ÿχÿ—Ôÿ Ú—ÿÚ”ÿ—ØŽÿ’׉ÿŒÔƒÿ…Ò}ÿ€Ðyÿ}ÏvÿyÎsÿxÎrÿwÏqÿwÏpÿwÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÎpÿwÎpÿwÎpÿvÎoÿvÎoÿÐyÿ‹Ö†ÿ›Û—ÿ·ä³ÿÔîÐÿåõãÿí÷ìÿõúõÿùüùÿûýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿúýúÿ÷û÷ÿïùîÿçöåÿÙñÖÿ½æºÿ¡Ýœÿ׊ÿÒ|ÿvÍoÿuÍoÿwÎpÿwÎpÿwÎpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÎpÿvÎoÿyÏsÿ†Ò€ÿ”׎ÿ¯áªÿÖïÔÿ÷üöÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿòùòÿÖïÔÿ¹åµÿ¡Ýœÿ‰ÔƒÿvÎoÿuÎoÿwÎpÿwÎpÿwÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÎoÿvÎoÿ}Ïwÿ“×ÿ«à§ÿÄéÂÿáóàÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿõúôÿËëÉÿžÜšÿ†ÓÿÑyÿxÎpÿvÎoÿwÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÏpÿwÏqÿxÏqÿxÎrÿ{ÎuÿÐxÿƒÑ{ÿŠÓÿÖ‡ÿ–Øÿ›Ú’ÿ Ú—ÿš×’ÿÑŠÿ†ËÿyÃvÿlºkÿa³bÿW®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²`ÿh¸hÿuÀsÿ‚È~ÿχÿ—Ôÿ Ú—ÿÚ”ÿ—Øÿ’׊ÿŒÕƒÿ…Ò}ÿ€Ðyÿ}ÏvÿyÎrÿxÎqÿwÏpÿwÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÏpÿwÎpÿwÎpÿwÎpÿwÎoÿ{Ïtÿ€ÒzÿˆÓ‚ÿ˜Ù“ÿ¨à¤ÿ¼æ¸ÿÓîÐÿèöçÿóúòÿùüùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúýúÿõúôÿíøëÿØðÖÿÁè½ÿ­à¨ÿœÚ–ÿ‹Õ†ÿÒ{ÿ{ÏvÿvÎoÿwÎoÿwÎpÿwÎpÿwÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÎpÿwÎpÿvÎoÿtÍmÿzÏsÿ•Øÿ²â®ÿÌëÉÿäõâÿúýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿðùïÿÉëÆÿ£ÝžÿÖŠÿ‚Ñ{ÿvÎoÿvÎoÿwÏpÿwÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÏpÿwÎpÿwÎoÿuÍnÿ€ÑyÿŸÜšÿ¿è¼ÿ×ðÕÿë÷éÿûýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿôûóÿÆêÃÿ•Øÿ|ÐvÿyÎsÿwÎpÿwÎpÿwÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿxÏpÿwÏpÿwÏpÿxÏqÿxÎrÿ{ÎtÿÐxÿƒÑ{ÿŠÓÿ‘Öˆÿ–Øÿ›Ú“ÿ Ú—ÿš×’ÿ‘щÿ†ËÿyÃvÿmºlÿa³bÿX®[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Yÿ_²`ÿi¸hÿvÀsÿ‚È~ÿχÿ—Ôÿ¡Ú˜ÿÚ”ÿ—Øÿ’׊ÿŒÕ„ÿ…Ò}ÿ€Ðyÿ}ÏuÿyÎrÿxÎqÿwÏpÿwÏpÿxÏpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎpÿwÎpÿwÎoÿvÎoÿwÍpÿ{ÏtÿÑzÿ”׎ÿ·ä³ÿÙñØÿê÷éÿóúóÿ÷ûöÿùüøÿúýùÿúýúÿûýûÿüþüÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýþýÿüþüÿûýûÿûýúÿúýùÿùüøÿ÷ü÷ÿôûôÿíøìÿáóßÿ¿ç»ÿœÚ•ÿ‚Ñ|ÿ}ÏvÿxÎqÿvÎoÿvÎoÿwÎpÿwÎpÿxÏpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎpÿwÎoÿvÎoÿtÍmÿ~Ñwÿ¦ß¡ÿÏìÌÿçõæÿòúñÿüýûÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿýþýÿúýúÿëøêÿ½çºÿ׈ÿ€Ðxÿ{ÏtÿwÎpÿwÎpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎpÿwÎpÿvÎoÿuÍnÿ‚Ò|ÿ«à¦ÿÔïÑÿéöçÿóúòÿüýüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþýÿýþüÿñùðÿÀè½ÿ‹Õ…ÿtÍmÿuÍnÿwÎpÿwÎpÿwÏpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏpÿwÏpÿwÏpÿxÏqÿxÎqÿ{ÎtÿÐxÿƒÑ{ÿŠÓ‚ÿÖˆÿ–ØÿœÚ“ÿ Ú—ÿš×’ÿ‘ÑŠÿ†ËÿzÃwÿmºlÿb³bÿY®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Yÿ_²`ÿi¸hÿvÀsÿƒÈ~ÿψÿ˜Ôÿ¡Ú˜ÿÚ•ÿ˜Øÿ’׊ÿŒÕ„ÿ…Ò~ÿ€Ðyÿ}ÏuÿyÎrÿxÎqÿwÏpÿwÏpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎpÿwÎpÿwÎpÿvÎoÿvÍoÿyÎqÿ{ÏtÿˆÓ€ÿŸÜ™ÿµã±ÿÄéÀÿÎìËÿ×ðÖÿÞòÜÿäõâÿéöèÿíøíÿòùòÿ÷üöÿûüúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüûÿ÷û÷ÿòùóÿîøîÿê÷êÿåöäÿßóÝÿÙñ×ÿÐîÎÿÆêÃÿºå¶ÿ¤ÝŸÿŒÕ†ÿ|ÏuÿxÎqÿwÍoÿvÎoÿwÎpÿwÎpÿwÎpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏpÿwÏpÿwÎpÿvÎoÿvÎoÿ€ÒyÿŒÕ…ÿܘÿ¾ç»ÿßóÝÿðùïÿøü÷ÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýýýÿõúõÿîøíÿØñÖÿ¯â«ÿ‡ÓÿzÏsÿyÏqÿwÎpÿwÎpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÎpÿwÎpÿxÎqÿyÎqÿˆÔÿ³ã¯ÿßóÝÿòùñÿ÷û÷ÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿùüùÿôúóÿåôäÿ¸ä³ÿ‰Ô‚ÿtÍmÿvÎoÿwÎpÿwÎpÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿwÏpÿwÏpÿxÏqÿxÎqÿ{ÎtÿÐxÿƒÑ|ÿŠÓ‚ÿÖˆÿ–ØŽÿœÚ“ÿ¡Ú—ÿ›×“ÿÑŠÿ‡Ë‚ÿzÃwÿmºlÿb³bÿY®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Yÿ_²`ÿi¸hÿvÀtÿƒÈÿŽÏˆÿ˜Ô‘ÿ¡Ú™ÿžÚ•ÿ˜Øÿ“׋ÿŒÕ„ÿ…Ò~ÿ€Ðyÿ}ÏvÿyÎrÿxÎqÿwÎpÿwÎpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎpÿwÎpÿwÎpÿwÎqÿyÏrÿ}Ïwÿ…ÓÿŽÕˆÿ˜Ù“ÿ£ÝŸÿ¯â«ÿ¼ç¹ÿÉëÇÿÕïÓÿÞòÜÿçöæÿðùîÿùüøÿýþýÿþþþÿþþþÿþþþÿþþþÿýþýÿûüúÿñùñÿéõçÿßóÞÿ×ñÕÿÌìÉÿ¿è»ÿ²ä®ÿ¦ß¡ÿ›Ú–ÿÖŠÿ‡ÔÿÑyÿyÏrÿwÎqÿwÎpÿwÎpÿwÎpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎpÿwÎpÿwÎpÿuÍnÿuÍnÿ‹Õ†ÿ¦Þ¢ÿ¿ç¼ÿ×ðÕÿíøìÿøüùÿûüûÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿûýûÿìøëÿÛñÙÿÃéÀÿ¡Ýœÿ€ÒzÿwÍpÿwÎpÿwÎpÿwÎpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎpÿwÎpÿzÎrÿ}ÏuÿŽÖ‡ÿ¼æ¸ÿéöèÿûüùÿüüûÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿóúóÿèöçÿÖðÓÿ®áªÿ†Ó€ÿuÍnÿvÎoÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎpÿwÎpÿxÎqÿxÎqÿ{ÎtÿÐxÿƒÑ|ÿŠÓ‚ÿ‘Ö‰ÿ–ØŽÿœÚ”ÿ¡Ú˜ÿ›×“ÿ’ÑŠÿ‡Ë‚ÿzÃwÿmºlÿb³bÿY®ZÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Yÿ_²`ÿi¸iÿvÀtÿƒÈÿŽÏˆÿ˜Õ‘ÿ¢Ú™ÿžÚ–ÿ˜Ø‘ÿ“׋ÿŒÕ…ÿ†Ò~ÿ€Ðyÿ}ÏvÿyÎrÿxÍqÿwÍpÿvÍpÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍpÿvÍpÿvÍpÿvÍpÿuÍoÿtÌnÿtÌnÿ|Ïvÿ†Ô€ÿ‘Ø‹ÿ Ý›ÿ¯â¬ÿ½çºÿÈêÅÿÒîÏÿÝòÛÿçöæÿðùïÿðùïÿðùïÿðùïÿðùïÿðùïÿéöéÿßóÝÿÕïÒÿÊìÇÿÀè¼ÿ³ã¯ÿ¤Þžÿ”ÙŽÿˆÔ‚ÿ~ÐxÿtÍnÿtÍnÿuÍoÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍpÿvÍoÿwÎpÿyÏsÿ}Ðwÿ›Ú–ÿ¾ç»ÿÚòÙÿê÷éÿøüøÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýþýÿøüøÿáôáÿÈëÅÿ¯â«ÿ•ÙŽÿ{ÏtÿtÌnÿvÍoÿvÍpÿvÍpÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿuÍpÿvÍoÿ|Ïuÿ„Ò}ÿ—Ù‘ÿÅêÂÿñùðÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿì÷ëÿÚñØÿÄêÁÿ¤ÞŸÿƒÒ}ÿtÌnÿuÍoÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍpÿwÍpÿxÍqÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿŠÓƒÿ‘Ö‰ÿ—ØÿÚ”ÿ¢Ú˜ÿ›×”ÿ’Ñ‹ÿ‡ËƒÿzÃwÿmºlÿb³bÿY®[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²`ÿi¸iÿvÀtÿƒÈÿŽÏ‰ÿ™Ö’ÿ¢ÛšÿŸÚ–ÿ™Ø‘ÿ“׌ÿŒÕ…ÿ†Ò~ÿ€Ðyÿ}ÏvÿyÎrÿxÍqÿwÍpÿvÍpÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿuÍoÿtÌnÿxÎrÿ~Ñxÿ„Ò~ÿŒÖ‡ÿ–Ù‘ÿžÜ™ÿ¤ÞŸÿªà¦ÿ°â­ÿ·ä³ÿ»æ¸ÿ¼æ¹ÿ»æ¹ÿ»æ¹ÿ¼æ¹ÿ¼æ¸ÿ·ä´ÿ±â®ÿ¬à¨ÿ¦Þ¢ÿŸÜ›ÿ˜Ú“ÿŽ×‰ÿ†Ô€ÿÐyÿzÎsÿtÍnÿuÍoÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍpÿvÍpÿvÍpÿuÍoÿuÌoÿ|ÐvÿŠÔ„ÿ˜Ù“ÿ´ã°ÿÓïÑÿê÷êÿóúóÿûýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿûýûÿõùôÿÕîÓÿ´ã°ÿ›Û–ÿ‰ÔƒÿyÍsÿuÍoÿvÍpÿvÍpÿvÍpÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿuÍoÿuÍoÿ‚Ò|ÿÖŠÿ¦ß¡ÿÌíËÿòúóÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúÿåõãÿÉëÆÿ®áªÿ–ÙÿÐyÿuÌoÿvÍpÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍqÿvÍpÿvÍpÿwÍqÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿŠÓƒÿ‘Ö‰ÿ—ØÿÚ•ÿ¢Ü™ÿœØ”ÿ‘Ò‹ÿˆËƒÿzÃxÿmºmÿb³cÿY®[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²aÿi¸iÿvÀtÿ„É€ÿЉÿ™Õ’ÿ¢ÛšÿŸÛ—ÿšØ‘ÿ”׌ÿÕ…ÿ†Ò~ÿ€Ðyÿ}ÏvÿyÎrÿxÍqÿvÍpÿvÎpÿvÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÍpÿvÍpÿwÍqÿwÎqÿyÎsÿ{Ïvÿ~Ðxÿ€Ðyÿ€Ð{ÿ‚Ñ|ÿ„Ñ~ÿ…Ò€ÿ‡Òÿ†Ò€ÿ†Ò€ÿ†Ò€ÿ†Ò€ÿ‡Ò€ÿ…Ò€ÿƒÑÿ‚Ñ}ÿÐ{ÿÐzÿ}Ðyÿ|ÏvÿyÎtÿyÎsÿwÍqÿvÍpÿvÍpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÎpÿvÍpÿvÍpÿuÍoÿtÍnÿƒÑ|ÿ›Ú–ÿ´ã°ÿÍìËÿæöåÿøüøÿûýûÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüúÿøû÷ÿî÷íÿÈêÅÿ Û›ÿ‡Òÿ~ÏyÿwÍqÿvÍpÿvÍpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÎqÿuÍoÿuÍoÿˆÓƒÿÛ™ÿµä²ÿÖïÓÿôúôÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿøüøÿÝòÛÿ·å´ÿ˜Ù“ÿ‰Óƒÿ{ÏuÿuÍoÿvÍpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÎqÿvÎpÿvÎpÿwÍqÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿŠÓƒÿ‘ÖŠÿ˜ØÿÚ•ÿ¢ÜšÿœØ•ÿ“ÑŒÿˆÌƒÿ{Ãxÿmºmÿb³cÿY®ZÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²aÿi¸iÿwÀuÿ„É€ÿЊÿšÖ“ÿ£Û›ÿŸÛ—ÿ™Ù‘ÿ”׌ÿÕ…ÿ†Òÿ€Ðyÿ}ÏvÿyÎrÿxÍqÿvÍpÿvÎpÿvÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÍpÿvÍpÿvÍpÿvÍpÿuÍoÿuÍoÿuÌoÿuÌnÿtÌnÿtÌnÿtÌnÿsÌmÿsÌmÿsÌmÿsÌmÿsÌmÿsÌmÿsÌmÿsÌmÿtÌmÿtÌnÿtÌnÿtÌnÿtÌoÿuÍoÿuÍoÿvÍoÿvÍpÿvÍpÿvÍpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÍpÿvÍpÿvÍpÿxÎsÿ|ÏwÿÖ‹ÿ¯á«ÿÍíËÿàóßÿñúñÿüýüÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿöûõÿì÷ëÿÞòÜÿ¹ä¶ÿ“׎ÿ}ÏwÿyÍsÿvÍqÿvÍpÿvÍpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿtÍnÿuÍoÿ׋ÿ®áªÿÈêÅÿàòÞÿ÷ûöÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüþüÿöûöÿÖïÔÿªß§ÿ‰Ôƒÿ€ÐyÿyÎsÿuÍpÿvÍpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÎpÿvÎpÿwÍqÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿŠÓƒÿ’ÖŠÿ˜ØÿžÚ–ÿ£Ü›ÿØ•ÿ’ÒŒÿˆÌ„ÿ{Ãxÿm»mÿb³cÿY®[ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²aÿi¸iÿwÀuÿ„É€ÿЊÿšÕ“ÿ£Û›ÿ Û˜ÿ™Ù’ÿ”×ÿÕ†ÿ†Òÿ€Ðyÿ}ÏvÿyÎrÿxÍqÿvÍpÿvÎpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÎpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿuÍoÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÍpÿvÎpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÍpÿvÍpÿvÍpÿuÌoÿvÍpÿÐzÿ‹Ô†ÿ¢ÜžÿÃèÂÿäõãÿðùïÿ÷ü÷ÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿïøîÿÜòÚÿÇêÄÿ©ß¥ÿŠÓ„ÿxÍrÿvÍqÿvÍpÿvÍpÿvÎpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÍpÿvÍpÿvÍpÿsÌmÿtÍmÿ˜Ú”ÿÁè¾ÿÝñÜÿì÷ëÿúüùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿúüúÿõûôÿÏíÎÿ¡Üœÿ~ÏxÿzÎsÿxÍrÿvÍpÿvÍpÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿvÎpÿvÎpÿwÍqÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿŠÓƒÿ’ÖŠÿ˜Ø‘ÿžÚ–ÿ£Ü›ÿØ–ÿ“Óÿ‰Ì„ÿ{Ãyÿm»mÿb³cÿY®[ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²aÿi¸jÿwÀuÿ…ÉÿЊÿšÕ“ÿ¤Û›ÿ Û˜ÿšÙ“ÿ”×ÿÕ†ÿ†Òÿ€Ðyÿ}ÏvÿyÎrÿxÍqÿvÍpÿvÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿvÍpÿvÍpÿvÍpÿuÍoÿyÎrÿˆÓƒÿšÙ–ÿµã²ÿÙð×ÿõûôÿüýüÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿúýùÿè÷çÿËìÉÿ°â¬ÿ˜Ú”ÿ‚Ð{ÿuÍoÿuÍoÿvÍpÿvÍpÿvÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿvÍpÿvÍpÿuÍoÿsÌmÿtÍnÿ¡ÝÿÒîÐÿñùðÿ÷û÷ÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüúÿ÷û÷ÿñùðÿÈêÆÿ–Ø“ÿtÌnÿtÌnÿvÍpÿvÍpÿvÍpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿvÎpÿvÎpÿwÍqÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿŠÓƒÿ’Ö‹ÿ˜Ø‘ÿžÚ—ÿ£Ü›ÿØ–ÿ”ÓŽÿ‰Ì„ÿ{Ãyÿn»mÿb³cÿY®[ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²aÿi¸jÿwÀuÿ…ÉÿЋÿšÕ”ÿ¤Ûœÿ Û˜ÿšÙ’ÿ”×ÿÕ†ÿ†Òÿ€Ðyÿ|ÏvÿyÎrÿwÍqÿvÍpÿvÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿvÎoÿvÍoÿvÍnÿvÍnÿzÏtÿÐyÿŠÓ„ÿ¡Üœÿ¹å¶ÿÐíÎÿçöæÿúýúÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýýÿúüùÿõûôÿÛñÙÿ¸åµÿšÚ”ÿŠÔ…ÿ}ÏwÿuÍnÿvÍnÿvÍoÿvÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿvÍoÿvÍnÿzÏtÿ€ÐzÿŠÕ„ÿ²ã­ÿÜñÚÿ÷û÷ÿûýúÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿøû÷ÿîøíÿáóàÿ½æºÿ’ÖÿtÌmÿtÍlÿvÍoÿvÍoÿvÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿwÎoÿvÎoÿvÎpÿwÍpÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Óƒÿ’Ö‹ÿ˜Ø‘ÿžÚ—ÿ¤ÜœÿžØ—ÿ”Óÿ‰Ì…ÿ|Ãyÿn»mÿb³cÿY®[ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿU¬Xÿ_²aÿj¸jÿwÀuÿ…ÉÿЋÿ›Õ”ÿ¤Ûœÿ Û™ÿšÙ’ÿ•×ÿÕ†ÿ†Òÿ€Ðyÿ|ÏvÿxÎrÿwÍqÿvÍpÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÍoÿvÍoÿvÍnÿuÌnÿuÍnÿÐyÿ‹Ô†ÿÚ˜ÿ¼æ¸ÿÚðØÿìøëÿôûôÿüýüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüúÿôúôÿë÷êÿÍìÊÿ¤Ý ÿƒÑ}ÿ|ÏvÿxÎqÿvÍnÿvÍoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿuÍnÿuÍnÿ€Ñzÿ׊ÿ¡ÝœÿÃèÀÿåõäÿúýùÿüþüÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿôúôÿãôâÿÐíÎÿ±á­ÿÕˆÿtÌnÿtÍmÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿvÎoÿwÍpÿxÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Óƒÿ“Õ‹ÿ™×‘ÿŸÚ—ÿ¤ÜœÿžØ—ÿ”ÓŽÿ‰Ì…ÿ|Ãyÿn»mÿb³cÿX®ZÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Xÿ`²aÿj¸jÿwÀvÿ…É‚ÿЋÿ›Ö•ÿ¥Ûÿ¡Û™ÿ›Ø“ÿ•ÖÿÔ†ÿ†Òÿ€Ðyÿ|ÏvÿxÎrÿwÍqÿvÍoÿuÎoÿuÎoÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÍoÿuÍoÿvÍoÿwÍoÿyÎrÿŠÓ„ÿÚ˜ÿ³ã¯ÿÔîÑÿòúñÿûýúÿýþýÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿøû÷ÿê÷éÿÛñØÿ»å·ÿ“׎ÿsÌmÿsÌmÿuÍoÿuÍoÿuÍoÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿtÍnÿtÍnÿ…Ò€ÿŸÜ›ÿ¸åµÿÓîÑÿíøìÿûýûÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿðøðÿØðÖÿ¿ç»ÿ¤Ý ÿˆÔƒÿtÍnÿtÍnÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎoÿuÎoÿvÎoÿwÍpÿwÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Ó„ÿ“Õ‹ÿ™×‘ÿŸÙ—ÿ¤ÛœÿžØ—ÿ“Óÿ‰Ì…ÿ|Ãzÿn»nÿc³cÿX®[ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Xÿ`²aÿj¸jÿxÀvÿ…É‚ÿ‘ÐŒÿ›×•ÿ¥Üÿ¡Û™ÿ›Ø“ÿ•ÖÿÔ†ÿ†Òÿ€Ðyÿ|ÏvÿxÎrÿwÍqÿvÍoÿuÎoÿuÎoÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎoÿuÍoÿuÍoÿtÍnÿtÍnÿxÎrÿ€ÐyÿˆÓ‚ÿ Üœÿ¼æ¸ÿÔîÑÿæõåÿ÷üøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿòùñÿÖðÔÿºå¶ÿ ÜœÿˆÓ‚ÿsÌmÿsÍmÿuÍoÿuÍoÿuÍoÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎoÿuÍoÿuÍoÿsÍmÿsÍmÿŠÔ…ÿ®á«ÿÐîÍÿâôáÿóùòÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿí÷ìÿÎìËÿ®áªÿ˜Ù“ÿƒÒ~ÿtÍnÿtÍnÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎoÿuÎoÿvÍpÿwÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Ó„ÿ“Ö‹ÿ™Ø‘ÿŸÛ˜ÿ¤ÜÿžÙ˜ÿ”ÓŽÿŠÌ†ÿ|Ãzÿn»nÿc³dÿX®\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Xÿ`²aÿj¸jÿxÀvÿ‡É‚ÿ‘ÐŒÿ›×•ÿ¥Üžÿ¡Ûšÿ›Ù“ÿ•׎ÿÔ†ÿ†Òÿ€Ðyÿ|ÏvÿxÎrÿwÍqÿvÍoÿuÎoÿuÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÍoÿuÍoÿtÍnÿtÌnÿsÍmÿ|Ðvÿ‰Ô„ÿ™Ù”ÿ¹å¶ÿÚðÙÿòúñÿ÷üøÿüþüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿþþþÿûýûÿíøëÿÂèÀÿ˜Ú”ÿ‡Ó‚ÿ|ÐwÿtÍnÿuÍoÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÍoÿuÍoÿuÍoÿrÌmÿsÌlÿÖŠÿ½çºÿçõæÿðùñÿøûøÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿûýûÿêöèÿÃéÀÿœÛ˜ÿ‹Õ†ÿ~ÐyÿuÍnÿuÍoÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÎpÿuÎoÿuÎoÿvÍpÿwÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Ó„ÿ“ÖŒÿ™Ù’ÿŸÛ˜ÿ¤ÝÿžÙ˜ÿ•ÓÿŠÌ†ÿ|Ã{ÿo»nÿc³dÿX­\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV¬Xÿ`²aÿj¸kÿxÀwÿ‡Éƒÿ‘ÐŒÿ›×–ÿ¥Üžÿ¡Üšÿ›Ú”ÿ•׎ÿÔ†ÿ†Òÿ€Ðyÿ|ÏvÿxÎrÿwÍqÿuÍoÿuÎoÿuÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÍoÿuÍoÿvÍpÿ|Ïwÿ„Òÿ‘Øÿ¢Ýžÿ´ä±ÿÏíÍÿëøêÿûýûÿþþþÿþþþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýýýÿ÷ü÷ÿòúñÿÛòÚÿ°â­ÿ‡Ò‚ÿzÎtÿwÎrÿuÍoÿuÍoÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÍoÿuÍoÿuÍpÿxÎtÿ~ÐyÿÛ™ÿÊêÈÿòúòÿùüùÿüüûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûüûÿøûøÿâôàÿ¸å´ÿÖŠÿ‚Ñ}ÿzÏuÿtÍoÿuÍoÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÎoÿuÎoÿvÍpÿwÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Ó„ÿ“ÖŒÿ™Ù’ÿŸÛ˜ÿ¥ÝžÿžÙ˜ÿ•ÓÿŠÌ‡ÿ|Ã{ÿo»nÿc´dÿX­\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Xÿ`²aÿj¸kÿxÁwÿ‡É„ÿ‘ÐŒÿœ×–ÿ¥Üžÿ¡Üšÿ›Ú•ÿ•׎ÿÔ‡ÿ†Òÿ€Ðyÿ|ÏvÿxÎrÿwÍqÿuÍoÿuÎoÿuÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎoÿuÍoÿuÍoÿuÍoÿuÍoÿtÍnÿrÌlÿxÎrÿÕˆÿ¤Ý ÿ¶ä´ÿÈëÅÿ×ðÖÿæöåÿóúôÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿûýûÿìøëÿÚòØÿÂé¿ÿ Û›ÿÐzÿvÍpÿvÍpÿuÍoÿuÍoÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÍoÿtÍnÿyÎsÿ…Ò€ÿ“Øÿ°á­ÿÖðÔÿöûöÿüýûÿýýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýýÿ÷û÷ÿñùïÿØðÖÿ¬á¨ÿƒÒ}ÿ{ÎtÿwÎqÿuÍoÿuÍoÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿuÎoÿuÎoÿvÍpÿwÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Ó„ÿ’ÖŒÿ™Ù’ÿŸÛ™ÿ¥ÝžÿŸÙ™ÿ•ÓÿŠÌ†ÿ|Ãzÿo»nÿc´dÿX®\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Xÿ`²aÿj¹kÿxÁwÿ‡Éƒÿ’Ðÿœ×–ÿ¦ÜŸÿ¡Ü›ÿ›Ú•ÿ•×ÿÔ‡ÿ†Òÿ€Ðyÿ|ÏvÿxÎrÿwÍqÿuÍoÿuÎoÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎoÿuÍoÿuÍoÿuÍnÿuÍnÿtÍmÿsÌmÿ}ÏwÿŸÜ›ÿÂè¿ÿÚñØÿê÷éÿöûõÿúýúÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýþýÿ÷ü÷ÿßóÝÿÂé¿ÿ¨ß¥ÿÖŠÿyÎrÿtÍmÿuÍoÿuÍoÿuÍoÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÍoÿtÍnÿ|Ïvÿ‘Öÿ¨ß¥ÿÃéÁÿáóàÿùüøÿþþþÿýýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿûýûÿòúñÿçöåÿÌëÉÿ¡Ü›ÿxÎrÿsÌlÿuÍnÿuÍoÿuÍoÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎoÿuÎoÿvÍpÿwÍqÿ{ÎtÿÐxÿƒÑ|ÿ‹Ó„ÿ’ÖŒÿ™Ù“ÿ Û™ÿ¥ÝžÿŸÙ™ÿ”ÓÿŠÌ†ÿ|Ãzÿo»nÿc´dÿX¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Xÿ`²aÿj¹kÿxÁwÿ†Éƒÿ’ÐÿœÖ–ÿ¦ÜŸÿ¢Ü›ÿœÚ•ÿ•×ÿÔ‡ÿ†Òÿ€Ðzÿ|ÏvÿxÎrÿvÍpÿuÍoÿtÎoÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎoÿtÍoÿtÍoÿuÍoÿuÎpÿwÎrÿƒÑ~ÿÖŠÿŸÛ›ÿ»æ¹ÿ×ðÕÿêöèÿôúóÿýþýÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùýúÿôûõÿê÷êÿÌìÊÿ«á¨ÿ”Øÿ„ÓÿvÎqÿsÌnÿtÍoÿtÍoÿtÎoÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎoÿtÍoÿsÍnÿrÌmÿ~ÐxÿÛ™ÿ½æ»ÿÕïÔÿêöèÿûýúÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿùýùÿåõäÿÏìÍÿµã±ÿ”×ÿuÍpÿrÌmÿtÍoÿtÍoÿtÍoÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎpÿtÎoÿuÎoÿvÍpÿwÍqÿzÎtÿÐxÿƒÑ}ÿ‹Ó…ÿ“ÖŒÿ™Ù“ÿ Û™ÿ¦ÝŸÿŸØ™ÿ–Óÿ‹Ì‡ÿ}Ä{ÿo»oÿc´dÿX¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Xÿ`²aÿj¹kÿxÁwÿ†Êƒÿ’ÑÿÖ—ÿ¦ÜŸÿ¢Ü›ÿœÚ•ÿ•×ÿÔ‡ÿ„Ò€ÿÐzÿ{ÏvÿwÎqÿvÍpÿuÍoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÍoÿtÍoÿsÍoÿsÍnÿuÌpÿwÎsÿ|Ïxÿ•Ø‘ÿ°â­ÿÇêÆÿÚñØÿëøêÿõûôÿùüùÿýþýÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿþþþÿýþýÿôûõÿé÷êÿÙñÙÿ¸å¶ÿ”Ø‘ÿ€Ò{ÿyÏuÿtÍoÿsÍnÿtÍoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÍoÿtÍoÿrÌnÿqÌlÿÑ{ÿ©à¥ÿÒîÐÿçõæÿòùòÿüþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿþþþÿöüöÿÖïÕÿ´ã±ÿœÚ˜ÿ‡ÓƒÿuÍpÿsÌnÿtÍoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿuÍpÿwÍqÿzÎtÿ~ÐxÿƒÑ}ÿ‹Ó…ÿ“ÖŒÿšÙ“ÿ Û™ÿ¦ÝŸÿ Ùšÿ–Ò‘ÿ‹Ì‡ÿ~Ä{ÿo»oÿc´dÿX¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Xÿ`²aÿj¹kÿxÁwÿ‡Êƒÿ’Ñÿ×—ÿ§Ü ÿ¢ÜœÿœÚ•ÿ–×ÿÔ‡ÿ…Ò€ÿ~ÐzÿzÏvÿwÎqÿvÍpÿtÍoÿtÎnÿtÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿtÍnÿtÍnÿtÍoÿtÍoÿuÌpÿ{ÎuÿÑ~ÿ‹Ô†ÿªà¨ÿÌíÊÿåöæÿñùñÿúüùÿýþüÿþþþÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþýÿüþüÿùüøÿëøêÿÙðØÿÄéÂÿ£Þ ÿ‚Ò~ÿrÌlÿsÍlÿtÍnÿtÍnÿtÍnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿtÎnÿtÍnÿtÍnÿtÌoÿvÍqÿ‰Ôƒÿ¶ä´ÿäôãÿõúöÿùýùÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿýþüÿòúòÿÉìÇÿžÜ›ÿ‡Óƒÿ}ÐxÿtÍoÿsÍnÿtÍnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿtÎnÿtÎnÿtÎoÿuÍpÿvÍpÿzÎtÿ~ÐyÿƒÑ}ÿ‹Ó…ÿ“ÖŒÿšØ“ÿ¡Ûšÿ¦ÝŸÿ Ùšÿ–Óÿ‹Í‡ÿ~Ä{ÿo¼oÿc´dÿX¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Xÿ`²aÿk¹kÿyÁwÿ‡Ê„ÿ’ÑŽÿؘÿ§Ý ÿ£ÜœÿÙ•ÿ–×ÿŽÔ‡ÿ†Ò€ÿÐzÿzÏuÿwÎqÿvÍpÿtÍoÿtÎnÿtÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿtÎnÿtÍnÿtÍnÿtÍnÿtÍnÿsÍmÿtÍnÿxÎsÿ~ÐyÿŒÕˆÿ Ûœÿ´ã±ÿÊëÈÿàóßÿñùðÿ÷û÷ÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüúÿôúóÿëøêÿÕðÔÿºæ¸ÿ¡ÝŸÿŽ×Šÿ{ÏvÿrÌlÿsÍmÿtÍnÿtÍnÿtÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿtÎnÿtÍnÿsÍmÿsÍnÿÐzÿŒÕˆÿ£ÝžÿÈêÆÿìøìÿúüúÿûýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúýùÿöûöÿçöæÿ¾ç»ÿ“׎ÿ}ÐxÿxÏsÿtÍoÿtÍnÿtÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿuÎnÿtÎnÿtÎnÿuÍoÿvÍpÿzÎtÿ~ÐxÿƒÑ}ÿ‹Ó…ÿ“ÖÿšØ“ÿ¡Úšÿ§Ü ÿ Úšÿ–Ô‘ÿ‹Íˆÿ}Ä{ÿo¼oÿc´dÿX¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Xÿ`²aÿk¹kÿyÁwÿˆÊ„ÿ“ÑŽÿؘÿ§Þ¡ÿ£ÜœÿœÙ–ÿ–×ÿŽÔ‡ÿ†Òÿ€Ðyÿ{ÏtÿwÎqÿvÍpÿtÍoÿtÎnÿuÎnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿtÎnÿtÍnÿtÍnÿtÍnÿsÍnÿsÍmÿrÍmÿuÍoÿ~Ðyÿ‡Õ‚ÿŸÜ›ÿ¿è¼ÿÝòÝÿèöéÿòùóÿúüúÿüýüÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýþýÿ÷û÷ÿé÷éÿÛñÙÿ½ç»ÿ›Û—ÿ€ÑzÿzÏtÿuÎpÿsÍmÿtÍnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿtÎnÿtÍnÿtÍnÿsÌlÿtÌnÿŠÔ‡ÿ¤Þ ÿ½çºÿÚñ×ÿõûôÿýþýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿöûõÿîøíÿÜòÚÿ²ã®ÿ‡ÔƒÿuÍpÿuÍnÿtÍnÿtÍnÿtÎnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎnÿtÎnÿtÎnÿuÍoÿvÍpÿzÎtÿ~ÐxÿƒÑ}ÿ‹Ó…ÿ“ÖÿšØ”ÿ¡Ûšÿ§Ý ÿ¡Ù›ÿ–Ô’ÿ‹Íˆÿ}Ä|ÿo¼oÿc´dÿY¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Yÿ`²bÿk¹kÿyÁxÿ‡Ê„ÿ“ÑÿžØ˜ÿ¨Ý¡ÿ£ÜÿœÙ–ÿ–×ÿŽÔ‡ÿ†Òÿ€Ðyÿ|ÏtÿwÎqÿvÍpÿtÍnÿtÎnÿuÎnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿtÍnÿtÍnÿtÍnÿtÍoÿvÎqÿzÎuÿ~Ñyÿ†Óÿ”ØŽÿ¡Ýžÿ¹æ¶ÿÖðÖÿòúòÿøûøÿûüüÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿýþýÿüýüÿðùðÿÚñÙÿÃéÁÿ¨ß¤ÿŠÔ„ÿrÌkÿrÌkÿsÍmÿtÍnÿtÍnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿtÍnÿtÍnÿtÍnÿtÌmÿwÍrÿ–Ù’ÿ¹å¶ÿÔïÒÿèöçÿùýùÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿîøîÿÞñÜÿÈêÅÿ¤Þ ÿ€Ñ{ÿrÍlÿsÍmÿtÍnÿtÍnÿuÎnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿtÎnÿtÎnÿuÍoÿvÍpÿzÎtÿÐxÿƒÑ}ÿ‹Ô…ÿ“ÖÿšÙ”ÿ¡Ü›ÿ§Þ ÿ¡Ú›ÿ—Ô’ÿ‹Í‰ÿ~Ä|ÿp¼oÿc´dÿY¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Yÿ`²bÿk¹kÿyÁxÿ‡Ê„ÿ“ÑÿžØ˜ÿ¨Ý¡ÿ¤ÝÿÚ—ÿ–×ÿŽÕˆÿ†Ò€ÿ€Ðzÿ|ÏuÿwÎqÿvÍpÿtÍnÿtÎnÿuÎnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎnÿtÍnÿtÍnÿtÍnÿtÍnÿsÍmÿrÌlÿtÌnÿvÍpÿyÎuÿ‡Óƒÿ–Ø‘ÿ¥Þ¡ÿ¹å¶ÿËëÉÿÛòÙÿé÷éÿùüùÿûýûÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûýûÿùüùÿèöçÿÇêÅÿ§ß£ÿ’׎ÿÑ{ÿrÍlÿsÍmÿtÍnÿtÍnÿtÍnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿtÍnÿtÍnÿuÍoÿvÍpÿ{Ïvÿ£ÝŸÿÍìËÿéöèÿóúòÿüýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýùÿãôâÿÇêÄÿ«á§ÿ“ØŽÿ|ÐvÿsÌlÿtÍnÿtÍnÿtÎnÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿtÎnÿtÎnÿuÍoÿvÍpÿzÎtÿÐxÿ„Ñ}ÿŒÔ…ÿ”×ÿ›Ù”ÿ¢Ü›ÿ¨Þ¡ÿ¡Ú›ÿ–Ô‘ÿŒÍ‰ÿ~Ä|ÿp¼oÿc´eÿY¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿ`²bÿk¹lÿyÁxÿˆÊ„ÿ“ÑÿžØ™ÿ©Ý¢ÿ¤ÝÿÚ–ÿ—ØÿŽÕˆÿ†Ò€ÿ€Ðzÿ|ÏvÿwÎqÿvÍpÿtÍnÿtÎnÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÍnÿtÍnÿtÍnÿtÍnÿtÍmÿsÍmÿrÌmÿuÎoÿzÏuÿ€Ð{ÿ–Ù’ÿ­á©ÿÄéÁÿÜòÛÿñúñÿ÷ü÷ÿûýûÿýýýÿþþþÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿüýüÿùüùÿóúóÿÝòÜÿ´ã±ÿŒÕ‡ÿ~ÐyÿxÎsÿsÍnÿtÍnÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÍnÿtÍmÿvÎqÿzÏtÿ‚Ñ}ÿ°á­ÿàòÞÿ÷ü÷ÿýþüÿþþýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿ÷ü÷ÿÙñØÿ±ã­ÿ׋ÿƒÓ~ÿxÎrÿsÍmÿtÍnÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎnÿtÎnÿuÍoÿvÍpÿzÎtÿÐyÿ„Ñ}ÿŒÔ…ÿ”×ÿ›Ú”ÿ¢Ü›ÿ¨Þ¡ÿ¢Úœÿ˜Ô“ÿŒÍˆÿ~Ä|ÿp¼pÿc´eÿY¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿ`²bÿk¹lÿzÁxÿ‰Ê…ÿ•ÑÿŸØ™ÿ©Ý¢ÿ¤ÝÿÛ–ÿ—ØÿÕˆÿ†Ò€ÿ€Ðzÿ{ÏvÿwÎqÿuÍpÿtÍnÿsÎnÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎnÿsÎnÿsÍnÿsÍnÿsÍnÿrÍnÿtÍoÿvÎqÿzÏuÿ€Ñ{ÿˆÔƒÿ’ØŽÿžÛšÿ©ß§ÿºæ·ÿÊëÇÿÚñØÿë÷êÿúýúÿþþþÿÿþÿÿÿþÿÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûýüÿöû÷ÿæõåÿÔïÓÿ¼çºÿžÜšÿ€Ñ|ÿwÎrÿuÎpÿsÍnÿsÍnÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎnÿsÍnÿrÍmÿrÍmÿ~ÑyÿÖŠÿ¢ÝÿÅéÂÿé÷èÿûýûÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿûýûÿõûõÿÑîÏÿ¥Þ ÿƒÒ}ÿ{ÏvÿuÎpÿrÍmÿsÍnÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎnÿtÎnÿuÍoÿvÍpÿzÎtÿ~Ðyÿ„Ñ}ÿŒÔ…ÿ”×ÿœÚ•ÿ¢Ü›ÿ¨Þ¡ÿ¢Úœÿ˜Ô“ÿŒÍ‰ÿ~Ä|ÿp¼pÿc´eÿY¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿ`²bÿk¹lÿzÁxÿˆÊ…ÿ”ÑÿŸØ™ÿ©Ý¢ÿ¥ÝžÿžÛ—ÿ—ØÿÕˆÿ†Ò€ÿ€Ðzÿ{ÏvÿvÎqÿuÍpÿtÍnÿsÎnÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎnÿsÍnÿsÍnÿrÍnÿrÍmÿrÍmÿqÌlÿqÍlÿtÍpÿxÎsÿ€Ñ|ÿ‘Øÿ£Þ ÿ¶ä²ÿÈêÆÿÙñÙÿàóàÿçõæÿíøíÿõúõÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿùüùÿïøïÿÐíÎÿ°â¬ÿ˜Ú”ÿ‡Ó„ÿxÏtÿtÍoÿtÍoÿsÍnÿsÍnÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÍnÿsÍnÿrÍnÿqÌlÿqÍlÿ‡Ô‚ÿ§ß¤ÿÅêÃÿÜòÛÿñùðÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿúüúÿóúóÿËìÉÿ›Ú–ÿyÎsÿuÍoÿsÍnÿsÍnÿsÍnÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎoÿsÎnÿsÎnÿtÍoÿvÍpÿzÏtÿ~Ðyÿ„Ò~ÿŒÔ†ÿ•׎ÿœÚ•ÿ£Üœÿ©Þ¢ÿ¢Úœÿ—Ô’ÿ͉ÿ~Ä|ÿp¼pÿc´eÿY¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿ`²bÿk¹lÿzÁyÿˆÊ…ÿ”Ñÿ ØšÿªÝ£ÿ¥ÝžÿŸÛ—ÿ˜Ø‘ÿÕˆÿ†Ó€ÿ€Ñzÿ{ÏvÿvÎqÿuÍpÿsÍnÿsÎnÿsÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿsÎnÿsÍnÿsÍnÿsÍnÿsÍnÿtÍoÿvÍpÿxÏrÿ~Ðyÿ…Óÿ‘Øÿ§ß¤ÿ½ç»ÿÓïÒÿé÷èÿöûöÿúýùÿúýúÿüýüÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿ÷û÷ÿðùðÿâôâÿºå¹ÿ’ØŽÿ|ÏwÿvÎrÿrÍmÿrÍmÿsÍnÿsÍnÿsÍnÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿsÍnÿsÍnÿsÍnÿrÌmÿtÍoÿ‘Øÿ¼çºÿãõãÿïøîÿøûøÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúýùÿóúóÿê÷êÿÁè¿ÿ‘׎ÿqÌlÿqÌlÿsÍnÿsÍnÿsÍnÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿsÎoÿsÎnÿsÎnÿtÍoÿuÍpÿyÏtÿ~Ðyÿ„Ò~ÿŒÔ†ÿ•׎ÿœÙ•ÿ£Üœÿ©Þ¢ÿ£Ùÿ™Ô”ÿ͉ÿÄ}ÿp¼pÿc´eÿY¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿ`²bÿk¹lÿzÂyÿ‰Ê‡ÿ–Òÿ ØšÿªÞ£ÿ¥ÝŸÿžÛ˜ÿ˜Ø‘ÿÕ‰ÿ†Ó€ÿ€Ñzÿ{ÏvÿvÎqÿuÍpÿsÍnÿsÎnÿsÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿsÎoÿsÍnÿsÍnÿsÍnÿsÍnÿsÍmÿrÍmÿrÍmÿtÍoÿwÎrÿÐzÿ‰Õ…ÿ”Øÿ¢ÞŸÿ°â­ÿ¾ç¼ÿËìÊÿØð×ÿæöåÿòùñÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿîøîÿÜòÛÿÆéÅÿ§ß¤ÿˆÓƒÿvÎrÿtÍoÿrÍmÿsÍnÿsÍnÿsÍnÿsÎnÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿsÎoÿsÎnÿsÍnÿsÍmÿuÎpÿzÏvÿ‚Òÿ¡ÜžÿËìÉÿïùîÿöûöÿûüúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿóúóÿáôàÿÍíÌÿ­á«ÿ‰Ô…ÿqÍlÿqÍlÿsÍnÿsÍnÿsÎnÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿsÎnÿsÎnÿtÍoÿuÍpÿyÏtÿ~Ðyÿ„Ò~ÿŒÔ†ÿ•׎ÿœÙ–ÿ£ÛÿªÝ£ÿ£Úÿ™Ó”ÿÍŠÿ€Ä}ÿp¼pÿc´eÿY¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿ`²bÿk¹lÿzÂyÿ‰Ì†ÿ•Ò’ÿ Ù›ÿªß£ÿ¦ÝŸÿžÛ™ÿ˜Ø‘ÿÕ‰ÿ†Ó€ÿ€Ñzÿ{ÏvÿvÎqÿuÍpÿsÍnÿsÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿsÍnÿsÍnÿsÍnÿrÍmÿrÍmÿrÍmÿqÍlÿrÌmÿvÎqÿ|ÏvÿŠÕ‡ÿžÜ›ÿ²ã°ÿÇëÆÿÝñÜÿë÷ëÿîøïÿòúòÿöûöÿúüúÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþýÿùüùÿåõåÿÇêÅÿªà¨ÿ”ØÿÑzÿtÍoÿsÍnÿsÍnÿsÍnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿsÍnÿsÍnÿrÍmÿrÍmÿwÎsÿ„Ò€ÿ”×ÿ±â¯ÿ×ðÖÿöûõÿüüûÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿüýûÿí÷ìÿÎíÍÿ¯â®ÿ˜Ú•ÿÒ}ÿrÍmÿrÍmÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿsÎnÿsÎnÿtÍoÿuÍpÿyÏtÿ~Ðyÿ„Ò~ÿŒÔ†ÿ•×ÿœÙ–ÿ¤ÜÿªÞ£ÿ¤Ûÿ™Ô“ÿŽÍŠÿÅ}ÿp¼pÿc´eÿZ¯[ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿ`²bÿl¹lÿzÂyÿ‰Ë†ÿ•Ò‘ÿ¡Ù›ÿ«ß¤ÿ¦ÝŸÿŸÛ™ÿ˜Ø’ÿÕ‰ÿ†Ó€ÿ€Ñzÿ{ÏuÿvÎqÿuÍoÿsÍnÿsÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿsÍmÿsÍmÿtÍoÿvÎqÿxÏsÿ|Ðxÿ€Ñ|ÿ†Ó‚ÿŽÖ‰ÿ–Ø“ÿ¥ß¢ÿ¸æ¶ÿÌìÊÿáóàÿôúóÿûýûÿýþýÿýþýÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿôûôÿí÷ìÿÑîÐÿ±â®ÿ”Øÿ…ÓÿxÏsÿrÍlÿrÍmÿsÍmÿsÍmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿsÍmÿsÍmÿsÍnÿsÍnÿ}Ñxÿ•Øÿ¬áªÿÆêÆÿãôãÿùüùÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüüûÿùüøÿäõãÿ¾ç¼ÿ™Ú•ÿ‰Ô„ÿ|ÐwÿrÍlÿsÍlÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿsÎmÿsÎnÿtÍoÿuÍpÿyÏtÿ~Ðyÿ„Ò~ÿŒÔ†ÿ•×ÿÚ–ÿ¤Ýÿªß£ÿ¤ÛžÿšÕ”ÿŽÎŠÿÅ}ÿp¼pÿd´eÿZ¯[ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿ`²cÿl¹lÿ{Âyÿ‰Ë†ÿ–Ò‘ÿ¡Ù›ÿ«ß¤ÿ¦ÝŸÿŸÛ˜ÿ˜Ø’ÿÕ‰ÿ†Ó€ÿ€Ñzÿ{ÏuÿvÎqÿuÍoÿsÍnÿsÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿsÎmÿsÍmÿsÍmÿsÍmÿsÍmÿsÍlÿrÍlÿrÍlÿrÍkÿqÍkÿqÌjÿpÌjÿtÍoÿ{ÐvÿƒÒ~ÿØÿŸÝœÿ­á©ÿºå·ÿÆéÃÿÏîÏÿÙòÙÿäõãÿîùïÿøüøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþýÿôûôÿáôàÿÌìÊÿ³ã°ÿ™Ú•ÿƒÓ~ÿ|ÏvÿuÎpÿrÍlÿsÍmÿsÎmÿsÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿsÍmÿrÍlÿtÍoÿvÎqÿ‡Óÿ«à§ÿÎìÌÿãôâÿðøðÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿøûøÿñùñÿ×ðÖÿ®â«ÿ‡Ó‚ÿ|ÐwÿwÎrÿsÍlÿsÍmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿtÎmÿsÎmÿsÎmÿtÍoÿuÍpÿyÏtÿ~Ðxÿ„Ò~ÿŒÔ†ÿ•×ÿÚ–ÿ¤Ýÿ«ß¤ÿ¤ÛžÿšÕ•ÿŽÏŠÿÆ}ÿq¼qÿd´eÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa²cÿl¹mÿ{ÂyÿŠË†ÿ—Ò‘ÿ¡Ù›ÿ«ß¥ÿ§Ý ÿŸÛ˜ÿ˜Ø’ÿÕ‰ÿ‡Ó€ÿ€Ñzÿ{ÏuÿvÎpÿuÍoÿsÍmÿsÎmÿsÎmÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎmÿsÍmÿsÍmÿsÍmÿsÍmÿsÍmÿsÍlÿrÍlÿrÍlÿrÍlÿqÍlÿqÌkÿqÌjÿxÎsÿƒÒ}ÿ׋ÿ¦ß¢ÿ½è»ÿÒîÐÿäõâÿòúñÿöûõÿ÷ü÷ÿùýùÿûýûÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýþýÿüýüÿùüøÿí÷ìÿÌìÊÿªà§ÿ•Ø‘ÿ‚Ó}ÿtÍnÿsÌlÿsÍmÿsÍmÿsÍmÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎmÿsÍlÿrÍlÿvÍqÿ|Ïuÿ‘×ÿÀè¾ÿî÷îÿùüùÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿñúñÿçöæÿÊìÈÿžÜšÿvÍpÿqÌkÿsÍlÿsÍmÿsÍmÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎmÿsÎmÿsÎmÿtÍnÿuÍoÿyÏsÿ~Ðxÿ„Ò~ÿÔ†ÿ–×ÿÚ–ÿ¥Ýžÿ«ß¤ÿ¤ÛžÿšÕ•ÿŽÏŠÿ€Æ~ÿq¼qÿd´fÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa²cÿl¹mÿ{Âzÿ‹Ë†ÿ–Ò‘ÿ¡Ùœÿ¬ß¥ÿ§Ý ÿŸÚ™ÿ˜Ø’ÿÕ‰ÿ‡Ó€ÿ€Ñzÿ{ÏuÿvÍpÿtÍoÿsÍmÿrÎmÿrÎmÿrÎnÿrÎnÿrÎmÿrÎmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿqÍmÿrÍlÿrÍlÿtÍnÿvÎpÿyÏtÿ}ÐwÿÒzÿ…Ó€ÿ‹Õ†ÿ׋ÿ“ØŽÿ—Ù“ÿŸÜšÿ¨ß¥ÿ³ã°ÿÄêÂÿÕðÔÿåõäÿòùñÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûüûÿ÷û÷ÿîøîÿåõäÿÑîÏÿ³ã°ÿ•Øÿ†ÓÿzÏuÿqÌkÿqÍlÿrÍmÿrÍmÿrÍmÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎmÿrÎmÿrÍmÿqÍkÿrÌlÿƒÒÿ—Ú“ÿ±â®ÿÕîÒÿöûöÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿøûøÿâôáÿËëÉÿ°â­ÿ׋ÿrÌmÿpÌjÿrÍlÿrÍmÿrÍmÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎnÿrÎmÿsÎmÿtÍnÿuÍoÿyÎsÿ~Ðxÿ„Ò~ÿÔ†ÿ–×ÿžÚ—ÿ¥Ýžÿ«ß¤ÿ¥ÛŸÿ™Õ”ÿŽÏ‹ÿ€Æ~ÿq¼qÿd´fÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa²cÿl¹mÿ{Âzÿ‹Ëˆÿ–Ò“ÿ¢Ùœÿ¬Þ¥ÿ§Ü ÿ Ú™ÿ˜Ø’ÿÕ‰ÿ‡Ó€ÿ€Ñzÿ{ÏuÿvÍpÿtÍoÿsÍmÿrÍmÿrÍnÿrÍnÿrÍnÿrÍmÿrÍmÿqÍmÿqÍmÿqÍlÿqÍlÿpÍlÿpÍlÿpÌlÿpÌkÿpÌkÿpÌkÿoÌkÿoÌjÿoÌjÿqÌkÿtÍpÿxÏtÿÑ|ÿˆÔ„ÿ‘ØŽÿžÜœÿ¬á©ÿ·å´ÿÀè½ÿÈëÆÿÏíÎÿÖïÕÿÞòÜÿäõãÿë÷ëÿñùòÿøü÷ÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿüýüÿùüùÿðùðÿÜòÛÿÆêÄÿ°â­ÿ˜Ú”ÿÓ}ÿyÏuÿuÎpÿrÍmÿrÍmÿrÍmÿrÍmÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍmÿqÍmÿqÍlÿoÌiÿrÌlÿ”Ø‘ÿ¹æ·ÿÖðÔÿèöçÿúýùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿþþþÿõûõÿÑíÏÿªà§ÿ’ØŽÿÒ}ÿrÌlÿqÍlÿrÍmÿrÍmÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍmÿrÍmÿtÍnÿuÍoÿyÎsÿ~Ðxÿ„Ò~ÿÔ†ÿ–×ÿÚ—ÿ¥Ýžÿ¬ß¥ÿ¥ÛŸÿ›Õ–ÿÏ‹ÿ€Æ~ÿq¼qÿd´fÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa²cÿl¹mÿ{ÂzÿŠË‡ÿ˜Ò’ÿ¢Ùœÿ­Þ¦ÿ¨Ý¡ÿ Ú™ÿ™Ø“ÿÕŠÿ‡Óÿ€Ðzÿ{ÏuÿvÍpÿtÌoÿsÌmÿrÌmÿrÌnÿsÌnÿsÌnÿrÌmÿrÌmÿrÍnÿtÍoÿtÎpÿtÎoÿtÎoÿtÍoÿuÎpÿuÍqÿvÎqÿuÎqÿvÏqÿwÎrÿwÎrÿzÏuÿÑ|ÿ†Ó‚ÿÖŒÿšÛ—ÿ¦ß¤ÿ¸å¶ÿÊëÈÿØðÖÿãõãÿîøîÿôùôÿ÷ûöÿøüøÿúýúÿûýûÿüþüÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿþþþÿüýüÿ÷û÷ÿï÷ïÿãóâÿÆéÄÿ©à§ÿ“Øÿ‚Ó~ÿsÍnÿpÌkÿqÌmÿrÌmÿrÌmÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿrÌmÿqÌlÿrÍmÿsÍnÿyÏuÿ§ß£ÿÖðÕÿòúòÿøüøÿüþüÿÿþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿúýúÿîùîÿ¿ç½ÿÖŒÿyÏvÿuÍpÿqÍlÿqÌlÿrÌmÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿrÌnÿrÌmÿrÌmÿtÌnÿuÌoÿyÎsÿ~Ðxÿ„Ò~ÿÔ‡ÿ–×ÿžÚ—ÿ¥ÝŸÿ¬ß¥ÿ¦ÛŸÿ›Õ–ÿÏ‹ÿ€Æ~ÿq¼qÿd´fÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa²cÿl¹mÿ|Âzÿ‹Ë‡ÿ—Ò’ÿ£Øÿ­Þ¦ÿ¨Þ¡ÿ Ûšÿ™Ø“ÿÕŠÿ‡Òÿ€Ðzÿ{ÎuÿvÍpÿtÌoÿsÌmÿrÌmÿrÌnÿsÌnÿsÌnÿrÌmÿqÌmÿwÎrÿÑ{ÿ…Ôÿ…Ôÿ„Ó€ÿ†Ô‚ÿ‹Õ‡ÿ‘ØŽÿ”Ù‘ÿ–Ú”ÿšÚ—ÿžÝ›ÿ¤Ý¡ÿªß§ÿ¯â­ÿµä³ÿ½çºÿÂéÁÿÊëÈÿÕïÓÿàòßÿèöçÿïùîÿõûöÿùüùÿûýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýþýÿûýûÿùüùÿæõåÿÏìÎÿºå¸ÿ§ß£ÿ“Øÿ„Ó€ÿ{ÐvÿrÍlÿqÌlÿrÌmÿrÌmÿrÌmÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌmÿrÌmÿrÌmÿqÌlÿqÌlÿ{Ïwÿ‹Õ†ÿÜ™ÿ¿ç½ÿäôâÿøüùÿûýûÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿõûôÿë÷ëÿÙñØÿ°â­ÿ†Ó‚ÿuÍpÿsÌnÿqÌlÿrÌmÿrÌmÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿsÌnÿrÌmÿrÌmÿsÌnÿuÌoÿyÎsÿ~Ðxÿ„Ñ~ÿÔ‡ÿ–×ÿžÚ˜ÿ¦ÜŸÿ¬ß¥ÿ¦Û ÿ›Õ–ÿÏŒÿ€Æ~ÿq¼qÿd´fÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa²cÿl¹mÿ|ÂzÿŒËˆÿ˜Ò”ÿ£Ùÿ­à¦ÿ¨Þ¢ÿ Ûšÿ™Ù“ÿÕŠÿ‡Òÿ€ÐzÿzÎuÿuÍpÿtÌoÿrÌmÿrÍmÿrÍnÿrÍnÿrÍnÿqÌmÿqÌlÿ|Ðxÿ‹Õ‡ÿ—Ú”ÿ—Ú”ÿ–Ù“ÿ›Û—ÿ¥Þ¢ÿ®â­ÿµå³ÿºå¸ÿÀç¾ÿÊëÇÿÓïÒÿÜñÚÿáôàÿçöæÿéöèÿë÷êÿíøíÿñùðÿôúôÿ÷ûöÿùýùÿúýúÿûýûÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿþþþÿýþýÿüýüÿùüùÿóúòÿÔïÓÿ¯á­ÿ‘Öÿ‡Ó‚ÿ~ÏyÿwÎsÿtÍoÿrÌmÿrÌmÿrÌmÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÌmÿrÌmÿrÌmÿpËkÿpËkÿ†Òÿ¤Ý ÿÁç¾ÿØð×ÿîùïÿûýûÿýþýÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿûýûÿì÷ìÿÙðØÿÂèÀÿ¡ÝžÿÑ{ÿrËmÿrÌmÿrÌmÿrÌmÿrÌnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍmÿrÍmÿsÌnÿtÌoÿyÎsÿ~Ïxÿ„Ñ~ÿÔ‡ÿ–ØÿžÚ˜ÿ¦Þ ÿ­ß¦ÿ¦Û ÿœÔ–ÿÎŒÿÆÿq¼qÿd´fÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa²cÿl¹mÿ|Â{ÿ‹Ëˆÿ˜Ò“ÿ£Úÿ®à§ÿ¨Þ¢ÿ¡Üšÿ™Ù“ÿÕŠÿ‡ÒÿÐzÿyÎuÿuÍpÿsÌoÿrÌmÿqÍmÿqÍnÿqÍnÿqÍnÿpÌlÿoÌlÿƒÓÿžÜ›ÿ±ã¯ÿ±ã¯ÿ°ã®ÿµä²ÿ¿è½ÿÉëÈÿÏíÎÿÕîÓÿÚðÙÿãôãÿîøíÿõúöÿùüùÿûýûÿüýüÿüýüÿüþüÿýþýÿýþýÿþþýÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýþýÿúýúÿ÷û÷ÿðùðÿæõåÿÙñÙÿºæ¸ÿ—Ø“ÿ{ÎvÿuÍqÿqËnÿpÌlÿpÌlÿqÌmÿqÌmÿqÌmÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÌmÿqÌmÿrÌnÿtÍoÿwÍsÿ“×ÿ¹ä¶ÿÚñÚÿéöéÿöúöÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýþýÿøüøÿáôàÿÄéÂÿ©à§ÿ‘×ÿzÏuÿpËkÿqÌlÿqÌmÿqÌmÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍmÿrÍmÿsÌnÿtÌoÿyÎsÿ~ÏxÿƒÑ~ÿÔ‡ÿ—ØÿŸÛ˜ÿ¦Þ ÿ­à¦ÿ§Ü ÿœÔ—ÿÎŒÿÅÿq¼qÿd´fÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa³cÿl¹mÿ|Â{ÿ‹Ëˆÿ˜Ó”ÿ£Úžÿ®à§ÿ©Þ¢ÿ¡Û›ÿ™Ù“ÿÕŠÿ†ÒÿÐzÿzÎuÿuÍpÿsÌoÿrÌmÿqÍmÿqÍnÿqÍnÿqÍnÿoÌkÿoËlÿŽ×‹ÿ·åµÿÖðÕÿÖðÕÿÔïÔÿØðÖÿÝòÜÿâôáÿæôäÿéõçÿìöëÿñùðÿöûöÿúüúÿûýûÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüþüÿóúóÿé÷éÿÙñØÿÀè¿ÿ©à§ÿ—Ù“ÿ„Ò€ÿuÍqÿsÌnÿqÌmÿpÌlÿqÌmÿqÌmÿqÌmÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÌmÿqÌmÿpÌmÿpÌlÿsÍoÿ|Ðxÿ†Óƒÿ¤Ý¡ÿÊëÈÿë÷êÿóúôÿúüúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿúüúÿõûõÿÓïÒÿ«á©ÿÖŠÿ€Ñ}ÿuÍqÿpÌlÿqÌmÿqÍmÿqÍmÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍnÿqÍmÿrÍmÿsÌnÿtÌoÿyÎsÿ~ÏxÿƒÑ~ÿÔ‡ÿ—ØÿŸÛ˜ÿ¦Þ ÿ­à§ÿ§Û¡ÿœÕ—ÿÎÿÅÿp¼qÿcµfÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa³cÿlºmÿ|Ã{ÿ‹Ì‰ÿ˜Ó”ÿ£Úžÿ®ß¨ÿ¨Ý£ÿ¡Û›ÿ™Ù“ÿÕŠÿ†ÒÿÐzÿzÎuÿuÍpÿsÌoÿrÌmÿqÍmÿqÍmÿrÍmÿrÍmÿoËjÿoËkÿ™Ú–ÿÏíÍÿñùðÿ÷ü÷ÿ÷üöÿ÷û÷ÿøüøÿùüùÿúüùÿúüúÿûüûÿüýûÿýýüÿýýýÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýþýÿûýûÿ÷ü÷ÿë÷ëÿÚðÙÿÀç¾ÿÛ™ÿ{ÏwÿtÍpÿsÍoÿpÌlÿpÌmÿqÌmÿqÌmÿqÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿqÍmÿqÌmÿqÌmÿpÌlÿpËlÿvÍrÿ†Óƒÿ˜Ú”ÿ¶å´ÿÛñÚÿöûöÿýþýÿýþýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúüúÿ÷û÷ÿïùïÿÄêÃÿ”Ø‘ÿsÌoÿpËmÿpÌlÿqÌlÿqÌmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿqÍmÿqÍmÿqÍmÿsÌnÿtÌoÿxÎsÿ}ÏxÿƒÑ~ÿŒÔ‡ÿ—ØÿŸÛ™ÿ¦Þ ÿ­à§ÿ§Ü¡ÿœÖ˜ÿÏÿÆÿq½rÿdµfÿY¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿa³cÿmºmÿ|Ã{ÿ‹Ì‰ÿ˜Ó”ÿ£Ùžÿ®ß¨ÿ©Þ£ÿ¡Û›ÿšÙ”ÿÕŠÿ†ÒÿÐzÿzÎuÿuÍpÿsÌnÿrÌmÿqÍlÿqÍlÿrÍlÿrÍlÿnËiÿoËjÿ›Ú˜ÿÓîÑÿ÷ü÷ÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿõûõÿíøìÿâôáÿÏíÎÿ»å¹ÿ¤Þ¡ÿŠÔ…ÿpËlÿnËiÿpÌkÿpÌlÿqÌlÿqÌlÿqÌlÿqÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿqÍlÿqÌlÿpÌlÿpÌmÿuÍqÿzÏvÿ‡ÓƒÿžÜ›ÿ¶åµÿÏíÍÿçöæÿúýúÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿõúõÿèöæÿØð×ÿ²â°ÿ‰Ô…ÿnËiÿnËiÿpÌlÿqÌlÿqÌlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿqÍlÿqÍlÿqÍmÿsÌnÿtÌoÿxÎsÿ}ÏxÿƒÑ}ÿÔ‡ÿ—Ø‘ÿŸÛ™ÿ§Ý¡ÿ­à§ÿ§Ü¢ÿœÖ˜ÿÐÿÇ€ÿr½rÿeµfÿY¯]ÿO©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Yÿb³cÿmºnÿ|Ã{ÿ‹Ì‰ÿ˜Ó”ÿ£ÚŸÿ®á¨ÿ©ß£ÿ¡Û›ÿ›Ù”ÿÕŠÿ†ÒÿÐzÿzÎuÿuÍpÿsÌnÿrÌmÿqÍlÿqÍlÿrÍlÿrÍlÿnËiÿnËiÿšÚ—ÿÒîÐÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿÿþÿÿÿÿÿÿûýûÿìøëÿØð×ÿÃéÀÿ¬à©ÿ–Ù’ÿ†Ô‚ÿ{ÏwÿqÌlÿpÌkÿqÌlÿqÌlÿqÌlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿqÌlÿqÌlÿqÌkÿpËkÿqÌlÿ|ÏwÿˆÕ„ÿœÜ™ÿ»æ¹ÿÙñØÿé÷èÿóúôÿüþüÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþÿÿþþÿÿþþÿÿüýüÿîøíÿÔïÓÿ¹å·ÿžÜšÿ‚Ñ~ÿoËjÿpÌkÿqÌlÿqÌlÿqÌlÿqÌlÿqÌlÿqÌlÿqÌlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÌlÿqÌlÿqÌlÿqÌlÿqÌlÿqÌlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿrÍlÿqÍlÿqÍlÿsÌnÿtÌoÿxÎsÿ}ÏxÿƒÑ}ÿÔ‡ÿ—Ø‘ÿŸÛ™ÿ§Ý¡ÿ®á¨ÿ§Ü¢ÿœÕ˜ÿÏÿÇ€ÿr½rÿeµfÿZ¯\ÿO©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿb³dÿmºnÿ|Ã{ÿ‹Ì‰ÿ˜Ó”ÿ¤Û ÿ¯á©ÿ©ß£ÿ¢ÜœÿšÙ”ÿÕ‹ÿ†ÒÿÐzÿzÎuÿuÍpÿsÌnÿrÌmÿqÍlÿqÍlÿrÍmÿrÍmÿnËiÿnËiÿšÚ—ÿÒîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿýýýÿüýüÿúýúÿôúóÿßóÞÿÁè¿ÿ¥Þ¢ÿŽ×ŠÿxÏsÿoÌjÿpÌkÿqÌlÿqÌlÿqÍlÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿqÌlÿqÌlÿqÌlÿqËkÿsÌnÿ…Óÿ™Ú•ÿ²ã°ÿÕïÓÿóúòÿúüúÿüýüÿüýüÿüüüÿüüüÿýýýÿýýýÿüüüÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýþÿýýýÿùüøÿæõåÿÂè¿ÿÜ™ÿŒÖ‡ÿ{ÐwÿpÌkÿqÌlÿqÌlÿpËkÿpËkÿpËkÿpËkÿpËkÿpËkÿpËkÿpËkÿpÌkÿpËkÿpÊkÿpËkÿpËkÿpËkÿpËkÿpËkÿpËkÿpËkÿpËkÿqÌlÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍlÿqÍlÿqÍlÿsÌnÿtÌoÿxÎsÿ}ÏxÿƒÑ~ÿÔ‡ÿ—Ø‘ÿ Ûšÿ§Þ¡ÿ®à¨ÿ§Ý¢ÿœÕ—ÿÏÿÇ€ÿr½rÿeµgÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿmºnÿ}Ã|ÿŒÌ‰ÿ˜Ô–ÿ¤ÛŸÿ¯á©ÿªß¤ÿ¢ÜœÿšÙ•ÿÖ‹ÿ†ÒÿÐzÿzÎuÿuÍpÿsÌnÿrÌmÿqÍlÿqÍlÿrÍmÿrÍmÿnËiÿnËiÿšÚ—ÿÒîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýþýÿûýûÿúüúÿñùñÿåõäÿ×ðÖÿÀç¼ÿ¦ß¢ÿ׋ÿÑ|ÿtÍoÿoËjÿpÌkÿqÌlÿqÌlÿqÍlÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍlÿqÍlÿqÌlÿpÌkÿsÍoÿvÎrÿÐzÿ›Ú—ÿ¸åµÿÑíÏÿåõäÿùûøÿûûûÿùùùÿøøøÿ÷÷÷ÿöööÿõõõÿõõõÿõõõÿ÷÷÷ÿøøøÿúúúÿúúúÿûûûÿüüüÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿöûõÿîøîÿÕïÔÿ¯â¬ÿ‹Ö†ÿ€ÑzÿwÎrÿpÌlÿqÌlÿqÌlÿpËkÿpËkÿpËkÿoÉjÿoÈjÿnÈiÿnÇiÿmÅhÿmÅhÿlÅhÿlÄhÿmÄhÿmÅhÿnÆiÿnÇiÿoÉjÿpÊkÿpËkÿpËkÿqÌlÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿqÍlÿqÍlÿrÌnÿtÌoÿxÎsÿ}ÏxÿƒÑ~ÿÕˆÿ—Ø’ÿ Ûšÿ§Ý¢ÿ®à¨ÿ¨Ý¢ÿÕ™ÿ‘ÏŽÿÇ€ÿr½rÿeµgÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿmºnÿ}Ã|ÿŒÌ‹ÿ™Ô•ÿ¤Û ÿ¯á©ÿªß¤ÿ¢ÜœÿšÚ–ÿÖ‹ÿ‡ÓÿÐzÿzÏuÿtÍpÿsÌnÿqÌmÿqÍlÿqÍlÿqÍmÿqÍmÿnËiÿnËiÿšÚ—ÿÒîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿüþüÿùüùÿõúõÿåõäÿÌìËÿ´ä±ÿŸÜ›ÿŠÕ†ÿzÎvÿuÎpÿrÌmÿqÌlÿqÌlÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍlÿqÌlÿqÌlÿpÌkÿpÌkÿvÍqÿ~Ð{ÿÖ‡ÿ²ã¯ÿØñ×ÿïøïÿõùôÿùúùÿøøøÿõõõÿòòòÿïïïÿîîîÿìììÿíííÿíííÿïïïÿóóóÿõõõÿøøøÿúúúÿûûûÿüüüÿýýýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿúüúÿíøíÿßòÞÿÃéÂÿÜšÿyÎuÿtÍoÿrÌmÿqÌlÿqÌlÿqÌlÿpËkÿpÌkÿpÊkÿoÈjÿmÅhÿlÄgÿkÂfÿj¿eÿi¾dÿi½dÿi½dÿi¾eÿj¿eÿkÁfÿmÄhÿnÇiÿoÉjÿpÊkÿpËkÿqÌlÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍlÿqÍlÿrÌnÿsÌoÿxÎsÿ~Ðxÿ„Ò~ÿÕˆÿ—Ù’ÿ Ûšÿ¨Ý¢ÿ¯à©ÿ¨Ý£ÿÕ™ÿ‘ÏŽÿ‚Ç€ÿr½sÿeµgÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿnºnÿ}Ã|ÿŒÌ‹ÿ™Ô–ÿ¥Û ÿ°áªÿ«ß¥ÿ£ÜÿšÙ•ÿ‘Ö‹ÿ‡ÓÿÐzÿzÏuÿtÍpÿrÌnÿqÌmÿpÍlÿpÍlÿpÍmÿpÍmÿmËiÿmËiÿšÚ—ÿÒîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüûÿùûøÿôûóÿê÷êÿàóàÿÍìÌÿ²ã°ÿ™Ú•ÿ‰Ô…ÿyÎuÿoËkÿoÌkÿpÌlÿpÌlÿpÌlÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍlÿpÌlÿqÌlÿqÌlÿrÌmÿ~ÐzÿÖ‹ÿ£Þ ÿÈêÅÿìøëÿúüúÿüûüÿø÷øÿóòóÿíííÿçççÿäääÿáááÿàààÿáááÿãããÿåååÿéééÿíííÿòòòÿõõõÿøøøÿúúúÿüüüÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüýüÿýþýÿõûõÿßòÞÿÇêÆÿ¬àªÿŒÕ‰ÿpÌlÿnËjÿoÌlÿpËkÿpËkÿpËkÿpÊkÿoÈjÿnÇiÿlÃhÿjÀfÿh¼dÿg¹bÿe¶`ÿd´_ÿc³_ÿc²_ÿdµ`ÿf·aÿgºcÿj¿eÿlÄgÿnÇiÿoÉjÿpËkÿpÌlÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍlÿqÍlÿrÌnÿsÌoÿxÎsÿ~Ðxÿ„Ò~ÿÕˆÿ—Ø’ÿ Û›ÿ¨Þ¢ÿ¯á©ÿ¨Ý£ÿÕ™ÿ‘ÏŽÿ‚Ç€ÿr½sÿeµgÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿnºnÿ}Ã|ÿÌŠÿšÓ—ÿ¥Û ÿ°áªÿ¬ß¥ÿ£ÜÿœÙ•ÿ‘Ö‹ÿ‡ÓÿÐzÿzÏtÿtÍpÿrÌnÿqÌmÿpÍlÿpÍlÿpÍmÿpÍmÿmËiÿnËiÿšÚ—ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿöúõÿîøìÿáóàÿÌìËÿ¸å·ÿ¦Þ¤ÿ•Ø’ÿ…Ó‚ÿ|ÐxÿuÍqÿoÌkÿoÌlÿpÌlÿpÌlÿpÍlÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍlÿpÌlÿpÌlÿoÌkÿpÌlÿqÌmÿuÍqÿ‹Õ‰ÿªà¨ÿÇéÅÿÝòÜÿóúóÿüýüÿùùùÿôóóÿíììÿäãâÿÝÛÚÿØÖÔÿÔÒÐÿÑÏÎÿÓÑÏÿÔÒÐÿØÖÕÿÝÛÚÿãâáÿèèçÿîîîÿóóóÿ÷÷÷ÿûûûÿûûûÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿúüúÿí÷íÿÉëÈÿ¦Þ£ÿŽÖ‹ÿ~Ð{ÿoÌkÿoÌjÿpÌlÿpËkÿoÊkÿoËkÿnÈiÿlÄhÿkÁfÿi½dÿf·`ÿb²\ÿ`®Yÿ^ªWÿ]§Vÿ\¦Uÿ\¤Uÿ]¨Wÿ_¬Xÿb±[ÿe¸_ÿi¿dÿlÄhÿnÇiÿpËkÿpÌlÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍmÿpÍlÿqÍlÿrÌnÿsÌoÿxÎtÿ~Ðyÿ„Ò~ÿŽÕˆÿ˜Ø’ÿ Û›ÿ¨ß£ÿ¯á©ÿ©Ý¤ÿžÕšÿ’Ïÿ‚Çÿr½sÿeµgÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿmºnÿ}Ã|ÿÌ‹ÿ›Ó–ÿ¦Û¡ÿ°à«ÿ«Þ¥ÿ£Üÿ›Ú•ÿ‘ÖŒÿ‡Ó‚ÿÐ{ÿzÏtÿtÍoÿrÌnÿqÌmÿpÍlÿpÍlÿqÍmÿqÍmÿmËiÿnËiÿ™Ú—ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿüþüÿûýûÿøü÷ÿïùïÿàóßÿÌëÊÿ¯á­ÿ’׎ÿÑ~ÿyÏvÿsÍoÿqÌmÿqÌmÿpÌlÿpÌlÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿpÌlÿpÌlÿpÌlÿoÌkÿqÌmÿuÍqÿzÐwÿšÛ˜ÿÅêÄÿéöéÿóùóÿûýûÿüüüÿöööÿñððÿæååÿÛÚÙÿÐÏÎÿÉÈÆÿÃÂÀÿÀ¿½ÿÂÀ¿ÿÃÂÀÿÈÇÅÿÏÎÍÿÕÔÓÿÞÝÝÿææåÿíííÿóóóÿøøøÿûûûÿüüüÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿýþýÿùûùÿõúõÿãôâÿ´ã²ÿ…Ô‚ÿrÌnÿpËlÿoÌkÿpÌlÿpÍlÿoÌkÿoÊlÿoÈjÿlÆhÿkÀfÿg»cÿdµ_ÿ`®[ÿ\¨WÿZ¢TÿWžQÿUšOÿT™OÿS—NÿVœPÿY¢Tÿ\¨Wÿa±\ÿgºbÿkÁeÿmÆiÿoËkÿpÍlÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿpÍmÿpÍlÿpÍlÿrÌnÿsÌoÿxÎtÿ~Ðyÿ„ÒÿŽÕˆÿ˜Ù’ÿ¡Û›ÿ©ß£ÿ°áªÿ©Ý¤ÿžÕšÿ’Ïÿ‚Æ‚ÿs½sÿeµgÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿnºnÿ}Ã}ÿÌ‹ÿšÔ–ÿ¦Û¡ÿ±à«ÿ«ß¥ÿ£Üÿ›Ú–ÿ‘ÖŒÿ‡Ó‚ÿÐ{ÿzÏuÿtÍpÿrÌnÿqÌmÿpÍlÿpÍlÿqÍmÿqÍmÿmËiÿmËiÿ™Ú—ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿüýüÿúüúÿóúóÿéöèÿÞòÝÿÏîÍÿÀç¾ÿ®á¬ÿ—Ù”ÿÑ~ÿvÍqÿrÌnÿoÌkÿoÌkÿpÌlÿpÌlÿpÌlÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿpÍlÿpÌlÿpÌlÿpÌmÿqÍmÿzÐvÿŠÔ‡ÿšÚ™ÿ·åµÿÙñØÿõúõÿúüúÿýýüÿüüüÿöõôÿïîîÿÙßåÿ»ÎÛÿ£¾Óÿœ¸Íÿ—³Éÿ•±Æÿ•²Èÿ—³Éÿ ¸Ëÿ«¿Íÿ·ÅÏÿÆÏÕÿ×ÙÛÿââáÿêééÿñññÿõõõÿùùùÿûûûÿüüüÿýýýÿýýýÿýýýÿýýýÿþþþÿÿÿÿÿûýûÿìøìÿÛðÛÿÃèÃÿžÜœÿzÏvÿmÊiÿoÊjÿpËlÿoËkÿoËkÿnÊjÿmÇiÿkÄgÿj¿eÿf¸`ÿb²]ÿ]¬bÿX¦gÿS lÿPrÿLšxÿJ˜{ÿI–yÿI–yÿK™zÿN|ÿR¤{ÿ[®qÿd·gÿi¿eÿlÅgÿoËkÿpÍlÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿpÍmÿpÍlÿpÍlÿrÌnÿsÌoÿxÎsÿ~Ðyÿ„ÒÿŽÕ‰ÿ˜Ù’ÿ¡Ü›ÿ©ß£ÿ°áªÿ©Ý¤ÿŸÖ™ÿ’ÏÿƒÆÿs½sÿeµgÿZ¯\ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿnºoÿ~Ã}ÿŽÌŒÿ›Ô—ÿ¦Û¡ÿ±â«ÿ¬à¦ÿ£Üžÿ›Ú–ÿ‘ÖŒÿ‡Ó‚ÿÐzÿzÏuÿtÍpÿrÌnÿqÌlÿpÍlÿpÍlÿqÍlÿqÍlÿmËiÿmËjÿ™Ú—ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿþÿÿÿþÿÿþþþÿþþþÿûýûÿ÷û÷ÿæõæÿÌìËÿ³ä±ÿ¤Þ¢ÿ—Ù”ÿŠÔ‡ÿ€Ñ}ÿwÎsÿrÍoÿqÌmÿpÌlÿpÌlÿpÌlÿpÍlÿpÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿpÌlÿpÌlÿpÌlÿoÌkÿoÌkÿrÌnÿuÍqÿ…Ó‚ÿ¥Þ£ÿÄéÃÿÙñØÿë÷êÿúýúÿûýûÿýþýÿúûúÿôôóÿìëìÿÇÙçÿ”Áâÿh¬Þÿa¨Üÿ^¤ÚÿZ¢Ùÿ[£Ùÿ]¤Úÿj¨×ÿ}­Ñÿ‘´Íÿª¾ÎÿÄÊÎÿØÕÔÿàßÝÿèèçÿïïïÿôôôÿúúúÿûûûÿüüüÿýýýÿýýýÿýýýÿþþþÿÿÿÿÿøüøÿÜòÛÿ¹æ¸ÿœÚšÿˆÔ…ÿuÍqÿnÊjÿoËlÿpËlÿoÊkÿnÉjÿmÇiÿjÂfÿh½dÿe¶_ÿ`¯Zÿ\§VÿV¢eÿOžvÿHš‰ÿC™ÿ>˜±ÿ;˜¹ÿ;—¹ÿ:—·ÿ<™·ÿ@›·ÿD ®ÿRªÿ`µpÿi¾dÿlÄgÿoËkÿpÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿpÍlÿpÍlÿrÌmÿsÌoÿxÎsÿ~Ðyÿ„ÒÿŽÕ‰ÿ˜Ù“ÿ¡Ü›ÿ©ß£ÿ°â«ÿªÝ¤ÿŸ×šÿ”Ïÿ„Æÿs½sÿeµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­Zÿb³dÿnºoÿ~Ã}ÿÍŒÿœÔ—ÿ§Ü¢ÿ²â¬ÿ¬à¦ÿ£Ýžÿ›Ú–ÿ‘ÖŒÿ‡Ó‚ÿÐzÿzÏuÿtÍoÿrÌnÿqÌlÿpÍkÿpÍkÿqÍkÿqÍkÿmËhÿmËhÿ™Ú–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿþýþÿýýýÿûýûÿùüùÿ÷û÷ÿóúôÿíøìÿÕïÔÿ°â®ÿŽ×ŠÿÑ|ÿvÍrÿnÌiÿoËjÿoÌjÿpÌjÿpÌkÿpÌkÿpÌkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿpÌkÿpÌkÿpÌkÿoÌkÿqÌmÿwÎsÿ~Ðzÿ”Ø’ÿ¿ç½ÿèöèÿõúöÿúýúÿýþüÿþþþÿþþþÿúúúÿôóòÿëëëÿ¹Ôèÿs¶çÿ9çÿ5œçÿ6žèÿ4éÿ3œéÿ3œéÿBžâÿX¡×ÿp¥Íÿ°Êÿ¯½ÇÿÆÈÉÿÓÓÓÿÞÞÞÿçææÿïïïÿöööÿùùùÿûûûÿýýýÿýýýÿýýþÿüþüÿúýúÿñúñÿÌìËÿœÛ™ÿzÏwÿuÍpÿpÌmÿnËjÿoËkÿoËkÿnÉjÿnÆiÿkÄgÿh½dÿd¶_ÿ`®]ÿ[¦XÿVžWÿNšoÿF—Šÿ?–¥ÿ;™Ãÿ6›ßÿ5ìÿ6ëÿ8žêÿ8èÿ7œçÿ:žÙÿL¨©ÿ_´wÿh½cÿlÄgÿoËkÿpÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿpÍkÿpÍlÿrÌmÿsÌnÿxÎsÿ~Ðyÿ„ÒÿŽÕ‰ÿ˜Ù“ÿ¡Üœÿ©ß¤ÿ±á«ÿªÞ¥ÿŸÖ›ÿ“Ðÿ„Æÿs½tÿeµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿV­[ÿb³dÿnºoÿ~Ã}ÿÍ‹ÿ›Õ—ÿ¨Ü¢ÿ²â¬ÿ¬à¦ÿ¤ÝžÿœÚ—ÿ‘ÖŒÿ‡Ó‚ÿÐzÿzÏuÿtÍoÿrÌmÿqÌlÿpÍkÿpÍkÿqÍkÿqÍkÿmËhÿmËhÿ™Ú–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýþýÿûýûÿøûøÿïùïÿäôãÿÙðØÿÍíÌÿ¿ç½ÿ­á«ÿ–Ù’ÿÑ}ÿxÏtÿrÌnÿnËiÿoÌjÿpÌkÿpÌkÿpÌkÿpÌkÿpÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿpÌkÿpÌkÿpÌkÿoÌjÿrÌnÿvÎrÿ}ÐyÿÖŒÿ¢ÜŸÿ¹å¶ÿÖðÕÿòùñÿúüúÿûýûÿþþþÿÿÿÿÿþþþÿúúúÿöôóÿííìÿºÕêÿoµèÿ4œèÿDªìÿZ»ðÿaÀòÿY¼ñÿO¹ñÿP²ëÿUªâÿ[¥ÙÿoªÕÿƒ°Òÿ˜·Ðÿ´ÄÐÿÎÐÒÿÜÛÙÿåääÿíííÿòòòÿ÷ööÿúúúÿüüüÿýýýÿôûôÿæöæÿ×ðÕÿ³ã±ÿŽÖŠÿtÍpÿqÌmÿpÌlÿoÊkÿnÉjÿnÈiÿlÅgÿjÁeÿh»cÿd´^ÿ_¬YÿY¦aÿQ uÿJ›‡ÿEš›ÿA™®ÿ?œÂÿF¨ÖÿM³ìÿT»ôÿ^ÀôÿfÂõÿX·ñÿD§íÿ: ÞÿLª¬ÿ_¶wÿi¾cÿmÄgÿoËkÿpÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿqÍkÿpÍkÿpÍlÿrÌmÿsÌnÿxÎsÿ~Ðyÿ„ÒÿŽÕ‰ÿ˜Ù“ÿ¡ÜœÿªÞ¤ÿ±á«ÿªÞ¥ÿŸÖ›ÿ“ÐÿƒÆ‚ÿs½tÿeµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿb³dÿnºoÿ~Ã}ÿŽÍ‹ÿ›Õ—ÿ§Ü¢ÿ²â¬ÿ®à§ÿ¥ÝŸÿœÚ—ÿ’Öÿ‡Ó‚ÿÐzÿzÏuÿtÍoÿrÌmÿqÌlÿpÍkÿpÍkÿpÍlÿpÍlÿmËhÿmËhÿ™Ú–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿýþýÿüýûÿùüøÿóúòÿàóßÿËìËÿ¸å·ÿ¤Þ ÿÖŒÿƒÒ~ÿ|ÐxÿuÎqÿsÍnÿqÌmÿpÌkÿpÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÌkÿpÌkÿpÌkÿoÌjÿoÌjÿuÍpÿ}ÐyÿŠÖ†ÿ©à¦ÿÈëÆÿÞóÝÿì÷ëÿùüøÿüþüÿüýüÿþþþÿÿÿÿÿþþþÿûûûÿ÷õôÿðïîÿ»Öëÿn´êÿ4œéÿX¹ïÿ…Ùöÿ”èúÿ„àùÿs×øÿdÈôÿU¶ìÿH¦æÿN¤âÿU£Þÿi§Ùÿ’µÐÿ¼ÂÆÿÐÎÌÿÚÙØÿääãÿëëêÿòñòÿ÷÷÷ÿûúûÿúüúÿì÷ëÿÏîÎÿ³ä°ÿšÛ—ÿÑ}ÿqÌlÿpÌkÿpËkÿoÉjÿnÈiÿmÅhÿi¿eÿf»bÿc³^ÿ^«WÿZ¢QÿRhÿG›’ÿ>™»ÿ<›Éÿ;œÓÿ@¤ÞÿS¸éÿfÌõÿwÚùÿ‰ãùÿ˜éúÿzÒõÿT´ïÿ=¢ßÿM¬¬ÿa¸xÿj¿bÿmÅgÿoËjÿpÍkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍkÿpÍkÿpÍkÿrÌmÿsÌnÿxÎsÿ~Ðyÿ„ÒÿŽÕ‰ÿ™Ù”ÿ¢ÜœÿªÞ¥ÿ²á¬ÿ«Þ¦ÿ Ö›ÿ“ÐÿƒÆ‚ÿs½tÿfµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿX­[ÿb³dÿoºoÿ~Ã}ÿŽÍŒÿ›Õ˜ÿ§Ü£ÿ³â­ÿ­à§ÿ¤ÝŸÿœÚ—ÿ’Öÿ‡Ó‚ÿÐzÿzÏuÿtÍoÿrÌmÿqÌlÿoÍkÿoÍkÿoÍlÿoÍlÿlËhÿlËhÿ™Ú–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿüýüÿûüúÿ÷ûöÿóùòÿíøìÿåõäÿÛñÙÿÇëÅÿ±ã°ÿœÜ›ÿˆÕ„ÿuÍpÿlËhÿmÌiÿnÌjÿoÌkÿoÌkÿoÌkÿoÌkÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÌkÿoÌkÿpÌlÿsÍmÿvÎqÿ‚Ò~ÿ‘׎ÿ¤Þ¡ÿÃéÀÿâôáÿôúôÿùüùÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿþþþÿûûûÿù÷öÿññðÿ¾Øíÿr¶éÿ9èÿc¿ðÿ”åùÿ§ôýÿ—ðýÿ†èüÿrØùÿ[ÃôÿG°ïÿC©ìÿA¢çÿO¡àÿv«ÓÿžµÇÿ¶ÀÈÿÇÌÑÿ××ÙÿáàáÿêéëÿñññÿóõóÿôøôÿÞñÝÿ¹å·ÿ–Ú“ÿ†Ô‚ÿxÏtÿnËiÿoÊiÿnÉjÿmÇhÿlÄfÿj¿eÿf¹bÿa²_ÿ]«^ÿW£`ÿR›dÿK™ÿB›®ÿ:œÚÿ<¢åÿ@¨êÿJ²ðÿ_ÇöÿwÞûÿŠêýÿóýÿ«óüÿˆÝöÿY¹íÿ=¢ÛÿN¬ªÿbºxÿkÂcÿnÇgÿoËjÿoÍkÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍkÿoÍkÿpÍkÿrÌmÿsÌnÿxÎsÿ~Ðyÿ„ÒÿŽÕ‰ÿ™Ù”ÿ¢ÜÿªÞ¥ÿ²á¬ÿ«Þ¦ÿ Öœÿ“ÐÿƒÆ‚ÿt½tÿfµgÿ[¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿb³dÿoºoÿÃ~ÿŽÍŒÿœÕ˜ÿ¨Ü¤ÿ³â­ÿ­à§ÿ¥ÝŸÿÚ—ÿ’Öÿ‡ÓÿÐyÿyÏuÿtÍoÿrÌmÿpÌlÿoÍkÿoÍkÿoÍlÿoÍlÿlËhÿmËhÿ™Ú–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿûýüÿùüùÿôúóÿçõåÿØñ×ÿÈëÈÿ¹å·ÿ©à¦ÿÛ›ÿ’Øÿ†Õƒÿ|ÑxÿqÌmÿmËiÿnÌjÿoÌkÿoÌkÿoÌkÿoÌkÿoÍkÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÌkÿoÌkÿoÌkÿnÌjÿsÍmÿ{Ðvÿ…Ôÿ›Ü™ÿµä³ÿÍìÌÿßóÞÿïùïÿùüùÿüýüÿýþýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿúù÷ÿóóòÿÄÜîÿ»éÿI¢åÿe½îÿŠÜ÷ÿšëüÿ”ìüÿëüÿ~ãûÿmÖùÿ\ÉöÿR½òÿJ°íÿK¨æÿ[§Þÿm©Öÿ‡±Òÿ§½ÎÿÅÉÍÿÓÔÕÿàßàÿæçæÿäëäÿáíàÿÉéÇÿ¥Ý¢ÿƒÒÿyÎuÿsÌoÿnÊjÿmÉiÿlÆhÿjÂfÿg½cÿe·_ÿa°^ÿ[¨\ÿU¢bÿMzÿF™”ÿBš®ÿ@ŸËÿ@¥äÿH±íÿS¾òÿ_ËöÿqÙùÿ‚æüÿŒëýÿ–ìüÿ›ëûÿ|ÓïÿU³àÿ=¡ÌÿO­¢ÿc»vÿlÄdÿnÈgÿoÌjÿoÌkÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍlÿoÍkÿpÍkÿqÌmÿsÌnÿxÎsÿ}Ðyÿ„ÒÿŽÕ‰ÿ™Ù”ÿ¢Üÿ«Þ¥ÿ²á¬ÿ«Þ¦ÿ Ö›ÿ•Бÿ„Æ‚ÿt½tÿfµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿb³dÿoºoÿÃ~ÿÍŒÿœÕ˜ÿ¨Ü£ÿ³â­ÿ¯à©ÿ¦Ý ÿžÚ—ÿ’Öÿ‡ÓÿÐyÿyÏuÿsÍoÿqÌmÿpÌlÿoÍkÿoÍkÿpÍlÿpÍlÿlËhÿmËhÿšÚ–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýþýÿüþüÿüýûÿûýûÿùýùÿ÷ü÷ÿôúôÿê÷éÿÔïÒÿ¼çºÿ¥ß£ÿŽÖ‹ÿxÏuÿuÎqÿtÍqÿsÍoÿpÍlÿoÌkÿoÌkÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍkÿoÌkÿoÌkÿnÌjÿnÌjÿuÍqÿ…Ôÿ–Ú“ÿµå³ÿØñ×ÿòúñÿùüøÿûýûÿýýýÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿúùøÿô÷õÿËàïÿŒÀèÿY©äÿj»ëÿÒõÿ‹àúÿçüÿ’îýÿ‹íýÿ~èüÿqáüÿcÐ÷ÿU¿ñÿJ°íÿC¦éÿ>åÿ[£Ûÿ‡¯Ìÿ±ºÁÿÃÇËÿÓÔÖÿÛÝÙÿÔàÒÿÌãÊÿ´Þ²ÿ‘ÔŽÿqËmÿnÊjÿoÊkÿmÉiÿkÆgÿjÃfÿg½cÿc¶^ÿ`¯[ÿZ§[ÿTŸ[ÿN˜jÿD˜–ÿ;˜Åÿ;Üÿ@¦åÿF¯íÿVÀóÿgÔ÷ÿuãüÿ€èýÿŒìþÿŽëüÿŒåüÿ‰ÞùÿpÈèÿQ¯Ôÿ? ½ÿP­˜ÿd¾tÿlÆeÿnÉhÿnËjÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍlÿoÍkÿoÍkÿqÌmÿrÌnÿwÎsÿ}Ðyÿ„ÒÿÕ‰ÿ™Ù”ÿ£Üÿ«ß¥ÿ³â­ÿ¬Þ§ÿ¡×ÿ”Бÿ…ƃÿt½tÿfµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿa³dÿnºoÿÃ~ÿÍÿœÔ™ÿ©Ü¤ÿ´á®ÿ®à¨ÿ¦Ý ÿžÚ—ÿ’×ÿ‡ÓÿÐyÿyÏuÿsÍoÿqÌmÿpÌlÿoÍkÿoÍkÿpÍlÿpÍlÿlËhÿmËhÿšÚ–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýüÿ÷ü÷ÿòùòÿíøìÿèöèÿãõãÿÛòÚÿÒîÐÿÆêÄÿ´ä±ÿ¡ÝŸÿ×ÿ}ÑyÿlËhÿlËhÿmÌiÿnÌjÿnÌjÿoÌkÿoÌkÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍkÿoÌkÿoÌjÿoÌkÿrÎpÿwÎtÿ…Ô‚ÿÜšÿµä³ÿÎíÎÿé÷éÿûýûÿÿþÿÿÿþÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüüüÿüûúÿöø÷ÿÒåñÿ›Çéÿm±äÿo»êÿwÉòÿ~Õ÷ÿŠâûÿ–îýÿïþÿƒìþÿwçþÿlÚúÿaÍöÿVÀòÿJ´ñÿ@©îÿP¨ãÿo«Õÿ‹¯Êÿ¡ºËÿ¶ÅÍÿÀÍÉÿ¶Ï¹ÿªÑ©ÿ˜Ï•ÿ€É}ÿjÅfÿiÅeÿkÅgÿjÄgÿiÀdÿg»bÿbµaÿ]®`ÿY¦`ÿR¡lÿLšyÿF˜ŽÿCœ´ÿ@£ÛÿD¬íÿM¶ðÿVÁóÿbÎ÷ÿnÝûÿzéþÿ†ìÿÿ‘îþÿéüÿ†ßûÿ|Ô÷ÿhÂáÿQ®ÈÿD£®ÿT°ÿeÀsÿmÇfÿmÊhÿnËjÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍlÿoÍkÿoÍkÿqÌmÿrÌnÿwÎsÿ}Ðyÿ„ÒÿÕ‰ÿšÙ”ÿ£Üÿ«à¦ÿ³â­ÿ¬Þ§ÿ¡×ÿ”Ð’ÿ„ƃÿt½tÿfµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿa³dÿnºoÿÄ~ÿÍŽÿžÕ™ÿªÜ¤ÿ´â®ÿ®á©ÿ¥Ý¡ÿžÚ˜ÿ’×ÿ‡ÓÿÐyÿyÏuÿsÍoÿqÌmÿpÌlÿoÍkÿoÍkÿpÍlÿpÍlÿlËhÿmËhÿšÚ–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿñùðÿäõãÿ×ðÖÿÊìÉÿ½è½ÿ°ã®ÿ¡Ýžÿ•Ù’ÿÖŠÿ†Ó‚ÿ~ÑyÿuÎqÿnÌjÿnÌjÿoÌkÿoÌkÿoÌkÿoÌkÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÌkÿoÌkÿnÌjÿmËiÿoÌkÿyÏvÿ†Ôƒÿ›Ü˜ÿºæ¸ÿØðØÿè÷çÿóûôÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüüüÿ÷úúÿØèóÿªÏìÿ‚ºåÿw½êÿnÁðÿqÉõÿ…Üøÿ˜ìüÿ“ïþÿƒêþÿvçýÿráüÿoÜúÿiÖøÿ^ÊöÿR¾óÿRµìÿW¬ãÿ]¥Úÿw¬Ïÿ’´Åÿ¹µÿ‘ºšÿ‚»ÿx¼sÿp¾kÿg¿cÿhÀdÿiÀdÿg¾cÿe¹_ÿa³\ÿ]¬^ÿW¤cÿQjÿIš†ÿ@—¥ÿ=™ÁÿC¦ÕÿL³èÿU¿òÿ`Ëõÿj×ùÿoÝûÿrãüÿyèþÿ‡ëþÿ”îþÿ‘çûÿÙúÿqÊõÿa½ÜÿR®½ÿK¨¡ÿX´‰ÿgÃrÿnÉhÿnËiÿnËjÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍkÿoÍkÿqÌmÿrÌnÿwÎsÿ}Ðyÿ„ÒÿÖŠÿšÙ”ÿ£Üžÿ¬à¦ÿ³ã­ÿ­Þ§ÿ¡Øœÿ•Ð’ÿ„ǃÿt½tÿfµgÿZ¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿb³dÿoºoÿÄ~ÿÍŽÿÕ™ÿ©Ý¤ÿ´ã¯ÿ¯áªÿ¦Þ¡ÿÛ™ÿ’×ÿ‡ÓÿÐyÿyÏuÿsÍoÿqÌmÿpÌlÿoÍkÿoÍkÿpÍlÿpÍlÿlËhÿmËhÿšÚ–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿýýýÿüýüÿûýûÿúýùÿøüøÿ÷ü÷ÿõûõÿòúñÿäõãÿÒíÐÿ¿ç½ÿ®â¬ÿ›ÜšÿŠÖ†ÿxÏtÿmËhÿmËiÿnÌjÿoÌjÿoÌkÿoÌkÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÌkÿnÌjÿnÌjÿnÌjÿsÍnÿ„Óÿ—Ú”ÿ²ã¯ÿÖðÕÿóúóÿúýúÿýþüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿùûüÿàíöÿ»×ìÿ—Åæÿ¿éÿf¹îÿc¾òÿÕ÷ÿšëüÿ—îþÿ„éýÿvæýÿwçýÿzéýÿxæüÿnÜúÿdÒ÷ÿVÁôÿE®ïÿ8žéÿR¢Õÿq§Àÿ}©§ÿn¨…ÿ_§bÿ\«Yÿ`²\ÿe¹`ÿe¹aÿfºaÿe¸`ÿa±]ÿ\ªZÿW¤_ÿPœjÿI•wÿA– ÿ9˜Ìÿ8žëÿG°ðÿWÂôÿcÑøÿoÝûÿzéýÿzéþÿwèýÿxçýÿˆëýÿ˜îýÿ’æüÿ{ÒøÿeÀôÿ\·ÕÿT°±ÿQ¬“ÿ\¹‚ÿiÅpÿoËiÿoËjÿnËjÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍkÿoÍkÿqÌmÿrÌnÿwÎsÿ}Ðyÿ„ÒÿÖŠÿšÙ•ÿ£Ýžÿ¬ß¦ÿ´â®ÿ­ß¨ÿ¢×žÿ•Ñ’ÿ…ǃÿt½tÿfµgÿZ¯^ÿO©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³dÿoºpÿÄÿÍÿÕ™ÿ©Ý¥ÿµã¯ÿ°á©ÿ¦Þ¡ÿÛ™ÿ’×ÿ‡ÓÿÐyÿyÏuÿsÍoÿqÌmÿpÌlÿoÍkÿoÍkÿpÍlÿpÍlÿlËhÿmËhÿšÚ–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿùûùÿóúóÿì÷ìÿåõäÿÞòÝÿ×ïÕÿÐíÍÿÆêÄÿºå·ÿ¬á©ÿ Ýÿ”Ù‘ÿ‰Ö†ÿ~Ñ{ÿrÍoÿlËhÿmËiÿnÌjÿnÌjÿoÌkÿoÌkÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍkÿoÌkÿoÌkÿoÌkÿnÌjÿmËjÿwÎsÿƒÒÿØÿ¤Þ£ÿºæ¹ÿÏîÎÿåöæÿúýúÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿúüýÿéñöÿÏáîÿ´ÒèÿŒÄêÿcµìÿY·ðÿ{Òöÿžëüÿšïýÿ…éýÿtåýÿvçýÿxèýÿwçýÿsáüÿlÚúÿbÐ÷ÿUÁõÿJµðÿU¯âÿaªÒÿd¦¼ÿ[£˜ÿSŸuÿS£dÿZ©_ÿ_®Zÿ`¯Yÿ`¯Zÿ^­\ÿZ§bÿT¡iÿOžxÿH›ÿC™£ÿD¡¿ÿH¬ÞÿM¶óÿWÃöÿdÑ÷ÿlÚúÿrâüÿyèþÿwèýÿtæýÿwæýÿŠëýÿžðþÿ•åúÿuÌøÿWµñÿT±ÍÿV±¢ÿY²‚ÿb½wÿjÇoÿoÌjÿoÌjÿnËjÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿoÍkÿoÍkÿqÌmÿrÌnÿwÎsÿ}Ðyÿ„ÒÿÖŠÿšÙ•ÿ£Ýžÿ¬ß§ÿ´â®ÿ­ß¨ÿ¢×žÿ•Ñ’ÿ…ȃÿt½tÿfµhÿZ¯^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿoºpÿ€ÄÿÍÿÕšÿªÝ¦ÿµã¯ÿ°á©ÿ§Þ ÿžÛ™ÿ“×ÿ‡Ó‚ÿÐzÿyÏuÿsÍoÿqÌmÿpÌlÿoÍkÿoÍkÿoÍkÿoÍkÿlËhÿlËiÿ™Ú–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿýþþÿýþýÿýþýÿýþýÿýþýÿüþüÿúýúÿóúóÿé÷éÿÝñÜÿÎìÌÿ¿è½ÿ°ã®ÿ¡ÝŸÿ–Ø’ÿÖ‰ÿ„ÓÿÒ{ÿ{ÐxÿxÏtÿtÎpÿpÌlÿoÌkÿoÌkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÌkÿoÌkÿoÌkÿoÌkÿnÌjÿmËiÿmËiÿ€Ñ}ÿ˜Û•ÿ°ã®ÿÇêÇÿÞóÞÿíøíÿõûõÿüýüÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿüýýÿòö÷ÿäëïÿÐßéÿ™Éêÿ_±ëÿO±îÿxÎõÿ¢ìüÿžðýÿ‡éüÿsäüÿsåüÿuæüÿuåüÿuåüÿtãûÿoÝúÿgÖùÿaÎ÷ÿY¿ïÿS°æÿM¥ÔÿJž¯ÿH™‹ÿLštÿSŸcÿY¤SÿZ¤SÿZ¤SÿW¢XÿQhÿK™zÿF™”ÿA›³ÿ>žÑÿJ®àÿXÁîÿcÏùÿjØùÿpÞúÿsãûÿuåûÿvåüÿtåüÿråüÿvåüÿëýÿ¤ñþÿ˜äúÿnÆöÿHªîÿL¬ÅÿX²“ÿb¹pÿgÀlÿlÈlÿnÌjÿnËjÿnËjÿoÌkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿqÌmÿrÌnÿwÎsÿ}Ðyÿ„ÒÿÖŠÿšÙ•ÿ¤Ýžÿ­ß§ÿ´â®ÿ­ß¨ÿ¢×žÿ•Ñ’ÿ…ȃÿu½uÿgµhÿ[¯^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿpºpÿ€Äÿ‘ÍÿžÕšÿ«Ý¥ÿ¶ã°ÿ°áªÿ§Þ¡ÿžÛ˜ÿ“×ÿˆÓ‚ÿÐzÿyÏuÿsÍoÿqÌmÿpÌlÿnÍjÿnÍjÿnÍjÿnÍjÿkËgÿkËgÿ˜Ú–ÿÑîÐÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿûýûÿûüúÿùüùÿ÷û÷ÿõúõÿóúóÿòúñÿðùïÿí÷íÿë÷ëÿæöåÿÛòÚÿÑïÐÿÃêÂÿ²ã±ÿ£Þ ÿ“ÙÿƒÒ€ÿxÎtÿsÍoÿnËjÿlËhÿmÌiÿmÌiÿmÌiÿnÌjÿnÌjÿnÌjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÌjÿoÌkÿoÌjÿoÌkÿsÍoÿwÎsÿ}Ðyÿ”Ú‘ÿ±ã¯ÿËíÊÿáôàÿõûõÿûýûÿýþýÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿ÷øøÿññòÿâèëÿ£Ìéÿ_¯éÿJ«ìÿvËóÿ¡êûÿŸïýÿˆèüÿuäüÿtäüÿtäüÿsäüÿvæüÿwçüÿuåýÿrâüÿmÝüÿ_ÌøÿP¹óÿF¬åÿD£ÅÿD›¥ÿG™ŒÿMšsÿRœ]ÿSœ\ÿRœ]ÿP›dÿK™{ÿF˜’ÿDœ¯ÿB¢ÏÿCªíÿR¼õÿdÐøÿpÞüÿtãýÿwæüÿwçüÿvæüÿtäüÿsäüÿräüÿwåüÿŽëýÿ¥ðýÿ–áùÿgÀóÿ>¢éÿF§¾ÿZ´Šÿg½eÿjÃfÿmÉjÿnÌjÿnÌjÿnÌjÿnÌjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿoÍkÿqÌmÿrÌnÿwÎsÿ}Ðyÿ„ÒÿÖŠÿšÙ•ÿ¤Ýžÿ­ß§ÿµâ¯ÿ¯ß©ÿ¢×žÿ•Ñ“ÿ…È„ÿu½uÿgµhÿ[¯^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿpºpÿ€ÄÿÍÿŸÕšÿªÝ¦ÿ¶ã°ÿ°áªÿ§Þ¡ÿžÛ˜ÿ“×ÿˆÓ‚ÿÐzÿyÏtÿsÍoÿqÌmÿoÌkÿnÍjÿnÍjÿnÍjÿnÍjÿkËgÿlËgÿ˜Ú–ÿÑîÐÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿùüøÿòúòÿìøëÿåöåÿßóÝÿØð×ÿÒïÐÿËìÊÿÂé¿ÿ¸å¶ÿ¯â¬ÿ©á§ÿ£ß¡ÿœÜ™ÿ“ÙÿŠÖ†ÿÓ~ÿyÏuÿsÍoÿpÌlÿmËiÿmÌiÿmÌiÿnÌjÿnÌjÿnÌjÿnÌjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÌjÿnÌjÿnÌjÿmÌiÿnÌjÿpÌlÿsÍnÿ~Ñ{ÿ‘׎ÿ¦ß¤ÿºæ¸ÿÐîÎÿãõâÿîùîÿùýùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþþÿùùùÿöôóÿèëíÿ§Îêÿa¯çÿJ©éÿqÆòÿšåùÿ›ëüÿ‰èûÿ{åüÿväýÿtãýÿrãýÿsãýÿuåýÿuäýÿsâýÿràüÿi×úÿ_ÍøÿWÂïÿP¶ÜÿJ©ÈÿG ²ÿG›–ÿG—~ÿG–}ÿG–~ÿG—…ÿF›žÿE ¸ÿIªÍÿP·âÿXÃõÿaÏøÿlÙúÿsáýÿuãýÿuåýÿuåýÿsãýÿrâýÿsãýÿuäüÿzåûÿèûÿŸëüÿÜöÿb¼îÿ:ŸâÿD¦¸ÿZµ†ÿhÀcÿkÄeÿmÉiÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿnÍjÿoÍkÿpÌlÿrÌnÿvÎsÿ}Ðxÿ„ÒÿÖŠÿšÙ•ÿ¤ÝŸÿ­ß§ÿµâ¯ÿ®ß©ÿ£×Ÿÿ–Ñ“ÿ…È„ÿu½uÿgµhÿ[¯^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿoºpÿ€Äÿ‘ÍŽÿžÕœÿ«Ý§ÿ¶ã°ÿ°áªÿ§Þ¡ÿžÛ™ÿ“׎ÿˆÓƒÿÐzÿyÏsÿrÍnÿpÌlÿoÌkÿnÍjÿnÍjÿoÍkÿoÍkÿkËgÿlËhÿ™Ú–ÿÒïÐÿöûõÿýþýÿüþüÿüþüÿüþüÿûýûÿûýûÿúýúÿúýúÿúýúÿúýúÿúýúÿùüùÿøüøÿøüøÿøüøÿ÷ü÷ÿôúóÿé÷èÿÝóÝÿÒïÑÿÇëÄÿ»ç¹ÿ±ã®ÿ¥ß¢ÿ”Ú’ÿ„ÓÿyÏuÿwÏtÿwÐsÿvÏrÿtÎpÿsÎoÿqÍmÿoÌlÿnÌjÿnÌjÿnÌjÿnÌjÿnÍjÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿnÌjÿnÌjÿnÌjÿmÌiÿnÌjÿrÍnÿwÏsÿ‹Õˆÿ­á«ÿÏîÍÿàôßÿîøíÿøû÷ÿûüûÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿúúúÿøöõÿíîðÿªÏëÿc®æÿJ§èÿnÃðÿ“ßøÿ–æúÿŠæûÿ€åüÿyäýÿtâýÿoáýÿqâýÿsâýÿsâýÿtãüÿuäüÿráýÿpßüÿjØùÿ\ÈòÿO·ëÿGª×ÿBžºÿ=“ ÿ=’žÿ=“Ÿÿ>–¨ÿBŸÂÿE©ÝÿO¹ìÿ^ËôÿmÜûÿpàüÿsâüÿuäüÿtâýÿsâýÿsâýÿráýÿqáýÿtâýÿyäüÿåûÿŒæûÿ˜æûÿ‡×ôÿ]¸èÿ7œÚÿC¥²ÿZµƒÿiÁbÿkÆdÿmÊiÿnÌjÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿnÍjÿnÍjÿnÍjÿpÌlÿqÌmÿvÎrÿ}Ðxÿ„ÒÿÖŠÿšÙ•ÿ¤ÝŸÿ­ß¨ÿ¶â°ÿ¯ß©ÿ£×Ÿÿ–Ñ“ÿ…È„ÿu½uÿgµhÿ[¯^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿoºpÿ€Äÿ‘ÍÿŸÕ›ÿ«Ý¦ÿ¶â±ÿ°á«ÿ§Þ¢ÿžÛ™ÿ“׎ÿˆÓƒÿÐzÿyÏtÿrÍnÿpÌlÿoÌkÿnÍjÿnÍjÿoÍkÿoÍkÿlËhÿlËhÿ•Ù’ÿÊìÈÿñúñÿòúòÿðùðÿðùðÿïøîÿìøíÿé÷êÿæõåÿãõãÿãõãÿäõäÿâôáÿÝòÛÿ×ðÖÿÖðÕÿ×ñÖÿ×ñÖÿÏîÍÿÆëÄÿ½è»ÿ³ä±ÿªá§ÿ¡Þžÿ˜Û•ÿŽØ‹ÿ€Ó}ÿrÍnÿkËfÿkËgÿkËgÿlËhÿlÌhÿmÌhÿmÌiÿnÌiÿnÌjÿnÌjÿnÌjÿnÌjÿnÍjÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿnÍjÿnÍjÿnÌjÿnÌjÿqÍmÿvÏrÿ{Ñxÿ‡Ô„ÿ”Ø‘ÿ©à§ÿÇêÆÿäõãÿñùðÿøüøÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûúúÿùøöÿïñòÿ²Ôíÿq´æÿV«æÿoÁîÿˆÖ÷ÿßùÿŠäúÿ†çüÿ}äýÿtâýÿnàýÿoáýÿqáýÿráýÿsãýÿsäýÿtäýÿsãýÿpßüÿeÓúÿZÆ÷ÿRºèÿI¬ÒÿCŸ½ÿBž¼ÿBž½ÿC¡ÃÿJ­ØÿP»îÿZÇ÷ÿgÕûÿsãýÿuäýÿtäýÿsäýÿrâýÿráýÿqáýÿpáýÿpàýÿvâýÿ}åüÿƒæûÿ‰âûÿÞùÿ}ÏïÿZ´ßÿ;ÍÿF¦©ÿ\·€ÿjÃcÿlÈeÿmÊiÿnÌjÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿnÍjÿnÍjÿnÍjÿpÌlÿqÌmÿwÎrÿ}Ðxÿ„ÒÿÖŠÿšÙ–ÿ¤ÝŸÿ­à¨ÿ¶ã°ÿ°ßªÿ£×žÿ–Ñ“ÿ†È„ÿu½uÿgµhÿ[¯^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿoºpÿ€Ä€ÿ‘ÍÿŸÕ›ÿ«Ý§ÿ¶ã±ÿ°â«ÿ§Þ£ÿžÛšÿ“׎ÿˆÓƒÿÐzÿyÏtÿrÍnÿpÌlÿoÌkÿnÌjÿnÌjÿnÌkÿnÌkÿlËhÿlËhÿØŒÿ¾ç½ÿâôâÿâõâÿàôàÿÞóÞÿÙòØÿÕðÔÿÍíÍÿÅêÄÿ¾è½ÿ¿è½ÿ¿è¾ÿ¹æ·ÿ­áªÿ ÝÿÜ›ÿžÜœÿžÜšÿšÛ—ÿ–Ù“ÿ‘ØŽÿÖŠÿ‰Ö…ÿ„Ôÿ€Ó}ÿ}ÑxÿwÏrÿoÌlÿmÌiÿmÌiÿmÌjÿmÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌjÿnÌjÿnÌjÿnÌjÿmÌiÿlÌhÿkËgÿuÎqÿÒ}ÿØÿ¦ß¤ÿ½ç»ÿÐíÏÿáôàÿñùñÿ÷üøÿûüûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüûûÿûúùÿñôõÿ¼Úîÿƒ»çÿg±åÿp¿íÿ|Ìóÿ‚×÷ÿˆáúÿêüÿ‚æýÿtâüÿnàüÿnàüÿpàüÿqáüÿqáüÿqâüÿqãüÿsãýÿqáýÿmÜüÿi×úÿbÍóÿYÁæÿPµÛÿN²ÚÿM±ÚÿO´ÞÿXÂéÿbÐõÿiØûÿnÞüÿsãýÿsãýÿqâüÿqáüÿqáüÿqàüÿpàüÿnàüÿnàüÿxãüÿ‚çüÿ‰çûÿ†ÞúÿÕ÷ÿrÇêÿX²Õÿ@ ¾ÿL« ÿ_º}ÿkÆeÿmÉfÿmÊiÿnÌjÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌjÿnÌjÿpÌlÿqÌmÿwÎrÿ}Ðxÿ„ÒÿÖŠÿšÙ–ÿ¤Ý¡ÿ­á©ÿ¶ã°ÿ¯Þªÿ£× ÿ–Ñ”ÿ†È…ÿu½uÿgµhÿ[¯^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿoºqÿ€Ä€ÿ‘ÍÿŸÕœÿ¬Ý§ÿ¶ä²ÿ°â¬ÿ§ß£ÿžÛšÿ“׎ÿˆÓƒÿÐzÿyÏsÿrÍnÿpÌlÿoÌkÿmËjÿmËjÿmËkÿmËkÿkÊiÿlËiÿŠÖ†ÿ°ã¯ÿÎíÎÿÏíÎÿÍíÌÿÊìÈÿÃéÂÿ¼ç»ÿ²ä¯ÿ¥à£ÿœÜ™ÿœÜ™ÿÜšÿ“ÙÿÒ}ÿnÌkÿjÊgÿjÊgÿkÊhÿkÊhÿkËhÿkÊhÿlËhÿlËiÿlËiÿlËiÿlËjÿmËjÿmËjÿmËjÿmËjÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËjÿmËjÿnËjÿnÌjÿmÌiÿmÌiÿmÌiÿmÌiÿ}ÑzÿØŒÿ¤ß¢ÿÃéÂÿâôáÿóúòÿøüøÿûýûÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýüüÿüûûÿó÷øÿÇÞðÿ•Äçÿx·åÿs¼ëÿpÃñÿxÎõÿˆÞùÿ“ëüÿ…çüÿuâüÿmßûÿmßûÿoßûÿoàûÿoàûÿoàûÿpáüÿqâýÿrâþÿtäþÿuåýÿoßûÿeÓùÿ\ÉöÿZÆõÿXÂõÿZÅõÿeÔùÿqâüÿuåýÿtäýÿrâüÿqáüÿpáüÿoàûÿoàûÿoàûÿoßûÿmßûÿmßûÿyãüÿˆèýÿçüÿ‚ÚùÿuÌõÿg¿åÿU°ÊÿG¤®ÿQ¯•ÿb¾zÿmÉgÿmÊgÿmËiÿmËjÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËjÿnÌjÿpÌlÿqÌmÿwÎrÿ}Ðxÿ„ÒÿÖ‹ÿšÙ–ÿ¤Ý ÿ­á©ÿ¶ä±ÿ¯ß«ÿ£Ø ÿ–Ñ”ÿ†Ç…ÿt½uÿfµhÿ[¯]ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc³eÿpºqÿ€Ä€ÿ‘Îÿ Õœÿ«Ý§ÿ·ä²ÿ±â¬ÿ¨ß£ÿžÛšÿ“׎ÿ‡ÓƒÿÐ{ÿxÎtÿrÌnÿpÌlÿnËkÿmËjÿmËjÿmËkÿmËkÿlËiÿlËiÿ~Ñ{ÿ–Ù”ÿ¨à¨ÿ©à¨ÿ¨ß¦ÿ¦ß¥ÿ¢Ý ÿžÜ›ÿ—Ú”ÿØÿˆÕ…ÿˆÔ…ÿ‰Õ†ÿ„ÔÿwÏtÿkËhÿiÊfÿjÊgÿjÊgÿjÊgÿjÊgÿkÊhÿkËhÿkËhÿlËiÿlËiÿlËiÿmËjÿmËjÿmËjÿmËjÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËjÿmËjÿmËjÿlËiÿmËiÿnËkÿpÍmÿxÏuÿ„ÔÿØÿ¡Ý ÿµä²ÿÇëÅÿÚòÚÿíøìÿøüøÿûýûÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüüüÿöùùÿÓåòÿ¬ÏéÿŽÁæÿx½ëÿdºïÿnÇóÿˆÛøÿ›íýÿŠéüÿvâüÿlßûÿmßûÿnßûÿoßûÿoßûÿoàûÿpàûÿpàüÿqáüÿrâýÿsãýÿpßüÿjÙúÿdÓùÿbÐøÿaÎøÿbÐøÿjÙúÿqâýÿtäýÿrâüÿpàüÿpàûÿoàûÿoàûÿoßûÿoßûÿoßûÿmßûÿlßûÿ{ãüÿêüÿ“èüÿ~ÕùÿhÂôÿ\¶ßÿS¯½ÿM©›ÿW³ˆÿdÀuÿmÊgÿmËhÿmËiÿmËjÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËkÿmËjÿnËjÿpÌlÿqÌmÿvÎrÿ}Ðyÿ„ÒÿÖ‹ÿ›Ù–ÿ¥Ý ÿ®á©ÿ¶ä±ÿ¯ß¬ÿ£Ù ÿ—Ñ”ÿ†Ç…ÿt½vÿfµiÿ[®]ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc´fÿp»qÿÄ€ÿ‘ÎÿŸÕœÿ­Ý¨ÿ·ä²ÿ±â¬ÿ¨ß£ÿŸÛšÿ“×ÿ‡Óƒÿ}Ð{ÿwÎuÿrÌnÿpËlÿnËkÿmËjÿmËjÿnÌkÿnÌkÿmËjÿlËiÿrÌpÿ{ÐxÿÑ€ÿÑ€ÿÑÿ€Ò~ÿÑ|ÿ}Ñ{ÿ|ÐyÿyÐvÿwÎtÿwÏtÿwÏtÿuÎsÿqÍoÿmËjÿmËjÿmËjÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿmËjÿmËjÿlËiÿlËiÿlËiÿpÌmÿtÎqÿ„ÓÿœÜ›ÿµä´ÿÉëÈÿÛòÚÿê÷éÿñúðÿ÷û÷ÿüýûÿýýýÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýýÿýýýÿøúûÿßëóÿÄÚëÿ¥Ìçÿ}½éÿY±ìÿc¾òÿ‡Ùøÿ£ïýÿêüÿwâûÿkßûÿlßûÿnßüÿnßüÿnßûÿoßûÿoßûÿoßûÿoßûÿpàûÿpàûÿpßûÿoÝúÿmÛúÿlÚúÿkÚúÿkÚúÿmÝúÿqáûÿqáûÿpàûÿoßûÿoßûÿoßûÿoßûÿoßûÿoßüÿnßüÿlßûÿkßûÿ}äüÿ“ëþÿšéýÿ{Ñøÿ\¸òÿP­ÙÿS­°ÿT®ˆÿ]¸zÿfÂqÿmÊhÿmËhÿmÊiÿnËjÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿmËkÿmËjÿnËjÿoËlÿqÌmÿvÍsÿ|Ðyÿ‚Ò€ÿÖ‹ÿ›Ù–ÿ¥Ý ÿ®á©ÿ¶ä±ÿ¯ß«ÿ¤Ù ÿ˜Ñ”ÿ†Ç…ÿt¾vÿf¶iÿ[¯^ÿP©SÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿc´fÿp»qÿÄ€ÿ’ÎÿŸÖœÿ­Ý©ÿ¸ä³ÿ²â¬ÿ©ß£ÿŸÛšÿ“×ÿ‡Ó„ÿ}Ð{ÿwÎuÿrÌnÿpËlÿnËkÿmËjÿmÌjÿnÌkÿnÌkÿmËjÿmËjÿlËiÿlËiÿkÊiÿkÊhÿkÊhÿkËhÿkËhÿlÊiÿlËiÿlËiÿlËiÿlËiÿlËiÿlËiÿmËjÿmËjÿmËjÿmËjÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿmËjÿmËjÿoÌlÿrÍoÿvÎsÿÑ{ÿˆÔ†ÿœÜšÿ·å¶ÿÒïÑÿäõãÿóúóÿúýúÿýþüÿýþýÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿþþýÿúûüÿêðôÿ×äìÿ·Óéÿ¾êÿOªëÿZ¸ðÿ…Õ÷ÿ§ïýÿ’êüÿxâûÿkÞûÿlÞûÿmÞüÿmÞüÿnÞüÿnÞûÿnÞûÿnÞûÿnÞûÿoßûÿoßûÿoßûÿpàûÿqáûÿqáûÿpáûÿpáûÿpàûÿoàûÿpßûÿoßûÿnÞûÿnÞûÿnÞûÿnÞüÿnÞüÿnÞüÿmÞüÿkÞûÿjÞûÿãûÿ—ëýÿèýÿyÍ÷ÿR¯ðÿH§ÔÿQ­¥ÿZ³zÿa»pÿhÄlÿmÊjÿnËjÿmÊjÿnËjÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿmÌkÿmËjÿmËjÿoËlÿqËmÿvÍsÿ|Ðyÿ‚Ò€ÿŽÖ‹ÿ›Ù–ÿ¥Ý ÿ¯áªÿ·ä²ÿ±ß«ÿ¤Ø ÿ—Ñ”ÿ†Ç…ÿt¾vÿf¶iÿ[°^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc´fÿp»qÿÅÿ“Îÿ¡Öœÿ¬Ý¨ÿ¸ä³ÿ³â®ÿ¨ß£ÿŸÛšÿ“×ÿ‡Ó„ÿÐ{ÿxÎuÿrÌnÿpËlÿnËkÿmÌjÿmÌjÿnÌkÿnÌkÿmËjÿmËjÿmËjÿlËiÿlËiÿlËiÿlËiÿlËiÿlËiÿlËiÿlËiÿmËjÿmËjÿmËjÿmËjÿmËjÿmËjÿmËjÿmËjÿmÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿmÌkÿmËjÿmËjÿmËjÿmËjÿlËiÿkËhÿkÊhÿuÎrÿ‚Òÿ‘Øÿ£Þ¡ÿ·åµÿÈêÇÿØñ×ÿæöæÿðùðÿøüøÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿþþýÿüüüÿðôöÿåëïÿÄÚêÿ„¾êÿG¤êÿS²ïÿ‚Ò÷ÿ§íýÿ“éýÿyáûÿlÞûÿlÞüÿmÞüÿmÞüÿmÞüÿmÞüÿmÞüÿmÞüÿnÞüÿnÞüÿnÞüÿnßüÿnàüÿnàüÿnàüÿnàüÿnàüÿnàüÿnßüÿnÞüÿnÞüÿmÞüÿmÞüÿmÞüÿmÞüÿmÞüÿmÞüÿmÞüÿkÞûÿjÞûÿãûÿ˜êüÿžåüÿuÈ÷ÿJªïÿ@£ÒÿP­ ÿ^¸qÿe¿jÿjÆjÿmËjÿnËjÿnÊkÿnËkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿmÌkÿmÌjÿmËjÿoËlÿqËmÿvÍsÿ}Ðyÿ„Ò€ÿÖ‹ÿ›Ù—ÿ¦Ý¢ÿ°áªÿ·ã²ÿ±ß¬ÿ¥Ù¡ÿ—Ñ•ÿ†È…ÿt¾vÿf¶iÿ[°^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc´fÿp»qÿÅÿ“Îÿ Öÿ®Þ©ÿ¸ä³ÿ²â­ÿ©ß¤ÿ Û›ÿ”×ÿˆÓ„ÿÐ{ÿyÎuÿrÌnÿpËlÿnËkÿmÌjÿmÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿmËjÿmËjÿmËjÿmËjÿlËiÿlËiÿjÊgÿkÊhÿ}Ð{ÿ”Ù’ÿ¬áªÿÈìÈÿåõäÿóúóÿöûõÿùüùÿûüûÿýýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿþþýÿüýýÿ÷÷÷ÿññðÿÑáìÿ†¿êÿ@ŸèÿK¬íÿÎöÿ§êüÿ”æüÿzáûÿmÞûÿlÞûÿlÞûÿlÞûÿlÞûÿmÞûÿmÞûÿmÞûÿmÞûÿnÞûÿmÞûÿmÞûÿmßûÿmßûÿmßûÿmßûÿmßûÿmßûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿlÞûÿlÞûÿlÞûÿjÞûÿjÞûÿâûÿ™çüÿŸãûÿqÄõÿB¥îÿ:ŸÏÿO­™ÿc»hÿhÁdÿjÇhÿmËjÿmËjÿmÊjÿmËjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿmÌjÿmÌjÿoËlÿqËmÿwÍsÿ}Ðyÿ„Ò€ÿÖ‹ÿÙ—ÿ¦Ý¡ÿ¯áªÿ¸ä³ÿ±à¬ÿ¥Ù¡ÿ™Ñ•ÿ‡È†ÿu¾vÿg¶iÿ[°^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc´fÿp»rÿÅÿ’Îÿ Öÿ®Þ©ÿ¹ã´ÿ³â®ÿªÞ¥ÿ¡Û›ÿ”×ÿˆÓ„ÿÐ{ÿxÎuÿrÌnÿpËlÿnËkÿmÌiÿmÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿmËiÿmËiÿnËjÿqÍnÿvÎsÿ|ÐyÿÒ}ÿ‡Õ…ÿ›Û™ÿ±ã¯ÿÇëÆÿßóßÿöûöÿýþýÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿþýþÿüýüÿ÷÷õÿòñîÿÑàæÿ‡¾áÿBŸÜÿKªâÿ{Éðÿ ãûÿ‘ãûÿ{àúÿqßúÿoÞúÿlÝúÿkÝúÿlÝúÿlÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿmÞúÿlÞúÿlÝúÿkÝúÿkÝúÿjÞúÿiÞúÿ|ßúÿ“ãûÿ—ÝøÿmÀîÿB£áÿ<ŸÂÿP¬‘ÿdºdÿhÁaÿkÇgÿlÊiÿlÊiÿlÊiÿmËiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿnÌiÿmÌiÿmÌjÿoËlÿqËmÿvÍsÿ}Ðyÿ„Ò€ÿÖŒÿœÚ—ÿ¦Ý¡ÿ°á«ÿ¸ä³ÿ²à­ÿ¥Ø¢ÿ˜Ò•ÿ‡È†ÿv¾vÿg¶iÿ[°^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿc´fÿq»rÿÅÿ’Αÿ Öžÿ®Þªÿ¹äµÿ³â®ÿªÞ¥ÿ¡Û›ÿ”×ÿˆÓ„ÿÐ{ÿwÎuÿrÌnÿoËlÿnËjÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmËiÿmËiÿmËiÿlËhÿlËhÿkËgÿjÊeÿmËiÿxÏuÿ„Óÿ“Ùÿ£Þ¡ÿ´ã²ÿÅêÃÿÔðÓÿäôãÿïøîÿúüúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿýýýÿüüüÿõõóÿíîèÿÍÝÞÿоÓÿI¡ÉÿOªÒÿvÅèÿ”Ûùÿ‹ÞúÿßúÿwàúÿqßúÿlÝúÿjÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÜúÿkÝúÿiÝúÿiÞúÿxÝúÿŠÝúÿÖôÿj¼âÿE£ÎÿA °ÿS­ˆÿdºbÿhÀaÿjÆfÿlÊhÿlËiÿlÊiÿmËiÿmËiÿmËiÿmËiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌiÿmÌjÿoËkÿqËmÿvÍsÿ}Ðyÿ„Ò€ÿÖŒÿœÚ™ÿ¦Ý¢ÿ°á«ÿ¸ä´ÿ±ß®ÿ¥Ø¢ÿ˜Ò–ÿˆÉ†ÿv¾vÿg¶iÿ[°^ÿP©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿd´fÿq»rÿ‚Åÿ“Î’ÿ¡Öžÿ®Þªÿ¹åµÿ´ã°ÿªß¦ÿ¡Üœÿ”×ÿˆÓ„ÿÐ{ÿwÎuÿqÌnÿoËlÿnËjÿlÌiÿlÌiÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlËiÿlËiÿlËiÿlËhÿlËhÿkÊgÿkÊgÿpÌlÿ‚Òÿ•Ù’ÿ¬á©ÿÅêÃÿÝòÜÿë÷êÿõúôÿùüùÿüýüÿýþýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿýýýÿýýýÿüüüÿøúøÿðòîÿäèàÿÅÙÓÿˆ½ÄÿP¢·ÿR©Äÿp¿ßÿˆÓ÷ÿ†Ùùÿ€ßùÿ|âúÿtßûÿlÜûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÜûÿiÞûÿiÝúÿsÚùÿÖøÿ‚Íðÿf¹ÖÿI¤»ÿE¡ŸÿU­ÿc¸aÿg¿`ÿjÅeÿlÉhÿlÊhÿlÊhÿlÊhÿlÊhÿlÊhÿlËiÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌiÿlÌiÿmÌiÿoËkÿpËmÿvÍsÿ}Ðyÿ„Ò€ÿÖŒÿœÚ˜ÿ¦Þ¢ÿ±â¬ÿ¹åµÿ²à®ÿ¥Ù£ÿ˜Ò–ÿ‡É†ÿv¾wÿh¶iÿ[°^ÿQ©TÿN¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­Zÿd´fÿq»rÿ‚Å‚ÿ”Αÿ¢ÖŸÿ®Þ«ÿºå¶ÿ³ã¯ÿªà¦ÿ Üœÿ”×ÿˆÓƒÿÐzÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlËiÿlËiÿlËiÿlËiÿlËiÿkËhÿjËhÿpÌlÿyÏvÿ‚Òÿ‹Õ‰ÿ•Ø’ÿŸÜÿ­âªÿ»ç¹ÿÊìÉÿÛòÚÿê÷êÿòúóÿùýùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýüýÿýýýÿ÷ù÷ÿñõñÿéðèÿÓâÑÿ½Õ¹ÿžÅªÿs±¨ÿJžªÿM¤½ÿd¶ÚÿwÆóÿxÑ÷ÿwÛùÿuáúÿoßûÿkÜûÿiÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÛûÿjÜûÿjÞûÿiÞúÿnÖøÿtÍõÿsÂìÿ]°ÑÿF ´ÿD˜ÿR§xÿ^±\ÿc·\ÿf¾bÿiÄeÿjÆgÿkÈgÿlÊhÿlÊhÿlÊhÿlËiÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌiÿlÌiÿmÌiÿoËkÿpËmÿvÍsÿ}Ðyÿ„Ò€ÿÖŒÿœÛ˜ÿ§Þ£ÿ°â¬ÿ¹åµÿ³à®ÿ¦Ú£ÿ˜Ó–ÿ‡É‡ÿv¾wÿh¶iÿ[°^ÿQ©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿd´fÿq»rÿ‚Å‚ÿ”Î’ÿ¡Ö ÿ¯Þ¬ÿºå¶ÿ´ã°ÿªà¦ÿ Üœÿ”×ÿˆÓƒÿÐzÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlËiÿlËiÿkËhÿkËhÿjÊgÿiÊfÿiÊfÿtÎqÿ‡Ô…ÿšÜ™ÿ¯â­ÿÂéÁÿÓîÑÿÜòÚÿäõãÿêöêÿðùïÿõüõÿøüøÿûýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿýüýÿûûûÿòõòÿæíåÿÖåÕÿµÓ²ÿ“¿ÿv°ÿ[¤ŒÿC˜œÿGž¶ÿX­ÔÿfºðÿiÈõÿl×øÿmßúÿkÞúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÝûÿiÞúÿhÒöÿgÄóÿb¶èÿS¨ËÿDš¬ÿD˜ÿO rÿZ¨Wÿ^¯Xÿb·]ÿe¾bÿgÂdÿiÆfÿkÉhÿkÉhÿlÊhÿlËiÿlËiÿlËiÿmËjÿmËjÿmËjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlÌjÿlÌiÿmÌiÿnËkÿpËmÿvÍsÿ}Ðyÿ„Ò€ÿÖŒÿœÛ˜ÿ§Þ£ÿ±â­ÿ¹åµÿ²à°ÿ¦Ú£ÿ™Ó—ÿˆÉ‡ÿv¾wÿh¶jÿ[°^ÿQ©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­\ÿd´fÿq»sÿ‚Å‚ÿ“Î’ÿ¢ÖŸÿ°Þ¬ÿ»å·ÿµã°ÿ«à§ÿ¡Üÿ”×ÿ‡ÓƒÿÐzÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlËiÿlËiÿnÌkÿqÍnÿtÍqÿvÎrÿxÏuÿ‡Ô…ÿÝœÿµå´ÿËíËÿâôáÿóúóÿøüøÿúýùÿûýûÿüþüÿýþýÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿýýýÿþþþÿþþþÿüüüÿøùøÿóöóÿãìãÿÐáÏÿºÖ¹ÿ–™ÿr¯xÿY¢nÿKœ†ÿ@–ŸÿD¹ÿQªÕÿ\¶ïÿaÆôÿfÕ÷ÿhÞúÿhÝúÿhÛùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿiÛúÿiÝúÿiÞúÿeÑöÿ`ÀòÿY²çÿN§ÍÿC›²ÿC˜–ÿKœzÿT¡_ÿY¨[ÿ]¯]ÿa·]ÿd½aÿgÃeÿiÆgÿjÇgÿkÉhÿkÊhÿkÊhÿlÊiÿmÊjÿmÊjÿmËjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlÌjÿlÌiÿlÌiÿnËkÿpËmÿvÍsÿ}Ðyÿ„Ò€ÿÖŒÿÛ™ÿ§Þ£ÿ²â®ÿºå¶ÿ³à¯ÿ¦Ú¤ÿ™Ó—ÿˆÉ‡ÿw¾xÿh¶jÿ[°_ÿQ©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿd´fÿq»sÿ‚Ńÿ”Î’ÿ¢Ö ÿ°Þ­ÿ»å·ÿ´ã±ÿ«à§ÿ¡Üžÿ”בÿ‡Ó„ÿÐzÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlËiÿlËiÿlËiÿlËiÿlËiÿkËhÿkËhÿkËhÿjÊfÿiÊfÿtÎrÿÒÿŽÖŒÿ›Û™ÿ¨à¦ÿ¶ä´ÿÆëÅÿÕðÔÿâôâÿïùîÿùüøÿûýûÿýþýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿþýþÿýýýÿýüýÿöøöÿëñêÿÝêÜÿÅÜÃÿ¨Ì¤ÿ½Šÿt°„ÿ\¤€ÿLœˆÿD›£ÿ>›½ÿE¥ÑÿQ³ãÿ^ÂóÿbÌöÿf×øÿhÝùÿhÛùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÚùÿhÛùÿiÜùÿiÝùÿeÔ÷ÿaÉõÿ[¾íÿN¯ÞÿB Ìÿ@›µÿEš˜ÿJ›|ÿP mÿW§`ÿ\­Vÿ`´[ÿd»`ÿfÀcÿiÄfÿjÈgÿjÉgÿkÊhÿlÊiÿmÊjÿmÊjÿmËjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlÌjÿlÌiÿlÌiÿnËkÿpËmÿvÍsÿ}Ðyÿ„Ò€ÿÖÿÛ™ÿ§Þ¤ÿ²â­ÿºå¶ÿ´à°ÿ§Ú¤ÿ™Ó™ÿˆÉˆÿw¾xÿh¶jÿ[°^ÿQ©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿd´fÿq»sÿƒÅƒÿ•Ï”ÿ¢Ö ÿ°Þ¬ÿ»å·ÿµã²ÿªà¨ÿ¡Üÿ”בÿ‡Ó„ÿÐzÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlËiÿlËiÿlËiÿkËhÿkËhÿkÊhÿjËgÿjÊgÿiÊfÿiÊfÿ}Ñ{ÿ”Ù’ÿªá©ÿÁèÀÿ×ðÖÿäõãÿíøìÿõûôÿ÷û÷ÿúýúÿýýüÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿýýýÿþýþÿýýýÿüûüÿùùùÿðóðÿÛèÛÿÆÝÄÿ¦Ë£ÿ·|ÿ`¥]ÿSŸsÿH™ŒÿA˜¤ÿ>›Áÿ= ÜÿF­éÿS¾ïÿ_ÍöÿdÔøÿfÙøÿhÜùÿhÛùÿhÚùÿhÚùÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚùÿhÚùÿhÚùÿhÜùÿiÜùÿeØøÿbÒ÷ÿ\ÉôÿO¹îÿB¨çÿ>ŸÔÿ?š¸ÿ@—œÿGšÿPžeÿW¢Qÿ[«Uÿ`³\ÿc¹`ÿfÀcÿiÅfÿjÇgÿkÈhÿlÊiÿlÊiÿlÊiÿlËiÿlËiÿlËiÿlËiÿmÌjÿmÌjÿmÌjÿlÌiÿlÌiÿnËkÿpËmÿvÍsÿ}Ðyÿ„Ò€ÿÖÿÚšÿ¨Þ¤ÿ±â®ÿºä¶ÿ³à±ÿ§Ú¥ÿšÓ˜ÿˆÉ‰ÿw¾xÿg¶jÿ[°^ÿQ©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüOªSÿN¨RÿW­[ÿd´eÿq»rÿƒÅƒÿ”Дÿ£× ÿ±Þ¬ÿ¼å¸ÿ¶ã±ÿ«ß¨ÿ¡Üžÿ”Ø‘ÿˆÓ„ÿÐ{ÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlËiÿlËiÿoÌlÿsÎqÿxÎuÿ|Ñyÿ€Ò~ÿ„Ó‚ÿˆÕ…ÿÖ‹ÿžÝÿ²ä±ÿÆêÅÿÚòÙÿíøìÿ÷û÷ÿûýûÿýþýÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿýýýÿýýýÿüüüÿúûúÿïôïÿãíãÿÓäÒÿ¼×»ÿ¥É¢ÿ‡ºŽÿfªzÿK›mÿF›‡ÿB›¥ÿ@Ÿ¾ÿB§ÕÿF¯ëÿNºóÿXÇõÿbÓøÿe×øÿfÙøÿhÜùÿgÚúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÙúÿgÚúÿgÚúÿhÛùÿfÙøÿdÖøÿ_Ñ÷ÿUÄõÿK¶òÿE¬åÿC£Îÿ@œ¸ÿDœÿJœÿOkÿU¤cÿZ«\ÿ_±[ÿb¸_ÿe¾cÿhÂdÿjÅfÿkÈhÿkÉhÿkÊhÿkÊhÿkÊhÿkÊhÿlËiÿmÌjÿmÌjÿmÌjÿlÌiÿlÌiÿnËkÿpËmÿvÍsÿ}Ðyÿ„Ò€ÿÖÿÚšÿ¨Þ¤ÿ²â®ÿ»ä·ÿ´á°ÿ§Ú¥ÿ›Ò˜ÿˆÈˆÿw¾xÿg¶jÿ[°^ÿQ©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿN¨RÿX­[ÿd´eÿr»rÿƒÅƒÿ”Ï“ÿ¤×¡ÿ±ß®ÿ¼ä¸ÿµã±ÿ¬ß¨ÿ¡Üžÿ•Ø‘ÿˆÓ…ÿÐ{ÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿlËiÿlËiÿlËiÿlËiÿkËhÿkËhÿjËgÿjËgÿiÊfÿiÊeÿtÍpÿ€Ñ}ÿŒÖ‰ÿ™Ú—ÿ¥Þ£ÿ±â¯ÿ»æºÿÆêÅÿÎíÍÿØñØÿáõáÿìøëÿõûöÿûüûÿüýüÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿýýýÿýýýÿüüüÿüûüÿ÷÷÷ÿÝêÛÿÁÛ¿ÿ¨Î¥ÿ’¿Œÿ|±uÿg§{ÿRŸŒÿA™ÿA³ÿB£ÉÿF«ÚÿN·æÿVÃóÿ\Ë÷ÿaÒøÿfØøÿfÙøÿfÚøÿgÚùÿfÚúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÙúÿfÚúÿgÚùÿgÚøÿfÙøÿd×øÿ_Ñ÷ÿZÉöÿTÀïÿL´âÿD§ÖÿC¢ÂÿC®ÿD™˜ÿLœzÿT¡]ÿY¦Rÿ]¯Xÿa¶^ÿe»aÿhÁdÿjÆgÿkÈhÿkÈhÿkÉhÿkÊhÿkÊhÿlËiÿmÌjÿmÌjÿmÌjÿlÌiÿlÌiÿnËkÿpËmÿvÍsÿ}Ðyÿ„Òÿ‘ÖÿÛ›ÿ¨Þ¤ÿ²â®ÿ»å·ÿµá±ÿ¨Ù¥ÿšÒ™ÿ‰Èˆÿw¾xÿh¶jÿ[°^ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´eÿr»rÿƒÅƒÿ”Ï”ÿ¤×¡ÿ°ß­ÿ¼æ¸ÿ¶ä²ÿ«à§ÿ¢Üžÿ•Ø‘ÿˆÔ…ÿÐ|ÿxÎuÿqÌnÿoËlÿmËjÿlÌiÿlÌiÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlËiÿlËiÿlËiÿlËiÿlËiÿkËhÿkËhÿkÊhÿiÊfÿjÊgÿ{ÐyÿŽ×Œÿ¡Þ ÿ´ä³ÿÈêÇÿÛñÙÿì÷ëÿóúóÿöûöÿ÷ü÷ÿùýùÿûýûÿýýüÿýýþÿýýýÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿýþýÿýýýÿûüûÿùúùÿõ÷õÿìòìÿÈßÇÿŸÊ›ÿ~¸zÿi©bÿU›OÿI—mÿ@–Ÿÿ8—Ìÿ>¡ÛÿC«éÿL·óÿYÇ÷ÿdÖùÿhÛúÿhÜùÿgÛùÿgÛùÿfÚùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÚùÿgÜùÿhÜùÿhÛúÿhÛúÿaÒøÿTÃõÿH³ñÿB¨åÿ=ž×ÿ;—ÁÿD—’ÿM—aÿTœNÿX¦Tÿ]®Zÿaµ]ÿd½bÿhÃeÿjÆfÿkÇgÿkÉhÿkÊhÿkÊhÿlËiÿlËiÿlËiÿlÌjÿlÌiÿlÌiÿnËkÿpËmÿvÍsÿ}Ðzÿ„Òÿ‘×ÿžÛšÿ©ß¥ÿ²ã®ÿ»æ·ÿ´á²ÿ¨Ú¦ÿšÓ™ÿ‰È‰ÿx¾xÿi¶jÿ\°^ÿP©SÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´fÿr»sÿƒÅƒÿ•Ï”ÿ£×¡ÿ°ß­ÿ½æ¹ÿ·ä³ÿ¬à¨ÿ¢Ýžÿ•Ù’ÿˆÔ…ÿÐ|ÿxÎuÿqÌnÿnËlÿmËjÿkÌiÿkÌiÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkÌjÿkËiÿkËiÿkËiÿkËiÿkËiÿjËiÿjËiÿjËiÿjËiÿjËhÿiËhÿjËhÿpÌnÿxÎuÿ~Ð{ÿÓÿ†ÔƒÿŒÕŠÿ‘Øÿ˜Ú—ÿ§ß¥ÿ¶å´ÿÄéÂÿÐíÏÿÜòÛÿéöéÿôúôÿýþýÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿþýþÿýýýÿûüûÿ÷ø÷ÿóõóÿäíäÿÑäÑÿ½Ù½ÿ È ÿ·‚ÿi«uÿX¢yÿI›ÿDœ›ÿC¡¾ÿC§ÜÿH±çÿP»ðÿVÅöÿ^ÏøÿeØùÿgÚùÿgÚùÿgÚùÿfÙùÿeÙøÿeØøÿfØøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfÙøÿfØøÿeØøÿeÙøÿfÙùÿgÛùÿgÚùÿgÚùÿcÖøÿ[Ì÷ÿTÂõÿM¸íÿF®åÿC¥ÕÿD ´ÿGœ”ÿLœ|ÿQ lÿV¥[ÿ[¬Zÿ`´^ÿcº`ÿf¿bÿhÂdÿhÆfÿiÈgÿjÉhÿkÊhÿkÊhÿkËiÿkÌjÿkÌiÿlÌiÿnËkÿpËmÿvÍsÿ|Ðzÿ„Òÿ‘׎ÿžÜšÿ©ß¥ÿ³ã¯ÿ¼æ¸ÿ´á±ÿ¨Û¦ÿšÓ™ÿ‰È‰ÿx¾xÿi¶jÿ\°^ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿr»sÿ„Å„ÿ–Ï”ÿ£×¡ÿ²ß¯ÿ½æ¹ÿ¶ä³ÿ­à©ÿ¢Ýžÿ•Ù’ÿˆÔ…ÿÐ|ÿxÎuÿqÌnÿnËlÿlËjÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkÌiÿkËiÿkËiÿjËiÿjËhÿjËhÿjËhÿiËgÿiËgÿhÊgÿhÊgÿhÊfÿgÊeÿhÊfÿvÎtÿ…Ôƒÿ‘Øÿ›Û˜ÿ¤Þ£ÿ±ä°ÿÀè¿ÿÍíÍÿ×ðÖÿàôàÿçöæÿì÷ëÿðùðÿõúôÿùüúÿýþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýýýÿýýýÿýüýÿùùùÿòôñÿéîèÿÌàÌÿ§Ï¦ÿ‡¾…ÿt²vÿc¤iÿTrÿJœ—ÿ@œ¼ÿB£ÐÿI®ÞÿO¸ëÿUÃðÿ]ÌôÿaÓ÷ÿdÖøÿfÙøÿfÙøÿeØøÿeØøÿdØøÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿd×øÿdØøÿeØøÿeØøÿfÙøÿeØøÿcÕøÿaÒöÿ[ÉóÿSÀîÿMµçÿG«ÚÿA ËÿBœ¯ÿH›†ÿO›_ÿT¡XÿZªXÿ_±Zÿb¶]ÿd¼bÿfÁdÿhÅeÿiÈgÿjÉgÿjÊhÿkËiÿkËiÿkËiÿlËiÿnËkÿoËmÿuÍsÿ|Ðzÿ„Òÿ‘׎ÿžÜ›ÿ©ß¥ÿ³ã¯ÿ¼æ¸ÿ¶á²ÿ¨Û¦ÿ›Ó™ÿ‰È‰ÿx¾yÿi¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿr»tÿ„Å„ÿ•Ï•ÿ¥×¢ÿ±ß¯ÿ½æºÿ·ä³ÿ¬à©ÿ£ÝŸÿ•Ù’ÿˆÔ…ÿÐ|ÿwÎuÿpÌnÿmËlÿlËjÿkÌhÿkÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿlÌhÿkËhÿkËhÿlËjÿmÌkÿoÍmÿqÍoÿrÍpÿsÎqÿtÎrÿuÎtÿwÏuÿwÏvÿyÐxÿŠÕˆÿœÜšÿªá¨ÿµä´ÿÀè¿ÿÏíÎÿàôàÿñùñÿöûöÿùüøÿúýúÿüýûÿüþüÿýþýÿþþþÿþþþÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿþþþÿýýýÿùûùÿöøöÿîóîÿáêßÿÒáÑÿ¯Ñ°ÿ…»‡ÿ_ªeÿU¡eÿN™hÿG—ÿA±ÿ>¢âÿD­ñÿOºòÿXÆôÿ_Ïöÿd×÷ÿhÛùÿgÚøÿeØøÿeØøÿd×øÿ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×øÿd×øÿeØøÿeÚøÿgÛøÿhÜùÿcÕøÿ]ÌöÿUÃôÿK¶òÿA©ïÿ? ÕÿD›¢ÿI–rÿN›dÿS¢`ÿX¨[ÿ\¯]ÿaµ_ÿd»aÿeÀcÿgÆeÿhÇfÿiÉgÿjÊhÿjÊhÿjÊhÿkËiÿmËkÿoËmÿuÍsÿ|Ðzÿ„Òÿ‘׎ÿžÜœÿªß¦ÿ´ã°ÿ½æ¹ÿµá³ÿ©Û¦ÿ›Ó™ÿ‰È‰ÿx¾yÿi¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿr»tÿ„Å„ÿ–Ï”ÿ¤×£ÿ³ß¯ÿ¾æºÿ¸ä³ÿ­à©ÿ£Ý ÿ•Ù’ÿˆÔ…ÿÐ|ÿvÎuÿpÌnÿnËkÿlËjÿkÌhÿkÌhÿlÌhÿlÌhÿkËhÿkËhÿkËhÿkËhÿkËhÿkËgÿkËgÿkËgÿkËgÿkËgÿkËgÿkËgÿkËgÿkËgÿkËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjËfÿiËfÿiËfÿiËfÿiÊeÿhÊeÿnÌlÿxÐvÿ‚Ó€ÿˆÕ†ÿŽ×Œÿ”Ù’ÿšÛ˜ÿ ÝŸÿ§à¦ÿ­â¬ÿ³ä²ÿ¼ç»ÿÇëÅÿÏîÎÿÕðÔÿÛñÚÿäôãÿîøíÿ÷û÷ÿúýúÿüþüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýýýÿüüüÿñöïÿäîäÿÒäÑÿ¹×·ÿ Èœÿ†»‹ÿi¬zÿR oÿLž‚ÿGœ—ÿDŸ¯ÿFªÎÿJ´ìÿP½ôÿWÆõÿ^Ï÷ÿaÓ÷ÿd×÷ÿfÚøÿeÙùÿd×ùÿ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×ùÿd×ùÿeÙùÿfÚùÿcÖ÷ÿ`Ò÷ÿ\ÌöÿUÄöÿMºóÿI±ãÿG§ÄÿDœ§ÿGœÿKyÿPŸhÿU¦aÿ[­\ÿ_³[ÿb¹^ÿeÀcÿfÄdÿhÆfÿjÉgÿjÊgÿjÊhÿkËiÿmËkÿoËmÿuÍsÿ|Ðyÿ„Òÿ‘׎ÿŸÜ›ÿ«ß¦ÿµã±ÿ½æ¹ÿ¶á²ÿ©Û¦ÿ›Ó™ÿŠÈ‰ÿx¾yÿi¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿr»sÿ„Å„ÿ—Ï•ÿ¦×¢ÿ³ß°ÿ¾æºÿ¸ä´ÿ®àªÿ£ÜŸÿ•Ø’ÿˆÔ…ÿ~Ð|ÿvÎuÿpÌnÿnËkÿlËiÿkÌhÿkÌhÿkÌiÿkÌiÿkËhÿkËhÿjËhÿkËhÿjËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjËgÿjÊgÿjËgÿiËfÿiËfÿiÊfÿiÊfÿiÊfÿhÊfÿhÊdÿgÊeÿsÎqÿ„Ô‚ÿ•Ù“ÿ Ýžÿªá¨ÿ¶ä³ÿÀè¿ÿÌíÌÿ×ñÖÿáôáÿìøëÿîøíÿñùïÿòùòÿóúóÿõúõÿ÷û÷ÿúüúÿüþüÿüýüÿýýýÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿüýüÿûüûÿöúöÿæïåÿÑäÏÿµÕ³ÿÂÿm¯hÿ]¦hÿQpÿG—~ÿD›¡ÿA ÇÿC¨ßÿM·êÿVÆòÿ\Íöÿ`Ò÷ÿc×øÿd×øÿc×øÿc×øÿc×ùÿbÖùÿbÖùÿbÖùÿcÖùÿcÖùÿcÖùÿcÖùÿcÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿcÖùÿcÖùÿcÖùÿcÖùÿcÖùÿbÖùÿbÖùÿbÖùÿc×ùÿc×øÿcØøÿcÖøÿcÕ÷ÿ_Ñ÷ÿZÌöÿUÂðÿK³çÿA¤ÜÿBž¼ÿDš–ÿH—uÿNgÿT¤ZÿZ«Vÿ_²[ÿbº`ÿd¿bÿgÄdÿiÈfÿjÊgÿjÊgÿkËiÿmËjÿoËlÿuÍrÿ|Ðyÿ„Òÿ‘׎ÿžÜ›ÿªß¦ÿ´ã°ÿ½æ¹ÿ·á²ÿªÛ§ÿÓšÿŠÈ‰ÿx¾yÿi¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿr»tÿ„Å„ÿ—Ï•ÿ¦×£ÿ³ß°ÿ¿æ»ÿ¸äµÿ®à©ÿ£Ü ÿ•Ø’ÿ‡Ô…ÿ}Ð|ÿvÎtÿpÌmÿnËjÿlËiÿjÌhÿjÌhÿjÌiÿjÌiÿjËhÿjËhÿmÌkÿrÍpÿvÏrÿuÏsÿuÏrÿuÏrÿuÏrÿuÏrÿuÏrÿuÏrÿuÏrÿuÏrÿuÏrÿvÏsÿzÐyÿÒ}ÿ€Ò}ÿÒ}ÿÒ}ÿ„ÓÿˆÕ‡ÿŠÖˆÿŠÖ‡ÿ‰Ö‡ÿ”Ù“ÿ¤Þ¢ÿ²ä±ÿ½ç»ÿÆêÄÿÐîÎÿÙòÙÿäõäÿîøîÿ÷û÷ÿüýüÿýþýÿýþýÿþþýÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüýüÿûüûÿóùóÿèôèÿÜîÜÿÇáÆÿ±Õ¯ÿ–Æ—ÿs³ÿS¢iÿIrÿF›†ÿDš›ÿD¢½ÿE«àÿI¶óÿSÃõÿ\Ï÷ÿaÔøÿcÖøÿdÙøÿd×ùÿbÖùÿbÖùÿaÖùÿaÕùÿaÕùÿaÕùÿbÕùÿbÕùÿbÕùÿbÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿbÕùÿbÕùÿbÕùÿbÕùÿaÕùÿaÕùÿaÕùÿaÖùÿbÖùÿb×ùÿdØøÿdØøÿbÖøÿ`Óøÿ[ÌöÿQ¿õÿG³òÿE©ÖÿD ³ÿDš•ÿHœ‚ÿMžqÿR¤eÿY¬aÿ_³]ÿbº_ÿeÁbÿgÆeÿiÉfÿjÊgÿkËhÿmËjÿoËlÿuÍrÿ|Ðyÿ„Òÿ‘׎ÿžÜ›ÿªß§ÿ´ã±ÿ¾åºÿ·á´ÿªÛ§ÿœÓšÿŠÈŠÿw¾yÿh¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿr»tÿ„Å…ÿ—Ï–ÿ¦Ø¤ÿ³à°ÿ¿æ»ÿ¹ä´ÿ®àªÿ£Ý ÿ•Ø’ÿ‡Ô…ÿ}Ñ|ÿwÎsÿpÌmÿmËkÿkËiÿjÌhÿjÌhÿjÌiÿjÌiÿjËhÿiËgÿrÍpÿÒ}ÿ‡Õ…ÿ‡Õ…ÿ‡Õ…ÿ‡Õ…ÿ‡Õ…ÿ‡Õ…ÿ‡Õ…ÿ‡Õ…ÿ‡Õ…ÿ†Õ„ÿ†Ô„ÿ‹Ö‰ÿ˜Û—ÿ¤Þ£ÿ§à¦ÿ¦ß¥ÿ¨à¦ÿ´ä±ÿ¿è¾ÿÄêÃÿÃêÂÿÃêÂÿÉìÈÿÑîÐÿØð×ÿÜóÜÿáôàÿçõåÿìøëÿðúðÿöúöÿúüúÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýþýÿûüûÿ÷û÷ÿâòáÿÆçÆÿ­Û¬ÿšÎ—ÿ‡¿ƒÿs³zÿ\§€ÿG›ŠÿB››ÿC ±ÿE¦ÆÿK²ÙÿP¾ëÿVÇöÿ[Î÷ÿ`ÓøÿaÕ÷ÿbÖøÿa×ùÿaÖùÿbÕùÿaÕùÿ`Õùÿ`Õùÿ`ÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿ`Õùÿ`Õùÿ`ÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿ`Õùÿ`Õùÿ`ÕùÿaÕùÿaÕùÿaÕùÿaÕùÿaÕùÿ`Õùÿ`Õùÿ`ÕùÿaÕùÿaÖùÿa×ùÿa×øÿbÖøÿaÕ÷ÿ^Ñ÷ÿYË÷ÿSÅõÿNºæÿH®ÔÿD¤ÂÿDŸ¬ÿD›—ÿIœ‚ÿR¤mÿY«Yÿ_´Yÿb¼_ÿfÃdÿgÇeÿiÉgÿkËhÿmËjÿoËlÿuÍrÿ|Ðyÿ„Óÿ‘׎ÿŸÜ›ÿªß¨ÿµâ²ÿ¾åºÿ·â³ÿªÛ¨ÿœÓœÿŠÈŠÿw¾yÿh¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿr»tÿ„Å…ÿ–Ï–ÿ¥Ø£ÿ´à±ÿ¿æ»ÿ¸ä´ÿ®á«ÿ¤Ý ÿ–Ø’ÿˆÔ…ÿ}Ñ|ÿwÎtÿoÌmÿlËkÿkËiÿjÌhÿjÌhÿkÌiÿkÌiÿiËgÿiÊgÿxÏvÿŒÖŠÿšÛšÿ›Û™ÿ™Û˜ÿ™Û˜ÿ™Û˜ÿ™Û˜ÿ™Û˜ÿ™Û˜ÿ™Û˜ÿ™Û˜ÿ™Û˜ÿ¡Þ ÿµäµÿÈëÇÿÌíËÿËìÊÿÎîÍÿàôßÿðùïÿóúóÿôûóÿôûôÿõûôÿöûöÿ÷ü÷ÿøüøÿùýùÿúýúÿûýûÿüýüÿýýýÿþýþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿýþýÿûýûÿøüøÿõûõÿîøíÿÎëÎÿ¥Ù¤ÿÉÿoºlÿ_¬[ÿR¢bÿG›…ÿ=–©ÿ=œÃÿA¦ÛÿG²ïÿP¿óÿ[Îöÿ`Öøÿa×ùÿa×øÿaÖøÿ`Õøÿ`Õøÿ`Õøÿ`Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ`Õøÿ`ÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿ`Õøÿ`Õøÿ`Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ_Õøÿ`Õøÿ`Õøÿ`Öøÿ`Õøÿ`ÖøÿbÖøÿb×øÿaÖùÿ_ÖøÿVÊöÿM»òÿD®ëÿ@£Ôÿ<š¼ÿ@˜ ÿKzÿU¤Xÿ[¬Vÿ`·]ÿdÀbÿfÄeÿhÉgÿjÌhÿlËjÿnËlÿtÎrÿ{ÐyÿƒÓÿ‘׎ÿŸÜ›ÿ¬ß¨ÿ¶ã±ÿ¿æºÿ¸â´ÿªÛ¨ÿœÓ›ÿŠÈŠÿw¾xÿh¶jÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿs»tÿ„Å…ÿ–Жÿ¥Ø¤ÿ´à°ÿ¿ç¼ÿ¸äµÿ®á«ÿ£Ý ÿ–Ø“ÿˆÔ…ÿ}Ñ|ÿvÎtÿoÌmÿmËkÿkËiÿjÌhÿjÌhÿkÌiÿkÌiÿiËgÿiÊgÿ‚Óÿ¦à¥ÿ¿è¾ÿ¿è¿ÿ½è½ÿ½è½ÿ½è½ÿ½è½ÿ½è½ÿ½è½ÿ½è½ÿ½è¼ÿ½è¼ÿÃêÃÿÐîÐÿÝóÝÿàôßÿßôÞÿáôàÿíøíÿùüùÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýýýÿôûôÿë÷ëÿßóßÿÑîÑÿÁéÁÿ©Þ¨ÿŒÐŠÿrÂrÿb´pÿS¦rÿI ÿD¡¢ÿA£ÃÿCª×ÿH¶çÿM¿õÿTÉöÿZÑ÷ÿ]Öøÿ]Ö÷ÿ]Öøÿ\Õøÿ\Ô÷ÿ[Ô÷ÿ[Ô÷ÿ[Ô÷ÿ[Ó÷ÿ\Ó÷ÿ\Ó÷ÿ\Ó÷ÿ\Ó÷ÿ\Ó÷ÿ[Ô÷ÿ[Ô÷ÿ[Ô÷ÿ\Ô÷ÿ]Ô÷ÿ\Ô÷ÿ^Ô÷ÿ^Ô÷ÿ_Ô÷ÿ_Ô÷ÿ_Ô÷ÿ`Ô÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿaÔ÷ÿ`Ô÷ÿ_Ô÷ÿ_Ô÷ÿ_Ô÷ÿ^Ô÷ÿ^Ô÷ÿ\Ô÷ÿ\Ô÷ÿ[Ô÷ÿ[Ó÷ÿ[Ó÷ÿ\Ó÷ÿ\Ó÷ÿ\Ó÷ÿ\Ó÷ÿ\Ó÷ÿ[Ó÷ÿ[Ó÷ÿ[Ô÷ÿ[Ô÷ÿ[Ô÷ÿ]Ô÷ÿ]Õøÿ^Öøÿ]Ö÷ÿ]ÖøÿXÎ÷ÿPÆöÿK¼òÿF²âÿB§ÒÿB£ºÿH¡šÿM¡zÿUªmÿ\µfÿc¾aÿfÄcÿhÈfÿjÌhÿlËjÿnËlÿtÎrÿ|Ðxÿ„Óÿ‘׎ÿŸÜœÿ¬ß§ÿ¶ã±ÿ¿ç»ÿ¸â´ÿªÛ¨ÿœÓ›ÿŠÉŠÿx¾xÿi¶jÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿs»tÿ…Æ…ÿ—Зÿ¦Ø¤ÿ´à²ÿ¿æ¼ÿ¸ä¶ÿ®àªÿ£Ý ÿ–Ø“ÿˆÔ…ÿ~Ñ|ÿvÎtÿoÌmÿmËkÿkËiÿjÌhÿjÌhÿkÌiÿkÌiÿhËfÿhËgÿŽØÿ¿è¿ÿåõåÿåõåÿãôäÿãôäÿãôäÿãôäÿãôäÿãôäÿãôäÿãôäÿãôãÿåõåÿê÷ëÿðùðÿñùñÿðùðÿñùñÿöûöÿüýüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿþþÿÿþþÿÿþþþÿúýúÿë÷ëÿ×ðÖÿÁéÀÿ§à¦ÿ×ÿ€Ï~ÿsÆqÿg½iÿX¯|ÿJ£‘ÿCŸ¨ÿE©ÄÿF³ÞÿJ¼éÿOÅïÿTÍöÿVÐ÷ÿWÒöÿWÔ÷ÿWÓ÷ÿWÓ÷ÿWÒ÷ÿVÒ÷ÿVÒ÷ÿVÒ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÒ÷ÿVÒ÷ÿWÒ÷ÿWÒ÷ÿWÒ÷ÿYÒ÷ÿYÓ÷ÿ[Ó÷ÿ]Ó÷ÿ^Ô÷ÿ^Ô÷ÿ_Ô÷ÿ`Ô÷ÿ_Ô÷ÿ_Ô÷ÿ_Ô÷ÿ_Ô÷ÿ_Ô÷ÿ_Ô÷ÿ_Ô÷ÿ`Ô÷ÿ_Ô÷ÿ_Ô÷ÿ^Ô÷ÿ]Ô÷ÿ\Ó÷ÿZÓ÷ÿYÒ÷ÿYÒ÷ÿXÒ÷ÿWÒ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÑ÷ÿVÒ÷ÿVÒ÷ÿVÒ÷ÿVÒ÷ÿWÒ÷ÿWÓ÷ÿWÓ÷ÿWÔ÷ÿWÒöÿTÏ÷ÿRËõÿMÂîÿG¹æÿE°ÕÿE¦»ÿDŸ¡ÿM¦‰ÿY²rÿb¼`ÿeÃbÿhÉfÿkÌhÿlËjÿnËlÿtÎrÿ|Ðxÿ„Óÿ‘×ÿŸÛœÿ¬ß§ÿ¶ã²ÿ¾ç»ÿ¸â´ÿªÚ©ÿÓœÿ‹É‹ÿy¿yÿi¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´gÿs»tÿ…Æ…ÿ˜Ð—ÿ§Ø¤ÿ´à²ÿ¿ç½ÿ¹ä¶ÿ®à«ÿ£Ý¡ÿ–Ù“ÿ‰Ô†ÿ~Ñ|ÿvÎtÿoÌmÿmËkÿkËiÿjÌhÿjÌhÿkÌiÿkÌiÿgÊeÿhÊfÿ–Û•ÿÐîÑÿôúôÿûýûÿúýúÿúýúÿúýúÿúýúÿúýúÿúýúÿúýúÿúýúÿúýúÿúýúÿûýûÿüþüÿüþüÿüþüÿüþüÿýþýÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿýýýÿûýûÿøûùÿõûõÿîøíÿ×ðÖÿ¿é¾ÿ¤ß£ÿ‡Ö†ÿlËjÿdÅbÿcÀ^ÿ_¹cÿQ¬…ÿAŸªÿ? ÇÿL²ÜÿXÃñÿ^Í÷ÿcÔøÿfÚùÿeÙøÿd×÷ÿbÖ÷ÿaÕ÷ÿbÖ÷ÿbÖ÷ÿ`Ö÷ÿ`Ö÷ÿ`Õ÷ÿ`Ô÷ÿ`Ô÷ÿ`Õ÷ÿ`Õ÷ÿ`Õ÷ÿ`Ô÷ÿ`Õ÷ÿ`Õ÷ÿaÕ÷ÿbÖ÷ÿcÕ÷ÿcÕ÷ÿaÔ÷ÿ_Õ÷ÿ^Ô÷ÿ]Ô÷ÿ]Óøÿ]Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ^Óøÿ]Óøÿ]Óøÿ]Ó÷ÿ]Ô÷ÿ^Ô÷ÿ`Ô÷ÿbÕ÷ÿcÕ÷ÿbÔ÷ÿbÕ÷ÿaÕ÷ÿ`Õ÷ÿ`Õ÷ÿ`Õ÷ÿ`Õ÷ÿ`Õ÷ÿ`Õ÷ÿ`Õ÷ÿ`Ô÷ÿ`Õ÷ÿ`Ö÷ÿaÖ÷ÿbÖ÷ÿaÕ÷ÿbÖ÷ÿcÖ÷ÿdØ÷ÿdÙøÿdØøÿ`Ñ÷ÿ[ÉõÿU¾êÿJ®ÖÿB ÀÿJ¦ ÿX²{ÿb»_ÿeÂaÿhÈfÿkÌiÿlËjÿnËlÿtÎrÿ|Ðxÿ„Óÿ’×ÿŸÛœÿ«ß¨ÿµã³ÿ¾ç»ÿ·â¶ÿ«Û©ÿžÔœÿŒÉ‹ÿy¿zÿi¶kÿ\¯_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX®[ÿe´hÿs¼tÿ…Æ…ÿ˜Ð—ÿ§Ø¤ÿ´à²ÿÀç½ÿ¹å·ÿ®à¬ÿ£Ý¡ÿ–Ù“ÿ‰Ô†ÿ~Ñ|ÿvÎtÿoÌmÿmËkÿkËiÿjÌhÿjÌhÿkÌiÿkÌiÿgÊeÿgËfÿ–Ú•ÿÐîÐÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûüûÿ÷û÷ÿñúñÿáôàÿÎîÍÿ¼ç»ÿ¬áªÿœÜ™ÿ‹Ö‰ÿzÑwÿiÊgÿdÅbÿeÁ_ÿ`»dÿP­Žÿ> »ÿE¥ØÿiÀéÿŒÚ÷ÿ•âûÿ•æûÿ–èûÿ–çûÿ”åûÿ“äùÿ“åùÿ“åùÿ’äùÿ’äùÿ’äùÿ’äùÿ’ãùÿ’äùÿ’äùÿ’äùÿ’äùÿ’äùÿ’ãùÿ’ãùÿ’äùÿ“äùÿ”äùÿ”ãùÿŠáùÿ{ÝøÿmØ÷ÿfÖ÷ÿ_Ô÷ÿZÒøÿ\Òøÿ]Òøÿ]Óøÿ]Óøÿ^Óøÿ^Óøÿ^Óøÿ]Óøÿ]Óøÿ]Óøÿ]Òøÿ\Òøÿ[ÒøÿaÔ÷ÿh×÷ÿqÙ÷ÿ€ÞøÿŽâùÿ”äùÿ“ãùÿ’äùÿ’äùÿ’äùÿ’äùÿ’äùÿ’äùÿ’äùÿ’äùÿ’äùÿ’ãùÿ’äùÿ’äùÿ’äùÿ’åùÿ“åùÿ“äùÿ“äùÿ•åûÿ–çûÿ–çûÿ•äúÿ“àúÿ„Óòÿi¾åÿO©ÖÿQ«°ÿ[µ‚ÿc¼_ÿfÃaÿhÉfÿkÌiÿlËjÿnËlÿtÎrÿ|Ðxÿ„Óÿ’×ÿ Üÿ«ß¨ÿµä²ÿ¿ç¼ÿ¸â¶ÿ«Ü©ÿÔœÿŒÉŒÿy¿zÿi¶kÿ\°_ÿP©TÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿe´hÿs¼uÿ…Ɔÿ˜Ð–ÿ¦Ø¤ÿµà²ÿÀç½ÿºå¶ÿ®á¬ÿ£Ý¡ÿ–Ù“ÿ‰Ô†ÿ~Ñ|ÿvÎtÿoÌmÿmËkÿkËiÿjÌhÿjÌhÿjÌhÿjÌhÿgÊeÿgÊeÿ•Ú”ÿÏîÏÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿýþýÿüþüÿûýûÿøüøÿðùðÿåöåÿÇìÇÿ¥à¤ÿ‰Öˆÿ€Ò~ÿxÐvÿrÎpÿnÌlÿjËhÿhÇeÿfÃ`ÿb½fÿN®—ÿ; ËÿLªéÿ…Íóÿ¾ïûÿÊõýÿÇõýÿÅõýÿÅôýÿÄóýÿÄóýÿÃóüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÄòüÿÄñüÿ²ìüÿ—äùÿ}Ý÷ÿoØ÷ÿaÔ÷ÿYÑ÷ÿ[Ñ÷ÿ\Ò÷ÿ\Ò÷ÿ\Ò÷ÿ]Ò÷ÿ]Ò÷ÿ]Ò÷ÿ]Ò÷ÿ\Ò÷ÿ\Ò÷ÿ[Ò÷ÿYÑ÷ÿXÑ÷ÿeÕ÷ÿsÚ÷ÿ…àøÿžæùÿ¹îüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃòüÿÃóüÿÃóüÿÄòýÿÄóýÿÅôýÿÅôýÿÇõýÿÈóüÿ³çøÿ†Ìóÿ\³êÿX²¿ÿ_¸‰ÿd¾`ÿfÄaÿhÈfÿjÌhÿlËjÿnËlÿtÎrÿ|Ðxÿ„Óÿ’×ÿŸÜžÿ«à©ÿ¶ä´ÿ¿ç¼ÿ¹â¶ÿ«Ü©ÿÔœÿŒÉ‹ÿy¿zÿi·lÿ\°_ÿP©UÿM¨RÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX­[ÿeµhÿs¼uÿ…Ɔÿ—Зÿ¦Ø¦ÿµà³ÿÁç¾ÿºå·ÿ¯á¬ÿ¤Þ¡ÿ–Ù”ÿˆÕ†ÿ~Ñ|ÿvÎtÿoÌmÿmËkÿkËiÿiÌgÿiÌgÿiÌgÿiÌgÿfÊdÿgÊdÿ•Ú”ÿÏîÏÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿùüùÿöüöÿðúðÿëøêÿâôáÿÕðÔÿÆëÆÿ«áªÿ‹×ŠÿrÎpÿmÌkÿjÊhÿhÊfÿhËfÿiËgÿhÇfÿgÅaÿcÀgÿP²˜ÿ=¢ÌÿJ©éÿ}Çñÿ¯âøÿ¹èúÿµæúÿ³äúÿ³äùÿ²ãùÿ±ãùÿ²ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ°ãùÿ°âùÿ°âùÿ°àùÿ¦àùÿœâøÿŽâøÿzÜ÷ÿdÔ÷ÿWÐöÿYÑöÿ[Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ[Ñöÿ[ÑöÿXÑöÿWÑöÿiÖ÷ÿÝ÷ÿ‘áøÿŸâøÿ¬âùÿ±âùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ±ãùÿ²ãùÿ±ãùÿ²ãùÿ²ãùÿ³äúÿ¶æúÿ·çúÿ¥Þøÿ}ÆóÿY±íÿW²Áÿ_ºŠÿeÀ`ÿfÄaÿhÈfÿjÌhÿlËjÿnËlÿtÎrÿ|Ðxÿ„Óÿ’ØÿŸÜÿ«àªÿ·ä³ÿÀæ½ÿ¸â·ÿ«ÜªÿÔœÿ‹É‹ÿy¿zÿi·lÿ\°_ÿP©UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX®[ÿeµhÿs¼uÿ…Ɔÿ˜Ð˜ÿ§Ù¥ÿµá³ÿÁç¾ÿºå·ÿ¯á¬ÿ¥Þ¡ÿ–Ú”ÿˆÕ†ÿ~Ñ|ÿvÎtÿoÌmÿmËkÿkËiÿiÌgÿiÌgÿiÌgÿiÌgÿfÊdÿfÊdÿ•Ú“ÿÏîÏÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùüùÿóúòÿé÷èÿÚòÙÿÉìÈÿ¹æ·ÿ¨á§ÿ—Û–ÿˆÕ‡ÿyÐxÿmÌkÿjÌhÿiËgÿhËfÿiËgÿiËgÿhÈfÿgÇbÿcÃhÿRµ•ÿA¦ÄÿB¤ßÿX°éÿn½óÿr¿ôÿo½ôÿm¼óÿm¼óÿm¼óÿl»óÿk»óÿk»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿkºóÿjºòÿi¹ðÿwÄóÿ×öÿ¡æøÿ†ß÷ÿgÕöÿVÐöÿWÐöÿZÑöÿ[Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ\Ñöÿ[Ñöÿ[ÑöÿZÑöÿWÑöÿVÑöÿn×÷ÿ‹àøÿ™á÷ÿ‰ÓõÿwÃóÿo¼òÿm¼òÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿl»óÿk»óÿk»óÿl»óÿm¼óÿm¼óÿn¼óÿp¾ôÿq¿õÿiºñÿW°íÿG§åÿN®½ÿ\ºˆÿfÄbÿhÆbÿhÉfÿjËhÿlËjÿnËlÿtÎrÿ|Ðxÿ„Óÿ’ØÿŸÝÿ«à©ÿ¶ã³ÿÀæ½ÿ¹ã¶ÿ¬ÜªÿÔÿ‹É‹ÿy¿zÿi·lÿ\°_ÿP©UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX®[ÿeµhÿs¼uÿ†Æ†ÿ™Ð—ÿ§Ù¥ÿ¶á³ÿÁç¾ÿ»å¸ÿ°á¬ÿ¥Þ¡ÿ–Ù”ÿˆÕ†ÿ~Ñ|ÿvÎtÿoÌmÿmËkÿjËhÿiËgÿiËgÿjËhÿjËhÿfÊdÿfÊdÿ”Ú“ÿÏîÏÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿýþýÿüþýÿûýûÿùüùÿ÷ü÷ÿóúóÿé÷èÿÚòØÿÁéÀÿ¨à§ÿ’Ùÿ~Ò}ÿlÌjÿiÊgÿiËgÿhËfÿhËfÿiËgÿiËgÿiËgÿiËgÿiÊfÿhÉcÿeÅhÿV¸ÿFª¹ÿ<¡Ôÿ8žßÿ4œéÿ2›ìÿ0™êÿ/˜êÿ.˜êÿ.˜êÿ.˜êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ-˜êÿ.˜êÿ*–éÿ)”èÿL©ìÿƒÌóÿ²ëùÿ‘áøÿjÖöÿVÐöÿXÐöÿZÐöÿ[Ñ÷ÿ[Ñ÷ÿ\Ñ÷ÿ\Ñ÷ÿ\Ñ÷ÿ[Ñ÷ÿ[Ñ÷ÿ[Ñ÷ÿZÑöÿVÑöÿVÑöÿtØ÷ÿ—âùÿ áøÿtÄòÿE§ìÿ1šêÿ0™éÿ-˜éÿ-˜êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.™êÿ.˜êÿ.˜êÿ/˜êÿ/™êÿ0™ëÿ2šëÿ3›çÿ6âÿ: ÚÿG¬¶ÿY»‡ÿgÈdÿhÉcÿhÊfÿjËhÿlËjÿnËlÿtÎrÿ{ÐxÿƒÓÿ‘Øÿ Üÿ¬à©ÿ·ä´ÿÀç½ÿºã¶ÿ¬ÜªÿžÔÿ‹ÉŒÿy¿{ÿi·lÿ\°_ÿP©UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX®[ÿeµhÿs¼uÿ†Æ†ÿ™Ð˜ÿ§Ù§ÿ¶á´ÿÂè¿ÿ»å¸ÿ°á­ÿ¥Þ¢ÿ–Ù”ÿˆÔ†ÿ~Ñ|ÿvÎsÿoÌmÿlËjÿjËhÿiÊgÿiÊgÿjÊhÿjÊhÿfÉdÿfÉdÿ”Ù“ÿÏîÎÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿùýùÿõúõÿí÷íÿáóáÿ×ðÖÿËìËÿÀé¿ÿ²ã±ÿ¡ÞŸÿØŽÿ€ÒÿsÎqÿgÊeÿfÉdÿhÊfÿhÊfÿiÊgÿiÊgÿiÊgÿiÊgÿiÊgÿhÊfÿiÉeÿgÇhÿ]¾‚ÿRµÿK¯­ÿF¬¶ÿ@¨¼ÿ?§½ÿ>§½ÿ>¥½ÿ=¦½ÿ<¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ<¥½ÿ<¤»ÿ9¢¿ÿ2œÈÿ,—ÒÿJ¨Ýÿ€Èìÿ«äøÿ‘ßøÿoÖöÿ\ÒöÿZÑöÿZÐöÿZÐ÷ÿZÐ÷ÿ[Ð÷ÿ\Ð÷ÿ[Ð÷ÿ[Ð÷ÿZÐ÷ÿYÐ÷ÿZÑöÿXÑöÿZÒöÿuØ÷ÿ•ßøÿœÛõÿqÀèÿC¤Ûÿ3œÐÿ7 Æÿ;£¼ÿ<¥»ÿ<¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ=¦½ÿ>¦½ÿ>§½ÿ?§½ÿA¨»ÿD«·ÿH®³ÿS¶›ÿ^À{ÿgÈdÿhÊdÿhÊfÿjÊhÿlËjÿnËlÿtÍqÿ{Ðxÿ„Óÿ’×ÿ Üÿ¬à©ÿ¸äµÿÁè¾ÿ¹ã¸ÿ¬Ü«ÿžÔÿŒÉŒÿy¿{ÿi·lÿ\°_ÿP©UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX®[ÿeµhÿs¼uÿ†Æ†ÿ˜Ð˜ÿ¨Ù¦ÿ¶á´ÿÂè¿ÿ»å¸ÿ¯á­ÿ¥Þ£ÿ–Ù”ÿˆÔ†ÿ~Ð{ÿuÎtÿoÌmÿkËiÿjÊhÿiÊgÿiÊgÿjÊhÿjÊhÿfÉdÿfÉdÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿþþþÿüþüÿöûõÿí÷ìÿÛðÚÿÃéÂÿ«áªÿÛ›ÿ‘×ÿ†ÓƒÿÑ}ÿxÐvÿsÎqÿmÌkÿhÊfÿhÊfÿiÊgÿiÊgÿiÊgÿjÊhÿjÊhÿjÊhÿiÊgÿhÊfÿiÉeÿhÈfÿdÅqÿ`Â|ÿ^À‚ÿ\¿…ÿZ¾ˆÿZ½ˆÿZ½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿX»‡ÿX¹†ÿSµŽÿFª¤ÿ;Ÿ¹ÿQ¬Îÿ}Åäÿ¡Û÷ÿÚ÷ÿsÖ÷ÿcÔ÷ÿ]ÒöÿXÐöÿXÐöÿYÐöÿZÐöÿ[Ðöÿ[ÐöÿZÐöÿYÐöÿXÐöÿZÑöÿ[Òöÿ_Ó÷ÿv×÷ÿÚøÿ—Õñÿq¾ÝÿI¦Éÿ@£³ÿL®ÿV¸ˆÿWº†ÿX»‡ÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿY½ˆÿZ½ˆÿZ½ˆÿ\¾†ÿ]¿…ÿaÃ{ÿeÆoÿhÉeÿhÉeÿhÊfÿiÊgÿkËiÿmËkÿtÍqÿ|Ðxÿ„Òÿ’×ÿ Üžÿ¬àªÿ¸ä´ÿÁè¾ÿºã·ÿ­Ü«ÿžÔžÿŒÉŒÿy¿{ÿi·kÿ\°_ÿP©UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªSÿM¨RÿX®[ÿeµhÿs¼uÿ†Æ‡ÿ™Ð™ÿ©Ù¦ÿ·á´ÿÂè¿ÿ»å¹ÿ°á®ÿ¤Þ£ÿ—Ù”ÿ‰Ô†ÿ~Ð{ÿuÎtÿnÌlÿkËiÿjÊhÿiÊgÿiÊgÿjËhÿjËhÿfÉdÿfÉdÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿýýýÿûýûÿùûùÿöûöÿòúñÿæõæÿÙñØÿÃéÂÿ¥Þ¤ÿ‰Õ†ÿ{ÏxÿoËmÿgÉeÿgÊeÿhÊfÿhÊfÿiÊgÿiÊgÿiÊgÿiÊgÿjËhÿjËhÿjËhÿjËhÿjËhÿiËgÿiÊgÿiÊgÿjËfÿjËfÿjËfÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËdÿjÊdÿhÈcÿhÆaÿbÀlÿS´‡ÿF§£ÿU®¿ÿvÀÛÿ’Ñõÿ‡Ô÷ÿy×÷ÿn×÷ÿcÔ÷ÿXÐöÿVÏõÿXÏõÿYÏõÿZÏõÿZÏõÿYÏõÿXÏõÿWÏõÿZÑöÿbÓ÷ÿiÖøÿxÕ÷ÿˆÓ÷ÿŠÍîÿl»ÒÿL©¶ÿIª›ÿX·~ÿgÄdÿiÇaÿiÉdÿjËdÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËeÿjËfÿjËfÿiÊfÿiÊgÿiÊgÿiÊgÿiÊgÿkËiÿmËkÿtÍrÿ|Ðyÿ„Òÿ’×ÿ ÜŸÿ¬à«ÿ·äµÿÁè¾ÿ»ã·ÿ­Ü«ÿŸÔžÿŒÉŒÿy¿{ÿi·kÿ\°_ÿP©UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨RÿX®\ÿeµhÿt¼uÿ†Æ‡ÿ™Ð˜ÿ¨Ù§ÿ·áµÿÃçÀÿ¼å¸ÿ°á®ÿ¥Þ¢ÿ—Ù”ÿ‰Ô†ÿ~Ð|ÿvÎtÿnÌlÿlËjÿjÊhÿiÊgÿiËgÿjËhÿjËhÿfÉdÿfÉdÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿöû÷ÿñùðÿãôâÿÓîÓÿÅéÄÿ¹å¸ÿ¬áªÿÜ›ÿ‹Õ‰ÿzÏxÿqÌoÿkÊiÿgÉeÿgÊeÿhÊfÿiÊgÿiÊgÿiÊgÿiÊgÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËgÿjËgÿjËgÿjËfÿjËfÿjËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿjËeÿiÊcÿiÉcÿiÈbÿeÃiÿY¸|ÿM¬ÿU¯­ÿe¸ÑÿvÀñÿ}Ëöÿ„Ø÷ÿ‚ÞøÿnØ÷ÿZÑöÿTÎõÿWÏõÿXÏõÿYÏõÿYÏõÿXÏõÿUÏõÿTÏõÿ^ÒöÿpØ÷ÿ€Ýùÿ~Ó÷ÿyÈôÿr¾éÿa´ÆÿP¬¢ÿP¯‰ÿ]»vÿhÆdÿiÉbÿiÉcÿjËeÿkÌeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿkËeÿjËeÿjËfÿjËfÿjËgÿjËgÿjËgÿiÊgÿiÊgÿkËiÿmËkÿtÍrÿ|Ðyÿ„Ò‚ÿ’×ÿ Üžÿ¬àªÿ¸ä¶ÿÃè¿ÿ»ã¸ÿ­Ü«ÿŸÔžÿŒÉŒÿz¿{ÿj·kÿ\°_ÿP©UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿX®\ÿfµhÿt¼vÿ†Æ‡ÿ™Ð˜ÿ¨Ù¨ÿ·áµÿÃèÀÿ¼å¹ÿ±á®ÿ¦Þ¢ÿ—Ù”ÿˆÔ‡ÿ}Ð|ÿvÎtÿnÌlÿlËjÿjÊhÿiÊgÿiËgÿiËhÿiËhÿfÉdÿfÉdÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿþþþÿþþþÿýþýÿýþýÿüþüÿüýûÿúýúÿ÷ü÷ÿðøïÿåõäÿËëÊÿ¯á­ÿ—Ù•ÿ‹Õ‰ÿ~Ñ}ÿvÎtÿqÌoÿmÊkÿkËiÿjÊgÿiÊgÿiÊgÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiÊgÿhÉfÿhÉfÿiÉeÿfÅiÿ^¼rÿU²|ÿT¯›ÿU®ÇÿX¯îÿsÃõÿÚøÿ—åùÿyÛøÿ[ÑõÿSÎõÿVÎõÿWÏöÿXÏöÿWÏöÿWÏöÿTÏõÿSÏõÿbÓöÿÝ÷ÿ—ãùÿ„Òöÿi½òÿX¯äÿU®¹ÿT¯ÿW´yÿ`¿oÿhÈgÿhÉeÿhÉfÿiÊgÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiÊgÿiÊgÿkËiÿmËkÿtÍrÿ|Ðzÿ„Ò‚ÿ’×ÿ¡Üžÿ®àªÿ¹ä¶ÿÂè¿ÿ»ã¹ÿ­Ü¬ÿ ÔžÿŒÉÿz¿{ÿj·lÿ\°_ÿP©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿX®\ÿfµiÿt¼vÿ‡Æ‡ÿšÐ™ÿ¨Ù§ÿ¸áµÿÄèÁÿ½æºÿ±á­ÿ¥Þ£ÿ—Ù•ÿˆÔ‡ÿ}Ð|ÿvÎtÿnÌlÿlËjÿjÊhÿhÊgÿhËgÿhËhÿhËhÿeÉdÿeÉdÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿüýüÿûüûÿ÷û÷ÿóúóÿïùîÿéöéÿäõäÿÜòÜÿÒîÒÿÆêÅÿ®á­ÿ”Ù’ÿ~Ð|ÿsÍqÿjÊhÿfÉeÿfÉeÿgÊfÿhÊfÿhÊgÿhÊgÿhÊgÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhÊgÿhÉgÿhÉgÿhÊgÿgÆhÿb¿jÿ\¸pÿU±ÿK©ÀÿE¤ëÿj¾óÿ•Ù÷ÿ¢æúÿ€Üøÿ\ÑõÿRÎõÿTÎõÿVÎöÿVÎöÿVÏöÿUÏöÿSÎõÿQÎõÿdÓöÿˆÞøÿ§çùÿ‡Ðõÿ_µñÿH¦ßÿO¬±ÿW³ƒÿ]ºmÿcÂjÿiÉgÿiÊgÿhÉgÿhÊgÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhÊgÿiÊgÿkËiÿmËkÿtÍrÿ|Ðzÿ„Ò‚ÿ“×ÿ¡Üžÿ­àªÿ¹äµÿÃèÀÿ¼ã¹ÿ®Û¬ÿŸÔžÿÊÿz¿|ÿj·mÿ]°`ÿP©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿX®\ÿfµiÿt¼vÿ‡Æ‡ÿ™Ñ™ÿªÙ¨ÿ¸á¶ÿÄèÁÿ½æ¹ÿ²á®ÿ¦Ý£ÿ—Ù•ÿˆÔ†ÿ}Ð|ÿvÎtÿnÌlÿlËjÿjÊhÿhÊgÿhËgÿhËhÿhËhÿeÉdÿeÉdÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿüþüÿùüúÿ÷û÷ÿì÷ìÿàôàÿÓïÓÿÃêÃÿ´å³ÿ©á¨ÿ ÝŸÿ—Ú•ÿ‹ÖŠÿ}Ð|ÿrÍqÿmÌlÿhÊhÿgÉfÿgÊgÿhÊgÿhÊgÿhÊgÿhÊgÿhËgÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhÊhÿhÉhÿhÉgÿhÉgÿgÈgÿdÃgÿ`¼hÿV´ˆÿE§»ÿ;Ÿéÿf¹ñÿ˜×õÿ¨åúÿ…Üøÿ_ÑõÿRÎõÿTÍõÿTÍöÿTÍöÿTÍöÿTÍöÿPÍõÿNÍõÿdÒöÿÞøÿ¯çúÿŠÎôÿY±ïÿ>¡ÜÿK««ÿZ·zÿa¾gÿeÄfÿhÉgÿiÊgÿhÉhÿhÊhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhËhÿhÊgÿiÊgÿkËiÿmËkÿtÍrÿ|Ðzÿ„Ò‚ÿ“×ÿ¡Üžÿ®à«ÿºå¶ÿÃèÀÿ¼äºÿ®Ü¬ÿ ÔžÿÊÿzÀ|ÿj·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿX®\ÿfµiÿt¼vÿ‡ÇˆÿšÑšÿ©Û¨ÿ¹â¶ÿÅéÁÿ¾æºÿ³á¯ÿ§Ý£ÿ˜Ù•ÿ‰Ô†ÿ}Ð{ÿvÎtÿnÌlÿlËjÿiÊhÿhÊgÿhËgÿiËgÿiËgÿeÉdÿeÉdÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýþýÿüýüÿûýûÿùýùÿøüøÿöûõÿôúôÿïùïÿÞóÞÿÊíÊÿ¶å¶ÿÝÿ„Õ„ÿwÏvÿqÍoÿkËjÿiÊiÿiÊhÿhÊgÿgÊfÿhÊgÿhÊgÿhÊgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiÊgÿiÉgÿiÉgÿhÊgÿgÈfÿfÅcÿeÁbÿW·‚ÿ@§¶ÿ1šäÿbµîÿ™Ôôÿ­ãùÿˆÚøÿbÑõÿTÎõÿSÍõÿSÌõÿSÌõÿSÌõÿRÌõÿOËõÿMÌõÿeÒõÿÝøÿ¶æùÿŠËòÿS­ëÿ6ØÿG«¥ÿ\»tÿeÂaÿfÆdÿgÉfÿhÉgÿiÉgÿiÊgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhËgÿhÊgÿiÊgÿkËiÿmËkÿtÍrÿ|Ðzÿ„Ò‚ÿ“×ÿ¡ÜŸÿ®à«ÿºå¶ÿÄéÀÿ½ä¹ÿ¯Ý­ÿ¡ÔŸÿÊÿyÀ|ÿj·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿX®\ÿeµiÿt¼vÿ‡ÇˆÿšÑ™ÿ«Ú¨ÿ¹â¶ÿÆéÂÿ¾æ»ÿ²â¯ÿ¦Þ¤ÿ˜Ù•ÿ‰Ô†ÿ}Ð{ÿvÎtÿnÌlÿlËjÿiÊhÿhÊfÿhËfÿiËfÿiËfÿeÉcÿeÉcÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿøûøÿòùòÿë÷ëÿâôâÿÙñÙÿÒîÑÿËìÊÿÂéÂÿµåµÿ¨à¨ÿšÛ™ÿ‡Õ†ÿvÏuÿlÌkÿiÊfÿfÉcÿfÉdÿgÉdÿgÊeÿgÊfÿhÊfÿhÊfÿhËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiÊfÿiÊfÿiÊfÿhÊfÿgÉfÿgÇcÿfÅbÿZ»|ÿFª¤ÿ8žËÿ`³ÝÿŒÌíÿžØ÷ÿ†Ö÷ÿmÓöÿ_ÑõÿXÎõÿQËôÿPËôÿPËôÿSÌôÿWÎõÿ\ÐõÿoÓöÿŒ×÷ÿ¤Ù÷ÿÅèÿS­Øÿ<¢ÀÿL°˜ÿ^¾pÿfÅbÿfÈdÿgÉfÿhÊfÿiÊfÿiÊfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿhËfÿhÊfÿiÊgÿkËiÿmËkÿtÍrÿ|Ðzÿ„Ò‚ÿ“בÿ¡ÜŸÿ®à«ÿ»å¶ÿÄéÁÿ½äºÿ¯Ý­ÿ ÕŸÿÊÿyÀ|ÿj·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿX®\ÿfµhÿt¼vÿ‡ÇˆÿšÑšÿªÚ¨ÿºâ·ÿÆéÂÿ¾æ»ÿ²â°ÿ¦Þ¤ÿ˜Ù•ÿ‰Ô†ÿ}Ð{ÿvÎtÿnÌlÿlËjÿiÊhÿhÊfÿhËfÿiËfÿiËfÿeÉcÿeÉcÿ”Ù“ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿüþüÿôúôÿåöåÿÖñÖÿÃéÂÿ°â¯ÿ¢Ý¡ÿ–Ú•ÿŒÖ‹ÿ†Ô…ÿÒ€ÿ{ÐzÿuÏsÿnÌlÿjËhÿhÊgÿhÊfÿhÊfÿhÊfÿhÊfÿhËfÿhËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿhÊfÿgÉfÿhÈdÿgÆcÿ^¾uÿN¯‘ÿC¥­ÿ]³Èÿ}Ããÿ‹ÌôÿƒÒ÷ÿyÖöÿmÔöÿ^ÐõÿPËôÿOÊôÿOËôÿTÌôÿbÑõÿoÕöÿzÕöÿ†ÑöÿŽÌôÿt¾ÜÿV®¿ÿF¨¥ÿR´‰ÿbÂnÿgÇbÿgÈeÿgÉfÿhÊfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿiËfÿhËfÿhÊfÿiÊgÿkËiÿmËkÿtÍrÿ|Ðzÿ„Ò‚ÿ“בÿ¡ÜŸÿ®á¬ÿ»å¸ÿÅéÁÿ¾ä»ÿ¯Ý­ÿ Õ ÿÊŽÿ{À|ÿj·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿX®\ÿfµiÿu¼vÿˆÇˆÿ›Ñ›ÿªÚ©ÿºâ·ÿÆéÂÿ¿æ»ÿ²â°ÿ¦Þ¤ÿ˜Ù–ÿ‰Ô‡ÿ}Ð{ÿvÎtÿnÌlÿkËjÿiÊgÿhÊfÿhËfÿiËgÿiËgÿeÉcÿeÉcÿ”Ù’ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþýþÿýýýÿûýûÿúüúÿøüøÿ÷ü÷ÿöûöÿõûõÿôûôÿóúóÿðùïÿâõâÿÑïÑÿ½ç½ÿ¥ß¤ÿ׋ÿ}Ð{ÿpÌnÿfÉdÿeÉcÿfÉdÿgÊdÿgÊeÿhÊeÿhÊfÿhÊfÿhÊfÿhÊfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhÊfÿgÉeÿhÉdÿgÉdÿaÁoÿUµÿM«’ÿ\²µÿl¹ÛÿyÂóÿ‚Îöÿ‰Ú÷ÿ}Ú÷ÿdÑõÿNÊôÿMÉôÿNÊôÿUÌôÿkÓöÿ‚Û÷ÿ†×öÿÊõÿw¾òÿg·ÐÿW°ªÿO®ŒÿX¸zÿdÅjÿhÉdÿgÉeÿgÉeÿhÊfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhËfÿhÊfÿiÊgÿkËiÿmËkÿtÍrÿ|Ðzÿ„Ò‚ÿ“בÿ£Ý ÿ®á¬ÿºå·ÿÆéÁÿ¾äºÿ°Ý®ÿ¡Õ¡ÿŽÊŽÿ{À{ÿj·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿeµiÿu¼wÿˆÇ‰ÿœÑšÿ«Ú©ÿºâ·ÿÇèÃÿ¿æ¼ÿ²â°ÿ§Þ¥ÿ˜Ù–ÿ‰Ô‡ÿ}Ñ{ÿvÎtÿnÌlÿkËjÿiÊgÿhÊfÿhËfÿiËgÿiËgÿeÉcÿeÉcÿ”Ù’ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿöûöÿðùðÿèöçÿÞòßÿÖñÖÿÑïÐÿËìÊÿÆêÅÿÀè¿ÿºæ¸ÿ°â®ÿ¥ß¤ÿšÛ™ÿ‹ÕŠÿ}Ð{ÿrÍpÿlËjÿeÉcÿfÉdÿgÊdÿgÊeÿgÊeÿhÊfÿhÊfÿhÊfÿhÊfÿhËfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhÊfÿgÉeÿhÊeÿgÊdÿcÄjÿ\»qÿV³|ÿW±§ÿY°Õÿe¶ñÿƒÌõÿŸáùÿ’àùÿmÔöÿKÉôÿJÉôÿKÊôÿTÌôÿv×öÿ˜âùÿ“Ú÷ÿwÅõÿ]±ïÿY±ÇÿW²™ÿWµyÿ^½pÿeÆhÿhÊdÿgÉeÿgÉeÿhÊfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhËfÿhÊfÿhÊgÿkËiÿmËkÿsÍrÿ{Ðzÿ„Ó‚ÿ“Ø‘ÿ¢ÝŸÿ°á¬ÿ¼å·ÿÅéÂÿ¾ä»ÿ°Ý®ÿ¡Õ ÿÊŽÿ{À|ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿN¨QÿY®\ÿfµiÿu¼wÿˆÇ‰ÿœÑœÿ¬Úªÿºâ¸ÿÇéÃÿÀæ¼ÿ³â°ÿ§Þ¤ÿ˜Ù–ÿ‰Õ‡ÿ}Ñ{ÿvÎtÿnÌlÿkËjÿiÊgÿhÊfÿhËfÿhËgÿhËgÿeÉcÿeÉcÿ”Ù’ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿþþþÿþþþÿýþýÿýþýÿýþýÿýþýÿýþýÿüþüÿüþüÿüþüÿüýüÿüýüÿûýûÿúýúÿ÷ü÷ÿïøïÿäôãÿÓïÒÿÂéÂÿ³ä´ÿ©à¨ÿŸÜœÿ”Ø’ÿ‰Õ‡ÿ~Ñ}ÿ{ÐyÿyÏwÿuÎtÿrÌpÿnÌlÿkËiÿiÊhÿhÊfÿhÊfÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhÊfÿgÉeÿgÉeÿhÊeÿfÆeÿbÁdÿ^ºhÿS±˜ÿG§ÍÿQ«ïÿƒÉöÿ´çúÿ¨çûÿv×÷ÿJÉôÿGÈôÿIÉôÿUÍôÿÚ÷ÿ¬èúÿ Ü÷ÿp¿ôÿE£íÿJª¾ÿW´‰ÿ_¼fÿcÂdÿgÇeÿhÉeÿgÉeÿgÉeÿhÊfÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËfÿhÊfÿhÊgÿiËiÿlËkÿsÎrÿzÐzÿ„Ó‚ÿ“Ø‘ÿ¢Ý ÿ¯á¬ÿ¼å¸ÿÆéÂÿ¿ä¼ÿ°Ý®ÿ¡Õ¡ÿŽÊÿ{À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿgµiÿu¼wÿˆÇ‰ÿœÑœÿ«Ú«ÿ»â¸ÿÇéÄÿÀç¼ÿ´â°ÿ¨Þ¤ÿ˜Ú–ÿ‰Õ‡ÿ}Ñ{ÿvÎtÿnÌlÿkËjÿiÊgÿgÊfÿgËfÿgËgÿgËgÿdÉcÿdÉcÿ”Ù’ÿÏíÎÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýýýÿùüùÿöûöÿóúóÿóúóÿôûôÿòùòÿïùïÿíøíÿì÷ìÿë÷ëÿé÷éÿæöåÿâôâÿÚòÚÿÐîÑÿÆêÅÿ¶äµÿ¦ß¥ÿ˜Û—ÿŽ×Œÿ„ÓÿyÏwÿnÌmÿeÉcÿdÉcÿeÉcÿeÉdÿfÉeÿfÊeÿgÊfÿgÊfÿgÊfÿgÊfÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgÊfÿgÊfÿgÊfÿgÊfÿfÈdÿeÄ^ÿc¾^ÿR±ÿ@¤ÁÿH¦äÿ€Åïÿ·äøÿ¬æúÿzØöÿMÊôÿJÉôÿJÉôÿWÍôÿ…Û÷ÿ°èùÿ¡Úôÿjºìÿ9žàÿE¨³ÿW¶ÿdÀ^ÿfÅ`ÿgÈeÿgËfÿgÊfÿgÊfÿgÊfÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËfÿgÊfÿhÊgÿjËiÿlËkÿrÎrÿzÐzÿ„Ó‚ÿ“Ø‘ÿ¢Ý¡ÿ¯á­ÿ»å¹ÿÇéÃÿ¿ä»ÿ°Ü¯ÿ¡Õ¢ÿŽÊÿzÀ}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿgµiÿu¼wÿˆÇ‰ÿ›Óœÿ«Úªÿ»â¹ÿÈéÄÿÀç½ÿ´ã±ÿ¨ß¥ÿ˜Ú–ÿ‰Õ‡ÿ}Ñ{ÿvÎtÿnÌlÿkËjÿiÊgÿgÊfÿgËfÿgËgÿgËgÿdÉcÿeÉdÿ”Ù“ÿÏíÎÿ÷ûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿýýýÿôûôÿé÷éÿâôâÿãõãÿãõãÿÝóÝÿÕïÕÿÍíÍÿÊëÉÿÇêÅÿ¿è¿ÿ´ä´ÿ©à¨ÿ¡Ý¡ÿœÛœÿ–Ù•ÿŽ×ÿ†Ô…ÿ€Ó~ÿzÑyÿuÏsÿoÌnÿjÊiÿeÉdÿeÊdÿfÊeÿfÊeÿgÊfÿgÊfÿgÊfÿgÊfÿgÊfÿgËfÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËfÿfÇdÿeÅ`ÿcÁ`ÿS´†ÿA¤³ÿH¦ÒÿxÀãÿ©Ûóÿ¢ÞøÿzÕöÿVÍôÿRËôÿOËôÿZÎôÿ×öÿ§ßøÿšÓíÿg¸Þÿ;ŸÌÿF©¦ÿY¸{ÿeÂ`ÿfÅbÿfÈeÿgÊfÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËgÿgËfÿgÊfÿhÊgÿjËiÿlËkÿsÎrÿzÐzÿ„Ó‚ÿ“Ø‘ÿ¢Ý ÿ¯á®ÿ¼æ¹ÿÇéÃÿ¿å½ÿ±Ý¯ÿ¡Õ¡ÿŽÊÿ|À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿfµiÿu¼wÿˆÇ‰ÿœÒ›ÿ¬Üªÿ»ã¸ÿÈêÅÿÀç¾ÿ´ã±ÿ§ß¥ÿ˜Ú–ÿ‰Õ‡ÿ}Ñ{ÿvÎtÿnÌlÿkËjÿhÊgÿgÊfÿgËfÿhËgÿhËgÿdÉcÿeÉdÿ”Ù“ÿÐîÏÿõûõÿüþüÿûýûÿûýûÿûýûÿûýûÿûýûÿûýûÿûýûÿûýûÿûýûÿûýûÿûýûÿúýúÿúýúÿùüùÿùüùÿùüùÿøüùÿøüøÿ÷ü÷ÿöüöÿöûõÿöûöÿôûôÿë÷ëÿÚñÚÿÏíÏÿÏíÏÿÏíÏÿÆêÆÿ¹æ¹ÿ­â­ÿ§à¦ÿ¡Þ ÿ–Ú•ÿƒÓ‚ÿqÍpÿkËjÿkËjÿjËiÿiÊhÿiËhÿiËhÿhÊgÿgÊfÿhÊgÿgÊfÿgÊfÿgÊfÿgËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿgÊfÿfÈeÿfÆbÿdÃaÿUµÿD§¢ÿH¥Àÿq¼×ÿ™Ñîÿ•ÖöÿzÓöÿ`ÐôÿZÏôÿVÎôÿ^Îôÿ~Óõÿœ×öÿÍèÿdµÐÿ> ¸ÿI«™ÿ[ºxÿeÄcÿeÆbÿfÉeÿgÊfÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿgËfÿgÊfÿhÊgÿjËiÿlËkÿsÎrÿzÐzÿƒÓ‚ÿ“Ø‘ÿ¢Ý ÿ°â­ÿ½æ¹ÿÇêÅÿÀå½ÿ±Ý¯ÿ¢Õ¡ÿËÿ|À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿgµiÿu¼wÿ‰Ç‰ÿÒ›ÿ¬Û«ÿ¼ãºÿÉêÆÿÁç¾ÿ³ã²ÿ§ß¥ÿ˜Ú–ÿ‰Õ‡ÿ}Ñ{ÿvÎtÿnÌlÿkËjÿhÊgÿgÊfÿgËfÿhËgÿhËgÿeÉdÿeÉdÿ׎ÿÆëÅÿïùïÿïùïÿîùîÿîùîÿîùîÿîùîÿîùîÿîùîÿîùîÿîùîÿíùíÿìøíÿê÷ëÿèöèÿåõäÿàóàÿÝòÝÿÝòÝÿÝòÞÿÚñÛÿÔïÔÿÍíÍÿÌíËÿÍíÌÿÍíÌÿÀèÀÿ´ä³ÿ¬á«ÿ¬á¬ÿ¬á¬ÿ¦ß¥ÿœÜ›ÿ’Ù’ÿŽ×ÿŠÖ‰ÿƒÒ‚ÿuÎtÿfÊeÿcÉbÿdÉcÿdÉcÿeÉdÿeÉdÿeÉdÿfÊeÿfÊeÿfÊeÿgÊfÿgÊfÿgÊfÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿgÊfÿfÈeÿfÇbÿdÅcÿX¹zÿI«”ÿL©®ÿi·Íÿ‡Æëÿ‹ÏõÿÔöÿxØöÿs×öÿoÕöÿqÔõÿÐõÿÎõÿ€Äáÿa´ÁÿE¥¢ÿO¯Šÿ^¾sÿfÇcÿgÇdÿfÉeÿgÊfÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿgËfÿgÊfÿhÊgÿjËiÿlËkÿsÎrÿzÐzÿ„Ó‚ÿ“Ø‘ÿ£Ý¡ÿ°â®ÿ¼æ»ÿÇêÄÿÀå¾ÿ±Ý°ÿ¢Õ¡ÿËÿ|À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿgµiÿv¼wÿ‰Ç‰ÿÒœÿ¬Û¬ÿ¼ãºÿÉêÆÿÁç¾ÿ´ã²ÿ¨ß¦ÿ™Ú—ÿ‰Õ‡ÿ~Ñ{ÿvÎtÿnÌlÿkËjÿhÊgÿgÊfÿgËfÿgËfÿgËfÿeÊdÿeÉdÿ‰Õˆÿºæ¹ÿßóÞÿßóßÿÜòÜÿÜòÜÿÜòÜÿÜòÜÿÜòÜÿÜòÜÿÜòÜÿÜòÜÿÜóÜÿÚñÙÿÕïÔÿÐîÐÿÇëÇÿ¾ç½ÿ¶äµÿ¶äµÿ·å¶ÿ±ã°ÿ£Þ¢ÿ•Ù”ÿØÿ‘Ø‘ÿ‘ØÿŒÖŒÿ†Ô…ÿ‚ÓÿƒÓ‚ÿƒÔ‚ÿ€Ó€ÿ|Ñ|ÿxÏxÿxÏvÿvÏuÿsÎrÿmÌlÿgÊfÿfÊeÿgÊfÿgÊfÿgÊfÿgÊfÿgÊfÿgÊfÿgÊfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgÊfÿfÉeÿgÉdÿfÇdÿ\½tÿP±†ÿP¬ÿa³Âÿs»çÿ€Æôÿ‹Ôöÿ”áùÿ‘áùÿŒßøÿ‡Ú÷ÿ‚Îöÿ|Äóÿp»Úÿ^³±ÿN¬ŠÿVµ{ÿaÁnÿgÈdÿgÈdÿfÉeÿgÊfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgÊfÿhÊgÿjËiÿlËkÿsÎrÿzÐzÿ„Ó‚ÿ”Ø’ÿ£Ý¡ÿ°â®ÿ½æ»ÿÈêÆÿÁå¾ÿ²Ý°ÿ¢Õ¡ÿËÿ|À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿgµiÿv¼wÿ‰ÇŠÿœÒÿ­Û«ÿ¼ãºÿÉêÆÿÁç¿ÿµã³ÿ¨ß§ÿ™Ú—ÿ‰Õ‡ÿ~Ñ{ÿvÎtÿmÌlÿjËiÿhÊgÿfÊeÿfËeÿfËeÿfËeÿdÊcÿeÊdÿƒÔÿªá©ÿÆëÇÿÇëÇÿÅêÅÿÅêÅÿÅêÅÿÅêÅÿÅêÅÿÅêÅÿÅêÅÿÅêÅÿÅëÅÿÂêÂÿ¼ç¼ÿ¶åµÿ«áªÿžÝÿ”Ù“ÿ”Ù“ÿ•Ù”ÿ׌ÿzÑyÿhÊgÿcÉbÿcÉbÿdÉcÿdÉcÿdÉcÿdÊcÿdÊcÿdÊcÿdÊdÿeÊdÿeÊdÿeÊdÿeÊdÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfÊeÿfÉeÿgÊdÿfÉeÿ_ÀnÿW¶xÿT°ÿZ°·ÿ`±âÿt¾óÿ’Ôöÿ­èùÿªèûÿ¥æûÿ›ßøÿ‚Ìöÿj¹ñÿ_³ÓÿZ³¢ÿW³vÿ\»mÿcÄiÿgÉdÿgÉeÿfÉeÿfÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfÊeÿhÊgÿjËiÿlËkÿsÎrÿzÐzÿ„Ó‚ÿ”Ø’ÿ£Ý¡ÿ±â®ÿ¾æ»ÿÉêÆÿÁå¾ÿ²Ý°ÿ£Õ£ÿËÿ|À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY®\ÿgµiÿv¼wÿ‰ÇŠÿœÒœÿ­Û¬ÿ¼ã»ÿÉêÇÿÁç¿ÿµâ³ÿ¨Þ§ÿ˜Ú—ÿ‰Õ‡ÿ~Ñ{ÿtÎtÿmÌlÿiËiÿhÊgÿfÊeÿfËeÿfËeÿfËeÿeÊdÿeÊdÿwÐvÿŽØÿŸÝŸÿŸÞŸÿžÝžÿžÝžÿžÝžÿžÝžÿžÝžÿžÝžÿžÝžÿžÝžÿžÝžÿÜœÿ™Û˜ÿ”Ú“ÿŽØÿ†Ô…ÿ€Òÿ€ÓÿÓ€ÿ{ÑzÿpÍoÿfÉeÿbÉaÿcÉbÿcÉbÿdÊcÿdÊcÿdÊcÿdÊcÿdÊcÿeÊcÿeÊdÿeÊdÿeÊdÿeÊdÿfÊeÿfÊeÿfÊeÿfÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfÊeÿfÉeÿgÊdÿfÉeÿbÃjÿ\»mÿWµ€ÿQ­®ÿM¨Ýÿe¶ðÿ’Ñõÿºëúÿ»ëûÿ·êûÿ¨âùÿ€ÉôÿX°îÿN«ÎÿU²›ÿ[¸lÿ`¿fÿdÆfÿgÉeÿgÉeÿfÉeÿfÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfÊeÿgÊfÿiËhÿlËkÿsÎqÿzÐyÿ„Ó‚ÿ“Ø’ÿ£Ý¡ÿ²â®ÿ¾æºÿÉêÅÿÁå¿ÿ²Ý±ÿ£Õ¢ÿËÿ|À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿgµiÿv¼wÿ‰ÇŠÿœÒÿ­Û¬ÿ¼ã»ÿÉêÇÿÁç¿ÿµâ³ÿ¨Þ¦ÿ˜Ú—ÿˆÕ‡ÿ}Ñ{ÿtÎtÿmÌlÿjËiÿgÊfÿfÊeÿfËeÿgËfÿgËfÿfÊeÿfÊeÿkÌjÿqÎqÿwÐvÿwÐvÿvÏuÿvÏuÿvÏuÿvÏuÿvÏuÿvÏuÿvÏuÿvÏuÿvÏuÿvÏuÿtÏsÿtÏsÿrÍqÿpÌoÿnÌmÿnÍmÿnÍmÿmÌlÿjËiÿfÊeÿfÊeÿfÊeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgÊfÿgÉeÿgÉeÿfÉeÿdÄdÿaÀcÿZ¹tÿI«¦ÿ9 ÖÿW®ìÿ‘ÎóÿÇìúÿÉíûÿÇíûÿµäøÿ~ÅòÿG§êÿ>¤ÉÿO±”ÿ_½eÿcÃbÿdÇeÿfÉeÿgÉeÿgÉfÿgÊfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfËeÿfÊeÿgÊfÿhËgÿkËjÿrÎqÿzÐxÿ„Ó‚ÿ“Ø’ÿ£Ý¡ÿ²á®ÿ¾æ»ÿÉêÆÿÁå¾ÿ²Ý±ÿ£Õ£ÿËÿ|À}ÿk·mÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿgµiÿv¼xÿ‰ÇŠÿÒÿ®Û¬ÿ½ã»ÿÊêÇÿÂçÀÿµã²ÿ¨ß¦ÿ˜Ú—ÿˆÕ‡ÿ}Ñ{ÿuÎtÿmÌlÿjËiÿgÊfÿfÊeÿfËeÿgËfÿgËfÿfÊeÿfÊeÿeÊdÿeÊdÿeÊcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÊcÿdÊcÿeÊdÿeÉdÿeÉdÿeÊdÿeÊdÿeÊdÿfÊeÿfÊeÿfÊeÿfËeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgÊfÿgÊfÿfÊeÿeÉdÿeÇaÿdÄ_ÿ]½mÿG®›ÿ5ŸÉÿR«àÿŒÊíÿÂæùÿÄèúÿÃèùÿ²àõÿzÂéÿB¤Úÿ:£ºÿO²‹ÿbÁaÿdÆ_ÿeÈdÿfÊeÿgÊeÿgÊfÿgÊfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfËeÿfÊeÿgÊfÿiËhÿkËjÿqÎqÿyÐxÿƒÓ‚ÿ’Ø’ÿ£Ý¡ÿ±á¯ÿ¾æ¼ÿÉêÆÿÁåÀÿ²Ý±ÿ¤Õ¤ÿËÿ|À~ÿk·nÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿgµjÿv½xÿ‰ÇŠÿÒÿ­Û¬ÿ½ã¼ÿÊêÈÿÂèÀÿµã³ÿ¨ß§ÿ™Ú—ÿ‰Õ‡ÿ}Ñ|ÿuÎtÿmÌlÿjËiÿgÊfÿfÊeÿfËeÿgËfÿgËfÿfÊeÿfÊeÿfÊeÿfÊeÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿeÊdÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfËeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfÊeÿeÉdÿeÇcÿeÆaÿ_ÁlÿL²ÿ<¤³ÿR­ÌÿÅâÿªÚöÿ­Üøÿ¬ÜøÿžÕïÿt¾ÙÿI©ÁÿD©¤ÿU·ÿdÄbÿeÇaÿeÈdÿfÊeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfËeÿfÊeÿgÊfÿiËhÿkËjÿrÎqÿyÐxÿƒÓ‚ÿ“Ø’ÿ£Ý¢ÿ±â¯ÿ½æ»ÿÈêÆÿÁåÀÿ³Þ²ÿ£Ö£ÿËÿ|À~ÿk·nÿ]°`ÿQ©TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿgµjÿv½xÿ‰È‹ÿÒžÿ­Û­ÿ½ã¼ÿËëÉÿÂèÀÿ¶ä´ÿ©ß§ÿ™Ú—ÿ‰Õˆÿ}Ñ|ÿuÎtÿmÌlÿjËiÿgÊfÿfÊeÿfËeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfÊeÿeÉdÿfÊdÿfÉcÿaÄkÿS·ƒÿFªœÿT¯·ÿu¿×ÿ’Ïôÿ”Ðöÿ“Ïõÿ‹Ëëÿm»ÉÿP­¦ÿM¯ŽÿY¼wÿeÈcÿfÉcÿeÉdÿfÊeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfËeÿfÊeÿgÊfÿiËhÿkËjÿrÎqÿzÐxÿ„Ó‚ÿ”Ø’ÿ¤Þ£ÿ±â¯ÿ¿ç¼ÿÉëÇÿÂæÀÿ³Ý²ÿ¤Ö£ÿËÿ{Á~ÿk·nÿ]¯`ÿP¨TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿgµjÿv½xÿŠÈ‹ÿžÒÿ®Û­ÿ¾ã¼ÿÌëÉÿÃèÁÿ¶ä³ÿ©ß§ÿ™Ú—ÿ‰Õ‡ÿ}Ñ|ÿtÎtÿmÌlÿjËiÿgÊfÿfÊeÿfËeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfÊeÿeÉdÿfÉdÿfÉcÿcÆhÿX»wÿO°‡ÿW²¥ÿhºÍÿyÂòÿzÂôÿzÂóÿu¿æÿe¹¼ÿU²’ÿTµ{ÿ]ÀoÿeÉdÿfÊcÿeÉdÿfÊeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfËeÿfÊeÿgÊfÿiËhÿkËjÿrÎqÿ{Ðxÿ„Ó‚ÿ”Ø’ÿ¤Þ¢ÿ²ã°ÿ¿ç½ÿÊëÇÿÂæÀÿ³Ý²ÿ¤Ö£ÿË‘ÿ|Á~ÿk¸nÿ]¯aÿP¨TÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿgµjÿv½xÿŠÈ‹ÿÒÿ¯Û­ÿ¾ã¼ÿËëÉÿÃèÁÿ¶ä´ÿ©ß¨ÿ™Ú˜ÿ‰Õˆÿ~Ñ|ÿtÎtÿmÌlÿjËiÿgÊfÿfÊeÿfËeÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfÊeÿeÉdÿeÉdÿfÉcÿdÇfÿ^¿lÿX¸sÿX´’ÿ\´Ãÿ_²ðÿ_²óÿ_²òÿ^´âÿ\¶°ÿZ¸ÿ\¼kÿaÂgÿeÉcÿeÉcÿeÉdÿfÊeÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËeÿfÊeÿgÊfÿiËhÿkËjÿrÎqÿ{Ðxÿ„Ó‚ÿ”Ø’ÿ¤Þ¢ÿ²ã°ÿ¿ç½ÿÊëÈÿÂæÁÿ³Ý²ÿ¤Ö¤ÿË‘ÿ}Á~ÿl¸nÿ]¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿgµjÿw½xÿŠÈ‹ÿÒžÿ¯Û­ÿ¾ã½ÿËëÉÿÃèÁÿµäµÿ©ß¨ÿ™Ú˜ÿ‰Õˆÿ~Ñ|ÿtÎtÿmÌlÿiËiÿgÊfÿeÊeÿeËeÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeÊeÿeÊeÿeÊeÿfÊeÿeÈeÿcÃcÿ`¿cÿZ¸ƒÿR¯¹ÿI§ëÿI§íÿI§ìÿL©ÛÿU³¥ÿ^¼oÿcÂ^ÿeÆaÿeÉdÿeÊeÿeÊeÿeÊeÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËeÿeÊeÿgÊfÿiËhÿkËjÿrÎqÿ{Ðyÿ„Óƒÿ”Ø“ÿ¤Þ¤ÿ²ã±ÿ¿ç¾ÿÊëÈÿÃæÁÿ³Þ³ÿ¤Ö¤ÿË‘ÿ}Á}ÿl¸nÿ]¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿhµiÿw½xÿŠÈ‹ÿžÓžÿ®Û¯ÿ¾ä½ÿÌêÊÿÃèÂÿ¶ãµÿ©ß¨ÿ™Ú˜ÿ‰Õˆÿ}Ñ|ÿuÎsÿlËlÿiËiÿgÊfÿeÊeÿeËeÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeÊeÿeÈeÿdÅcÿbÃbÿ\»~ÿQ±¬ÿG¨×ÿF§ÚÿG¨ÙÿJ«ÊÿT´ÿ^¿nÿdÅ_ÿeÈaÿeÉdÿeÊeÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËfÿeËeÿeÊeÿfÊfÿiËhÿkËjÿrÎqÿ{Ðzÿ„Óƒÿ”Ø“ÿ¤Þ£ÿ²ã²ÿÀç½ÿËëÈÿÃæÂÿ´Þ³ÿ¤Ö¤ÿ‘Ë‘ÿ}Á~ÿk¸nÿ]¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿhµjÿw½xÿŠÈ‹ÿžÔžÿ¯Û®ÿ¿ä¾ÿÌëÊÿÄèÂÿ·ã´ÿªß¨ÿ™Ú˜ÿ‰Õˆÿ|Ñ}ÿsÎsÿlËlÿhÊiÿfÊfÿeÊeÿeÊeÿeÊeÿeÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿeÊeÿdÉdÿdÈbÿdÆbÿ\¿yÿQ³ ÿF©ÂÿF©ÅÿF©ÄÿJ¬¸ÿU¸”ÿ_ÃnÿdÈaÿeÈcÿeÉdÿeÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿeËeÿeÊeÿfÊfÿhËhÿkËjÿrÎqÿzÐyÿ„Óƒÿ”Ø“ÿ¤Þ£ÿ²â±ÿ¿ç¾ÿËëÉÿÃæÂÿ´Þ³ÿ¥Ö¥ÿ‘Ì’ÿ}Áÿk¸nÿ]¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­\ÿhµjÿw½yÿ‹ÈŒÿžÓŸÿ¯Ü®ÿ¿ä¾ÿÍëËÿÄèÂÿ¸äµÿªß¨ÿšÚ˜ÿ‰Õˆÿ}Ñ|ÿtÎsÿlËlÿiÊiÿfÊfÿdÉdÿdÉdÿdÉdÿeÊdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿeÊdÿdÉdÿeÉcÿeÉcÿ^ÂsÿT¸ÿK¯©ÿJ¯«ÿK¯ªÿN²¢ÿX¼†ÿ`ÆlÿeÉcÿeÉdÿdÉdÿeÊdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿeËdÿeÊdÿfÊeÿhËhÿkËjÿsÎqÿ{Ðzÿ„Ó„ÿ•Ù“ÿ¥Þ£ÿ³â±ÿÀç¿ÿËëÉÿÄæÂÿµÞ´ÿ¦Ö¦ÿ‘Ì“ÿ|Áÿk¸nÿ]¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­]ÿhµjÿw½yÿ‹ÈŒÿŸÓ ÿ¯Ü¯ÿÀä¾ÿÎëËÿÅéÃÿ¸ä¶ÿ«à©ÿšÚ™ÿŠÕ‰ÿ~Ñ}ÿtÎtÿlËlÿhÊhÿfÊfÿdÉdÿdÉdÿdÉdÿeÊdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿeÊdÿdÉdÿdÉdÿeÉcÿaÆlÿ\Á{ÿW¼ˆÿW¼‰ÿW¼‰ÿY½„ÿ]ÃuÿcÈhÿdÉcÿdÉdÿdÉdÿeÊdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿfËdÿeËdÿeÊdÿfÊeÿiËhÿkËkÿsÎqÿ|Ñ{ÿ…Ô„ÿ•Ù”ÿ¦Þ¤ÿ´ã²ÿÀç¾ÿËëÉÿÄæÃÿµÞ´ÿ¥Ö¥ÿ‘Ì“ÿ|Áÿk¸oÿ]¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­]ÿhµkÿw½yÿ‹ÈŒÿ Ó ÿ±Ü°ÿÀä¾ÿÍìËÿÅéÃÿ¹ä·ÿ¬àªÿ›Ûšÿ‹ÕŠÿ~Ñ~ÿtÎuÿmÌmÿiÊiÿfÉfÿdÉdÿdÉdÿdÉeÿeÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿeÊeÿdÉeÿdÉdÿeÉcÿeÉdÿcÈfÿcÇiÿcÇiÿcÈiÿcÇhÿcÈfÿdÊcÿdÊdÿdÉdÿdÉeÿeÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿeÊdÿeÊdÿfÊeÿhËgÿlËjÿsÎrÿ|Ñ{ÿ…Ô„ÿ–Ù“ÿ¦ß¤ÿµã³ÿÂèÀÿÌìÊÿÃçÃÿµß´ÿ¦Ö¥ÿ‘Ì’ÿ}Áÿl¸oÿ]¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­]ÿhµkÿw½yÿ‹ÈŒÿ Ó ÿ±Ü¯ÿÀä¿ÿÍìÌÿÆéÄÿºå¹ÿ®á¬ÿÛœÿŒÖŒÿ€ÒÿwÏvÿoÌoÿjËjÿgÊgÿdÉdÿdÉdÿdÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÊcÿeÊcÿeÊcÿfÊbÿfÊbÿfÊbÿeÊcÿeÊcÿeÊcÿeÊdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿeÉdÿfÊeÿiËhÿnÌmÿuÎtÿ}Ñ|ÿ‡Õ†ÿ—Ú—ÿ©ß§ÿ·äµÿÂèÀÿÌìÊÿÅçÂÿµß´ÿ§Ö¥ÿ’Ì’ÿ~Á~ÿl¸oÿ^¯aÿQ¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­]ÿhµjÿw½yÿ‹ÈŒÿ ÓŸÿ±Ü¯ÿÀä¿ÿÎëÌÿÇêÆÿ¼å»ÿ°â¯ÿ ÜŸÿÖŽÿ‚Òÿ{ÐzÿrÍqÿlËkÿgÊfÿcÉcÿcÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿeÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿdÉcÿfÊeÿkËjÿpÍoÿwÏvÿ€Òÿ‰ÖˆÿšÛšÿ¬à«ÿºä¸ÿÅéÃÿÍìËÿÅçÄÿ¶ßµÿ§Ö¥ÿ“Ì’ÿ~Á€ÿl¸oÿ^¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨QÿY­]ÿhµkÿx½yÿ‹ÈÿŸÓ ÿ°Ü°ÿÁä¿ÿÎëÌÿÉêÇÿ¾æ½ÿ³â²ÿ£Ý¢ÿ“בÿ‡Ó†ÿ~Ñ}ÿuÎtÿoÌmÿjÊiÿfÉeÿeÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿfÉeÿeÉdÿgÊfÿmÌlÿsÍrÿzÐyÿ„Óƒÿ׌ÿžÜÿ¯á­ÿ¼åºÿÆéÃÿÏìÌÿÅçÄÿ¶ßµÿ¦Ö¦ÿ“Ì“ÿ~Á€ÿm¸oÿ^¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨RÿY­]ÿhµkÿx½zÿŒÈÿ Ó¡ÿ±Ü±ÿÁäÀÿÐìÍÿÊêÈÿÁç¿ÿ·äµÿªß¨ÿÛ›ÿ×ÿƒÓ‚ÿwÏvÿsÎrÿrÍqÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿqÍpÿrÍqÿuÎtÿÒ~ÿ‹ÖŠÿ˜Ú–ÿ¦Þ¤ÿ³â±ÿ¿æ½ÿÈéÆÿÏìÌÿÆçÄÿ¶ßµÿ¦Ö§ÿ“Ì”ÿ~Á€ÿm¸oÿ^¯aÿP¨UÿM¨QÿP¬TÿM§Qí/f2 $E ////// )%P'…D“HÞP¬TüNªRÿM¨RÿY­^ÿhµkÿx½zÿŒÈŽÿ¡Ó¡ÿ²Ü±ÿÁäÀÿÐìÍÿËëÉÿÃèÁÿ»å¹ÿ±â¯ÿ¦Þ¤ÿ™Ú˜ÿˆÕ‡ÿyÐxÿxÏwÿzÐyÿ{Ð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ÿ{Ð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ÿ{Ð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ÿ{Ð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ÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{Ðzÿ{ÐzÿyÐxÿwÎvÿƒÓ‚ÿ“Ø’ÿ£Ý¡ÿ­á«ÿ·ä¶ÿÁç¿ÿÉêÇÿÐìÎÿÆçÅÿ¶ß¶ÿ§Ö§ÿ“Í”ÿ~Á€ÿm¸oÿ^¯aÿQ©UÿM¨QÿP¬TÿM§Qí/f2 $E 000/// *%P'…D“HßP¬TüNªRÿN¨RÿX®]ÿf´iÿt¼wÿˆÆ‰ÿÒÿ­Ú­ÿ½â¼ÿËéÈÿÉéÇÿÄçÁÿ¾æ¼ÿ¹ä¶ÿ±â¯ÿ¦Þ¥ÿ–Ù–ÿ‰Ôˆÿ‡Ô†ÿˆÕˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‰Õˆÿ‡Õ†ÿˆÔ‡ÿ’Ø’ÿ¡Ý ÿ¯á­ÿ¶ãµÿ¼åºÿÂç¿ÿÇéÅÿËêÉÿÁäÀÿ²Ý²ÿ£Õ£ÿÉÿ{¿}ÿj¶mÿ\¯`ÿP©UÿN¨RÿP¬TÿM§Qí/f2 $E 000/// )%P'…D“HßP¬TüOªSÿM¨RÿV¬[ÿ`±cÿm¸pÿÁÿ’Ì“ÿ¢Ô¢ÿ²Ü±ÿ¿ä¾ÿÁåÀÿÃæÁÿÃçÂÿÁç¿ÿ¿å½ÿºä¸ÿ²â±ÿªß©ÿ¤Þ£ÿŸÜžÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›Ûšÿ›ÛšÿÛœÿ£Ý¡ÿ¨ß¦ÿ¯á¯ÿ¸ä¶ÿ¿æ½ÿÀç¾ÿÁçÀÿÂæÀÿÂæ¿ÿÀä¾ÿ¶Þµÿ§×§ÿ˜Ï™ÿ†Å‡ÿs»uÿd³gÿY®]ÿP©TÿN¨RÿP¬TÿM§Qí/f3 $E 000/// )%O'„D“HßP¬TüNªRþM¨RþS«Xþ[¯_ÿe´hÿv½yÿ‡Æˆÿ–Ηÿ¦Ö¤ÿ´Ý²ÿ»áºÿÁäÁÿÇçÆÿÉèÈÿËéÉÿÍêËÿÌëËÿËêÊÿÂç¿ÿµã³ÿ¬à«ÿ¬à«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬á«ÿ¬à«ÿ¬à«ÿ±â°ÿ½æ»ÿÉêÇÿÌëÊÿÎìÌÿÎìÌÿÊêÈÿÆèÅÿÁåÀÿ»âºÿ¶Þ´ÿ©Ø©ÿ›Ð›ÿŒÉÿ|À~ÿj·nÿ^°bÿV«ZÿO¨SþN¨RþP¬TþM§Rí/f2 $E    111/// &%O'‚D’GÝO«SûM©QýM§QýRªVþY­]ÿ`±eÿn¹pÿ|À~ÿ‹È‹ÿšÐ™ÿ©×§ÿ²Ý²ÿ»á»ÿÃäÂÿÇçÅÿÊéÊÿÎëÍÿÑìÐÿÓíÑÿÌëÊÿÂèÀÿ¹å¹ÿ¹å¸ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¹ÿºå¸ÿ¹å¹ÿ½æ½ÿÇéÇÿÑíÏÿÓîÑÿÓîÑÿÒíÐÿËéÈÿÃæÂÿ»â»ÿ³Þ³ÿªØ«ÿžÑžÿÊÿÂÿs»uÿe´iÿ[®_ÿTªYÿO¨SþM§QýO¬SýL¦Qì/g1Ÿ$D  222000 %%P'D‘GÙOªSúN©RüM§QýRªVþW¬[ÿ]¯`ÿfµiÿqºrÿ~Á€ÿŽÊÿÒžÿ©×©ÿ³Ý³ÿ½á¼ÿÁåÀÿÆçÄÿÊéÈÿÏëÍÿÓíÑÿÐìÎÿËëÉÿÈêÆÿÈêÅÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÈêÆÿÊêÇÿÎìÌÿÒíÐÿÓîÑÿÓîÑÿÒíÐÿÈèÇÿ½ã½ÿ´Ý³ÿªÙªÿ¡Ô ÿ“Ì“ÿƒÄ„ÿu¼uÿk·lÿa±dÿY­\ÿTªWÿO¨SþM§QüO¬SüM¥Pì/f1$C  333ÉÉÉ000   #&Q(|D‘GÕOªS÷N©RûM§QýQ©UþU«YÿZ­]ÿ`±bÿgµiÿs»tÿ‚Äÿ’Ì“ÿŸÓŸÿ«Ù«ÿµÞ´ÿ»áºÿÀä¿ÿÆæÃÿËêÉÿÐìÏÿÑíÏÿÑíÏÿÑíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÒíÏÿÑìÏÿÑíÏÿÑíÏÿÑíÏÿÑíÏÿÒíÐÿÐìÎÿÃæÂÿ¶Þ¶ÿªØ«ÿ¡Ô ÿ•Ζÿ‡Æˆÿx½yÿi¶kÿc²dÿ\¯_ÿW¬ZÿSªVÿO¨RþM¨QûOªSúL¤Qé/f1š$A """*** ### 444»»»000       !'Q(uC‘FÊN©RïN¨RõM§QýP©TÿSªWÿW¬Zÿ[¯_ÿa²cÿk·mÿw½yÿ‚ÄÿÊÿÒÿ¨Ø¨ÿ®Û®ÿµÞ´ÿºá¹ÿ¿ã½ÿÃåÁÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÃÿÄæÂÿÃæÂÿÃæÂÿÄæÃÿÂåÁÿµß¶ÿ©×ªÿœÑÿ‘Ì’ÿ†Å‡ÿz¿|ÿn¸pÿc²fÿ]°`ÿY­\ÿT«XÿQ©UÿN¨RýM¨Q÷NªRòK£Pâ.d0“$=  *** 666 ***444¹¹¹111    'R(nBE½N¨RãM¨QñM§QûO¨SþQ©UþT«WþX­[þ\¯_þb²eþj·lÿs»uÿ€Â‚ÿŽÉŽÿ™Ð›ÿ¢Ô¢ÿ©Ø©ÿ®Û®ÿ±Ý±ÿ´Ý´ÿ´ß´ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ³Þ³ÿ´ß´ÿ³Þ³ÿ§×¨ÿšÐ›ÿŽÊÿ‚Äÿu½yÿl¸oÿd³hþ^¯`þZ­\þU«XþRªUþP©TþN¨RüM§QôNªRéJ¢OÖ.d0Š#8    222 BBB 222888¹¹¹222    (R)cBŽE¬L¦PÓM§QçM§QøN¨RûP¨SûR©UûU«XüX¬[ý\¯_þa²dÿfµjÿr»uÿ‚ÿŠÈÿ“Ì”ÿšÐšÿŸÓŸÿ¡Ó¢ÿ£Õ¤ÿ¢Õ¤ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Õ£ÿ¢Ö£ÿ£Ö¤ÿ¢Ô£ÿ—Θÿ‹Èÿ€Â‚ÿu¼xÿj¶mÿb³fÿ]°`þY­\ýV«XüSªVûP©SûO¨RûN§QùL¦PìM§QÛI¡NÃ-c/}#3   --- >>>:::FFF     *T+VBF–L¥P½L¦PÖL§PîM¦QòN§RôP¨SõR©UùT«WüX­[þ\¯_ÿ`²cÿh¶lÿrºtÿz¿|ÿÂÿ…Ňÿ‰Ç‹ÿ‹ÈŽÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿÉÿŽÊÿŒÉÿƒÄ…ÿy¿|ÿqºtÿj¶mÿc³fÿ^°`ÿZ®]þU«XýSªVúP¨TöN§RóN§QóM§QðL¥PÞM§QÆI Mª-c0n#.    %%%;;;+T-JBŒEK¢O¦K¤OÅL¦PãL¦PéM¦QëN¦QðP¨SõR©UûT«WþW­Zÿ[®^ÿ_±bÿd³gÿiµlÿm¸pÿqºtÿt¼wÿv½yÿy½{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿy¾{ÿx½zÿp¹sÿhµkÿc²fÿ_°bÿ[¯_ÿX­\ÿU«XþRªUýP¨T÷N§RñM¦QìL¥PêM¦PæL¤PÏK¤O°HœL,a/]#(   """KKK$$$$B&52h5Z†A3p7fE!B  GGGŠŠŠMMM)))### '5-(S*S:|=‰K¢O¼L§PÏL¦PÜL¦PéM¦QòN¨RûP©SþQ©TþRªUþRªWþT«WÿV¬XÿV¬YÿW¬[ÿX®\ÿY­\ÿ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­]ÿ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­]ÿ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­]ÿ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­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿZ­]ÿY®]ÿW­ZÿU«XþSªWþSªVþRªVþQ©UÿP©SÿO¨RýN§QõM§PìL¦PáM§QÓL¥PÄ>‡Aš*]-e56 # 111¨¨¨¤¤¤~~~UUU...%%%    )*0b1hF™J£J¡N¼K¤OÐL¦QãL§PîM§QøM§QüM§QýM§QþN¨RþN¨RÿN¨RÿN¨QÿN¨RÿM¨RÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨QÿN¨RÿM¨QÿN¨RÿN¨RþM§QýM§QýM§QýM§QýM§QüM§QùM§QñM¦QæL¥P×K¢OÃHŸM¬4r7|6@JJJ§§§zzzXXX???((( >!B,_/i8y;‰C’FªK£OÅL¤PÖL¥PçM¦QòM§QøM§QþN¨RþN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RÿN¨RþM§QþM§QüM§QüM¦QøM¦QóL¥PìK¥OÛK¤OËF™J´;€>”/f1sD!O* ‘‘‘———~~~YYY000 #,$N&T:~=€J N¦K£P½K£OÔL¤PæM¦QôM§QúN¨RüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüO©SüN¨RûM§QûM§QúM¦QøL¥PòL¤PèK£OÛK¢OÅJ¡M®@‹CŽ)Z,b+8  ! ~~~QQQ     ,-.c0YIM~K£O•J¡N«K£O½L¥PÍM§QÛN¨RÝO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜO©SÜN¨RÜM§QÚM§QØM¦QÔL¥PËK¤OÀJ¢N³J¡NIŸM†>‡Af&S):  EEE”””¶¶¶›››AAA222"""  80@˜DD>›BP<—A]>Cg>žCp@ŸDyB¢FzB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyB¢FyA¡ExA¡EwA¡Et?ŸDn?ŸCh=œBa>œBT=›AH6Š:7*o- S"===–––1211318H8 D™H A›F?˜DCŸGCŸGCŸGF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JF¤JE£IE£IE£ID¡HD¡HBžFBžFBŸF ?–B =’A=ŒAÿþÿþÿüÿøÿðÿàÿ€ÿ€ÿüüøðààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààààðððð?øüÿþÿÿ€ÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(€ ™™™™™™¦¦¦¨¨¨•••UUUUUUMMMJJJIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII™™™™™™ ‹‹‹ ~~~ nnn UUUPPPKKKIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III III III III†††„„„ cccWWWJJJ===111)))%%%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$???jjj ^^^)))&&& "#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%&%#"!! )))!# %'**+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++)&#"! " &+,-/0012222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221/-*(&((%" &+0245778::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::9865321/,'  ")07"E)T)a)h)j*m*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*o*n*m*m*i*f*d*` - %+5=KG‹KtU¥Y¬T¦XÜQ¦UîO¦S÷O¨SüO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©Sÿ*P #  3#G$YJŒN¥U¡YÃT§XßO¦SôO¨SúO¨SýO¨SþO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©Sÿ*P !: NEH[¨_ÑW§[åS¨WôQ©TüT¬VÿV®XÿX¯ZÿZ°[ÿ\²\ÿ[²\ÿ[²\ÿ[²\ÿ[²\ÿX¯ZÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿW¯YÿQªTÿO©SÿO©SÿO©Sÿ*P /U1k^©bÂZ¨^ãS¦WðS©VøV­Xý[±[ÿ`´_ÿd·cÿhºfÿk½hÿk½hÿk½hÿk½hÿk½hÿgºeÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿf¹dÿT­WÿO©SÿO©SÿO©Sÿ*P 2W4w`«cÛR¤VòQ§UøU¬Wü[°[þaµ`ÿg¹eÿm½iÿqÀlÿtÃoÿvÄpÿwÅqÿwÅqÿwÅqÿyÆqÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿzÇrÿY°ZÿO©SÿO©SÿO©Sÿ*P ,U.€W¨ZëQ¤UôUªWú[°\ýbµaþj»fÿqÀlÿwÅqÿ|Èuÿ~Êwÿ€Ëwÿ€Ëxÿ€Ëxÿ€Ëxÿ…Ï|ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ‡Ð}ÿ„ÎzÿzÇrÿc·bÿU­WÿO©SÿO©Sÿ*P )T+†R¨U÷R¨UùX®Zü`´`ýhºfþqÀmÿyÆrÿËwÿƒÍzÿ…Ï{ÿ…Ï{ÿ…Ï{ÿ…Ï|ÿ…Ï|ÿŠÒ€ÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿ‹Ó€ÿŠÓ€ÿ‹Ó€ÿ‹Ó€ÿŒÓÿˆÐ~ÿzÇsÿf¹dÿW¯YÿO©SÿO©Sÿ*P 'T)ŠP©SþT¬Vý\±\ýe¸dþn¿kþwÅrÿÊwÿ„Îzÿ†Ð|ÿ‡Ñ|ÿ†Ñ|ÿ†Ñ|ÿ†Ñ|ÿ†Ñ|ÿˆÒ~ÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰Óÿ‰ÓÿˆÒ~ÿˆÒ~ÿ‰ÒÿŠÒ€ÿŒÓÿˆÑ~ÿ{Ètÿf¹eÿW¯YÿO©SÿO©Sÿ*P 'T)ŠPªTþU­Xþ_³_þj»gþtÂoþ}ÉvÿƒÍzÿ†Ð|ÿ†Ñ|ÿ…Ñ{ÿ„ÑzÿƒÑyÿƒÑyÿƒÑyÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ€Ðwÿ‚Ðxÿ„Ñzÿ†Ò|ÿ‰ÒÿŒÔÿ‰Ñÿ{Èuÿg¹eÿX¯YÿO©SÿO©Sÿ*P 'T)ŠPªTþU­Xþ`µ`þl¼iþwÄqþ€Ëxÿ…Î{ÿ†Ð|ÿ„Ð{ÿ‚Ðyÿ‚ÐxÿÐwÿ€Ðwÿ€Ðwÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðwÿ‚Ðxÿ„ÑzÿˆÒ~ÿŒÔÿŠÑ€ÿ{Èuÿg¹eÿX¯YÿO©SÿO©Sÿ*P 'T)ŠPªTÿV®Xÿaµ`ÿm½jÿyÆsÿƒÍzÿ†Ï|ÿ†Ð|ÿ„ÐzÿÐxÿ€ÐwÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ€ÐvÿÐwÿ„ÑzÿˆÒ~ÿÔ‚ÿŠÑ€ÿ|Èuÿg¹fÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠPªTÿV­Xÿa´`ÿn¾jÿ{Çtÿ…Î|ÿ‡Ð}ÿ†Ñ|ÿ„ÐzÿÐxÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐwÿ„Ñzÿ‰Ò~ÿÔ‚ÿ‹Òÿ}Èvÿh¹fÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠPªTÿV­Xÿaµaÿo¾kÿ|Çuÿ‡Ï~ÿ‡Ñ~ÿ†Ñ|ÿ„ÐzÿÐxÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐwÿ„Ñzÿ‰ÓÿŽÕƒÿŒÒ‚ÿ}ÉwÿhºfÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠO©SÿPªTÿ^²^ÿo¾lÿËyÿÔ„ÿŒÓÿ‡Ò}ÿƒÐyÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿŽÕ†ÿ£Ýÿ¶ä±ÿ¿ç»ÿ×ðÔÿßóÜÿßóÜÿßóÜÿÇêÃÿ¹å´ÿ«à¥ÿ”׌ÿ„Ñ{ÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ†Ó~ÿžÜ—ÿÎíËÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿÏíËÿ¯á©ÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ–Ùÿ¾çºÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿßóÜÿ×ðÔÿ¿ç»ÿÕ‡ÿÐvÿÐvÿÐvÿÐvÿÐvÿ€Ðwÿ„Ñzÿ‰ÓÿŽÕƒÿŒÒ‚ÿ}ÉwÿhºgÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ]²^ÿp¿lÿƒÌ{ÿ’Ö‡ÿÔƒÿˆÒ}ÿ‚ÐyÿÐvÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ‚ÑyÿÖˆÿ°â«ÿÅéÁÿ×ðÔÿäõâÿê÷èÿùýùÿÿÿÿÿÿÿÿÿÿÿÿÿïùîÿæõäÿÜòÚÿÍìÉÿ·ä²ÿ›Ú”ÿƒÑ{ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ‰Ô€ÿ©à£ÿé÷èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ¿çºÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿžÜ—ÿÔïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûóÿÔïÑÿ”׌ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ€Ðwÿ„ÑzÿŠÓÿÕ„ÿÒƒÿ~ÉwÿiºgÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ]²^ÿp¿mÿ„Ì|ÿ“ÖˆÿŽÔƒÿˆÒ~ÿ‚ÐyÿÐvÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ†Ó}ÿ˜Ù‘ÿ¸å´ÿéöçÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîøíÿÉëÅÿ ÜšÿˆÔ€ÿ€Ñwÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿˆÔ€ÿ©à£ÿé÷èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ¾çºÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿžÜ—ÿÔïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûóÿÔïÑÿ“׌ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ€Ðwÿ„ÑzÿŠÓ€ÿÕ…ÿŽÒ„ÿÉxÿiºgÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ]²^ÿp¿mÿ„Ì}ÿ”׉ÿŽÔ„ÿˆÒ~ÿ‚ÐyÿÐvÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿžÜ—ÿÔïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ©à£ÿˆÔ€ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿˆÔ€ÿ©à£ÿé÷èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ¾çºÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿžÜ—ÿÔïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûóÿÔïÑÿ“׌ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ€Ðwÿ„ÑzÿŠÓ€ÿÕ†ÿŽÓ…ÿÉyÿiºgÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ]²^ÿq¿mÿ„Ì}ÿ”׉ÿŽÔ„ÿˆÒ~ÿ‚ÑyÿÐvÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ†Ó}ÿžÜ—ÿÖðÓÿôûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýùÿé÷èÿ±â«ÿŽÖ†ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ‹Ôƒÿ³ã®ÿìøêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãõâÿ¶ä±ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿžÜ—ÿÔïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûóÿÔïÑÿ“׌ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ€Ðwÿ„ÑzÿŠÓ€ÿÕ†ÿŽÓ…ÿÉyÿjºgÿX¯ZÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²^ÿq¿nÿ…Ì~ÿ”׊ÿÕ…ÿˆÓÿ‚Ñyÿ~Ðvÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ„Ò|ÿÛ—ÿÔïÑÿôûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞóÜÿ¯âªÿˆÓ€ÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}ÐuÿÖˆÿÅêÁÿðùïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚòØÿ¨ß¢ÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}ÐuÿÜ—ÿÓïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûóÿÔïÑÿ“׌ÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ~ÐuÿÐwÿ„Ò{ÿ‹Óÿ‘Õ‡ÿÓ†ÿ€ÉzÿjºhÿY¯ZÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²_ÿqÀnÿ…Í~ÿ•׋ÿÕ†ÿ‰Óÿ‚Ñyÿ~Ðuÿ}Ðuÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ”ØÿÀè¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÕïÒÿŸÜ™ÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ”ØÿÛñØÿöûõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑîÎÿšÚ”ÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}ÐtÿŸÜšÿÕðÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóúòÿÐíÌÿ‘׊ÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}ÐuÿÐwÿ„Ò{ÿ‹Ôÿ‘Ö‡ÿÓ‡ÿ€Êzÿj»hÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²_ÿrÀoÿ†Íÿ–ØŒÿÕ†ÿ‰Ó€ÿ‚Ñyÿ~Ðuÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ¯âªÿéöçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðùïÿÈëÅÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ™Ú’ÿðúïÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌìÈÿ’׊ÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ§ß¡ÿÚòØÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðùïÿÄêÀÿŽÖ‡ÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}ÐtÿÐvÿ„Ò{ÿ‹Ô‚ÿ’ÖˆÿÔ‡ÿÊ{ÿj»iÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²_ÿrÀoÿ‡Í€ÿ–ØŒÿÕ†ÿ‰Ó€ÿ‚Ñyÿ~Ðuÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ”ÙÿÊìÆÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿàôßÿœÜ–ÿ„Ó|ÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿÑyÿ£ÞžÿûýûÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁè½ÿÑyÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ¸å³ÿåõäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê÷éÿ®â©ÿˆÔÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ}ÐtÿÐvÿ„Ò{ÿŒÔ‚ÿ’Öˆÿ‘ÔˆÿÊ{ÿj»iÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²_ÿrÀoÿ‡Í€ÿ—Øÿ‘Õ‡ÿ‰Ó€ÿ‚Ñyÿ}Ðuÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ­á¨ÿÞóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîùíÿ½ç¹ÿŒÕ…ÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿŠÕƒÿ²ã­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ç¹ÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿÃé¿ÿíøëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷çÿ§à¢ÿ†Ôÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿÐvÿ„Ò{ÿŒÔ‚ÿ“Ö‰ÿ’Ô‰ÿ‚Ê|ÿk»iÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²_ÿsÀpÿ‡Í€ÿ˜ØŽÿ‘Öˆÿ‰Ó€ÿ‚Ñyÿ}Ïuÿ|Ïtÿ|Ïtÿ|Ïtÿ|ÏtÿÃé¿ÿíøëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöûõÿÛñØÿ“Øÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ—ÙÿÅêÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöüöÿ¸å³ÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|ÏtÿÍíÊÿôúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæöäÿœÛ–ÿ„Ò|ÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ~Ðvÿ„Ñ{ÿŒÔƒÿ“ÖŠÿ’Ô‰ÿ‚Ê|ÿk»jÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²_ÿsÀpÿˆÎÿ™Ùÿ’Ö‰ÿŠÓÿ‚Ðyÿ}Ïuÿ|Ïtÿ|Ïtÿ|Ïtÿ|ÏtÿÓïÐÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿðúïÿ™Ù’ÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ¨ß¢ÿÞóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞóÜÿ¨ß¢ÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|ÏtÿÞóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞóÜÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ|Ïtÿ~Ïvÿ„Ñ{ÿÔ„ÿ”׋ÿ“ÕŠÿƒË}ÿk»jÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ^²_ÿsÀpÿ‰Î‚ÿ™Ùÿ“Ö‰ÿŠÓÿ‚Ðyÿ}Ïuÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿÛòÙÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿ›Ú•ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ·å³ÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍìÊÿœÚ–ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿÞóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞóÜÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ|Ïtÿ~Ïvÿ„Ñ{ÿÔ„ÿ•׋ÿ”Õ‹ÿƒË}ÿk»jÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ_²_ÿtÀqÿŠÎƒÿšÙÿ“Ö‰ÿŠÓÿ‚Ðyÿ}Ïuÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿÞóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÛ–ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ‹Õ„ÿÈëÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ç¸ÿ׊ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ€Ñxÿ‘׊ÿãõáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûóÿÍíÊÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ|Ïtÿ~Ïvÿ„Ñ{ÿÔ„ÿ•׌ÿ•ÕŒÿ„Ë~ÿl»jÿY¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ_²_ÿuÀqÿŠÎƒÿ›Ù‘ÿ“ÖŠÿŠÔÿ‚Ñyÿ|Ïtÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿÛòÙÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿ›Ú•ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ§Þ¡ÿÚñ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬á§ÿ…Ó~ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿˆÔÿ²ã­ÿëøêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ½ç¹ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ~Ïvÿ„Ò{ÿÕ„ÿ–׌ÿ•ÕŒÿ…Ëÿm»jÿZ¯[ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ_²`ÿuÀrÿŠÎƒÿœÚ’ÿ”׋ÿ‹Ô‚ÿ‚Ñyÿ|Ïtÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿÒïÐÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿðúïÿ˜Ù’ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿÈêÄÿðùïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÛ–ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ‘׊ÿÓïÑÿôûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ½ç¹ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ~Ïuÿ„Ò{ÿŽÕ…ÿ—Øÿ–Öÿ…Ëÿm»kÿZ¯\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ_²`ÿuÀrÿ‹Ï„ÿœÚ’ÿ”׋ÿ‹Ô‚ÿ‚Ñyÿ|ÏtÿzÏsÿzÏsÿzÏsÿzÏsÿÂé¿ÿìøëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõûõÿÚñØÿ’׌ÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿÑxÿ׊ÿÝóÜÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöüöÿÞóÜÿ“ØÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿ•Ùÿè÷çÿùýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝòÜÿ«à§ÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿ{Ïsÿ~Ïuÿ„Ò{ÿŽÕ…ÿ—Øÿ—ÖŽÿ…Ëÿm»kÿZ¯\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ_³`ÿuÁrÿ‹Ï…ÿÚ“ÿ”׌ÿ‹Ô‚ÿ‚Ñzÿ|ÏtÿzÏrÿzÏrÿzÏrÿzÏrÿ«á§ÿÝóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîùíÿ¼ç¹ÿŠÕ„ÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿŠÕ„ÿ¼ç¹ÿîùíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìøëÿµä±ÿˆÔ‚ÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿ}ÐvÿžÜ™ÿ÷ü÷ÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖðÔÿ Ü›ÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿ{Ïsÿ~Ïvÿ„Ò|ÿŽÕ†ÿ—ØŽÿ—ÖŽÿ†Ì€ÿm»kÿZ¯\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ_³`ÿuÁsÿŒÏ…ÿÚ”ÿ•׌ÿ‹ÔƒÿÑzÿ{ÏtÿzÏrÿyÏrÿyÏrÿyÏrÿ’ØŒÿÉëÆÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿàóÞÿšÛ•ÿ‚ÒzÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿÑwÿÛ˜ÿèöçÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿàôÞÿ׉ÿÑwÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ„Ò}ÿ«à¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌíÊÿ’ØŒÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿzÏsÿ}ÏvÿƒÒ|ÿŽÕ†ÿ—Øÿ—Öÿ†Ìÿm¼lÿZ°\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ_³aÿvÁsÿŒÏ†ÿžÛ•ÿ•ØŒÿ‹ÔƒÿÑzÿ{ÏtÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ­á©ÿèöçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðùïÿÇêÄÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ׉ÿ»ç¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿÒïÏÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ׉ÿ»ç¸ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ç¸ÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿzÏsÿ}ÏvÿƒÒ|ÿÕ†ÿ˜Ùÿ˜×ÿ‡Ìÿm¼lÿZ°\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ`³aÿvÁsÿŒÏ†ÿžÛ•ÿ–Øÿ‹ÔƒÿÑzÿ{ÏtÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ׋ÿ¾è»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓïÑÿœÜ˜ÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ«á¦ÿåöäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæöåÿ¸æ´ÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ Ý›ÿÕðÒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîøíÿ°â¬ÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿzÏsÿ}ÏvÿƒÒ|ÿÕ‡ÿ™Ùÿ˜×ÿ‡Ìÿn¼lÿZ°\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ`³aÿvÁtÿЇÿŸÛ–ÿ–ØŽÿŒÔƒÿÑzÿ{ÏtÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ€ÑyÿšÛ•ÿÒïÐÿóûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝóÛÿ¬á¨ÿƒÓ}ÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿÖ‰ÿÇëÄÿùýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒïÏÿšÛ”ÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ±ã¬ÿîùíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×ðÕÿ¡ÝÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿzÏsÿ}Ïvÿ„Ò|ÿÕ‡ÿ™Ù‘ÿ™×‘ÿ‡Ì‚ÿn¼mÿZ°\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ`³aÿwÂtÿŽÐˆÿ Û—ÿ—ØŽÿŒÔ„ÿÑzÿzÏtÿyÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿÒzÿ™Û•ÿÔðÒÿóûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýùÿè÷çÿ­â©ÿ‰ÕƒÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿyÏrÿ|Ðuÿ´ä°ÿâôáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóûóÿ¹æ¶ÿÑzÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿÒzÿÁé¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÀè½ÿ’ØÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿyÏsÿ}Ïvÿ„Ò|ÿÕˆÿšÙ‘ÿš×’ÿˆÍƒÿn¼mÿZ°\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ`³aÿwÂuÿЉÿ¡Ü˜ÿ˜ÙÿŒÕ„ÿÑzÿzÏtÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿ™Û•ÿÒïÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè÷çÿ¥ß¡ÿƒÓ}ÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿ{Ðuÿ‡ÔÿáôßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑïÏÿܘÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿ™Û•ÿÒïÐÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¯ã¬ÿ†ÔÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿxÏrÿyÏsÿ|Ïvÿ„Ò|ÿÖˆÿ›Ú’ÿ›Ø“ÿ‰Í„ÿn¼mÿZ°\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿ`³aÿwÂuÿЉÿ¡Ü˜ÿ˜ÙÿŒÕ„ÿÑyÿzÏsÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿ€Òzÿ”ØŽÿµä±ÿèöçÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîøíÿÆêÃÿœÛ—ÿƒÓ}ÿzÐtÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿŒÖ†ÿÊìÇÿñúñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°â«ÿ†Ô€ÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿ»æ·ÿèöçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŸÝšÿ{ÐuÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿyÏrÿ|Ïuÿ„Ò|ÿÖˆÿ›Ú’ÿ›Ø“ÿ‰Í„ÿo¼nÿZ°\ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa³bÿxÂuÿЉÿ¢Ü™ÿ˜ÙÿŒÕ…ÿÑzÿzÏsÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿ{ÐtÿŠÕ„ÿ¬á¨ÿÂé¿ÿÕðÓÿäõãÿðùïÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿóúóÿè÷çÿÚòÙÿÊìÇÿ³ä¯ÿ–Ùÿ}ÐvÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿŽ×ˆÿ·å´ÿðùïÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿàôßÿ—Ú’ÿ{ÐtÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿyÏrÿÑxÿÓïÑÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùýùÿè÷çÿ”ÙŽÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿyÏrÿ|Ïuÿ„Ò|ÿ‘Ö‰ÿœÚ“ÿœØ”ÿ‰Í„ÿo¼nÿ[°]ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa³bÿxÂvÿÑŠÿ£Üšÿ™Ù‘ÿÕ…ÿÑzÿzÏsÿxÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿˆÔ‚ÿžÝ™ÿµä±ÿÆêÃÿ×ðÕÿÝòÛÿÝòÛÿÝòÛÿÌìÉÿºæ·ÿ¦à¢ÿ׈ÿ}ÐvÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿ…Óÿ³ä°ÿåöäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿé÷èÿ³ä¯ÿ†Ô€ÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿ~Ñwÿ’Ø‹ÿãõâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïùïÿÂéÀÿŠÕ„ÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿxÎrÿ|Ïuÿ„Ò}ÿ‘Ö‰ÿœÚ”ÿØ•ÿŠÍ…ÿo¼nÿ[°]ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa³bÿyÂwÿ‘Ñ‹ÿ¤ÝœÿšÙ’ÿÕ†ÿÑzÿzÏsÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿ¯â«ÿàôßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿÕïÓÿ†Ó€ÿzÏtÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿ†Ó€ÿ³ä¯ÿìøëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäõãÿ•Ùÿ~ÐxÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿxÎrÿ|Ïuÿ„Ò}ÿ’ÖŠÿÚ•ÿÙ–ÿ‹Î†ÿp¼oÿ[°]ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa³bÿyÂwÿ’ÑŒÿ¤ÝœÿšÙ“ÿÕ†ÿÑzÿzÏsÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿÑyÿ˜Ú”ÿÚñØÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàôßÿ°â¬ÿzÏtÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿ‘׌ÿàóßÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüùÿÖðÔÿ~ÐxÿxÎrÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿxÎrÿ|Ïuÿ„Ò}ÿ’Ö‹ÿÚ–ÿžÙ—ÿ‹Î†ÿp¼oÿ[°]ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa³bÿyÂwÿ’Ñÿ¥Ýÿ›Ù“ÿÕ†ÿÑzÿyÏsÿwÎqÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿ‚Ò|ÿžÜ™ÿÑîÏÿóúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóúóÿÂé¿ÿÖ‡ÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿ†Ó€ÿ­á©ÿ÷ü÷ÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìøëÿÀè½ÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿxÎqÿ|Ïuÿ„Ò}ÿ’Ö‹ÿžÚ–ÿŸÙ˜ÿŒÎ‡ÿp¼oÿ[°]ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa³bÿzÂxÿ’Ñÿ¦Ýžÿ›Ù“ÿŽÕ†ÿÑzÿyÏsÿwÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿÑxÿžÜ™ÿËìÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ×ðÕÿ Ü›ÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿœÛ—ÿÑîÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚòÙÿ¦ß¢ÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿwÎqÿ{Ïuÿ„Ò}ÿ“Ö‹ÿŸÚ—ÿŸÙ˜ÿŒÎˆÿq¼pÿ[°]ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa³cÿzÂyÿ“ÒŽÿ¦ÞŸÿ›Ú”ÿŽÕ‡ÿÑzÿyÏsÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿ—Ú“ÿÑîÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ£ÞŸÿ}ÐxÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿ³ã¯ÿóúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉìÇÿŒÖ‡ÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿwÎqÿ{Ïuÿ„Ò}ÿ“׌ÿŸÛ˜ÿŸÚ™ÿΉÿq¼qÿ[°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa´cÿzÂyÿ“ÒŽÿ¦ÞŸÿ›Ú•ÿŽÕ‡ÿÑzÿyÏsÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿ‡Ô‚ÿ»æ¸ÿÜòÛÿóúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðùðÿÅêÃÿŒÖ‡ÿwÎrÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿ—Ú“ÿÏîÍÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîøíÿ³ã¯ÿ{ÐuÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿwÎqÿ{Ïuÿ„Ò}ÿ“׌ÿŸÛ˜ÿ ÚšÿΉÿq½qÿ[°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa´cÿzÃyÿ”Òÿ§Þ ÿœÚ•ÿŽÕ‡ÿ€ÑzÿxÏrÿvÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿ{Ïvÿ”Øÿºæ·ÿè÷çÿùýùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóûóÿÒïÑÿ“Ùÿ}ÐwÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿ¹æ·ÿçöçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËìÉÿ—Ú“ÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿwÎqÿ{ÏuÿƒÒ}ÿ“׌ÿ Û™ÿ¡ÚšÿΉÿq½qÿ[°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿa´cÿ{Ãyÿ”Òÿ¨Þ¡ÿœÚ–ÿŽÕˆÿ€ÑzÿxÏrÿuÎpÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿvÎqÿ|Ðwÿ–Ù’ÿÃéÁÿíøíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöüöÿÖðÕÿ¨à¥ÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿyÏtÿˆÔƒÿØñ×ÿùüùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿ÷ü÷ÿ¦ß£ÿ€Ò{ÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿvÎpÿzÏtÿƒÒ}ÿ“×ÿ Û™ÿ¡Ú›ÿŽÏŠÿq½qÿ[°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿb´cÿ{Ãzÿ”Óÿ©ß¢ÿÚ–ÿŽÕˆÿÑzÿxÏrÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿ|Ðvÿ“ÙŽÿØñÖÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜóÛÿ£ÞŸÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿˆÔ‚ÿÁé¾ÿïùîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿàôßÿ׋ÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿvÎpÿ{Ïtÿ„Ò}ÿ“×ÿ¡Üšÿ¢ÛœÿŽÏ‹ÿr½qÿ\°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿb´dÿ{Ãzÿ•Óÿ©ß¢ÿÛ–ÿŽÕˆÿÑzÿxÏrÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿ}Ðxÿ—Ú’ÿ»ç¸ÿäõâÿõûôÿýþýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿóúóÿ®â«ÿ†ÔÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿzÏuÿœÛ—ÿïùîÿûýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè÷çÿ¦ß¢ÿÒ{ÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿvÎpÿ{Ïtÿ„Ò}ÿ”×ÿ¡Üšÿ£ÛœÿŽÏ‹ÿr½rÿ\°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿb´dÿ|Ãzÿ–Ó‘ÿªß£ÿžÛ—ÿÖˆÿ€Ñ{ÿwÏrÿuÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿxÏsÿƒÓ~ÿšÛ–ÿ·å´ÿÐîÎÿçöæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿçöçÿ¹æ·ÿ‹Õ‡ÿxÏsÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿ“ØÿÅêÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿÚñØÿƒÓ~ÿxÏrÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿvÎpÿzÏuÿ„Ò~ÿ”ØŽÿ¢Ü›ÿ£ÛÿÏ‹ÿr½rÿ\°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿb´dÿ|Ã{ÿ—Ó’ÿ«ß¤ÿŸÛ˜ÿÖ‰ÿ€Ò{ÿwÏrÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎpÿwÏsÿƒÓ~ÿ”Ùÿ­âªÿÏîÎÿóúòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíøíÿÄêÃÿÑ{ÿvÎrÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿ|Ñxÿ³ä±ÿíøíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíøíÿÁéÀÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿuÎpÿzÐuÿ„Ó~ÿ•ØŽÿ£Üœÿ¤ÛžÿÏŒÿr½rÿ\°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿb´dÿ}Ä{ÿ—Ô“ÿ¬à¥ÿŸÛ™ÿÖ‰ÿ€Ò{ÿwÏrÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿwÏsÿƒÓÿ°ã®ÿßôÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐîÏÿ–Ú“ÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿ–Ú“ÿÐîÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐîÏÿ–Ú“ÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿuÎpÿzÐuÿ„Ó~ÿ•Øÿ£Ýÿ¥ÜŸÿ‘Ðÿs¾rÿ\°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿc´dÿ}Ä{ÿ—Ô“ÿ¬à¥ÿ Û™ÿÖ‰ÿ€ÒzÿwÏqÿtÎoÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿ„Ô€ÿ¢ÞžÿÃêÁÿàôßÿëøêÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÊìÈÿœÜ˜ÿ|ÑwÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿvÎqÿÑzÿÍíËÿóúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíøíÿ³ä°ÿ|ÑwÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿuÎoÿzÐtÿ„Ó~ÿ•Øÿ¤Ýÿ¥ÜŸÿ‘Ðÿs¾sÿ\°^ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿc´eÿ}Ä|ÿ˜Ô“ÿ­à¦ÿ Û™ÿÖ‰ÿ€ÑzÿwÎqÿtÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿuÎpÿ{Ðvÿ†Ô‚ÿ–Ú’ÿ¦ß¢ÿ±ã®ÿÂéÀÿØñÖÿíùíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿíøìÿÐîÎÿ›Ü˜ÿÒzÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿ„Ô€ÿ¹æ¶ÿíøìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄêÂÿ’ØŽÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿuÎoÿzÏtÿ„Ó~ÿ–Øÿ¤Ýžÿ¦Ü ÿ‘Ðÿs¾sÿ\°_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿc´eÿ~Ä|ÿ™Ô”ÿ®à§ÿ ÛšÿÖŠÿ€ÑzÿvÎqÿsÍnÿsÍnÿsÍnÿsÍnÿ{Ðwÿ~Òzÿ€Ò|ÿ†Ô‚ÿ‰Õ…ÿŽ×Šÿ•Ú’ÿ¡Þžÿ²ä°ÿÊìÈÿâôáÿóúóÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿçöæÿÄéÂÿ•Ù’ÿ{ÐwÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿ~Ñzÿ¤ß¡ÿóúóÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýúÿïùîÿšÛ—ÿxÏtÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿtÍoÿzÏtÿ„Ò~ÿ–Øÿ¥Ýžÿ§Ü¡ÿ’ÐŽÿt¾sÿ\°_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿc´eÿ~Ä}ÿšÔ•ÿ¯á¨ÿ¡Ü›ÿÖŠÿ€ÑzÿvÎqÿsÍnÿsÍnÿsÍnÿsÍnÿ•Ù’ÿ¡Þžÿ¨à¦ÿÀé¾ÿÌìÊÿàóßÿóúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóúóÿ¸å¶ÿ~ÐzÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿ¢ÝžÿÜòÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïùîÿÀé¾ÿ†Ô‚ÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿsÍnÿtÍoÿyÏtÿ„Ò~ÿ–Øÿ¦ÞŸÿ¨Ü¡ÿ“Ðÿt¾tÿ\°_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿc´eÿ~Ä}ÿšÔ–ÿ¯á¨ÿ¡Ü›ÿÖŠÿÑzÿvÎqÿsÍnÿrÍnÿrÍnÿrÍnÿÊìÈÿçöæÿé÷èÿïùîÿòúñÿ÷ü÷ÿüýüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöûöÿÛòÛÿ£Þ¡ÿƒÓ€ÿuÍqÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿŒÖ‰ÿÄêÂÿöûöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüùÿ×ðÖÿ…Ô‚ÿwÎsÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿtÍoÿyÏtÿƒÒ~ÿ–Øÿ¦ÞŸÿ¨Ü¢ÿ“Ðÿt¾tÿ\°_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿcµeÿ~Å}ÿšÕ–ÿ¯á©ÿ¢ÜœÿÖŠÿÑzÿvÎqÿsÍnÿrÍmÿrÍmÿrÍmÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëøêÿÉìÈÿ¡Ýžÿ}ÑyÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿwÏsÿ‰Õ…ÿ¾è¼ÿçöæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãõâÿ²ã¯ÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿtÍoÿyÏtÿƒÒ~ÿ–Ø‘ÿ¦Þ ÿ¨Ý£ÿ“Ñÿt¿tÿ\±_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿdµeÿÅ~ÿšÕ–ÿ°âªÿ¢ÜœÿÖ‹ÿÑzÿuÎqÿrÍnÿrÍmÿrÍmÿrÍmÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûýûÿìøëÿÄêÁÿ”Ù‘ÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿuÎqÿ‰Õ…ÿ¸æµÿì÷ëÿüüüÿúúúÿùùùÿùùùÿûûûÿüüüÿþþþÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöûöÿÄêÂÿŒÖˆÿrÍmÿrÍmÿqÌlÿqÌlÿpÊkÿpÉkÿoÈjÿoÈjÿpÉkÿqËlÿqÌlÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿsÍoÿyÏtÿƒÒ~ÿ—Ø‘ÿ§Þ¡ÿ©Ý£ÿ“Ñÿu¿uÿ]±_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿdµeÿÅ~ÿ›Õ—ÿ±â«ÿ¢Üÿ‘׋ÿ€ÑzÿuÎqÿrÍnÿrÍmÿrÍmÿrÍmÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿïùïÿ´ä±ÿ‰Õ…ÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿÒ}ÿ¬á©ÿÿÿÿÿûûûÿôôôÿíííÿéééÿêêêÿïïïÿöööÿüüüÿþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛòÛÿ¡ÝžÿrÍmÿrÍmÿrÍmÿqÌlÿpÉkÿmÃhÿj½eÿh»dÿh»dÿk¿fÿnÆiÿqËlÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿsÍoÿxÏtÿ„Ó~ÿ—Ù’ÿ§Þ¢ÿ©Ý¤ÿ”Ñ‘ÿu¿uÿ]±_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿdµeÿÅ~ÿœÕ˜ÿ±â«ÿ£Ýÿ‘׋ÿ€Ñ{ÿuÎqÿrÍnÿqÍmÿqÍmÿqÍmÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíøíÿËìÊÿ›Û™ÿ„ÓÿwÏsÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿyÏvÿªà§ÿáôàÿÿÿÿÿõõõÿäääÿÒÒÒÿÇÇÇÿÊÊÊÿÓÓÓÿàààÿîîîÿøøøÿýýýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýüÿóúóÿ£Þ ÿ}ÑyÿqÍmÿqÍmÿpÊkÿmÄhÿg»cÿa¯]ÿ\¦XÿY¡VÿY¢Wÿ_«[ÿh¼dÿnÇjÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿsÍoÿxÏtÿ„Ó~ÿ˜Ù’ÿ¨Þ¢ÿªÝ¥ÿ”Ñ‘ÿu¿uÿ]±_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿdµfÿ€ÅÿœÕ˜ÿ²â¬ÿ£Ýžÿ‘׌ÿ€Ñ{ÿuÎpÿrÍmÿqÍmÿqÍmÿqÍmÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþýÿ÷ü÷ÿÓïÒÿ´ä²ÿ–Ú“ÿxÏuÿrÍoÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿrÍoÿxÏuÿ§à¥ÿ×ðÖÿùüùÿÿÿÿÿððñÿ¹Ñãÿƒ´Øÿx¬Òÿz­ÔÿµÒÿ°ÃÒÿØØØÿéééÿõõõÿüüüÿþþþÿþþþÿÿÿÿÿíøìÿ·å¶ÿ‚ÓÿqÌmÿpËlÿoÊkÿkÂgÿe¶aÿ\©dÿP {ÿHœ•ÿDšÿE›œÿJ¡œÿaµsÿlÄiÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿsÍnÿxÏtÿ„Óÿ˜Ù’ÿ¨ß£ÿ«Þ¥ÿ•Ñ’ÿu¿uÿ]±_ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿdµfÿ€ÅÿÖ™ÿ³ã­ÿ¤ÝŸÿ‘׌ÿ€Ñ{ÿuÎpÿrÍmÿqÍlÿqÍlÿqÍlÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüýûÿóúòÿäõãÿÏîÎÿšÛ—ÿ|ÑxÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿtÎpÿÒ}ÿ›Û™ÿÝòÜÿùüùÿÿÿÿÿÿÿÿÿïïðÿ“ÅéÿB¤êÿS´îÿJ¯îÿWªâÿv¬Ôÿ¦¼ÎÿÍÓ×ÿæææÿôôôÿûûûÿþþþÿóúòÿÌíËÿ|ÐxÿsÍoÿpËlÿnÈjÿkÂgÿc³_ÿX¦iÿL„ÿAš°ÿE©ÞÿM±îÿM¯ëÿ:Ÿâÿ\´„ÿlÄhÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿsÍnÿxÏsÿ„Óÿ˜Ù“ÿ©ß£ÿ«Þ¦ÿ–Ò’ÿu¿vÿ]±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿdµfÿÅ€ÿÖ™ÿ´ã®ÿ¥ÝŸÿ’×ÿ€Ñ{ÿuÎpÿrÍmÿqÍlÿqÍlÿqÍlÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóúòÿÏîÍÿŸÝœÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿ€Ò|ÿ§à¤ÿïùîÿûýúÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿ’ÅìÿS´ïÿ°ýÿÿ‹êýÿ`ÆõÿB¦ëÿCãÿ ·ÈÿÏÏÏÿäääÿõõõÿûûûÿÏîÍÿ”ÙÿqÍlÿqÌlÿoÈjÿj¿eÿc³_ÿY¡UÿG›•ÿ:Ýÿ=¤ìÿmÔøÿ–ðþÿ“æúÿ<£ëÿ^¸†ÿmÆhÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿqÍlÿsÍnÿxÏsÿ„Óÿ™Ù”ÿªß¤ÿ¬Þ§ÿ–Ò“ÿv¿vÿ]±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿdµfÿÅ€ÿžÖšÿ´ã®ÿ¥ÝŸÿ’×ÿ€Ñ{ÿtÎpÿqÍmÿpÍlÿpÍlÿpÍlÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüøÿçöæÿÃêÁÿœÜ™ÿ‡Õ„ÿ{ÑxÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿŠÖ‡ÿ»ç¹ÿé÷èÿûýúÿþþýÿÿÿÿÿÿÿÿÿÿÿÿÿöööÿ¥Îíÿd¶ëÿãúÿëýÿ}ãüÿcÎ÷ÿL±íÿU§âÿ‰³ÓÿÃÊÎÿàààÿÖæÔÿ¦Ü¤ÿxÎtÿoËkÿlÆhÿg¼cÿ_®_ÿTž`ÿD›§ÿB¤ÔÿO·îÿi×úÿƒçýÿŽèüÿ{Òîÿ? Ëÿ`º€ÿmÈiÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿrÍnÿxÏsÿ„Óÿ™Ù”ÿªß¤ÿ­Þ¨ÿ–Ò“ÿv¿vÿ]±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿdµfÿÅ€ÿŸÖ›ÿµã¯ÿ¦Þ ÿ’×ÿ€Ñ{ÿtÎpÿqÍmÿpÍlÿpÍlÿpÍlÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùüøÿçöæÿÕðÔÿ¿è½ÿ§à¤ÿØŒÿwÏtÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿuÏrÿ‡Õ„ÿ½è»ÿçöæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿ»Ùïÿz½éÿrÊõÿçüÿ‰ìÿÿsâýÿfÑøÿR»òÿ_°ãÿ‚±Ñÿ¯ÃÆÿ˜Åœÿ}ÄzÿkÃgÿkÃgÿe¹aÿ\¬dÿP xÿB™¥ÿH«ÚÿVÀòÿhÕùÿwèÿÿîÿÿ†ßúÿjÄäÿH¦®ÿd¿zÿnÊjÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿrÍnÿxÏsÿ„Óÿ™Ú”ÿ«à¥ÿ®ß¨ÿ—Ò”ÿv¿vÿ]±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿdµfÿ‚ÆÿŸ×›ÿ¶ä°ÿ¦Þ¡ÿ’Øÿ€Ñ{ÿtÎpÿqÍmÿpÍlÿpÍlÿpÍlÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýþüÿ÷üöÿîùíÿåõäÿÕðÔÿ¸åµÿœÜ™ÿÓ~ÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿyÐvÿØÿ·æµÿíøìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÔæòÿ–ÈêÿV´ðÿâûÿŒìþÿwçþÿzéþÿlÚúÿWÁôÿR­ãÿt«Áÿ^¦}ÿ]¬cÿc´_ÿc´_ÿZ¨eÿOŸ}ÿFžªÿCªíÿ[ÇõÿoÝûÿyéþÿuçþÿ–îþÿ~ÕøÿZ·ØÿU°ŽÿhÄtÿoÌkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿrÍnÿxÏsÿ„Óÿ™Ú”ÿ«à¦ÿ®ß©ÿ˜Ó•ÿw¿wÿ]±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿeµgÿ‚ÆÿŸ×œÿ·ä±ÿ§Þ¡ÿ“Øÿ€Ñ{ÿtÎpÿqÍmÿpÍlÿpÍlÿpÍlÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷üöÿßôÞÿ»ç¹ÿ—Ú”ÿ|ÐxÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿ—Û”ÿÏîÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿñôõÿ»×ëÿ@¤ëÿ‘àúÿ‘ìþÿuåýÿuæýÿxèýÿsâýÿcÏøÿB¨ìÿDš¥ÿNšqÿWŸTÿWŸTÿJ˜ÿAœ¼ÿI±ïÿoÜüÿvåýÿwçýÿuåýÿråýÿŸðþÿvÌõÿHªÊÿf¼jÿmÈkÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿrÍnÿxÏsÿ„ÓÿšÚ”ÿ¬à¦ÿ¯ßªÿ˜Ó•ÿw¿wÿ^±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿeµgÿ‚Æÿ ×œÿ·ä±ÿ§Þ¢ÿ“ØÿÑ{ÿsÎoÿpÍlÿoÍkÿoÍkÿoÍkÿÛòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóúòÿàôßÿÎîÌÿ¼èºÿ¥ß¢ÿ‘Øÿ‹Ö‡ÿ‚Ó~ÿyÐuÿrÍnÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿrÍnÿ{Ðwÿ±ã®ÿÙñØÿóúòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö÷÷ÿÃÜîÿC¡çÿ‡ÖöÿŽçüÿ|åýÿrãýÿtäýÿtãýÿpßüÿgÕùÿR¸áÿG¢¶ÿC–”ÿC–”ÿG¥ÆÿW¿èÿi×úÿtâýÿuäýÿtãýÿuãýÿ{æýÿ•çüÿkÃìÿD¦¾ÿhÀfÿmÉjÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿqÍmÿwÏsÿ„ÓÿšÚ•ÿ¬à§ÿ°ßªÿ˜Ó•ÿw¿wÿ^±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿeµgÿƒÆ‚ÿ ×ÿ¸ä²ÿ§Þ¢ÿ“ØŽÿÑ{ÿsÎoÿpÍlÿoÍkÿoÍkÿoÍkÿÉìÇÿçöæÿäõäÿÞôÝÿÒïÑÿÏîÍÿÉìÇÿ·æµÿ·æµÿ¯ã¬ÿ¢ß ÿ–Û“ÿŠÖ‡ÿ{ÑwÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿ{Ñwÿ“Ùÿ·å´ÿáôàÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÐãñÿ`¬åÿ|Ëóÿˆßúÿ„çýÿpáýÿqáýÿsâýÿsãýÿsãþÿfÓùÿW¾äÿL®ÏÿJ«ÏÿZÄíÿiØúÿsãýÿsãýÿrâýÿqáýÿvãýÿ‡éýÿ†Úùÿb»ÝÿJ©«ÿkÅgÿnËjÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿqÍmÿwÏsÿ„ÓÿšÚ•ÿ­à¨ÿ°à«ÿ™Ó–ÿx¿xÿ^±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿeµgÿƒÆ‚ÿ¡×žÿ¸å³ÿ§ß£ÿ“ØŽÿÑ{ÿsÍoÿoÍlÿnÌkÿnÌkÿnÌkÿ¤ß¢ÿ¶åµÿ³ä±ÿªá§ÿ˜Û•ÿ’Ùÿ‰Ö†ÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿoÍlÿrÎoÿÓ~ÿŸÝœÿÆëÄÿóúòÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿßìõÿŽÀæÿq¿ïÿ€ÖøÿŽéýÿnàüÿpàüÿpáüÿqáüÿrâýÿtäþÿkÚûÿaÎ÷ÿ]Ê÷ÿoÞüÿsãýÿqâýÿpáüÿpàüÿoàüÿxãýÿ•ìþÿsËõÿZ´ÉÿT°“ÿmÉiÿnËjÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿpÍmÿwÏsÿƒÓÿšÚ–ÿ­á¨ÿ°à¬ÿ™Ó—ÿx¿xÿ^±`ÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿeµhÿƒÆƒÿ¡×žÿ¹å´ÿ¨ß£ÿ“ØÿÑ{ÿsÍoÿoÌlÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿrÍoÿ~Ò{ÿºç¹ÿçöæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿïõøÿÅÚéÿh¶ìÿxÍöÿ˜ìþÿmàüÿnàüÿoàüÿpàüÿpàüÿpàüÿqáüÿrâýÿrâýÿqáüÿpàüÿpàüÿpàüÿpàüÿnàüÿzãüÿ¤ïÿÿ`»ñÿR¯´ÿ_¹wÿnËkÿnËkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿpÌmÿwÎsÿƒÓ€ÿ›Ú–ÿ®á©ÿ±à¬ÿšÓ—ÿxÀyÿ^±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿeµhÿƒÆƒÿ¢ØŸÿ¹å´ÿ©ß¤ÿ“ØÿÑ{ÿsÍoÿoÌlÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿ†Ôƒÿ®â¬ÿÞóÞÿíùíÿùüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿøùúÿäéíÿc°êÿoÄóÿ™èýÿoàüÿmßüÿnßüÿnßüÿnßüÿnßüÿnßüÿoßüÿoßüÿnßüÿnßüÿnßüÿnßüÿmßüÿmßüÿzâüÿ¦êýÿS±îÿN¬ªÿf¿jÿnËkÿnËkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿpÌmÿwÎsÿƒÓ€ÿ›Ú—ÿ®á©ÿ²à­ÿšÓ—ÿxÀyÿ^±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿeµhÿ„ǃÿ¢ØŸÿºå¶ÿ©ß¥ÿ”ØÿÑ{ÿrÍoÿoÌkÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿtÎpÿ†ÔƒÿžÝœÿ¾è½ÿàôßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ÷ø÷ÿåéäÿe¯Ôÿi½äÿßúÿwâüÿnßûÿlÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿmÞûÿlÞûÿlÞûÿvßûÿ—ÞúÿQ¬ØÿO¬˜ÿg¿dÿmËjÿmËjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿpÌlÿvÎsÿ„Ó€ÿœÚ—ÿ¯áªÿ²á®ÿ›Ô˜ÿxÀyÿ^±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿfµhÿ„Ç„ÿ£Ø ÿ»æ·ÿªà¦ÿ”ØÿÑ{ÿrÍoÿnÌkÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿyÐvÿ†Ô‚ÿ˜Ú•ÿ¶å´ÿÚòÙÿóúòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ÷ùöÿãíãÿ½Õ¼ÿbª³ÿ`´Òÿ|ÑöÿyâüÿnÞûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÜûÿkÝûÿoÚúÿ}ËôÿP§¿ÿQ¨…ÿd¹`ÿjÆgÿlÉhÿmËiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿoÌlÿvÎsÿ„Ó€ÿœÛ˜ÿ¯â«ÿ³á¯ÿ›Ô™ÿyÀyÿ^±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿfµhÿ…Ç…ÿ¤Ø¡ÿ¼æ¸ÿªà¦ÿ”ØÿÑ{ÿrÍoÿnÌkÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿÝ›ÿÎîÍÿóúòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿãíãÿ³Ò±ÿe©cÿIšÿN¥Æÿ`¾ñÿjßüÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÜûÿjÝûÿgÔøÿ]´îÿH²ÿLzÿ[ªXÿdºaÿiÄfÿlÊiÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿoÌlÿvÎsÿ„Ó€ÿœÛ˜ÿ°â¬ÿ´á°ÿœÔšÿyÀzÿ^±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿfµhÿ…Ç…ÿ¤Ø¢ÿ¼æ¸ÿªà§ÿ”ØÿÑ{ÿrÍoÿnÌkÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿ…Ô‚ÿ©á§ÿÎíÍÿãõâÿòúòÿüýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿýýýÿùùùÿÕåÔÿžÇœÿiªyÿI›“ÿA ÈÿO¶çÿbÏöÿjÝúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÜúÿgØùÿ`ÊõÿG¬àÿBžµÿJ‚ÿY¦Vÿaµ^ÿgÀdÿkÇhÿmËjÿmËjÿmÌjÿmÌjÿmÌjÿmÌjÿoÌlÿvÎsÿ„Ó€ÿœÛ™ÿ°â­ÿ´á±ÿœÔšÿyÀzÿ^±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿfµhÿ…Ç…ÿ¥Ù£ÿ½æ¹ÿ«à§ÿ”Ø‘ÿÑ|ÿrÍoÿnÌkÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿyÐvÿ‹ÖˆÿžÝœÿ°ã®ÿÆëÅÿÞóÝÿ÷üöÿýþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿëòëÿÀÜ¿ÿ”Á’ÿgª‰ÿGžžÿD¥ÊÿO¹éÿ\ÌöÿeØùÿhÜúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÚúÿhÛúÿgÚùÿe×ùÿWÆõÿL²ßÿE¢»ÿHœÿV¥eÿ_±\ÿf¾cÿkÇhÿlÊiÿlËiÿmÌjÿmÌjÿmÌjÿoÌlÿvÎsÿ„Ó€ÿÛ™ÿ±â­ÿµâ²ÿÔ›ÿzÀzÿ^±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿgµhÿ†Ç†ÿ¥Ù£ÿ¾çºÿ¬á¨ÿ•Ù‘ÿÑ|ÿqÍoÿnÌkÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿrÎpÿ{ÐxÿÓ~ÿŠÖ‡ÿ¡ÞŸÿ¾è½ÿÛòÚÿöûõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿþþþÿ÷ù÷ÿãíãÿ»Ø¼ÿzµ}ÿX¢xÿGŸ¦ÿEªÝÿQ½óÿbÓøÿgÛúÿgÛúÿfÚùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÙùÿfÚùÿhÛúÿgÛúÿ\ÌöÿM·ëÿB£ÖÿJŽÿS¢jÿ]®^ÿe½bÿiÄfÿkÉhÿlËiÿlÌjÿlÌjÿoÌlÿvÎsÿ„ÓÿÜ™ÿ²ã®ÿ¶â²ÿÕœÿzÀ{ÿ_±aÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿgµiÿ†Ç†ÿ¦Ù£ÿ¿ç»ÿ­á©ÿ•Ù’ÿÑ|ÿqÍoÿmÌkÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿlÌjÿ„Ô‚ÿ¥ß£ÿ½è¼ÿáôáÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿûûûÿåìåÿ£Ì¢ÿa©eÿM–_ÿ?ÈÿI²ïÿ[ÊõÿiÝúÿgÚùÿfÙùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿeØùÿfÙùÿhÛùÿdÖøÿWÄôÿB©íÿD›¥ÿP›]ÿ[«Yÿb¸`ÿgÃeÿjÉhÿlÌjÿlÌjÿnÌlÿuÎsÿ„ÓÿžÜšÿ³ã¯ÿ¶â³ÿžÕœÿzÀ{ÿ_±bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿgµiÿ†Ç†ÿ§Ù¤ÿ¿ç»ÿ­á©ÿ•Ù’ÿÑ|ÿqÍnÿmÌjÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿ‡Õ…ÿœÜšÿ®ã­ÿÁêÁÿÔðÓÿàôßÿè÷èÿîùîÿ÷ü÷ÿüþüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿðõïÿÌãËÿÁŒÿc©xÿKžŽÿC¢ÉÿQ¼éÿ\ÌöÿcÕøÿeÙùÿdØùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿc×ùÿdØùÿdØùÿbÔøÿYÈõÿL³ÞÿE ´ÿK›wÿV§`ÿ_´]ÿfÁdÿjÉgÿkËhÿnÌkÿuÎrÿ„ÓÿžÜ›ÿ³ã¯ÿ·â´ÿžÕœÿzÀ{ÿ_±bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿgµiÿ‡Ç‡ÿ§Ù¥ÿÀç¼ÿ­áªÿ•Ù’ÿ~Ñ|ÿpÍnÿlÌjÿkÌiÿkÌiÿkÌiÿ}Ò{ÿ„Ô‚ÿ„Ô‚ÿ„Ô‚ÿ„Ô‚ÿ„Ô‚ÿŠÖˆÿÝ›ÿÝ›ÿ©á§ÿµå´ÿµå´ÿÇëÆÿÖðÕÿâõáÿîùîÿúýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøüøÿÛïÚÿ²Ú±ÿŠÀ‰ÿZ¦…ÿH¡žÿIªÇÿP¿óÿ\Ï÷ÿbÖùÿc×ùÿb×ùÿaÖùÿaÖùÿaÖùÿaÖùÿaÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿaÖùÿaÖùÿaÖùÿaÖùÿbÖùÿb×ùÿcØùÿaÕøÿXÉõÿM¸äÿF¤¸ÿIŸ‘ÿS§oÿ`µ^ÿgÅeÿjÊhÿnÌkÿuÎrÿƒÓÿžÜ›ÿ´ã°ÿ¸â´ÿŸÕÿ{À|ÿ_±bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿgµiÿ‡Ç‡ÿ§Ù¦ÿÁè½ÿ®áªÿ•Ù’ÿ~Ò|ÿpÍnÿlÌjÿkÌiÿkÌiÿkÌiÿ¢ß¡ÿ´å´ÿ´å´ÿ´å´ÿ´å´ÿ´å´ÿ¾è½ÿÚòÙÿÚòÙÿìøìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúÿîùîÿÕðÕÿ¤Ú£ÿq¾wÿQ£nÿE¢®ÿG®ÚÿQÂóÿ_Öøÿ`Öùÿ_Öùÿ^Õøÿ^Õøÿ^Õøÿ^Õøÿ^Õøÿ^Õøÿ_Õøÿ_Õøÿ`ÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿaÕøÿ`Õøÿ_Õøÿ^Õøÿ^Õøÿ^Õøÿ^Õøÿ^Õøÿ^Õøÿ^Õøÿ`Öùÿ_ÖùÿZÏ÷ÿK»òÿC¨ÎÿI¢˜ÿV«kÿd¿cÿiÈgÿmÌkÿtÎrÿƒÔÿžÜ›ÿ´ã°ÿ¸ãµÿŸÕžÿ{À|ÿ_±bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©SÿgµiÿˆÈˆÿ¨Ú¦ÿÁè¾ÿ®á«ÿ–Ù“ÿÒ|ÿpÍnÿlÌjÿkÌiÿkÌiÿkÌiÿÚòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîùîÿ¼è»ÿÓ}ÿgÄeÿZ´vÿ?œ·ÿK¸äÿVÍöÿ\×øÿZÕøÿYÔøÿXÔøÿXÓøÿXÓøÿXÓøÿXÓøÿXÓøÿYÔøÿYÔøÿ[Ôøÿ\Ôøÿ_Õøÿ_Õøÿ`Õøÿ`Õøÿ`Õøÿ`Õøÿ_Õøÿ^Ôøÿ\ÔøÿZÔøÿYÓøÿXÓøÿXÓøÿXÓøÿXÓøÿXÓøÿXÔøÿXÔøÿYÔøÿZÕøÿ\ØùÿQÆôÿG°ÕÿI¦¡ÿc»aÿiÇgÿmÌkÿuÎrÿ„ÔÿŸÜœÿ´ã±ÿ¸ã¶ÿ ÖŸÿ|Á|ÿ_±bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿg¶jÿˆÈˆÿ¨Ú¦ÿÁè¾ÿ®á¬ÿ–Ù“ÿÒ|ÿpÍnÿlÌjÿkÌiÿkÌiÿkÌiÿÚòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìøìÿÁêÀÿ”Ú“ÿÓ}ÿpÍnÿgÅeÿY¶ÿ7œÝÿ–Ùôÿµîüÿ´ïýÿ³íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ³ìüÿ–äúÿrÚøÿ[Òøÿ]Óøÿ^Óøÿ^Óøÿ^Óøÿ]Óøÿ\ÓøÿbÕøÿzÝøÿ¤èûÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ²íüÿ³îüÿ´ïýÿ´íüÿ„ÍîÿX²Áÿd¾bÿiÈgÿmÌkÿuÎrÿ„ÔÿŸÜœÿ´ã²ÿ¹ã¶ÿ ÖŸÿ|Á}ÿ_±bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿg¶jÿˆÈˆÿ©Ú§ÿÂè¿ÿ¯â¬ÿ–Ú“ÿ~Ò|ÿpÍnÿkÌiÿjÌhÿjÌhÿjÌhÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöüöÿæöåÿÍîÌÿ®ã­ÿ‹×‰ÿpÎnÿjÌhÿjÌhÿhÈfÿ[»‚ÿ;¡ÛÿsÁîÿƒÊôÿ€Èóÿ€ÈóÿÈóÿÈóÿÈóÿÈóÿÈóÿÈóÿÇóÿÇóÿ~ÆóÿŒÕöÿŠàùÿYÑ÷ÿ[Ò÷ÿ]Ò÷ÿ]Ò÷ÿ]Ò÷ÿ\Ò÷ÿZÒ÷ÿhÖøÿ˜äùÿ‡Ïõÿ€ÈóÿÇóÿÈóÿÈóÿÈóÿÈóÿÈóÿÈóÿÈóÿ€ÈóÿÈôÿƒÊôÿh»ëÿR±ÃÿfÃdÿiÉgÿmÌkÿtÎrÿƒÔÿŸÝœÿµä²ÿºã·ÿ ÖŸÿ|Á}ÿ_²bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿg¶jÿˆÈ‰ÿ©Ú¨ÿÃéÀÿ¯â¬ÿ–Ù“ÿ~Ò|ÿoÍmÿkÌiÿjËhÿjËhÿjËhÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüþüÿöüöÿçöæÿÑïÐÿ´å³ÿŽØÿsÎqÿjËhÿjËhÿjËhÿjËhÿiÊgÿaÂyÿL¯³ÿC©Ãÿ?§Éÿ>¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¥Èÿ<¤Èÿ3œÖÿn¿éÿ˜àøÿ]Ò÷ÿ[Ò÷ÿ[Ñ÷ÿ\Ñ÷ÿ\Ñ÷ÿ[Ñ÷ÿ[Ò÷ÿn×÷ÿ§ãùÿT¯ãÿ:¡Òÿ<¤Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ=¦Èÿ>¦Èÿ?¦ÉÿDªÂÿP³¦ÿhÈfÿiËgÿlÌjÿtÎrÿƒÓÿŸÜœÿ¶ä³ÿºä¸ÿ¡Ö ÿ|Á}ÿ_²bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿg¶jÿ‰È‰ÿªÚ©ÿÄéÁÿ¯â­ÿ–Ù”ÿ~Ñ|ÿoÍmÿkËiÿjËhÿjËhÿjËhÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöüöÿÞóÝÿŸÝžÿzÐxÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿiÉgÿgÅfÿK¬Ÿÿm¼ÔÿŽÕöÿmØùÿ]Ò÷ÿYÑ÷ÿ[Ñ÷ÿ[Ñ÷ÿXÑ÷ÿ^ÓøÿrÖøÿ™ÖöÿW¯ÃÿT´ŒÿgÆfÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿlÌjÿtÎrÿ„ÓÿŸÜÿ¶ä´ÿ»ä¹ÿ¢Ö¡ÿ|Á}ÿ_²bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿh¶jÿ‰È‰ÿªÚ©ÿÄéÁÿ°â­ÿ–Ù”ÿ~Ñ|ÿoÍmÿkËiÿjËhÿjËhÿjËhÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìøëÿÇëÆÿŸÝžÿ‡Õ…ÿwÏuÿnÌlÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿiÊgÿiÈgÿX¶ÿZ²»ÿnÀòÿ™åûÿfÕ÷ÿVÏöÿXÐöÿXÐöÿUÐöÿsÙøÿ†×÷ÿbµïÿW±¡ÿ^¼wÿiÉgÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿlÌjÿtÎrÿ„Óÿ Üÿ·ä´ÿ¼ä¹ÿ¢Ö¡ÿ}Á~ÿ_²bÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿh¶kÿ‰ÈŠÿ«Û©ÿÆéÂÿ±â®ÿ—Ù”ÿ~Ñ|ÿoÍmÿjËiÿiËhÿiËhÿiËhÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøüøÿé÷éÿÔðÔÿ¼è»ÿ©á¨ÿŽ×ÿuÏtÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiÊhÿiÊhÿa¾lÿO¯«ÿ\´ìÿ¯çûÿlÕ÷ÿVÏöÿVÎöÿVÎöÿSÎöÿ~Úøÿ‘ÕõÿB£èÿWµŒÿdÂkÿiÊhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿlÌjÿtÎrÿ„Ó‚ÿ Üžÿ¸äµÿ½äºÿ¢Ö¡ÿ}Á~ÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿh¶kÿŠÉŠÿ¬ÛªÿÇêÃÿ²â¯ÿ—Ù•ÿ~Ñ|ÿoÍmÿjËiÿiËgÿiËgÿiËgÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøüøÿîùîÿáôáÿÒïÑÿ¹ç¹ÿšÜ™ÿuÏsÿlÌjÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿfÅeÿO±šÿU¯Úÿ§ÜøÿtÕ÷ÿ[ÐöÿSÌõÿSÌõÿZÏöÿ‚×÷ÿŒÍîÿ: ÐÿZºÿgÇfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿlÌjÿtÎrÿ„Ó‚ÿ¡Üžÿ¹åµÿ¾å»ÿ£×¢ÿ}Â~ÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿh¶kÿŠÉ‹ÿ­Û«ÿÈêÄÿ²ã¯ÿ—Ú•ÿ~Ñ|ÿoÍmÿjËhÿiËgÿiËgÿiËgÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæöæÿ¼è»ÿŠÖˆÿqÍoÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhÉfÿZºÿY±®ÿ}ÂòÿƒÖ÷ÿkÔ÷ÿQÌõÿQÌõÿxØøÿÏõÿq¼ÛÿM¬˜ÿaÁrÿhÊfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿlÌjÿtÎrÿ„Ó‚ÿ¡ÝŸÿ¹å¶ÿ¿å»ÿ¤×£ÿ}Âÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿi¶kÿŠÉ‹ÿ­Û¬ÿÈêÄÿ³ã¯ÿ—Ú•ÿ~Ò|ÿnÍmÿjËhÿiËgÿiËgÿiËgÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìøëÿÓïÒÿ¹ç¸ÿ§à¥ÿ”Ú“ÿˆÕ†ÿ}Ò|ÿqÍoÿkËiÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhÊfÿcÂjÿXµŽÿJ§ìÿžÛøÿƒÛøÿLÊõÿLÊõÿ˜âùÿ~ÉóÿP¬Ìÿ]ºnÿeÆhÿhÊfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿkÌjÿsÎrÿ„Ó‚ÿ¡ÝŸÿºå¶ÿ¿å¼ÿ¤×£ÿ~Âÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿi¶kÿ‹ÉŒÿ­Ü¬ÿÉêÆÿ³ã°ÿ˜Ú•ÿ~Ò|ÿnÍmÿiËhÿhËgÿhËgÿhËgÿÙòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòúòÿæöæÿæöæÿØòØÿÐïÐÿÆëÅÿ³å³ÿ§à¦ÿ–Ú•ÿ…Õ„ÿyÐwÿlÌkÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿfÆdÿZ¹}ÿ= Ðÿ˜Óïÿ‡Ù÷ÿVÍõÿRÌõÿšÝøÿxÂäÿG©´ÿdÂcÿgÈfÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿkÌjÿsÎrÿ„Ô‚ÿ¢ÝŸÿºå·ÿÀå½ÿ¤×¤ÿ~€ÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿi¶kÿ‹ÉŒÿ®Ü­ÿÊëÇÿ³ã±ÿ˜Ú–ÿ~Ò|ÿnÍmÿiËhÿhËgÿhËgÿhËgÿÏîÏÿòúòÿòúòÿòúòÿòúòÿòúòÿñúñÿîùíÿç÷çÿåöåÿâõâÿÙòÙÿÙòÙÿÆëÆÿ³å³ÿ³å³ÿ ÞŸÿ“Ú’ÿ„ÔƒÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿfÈeÿ]½uÿD¥©ÿÄáÿ„ÓõÿrÖ÷ÿjÔöÿŠÐõÿm»ÍÿM®–ÿfÆeÿgÉfÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿkÌjÿsÎrÿ„Ô‚ÿ¢Ý ÿ»æ¸ÿÁæ¾ÿ¥Ø¤ÿ~€ÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿi¶kÿŒÉŒÿ¯Ü­ÿËëÈÿ´ã²ÿ˜Ú–ÿ~Ò|ÿnÍmÿiËhÿhËgÿhËgÿhËgÿ³å³ÿÍîÍÿÍîÍÿÍîÍÿÍîÍÿÍîÍÿÈìÈÿ»èºÿ¢ß¡ÿšÜ™ÿ׌ÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhÊgÿbÃnÿS±„ÿb´Õÿ‰Ïõÿ§èûÿŸåûÿuÂòÿ_µ´ÿ[¹tÿhÊgÿhÊgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿkÌjÿsÎrÿ„Ô‚ÿ¢Ý ÿ¼æ¹ÿÁæ¿ÿ¦Ø¥ÿ€ÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿi¶kÿŒÉŒÿ¯Ü®ÿËëÈÿ´ã²ÿ˜Ú–ÿ}Ò|ÿmÍlÿhËgÿgËfÿgËfÿgËfÿzÑyÿ€Óÿ€Óÿ€Óÿ€Óÿ€ÓÿÓ~ÿ|Ò{ÿuÐtÿsÏrÿpÎoÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgÊfÿeÇgÿ_½jÿF¨Çÿ€ÆðÿÂëûÿÀëûÿ^´ëÿO°§ÿaÁgÿgÊfÿgÊfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿjÌiÿrÎqÿƒÔ‚ÿ¢Ý ÿ¼æ¹ÿÁæÀÿ¦Ø¥ÿ€ÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿi¶lÿŒÉÿ¯Ü®ÿËëÉÿµä³ÿ˜Ú–ÿ}Ò|ÿmÍlÿhËgÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfÉeÿdÅcÿEªªÿt¿Ýÿ­Ý÷ÿ­Þ÷ÿY²ÌÿQ´ÿeÆdÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿjÌiÿrÎqÿƒÔ‚ÿ¢Þ¡ÿ¼æºÿÂæÀÿ¦Ø¦ÿ€ÿ`²cÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿi·lÿŒÊÿ°Ý¯ÿÌìÊÿµä³ÿ˜Û—ÿ}Ò|ÿmÍlÿhËgÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfÊeÿfÉeÿSµ‡ÿe¹Âÿ~Äòÿ~Äòÿ\µ¤ÿ[½wÿfÉeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿjÌiÿrÎqÿƒÔ‚ÿ£Þ¡ÿ½ç»ÿÂçÁÿ§Ø¦ÿÃÿ`²dÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿj·lÿÊŽÿ°Ý°ÿÍìËÿµä´ÿ™Û—ÿ~Ò|ÿmÍlÿhËgÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿaÁfÿV³ªÿL©íÿL©íÿ\º„ÿdÅcÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿjÌiÿrÎqÿ„Ô‚ÿ£Þ¢ÿ½ç¼ÿÃçÂÿ§Ø§ÿ€Ãÿa²dÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿj·lÿÊŽÿ±Ý°ÿÍìËÿ¶ä´ÿ™Û—ÿ}Ò}ÿlÌlÿgËgÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿdÇeÿV¸•ÿI«ÅÿI«Åÿ]¿|ÿeÈeÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿiÌiÿrÎqÿ„Ô‚ÿ¤Þ¢ÿ¾ç¼ÿÄçÂÿ§Ø§ÿ€Ãÿa²dÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿj·lÿÊŽÿ²Ý±ÿÎìÌÿ·åµÿšÛ˜ÿ~Ò}ÿlÌlÿgËgÿeÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿeÊeÿ^ÂyÿW»ŽÿW»ŽÿaÆoÿeÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿiÌiÿsÎrÿ„Ôƒÿ¥ß£ÿ¿ç½ÿÅçÃÿ¨Ù¨ÿ€Ã‚ÿa²dÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿj·mÿŽÊÿ²Þ±ÿÏíÍÿ¹å¸ÿœÜ›ÿ€Ò€ÿoÍnÿgÊgÿeÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿjÌiÿuÏtÿ†Õ…ÿ§à¦ÿÁè¿ÿÅèÄÿ©Ù¨ÿ€Ã‚ÿa²dÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿj·mÿŽÊÿ²Þ²ÿÐíÎÿ¾ç¼ÿ¢Ý¡ÿ†Ô…ÿuÏtÿiËhÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿfÊeÿmÌlÿzÑyÿŒ×‹ÿ­á¬ÿÄéÂÿÆèÄÿ©Ù©ÿÂÿa²dÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿj·mÿŽÊÿ³Þ³ÿÐíÎÿÂèÀÿ¯â®ÿ—Ú–ÿyÐyÿ{Ñzÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ|Ñ{ÿ{Ñzÿ„Ó‚ÿ¡Ý ÿ·äµÿÇêÅÿÇèÅÿ©Ù©ÿÂÿa²dÿO©SÿO©Sÿ*P 'T)ŠO©SÿO©Sÿc³fÿƒÄ„ÿ¥Ö¥ÿÂåÀÿÃçÂÿÀç¾ÿ·äµÿ§ß¦ÿÜœÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿšÛ™ÿ ÝŸÿ¬á«ÿ½ç»ÿÁç¿ÿÂæÀÿ¸à·ÿ›Ñœÿv½yÿ\°`ÿO©SÿO©Sÿ*P  'T)ˆN¨RüO©Sÿ[¯_ÿr»tÿŽÊÿ«Ú«ÿ½â¼ÿÈèÆÿÎëÌÿÓîÑÿ¿ç¾ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿ¹å¸ÿÅéÄÿÒîÐÿÒîÐÿÄçÃÿµß´ÿ¡Ô¡ÿ„ņÿh¶kÿW­[ÿN¨RþN¨Rü*O(U*‚N§RöO©SÿW¬Zÿc³eÿv½xÿ–Ï—ÿ®Û­ÿ½ã¼ÿÇèÆÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿÓîÑÿºá¹ÿ¤Õ¤ÿ‹ÈŒÿl¸nÿ^°aÿT«XÿN¨RüN§Rô)K ))))))ÚÚÚ  *V,sM¥QâO©SÿS«VÿZ®]ÿe´hÿv½yÿ‘Ì’ÿ¤Ö¤ÿ°Ü°ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿµß¶ÿžÓŸÿ†Æˆÿpºsÿ`±bÿW­ZÿQªUÿN§RõL¤PÙ)B AAA ///ÚÚÚ   ,W.\K¢O¾N§RðO¨SôT«WúZ®]ÿc³fÿu¼wÿƒÄ„ÿŒÉÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿ}Á€ÿm¸pÿ`±cÿW­ZÿRªUøO¨SóM¥QßJ N®(6  $$$ ???ììì!!! 'F(:>ƒA…L¤PÓM¦QäO¨SôS«VÿX­[ÿ]°`ÿc³fÿh¶kÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿk·nÿ`±cÿZ®]ÿU¬YÿRªUÿN§RïM¥QßF˜J¹6u9l $ ???ÏÏÏÌÌÌ...!!! 02J NªL¤PÓN§RðO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿM¦QèK£OÅ7x:‚ ???±±±333*3<‚?…K¢O¾M¦QäO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿN¨RúM¦QðL¥PÛJ N¯.c0j ) ÏÏÏÌÌÌœœœ<6IžMWL¤PmO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SO©SN¨R|M¦QuL¤PhJ¡NN6u9&¿¿¿þþüøøàÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀÀàðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(@€ Beme“““ 2@3 0>1 1@1 1A2 0A1 .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ .?/ ,<- +9, +8+ *7+ *6* )5* #1$R_SMMM;;;!!!"  &)-.////////////////////////////////////////////////,'$#  ((159:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:740%   1=w@ƒT¦XÍO§SöO¨SýO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©Sÿ4p7± 0Y2hY¨]ÝR¨V÷W®Xÿ\²\ÿ`µ_ÿ_µ_ÿ]³^ÿ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±[ÿZ±[ÿZ±[ÿZ±[ÿZ±[ÿV®XÿO©Sÿ4p7±@rB›R¦VõY¯Zýh¹eÿrÁmÿyÆsÿ{Ètÿ|Éuÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿ€Ëwÿm¾iÿPªTÿ4p7±6p8®V¬Xûc·bývÄpÿÌxÿ†Ï|ÿ†Ð|ÿˆÑ~ÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŠÓ€ÿŠÓ€ÿŒÓÿqÁmÿT­Wÿ4p7±4p7±Z°[þm½jþËxÿ†Ð|ÿƒÐyÿ‚ÐxÿÐwÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ‚Ðxÿ‡Ò|ÿÔ‚ÿrÁnÿU­Wÿ4p7±!4p7±[±[ÿqÀlÿ…Î{ÿ…Ð{ÿ€ÐwÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ€Ðvÿ†Ñ|ÿŽÔƒÿsÁnÿU­Wÿ4p7±%!4p7±Y¯ZÿsÁnÿŠÑ€ÿ†Ñ|ÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ‚Ñyÿ‘ÖŠÿ Ü™ÿ©ß£ÿ¥Ýžÿ˜Ùÿ…Ò|ÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ–Øÿ©ß£ÿ©ß£ÿ©ß£ÿ©ß£ÿ©ß£ÿ©ß£ÿ Ü™ÿÐvÿÐvÿÐvÿÐvÿƒÑ{ÿ Ü™ÿ©ß£ÿ©ß£ÿ©ß£ÿ©ß£ÿ©ß£ÿ©ß£ÿ’ÖŠÿÐvÿÐvÿÐvÿ†Ò|ÿÕ„ÿtÂoÿU­Wÿ4p7±&!4p7±U­XÿuÂpÿÕ…ÿ†Ò|ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ„Ò|ÿÊëÆÿçöåÿõûõÿÿÿÿÿúýúÿíøìÿÔïÑÿšÚ“ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿÅêÁÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâôàÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿŒÕ„ÿâôàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ä²ÿ~Ðuÿ~Ðuÿ~Ðuÿ†Ò|ÿÕ…ÿuÂpÿU­Xÿ4p7±&"4p7±U­XÿuÂqÿ‘Ö‡ÿ‡Ò}ÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿŸÜ˜ÿëøêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²ã­ÿ‚Ñzÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿÈëÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßóÜÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿŒÕ„ÿâôàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ä²ÿ~Ðuÿ~Ðuÿ~Ðuÿ‡Ò}ÿ‘Ö‡ÿuÂqÿU­Xÿ4p7±&"4p7±U­XÿvÃrÿ’Öˆÿ‡Ò}ÿ~Ðuÿ}Ðuÿ}Ðuÿ‰Ô‚ÿëøêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõûôÿ«à¦ÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ}ÐuÿÛòÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËìÈÿ}Ðuÿ}Ðuÿ}Ðuÿ}Ðuÿ‹Õ„ÿâôàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·ä²ÿ}Ðuÿ}Ðuÿ~Ðuÿ‡Ò}ÿ’ÖˆÿvÃrÿU­Xÿ4p7±&"4p7±U­XÿwÃsÿ“׉ÿ‡Ó~ÿ}Ðtÿ|ÐtÿÑyÿËìÈÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòúñÿ†Ó~ÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿÑwÿøü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´ä¯ÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ“Ø‹ÿê÷èÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥ß ÿ|Ðtÿ|Ðtÿ}Ðtÿ‡Ó~ÿ“׉ÿwÃsÿU­Xÿ4p7±'"4p7±U­XÿwÃsÿ”׋ÿ‡Ó~ÿ|Ðtÿ|Ðtÿ”Øÿëøêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬á§ÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ|Ðtÿ’Ø‹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§ß¢ÿ|Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿœÛ–ÿóúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ˜Ú’ÿ|Ðtÿ|Ðtÿ|Ðtÿ‡Ó~ÿ”׋ÿwÃsÿU­Xÿ4p7±'"4p7±V­XÿxÄtÿ–ØŒÿˆÒÿ|Ïtÿ{Ïsÿ¤ÝžÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌìÉÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{ÏsÿÀç¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíøìÿ•Øÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ§ß¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{Ïsÿ{Ïsÿ{Ïsÿ|ÏtÿˆÒÿ–ØŒÿxÄtÿV­Xÿ4p7±'"4p7±V­XÿzÄuÿ—ØÿˆÓÿ|Ïtÿ{Ïsÿ§ß¡ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓïÐÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ„Ò}ÿÜòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßóÞÿ‡Ó€ÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿºæ¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë÷êÿ{Ïsÿ{Ïsÿ{Ïsÿ|ÏtÿˆÓÿ—ØÿzÄuÿV­Xÿ4p7±'"4p7±V­YÿzÄvÿ˜ØÿˆÓÿ{ÏsÿzÏsÿžÜ™ÿöüöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂé¿ÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿ¦ß¡ÿøüøÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉëÆÿzÏsÿzÏsÿzÏsÿzÏsÿzÏsÿèöçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚñÙÿzÏsÿzÏsÿzÏsÿ{ÏsÿˆÓÿ˜ØÿzÄvÿV­Yÿ4p7±'"4p7±V­Yÿ{Äwÿ™ØÿˆÓ€ÿ{ÏsÿzÏrÿÖ‡ÿæöåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¡ÝœÿzÏrÿzÏrÿzÏrÿzÏrÿzÏrÿÚñÙÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿšÛ•ÿzÏrÿzÏrÿzÏrÿzÏrÿ€ÑyÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆêÃÿzÏrÿzÏrÿzÏrÿ{ÏsÿˆÓ€ÿ™Øÿ{ÄwÿV­Yÿ4p7±'"4p7±V­Yÿ{ÅxÿšÙ‘ÿˆÓ€ÿzÏsÿyÏrÿyÏrÿ­á©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚñØÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ§ß¢ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëøéÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿ Ý›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿ¢ÝÿyÏrÿyÏrÿyÏrÿzÏsÿˆÓ€ÿšÙ‘ÿ{ÅxÿV­Yÿ4p7±'"4p7±V­Yÿ|Åyÿ›Ù“ÿ‰ÓÿzÏsÿyÏrÿyÏrÿÑxÿ×ðÕÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë÷êÿ˜Ú“ÿyÏrÿyÏrÿyÏrÿyÏrÿ†ÓÿÜòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼ç¸ÿyÏrÿyÏrÿyÏrÿyÏrÿyÏrÿÈëÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿë÷êÿ‘׌ÿyÏrÿyÏrÿyÏrÿzÏsÿ‰Óÿ›Ù“ÿ|ÅyÿV­Yÿ4p7±'"4p7±V­Yÿ}ÅzÿÚ”ÿ‰ÔÿyÏsÿxÏqÿxÏqÿxÏqÿ‚Ò|ÿÁé¾ÿøü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿáôßÿŒÖ†ÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿÃé¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäõâÿŠÕ„ÿxÏqÿxÏqÿxÏqÿxÏqÿÖˆÿçöæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØñÖÿ~ÑxÿxÏqÿxÏqÿxÏqÿyÏsÿ‰ÔÿÚ”ÿ}ÅzÿV­Yÿ4p7±'"4p7±W­Yÿ~ÅzÿžÚ•ÿ‰Ô‚ÿyÏrÿxÏqÿxÏqÿxÏqÿxÏqÿ{Ðtÿ¤ß ÿÌíÉÿñúðÿÿÿÿÿøü÷ÿÝóÛÿ®âªÿ‡Ô€ÿxÏqÿxÏqÿxÏqÿxÏqÿxÏqÿ Ý›ÿøü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸æ´ÿyÏrÿxÏqÿxÏqÿxÏqÿxÏqÿ¨à£ÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾çºÿxÏqÿxÏqÿxÏqÿxÏqÿyÏrÿ‰Ô‚ÿžÚ•ÿ~ÅzÿW­Yÿ4p7±'"4p7±W­ZÿÆ|ÿŸÛ˜ÿŠÔƒÿyÎrÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿ Ýœÿñúðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçöæÿ}ÐwÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿÙñ×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿ„Ò~ÿwÎqÿwÎqÿwÎqÿwÎqÿyÎrÿŠÔƒÿŸÛ˜ÿÆ|ÿW­Zÿ4p7±'"4p7±W­ZÿÆ}ÿ¡Û™ÿŠÔƒÿxÎrÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿ‹Õ…ÿê÷éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøü÷ÿ«à¦ÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿ‘׌ÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàóßÿwÎpÿwÎpÿwÎpÿwÎpÿwÎpÿxÎrÿŠÔƒÿ¡Û™ÿÆ}ÿW­Zÿ4p7±'"4p7±W­Zÿ€Æ~ÿ¡ÜšÿŠÔƒÿxÎrÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿ£ÞŸÿê÷éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÃéÁÿyÏsÿvÎpÿvÎpÿvÎpÿvÎpÿ|ÐwÿÑîÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿ­â©ÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿxÎrÿŠÔƒÿ¡Üšÿ€Æ~ÿW­Zÿ4p7±'"4p7±W®ZÿÇ~ÿ¢Ü›ÿŠÔ„ÿwÎqÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿxÏsÿ¨à¤ÿõûôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê÷êÿ‚Ò~ÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿ—Ú“ÿòúòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãõâÿ‡ÔƒÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿwÎqÿŠÔ„ÿ¢Ü›ÿÇ~ÿW®Zÿ4p7±'"4p7±W®ZÿÇÿ¤Ýÿ‹Ô„ÿwÎqÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿvÎpÿ‡Ô‚ÿËìÉÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãõâÿ‹Õ†ÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿxÏrÿãõâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«á§ÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿwÎqÿ‹Ô„ÿ¤ÝÿÇÿW®Zÿ4p7±'"4p7±W®Zÿ‚Ç€ÿ¥Ýžÿ‹Õ…ÿvÎqÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿ{Ðvÿ¶å³ÿãõâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿ—Ú”ÿvÎpÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿ§à¤ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿ{ÐuÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿvÎqÿ‹Õ…ÿ¥Ýžÿ‚Ç€ÿW®Zÿ4p7±'"4p7±W®ZÿƒÈÿ¦ÞŸÿ‹Õ…ÿvÎpÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿwÏrÿŒÖ‡ÿ¹æ·ÿñúðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûôÿ¬á©ÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿ‘Øÿê÷éÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿ³ä°ÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿtÎnÿvÎpÿ‹Õ…ÿ¦ÞŸÿƒÈÿW®Zÿ4p7±'"4p7±X®[ÿ„È‚ÿ§Þ¡ÿŒÕ…ÿuÎpÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿ„Óÿ§à£ÿÌíËÿè÷çÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿ«á¨ÿxÏsÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿÜòÛÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßôÞÿ‚Ó~ÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿuÎpÿŒÕ…ÿ§Þ¡ÿ„È‚ÿX®[ÿ4p7±'"4p7±X®[ÿ…ȃÿ©ß¢ÿŒÕ†ÿtÍpÿrÍnÿŒÖˆÿÀé¾ÿØñ×ÿíøíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáôàÿ”Ù‘ÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿwÎsÿÁè¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿ”Ù‘ÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿtÍpÿŒÕ†ÿ©ß¢ÿ…ȃÿX®[ÿ4p7±'"4p7±X®[ÿ…Ƀÿ©ß£ÿ‹Õ†ÿtÍoÿrÍmÿ¡ÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛòÚÿ†Ô‚ÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿ«á¨ÿôûôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÑïÏÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿtÍoÿ‹Õ†ÿ©ß£ÿ…ɃÿX®[ÿ4p7±'"4p7±X®[ÿ†É„ÿ«ß¥ÿŒÕ‡ÿsÍoÿqÍmÿ Ýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôûôÿ·åµÿ|ÐwÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿsÍnÿÜ™ÿüüüÿêêêÿÛÛÛÿåååÿøøøÿþþþÿÿÿÿÿÿÿÿÿáôàÿ†Ô‚ÿqÌlÿoÇjÿf·aÿa¯]ÿh»dÿpÊkÿqÍmÿqÍmÿqÍmÿsÍoÿŒÕ‡ÿ«ß¥ÿ†É„ÿX®[ÿ4p7±'"4p7±X®[ÿ‡É…ÿ¬à¦ÿÖ‡ÿsÍoÿqÍmÿ ÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßóÞÿœÜšÿtÎpÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿ•Ù’ÿé÷éÿøøøÿ˜Ããÿb§Úÿƒ±ÓÿÚÚÚÿõõõÿþþþÿÿÿÿÿ“Ù‘ÿqÌmÿlÄhÿa¯]ÿGœ–ÿ?š¶ÿP©˜ÿnÇjÿqÍmÿqÍmÿqÍmÿsÍoÿÖ‡ÿ¬à¦ÿ‡É…ÿX®[ÿ4p7±'"4p7±X®[ÿˆÉ†ÿ­à§ÿÖˆÿsÍnÿpÍlÿ ÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿÙñØÿ¨à¥ÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿuÎqÿ£Þ ÿ÷ü÷ÿÿÿÿÿúúúÿ}¼ëÿ˜îýÿdÌ÷ÿ`ªßÿºÈÒÿëîëÿ®á«ÿoËkÿjÀfÿW¥kÿC ÁÿaÉöÿ—îýÿL¬µÿnÉjÿpÍlÿpÍlÿpÍlÿsÍnÿÖˆÿ­à§ÿˆÉ†ÿX®[ÿ4p7±'"4p7±X®[ÿ‰Ê‡ÿ®á©ÿÖˆÿrÍnÿpÍlÿŸÝÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÔðÓÿ¦à¤ÿ~ÑzÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿ©á§ÿôûôÿÿÿÿÿÿÿÿÿýýýÿ¬Òìÿ{Ó÷ÿƒêÿÿdÐ÷ÿ\®ãÿ–»©ÿp¿mÿf»cÿW¥hÿD¤ÍÿbÎöÿ‚êÿÿ~ÖøÿV³“ÿoËkÿpÍlÿpÍlÿpÍlÿrÍnÿÖˆÿ®á©ÿ‰Ê‡ÿX®[ÿ4p7±("4p7±Y®\ÿ‰Êˆÿ°áªÿŽÖˆÿrÍnÿoÍkÿŸÝœÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ü÷ÿåöåÿÔðÓÿ¯ã¬ÿ„ÔÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿÒ|ÿ¿è½ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðòóÿc¼ðÿˆèýÿtåýÿráýÿO³ÛÿL…ÿKœ…ÿL°Ûÿsáýÿuåýÿ†èýÿ_»ìÿiÃiÿoÍkÿoÍkÿoÍkÿoÍkÿrÍnÿŽÖˆÿ°áªÿ‰ÊˆÿY®\ÿ4p7±("4p7±Y®\ÿŠÊ‰ÿ°â«ÿŽÖ‰ÿqÍmÿoÍkÿ”Ù‘ÿßóÞÿÌíËÿ¿é½ÿŸÝœÿ—Û•ÿ…Õ‚ÿtÎpÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿ„Ô€ÿ×ñÖÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿùùùÿp»ëÿ‰áûÿpáýÿrâýÿoßüÿYÂæÿV¾æÿoÞüÿrâýÿpáýÿ†áûÿV±ÏÿlÈhÿoÍkÿoÍkÿoÍkÿoÍkÿqÍmÿŽÖ‰ÿ°â«ÿŠÊ‰ÿY®\ÿ4p7±("4p7±Y®\ÿ‹Ê‰ÿ²â­ÿŽÖŠÿqÌmÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿ|Ñyÿ»ç¹ÿôûôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿ¢Ìëÿ…Õøÿnßüÿoßüÿoßüÿpàüÿpàüÿoßüÿoßüÿmßüÿ„ÔøÿU±›ÿnËkÿnÌkÿnÌkÿnÌkÿnÌkÿqÌmÿŽÖŠÿ²â­ÿ‹Ê‰ÿY®\ÿ4p7±(#4p7±Y®\ÿ‹ËŠÿ³ã®ÿŽÖŠÿpÌmÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿnÌjÿœÜ™ÿÕðÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿ«ÎØÿvÆèÿuáûÿlÝûÿlÝûÿlÝûÿlÝûÿlÝûÿlÝûÿkÞûÿuÅçÿW±‚ÿmËiÿnÌjÿnÌjÿnÌjÿnÌjÿpÌmÿŽÖŠÿ³ã®ÿ‹ËŠÿY®\ÿ4p7±(#4p7±Y®\ÿŒËŒÿ´ã°ÿÖ‹ÿpÌmÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿ{Ñxÿ¨à¦ÿåöåÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿô÷ôÿºÖ¹ÿP ŽÿT²ÞÿiÝûÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿiÛúÿjÝûÿT²ÞÿJžˆÿb¶_ÿjÇgÿmËjÿmÌjÿmÌjÿpÌmÿÖ‹ÿ´ã°ÿŒËŒÿY®\ÿ4p7±(#4p7±Y®\ÿËÿµä±ÿÖ‹ÿpÌmÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿ‚Óÿ¹æ·ÿÜóÜÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿùùùÿ›Æ™ÿT¡“ÿL´áÿbÔøÿgÛúÿgÚúÿgÚúÿgÚúÿgÚúÿgÚúÿgÚúÿgÛúÿbÔøÿL´áÿJž‰ÿ_°\ÿkÇhÿlËiÿmÌjÿpÌmÿÖ‹ÿµä±ÿËÿY®\ÿ4p7±(#4p7±Y®]ÿŽÌÿ·ä³ÿ׌ÿoÌmÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿqÍoÿƒÔÿ•Ú”ÿ²ä±ÿÝóÝÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþÿÔæÔÿxµ…ÿH¢®ÿUÂóÿfÚùÿdØùÿd×ùÿd×ùÿd×ùÿd×ùÿd×ùÿd×ùÿd×ùÿd×ùÿdØùÿfÚùÿUÂóÿH¢®ÿX©cÿe¿cÿkËiÿoÌmÿ׌ÿ·ä³ÿŽÌÿY®]ÿ4p7±(#4p7±Y®]ÿÌŽÿ¸ä´ÿ׌ÿnÌlÿkÌiÿvÏtÿŒ×ŠÿŒ×ŠÿŒ×Šÿ­â«ÿÃêÁÿÓïÒÿåöäÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿÃæÃÿh®ÿF¤¸ÿYËöÿbÖùÿaÖùÿaÖùÿaÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿbÖùÿaÖùÿaÖùÿaÖùÿbÖùÿYËöÿE¤¸ÿT§mÿhÆfÿnÌlÿ׌ÿ¸ä´ÿÌŽÿY®]ÿ4p7±(#4p7±Z®]ÿÌÿ¸å¶ÿ×ÿnÌlÿkÌiÿœÝ›ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿÞóÝÿØÿfÂdÿQ¯×ÿÞùÿßúÿ€ßúÿ€Þúÿ€ÞúÿßúÿqÚøÿ]Ôøÿ_Ôøÿ_Ôøÿ]ÔøÿqÚøÿ€Þúÿ€Þúÿ€Þúÿ€ßúÿßúÿ€ÝùÿZµØÿfÁdÿnÌlÿ×ÿ¸å¶ÿÌÿZ®]ÿ4p7±(#4p7±Z¯]ÿÍÿºå·ÿØÿnÌlÿjÌhÿ›Ýšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðúïÿ­ã¬ÿzÑxÿjÌhÿhÈfÿL«ßÿgºðÿd¸ðÿd¸ðÿd¸ðÿd¸ðÿc·ïÿÖöÿYÑ÷ÿ]Ò÷ÿ]Ò÷ÿYÒ÷ÿŒ×öÿe¸ðÿd¸ðÿd¸ðÿd¸ðÿd¸ðÿf¹ðÿR®åÿhÇfÿnÌlÿØÿºå·ÿÍÿZ¯]ÿ4p7±(#4p7±Z¯]ÿ‘Í‘ÿ»æ¸ÿ×ÿmÌkÿjËhÿ›Üšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿáôáÿ¤ß£ÿqÍoÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿ]¼yÿm¼×ÿrÙøÿXÐöÿXÐöÿmØøÿn½×ÿ]¼yÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿmÌkÿ×ÿ»æ¸ÿ‘Í‘ÿZ¯]ÿ4p7±(#4p7±Z¯]ÿ’Í’ÿ½æ¹ÿ׎ÿmÌkÿiËhÿ›ÜšÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿÝóÝÿžÝÿ}Ñ|ÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿfÆiÿHª½ÿ“ßùÿVÎöÿTÎöÿÞøÿIª½ÿfÆiÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿiËhÿmÌkÿ׎ÿ½æ¹ÿ’Í’ÿZ¯]ÿ4p7±(#4p7±Z¯]ÿ“Í“ÿ¾ç»ÿ‘×ÿlÌkÿiËgÿ›Ü™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿè÷èÿÔðÓÿ¶æ¶ÿwÏuÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿhÊfÿ[º{ÿxÅóÿhÓöÿgÓöÿwÅòÿ[º{ÿhÊfÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿlÌkÿ‘×ÿ¾ç»ÿ“Í“ÿZ¯]ÿ4p7±(#4p7±Z¯^ÿ“Δÿ¿ç¼ÿ‘ØÿlÌkÿhËgÿšÜ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè÷èÿÕñÕÿ¿é¾ÿ–Û•ÿ„ÔƒÿoÍnÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿeÅdÿd¶×ÿwÔöÿrÓöÿc¶×ÿfÅdÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿlÌkÿ‘Øÿ¿ç¼ÿ“ΔÿZ¯^ÿ4p7±(#4p7±Z¯^ÿ”ΔÿÁç¾ÿ‘ØÿkÌjÿgËfÿ~Ò}ÿ«âªÿ«âªÿ«âªÿ—Û–ÿ‰ÖˆÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgÊfÿW³Ÿÿ•ÕõÿÔõÿYµšÿgÊfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿkÌjÿ‘ØÿÁç¾ÿ”ΔÿZ¯^ÿ4p7±(#4p7±Z¯^ÿ•ΕÿÁè¿ÿ‘ØÿkÌjÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿX»ÿÆáÿ‚ÇßÿY»}ÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿkÌjÿ‘ØÿÁè¿ÿ•ΕÿZ¯^ÿ4p7±(#4p7±[¯^ÿ•ΖÿÃèÁÿ‘ØÿjÌjÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿeÇfÿR±´ÿR²³ÿeÈdÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿfËfÿjÌjÿ’ØÿÃèÁÿ•Ζÿ[¯^ÿ4p7±(#4p7±[¯^ÿ–Ï—ÿÄéÂÿ“Ø‘ÿjËjÿeÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿeÊeÿ_Ãwÿ_ÃwÿeÊeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿkÌjÿ“Ù‘ÿÄéÂÿ–Ï—ÿ[¯^ÿ4p7±("4p7±[¯^ÿ—ϘÿÉêÇÿ¢Ý ÿtÎsÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿpÍoÿtÎsÿ¢Þ ÿÉêÇÿ—Ϙÿ[¯^ÿ4p7±("4p7±W­Zÿ†Æˆÿ¿ä¾ÿÃèÂÿ¯â­ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ¢Þ¡ÿ®â­ÿÄèÂÿ¾ä½ÿ†ÆˆÿW­Zÿ4p7±. ' 5p7ŸQªUÿa²dÿ“Í”ÿ´Þ´ÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿÆçÅÿ»âºÿ‘Ì’ÿa²dÿQªUÿ3n6  :I: >l@%4% 6o9pN§RíS«Wûgµiÿ}Áÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿ‡Æ‰ÿÂÿe´hÿS«WûN§Rí1j4q '7(@oA=]> :~=M¥QáO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿN¨RüM¥Qá:}=  BjCGtI?b@FsGY›[=]¡_Ua§cUh³jUnºpUr¾tUt¿vUt¿vUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUs¿uUt¿vUs¿uUp¼rUm¸oUe®gU`¥bR[ž]=HwIFpGðàÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€Àÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ(0` €%x}x `ea 7A8 7B7 7C7 5B6 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 5A5 3?4 2=3 2<2 1;2 1:1 7>8!!! !&'''''''''''''''''''''''''''''''''''''"   &168::::::::::::::::::::::::::::::::::::73/#0IŒMP¦TïO¨SýO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©Sÿ'T)Š0U2oT§XïY°Zþg¹eÿo¿kÿoÀkÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿm¾iÿO©Sÿ'T)Š)T+†V¬Xûk¼hþËwÿ…Ï{ÿ…Ï|ÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿŒÔÿ‹Ó€ÿ‹Ó€ÿƒÍzÿW¯Yÿ'T)Š'T)Š\²]þyÆsþ†Ð|ÿƒÐyÿÐxÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€Ðvÿ€ÐvÿÐwÿ‡Ò}ÿ…Î|ÿX¯Yÿ'T)Š'T)Š]²]ÿÉwÿ†Ñ|ÿ€ÐwÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿÐvÿ‡Ò}ÿ†Ï~ÿX¯Zÿ'T)Š'T)ŠX¯ZÿˆÏÿˆÒ}ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ›Ú”ÿ×ðÔÿôûóÿÿÿÿÿæõäÿ¾çºÿ‚Ñyÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~ÐuÿÔïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ~Ðuÿ~Ðuÿ~Ðuÿ“ØŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ß£ÿ~Ðuÿ~ÐuÿˆÒ}ÿˆÏÿX¯Zÿ'T)Š'T)ŠX¯Zÿ‰ÐÿˆÒ~ÿ~Ðuÿ~Ðuÿ~Ðuÿ³ã®ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿˆÔ€ÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ~Ðuÿ×ðÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿåõäÿ~Ðuÿ~Ðuÿ~Ðuÿ“ØŒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©ß£ÿ~Ðuÿ~ÐuÿˆÒ~ÿ‰ÐÿX¯Zÿ'T)Š'T)ŠY¯[ÿ‹Ðƒÿ‰Óÿ}Ðuÿ}ÐtÿÛ—ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞóÜÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}Ðtÿ}ÐtÿðùïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÏîÌÿ}Ðtÿ}Ðtÿ}Ðtÿ–Ùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤Þžÿ}Ðtÿ}Ðuÿ‰Óÿ‹ÐƒÿY¯[ÿ'T)Š'T)ŠY¯[ÿŒÑ„ÿ‰Ó€ÿ|Ðtÿ|ÐtÿÞóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿœÛ–ÿ|Ðtÿ|Ðtÿ|Ðtÿ|ÐtÿŠÕƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½ç¹ÿ|Ðtÿ|Ðtÿ|Ðtÿ«à¦ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‘Ø‹ÿ|Ðtÿ|Ðtÿ‰Ó€ÿŒÑ„ÿY¯[ÿ'T)Š'T)ŠY¯[ÿŽÒ†ÿŠÓÿ|Ïtÿ{Ïsÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹åµÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿ²ã­ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Üšÿ{Ïsÿ{Ïsÿ{Ïsÿ½ç¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{Ïsÿ{Ïsÿ|ÏtÿŠÓÿŽÒ†ÿY¯[ÿ'T)Š'T)ŠZ¯[ÿÒˆÿŠÔÿ{Ïsÿ{Ïsÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¹åµÿ{Ïsÿ{Ïsÿ{Ïsÿ{Ïsÿáôßÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‚Ñzÿ{Ïsÿ{Ïsÿ{ÏsÿÞóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿé÷èÿ{Ïsÿ{Ïsÿ{ÏsÿŠÔÿÒˆÿZ¯[ÿ'T)Š'T)ŠZ¯\ÿ‘ÓŠÿ‹Ô‚ÿ{ÏsÿzÏrÿÝóÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›Û•ÿzÏrÿzÏrÿzÏrÿ›Û•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚñØÿzÏrÿzÏrÿzÏrÿ}ÐvÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÖðÔÿzÏrÿzÏrÿ{Ïsÿ‹Ô‚ÿ‘ÓŠÿZ¯\ÿ'T)Š'T)ŠZ°\ÿ’Ó‹ÿ‹ÔƒÿzÏsÿyÏrÿšÛ•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝóÛÿyÏrÿyÏrÿyÏrÿyÏrÿäõãÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ©à¤ÿyÏrÿyÏrÿyÏrÿšÛ•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ´ä°ÿyÏrÿyÏrÿzÏsÿ‹Ôƒÿ’Ó‹ÿZ°\ÿ'T)Š'T)ŠZ°\ÿ”ÔÿŒÔ„ÿyÏsÿxÏrÿxÏrÿ°ã¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿè÷çÿƒÓ}ÿxÏrÿxÏrÿxÏrÿ¬á¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïùïÿ|ÐuÿxÏrÿxÏrÿxÏrÿÇëÄÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽ×‰ÿxÏrÿxÏrÿyÏsÿŒÔ„ÿ”ÔÿZ°\ÿ'T)Š'T)Š[°]ÿ–ÔÿŒÕ…ÿyÏrÿxÏqÿxÏqÿxÏqÿ–ÙÿÕðÓÿ÷ü÷ÿÿÿÿÿè÷çÿ»ç·ÿ{ÐtÿxÏqÿxÏqÿxÏqÿŽ×ˆÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ã«ÿxÏqÿxÏqÿxÏqÿ{Ðtÿ÷ü÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóûóÿxÏqÿxÏqÿxÏqÿyÏrÿŒÕ…ÿ–Ôÿ[°]ÿ'T)Š'T)Š[°]ÿ˜Õ‘ÿÕ†ÿxÎrÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿwÎqÿ‚Ò|ÿïùïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèöçÿzÏtÿwÎqÿwÎqÿwÎqÿ¤Þ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾ç»ÿwÎqÿwÎqÿwÎqÿxÎrÿÕ†ÿ˜Õ‘ÿ[°]ÿ'T)Š'T)Š[°]ÿ™Õ“ÿŽÕ†ÿwÎqÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿvÎpÿÒ{ÿèöçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”ØÿvÎpÿvÎpÿvÎpÿvÎpÿèöçÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ׋ÿvÎpÿvÎpÿvÎpÿwÎqÿŽÕ†ÿ™Õ“ÿ[°]ÿ'T)Š'T)Š[°^ÿšÖ•ÿŽÕ‡ÿwÎqÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿuÎpÿ”Øÿóûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ½è»ÿuÎpÿuÎpÿuÎpÿuÎpÿ£ÞŸÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜòÛÿuÎpÿuÎpÿuÎpÿuÎpÿwÎqÿŽÕ‡ÿšÖ•ÿ[°^ÿ'T)Š'T)Š\°^ÿœ×–ÿŽÕˆÿvÎpÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿuÎoÿxÏsÿ²ã®ÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÐîÏÿuÎoÿuÎoÿuÎoÿuÎoÿxÏsÿïùîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ—Ú’ÿuÎoÿuÎoÿuÎoÿuÎoÿvÎpÿŽÕˆÿœ×–ÿ\°^ÿ'T)Š'T)Š\°^ÿž×˜ÿÖ‰ÿuÎpÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿwÏsÿ­âªÿïùîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãõãÿwÏsÿtÎoÿtÎoÿtÎoÿtÎoÿ½ç»ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãõãÿtÎoÿtÎoÿtÎoÿtÎoÿtÎoÿuÎpÿÖ‰ÿž×˜ÿ\°^ÿ'T)Š'T)Š\°_ÿŸØšÿÖ‰ÿuÎoÿsÎnÿsÎnÿsÎnÿwÏrÿ–Ú’ÿ½çºÿóûóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãõâÿÒzÿsÎnÿsÎnÿsÎnÿsÎnÿ–Ú’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’ØŽÿsÎnÿsÎnÿsÎnÿsÎnÿsÎnÿuÎoÿÖ‰ÿŸØšÿ\°_ÿ'T)Š'T)Š\°_ÿ¡ØœÿÖŠÿtÍoÿrÍnÿÐîÎÿãõâÿûýûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌìÊÿvÎrÿrÍnÿrÍnÿrÍnÿrÍnÿ~ÑzÿóúóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÈëÆÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿrÍnÿtÍoÿÖŠÿ¡Øœÿ\°_ÿ'T)Š'T)Š]±_ÿ¢ÙÿÖ‹ÿsÍoÿrÍmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûýûÿ°ã­ÿrÍmÿrÍmÿrÍmÿrÍmÿrÍmÿyÏuÿæõåÿõõõÿ÷÷÷ÿþþþÿÿÿÿÿÿÿÿÿóúóÿ}ÑyÿqÌlÿnÆiÿmÄiÿqÌlÿrÍmÿrÍmÿsÍoÿÖ‹ÿ¢Ùÿ]±_ÿ'T)Š'T)Š]±_ÿ¤ÚŸÿ‘׌ÿsÍnÿqÍmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿßóÞÿŒÖ‰ÿqÍmÿqÍmÿqÍmÿqÍmÿqÍmÿtÎqÿ×ðÖÿõõõÿ±ÖÿµÒÿãããÿýýýÿÿÿÿÿ”Ù‘ÿpËlÿe¶aÿJŒÿGœÿlÄiÿqÍmÿqÍmÿsÍnÿ‘׌ÿ¤ÚŸÿ]±_ÿ'T)Š'T)Š]±`ÿ¥Ú¡ÿ’×ÿrÍnÿpÍlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿçöæÿŸÝœÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿ|ÑxÿßóÞÿÿÿÿÿøøøÿsÈñÿsÙúÿb¬ßÿÖÙÛÿ´â²ÿnÉjÿ`¯aÿD¡¿ÿqØùÿlÆéÿmÇiÿpÍlÿpÍlÿrÍnÿ’×ÿ¥Ú¡ÿ]±`ÿ'T)Š'T)Š]±`ÿ§Û¢ÿ’ØÿrÍnÿpÍlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷üöÿËìÉÿ“ÙÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿpÍlÿƒÔ€ÿçöæÿÿÿÿÿÿÿÿÿþþþÿ†ÃìÿŽìþÿsâüÿ[³áÿX¦gÿX¦gÿK¬ÑÿràüÿìþÿV³¸ÿoÌkÿpÍlÿpÍlÿrÍnÿ’Øÿ§Û¢ÿ]±`ÿ'T)Š'T)Š^±`ÿ¨Û¤ÿ“ØŽÿqÍmÿoÍkÿçöæÿÖñÕÿÃêÁÿ¯ã¬ÿŽØ‹ÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿoÍkÿŸÝœÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«ÑíÿˆßúÿqáýÿsãýÿW¾äÿT»ãÿsãýÿqáýÿ†ßúÿU³”ÿoÍkÿoÍkÿoÍkÿqÍmÿ“ØŽÿ¨Û¤ÿ^±`ÿ'T)Š'T)Š^±aÿªÜ¦ÿ“ØÿpÌmÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿnÌkÿ~Ñ{ÿÒïÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìñõÿrÇôÿnßüÿoßüÿoàüÿoàüÿoßüÿmßüÿqÇôÿgÂmÿnÌkÿnÌkÿnÌkÿpÌmÿ“ØÿªÜ¦ÿ^±aÿ'T)Š'T)Š^±aÿ«Ý¨ÿ”ØÿoÌlÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿ}Ñzÿ¾è¼ÿ÷üöÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýýýÿÂÚÁÿZ¯ÎÿoßûÿkÜûÿkÜûÿkÜûÿkÜûÿkÝûÿY®Íÿc¸`ÿmËiÿmÌjÿmÌjÿoÌlÿ”Øÿ«Ý¨ÿ^±aÿ'T)Š'T)Š^±aÿ­Ýªÿ”Ø‘ÿoÌlÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿmÌjÿ‘ØÿÆëÅÿûýúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûûûÿ£Ê¡ÿF ­ÿ\ÌöÿhÛúÿhÚúÿhÚúÿhÚúÿhÚúÿhÛúÿ\ÌöÿF ­ÿ_±\ÿkÉhÿmÌjÿoÌlÿ”Ø‘ÿ­Ýªÿ^±aÿ'T)Š'T)Š_±bÿ¯Þ¬ÿ•Ù’ÿnÌlÿlÌiÿlÌiÿlÌiÿlÌiÿlÌiÿxÐvÿœÝ›ÿÁéÀÿê÷êÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìôìÿx´†ÿI«ËÿbÔøÿdØùÿd×ùÿd×ùÿd×ùÿd×ùÿd×ùÿd×ùÿdØùÿbÔøÿI«ËÿW¨dÿhÆfÿnÌlÿ•Ù’ÿ¯Þ¬ÿ_±bÿ'T)Š'T)Š_±bÿ°Þ®ÿ•Ù’ÿmÌkÿkÌiÿÍîÍÿÍîÍÿÚòÙÿòúòÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅëÄÿ_²|ÿL¸äÿ]Öøÿ\Ôøÿ\Ôøÿ]Õøÿ_ÕøÿaÕøÿaÕøÿ_Õøÿ]Ôøÿ\Ôøÿ\Ôøÿ]ÖøÿK¸ãÿX°tÿmÌkÿ•Ù’ÿ°Þ®ÿ_±bÿ'T)Š'T)Š_²bÿ±ß¯ÿ–Ú“ÿmÌkÿjÌhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝóÝÿ‹×‰ÿjÌhÿQ³ŸÿƒÊôÿÈóÿÈóÿÈóÿ~ÆóÿzÛøÿ]Ò÷ÿ]Ò÷ÿxÛøÿ€ÈóÿÈóÿÈóÿÈóÿ‚ÉôÿY·£ÿmÌkÿ–Ú“ÿ±ß¯ÿ_²bÿ'T)Š'T)Š_²bÿ³ß±ÿ–Ù”ÿlÌjÿjËhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙñÙÿ×ÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿjËhÿ[¹~ÿÐöÿWÐöÿWÐöÿ{Ïõÿ[¹~ÿjËhÿjËhÿjËhÿjËhÿjËhÿlÌjÿ–Ù”ÿ³ß±ÿ_²bÿ'T)Š'T)Š`²cÿµà³ÿ—Ù•ÿlÌjÿiËgÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòúòÿ¸æ·ÿÓ€ÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿiËgÿgÈfÿl»Ùÿ`Ñöÿ^Ðöÿm¼ÙÿgÈfÿiËgÿiËgÿiËgÿiËgÿiËgÿlÌjÿ—Ù•ÿµà³ÿ`²cÿ'T)Š'T)Š`²cÿ·áµÿ˜Ú•ÿkÌjÿhËgÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæöæÿÐïÐÿ«âªÿÓ€ÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿP±™ÿ‡Ù÷ÿ‚Ø÷ÿQ±™ÿhËgÿhËgÿhËgÿhËgÿhËgÿhËgÿkÌjÿ˜Ú•ÿ·áµÿ`²cÿ'T)Š'T)Š`²cÿ¸á·ÿ˜Ú–ÿjÌiÿgËfÿšÜ™ÿšÜ™ÿ•Û”ÿ€ÓÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿaÁlÿƒÉòÿ€ÉòÿbÂjÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿjÌiÿ˜Ú–ÿ¸á·ÿ`²cÿ'T)Š'T)Š`²dÿ¹â¸ÿ˜Û—ÿjÌiÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿfÊeÿ`·ºÿb¸¶ÿfÊeÿgËfÿgËfÿgËfÿgËfÿgËfÿgËfÿjÌiÿ˜Û—ÿ¹â¸ÿ`²dÿ'T)Š'T)Ša²dÿ»âºÿšÛ˜ÿiËiÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿ^Âyÿ^ÂyÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿfËeÿiÌiÿšÛ˜ÿ»âºÿa²dÿ'T)Š'T)Ša²dÿ½ã¼ÿ«à©ÿvÏuÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿuÏtÿvÏuÿ«á©ÿ½ã¼ÿa²dÿ'T)Š(T*†V¬ZÿË‘ÿÄæÃÿÊëÈÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÂèÀÿÊëÈÿÇèÅÿËÿV¬Zÿ'T)‡AoB ,W.\O¨Só]°`ÿƒÄ„ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿË’ÿ„Ćÿ]°`ÿO¨Só%P'^ @nAHxJ8y;ˆN§RóO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿO©SÿN§Rð8x;ˆ# QƒSàÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ÿÿÿÿÿÿÿÿÿÿÿÿ( @ € 5BCCCCCCCCCCCCCCCCCCCCCC?.5S§WðU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿU«YÿJ•MÅ. T§Xï’Õ…ÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿÔÿ’Õ…ÿL˜OÁU«Yÿ“Ö‡ÿˆÒ~ÿ‡Ò}ÿ‡Ò}ÿ†Ò{ÿ†Ò{ÿ†Ò{ÿ‡Ò}ÿ‡Ò}ÿˆÒ~ÿ‡Ò}ÿ‡Ò}ÿ†Ò{ÿ†Ò{ÿ†Ò{ÿ†Ò{ÿ‡Ò}ÿ‡Ò}ÿ‡Ò}ÿ†Ò{ÿ†Ò{ÿ†Ò{ÿ†Ò{ÿ‡Ò}ÿˆÒ}ÿ“Ö‡ÿU«YÿT«Xÿ’Öˆÿ…Ò{ÿ„Ñ{ÿ€Ðvÿ{ÏqÿzÎoÿ{Ïqÿ€Ðvÿ„Ñ{ÿ…Ò|ÿ…Ò{ÿ‚Ñxÿ|ÏrÿzÎoÿzÎoÿ|Ïrÿ‚Ñxÿ„Ñ{ÿ‚Ñxÿ|ÏrÿzÎoÿzÎoÿ|Ïrÿ‚Ñxÿ…Ò{ÿ’ÖˆÿT«XÿT«Xÿ•׊ÿ„ÑzÿÐuÿÜ–ÿÿÿÿÿÿÿÿÿÿÿÿÿÜ–ÿÐuÿ„Ñ{ÿƒÑzÿ{Ïpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{Ïqÿ‚Ñxÿ{Ïqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{ÏqÿƒÑyÿ•׊ÿT«XÿT«Xÿ—ÙÿÑxÿyÎpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyÎoÿÑxÿ€ÐxÿvÍlÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxÎnÿ~ÐvÿvÍmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwÎmÿ€Ðxÿ—ÙÿT«XÿT«Xÿ™Úÿ€ÐwÿwÎmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÕƒÿÐwÿ}ÐtÿšÚ“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿwÎmÿ|Ðsÿ‡Ô€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvÍmÿ€Ðwÿ™ÚÿT«XÿS«Xÿ›Ú“ÿ~ÐvÿwÎnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvÎmÿ~ÐvÿyÏpÿ´ä¯ÿÿÿÿÿÿÿÿÿÿÿÿÿçöåÿwÎnÿzÏrÿ™Ú“ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuÍmÿ~Ðvÿ›Ú“ÿS«XÿS«XÿœÛ•ÿ~ÐvÿzÏqÿ¤ÞŸÿÿÿÿÿÿÿÿÿÿÿÿÿ¤ÞŸÿzÏqÿ|ÐtÿsÍkÿðùîÿÿÿÿÿÿÿÿÿÿÿÿÿµä±ÿxÎpÿxÎpÿ´ä°ÿÿÿÿÿÿÿÿÿÿÿÿÿæöäÿvÎmÿ}ÐuÿœÛ•ÿS«XÿS«Xÿ Ü™ÿ|Ðuÿ|ÐuÿyÏqÿtÍmÿrÍkÿtÍmÿxÏpÿzÐsÿvÎoÿžÝ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ„Ò~ÿyÏqÿtÍmÿÜòÚÿÿÿÿÿÿÿÿÿÿÿÿÿÉëÄÿvÎoÿ|Ðtÿ Ü™ÿS«XÿS«Xÿ¢Ýœÿ|Ðtÿ}Ðvÿ}Ðvÿ|Ðuÿ{ÐtÿzÐsÿzÏsÿuÎnÿŠÕ…ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÝòÛÿtÍmÿyÏqÿpÌhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ Ý›ÿxÏpÿzÐsÿ¢ÝœÿS«XÿR«Vÿ¤ÞŸÿzÐsÿ{Ðtÿ{ÐtÿyÏsÿxÏqÿuÎoÿoÌiÿÜ™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌÿf§bÿoÂjÿuÎoÿžÝšÿÿÿÿÿÿÿÿÿñññÿÌÌÌÿ`¥ZÿxÏrÿyÏsÿ¤ÞŸÿR«VÿR«Vÿ§ß¡ÿxÏqÿwÏpÿqÍkÿmËfÿ‰Õ…ÿ¦ß¢ÿåõäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ®îÿ8¡êÿT£€ÿ]ªXÿåõäÿÿÿÿÿÖÖÖÿ£¿Ôÿ=¥ìÿA¨íÿyÏsÿxÏrÿ§ß¡ÿR«VÿR«Vÿ¨à£ÿuÎoÿnÌiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓïÑÿT´àÿcÓ÷ÿC±ïÿE¡ÔÿÊËÌÿÊËÌÿT¦äÿC±ïÿmÖ÷ÿL¬àÿwÏrÿvÏpÿ¨à£ÿR«VÿRªUÿ¬à§ÿsÎmÿjÊeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥à¢ÿmÌhÿN­²ÿƒßùÿTÏöÿOÂôÿ=¤ìÿ=¤ìÿOÂôÿTÏöÿ}ÚøÿM«²ÿwÏrÿuÎoÿ¬à§ÿRªUÿRªUÿ¯âªÿqÍmÿhÊcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæöæÿ{ÐxÿnÌjÿsÎnÿ[»˜ÿ{Õ÷ÿiÕ÷ÿXÐöÿ[Ò÷ÿ[Ò÷ÿXÐöÿiÖøÿwÍõÿ`½›ÿvÏqÿsÎoÿ¯âªÿRªUÿRªUÿ±ã®ÿqÍlÿkËfÿÿÿÿÿÿÿÿÿÿÿÿÿåöäÿ¯ã­ÿ{ÐxÿkËfÿpÍlÿrÎmÿnÌjÿb²_ÿV½òÿ’ãûÿ[Ò÷ÿ]Ò÷ÿ]Ò÷ÿ[Ò÷ÿâúÿR¶ñÿg´cÿuÏpÿsÎnÿ±ã®ÿRªUÿRªUÿ´ä±ÿpÍmÿpÍmÿjËfÿgÊbÿgÊbÿhÊeÿlÌhÿnÍkÿoÍlÿlÌiÿgÊbÿ|²yÿl¬ÞÿRÂôÿ„àûÿ]Õøÿ_Õøÿ_Õøÿ]Õøÿ„áûÿO¿óÿCž³ÿ^¨\ÿpÍmÿ´ä±ÿRªUÿQªUÿ¶æ³ÿoÍlÿqÎnÿpÍmÿnÍkÿmÌjÿlÌhÿjËfÿgÊdÿcÉ`ÿ¢ß ÿ·Ç¶ÿD¡æÿQÃôÿ`Ùúÿ^×ùÿ`Öùÿc×ùÿc×ùÿ`Öùÿ^×ùÿ`ÚúÿRÃôÿ9ÛÿZ¥Wÿ¶æ³ÿQªUÿQªUÿ¹ç¶ÿmÍjÿmÍjÿgÊdÿcÉ`ÿŽØŒÿ‹×‰ÿ·æ¶ÿØñÖÿÿÿÿÿÿÿÿÿ@¢êÿ—ÚøÿÌûÿÿÈøþÿÛúþÿ}áüÿeÚúÿeÚúÿ}áüÿÛúþÿÈøþÿ¿øÿÿ~Õ÷ÿ: äÿ¹ç¶ÿQªUÿQªUÿ¼ç¹ÿkÌhÿeÊbÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂòÿZ¯îÿ1›éÿ.™éÿ:žéÿ¬èûÿgÞûÿgÞûÿ¬èûÿ:žéÿ/™éÿ2›éÿA¦ÓÿL°»ÿ¼ç¹ÿQªUÿQªUÿ¿é¼ÿhËfÿ`È_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïùîÿŠ×ˆÿE«¶ÿ”Ðõÿ„èýÿ„èýÿ”ÐõÿI­»ÿpÎnÿpÎnÿnÍmÿjÌiÿ¿é¼ÿQªUÿPªTÿÂêÁÿfÊeÿ_È^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØñ×ÿ”Û“ÿbÉ`ÿhËfÿjËpÿD¤ëÿËúÿÿËúÿÿD¤ëÿoÎmÿoÎmÿoÎmÿmÍlÿiÌhÿÂêÁÿPªTÿPªTÿÈëÇÿeÊdÿaÉaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿâõâÿÀê¿ÿŸßŸÿiÌhÿbÉbÿfËeÿjÌjÿlÍlÿmÍmÿO³«ÿ¯ãûÿ¯ãûÿO³«ÿmÍmÿmÍmÿmÍmÿlÍkÿgËfÿÈëÇÿPªTÿPªTÿËìÉÿdÊcÿfÊeÿaÉ`ÿ]Ç\ÿ\Ç[ÿ^È]ÿ_È_ÿbÉbÿdÊcÿgËfÿiÌhÿjÌjÿkÍjÿkÍjÿkÍjÿkÍjÿgÇôÿcÂôÿkÍjÿkÍjÿkÍjÿkÍjÿjÌjÿeÊdÿËìÉÿPªTÿPªTÿÎíÍÿ`É`ÿbÊbÿbÊbÿbÉbÿbÉbÿbÉbÿbÊbÿbÊbÿcÊbÿcÊdÿcÊdÿcÊdÿcÊdÿcÊdÿcÊdÿcÊdÿR¸šÿK±°ÿcÊdÿcÊdÿcÊdÿcÊdÿcÊbÿ`É`ÿÎíÍÿPªTÿ R©Uë©á¨ÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿÔïÓÿ©á¨ÿO£R³RªVêPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿPªTÿQ§T°ÿÿÿÿÀ€€€€€€€€€€€€€€€€€€€€€€€€€€€€Àÿÿÿÿ(  @w½u1kÁgÉIÀCÿ@¼;ÿ@¼;ÿ@¼;ÿ@¼;ÿ@¼;ÿ@¼;ÿ@¼;ÿ@¼;ÿIÀCÿkÁgÉw½u1kÁgÉiÎ]ÿiÎ]ÿiÎ]ÿiÎ]ÿiÎ]ÿiÎ]ÿiÎ]ÿiÎ]ÿiÎ]ÿiÎ]ÿmÎ`ÿjÊ_ÿkÁgÉIÀCÿiÎ]ÿšÛ”ÿÿÿÿÿœÛ—ÿ|Îtÿ˜ÙÿÁè½ÿšÚ’ÿmÊdÿÂè½ÿÂè½ÿmÎcÿIÀCÿ@¼;ÿiÎ]ÿÿÿÿÿÿÿÿÿÿÿÿÿgÇ\ÿÂé¾ÿÿÿÿÿÀè¼ÿWÂMÿÿÿÿÿÿÿÿÿiÎ]ÿ@¼;ÿ@¼;ÿiÎ]ÿœÛ—ÿÿÿÿÿœÛ—ÿTÂJÿùûøÿÿÿÿÿ–ÙÿtÍmÿÿÿÿÿÿÿÿÿiÎ]ÿ@¼;ÿ@¼;ÿiÎ]ÿeÈ]ÿYÃQÿ[ÅSÿ–Ù’ÿÿÿÿÿÿÿÿÿcÔ?ÿ¥ß¡ÿÿÿÿÿðýàÿiÎ]ÿ@¼;ÿ@¼;ÿmÏdÿUÁOÿnËfÿ·æ´ÿÿÿÿÿÿÿÿÿF¢ÍÿcÔ?ÿÿÿúÿýèèÿI£ÒÿiÎ]ÿ@¼;ÿ@¼;ÿ‚Ôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºç ÿSÂñÿ0¯ÿÿŠ¥Ñÿ$«ôÿ[ÁüÿoÏeÿ@¼;ÿ@¼;ÿ†Õ†ÿÿÿÿÿÿÿÿÿÓïÑÿyÏuÿ]ÍAÿ_µ§ÿsßÿÿMÔûÿpßÿÿb²ªÿ†Õ†ÿ@¼;ÿ@¼;ÿˆÙ‰ÿC¼@ÿ@¼;ÿA¼=ÿ^ËSÿ|­ŽÿK¼ÿÿ`Üûÿ]Õ÷ÿbÝýÿ@¸øÿ|­Žÿ@¼;ÿ@¼;ÿŒÚŽÿ·æµÿÇìÅÿóúòÿÿÿÿÿ:¢þÿ{Çÿÿ¥ßÿÿLÚúÿ¥Þÿÿ„Ëÿÿ:¤ÿÿ@¼;ÿIÀCÿ‘Ü’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðÿ’ßmÿC¢¿ÿÌÿÿÿM¥ÇÿnÒGÿˆÙ‰ÿIÀCÿkÁgɘޜÿ¯ã®ÿ¥à£ÿ†×†ÿPÄPÿD¿Dÿ\ÈWÿQ¾VÿŽÓÿÿQ¾UÿcÌ^ÿŒÚŽÿkÁgÉw½u1kÁgÉIÀCÿ@¼;ÿ@¼;ÿ@¼;ÿ@¼;ÿ@¼;ÿIÀCÿaÃvÿB½=ÿB½=ÿkÁgÉw½u1ÿÿ€€€€€€€€€€€€€€ÿÿquiterss-0.18.3/QuiteRSS.pro000066400000000000000000000240341265173051100156670ustar00rootroot00000000000000# VCS revision info REVFILE = src/VersionRev.h QMAKE_DISTCLEAN += $$REVFILE exists(.git) { VERSION_REV = $$system(git rev-list master --count) count(VERSION_REV, 1) { os2|win32|mac { # FIXME VERSION_REV = $$VERSION_REV } else { VERSION_REV = git-$$VERSION_REV-$$system(git rev-parse --short HEAD) } } else { VERSION_REV = 0 } !build_pass:message(VCS revision: $$VERSION_REV) os2|win32 { system(echo $${LITERAL_HASH}define VCS_REVISION $$VERSION_REV > $$REVFILE) } else { system(echo \\$${LITERAL_HASH}define VCS_REVISION \\\"$$VERSION_REV\\\" > $$REVFILE) } } else:!exists($$REVFILE) { VERSION_REV = 0 !build_pass:message(VCS revision: $$VERSION_REV) os2|win32 { system(echo $${LITERAL_HASH}define VCS_REVISION $$VERSION_REV > $$REVFILE) } else { system(echo \\$${LITERAL_HASH}define VCS_REVISION \\\"$$VERSION_REV\\\" > $$REVFILE) } } isEqual(QT_MAJOR_VERSION, 5) { QT += widgets webkitwidgets network xml printsupport sql multimedia DEFINES += HAVE_QT5 } else { QT += core gui network xml webkit sql os2 { DISABLE_PHONON = 1 } isEmpty(DISABLE_PHONON) { QT += phonon DEFINES += HAVE_PHONON } } unix:!mac:DEFINES += HAVE_X11 TEMPLATE = app HEADERS += \ src/VersionNo.h \ src/parseobject.h \ src/optionsdialog.h \ src/newsview/newsview.h \ src/newsview/newsmodel.h \ src/newsview/newsheader.h \ src/aboutdialog.h \ src/updateappdialog.h \ src/feedpropertiesdialog.h \ src/addfeedwizard.h \ src/newstabwidget.h \ src/findtext.h \ src/findfeed.h \ src/feedsview/feedsview.h \ src/feedsview/feedsmodel.h \ src/VersionRev.h \ src/addfolderdialog.h \ src/labeldialog.h \ src/faviconobject.h \ src/customizetoolbardialog.h \ src/plugins/webpluginfactory.h \ src/plugins/clicktoflash.h \ src/downloads/downloadmanager.h \ src/downloads/downloaditem.h \ src/tabbar.h \ src/categoriestreewidget.h \ src/cleanupwizard.h \ src/updatefeeds.h \ src/requestfeed.h \ src/notifications/notificationsfeeditem.h \ src/notifications/notificationsnewsitem.h \ src/notifications/notificationswidget.h \ src/application/mainapplication.h \ src/application/settings.h \ src/application/logfile.h \ src/application/mainwindow.h \ src/adblock/adblocktreewidget.h \ src/adblock/adblocksubscription.h \ src/adblock/adblocksearchtree.h \ src/adblock/adblockrule.h \ src/adblock/adblockmanager.h \ src/adblock/adblockicon.h \ src/adblock/adblockdialog.h \ src/adblock/adblockblockednetworkreply.h \ src/adblock/adblockaddsubscriptiondialog.h \ src/adblock/followredirectreply.h \ src/application/splashscreen.h \ src/network/authenticationdialog.h \ src/network/cookiejar.h \ src/network/networkmanager.h \ src/webview/locationbar.h \ src/webview/rssdetectionwidget.h \ src/webview/webpage.h \ src/webview/webview.h \ src/database/database.h \ src/common/common.h \ src/common/delegatewithoutfocus.h \ src/common/dialog.h \ src/common/lineedit.h \ src/common/toolbutton.h \ src/newsfilters/filterrulesdialog.h \ src/newsfilters/newsfiltersdialog.h \ src/newsfilters/itemcondition.h \ src/newsfilters/itemaction.h \ src/network/sslerrordialog.h \ src/network/networkmanagerproxy.h \ src/adblock/adblockmatcher.h \ src/feedsview/feedsproxymodel.h SOURCES += \ src/parseobject.cpp \ src/optionsdialog.cpp \ src/newsview/newsview.cpp \ src/newsview/newsmodel.cpp \ src/newsview/newsheader.cpp \ src/aboutdialog.cpp \ src/updateappdialog.cpp \ src/feedpropertiesdialog.cpp \ src/addfeedwizard.cpp \ src/newstabwidget.cpp \ src/findtext.cpp \ src/findfeed.cpp \ src/feedsview/feedsview.cpp \ src/feedsview/feedsmodel.cpp \ src/addfolderdialog.cpp \ src/labeldialog.cpp \ src/faviconobject.cpp \ src/customizetoolbardialog.cpp \ src/plugins/webpluginfactory.cpp \ src/plugins/clicktoflash.cpp \ src/downloads/downloadmanager.cpp \ src/downloads/downloaditem.cpp \ src/tabbar.cpp \ src/categoriestreewidget.cpp \ src/cleanupwizard.cpp \ src/updatefeeds.cpp \ src/requestfeed.cpp \ src/notifications/notificationsfeeditem.cpp \ src/notifications/notificationsnewsitem.cpp \ src/notifications/notificationswidget.cpp \ src/application/mainapplication.cpp \ src/application/settings.cpp \ src/application/logfile.cpp \ src/application/mainwindow.cpp \ src/main/main.cpp \ src/adblock/adblocktreewidget.cpp \ src/adblock/adblocksubscription.cpp \ src/adblock/adblocksearchtree.cpp \ src/adblock/adblockrule.cpp \ src/adblock/adblockmanager.cpp \ src/adblock/adblockicon.cpp \ src/adblock/adblockdialog.cpp \ src/adblock/adblockblockednetworkreply.cpp \ src/adblock/adblockaddsubscriptiondialog.cpp \ src/adblock/followredirectreply.cpp \ src/application/splashscreen.cpp \ src/network/authenticationdialog.cpp \ src/network/cookiejar.cpp \ src/network/networkmanager.cpp \ src/webview/locationbar.cpp \ src/webview/rssdetectionwidget.cpp \ src/webview/webpage.cpp \ src/webview/webview.cpp \ src/database/database.cpp \ src/common/common.cpp \ src/common/delegatewithoutfocus.cpp \ src/common/dialog.cpp \ src/common/lineedit.cpp \ src/common/toolbutton.cpp \ src/newsfilters/filterrulesdialog.cpp \ src/newsfilters/newsfiltersdialog.cpp \ src/newsfilters/itemcondition.cpp \ src/newsfilters/itemaction.cpp \ src/network/sslerrordialog.cpp \ src/network/networkmanagerproxy.cpp \ src/adblock/adblockmatcher.cpp \ src/feedsview/feedsproxymodel.cpp INCLUDEPATH += $$PWD/src \ $$PWD/src/application \ $$PWD/src/common \ $$PWD/src/main \ $$PWD/src/database \ $$PWD/src/downloads \ $$PWD/src/feedsview \ $$PWD/src/newsfilters \ $$PWD/src/newsview \ $$PWD/src/notifications \ $$PWD/src/plugins \ $$PWD/src/adblock \ $$PWD/src/network \ $$PWD/src/webview \ CONFIG += debug_and_release CONFIG(debug, debug|release) { BUILD_DIR = $$OUT_PWD/debug } else { BUILD_DIR = $$OUT_PWD/release # DEFINES += QT_NO_DEBUG_OUTPUT } DESTDIR = $${BUILD_DIR}/target OBJECTS_DIR = $${BUILD_DIR}/obj MOC_DIR = $${BUILD_DIR}/moc RCC_DIR = $${BUILD_DIR}/rcc isEmpty(SYSTEMQTSA) { include(3rdparty/qtsingleapplication/qtsingleapplication.pri) } else { CONFIG += qtsingleapplication } isEqual(QT_MAJOR_VERSION, 5) { include(3rdparty/qftp/qftp.pri) } include(3rdparty/sqlite.pri) include(lang/lang.pri) include(3rdparty/qupzilla/qupzilla.pri) os2|win32|mac { TARGET = QuiteRSS } win32 { RC_FILE = QuiteRSSApp.rc } win32-g++ { LIBS += libkernel32 \ libpsapi } win32-msvc* { LIBS += -lpsapi LIBS += -lShell32 LIBS += -lUser32 QMAKE_CXXFLAGS += -D__PRETTY_FUNCTION__=__FUNCTION__ QMAKE_CFLAGS += -D__PRETTY_FUNCTION__=__FUNCTION__ } os2 { RC_FILE = quiterss_os2.rc } os2|win32 { SOURCES += src/network/cabundleupdater.cpp HEADERS += src/network/cabundleupdater.h RESOURCES += data/ca-bundle.qrc } DISTFILES += \ HISTORY_RU \ HISTORY_EN \ COPYING \ AUTHORS \ CHANGELOG \ README.md unix:!mac { TARGET = quiterss isEmpty(PREFIX) { PREFIX = /usr/local } DATA_DIR = $$PREFIX/share/quiterss DEFINES += RESOURCES_DIR='\\\"$${DATA_DIR}\\\"' target.path = $$quote($$PREFIX/bin) desktop.files = quiterss.desktop desktop.path = $$quote($$PREFIX/share/applications) target1.files = images/48x48/quiterss.png target1.path = $$quote($$PREFIX/share/pixmaps) icon_16.files = images/16x16/quiterss.png icon_32.files = images/32x32/quiterss.png icon_48.files = images/48x48/quiterss.png icon_64.files = images/64x64/quiterss.png icon_128.files = images/128x128/quiterss.png icon_256.files = images/256x256/quiterss.png icon_16.path = $$quote($$PREFIX/share/icons/hicolor/16x16/apps) icon_32.path = $$quote($$PREFIX/share/icons/hicolor/32x32/apps) icon_48.path = $$quote($$PREFIX/share/icons/hicolor/48x48/apps) icon_64.path = $$quote($$PREFIX/share/icons/hicolor/64x64/apps) icon_128.path = $$quote($$PREFIX/share/icons/hicolor/128x128/apps) icon_256.path = $$quote($$PREFIX/share/icons/hicolor/256x256/apps) translations.files = $$quote($$DESTDIR/lang/)*.qm translations.path = $$quote($$DATA_DIR/lang) translations.CONFIG += no_check_exist sound.files = sound/*.wav sound.path = $$quote($$DATA_DIR/sound) style.files = style/*.* style.path = $$quote($$DATA_DIR/style) INSTALLS += target desktop target1 INSTALLS += icon_16 icon_32 icon_48 icon_64 icon_128 icon_256 \ translations sound style } mac { CONFIG += app_bundle QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6 QMAKE_INFO_PLIST = Info.plist ICON = quiterss.icns bundle_target.files += AUTHORS bundle_target.files += COPYING bundle_target.files += CHANGELOG bundle_target.files += README.md bundle_target.files += sound bundle_target.files += style bundle_target.path = Contents/Resources QMAKE_BUNDLE_DATA += bundle_target translations.files = $$quote($$DESTDIR/lang) translations.path = Contents/Resources QMAKE_BUNDLE_DATA += translations INSTALLS += bundle_target translations } RESOURCES += \ QuiteRSS.qrc CODECFORTR = UTF-8 CODECFORSRC = UTF-8 OTHER_FILES += \ HISTORY_RU \ HISTORY_EN \ COPYING \ AUTHORS \ CHANGELOG \ INSTALL \ Info.plist FORMS += \ src/adblock/adblockdialog.ui \ src/adblock/adblockaddsubscriptiondialog.ui quiterss-0.18.3/QuiteRSS.qrc000066400000000000000000000220771265173051100156610ustar00rootroot00000000000000 images/updateFeed.png images/updateAllFeeds.png images/triangleL.png images/triangleR.png images/markRead.png images/triangleT.png images/bulletRead.png images/bulletUnread.png images/column.png images/readSection.png images/starOff.png images/starOn.png images/starSection.png images/filter.png images/feedDefault.png images/options.png images/markReadAll.png images/sortIndicatorA.png images/sortIndicatorD.png images/bulletNew.png images/imagesOff.png images/imagesOn.png images/ImportFeeds.png images/filterOff.png images/QuiteRSS16_NewNews.png images/16x16/quiterss.png images/32x32/quiterss.png images/QuiteRSS16_NewNews1.png images/quiterss_count.png images/exportFeeds.png images/add.png images/delete.png images/splashScreen.png images/logo.png images/noicon.png images/preferencesFeed.png images/editClear.png images/back_page.png images/forward_page.png images/house.png images/world_go.png images/add_t.png images/delete_t.png images/warning.png images/close.png images/close_hover.png images/world.png images/folder_add.png images/folder_delete.png images/arrow_down.png images/arrow_left.png images/arrow_right.png images/arrow_up.png images/folder.png images/find.png images/find_in_browser_s.png images/find_in_news.png images/find_in_news_s.png images/logo_text.png images/findFeed.png images/arrow_turn_left.png images/printer.png images/zoom.png images/zoom_in.png images/zoom_out.png images/fullScreen.png images/loading.gif images/trash.png images/panel_hide.png images/panel_show.png images/label_gray.png images/label_green.png images/label_orange.png images/label_purple.png images/label_red.png images/label_yellow.png images/save_as.png images/share.png images/email.png images/tab_go.png images/page_copy.png images/bullet_toggle_minus.png images/bullet_toggle_plus.png images/flash.png images/flashstart.png images/folder_star.png images/folder_unread.png images/download.png images/list_clear.png images/bullet_error.png images/bullet_update.png images/control_play.png images/adblock.png images/adblock_big.png images/adblock-disabled.png images/menu.png images/backup.png images/layout_classic.png images/layout_newspaper.png images/cleanup.png style/system.qss style/news.css AUTHORS COPYING HISTORY_EN HISTORY_RU html/news.html html/audioplayer.html html/videoplayer.html html/adblockPage.html html/news_rtl.html html/newspaper_description.html html/newspaper_head.html html/newspaper_description_rtl.html images/flags/flag_arab.png images/flags/flag_brazil.png images/flags/flag_china.png images/flags/flag_czech.png images/flags/flag_france.png images/flags/flag_germany.png images/flags/flag_great_britain.png images/flags/flag_greece.png images/flags/flag_hungary.png images/flags/flag_iran.png images/flags/flag_italy.png images/flags/flag_japan.png images/flags/flag_lithuania.png images/flags/flag_netherlands.png images/flags/flag_poland.png images/flags/flag_portugal.png images/flags/flag_russia.png images/flags/flag_serbian.png images/flags/flag_slovakia.png images/flags/flag_south_korea.png images/flags/flag_spain.png images/flags/flag_sweden.png images/flags/flag_taiwan.png images/flags/flag_tajikistan.png images/flags/flag_turkey.png images/flags/flag_ukraine.png images/flags/flag_vietnam.png images/flags/flag_romania.png images/flags/flag_finland.png images/flags/flag_galicia.png images/flags/flag_bulgaria.png images/flags/flag_india.png images/share/blogger.png images/share/evernote.png images/share/facebook.png images/share/gplus.png images/share/linkedin.png images/share/livejournal.png images/share/pocket.png images/share/printfriendly.png images/share/twitter.png images/share/vk.png quiterss-0.18.3/QuiteRSSApp.rc000066400000000000000000000020551265173051100161330ustar00rootroot00000000000000IDI_ICON1 ICON DISCARDABLE "QuiteRSS.ico" #ifndef Q_CC_BOR # if defined(UNDER_CE) && UNDER_CE >= 400 # include # else # include # endif #endif #include "src/VersionNo.h" VS_VERSION_INFO VERSIONINFO FILEVERSION FILEVER PRODUCTVERSION PRODUCTVER FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x4L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "000004b0" BEGIN VALUE "CompanyName", "QuiteRSS Team\0" VALUE "Comments", "Application\0" VALUE "FileDescription", "QuiteRSS\0" VALUE "FileVersion", STRFILEVER_FULL VALUE "InternalName", "QuiteRSS\0" VALUE "OriginalFilename", "QuiteRSS.exe\0" VALUE "LegalCopyright", "Copyright © 2011-2015 QuiteRSS Team\0" VALUE "ProductName", "QuiteRSS\0" VALUE "ProductVersion", STRPRODUCTVER END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x0, 1200 END END quiterss-0.18.3/QuiteRSS_os2.ico000066400000000000000000000150261265173051100164250ustar00rootroot00000000000000BA\²CIN@ @ÿÿÿCIN@ BA\dCIN @0ÿÿÿCIN Ö@BA\CIN–@ ÿÿÿCIN@ÿÿÿÿàÀ€€€€€€€€€€€€€€€€€€€€€€€€€€ÀàÿÿÿÿS§WU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YU«YJ•MT§X’Õ…ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ’Õ…L˜OU«Y“Ö‡ˆÒ~‡Ò}‡Ò}†Ò{†Ò{†Ò{‡Ò}‡Ò}ˆÒ~‡Ò}‡Ò}†Ò{†Ò{†Ò{†Ò{‡Ò}‡Ò}‡Ò}†Ò{†Ò{†Ò{†Ò{‡Ò}ˆÒ}“Ö‡U«YT«X’Öˆ…Ò{„Ñ{€Ðv{ÏqzÎo{Ïq€Ðv„Ñ{…Ò|…Ò{‚Ñx|ÏrzÎozÎo|Ïr‚Ñx„Ñ{‚Ñx|ÏrzÎozÎo|Ïr‚Ñx…Ò{’ÖˆT«XT«X•׊„ÑzÐuÜ–ÿÿÿÿÿÿÿÿÿÜ–Ðu„Ñ{ƒÑz{Ïpÿÿÿÿÿÿÿÿÿÿÿÿ{Ïq‚Ñx{Ïqÿÿÿÿÿÿÿÿÿÿÿÿ{ÏqƒÑy•׊T«XT«X—ÙÑxyÎpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿyÎoÑx€ÐxvÍlÿÿÿÿÿÿÿÿÿÿÿÿxÎn~ÐvvÍmÿÿÿÿÿÿÿÿÿÿÿÿwÎm€Ðx—ÙT«XT«X™Ú€ÐwwÎmÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŠÕƒÐw}ÐtšÚ“ÿÿÿÿÿÿÿÿÿÿÿÿwÎm|Ðs‡Ô€ÿÿÿÿÿÿÿÿÿÿÿÿvÍm€Ðw™ÚT«XS«X›Ú“~ÐvwÎnÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvÎm~ÐvyÏp´ä¯ÿÿÿÿÿÿÿÿÿçöåwÎnzÏr™Ú“ÿÿÿÿÿÿÿÿÿÿÿÿuÍm~Ðv›Ú“S«XS«XœÛ•~ÐvzÏq¤ÞŸÿÿÿÿÿÿÿÿÿ¤ÞŸzÏq|ÐtsÍkðùîÿÿÿÿÿÿÿÿÿµä±xÎpxÎp´ä°ÿÿÿÿÿÿÿÿÿæöävÎm}ÐuœÛ•S«XS«X Ü™|Ðu|ÐuyÏqtÍmrÍktÍmxÏpzÐsvÎožÝ™ÿÿÿÿÿÿÿÿÿÿÿÿ„Ò~yÏqtÍmÜòÚÿÿÿÿÿÿÿÿÿÉëÄvÎo|Ðt Ü™S«XS«X¢Ýœ|Ðt}Ðv}Ðv|Ðu{ÐtzÐszÏsuÎnŠÕ…ÿÿÿÿÿÿÿÿÿÿÿÿÝòÛtÍmyÏqpÌhÿÿÿÿÿÿÿÿÿÿÿÿ Ý›xÏpzÐs¢ÝœS«XR«V¤ÞŸzÐs{Ðt{ÐtyÏsxÏquÎooÌiÜ™ÿÿÿÿÿÿÿÿÿÿÿÿÌÌÌf§boÂjuÎožÝšÿÿÿÿÿÿñññÌÌÌ`¥ZxÏryÏs¤ÞŸR«VR«V§ß¡xÏqwÏpqÍkmËf‰Õ…¦ß¢åõäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJ®î8¡êT£€]ªXåõäÿÿÿÖÖÖ£¿Ô=¥ìA¨íyÏsxÏr§ß¡R«VR«V¨à£uÎonÌiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓïÑT´àcÓ÷C±ïE¡ÔÊËÌÊËÌT¦äC±ïmÖ÷L¬àwÏrvÏp¨à£R«VRªU¬à§sÎmjÊeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥à¢mÌhN­²ƒßùTÏöOÂô=¤ì=¤ìOÂôTÏö}ÚøM«²wÏruÎo¬à§RªURªU¯âªqÍmhÊcÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿæöæ{ÐxnÌjsÎn[»˜{Õ÷iÕ÷XÐö[Ò÷[Ò÷XÐöiÖøwÍõ`½›vÏqsÎo¯âªRªURªU±ã®qÍlkËfÿÿÿÿÿÿÿÿÿåöä¯ã­{ÐxkËfpÍlrÎmnÌjb²_V½ò’ãû[Ò÷]Ò÷]Ò÷[Ò÷âúR¶ñg´cuÏpsÎn±ã®RªURªU´ä±pÍmpÍmjËfgÊbgÊbhÊelÌhnÍkoÍllÌigÊb|²yl¬ÞRÂô„àû]Õø_Õø_Õø]Õø„áûO¿óCž³^¨\pÍm´ä±RªUQªU¶æ³oÍlqÎnpÍmnÍkmÌjlÌhjËfgÊdcÉ`¢ß ·Ç¶D¡æQÃô`Ùú^×ù`Öùc×ùc×ù`Öù^×ù`ÚúRÃô9ÛZ¥W¶æ³QªUQªU¹ç¶mÍjmÍjgÊdcÉ`ŽØŒ‹×‰·æ¶ØñÖÿÿÿÿÿÿ@¢ê—ÚøÌûÿÈøþÛúþ}áüeÚúeÚú}áüÛúþÈøþ¿øÿ~Õ÷: ä¹ç¶QªUQªU¼ç¹kÌheÊbÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÂòZ¯î1›é.™é:žé¬èûgÞûgÞû¬èû:žé/™é2›éA¦ÓL°»¼ç¹QªUQªU¿é¼hËf`È_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïùîŠ×ˆE«¶”Ðõ„èý„èý”ÐõI­»pÎnpÎnnÍmjÌi¿é¼QªUPªTÂêÁfÊe_È^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿØñ×”Û“bÉ`hËfjËpD¤ëËúÿËúÿD¤ëoÎmoÎmoÎmmÍliÌhÂêÁPªTPªTÈëÇeÊdaÉaÿÿÿÿÿÿÿÿÿÿÿÿâõâÀ꿟ߟiÌhbÉbfËejÌjlÍlmÍmO³«¯ãû¯ãûO³«mÍmmÍmmÍmlÍkgËfÈëÇPªTPªTËìÉdÊcfÊeaÉ`]Ç\\Ç[^È]_È_bÉbdÊcgËfiÌhjÌjkÍjkÍjkÍjkÍjgÇôcÂôkÍjkÍjkÍjkÍjjÌjeÊdËìÉPªTPªTÎíÍ`É`bÊbbÊbbÉbbÉbbÉbbÊbbÊbcÊbcÊdcÊdcÊdcÊdcÊdcÊdcÊdR¸šK±°cÊdcÊdcÊdcÊdcÊb`É`ÎíÍPªTR©U©á¨ÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓÔïÓ©á¨O£RRªVPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTPªTQ§TÿÿÿÀ€€€€€€€€€€€€€€€€€€€€€À    .]0?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B?€B)S+  *T,‚Êz‹Ó€‹Ó€‹Ó‹Ó‹Ó‹Ó€‹Ó€‹Ó€‹Ó‹Ó‹Ó‹Ó‹Ó€‹Ó‹Ó‹Ó‹Ó‹Ó€Çx'N(*U,ƒË{†Ò|„ÑzÐv€ÐuÐw„Ñ{†Ò|…Ñ{ÐwÏt€ÐuƒÑy…Ñ{‚Ðx€Ðu€Ðu‚Ðx…Ñ{ƒË{*U,*U,„Ë}ƒÑy‹Ô‚ËìÈÝò۹崅Ò|„Ñ{€ÐvÆêÁÝòÛÞòÛ•ØŒÐw­á§ÝòÛÞòÛ­á§Ðw„Ë})U+*U,†Í€~Ðu»æ·ÿÿÿÿÿÿÿÿÿÛ–€ÐwÐvßóÝÿÿÿÿÿÿ™Ú’|Ït¼ç¸ÿÿÿÿÿÿºæ¶}Ïu†Í€)U+)U,ˆÎƒ}Ït»æ¶þþþÿÿÿþþþŸÜ™}Ðu‘׉é÷çþþþøüø•ÙŽ€ÑxÇëÄþþþÿÿÿºåµ|ÏtˆÎƒ)U+)U,‰Î…|ÏtšÚ“íøìÿÿÿÜòÚ‰ÔzÏrªà¥÷üöþþþàóÞŠÔƒ…Ó~ÖðÓþþþúýú°â«{Ïs‰Î…)U+)U,Љ|Ðu{ÏswÎotÎmwÎoxÏqŠÕ„ÚòØÿÿÿýþü»æ·zÏs׉òúñÿÿÿïùíšÛ”zÏrЉ)U+)U+ŽÐ‹{Ðs{ÏtzÏtyÏruÎoƒÓ~ÓïÑþþþÿÿÿÔßӉɄuÌn¥ß þþþùùùÌÜÊ{ÇuyÏrŽÐ‹)U+)U+‘ÑxÏquÎoqÌjŠÕ…°â­ÞóÝÿÿÿÿÿÿÿÿÿ`°ÞO¦¡`±eÞóÝïïïÀÐÜZ­Ý`»xÏr‘ÒŽ(U*)U*“ÒrÍl¶å³þþþÿÿÿþþþþþþÿÿÿóûóÅêÃX»ÝYÇôG­á¦ÁÔ|·ÞJµîgÌîa½£vÎp“Ò(U*)U*–Ó“oÌj´ä±þþþÿÿÿþþþþþþåõä£Þ vÏq_½¹nÕ÷VËõL»ñOÂó[ÐöqËâfÁ‹tÎo–Ó“(T*)U*˜Ô—oÌj´ä²þþþúýú×ñ֥ߣ„Ó€qÍmoÌk_·ŽsÑöeÔ÷\Ò÷[ÑözÛø]ºÑmÂpsÎn˜Ô—(T*(U*›ÖšpÍmmÌjiËehÊdjËflÌhoÍlzÍvq´a·èhÒød×ø`Õø^ÕøsÜúP¾èM¦Ÿe»lœÖš(T*(U*לnÍkmÌjiËf}Òz†Ôƒ›Ü™¹æ·¥ÑÏq»çáú˜èûzÞúdØùiÙù‘åû‘æûrËñN¨°×œ(T*(U* ×ŸjÌg ÞžØñ×âõâçöçóúòÿÿÿ·Ü÷k¹ðV²î[²îÙ÷fÝúƒáúqÁñU±îR±åI­Ê ×Ÿ(T*(U*¤Ù£eÊd¯ã¯ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúýúè÷è¹æ·gÃ’sÀß•ìýŠØø]¹ºoÎmnÍmjÌi¤Ù£(T*(U*§Ú¨dÉc¯ã¯þþþÿÿÿ÷ü÷ãõãÈìȨᧅՄfÊejËkQ³³½îýƒÌãdÄ„nÍmmÍliËh§Ú¨'T)(U*«Û«dÊcvÐu†Õ……Õ„‚Ô‚{ÑzpÎogËfhËhjÌjkÌjeÈvxÍõlÈ·iËnkÍjjÌjfÊe«Û«'T)8l:§Ú¨}Ó}~Ó~~Ò~~Ò~~Ó~~Ó~Ó~ÓÓÓÓÓqĬvÊœÓÓÓ}Ò}§Ù§5j;w¹xyÁ{’Ì“‘Ì“‘Ì“’Ì“‘Ì“‘Ì“’Ì“‘Ì“’Ì“‘Ì“‘Ì“‘Ì“’Ì“‘Ì“‘Ì“’Ì“‘Ì“‘Ì“u¾ze±|„À…„Â…†Ã‡†Äˆ…ň†ÈŠˆÌŽ†Ë‡Ì–…Ë—É•{Ç‘wÅŽsÄ‹pÉj»ƒg¸g¸g·i¶ÿÿ€€€€€€€€€€€€€€ÿÿw½ukÁgIÀC@¼;@¼;@¼;@¼;@¼;@¼;@¼;@¼;IÀCkÁgw½ukÁgiÎ]iÎ]iÎ]iÎ]iÎ]iÎ]iÎ]iÎ]iÎ]iÎ]mÎ`jÊ_kÁgIÀCiÎ]šÛ”ÿÿÿœÛ—|Ît˜ÙÁ轚ڒmÊdÂè½Âè½mÎcIÀC@¼;iÎ]ÿÿÿÿÿÿÿÿÿgÇ\Âé¾ÿÿÿÀè¼WÂMÿÿÿÿÿÿiÎ]@¼;@¼;iÎ]œÛ—ÿÿÿœÛ—TÂJùûøÿÿÿ–ÙtÍmÿÿÿÿÿÿiÎ]@¼;@¼;iÎ]eÈ]YÃQ[ÅS–Ù’ÿÿÿÿÿÿcÔ?¥ß¡ÿÿÿðýàiÎ]@¼;@¼;mÏdUÁOnËf·æ´ÿÿÿÿÿÿF¢ÍcÔ?ÿÿúýèèI£ÒiÎ]@¼;@¼;‚Ôÿÿÿÿÿÿÿÿÿÿÿÿºç SÂñ0¯ÿŠ¥Ñ$«ô[ÁüoÏe@¼;@¼;†Õ†ÿÿÿÿÿÿÓïÑyÏu]ÍA_µ§sßÿMÔûpßÿb²ª†Õ†@¼;@¼;ˆÙ‰C¼@@¼;A¼=^ËS|­ŽK¼ÿ`Üû]Õ÷bÝý@¸ø|­Ž@¼;@¼;ŒÚŽ·æµÇìÅóúòÿÿÿ:¢þ{Çÿ¥ßÿLÚú¥Þÿ„Ëÿ:¤ÿ@¼;IÀC‘Ü’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿð’ßmC¢¿ÌÿÿM¥ÇnÒGˆÙ‰IÀCkÁg˜Þœ¯ã®¥à£†×†PÄPD¿D\ÈWQ¾VŽÓÿQ¾UcÌ^ŒÚŽkÁgw½ukÁgIÀC@¼;@¼;@¼;@¼;@¼;IÀCaÃvB½=B½=kÁgw½uquiterss-0.18.3/README.md000066400000000000000000000013751265173051100147500ustar00rootroot00000000000000Linux: [![Build Status](https://travis-ci.org/QuiteRSS/quiterss.svg?branch=master)](https://travis-ci.org/QuiteRSS/quiterss) Windows: [![Build status](https://ci.appveyor.com/api/projects/status/5lr4m5jxf2ad4f5r/branch/master?svg=true)](https://ci.appveyor.com/project/Funcy-dcm/quiterss/branch/master) Copyright (C) 2011-2016 QuiteRSS Team QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader written on Qt/C++ Idea: Quite fast and comfortable to user Links: * Website: http://quiterss.org * Git repository: https://github.com/QuiteRSS/quiterss * Issue tracker: https://github.com/QuiteRSS/quiterss/issues * Translations: https://www.transifex.com/projects/p/quiterss/ * Jabber conference: quiterss@conference.jabber.ru quiterss-0.18.3/appveyor.yml000066400000000000000000000077341265173051100160660ustar00rootroot00000000000000version: 0.17.7_b{build} os: unstable branches: only: - master environment: PRO_FILE: 'C:\projects\quiterss\QuiteRSS.pro' matrix: # - BUILD: Qt4.8.6-x86-mingw32 # COMPILERDIR: 'c:\mingw\bin' # QMAKESPEC: win32-g++ # PRO_MAKE: mingw32-make # PRO_CHECK: mingw32-make check # QTMOVE: '$OUTDIR\bin 4.8.6-x86-mingw32' # QTSUB: '4.8.6-x86-mingw32' # QTDOWNLOAD1: http://download.qt.io/archive/qt/4.8/4.8.6/qt-opensource-windows-x86-mingw482-4.8.6-1.exe # QTARCHIVE1: 'qt-opensource-windows-x86-mingw482-4.8.6-1.exe' # QTARCHIVE1_OPTS: '"-ir!?OUTDIR\*" "-xr!*doc\*" "-xr!*examples\*" "-xr!*demos\*"' # - BUILD: Qt4.8.6-x86-msvc2010 # COMPILERBAT: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" x86' # PRO_MAKE: nmake release ## PRO_CHECK: 'cd build\%BUILD%\release\target && dir && QuiteRSS.exe' # PRO_CHECK: 'cd release\target && dir && cd ..\..' # QMAKESPEC: win32-msvc2010 # QTMOVE: '$OUTDIR\bin 4.8.6-msvc2010' # QTSUB: '4.8.6-msvc2010' # QTDOWNLOAD1: http://download.qt.io/archive/qt/4.8/4.8.6/qt-opensource-windows-x86-vs2010-4.8.6.exe # QTARCHIVE1: 'qt-opensource-windows-x86-vs2010-4.8.6.exe' # QTARCHIVE1_OPTS: '"-ir!?OUTDIR\*" "-xr!*doc\*" "-xr!*examples\*" "-xr!*demos\*"' - BUILD: Qt5.4.1-mingw32 QTDIR: 'c:\qt\5.4\mingw491_32' COMPILERDIR: 'c:\qt\tools\mingw491_32\bin' QMAKESPEC: win32-g++ PRO_MAKE: mingw32-make PRO_CHECK: mingw32-make check - BUILD: Qt5.4.1-x86-msvc2013 QTDIR: 'c:\qt\5.4\msvc2013_opengl' COMPILERBAT: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86' QMAKESPEC: win32-msvc2013 PRO_MAKE: nmake PRO_CHECK: nmake check - BUILD: Qt5.4.1-x64-msvc2013 QTDIR: 'c:\qt\5.4\msvc2013_64_opengl' COMPILERBAT: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86_amd64' QMAKESPEC: win32-msvc2013 PRO_MAKE: nmake PRO_CHECK: nmake check # - BUILD: 'Qt5.4.1-x86-msvc2013' # COMPILERBAT: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86' # PRO_MAKE: nmake # PRO_CHECK: nmake check # QMAKESPEC: win32-msvc2013 # QTSUB: '5.4\msvc2013_opengl' # QTDOWNLOAD1: http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_54/qt.54.win32_msvc2013_opengl/5.4.1-0qt5_essentials.7z # QTARCHIVE1: '5.4.1-0qt5_essentials.7z' # QTDOWNLOAD2: http://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt5_54/qt.54.win32_msvc2013_opengl/5.4.1-0icu_53_1_msvc_2013_32.7z # QTARCHIVE2: '5.4.1-0icu_53_1_msvc_2013_32.7z' install: # prepare extern install - choco install curl 7zip # dependencywalker - mkdir extern - cd extern # install Qt - mkdir Qt - cd Qt - if defined QTDOWNLOAD1 curl -kLO %QTDOWNLOAD1% - if defined QTARCHIVE1 7z x %QTARCHIVE1_OPTS% %QTARCHIVE1% >nul - if defined QTDOWNLOAD2 curl -kLO %QTDOWNLOAD2% - if defined QTARCHIVE2 7z x %QTARCHIVE2_OPTS% %QTARCHIVE2% >nul - dir "C:\projects\quiterss\extern" - dir "C:\projects\quiterss\extern\Qt" - if defined QTMOVE dir $OUTDIR - if defined QTMOVE move %QTMOVE% - if defined QTSUB set "QTDIR=%CD%\%QTSUB%" - if defined QTDOWNLOAD1 (echo [Paths]&& echo Prefix=..) >%QTDIR%\bin\qt.conf - set QT_PLUGIN_PATH=%QTDIR%\plugins - cd .. # finish install - cd .. - set "PATH=%QTDIR%\bin;%PATH%" - if defined COMPILERDIR set "PATH=%COMPILERDIR%;%PATH%" - '%COMPILERBAT%' after_build: - 7z a "%BUILD%.zip" ".\build\%BUILD%\release\target\*" - dir "c:\projects\quiterss" - dir "c:\projects\quiterss\build" build_script: - echo "building %BUILD%" - mkdir build - mkdir "build\%BUILD%" - cd "build\%BUILD%" - set - qmake -r CONFIG+=release %QMAKE_OPTIONS% %PRO_FILE% - '%PRO_MAKE%' - cd ..\.. test_script: - cd "build\%BUILD%" - '%PRO_CHECK%' - cd ..\.. artifacts: - path: $(BUILD).zip #deploy: ## FTP deployment provider settings #- provider: FTP # protocol: ftps # host: prokudin.org # username: quitefuncy # password: # secure: GUuFDbSezZ7LmK+pzK1w930brvyL+MmmU4B+ItMsa+8= # folder: 'files\test' quiterss-0.18.3/buildbots/000077500000000000000000000000001265173051100154525ustar00rootroot00000000000000quiterss-0.18.3/buildbots/travis-ci/000077500000000000000000000000001265173051100173535ustar00rootroot00000000000000quiterss-0.18.3/buildbots/travis-ci/01-before_install.sh000077500000000000000000000021421265173051100231170ustar00rootroot00000000000000#!/bin/sh set -x if [ "${QT}" = '4' ] then _qt_deps='libqt4-dev qt4-dev-tools libqtcore4 libqtgui4 libqt4-sql-sqlite libqtwebkit-dev libphonon-dev' else _qt_deps='qtbase5-dev qtbase5-dev-tools qttools5-dev-tools libqt5webkit5-dev qtmultimedia5-dev' fi # Remove not used sources: sudo ls -la /etc/apt/sources.list.d/ sudo rm -f /etc/apt/sources.list.d/couchdb-ppa-source.list sudo rm -f /etc/apt/sources.list.d/mongodb.list sudo rm -f /etc/apt/sources.list.d/pgdg-source.list sudo rm -f /etc/apt/sources.list.d/rabbitmq-source.list sudo rm -f /etc/apt/sources.list.d/rwky-redis-source.list sudo rm -f /etc/apt/sources.list.d/travis_ci_zeromq3-source.list sudo rm -f /etc/apt/sources.list.d/ubuntugis-stable-source.list sudo rm -f /etc/apt/sources.list.d/webupd8team-java-ppa-source.list sudo ls -la /etc/apt/sources.list.d/ # This is an ugly hack for partial updating of build environment from # Ubuntu 12.04 (Precise Pangolin) to Ubuntu 14.04 (Trusty Tahr): sudo sed -i 's/precise/trusty/g' /etc/apt/sources.list && sudo apt-get update -qq && sudo apt-get install -qq gdb libsqlite3-dev ${_qt_deps} && echo 'Updated' quiterss-0.18.3/buildbots/travis-ci/02-script.sh000077500000000000000000000023701265173051100214370ustar00rootroot00000000000000#!/bin/sh set -x # Defaults from Debian 8 with 'export DEB_BUILD_MAINT_OPTIONS="hardening=+all"': #export CFLAGS="-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security" #export CXXFLAGS="-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security" #export CPPFLAGS="-D_FORTIFY_SOURCE=2" #export LDFLAGS="-fPIE -pie -Wl,-z,relro -Wl,-z,now" # Debian adds CPPFLAGS to both QMAKE_CFLAGS and QMAKE_CXXFLAGS # -fstack-protector-strong needs gcc-4.9 export CFLAGS='-pipe -g -O2 -fPIE -fstack-protector -Wformat -Werror=format-security' export CXXFLAGS="${CFLAGS}" export CPPFLAGS='-D_FORTIFY_SOURCE=2' export LDFLAGS='-fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--hash-style=gnu -Wl,--as-needed' mkdir _build && cd _build && /usr/lib/x86_64-linux-gnu/qt"${QT}"/bin/qmake \ QMAKE_CC=$CC \ QMAKE_CXX=$CXX \ QMAKE_CFLAGS="${CFLAGS} ${CPPFLAGS}" \ QMAKE_CFLAGS_RELEASE= \ QMAKE_CFLAGS_DEBUG= \ QMAKE_CXXFLAGS="${CXXFLAGS} ${CPPFLAGS}" \ QMAKE_CXXFLAGS_RELEASE= \ QMAKE_CXXFLAGS_DEBUG= \ QMAKE_LFLAGS="${LDFLAGS}" \ QMAKE_LFLAGS_RELEASE= \ QMAKE_LFLAGS_DEBUG= \ CONFIG+=$CONFIG \ PREFIX=/usr \ ../QuiteRSS.pro && make -j2 && sudo make install && objdump -p /usr/bin/quiterss|grep NEEDED|sort && du -sc /usr/bin/quiterss /usr/share/quiterss/* quiterss-0.18.3/data/000077500000000000000000000000001265173051100143745ustar00rootroot00000000000000quiterss-0.18.3/data/bundle_version000066400000000000000000000000011265173051100173240ustar00rootroot000000000000008quiterss-0.18.3/data/ca-bundle.crt000066400000000000000000010162661265173051100167540ustar00rootroot00000000000000-----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC +Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X 7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz 43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV 6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH 1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF 62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh 4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G 87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i 2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no xqE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym 1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb 2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC 206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 +L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq 7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p 26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi 1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu tGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs 6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe 3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI 2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp +2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW /zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB ZQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk 3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz 6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW 1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i +DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH 4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er fF6adulZkMV8gzURZVE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m 0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL 5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe 2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv /NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz 4iIprn2DQKi6bA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB /wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG 9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m 1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH 6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS NitjrFgBazMpUIaD8QFI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC 2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 Fp1hBWeAyNDYpQcCNJgEjTME1A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi 3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP 0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK 8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY 83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 macqaJVmlaut74nLYKkGEsaUR+ko -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH /nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK SnQ2+Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp +ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og /zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y 4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza 8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB 4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd 8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A 4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd +LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B 4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK 4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs 2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg /9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch 6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 7CAFYd4= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa /FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO 0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj 7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS 8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ 3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG 29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk 3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt 5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s 3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu 8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ 3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA 7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k /rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy 7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf 8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN +lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA 1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ 9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo 19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e 3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c 6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn 8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a 77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ 6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl +zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH 6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ 2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl pYYsfPQS -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a 0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 aQNiuJkFBT1reBK9sG9l -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 jVaMaA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ qdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV 9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS RGQDJereW26fyfJOrN3H -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK 4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv 2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM 1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws 6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u 7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn 0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t 3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCED9pHoGc8JpK83P/uUii5N0wDQYJKoZIhvcNAQEFBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAxIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAxIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDlGb9to1ZhLZlIcfZn3rmN67eehoAKkQ76OCWvRoiC5XOooJskXQ0f zGVuDLDQVoQYh5oGmxChc9+0WDlrbsH2FdWoqD+qEgaNMax/sDTXjzRniAnNFBHi TkVWaR94AoDa3EeRKbs2yWNcxeDXLYd7obcysHswuiovMaruo2fa2wIDAQABMA0G CSqGSIb3DQEBBQUAA4GBAFgVKTk8d6PaXCUDfGD67gmZPCcQcMgMCeazh88K4hiW NWLMv5sneYlfycQJ9M61Hd8qveXbhpxoJeUwfLaJFf5n0a3hUKw8fGJLj7qE1xIV Gx/KXQ/BUpQqEZnae88MNhPVNdwQGVnqlMEAv3WP2fr9dgTbYruQagPZRjXZ+Hxb -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 DzFc6PLZ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO 8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn jBJ7xUS0rg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u 7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY oJ2daZH9 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h 2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq 299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd 7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw ++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd /ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv 2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp /rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo +uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG +EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P +UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE o2A= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7 09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7 XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28 MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI 2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3 gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i 5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6 zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ 54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk BYn8eNZcLCZDqQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp 6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ +jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S 5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B 8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc 0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e KeC2uAloGRwYQw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D 0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55 IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm /qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+ eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL rosot4LKGAfmt1t06SAZf7IbiVQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52 ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH 2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1 k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs 2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+ 8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE DNuxUCAKGkq6ahq97BvIxYSazQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF 6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF 661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS 3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF 3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B 5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI +MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6 yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q 130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG 9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4 Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0 aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N 8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K /OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu 7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC 28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6 lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB 0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09 5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q 619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn 2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG 5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0 BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do 0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ 44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN 9u6wWk5JRFRYX0KD -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2 MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6 dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO 76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj 2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK 8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb 2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq 8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U AGegcQCCSA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr 9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt 6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl 6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h 4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z +kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ 8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI 6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB 8zELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2Vy dGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1 YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3 dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UECxMsSmVyYXJxdWlh IEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMTBkVD LUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQG EwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8g KE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBD ZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQu bmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMg ZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUNDMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R 85iKw5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm 4CgPukLjbo73FCeTae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaV HMf5NLWUhdWZXqBIoH7nF2W4onW4HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNd QlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0aE9jD2z3Il3rucO2n5nzbcc8t lGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw0JDnJwIDAQAB o4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4 opvpXY0wfwYDVR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBo dHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidW ZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAwDQYJKoZIhvcN AQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJlF7W2u++AVtd0x7Y /X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNaAl6k SBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhy Rp/7SNVel+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOS Agu+TGbrIP65y7WZf+a2E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xl nJ2lYJU6Un/10asIbvPuW/mIPX64b24D5EI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H 5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC 90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S /wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj /+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS /jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D hNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz rD6ogRLQy7rQkgu2npaqBA+K -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz +uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn 5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G spki4cErx5z481+oghLrGREt -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r 6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z 09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK 6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH WD9f -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH /PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu 9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo 2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI 4uJEvlz36hz1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD 75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp 5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p 6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI l7WdmplNsDz4SgCbZN2fOUvRJ9e4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi AmvZWg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR 5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s +12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 +HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF 5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ d0jQ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG 9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R 0982gaEbeC9xs/FZTEYYKKuF0mBWWg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL 2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0 AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95 HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z TbvGRNs2yyqcjg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx 62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS 8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl 7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 +rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c 2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C +C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg 4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ /L7fCg0= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+ WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7 MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6 Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg 9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni 8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN QSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy 1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp 5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy 5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv 6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen 5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL +63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg 8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk 6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn 0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN sSi6 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm 7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK 8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB 95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn 8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ 2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA 2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu MdRAGmI0Nj81Aa6sY6A= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM 7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs yZyQ2uypQjyttgI= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx 3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC 4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF 9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN /BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz 4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 7M2CYfE45k+XmCpajQ== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX 4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ 51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr 6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN 9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h 9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo +fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h 3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX 0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c /3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D 34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv 033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq 4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE 1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1 OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/ Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM 0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9 Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K 2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl 6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK 9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA 0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN ZetX2fNXlrtIzYE= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN 8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ 1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT 91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p TpPDpFQUWw== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK /yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD 3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE 7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb 7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka +elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp 3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp /hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y Johw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0 aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z 7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA// DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8 hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs 4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3 j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG 52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy wy39FCqQmbkHzJ8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1 dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0 aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9 7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74 BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9 JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0 PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2 0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/ 6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7 K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0 b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0 cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS 1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB 3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9 opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r 0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f 2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL 6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0 uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv /2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N 8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2 9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5 wSsSnqaeG8XmDtkx2Q== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290 IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD 1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/ 5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f 46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth 7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0 Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70 WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm 7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb I+2ksx0WckNLIOFZfsLorSa/ovc= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG +7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M 733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5 mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ 0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA 7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH 7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ 4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c 77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 +GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIGGTCCBAGgAwIBAgIIPtVRGeZNzn4wDQYJKoZIhvcNAQELBQAwajEhMB8GA1UE AxMYU0cgVFJVU1QgU0VSVklDRVMgUkFDSU5FMRwwGgYDVQQLExMwMDAyIDQzNTI1 Mjg5NTAwMDIyMRowGAYDVQQKExFTRyBUUlVTVCBTRVJWSUNFUzELMAkGA1UEBhMC RlIwHhcNMTAwOTA2MTI1MzQyWhcNMzAwOTA1MTI1MzQyWjBqMSEwHwYDVQQDExhT RyBUUlVTVCBTRVJWSUNFUyBSQUNJTkUxHDAaBgNVBAsTEzAwMDIgNDM1MjUyODk1 MDAwMjIxGjAYBgNVBAoTEVNHIFRSVVNUIFNFUlZJQ0VTMQswCQYDVQQGEwJGUjCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANqoVgLsfJXwTukK0rcHoyKL ULO5Lhk9V9sZqtIr5M5C4myh5F0lHjMdtkXRtPpZilZwyW0IdmlwmubHnAgwE/7m 0ZJoYT5MEfJu8rF7V1ZLCb3cD9lxDOiaN94iEByZXtaxFwfTpDktwhpz/cpLKQfC eSnIyCauLMT8I8hL4oZWDyj9tocbaF85ZEX9aINsdSQePHWZYfrSFPipS7HYfad4 0hNiZbXWvn5qA7y1svxkMMPQwpk9maTTzdGxxFOHe0wTE2Z/v9VlU2j5XB7ltP82 mUWjn2LAfxGCAVTeD2WlOa6dSEyJoxA74OaD9bDaLB56HFwfAKzMq6dgZLPGxXvH VUZ0PJCBDkqOWZ1UsEixUkw7mO6r2jS3U81J2i/rlb4MVxH2lkwEeVyZ1eXkvm/q R+5RS+8iJq612BGqQ7t4vwt+tN3PdB0lqYljseI0gcSINTjiAg0PE8nVKoIV8IrE QzJW5FMdHay2z32bll0eZOl0c8RW5BZKUm2SOdPhTQ4/YrnerbUdZbldUv5dCamc tKQM2S9FdqXPjmqanqqwEaHrYcbrPx78ZrQSnUZ/MhaJvnFFr5Eh2f2Tv7QCkUL/ SR/tixVo3R+OrJvdggWcRGkWZBdWX0EPSk8ED2VQhpOX7EW/XcIc3M/E2DrmeAXQ xVVVqV7+qzohu+VyFPcLAgMBAAGjgcIwgb8wHQYDVR0OBBYEFCkgy/HDD9oGjhOT h/5fYBopu/O2MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUKSDL8cMP2gaO E5OH/l9gGim787YwEQYDVR0gBAowCDAGBgRVHSAAMEkGA1UdHwRCMEAwPqA8oDqG OGh0dHA6Ly9jcmwuc2d0cnVzdHNlcnZpY2VzLmNvbS9yYWNpbmUtR3JvdXBlU0cv TGF0ZXN0Q1JMMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEATEZn 4ERQ9cW2urJRCiUTHbfHiC4fuStkoMuTiFJZqmD1zClSF/8E5ze0MRFGfisebKeL PEeaXvSqXZA7RT2fSsmKe47A7j55i5KjyJRKuCgRa6YlX129x8j7g09VMeZc8BN8 471/Kiw3N5RJr4QfFCeiWBCPCjk3GhIgQY8Z9qkfGe2yNLKtfTNEi18KB0PydkVF La3kjQ4A/QQIqudr+xe9sAhWDjUqcvCz5006Tw3c82ASszhkjNv54SaNL+9O6CRH PjY0imkPKGuLh8a9hSb50+tpIVZgkdb34GLCqHGuLt5mI7VSRqakSDcsfwEWVxH3 Jw0O5Q/WkEXhHj8h3NL8FhgTPk1qsiZqQF4leP049KxYejcbmEAEx47J1MRnYbGY rvDNDty5r2WDewoEij9hqvddQYbmxkzCTzpcVuooO6dEz8hKZPVyYC3jQ7hK4HU8 MuSqFtcRucFF2ZtmY2blIrc07rrVdC8lZPOBVMt33lfUk+OsBzE6PlwDg1dTx/D+ aNglUE0SyObhlY1nqzyTPxcCujjXnvcwpT09RAEzGpqfjtCf8e4wiHPvriQZupdz FcHscQyEZLV77LxpPqRtCRY2yko5isune8YdfucziMm+MG2chZUh6Uc7Bn6B4upG 5nBYgOao8p0LadEziVkw82TTC/bOKwn7fRB2LhA= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0 YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93 d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst 0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK 1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ 8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm fyWl8kgAwKQB2j8= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ /jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs 81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG 9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi 1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP BSeOE6Fuwg== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF 10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz 0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc 46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm 4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB /zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL 1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh 15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW 6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy KwbQBM0= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i 2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ 2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHWTCCBUGgAwIBAgIDCkGKMA0GCSqGSIb3DQEBCwUAMHkxEDAOBgNVBAoTB1Jv b3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAGA1UEAxMZ Q0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSc3VwcG9y dEBjYWNlcnQub3JnMB4XDTExMDUyMzE3NDgwMloXDTIxMDUyMDE3NDgwMlowVDEU MBIGA1UEChMLQ0FjZXJ0IEluYy4xHjAcBgNVBAsTFWh0dHA6Ly93d3cuQ0FjZXJ0 Lm9yZzEcMBoGA1UEAxMTQ0FjZXJ0IENsYXNzIDMgUm9vdDCCAiIwDQYJKoZIhvcN AQEBBQADggIPADCCAgoCggIBAKtJNRFIfNImflOUz0Op3SjXQiqL84d4GVh8D57a iX3h++tykA10oZZkq5+gJJlz2uJVdscXe/UErEa4w75/ZI0QbCTzYZzA8pD6Ueb1 aQFjww9W4kpCz+JEjCUoqMV5CX1GuYrz6fM0KQhF5Byfy5QEHIGoFLOYZcRD7E6C jQnRvapbjZLQ7N6QxX8KwuPr5jFaXnQ+lzNZ6MMDPWAzv/fRb0fEze5ig1JuLgia pNkVGJGmhZJHsK5I6223IeyFGmhyNav/8BBdwPSUp2rVO5J+TJAFfpPBLIukjmJ0 FXFuC3ED6q8VOJrU0gVyb4z5K+taciX5OUbjchs+BMNkJyIQKopPWKcDrb60LhPt XapI19V91Cp7XPpGBFDkzA5CW4zt2/LP/JaT4NsRNlRiNDiPDGCbO5dWOK3z0luL oFvqTpa4fNfVoIZwQNORKbeiPK31jLvPGpKK5DR7wNhsX+kKwsOnIJpa3yxdUly6 R9Wb7yQocDggL9V/KcCyQQNokszgnMyXS0XvOhAKq3A6mJVwrTWx6oUrpByAITGp rmB6gCZIALgBwJNjVSKRPFbnr9s6JfOPMVTqJouBWfmh0VMRxXudA/Z0EeBtsSw/ LIaRmXGapneLNGDRFLQsrJ2vjBDTn8Rq+G8T/HNZ92ZCdB6K4/jc0m+YnMtHmJVA BfvpAgMBAAGjggINMIICCTAdBgNVHQ4EFgQUdahxYEyIE/B42Yl3tW3Fid+8sXow gaMGA1UdIwSBmzCBmIAUFrUyG9TH8+DmjvO90rA67rI5GNGhfaR7MHkxEDAOBgNV BAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAG A1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS c3VwcG9ydEBjYWNlcnQub3JnggEAMA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUH AQEEUTBPMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggr BgEFBQcwAoYcaHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBB MD8GCCsGAQQBgZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9y Zy9pbmRleC5waHA/aWQ9MTAwNAYJYIZIAYb4QgEIBCcWJWh0dHA6Ly93d3cuQ0Fj ZXJ0Lm9yZy9pbmRleC5waHA/aWQ9MTAwUAYJYIZIAYb4QgENBEMWQVRvIGdldCB5 b3VyIG93biBjZXJ0aWZpY2F0ZSBmb3IgRlJFRSwgZ28gdG8gaHR0cDovL3d3dy5D QWNlcnQub3JnMA0GCSqGSIb3DQEBCwUAA4ICAQApKIWuRKm5r6R5E/CooyuXYPNc 7uMvwfbiZqARrjY3OnYVBFPqQvX56sAV2KaC2eRhrnILKVyQQ+hBsuF32wITRHhH Va9Y/MyY9kW50SD42CEH/m2qc9SzxgfpCYXMO/K2viwcJdVxjDm1Luq+GIG6sJO4 D+Pm1yaMMVpyA4RS5qb1MyJFCsgLDYq4Nm+QCaGrvdfVTi5xotSu+qdUK+s1jVq3 VIgv7nSf7UgWyg1I0JTTrKSi9iTfkuO960NAkW4cGI5WtIIS86mTn9S8nK2cde5a lxuV53QtHA+wLJef+6kzOXrnAzqSjiL2jA3k2X4Ndhj3AfnvlpaiVXPAPHG0HRpW Q7fDCo1y/OIQCQtBzoyUoPkD/XFzS4pXM+WOdH4VAQDmzEoc53+VGS3FpQyLu7Xt hbNc09+4ufLKxw0BFKxwWMWMjTPUnWajGlCVI/xI4AZDEtnNp4Y5LzZyo4AQ5OHz 0ctbGsDkgJp8E3MGT9ujayQKurMcvEp4u+XjdTilSKeiHq921F73OIZWWonO1sOn ebJSoMbxhbQljPI/lrMQ2Y1sVzufb4Y6GIIiNsiwkTjbKqGTqoQ/9SdlrnPVyNXT d+pLncdBu8fA46A/5H2kjXPmEkvfoXNzczqA6NXLji/L6hOn1kGLrPo8idck9U60 4GGSt/M3mMS+lqO3ig== -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ 8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg 18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD -----END CERTIFICATE----- quiterss-0.18.3/data/ca-bundle.qrc000066400000000000000000000002041265173051100167310ustar00rootroot00000000000000 bundle_version ca-bundle.crt quiterss-0.18.3/html/000077500000000000000000000000001265173051100144275ustar00rootroot00000000000000quiterss-0.18.3/html/adblockPage.html000066400000000000000000000012371265173051100175140ustar00rootroot00000000000000 %TITLE%

AdBlock

%RULE%
quiterss-0.18.3/html/audioplayer.html000066400000000000000000000010401265173051100176260ustar00rootroot00000000000000quiterss-0.18.3/html/news.html000066400000000000000000000013431265173051100162720ustar00rootroot00000000000000 news_descriptions
%2 %3
%4
%5
quiterss-0.18.3/html/news_rtl.html000066400000000000000000000013431265173051100171530ustar00rootroot00000000000000 news_descriptions
%3 %2
%4
%5
quiterss-0.18.3/html/newspaper_description.html000066400000000000000000000011321265173051100217210ustar00rootroot00000000000000
%3
%4
%5
%6
%7
%9
%8

quiterss-0.18.3/html/newspaper_description_rtl.html000066400000000000000000000012041265173051100226020ustar00rootroot00000000000000
%6
%5
%4
%3
%7
%9
%8
quiterss-0.18.3/html/newspaper_head.html000066400000000000000000000003751265173051100203070ustar00rootroot00000000000000 news_descriptions quiterss-0.18.3/html/videoplayer.html000066400000000000000000000010541265173051100176400ustar00rootroot00000000000000quiterss-0.18.3/images/000077500000000000000000000000001265173051100147305ustar00rootroot00000000000000quiterss-0.18.3/images/128x128/000077500000000000000000000000001265173051100156655ustar00rootroot00000000000000quiterss-0.18.3/images/128x128/quiterss.png000066400000000000000000000231651265173051100202610ustar00rootroot00000000000000‰PNG  IHDR€€Ã>aË&8%ßœöÂ+?^ø¯(ü$Y:‚ Ýçç XÃù`ãöæï?þoŸþ#)½üï|Çxÿý÷ž pâÄ Ù²,¥V«‘égc/%_šþÖäˆþŸ@{—e%¤J*¨² š¬‰G™É£;~È£X+Bͬaé8M0M#ƒ® SÍWï¦d~uû|õÛÜb~…•ÀúÙÏ~¦7,AÓär9IF “ß§©%ÔÑc‘7ÄÊgLQdU#¡Ô$Iˆø£â¹*)# òØ.mA¦œ|5e£L/,f*¾ˆRÆ¿§†ÔÏEY …B°´´Ä~ü㛿øÅ/¬±±1Þ”‚=† ‘E@K·&Qø§ÈìË(d~H ¡ð0›…dp ÂZ_WG8ä±Vˆ‚?¿ rA.ä>¸e)¡û¾€ 8Œ E£Q8rälooK8y›˜¦)áʗ눒 †Âf‚)àÇÕGáMÎÃDx bþÕ *Ex$C2¹eIuË@ùá&WÀL.bítá2ʘ­®®JuÀØ躎ŠÂš €SCD©Ñ¿UYŸŒLÁx(1 ?$¬­ê&Ô¬ÚH8ÂJÂjD<jAˆ`r±@LTzDè'¡ ý8ɵ³B¡ ¡œIÖüôéÓVgH€°•’ áSübõO„'!šIbPáHWÓÕ3P2Kââ£qpCÃOJ×(D¾ˆä:‚Á|%‡À°£ÂÈ@lÉÂW*^W€ž<«Ï®áS|ÂÿGøÑÌé9ÈÔÒ°ZY…ÅÒS`Œ¤rÄþñK8<)ß*BÝ@ rÕ,PVäZ*a;AîÆÛ• Üï¢4 n@^ÏC•@Çç½0²<|’¸Êa£¶!,A„GÐÞïÉ쳺ko{Qr§¶P¼Yã55áû tŒê r ÄÃû¯‹ûO²°`c‰:—…âFðâ/j¼ %-º0«ÿÒÈ Ôo‡ñJRÕªøç“PJ Þj6È$"51Íú£[á{râçu]Û¹c#é7ï“Éa®T…|Þ&j J’ƒ&M›Rà¼C6CR€7tÙZÍGÂos¶5R´ÏY¶ÄßÓqµjdyÙwÖe£½¸aÅÝÚßÑ:¯ü˶ü¶›Ÿ}ˆ¡Y-A˜4èÅÂ[Äï^6’ã…Ï›QÃÍFûdœ,æ`V‹:}Ô™ËpC°érI¸†¡…B6çΗ¦ Øò|éic‚¨è¥«„V«Vµ^L(›å¿áKµ¢Ã‹Á˜/ J4…?°àÆä÷Œ|¥À­Û‚÷9›+߭йÝ~¨ñ§u¼9þÌfº~›Â–œ‘‡•ò TÌŠàîîýåÄæ† …DÃs «-ᬀ/: ‘<ƒH¥ù€o@ qßÙò¨ðÖ8`Ïßœ ÌÁÉðÉžÀ ¾:Öm¶ª[°UÛÏ7ñy%[˳ò³? á»æ«épº…ð±‹xgu0¶?nU@ŽÎÃtµ'òáZq€Ì5µb´ómáû_"¨!ROT8y FA<Ï9a!Šh6·Q)òzA°Ži=-žP9ˆ|®<€àG pV¯B46 ’–«€Ê‹ŸSN,ÀdnŽn×à bY’,üPÐ-8SÜ_€œžlSÿÚL ÓPšiüÓ:È"ÛX®,£¥Øn*EÉ,ŠGbÃ,°ýk(ü w΀Ÿü<*¨Y²ïŽjA̧Á”€P¥ 5Å*Á@¬o¸ëØLqq•–7æ-ÃçÆ}cb^‚‹Í×H!n羄+ÛWmL¦ö0` üyƒ6û p}¿µŠ¨ÐNÈðÒc´ˆÅÃùÌ}¸ë‡‚Ò¯`]\÷€Wf¦¡cjÆHbœýJâe8> = «•x\|wó÷®8ÈäÇ•?[.ÂEKmæ<ðê|-ÓŒ²­òSüç`,1 ¯?ûV¢(hUÚ ! ÈÛi`¾/u ˆ[ö‰™Ð0iVaÊ? ³Y8>!åRi VP)¸bX+_|–ª ô@IÕrÈ>4À¾žWøàó«èüÑMØÄi3ÈôAZäãFÜñâ"VOs¸T0)„<þ ¸» 0Ã=´wrwP V!SË«0hàÈmPchþãr´pÿ½Ž?©WGIR‹€ŠøO?ø’ó2аQ«AƧöx§uîᆠ¯ˆóàF3,$.#>X…Ö?®!£gn¸iÁ|)Óñ ¤æÁÊßBðW®¯þ¢µ¶V€ƒïøkpâëwa£R‚t0°c%¤né žóv¤É8ÄFN¦àÓ?€—“/Ãbiá.˜ÚŽ¿ Š`lì$H¡ X¹Œ`ÿlá7nŒ¿Fis ÃQ˜b[ËðV†€â~À&|ªŠ Ïax?5%x„NðÇ=!× °…f;ï9ð=ÕÈ0ô ×bò¥P!¦á ‚Åû…°T^j³O¨Öà\. c󯃈cloîmñø>’cQ¼9|Šn†Iöl§Š€q¼ËBrþˆW/Úèí/|r%åì°Ò:Xº%¾WS êÁoæ `v²v%xN0A¯ÑP„T€ùà1Cq3sÖ«‚q$‹ÀñæJºÚÔIð§Ž¡Æok9ˆ¬9«²V龨´…ßyð5T^} Úôy`jÔA¤g3†D2Õã5Ê[T:¤ßn½´3ÈÿœÀþƒ„ÿÔ·áÅØ%¸’¾ ÿ¾ñ!”Ëe(Z îµGÿ ÉB¤ Foýì‚®› ®.tYÙepÁ †„fùñÎ{ÂnkÇ®µ`)èÛEXY/Áã’<êùßxO¾f.€7B Ø—sþdëDáw{¬Â Ìçl!`O‚8ÌAÅ”Ä%Ìø§áªïܪ]ó•¡¼^€‹%¦Çƒ ŽGëHï‘e»3¿ÃŠB¦Ÿï±ðíß±0¼¬m¦áþV>«ip3Ia-—h÷ü¼ENCrÐŒv¹!nªZíÊ5o~D 7I˜ƒ°j¿F?S¥áo9£kDÅT¹QüsGº_-_‡L~^0*p±ƒäÓêÅ»Ý`§níbGë‚%“‘…Y¨@:]„[›:|­ã}ó! ‚O“럣ÅüwBCA­ßþå·ké]ßçIéi×ksYÐÆ|I¾%µ1¡Ù/”†ü7 kX;‘‰G8=)-%ÒØàuî®~ ™Â*H•<Ì› "q\»0¢p9@E ëéJˆU$á¯màË­*|ˆÂ_ ‡ÀŒÀÖÐÈÅ¥¬-p xÚ°#íe§Ù:¦üSpþ]˜ OÁÞƒÿ½õ^ÜJÃk•u˜È—@H€äWÅ÷æ^ìnγý½‘-@q# ›EømÍ÷}`á b~P| HªÔQOÈÚV?ïÈÒòÁZ€–·oÔ6µŸ %ô«‰MºÈªÒ z€5À£âc&ýÂJP\OnBfÒ¢ý|ª¦¢SàWýêU¸¹t ×nB¥ð.êy8†f:29°]‚åMøâ^&鬣àïgªD5ø*†2¾7­|5 Ú1?ë]zÏ›©€º àîTÀ à^ëNú”Ô¡ù´Ž!Hø§#§D6ÜCA$EʨUºÑ„’ðæ‘7 HÁ'Zî-JPÌ>k%ÇL€˜¬U÷Dô{B˜F^‡å |™Óá ÷í` ü¸êý!Í^ùŠä`}ñf”2䊠燠©4?Üø^J,Àˉ—+œ†ˆ4˜~¬NÂhšg'Î@Ì…«¡¼óÕ;`fŸ•æpÁo§…Á<)€…Ö­ºnÂ,ƒO #1Åðmï´„Üû®×Q÷4†=îåïÃJy Æ´ÏàX訰 ÓÛGÔÁ(Yƒ±ð8¼<»!´2åÛÿ á …€phŠLXîë$ £œÉ ˆäóBeóÇ !Òg"MìN©¸G ¹À-5¼<¼Q0Šbp¤I–áxh^ÔÌ‡Ž ÄøŒ‡ÆKQeˆcH¨D‰ÈZµ¿¾ä&²ïÃ÷ÔÆf`úÉ-C ñW}“æeû'‰Úâ]@p°. úºkŸŸÎ´[¹á( œ®eÄÎ嘆¦Uc¼¯õg P(üÞ³ àCà¯T(è‘üÙ‹ôi¼!úx &á'u4±ÙÎÙÝdmÑßIña&ƒ¸×퇃6«›p-s¾z .Å. N¡ŸaaXjdŸ F À.±Wk‡`;¥ß½éYKüº¤Z #,ä R«Bü®?×ð¼ËìN¼6öªàúi@É, ³LiWʸQ©ÖA ÚCO‘Ã6ÿ‹xÝsѳ"D„’ÛhAl‹/gÀ\þ4¾ðU¿Ìæ÷YÝ’à% ÌRôþÜ0@O¢¹WDí8oɤ2²§f”ø¤ª5˜+áK+*ÀsbX{-àN40p ht*³>kSþÓ‘Óp,xTô¨òšè "6„ 2Ð(›Qߟ§ðN…ƒ®ß£I×ÝÂkVñÚt­L- cçEùQÍŽ•ÉÄx½œ¾y”csBÀ*Õ‰V¯°oƒŽqý‘:‡¦Gk&DÆc ‡‚¶±hÞDR€(±1Ϥaª˜[´o@“]`¶ÃÀåöƒ´ú÷3·TÏO;¶À QüF½ÛY šUêxƒ©î%åzTx„×Y×8='x§‘‚i`Vó QgÑwSª¸`×ý‘ðE¶×WþêÒ&Ü^/ÂÂÍb•ñ{ž@ŸÄ["‡Böÿi$ÕÌÈ‘ 30fÖ€ãïÅþ’‡(€ÃpsÝSï½NÝxš­(¬ùn ëhRéVÁœU Í#E³﮿'6™¼1ö:¼œXpöML½ †}J0(Jþ9uÁÈÔt02y(|ý>ÊIð'Œëqñ70ÌûÖƒux%‡~þÂ`´?B=QkP ß/AXQ@1,Á+íwOY žºƒ¸À­»Îû¡öDéÃG©á Ñó¢ˆó ®8ÚHÉ¢½²ŒnÇÓâSaaHá^K¾*2‘» eægïŸÀ/œ‹ðõ$|#›ƒÚʤ7ux(¿ wÂëÓ8„üvÔ±\ჲ Û[eøþÕ[à?2ÚÄ8Èá M#[e•~ˆF’pª†eÿ”Ñ 8¯îÎÓœ n€—&0„@€ø|òËÂ7k 7Çï,tDäVê!™ñŠUíëZNI©ÈÕâ‘Âíæ¶Èÿ›ùàÅg NÌ! £µg‚¥èïÓP[ß„l1ÛÊP“—à˜´&_‚-nã†y+(P½À>ø¶SU|©$hcÔ€½ŠVÀáHæÓaSAIÓ:Š?²|Èé`¾geÌ`Åí$š§Â§V ìàÜ׈6êù¢ç÷§dÓje þ´}EìV–PIá¨î@jY}¢·^q¤ê:¨g.ŠðÏ,@ßÌ@iq Š¥dÃçÁœ|f&Ž@T+¿t®çn#AêhòWÐZ¬f0öÏdàâ™rU ~™ NУ 8R+à ê#@µˆ²séïTl ¹(t×xä•á¥ø‚P„ki¼É™}¿÷RyEìD&úwÓ?Å(SÚ,/ob¥A™këT¡ôø)TÊ –gþ|S—a"•‚D"³¸z«ù*lšÛ¢úXÑ$Ä}”Ë—Ñ(ð/ÛèÊÛðƒå |¯m/( Í½áñ)˜GŒ¡¡Ë÷ö¼¯Ì¡|t‡FòPOE"¾”qŸn}.*ú±dM¾ÎÝ…"F'ߟü Î5{!›hLŠÚ1TKÿÛ?aœWÆÐ5‚~þP›X€ØäYˆMuã¦äåèóQLîJìA9¨\ýu³~+Ï!¸àb©/Þ¾ñ)b„2‚@j3wo™‡J´ä¸}Þ ‡²~!%(JȨ›ùlqF(;{»¸;¥Í¤9= ÷QXT›Hïq2|B(±Zø ãoC­R®Â ¥¢Ç!˜:'V}8ŸÏ'*‹QU4};õMøtûsØ®¦E5óS÷f?TðùcYrY¥|üÙ2pr;ZÒ2œØUÖ›ílßJ nΩÕ†= Aø0^Š_„YŒé§ “ áÍ#¿N­hÜv0'¥!pùEúH耩Ñe2vjlšÎU+œöD"±êƒÆ©ø;’Ôž …o¥Þ‚uÁoèÂÊPø¦øUAèŸTxPÖPš‚ûQP‘´}ZÊu•ƒõÚ04 À{šÃM %1Œ‹ªQ‘ þ÷?À­ìm¡^F•àËÜWBÁHȬÇãq!t„dHà´âég$ø^!u £¥úæøëd^Ë|a+.µˆAK@™?CE³†£ÞÀ™Š>eŸlB?aà0£€•{®@„Þ À½‰7œºg_Gx¿ðÐ3& ÷›•ÿ¯&¾ \»5„Þ¹ê{ ªa<9)v!-•—w– * ›¨ßÆûÚ¹æPöÌ^õ:ök \Úk;ÙÀçew(Ý<„ ^ˆžŸ¤BD‰ˆˆÁ-@¤…×Ó_àûhp>ú‚çlb@ Æ“ÚÛ4 a1ÜÄú»£®vÇì(.,LKÂaoHŒåãɄڛ2>ª ¢tƒ¤ÝFÊ7a9$òD0Q1i¶–s•[ ¶vkèF¨ }Qwè±yÒ7g#§áfö¦ø:×ö]wH ÃÌjv#YÏçŸaXF>Ô/ù` WMX ÐÊ KwÆ ëb¢—?D\ðÑÆÇP0݇ŠÄÜÏ?„i|2åžhnŒ&è^¼…Q}jb1 »ç’üõÌ´—„í}ÖA®ÊâòÁdhg_ö ÔvI7NzNqý0-½?5‹ k_G FŸOnÆ}t#2ú{ÚŸàõóÒõâ—ß@§®ˆ²÷A Ÿ{ëÐ_ƒˆÆ‡`í L»zÔÊ“BØgÝ„à©ö Mj\<'% üü¤?%¨ØƒCY qmŒÏ?øüi陫ú²äF>Üü^M~cÏäÑnƒÎXL 8½;/ðqéIÿÂg ¢†PÞ/ZŠÃëøñzëx‡qv¥V…Ízaˆá𦠅“áãb÷OH 5÷Ž/BñwVÏBQÔù§Z^Æ’vìë·²·1ˆ5<>‰¨¼ˆ±þ tI[ŽÛÈ‘Ù~X°÷(¾•zÓóõ§üÓ¢ø…8 Óu ;ÖÚ¿¯«doÈ °‘{”èMÄd)Ó|Z\„™à œÁŽ^·#¿àúÁÔ“à­ñ7…j9ÝUÅÑ2††·²_ @g7´P\_?¦ÙJøuþž§‚X^/Ý©t¿%§+³íÙ“~U<@_ùîÚð¿žýR˜ßAU+¸zr ‰…Iv3j\õT൚ÙN½‰ÑØN/•’óÕmÛ;ÁàA mkå5ø«ïÂg[êË·Ê$¾š|EL7ƒÒÇØø£` k¦{…´k 'ŤpØ;[öMw„ÝoÏÕéCte:n†ª…é¬<ªë£ÕK.¡×5nˆ¢£¡#PÂfµ¼Ž×Ù?<£ß§ÒvjRM«yÊ%>i¤³ÏDì†×\D­ÕØnŽóé# €DCkI8;°Iæ—Š?¨sÈé›#úŒÈÓf–o$^M%¥f§Ïý'…rË•U0-o{Ð)+ªPb§÷¡ ðÚ±Áù©a{°‡5´ývõwbz§[m"%TO&ÙEyPx„JøÌóXI_­Ç„°dýZH·r ›%ǼW;²Ã-YÂ0ñ3´„ 1ˆêíuæÑ^ƒŠOúQBþlƒ¶R4][Äù@-t…¶«;`Ð9é|¡ÅÒ3A QL߯;8œƒS‘0‰–Àég } wó÷Åg±¸åA’upûýºŒf£È]Î 8ìD£H@Ý1éˆXžð€Ø²vTpÐáNN!òŠ”ö8N&]_;ªDDã+J¡‹Ù÷"Û¤‚—ÃÉvÐê#|³zÀÆ @6¨$Bézö¦§òtªˆ;˜tÑx-se€Åûï(ŽyAÐ3图¯3Œ#pGåXµMÁ¸mW3be;·²_ fŽj¼úUú<)ÿ8\N\‚/27EGq'„Õ}TÀWn8íŽDB°¿¡U«Up+Ú¦?´­aÇ”wµ UD±ò©ð aê¨:ˆþ½C‚m®$:Ð,Š¢‰íZF¬fÚ$JÊऔŠJÂïäï‰úÀêz§1:­HÈ¢¨(îë ¨„Œ\e6)eìÖ PúÙ踚¹!¶ÍïÇô⇒ à=*Ü Mâíǵq‘ï'¶M¬ø=úõ¦9%@ˆM_jwD w¹²R?lo E ŒÀu$?= QÉ=ÝJ¤bNê8FV‰òNˆ*J^Ñ®¥©€ßµÕi°‚”n6ž|ÖË&󞾇:™³iøÞä·á‡³gû8—Íš(N~+õüç¹ÿ(,<'×¥î¢ÿwõ÷Šô3NEŽ Á8ý¾‹E±‡÷Ю”rCy¾Ë0°£&ïÏøQP´ê¿•ú¦xìwåøÛ©ï‹/ ¤ Y 2ÝäÉ-ô¬¨tú%gÁÄKôÓË ¡&„kt¶agÛ¾‡Aî Bzf{SÁ>É/Vþ7Ç߀ãhF}!g&’6„žŸ¥cû­òÛ_çîÁbËù@^hbêI<œvÌKÕñªô 9]ÿm5ÃÊ´ƒÀýƒA2c”¿§ò®A¿sEÒÆR0'ƒÌ1RúÖë˜@PGÜ€ÓAî‡Êɽ*@L(€[vÆ}F@r~w>†òë£ç‡óÛïDŠ<…‡EÕÒê_nÙæó¸)8íæŒÚ6õlB׎¨|‹ö×÷›ÜØ/f¦ë¶ð;8H‚LòãÂSÁÔyÍÝSXH!¬ê€¨)èEÁ_ôgZ¸æÑ±ökºrÝÖižð»Fû®â×fIÕ Šx{oI1:ÕýÝÈÞò´;ˆx:Ïè\ä „„Âí}= óFÞsn€Î1Š)Qpšh ÍÝèäÂÆtmB滄ƒî|˜÷A¼9åðý8Ü&;"¸%ü³a¹?G˜R\ˆ½ Àç~×"ðI|zx9³˜¾Û^¡`—ЛX}˜¹€=MÛ™‰z;ìAf™(eÍa!…ŽB_«PÅφ'¾>Pk,€(\Áë­ãõ¼l# »œ3|X!¶_¼I7¨Ÿ-§Cô º~—§‰QÂhµâ¨!'k°ß @¹¯…"Y€®=›C©èb›ëWéÕÑÒn³& ]D?Än`_,?sÀµï­N,\¹žô²ý‹Ü ]gw᳎ÕÙÙ` T°»ó(Èÿy>ni¼Ñ<åÛù°·¢¥½—pS'ï¦ÙýÖÅ£—(ÇMÕ}†è00À.§±Ž?¤ñƒ¨Ûw¢h„è‰òe.ÿ¤kY‘´é'Nwz­þ̼Ó÷äÃÃÐÃÿsØýèsZa£4t pµ†€Nçî•Í&j¼1u3©=Ís¯k/à:ÀðöDx~÷´2ëÆC¤‚[0ß5“Ì•H {T¬Š(¯˜U×¥t£oxìÒaƒ\Õñµ¨ ©—ÞÆäª!ј¢w ÀÚ·ºæ=¤ƒ»q@·Xª¬Ø½ñÌá¹òýT0ò øÈnHárЩ¤¤¤^0„ ¢˜"z9rV=AI$Õ|õ= {³¯Ücƒ`o€Žp£Ý;ýæá÷»©äÞØÀ¥ й!Ü”!Üoè°QzÂѵ„ ðÀ> žÃ¿ϱ;O;4°“nÜÏ€8£çvî«¡)½?íÎígèu á…¨!tXòU Øý5lž£wQj7#È[vo Ú¡ƒÛÓÁ»m # x/ÿndn÷ÕÄy7"çNþ®°4ýì( P]÷±ÐáÕ´ÇßÉuLjŽã!,I%E¸€îõϺ˜:ÞrpÐnÉ7óV Ø; Cš–+kðñÖg‚¢\z¿ô0 ŠëZú¦`ØŠÍS»¼ZCÔþë¸ú Á˜uxýA´Ôg=_ÉYÆ=w wµ;ØÉKm(½ÞIƒC/Æûk‰BÂÿÝÚûÂfRÓHR"Ë ¿<È&V¦ÈœƒY·oë¥Gµ÷×?E¯$^¹n7©bª ¦2ïÛèóin_µþBwy^ kè¤Ý\¨"N³[¢Ñ¤’é1ÑÝ;"VRB‹µ%h¥S˜VÂÕIŒñ TÒEígkl±:³<ŒÁÈ<°Æ±¨œ 3N{à­fÅkÒ•Nh[±ãg;- ©)$m!_JŸZÙ.t£?=RˆÆ†AžTl‰®dEQ¸e.­íœ|Z¤Ä î0ý?J'XÝû:À€\€È¶Éö(¢ƒ—¡CM¯ˆØ×:&„j;„KE4¿Îß?T³IüÁ£Â1‡9H‰iÂÚbòÖ½ðçÿìè¿.ÿÏ[*¶]–JŽ”¬~Þ-ŲVÛÈ0p³<^VK£¨÷ nª½9 iY&£“ÅÉÐz„i?˜Ž†ñ³¶Í!ç»0  C iå[qÒx dqr¶$úƒµ£O/qõh¸UIl4Y[£¨†´øñsBþ¦©3ìlØ‚‡úy9Ât\˜öå»-Ó ·~Ÿ7Ý/«ç„;Åô¥¨[†Ä¥*7,É’ ™"\ùL¢Ä«ç§¹b Üá•ÄùxPø×Nü´†â ¹»%êvU™É5Ô‚nÔ¦d2CÒe{åKuFб~V“º` ³F pЃ,5ÉÆvÕ–'h&œ4I+ä@W¾Ï2 :(›M·ÓÂ% ËŠà °1ªzuä“ߨ–À0j®€ÕÃBš2jS[ÖŠ_ñû«V5‚@Ào2Î4evD`  ‘»4Ñ4ì„ñÑèa Lçty/ @•ÓK™Åå;+W'ÏNĦH7´Š ƒñ:«@Ú…mÑiÛ£`ðÀô¬M ¸ñpsIùXùT ©©P*t”il-BÊä–fÚJÂF ПÿPºÀ¥}Þ—T\-VËÏî×JÕÿ~é‡^ˆÎD_W™º€®!i@G¡Ö­Åhü9ó -gÖÒŽGÚîByYM&3ŸÖ|¡±`Tñ)´Ý7‚¦Ý‡SLPŸM¦FcÀ‘áŽ/¦'³¾˜ìãì½dlÕ_£ßI£ÜõN k@Jj(q:õÙ‡¬Eèl¤ÏЭŽÇÆs8 ºZ4:@ia– T‚rªªJS œ ãJR ggèh®X-Ânÿüs_ à•JJ¥£‰Ï²#8| ;©X vOpG Õüô§?-£-td ŸÏÓdø\B Ã`#²ç¹Ò.æ=Ü„xmvv–wE½ÆÏþszs_.—“Hø™L†­¬¬0t@Ó)ß<Ï«h<–ó›ß˜{¹€Öÿh¢ÆX’$±­­-Ž pèe;òhŠà;GsåþÏl™¢²_—ÁIEND®B`‚quiterss-0.18.3/images/16x16/000077500000000000000000000000001265173051100155155ustar00rootroot00000000000000quiterss-0.18.3/images/16x16/quiterss.png000066400000000000000000000010711265173051100201010ustar00rootroot00000000000000‰PNG  IHDR(-S)PLTEÿÿÿu½wgÁk;¼@=¼A=½B?Ôc@¼CAÍ]CÀID¿DGÒnJÂTMÂWOÁUPÄPQÃYSÅ[SË^U¾QV¾QWÈ\\Çg]Èe]Îi^Ìc_Êj`ÎmcÎmdÊmdÏmeÏofËnmÍtmß’tÎ|uÏyvÃaÔ‚†Õ††×†‰ÙˆŽ­|ŽÚŒÙ–Ù˜’Ù–’Úš’Ü‘”Ûš—ÛœœÞ˜ çº¡ß¥£à¥§µ_ª²b®ã¯´æ·µæ·¼èÀ½èÁ½è¾é¿¢CÅìÇÇ¥MÍ¢FÑ¥ŠÑïÓÒ£IàýðèèýðÿÿñÂSòúóô«$÷Õ]ø¸@øûùúÚLúÿÿûÔMûÜ`üÁ[ýÝbþ¢:ÿ¤:ÿ¯0ÿ¼KÿÇ{ÿË„ÿÓŽÿÞ¥ÿßpÿßsÿߥÿÿÌÿÿÿ·ÞvºtRNS1ÉÞ“¹x¼IDATWc`ÀŒLœÌ À©ÊÊÊÄ`2¶4Óà牖Ôf p$§’C¢·&'P€YÛÚÑ;),*! 6:œ$ ÉÎÌ"¤ìê§POJrUá0гP ¨Ì0ñŠpñ ‘ Èñ)X%%9³z¸I€$Äõ’’ØL“Ü¡FIF<þI:ŠIIP böI6¼PN Ã$#e][}Y;;Ø$à@ZŠ És ÿ=‡ø- yõ>°ÀIEND®B`‚quiterss-0.18.3/images/256x256/000077500000000000000000000000001265173051100156715ustar00rootroot00000000000000quiterss-0.18.3/images/256x256/quiterss.png000066400000000000000000001027701265173051100202650ustar00rootroot00000000000000‰PNG  IHDR\r¨f…¿IDATxÚì½YdÙR¶ùØZk>Å”‘™5Õ>8u_DK-ñú ø èH\Ðâ¿pW¿ qóI4BBMw !Îé3Õ”™•™1ø°§µ–õÅÞî¾}ˆÌ¨ªˆÊ¨*_©ÌˆðŒðð½}Ù»Ì^3{MT•Ã:¬Ãú~.s¸‡uX8¬Ã:¬ÖaÖë°ë‡uX‡u€Ã:¬Ã:ÀaÖaà°ë°¾3Ë}Ý'øÝßû]A°Ùã,9ù߯.š`bˆÖfÎt#6±‡;}X‡u‹Õ+ÌSª€ÆÁ!ª 5þüïÿGüFàïþîïäÓO?•¿ù›¿áêêJ.//¹¼¼Ôùl.Q£¤gÉù$™¼÷?ëïœGâX5N4êa bU€CÉáaÖÛ@;[ c­PkŒÈTUgÕ¬º˜~:û|þÉâyršÔþÒ›ããcNNNøè£ôOþäOôOÿôOõNàŸÿùŸåßþíßÌ¿ÿû¿KQ‚Bª&—|ôxøø½ÿééï ’Áo™Ô<Õ¨OÄÈ™9#G"bDä‡uXo9ýU5Å«j¡ªsµ:Ey¡QŸäŸ\ÚWÿçëk©Q®®®äêêJ/..bžçcŒ?þñõkÀ_þå_ÊçŸ.?ùÉOäç?ÿ¹ÆZ‹Æˆ$6OO’‰š““ß8ùíɇãß+?xŠ‘§"r&"G@zàë°n‡½¨Y L35œgr›YŸŽÒØŒýs„©/ÂL£²X,Ì¿üË¿èý×ñãÿ8|-ø«¿ú+ùøãåg?û™|þùç¦,KéNq !’%“ãߘüèè×~{üÁø×çƒ_+"r*©ˆŒÜòw¨ªÞßÃ:¬[@D0‚€ (NQŒJš¥éÙÎÒdœž^þìò§¯rñ“ég³¹FUïý2<—_ûµ_³þçÿìÏþL¿4ü÷ÿþßå—¿ü¥üä'?1ÿùŸÿ)EQHS7*""4‰y:IN~óìGïÿ/OþW—»÷Åʹ1òH…‘ Ãî¹eßJ÷™rÀ„Ãú~/YY‚욈NDRA”Q:Nǧ¿‘ÿpò^:NÕuuU^–Ïš…_hP4*€¹¼¼Ô¿ÿû¿çÉ“'ñÿøõÖð‡ø‡òÓŸþÔÔu-u]KŒQš¦A'nø4?ÎÆ~4þ`øëÉ y_y„2VHEʼn+bŒ ´ˆAÄ €A# Ò¿ðÃ:¬ï) (A#1FTcG–)ª*±û¨ªNES`hs"VdøxøÑ£ß>û-Tó/ŠW‹/ÍÂ/P˜ÏçòOÿôO|þùçˆHü£?ú#½üÇü‡L§ScŒ@:bBcŒØÌf£‡ÿè跆 ~ Ã9Ê%ëÈ>#ŒŒ1b°bۯʼnÅÁˆCDÌë{î÷+Mh¨c-1¢ÆÕ_ÑH$PmÃ`òÓüç¿s>>È‹ùS_…Æ—a¡AÅ{Ïåå¥ùùÏ.ý×-¿úÕ¯â_üÅ_Ä·ÀõõµXksN¼÷-*EÅ7^“dgÙã“ß<ù­á“Á0ü@Œ<R1 ‰tFoÄ`ʼnÃYGb“à¬Ã‡5(`9 Àa}¯@•Ê—”¾¤ >z‚zB øT#ÑDÄ™ª&ˆäÙ8­ÓqRž myU?»üLŒˆEÚ¥eYê¿þë¿ÊO~òþáþAÿöoÿVßeYJ–e&Æ(! !Ð}L0&¢c±<+ONF¢âÚÓ߈ãŒ1âLkèÎ:.'wCò$'± ©M[è‚Ã:¬ï­÷/‚jdÑÍ‚²)©|E*êÐ â!@4b‰$‘h4¨plŒy]¬ÅÈÏIăµÖäy®Ãá0µÖÊåååN=ÎüÞïýž¨ª4M#ªj´]Ä5ø 6cœ¨òቈœC1b—n¿5V¬XqÆuÆž0H†L² £tDæ¤.#± ƒ1¦s‚ë°¾   hTæõœy=cnç,ê9ÔmpP·>ƒ!Q%AU"¢G@!(+š "ÖÒ4e<s~~.§§§â½—Ñh$ÿøÿ(ð {@U©ª 眴ȤFU‰1Æ"!¨Ut„áÔs¢èÅ bÆtn¿q¤6%KrnÀ$›0ÎŽ˜d-dK0‹³QyX‡õ=ótm]h,¦1JJ•öO$¢’‹•#iDd$´€Zk%I’$Á9gf³™ÆÛB¾ž°ª*!– @ŒQ¢FÑLGöMÆ¢â5"²"ûœ±8›'Æé˜Q:j?o=€Ô¦¤¶gœq9‡õ}"ýÖÿ BÔˆƒY’çÆbÚÁHTé*„£Ò²‚"2‰@›¬7FBR–eœÍf”e)±ÿf°ME¨LW—L HP5 ™ #Éu(¢FŒX±XÓÆø™Ë¥#Ž'Œ³ ãtÌ ’Ú´3þ”Ô%¤& 8€Áa}gÙ¾í½‘.-.‚µíÁ("„ibCôí5EA£€:A¬ˆdb$œ¶^…ˆˆ‰1jY–ˆUUép8 mÈý!H—Γ^õž´` FUm÷svi­"²bý3—2H†ŒÓ£¬õ†nHîrr›ãœ[üNF,A6 ½*ˆÃ:¬ïbØoHº½/ÝÁg0$&!K2‚¶Î=@ˆ=^" ÐHˆeõŒj›EWÛÙ£$ƨ!š¦!„`çóy899Ñ£££›IÀîÀ—®ð ßÃ;@P,‚CèF ‰±d.ïŒÂ03HÆ Ò¹ËImŠ5Ždéât¯ž"T¡èà‡õÝsûʼnch‡Xg7ö¹ˆ%±)yAQˆI DOÔØ¨i‚!l¹Ë"Ú"KëJKŒQ¼÷² ß›¦Qィ*¿ÿû¿ÿæ4`÷¤fë nÓeD0›!ˆ²"mÂÀå ÓQ »¬MýY‡ƒ"DU"MË€†‚™ŸR†âÖw9ð'1  W ×ùØXÓ‚@ –ˆ44àCCå ¬±«Ôyg€íGE¤ÅbŒ„¤#ð¤iÕ=L»{#`í~¾q< "Švä_ÒºùnÀ¨3þI:fœÚ‹ƒÇ·%!ÒhCKÊPRkM¼úÃF9¬ïô2®šk“00™™¬+™!qÎ$tÚ×MAå[[‘(+’~i ]¨¢hŒ-¿°„Û@³6>—Íohµ1¦#þ2òdÀ0u 0b˜ŒQ"ul¨µ¦Ž­á/üœ«æ’ëfJ$v™€ÃÑXßý‰ˆ #7ä(9fâŽÈMFbR“’šç!¨ÇGOQä.§´•/w,¥×G¬1Æåéß: oXîF®¢ ¶ _wÁAíH@q+‚cIô%6Ákª„¨bÉÜÏ™ù)Wþš+…ª¶¹ÏÖ÷bl½àÖ¥6D‰t|Z‚·k²Ü¹®|ÞØ6ÜGÞX>×ñxt _'_ö}¼¥« .Ó^=U¨(BAmz£{\c[ÞpX‡õ]^Òý±bñê)c‰ s¬XRIÉLlí¥3ï•=鎅ߎzXÖ ôêzn|ncÃø×@µ½”¨-£YÇŠ…_PørMôøpHÖws)­§›šAhbC*Œ2“2ÐAKú­Â}Çé×6Ó»€]ãE:±å£mkc t¬¦_åýƒ†ÄU‚ã‡u»óôÛ¦5Û†‘ »¯¯m÷_Ô¶¸û®~Ý÷§osSnM¨¹»|+ö}Ž(±sïƒÆÖà DZ×?j@‰Ý+>TÖŒG6˜§žS­›»æcBdÝï:£oÁ ¬É%hv‹7ZÜ[àþ=€›°YW¨×•1‰ªmh -t=›—&8¬eüÛ™¶G„шíÑÓª‚‘­=ôp2Kºq†w @Ä•GàU[/Xcïú¡@ßÐ;C¹;6 Ø^ñÚã:’BÑ oNNÀaÝpvåÁsÜ4Lšfµ=1\¥Ži’ÒŠ×=Ð=¤kŸe›Ã—Žè[B[y/ÝÏèJGó®ÝwïÑÊÀWç¿jÏØÙ áPú{X·ÙcíÉ|à¼(ù (0œfi-ŸèÂZ›Ü6V~þ@kè=»PÝɹ÷í㮯ÊÝíeu±qšëúB{— hÖ=vh >¬›ö•*DHCä´ ¼_7ØîÿfV¹NÏ‚¶¢³ò0ÙsTv-·} Úú]Y të Y¾ì• ³U°ª5êbµ%j÷ˆw‡õm4~QA‚¢1’xGx¬‚UEEH^Á+Ѷm[4-’Ù[Y¿6…­WÝz÷c w˜èv¼¾‚J‡^;“Á:öVä`燵i,ºm,­†øH"“(œ«iKUL4ä*H Ýž²›ÏõpœK¹–޳¬<6¼äûðî8 °ý’wc¸7ß”CpXl„Œ XU¾!«jŽ= “!‰¬B€Ì(#9ñOÄ“à­[éo<äÐR{#;5´`xWqOi@a»@·þ¾ùØ?ÁÁñ_ï£ÊÈל”LÎ0còÓ•ûìBø¾äQu‰ÊÌ s*Òs'ä\Ó—¶á6ÖóŽ ï¯I ¹!:¬ÃzÛ9bcdì×gIÂ0™`&ï·Úª$¾drYrÞ4øðYÂì[VnÖ¿,3e»‰õîß;æî–d…n»rúåÑk»y᫊‡ßŠ–C:òÁ™FP¢‚„ȸ©xZ/xlÇŒÒ1fôÆ´A€«®9™>çC_i˜69êµ`|—yï \ÙJ\¥7J—¥Âqgw›Ø"o´÷ø¦ù9SÞÀÄ/#.7z•·†Ãzg^rbGþ}Ó¦â<ƒQ2ÂŽßCL[ º”—"ME¥%Ÿ7#4D¢1Ø.þßÐ㔇xÁº²éË{hÛn_L¹»ŸËÙì-bºÝE¥&%ëÄöy7­e{qŒqU†¼|óUuÕŒ±z)ÌB ¹YoÆþ²ÅHïB7?ŽÝ˜§ùSÎ’Ó®öûí·!ªâ»®Ã:Ö”¾¤ŽõÊÕ¯cÍÜÏñÞãñí–Ó›ã]_Avõë® ¤•š$ÕˆmÆ>›œ,?ÇåG+ Ó®TÖ#qŠq78%i22IÉOm¬ëÒ> b@Vº¾{|PYº|©còp=îf±V6ß¿d³õ»H)#7æƒðÑðÐ騿í Ô¡¦ê }ê§,übõ”±DQÊPv.+Ø ná<ˆ»ßœ!0l&M``$.ÅæÇˆ S„±AÃc vpFb32†G¬àKó€æÏ®û”Þa¸iCòmíç›Ý„¿ý"»§¬B&)'É Oó÷Zã~+t¼6¡`á ÊP¶ÿ-­ð¤yÂu~×fõŠ}l¨b×Î+ˆZ}öè»\mÛ¾YÇš:Ö+ º…ësX·q4BGMʼn‡Q6!ÉÏ| TP}N$ ±A› ˜Ñ™I9._s^͸2Ê4Mh\gHß ¢wçè\©} àM±Êv ¾%ûß’š”q2æ4=¹•+§] iÛgñð±YÇDªXSÅŠ¸4``ÖL™úYëtÏWÅšEXt2f­€Cå+®ý5U¬ö‚Ø*œÐ?¬½ÆU‘I½ç¨®8–‘Ëq£sdà€¡xÚ@ô¨0G˜á)Ž“êŠ÷ª¬P†¼k°Yט¿ ¸Õží}w€@:lö*«,‘KWÎüW¹i‚˜„¡¶d Í¾Ô ÑÝf¤õ£ëåööF"…/¸¨/˜ûù껋P0õSf~FÕús?‡ªjRÇz q=ºyÙê¼ÛüyˆÞ¶•bl;ÿŽ|ÃYT†IŽ!‰‡pA,ŸÖ È‘d‚dÇdj9¾ú„'MEá¯}€®IÈ>Ø{ÞÓƒˆl„ë0ôA@ÿ„ëj·•­&†·•ßìh7ÉÊ=tÚj°ãZ Èm¾:©ëXsì)c‰­rK½R7žS…Vß°Š5e7ë Òš&¶2èMhµÜmZ²Këì=‰ä{ Kqöœ†À™qŒ]F2<ÁØŠXõ¢X‡8‹ÉG$>rd-^¯cÀÆHˆí4›5îêûðåg]½LÔ­CU¿iÀuÐ"Š€m;çW»ÝÒR¹ï•HÂÄMÚáÊ]1Ò°jXhöÐiK ¿`æ\Ö—\6—\ûkæ~ÁÜ/X0G™S‡fÕû-/ß[ç@w{ÄÚÍ ÊÊ0Jr’ÁÆÌ‰5 XrA& Î!ƒYSsd,F#Ÿ«âb$F+­ ›¿óÝFcºÿ\Nåî GzlÀ€ýÉŠ¥(èÈ:‡Fo‡„ï‚=IpÛ·ÅnÅhºÉj ”¾dæçL’ “zÌusŬ……Ÿ3s~Ž_iÀùÖ›À·p»¸ï{èñ÷Zö$*i8ï!ŒmÆÈ ÈœÅØ€àõ­ñk1­a¨GðX£äIŠ$cF&a!÷ Ñ80®ªûÎõ'öÇõë¨_VA³J?xz»n{ìŸÜ=ã—[äïàéÄo%‰d;42ÛŽwrÆ1±#Šü¼†Ô¹ÿulS’ ¿`æÌýœ«úŠ«æšy˜SÇš&V;ùá}õß­ Ƶñ+JY]3ªjŽqäƒ3L:F-hýªS4ݰ]I¬¢aŽÖ/!6HšaŽÞc€ç$FU%…d”ÎàÅnu¦Ë7lô°½©›¿_7¢ým]-yÈzý.æMµŸ•ûOÑï²XŒ1+²2¦'[ú‡íç^SÍE}ÁËò%Ÿ—ÏÒ@Õò5õªjR{ÚvÂwŸ?\:IˆÕÊ’£ì˜4?Á &ˆQbõ˜µ ¶û¡.kîçÄê$9vòƒê’Óê’©/ym…:OÀ¾Ûn‹[ñÒQÑty©í~Z½ùó¹l%û¶­}ŠPÞH>äý¾L/µžÌÍ/¶+NJÄaÅ’˜„ĤŒìˆëôšY˜±ð‹Îè<­©BÕNNÒ¸Ó`õ‹Û¿²Ih/÷VW|X/x”ŸO‘ÁâJÔ_Bœµì¿˜¥Õ´{.P¿FH6ƘcÆ×ÇÅM]RË,DJ£XYÇþú @0nXƒlX“>l=€ÝÑò ÓwÐoN;!•”±ó4B*ªXQvéÆi3媹æUýŠ‹ú‚EXÐt½ « E–"KÒ3„o è~@UÉ‚çQSòQ5ç ËppŒŸA|a†ÆkZ°Ÿ.QsTë6*HϰùÆÕ”÷5 õ‚©OùÜû¶4ØîÖš<”[×Iî , ¸k í^ܺ TåKÙ’|ç°BHºqÔ5%ETÛa‘õ/ë—¼,_âŒ%Z¨¤M+.=ÝÖYø¶…[ºþÄVÓ/õ³Pó¾¯CšO0£c´xAlææ-3.fóÉB qš&uÈàŒáõg­2XSóiÓàBÜ “düûßWéý½À{Òè&5¬$7&ÜàÎÈ òsD6*Ò–'_;-6`ÕräŽ0b˜“d“ü)s?§ð‹P0÷3®ë–8l´ÁǦ­œ“ý±“ZOp†Ðmý¬«Ié)…ïL̹» údÁû®©n ;x{*㻼Ý30RÒö¾¹uãQé+æaN" X,3?cæ§]%¢ž(í赇κ¬K´§‘Âv1Šlö!£j„Ü*"Â{ƒ÷Øœ§ùf~ƵŸrÕ\ñºzÍE}A j­ñVeÇ»Úórëz{œË¹<-ÕU‡º¨ }Ãy]rfs†Ãl~ŠäçPMÑ0_—LjôöÐV²T=4WQ1£0Y\𨼠Æ|ÊвØ|?\<Ð:€Í—¸+¾®€ß¼ˆ½î×aPÈæýé×teÉ)'ŽÔdmãáÔ¦\Õ×]h0§Ž•V«º‚&6«ç\Æ™²oX• #£àO#VÛ¿®Ý×Ý+QÑ®T÷ÉbÊãrÎq2bd˜áqÛîëkˆs´ë¸” ot„n‚$9ÖdŒl£¡À8ËP"Ñt#ÄŒÜٻŠ",œcf k»×¾;ço{Þï&E®÷nîþ¶í.%½1EÖ**úöQò½D€½)*8cØœGÙ™M9ÏΙû³0纾æusÁEýš«úŠk?mÅKT1] m·My½Œ*§UŇŜ“ºbR_¯ºÕÚúkjÖhÛõæb`PW ›šÑà˜ÜZd0„ƽ‡Xµ§?f¬œ²SN«¡õzD!Ip’02cMVMy ~8w¨ÌÔOȪ#ŠÁ[‹·Žgùˆ_ GÌó˜u‘w_h]ñ«${"~ù6ÀÆ”Ý#"›#ÛÜtk#Žw8œ³¤¶L‰D|ôÌÃ‚ËæŠgÅçä&È%[ñ’ºêSÝ :ߟˆbc[’ûƒùŒ‹£àFÕHŒ±OQ½Ù•ójôhTœ2g‘,ëšýš®ðÇôÈ¿Íݳ6Yï>mw Xƒ5Ž¡³8k8Ž­*ÐEg³òÕ7yos¶žšÁ‹ÐKi6*/“”çù`£j¹ö}Ë kÇëÝw)Ý=ÙŽñõeåô1ïAy8ÄáÒxMO€Ä`6bÊÜæœ¤§\æO¸¨/º¤+¦~F lˆ–´þk—†Š‘$xF¾adS†Ç?`8y‚1¬ÊV×Fü5è©e‹µ*vt„Ñæ¢%WòoºîŸÙ›-Ú3eOk4ÎP1ØãÇdú»hUñkÄü½ë쑃ˆà›¿x-.ÉL†¨%zmß$»ïöôÂéÍØÒ¸¯¼Ž»#›ß‰#eï8Ó¯2Öä Þÿe–CfRœ±ä6ã4=¥ðm‰ñusÅ'‹OùÅâ”±‚Øö'´#Ý׺†[»³!’{Ï0›?ý-’“[!Ž·ÆZUíúÞžˆ Ô,À¿‚0C4tÌ¿yK¸í Ú a†¸{üwü߀äΓÍÐCDÀ´‰¶xyöÿÂ?ÅIÄЀ¸Ƽù6­*º»çÕ»Núݧ ›>@d[ TW¹Ì›J÷Ђ֗ZV,V,GjRT•#7á81OOZAT­‰[¡ÔØÊ¥ûNë0¢-9õ-ónÒ;9ƤcVyK¥63_Ù¨h^Ê+bu~„Žø3[îºìـ˓¿— 3°)’L°ùÜðN8QYOèƒF!â!Œ%jKr¶ÊoW•îOn»håjZò``/‰±UÚû¥úÈFœ´KœÖ›Bƒþ=\ffZ½‚÷óHMÆÓì)õ%Í%—õ¯› .« BôíFŽ‘B —X&MÓOp_ü+.´»Æt»Â#é‡{ìò žôF[l\ þ šë–ü#v×%[dìÿ%ºtÍUß6 UbCð—`ÒnLÐ-6äök—PuÞÖ2þÒ à#õôŠéõ§\-¦\Ce-ݪžçM{X‘®h—ýß¾½k8¨î Ö ¾Îá ²zßC xñ·vŠÙ[h#}×í{â18y–ñ8;§V|ÀçógüJ>æ™ÿŒYÒ°° —A©Ë­=çEàdIëà ÉSÄØžà®®@óîS@Ö=lø²¦öªç¼õ -¦¾*qý†ød㿺DYëõQ7hé ‹†Ù¢árîyæá1å&aêr*k‘®àh ޲ÿ7nHÈÊî«J=ÌÙ€Û7N{8¼% ®{wç›/kî|ºøŒy3ëòí¹Íyœžs–=‡ªbMbq±nÛA»×aºpAú·þ|—ôøD„™¬k;n…I&f‚o<ójΫ4p‘.½âªHÖTPó‘Ü+‹M2$±‘›5ìE¿bÉ×D½}£¡ oKGï²}}›mÄhWªë#~¨¦×sÏ‹ÂóYtü"±ü,ˉ&%3ŽÄH«¸W~³bö&*eCX÷áÀf¤ÝïcÖ Ð-¤ÛvíÖeª*Jk¦~Úêê¿‚ZÄILB ^×­áw"#7fâF$&Y½¾Ô¤íðI“‘X‡“„DRR›GJŠ3'Žï†õo«F 6ZŒ5<ÊÎù£_'79_$¯x™¼¢È^ÒÌžóËÙ\kÃëZx<‹<¢áLçŒ/$mH ¦­ÂÓîÛÙ¸òWKîþ‚wLì¯aé¶wò¼ª M@ë†X×\Í^Ï^/à…w|!Ž/\Â4ËÌas‡I ưý'Ûóùju5 =¹Ö$¬L|£öGwIBíëŸÞß B£ ÓfÊ<o(^Ýý¹Ëúg’çv’‡ˆYýö±qœœpœ1´#vÀÐ ¹#;bh‡ d€é:óvsogåôÒueáYvJfRždOx‘~ÁóìϲOyü¼)xÖ,ø¢ <®#¿á+²ª&U˜É3$IZ7Ù˜N*nû¶ï0–ºM±Gú qØ’“•ØtVf .‘Ÿʯjxe6a–&ø<Ãe)&µØÄ"¶-º±êP7ޝUAÜCã=Þwׯ¿ý¹nµõ±LvÎÿý7(hhe³bùå_ì«,dÅQÊØ9MO9mN¹QküvÌØ ™$c†nÄȺƒ‹íB…öë–D3]kÙ¾ìÃC–!Î@ä6ç(=b CvˆÃ±ð5Ï}Í¢¸äE1£¬¤U`="#qäÖâ"HⱫÖÝ5\¾é”ÿª…D_›ÙwCÖ1yì8 Ц¡^4³šùUÍgµð±7ü"8®mÊ4MñYJ’&$™]þË*ÁÛÀÞê•~ +[Þòé½le3Ûæ nT²ÝTÞæzMC_êXÛ<«U6Ÿsš6±aægDLý”Ô¤«¿Y7pùuëŒؼ}LÒ•Ç0´¬i Æo WЪe£¢¤&e˜x¬C;ïà8=ábúWs5{Î/cÍÂ7¼W~h*> 3H‘A†dà,8ÛÊouã¾Þ\ ú.ïÙº¡‡Ž´‹>´†_{(+¢dZx~¹ˆ|\ZžcynÓ$¡ÎL–’¤›Zlj'#;Æ3¹nêŸz>€»Ÿ[¹äIãFܯ7¼á7ºõòuªŸnó³ËL±ÕÝ ¦¥W§bKšN8Âp’œr–q”1¶#FnÄqŗ8±$$±‰ˆšB¦=`lèk “œÌ$ “!Gé1 ßççƒcþ勸`Q,ø¬1Áñ*I©Òò“%Xlj0‰AœÁ˜PÚyC†bÛýïÿ¹ÿ°Èݽñ÷UÌ#¼ùŒßÈ7øæ«îz²åôA¬Ž5×õ”ÒW8{‰“„¬h3™iÅ<ÓcŽÜ7fœŒ9rp#¬q»S~öøFïŠ?XþÞ¾XˆŠb¬!Õ#Â{“÷H\ÂÓá>¾ø˜_%¿d:{Æ¯Š ^TÊUË5U5£*a0l0ÃæÈ ëbVí‹=ù†§té:­kÖå½Z”袢^T”‹ŠË"ðóFø…OyFÂe’à““%¸|yê·YãXçýe³¤}SKetÏÁÄÖ¼ëDà€îaTûxvsÖÞ!XßЦ{ø kg€F=M˜µÅeÍúøŠÝT÷³ô”GÙ#γGd˜ŽhŒRJàY„WUàe3ÃÕG‹­SLÝ`ý1ÉRÄJ—VÓN–ûžúm\·q¨Ä¢Â_Í(ç5׋†—Uäg ø¿Hy•d¤©#Ílæp¹Å¦­Ìxëò÷ ¹í‹Ùÿí ëê-B˜w »Å<ú¦±‹+UØ.úÊ,í»‰Ž·¾êuÁÉ”"T\Õ׾䲾b\>gä†ŒÜˆÜæŒÜ0´#Fv@"é*£ð‰Á~ó‹i3ÎGùM_1tβ<Ï_.¾àUùÿO}ÁOJ唚1s&>àò¶f€4Y÷÷ˆ|醱¯íù-ÃÓ ±nв¡*j¦³’ÙÌó²^jÊ #<³9>ÉpI‚8\æ°‰Ã8Û1ýòÖ{ùFQÐ.-¾ºßºnÚÖ½»àÀ}}ãßV6[º;ºî‚TÙ ¾mëê½½«òÚ0 SÊPri/I¤‹£#•„³ì”óìœóôœóüI1²'nÕ“¯{ܤ‡ä(Šu–óá¹My48ãÉàœÏ‡xy5âå¥òK_ñAlø¨ô¼ïkžzOR–ä£3bEÚ,‘¶H&~sÆ¿Ž÷#„ˆ6MKò]/X,j^‘UàSŸòÂ%”YŠf ƒ4Áe—Z¤oü_#C·:J¶8¿å, Ý;9ónöƒ»ËûºV8’^C‡µ²9.ü»ªû4àƒJð¬bÜå?nΙûe§åb`’LØ6ÿn1m*ÛÛ«ò`Ào™*&Ù„a2d’N¸œA:DŒð:Ô\65i=%©çhUa½'«b„Ô%diØl§¹Wÿoc¿™5¤>Ê@=¯©® . Ï‹Fø$ŸZË'.å¥Ëp™#Ë’Ôb³®ÀgŸ¨¨ÜÍ«]‰êˆr_[à^$Á¢êVp°W}î;»ÖuºJû-K¡‹PðªzEj.ë+>+?çÈqšpœsä&Œ“ C;ÄŠyç]‹;á=™qC«Lœ¤NcV%×Gé˜zú9³Ù3>)/Q-ñMÍy©œÍ#εmÄÆšv~S“ãûU~b¡Tsåj¡¼.á¹7|LÂ'.á*Ii²¬+ìYºýëÚê¾þ©'¼ Þ~UË:]¾¾.LÙ¤Ð`!ìsgØ-ì¹ó¡†Û›b™­bo.¹n¦Hi°b8IŽy:xÂ{ù{<ÍŸ @"LBD—• ;¢(ïÒ3h »Úšº”#1 ’œÌ¤Œ“‡gü"ðs¼ŽX+¾öøRq ŒmDœ"ƒÎ 0+Ïûçe)~€P(õ,rQÂgðIhOýO“>kóûYîpiëö›åLA¹Û¬…îÐçltÕÞW§„»ë¿¾Íý¢†þ€Ð‡Jò}s!Bа1ôq9Ä#h  5 _pY_1p6'“”Ķ©F‹]É~= 3Æ`åxpŒKêRªÐ0 kq¤³O ¾$ˆEm†¸a›è´ôÚî÷ølUD-qmÞ>JM­B ”ÎQf)’9LîÚ²^gZ¦YË òÝry#¨B? °=mKïÜCºSèÝù_>âÿîNé«-Á±‰ž«æš:6\VW|ºøŒ‘2I8NŽ8IŽ9MO9IŽØ±û Œ_u=ÌÒCâÆùk->2“s•Žˆ0õYjIcìø3Ä)˜ˆÄÄwn€Ü¯õw®¶q):HqQI놼œ’‡HšY’ƒ®¦ß¦¶-ì1²“7Þö¾õŽ~Ûh¶eìøÓ\ _ó§t}Ńuè¤ûpù»iørSÐ'õ\û)×~º2¦Ä$FlT”pc£ØÝûÿ] M;Àa[Ç#õÌÕóœØ¥ödÕÀ&«Zµ·û¼mpC¯Šö¼*í§eËx`ãÁ7)À-]€·ºBr¯LçŽvCÕÖÓD¨bEl"e(yU½&·)çé9Oò'<ÍŸð~þù2ÐÛæ}ÿrã®Jˆ!µ Ñ:,A¬H1ä.Áä­¼¸Zw®?kñ<¹Ë}°¥Z»´fã7Àá;‹˜iÃ@²Ö¥Ü™k÷5ì㦟Ž[æ­ýRtý5mÌj“NËLöñÿrÇÍwË#ðÑÓа ¢¶¥Æ‹fAÛŸF„Ĥ'G­ÌYW¡'bÚ‘×ïê•wCn:YOR'JF$1&É2ð¶m¾‰] ›‡Â ÔÝÍåMmƲåZw©âR,)™s``B$Åɺ#OV¢ ÷wôçelBoކ>lØ|/d¥Þ+[¬ÀÛÜé(ÛÄÈÛȵ7Çà߈‘M°_)wÝ$El½FCWSpÁYrÊIvÂqrÄÐÉmN*é»…/ ZωմÍù'&ÍÛaÛ~SÛO¡¼Y.£ o«¸»qz±lìÍàXE¢bœk' ÇH†0 U4 æ–;ìí±+¿Ýî× òbšqí< í7~u1²zù»ïÚž¤ï ý@ýöÜ£*›ª?7€Â†lýG€í×¹*¨cÍesÉÌÏx]½æÓŧœççü`ð!?ä,=[©/« w&.}7B#Ñׄê­¦Is$ÍÀ¶$¦Š®çáí­š¸Éíî³ñ½~béOºÉ³Üî¼T° I &D„AãQkñ‰%ªíí±¯zÓƒ‘µÕ(ý9ˆ+%à{"Æî% ¸|Ö2 »½‚o|2Ù4þLRr7 ïNµ•dR§ÎU „vjíªÓ4âÕÓDÿ –u55u¬Y„9úN½*Rø‚"+8NŽÉlF&)Î$«b¢ûw‚º[h3G¯ˆÕkŒzL6ĤÄÀÓ²þºCþí”e­+¨]φð¤5ˆs{“Iz'<ÚÕ˜Á$FFŽšKŠžßðõÿ¦Iز±ç—p°— ч6ˆþ{чŽ7å]t(;á=ÂcùÝ£dÌûù{œgg€¬ ¿‰žF=U¬¨bIª•ÀåRH´Šõ*~f˵ÞWÆ)œ—XÓ¥Bì@næg|V>ãÚÏxY½ä,;çQvÆãìgé#Æ2‚o¬x¨m­­gÄù3tþCƒŒÁ°Í§Ç´é©GɦáKïÝu½ú€ú­k4Ä–C0‚ä˜Ä±í<ÃåðÒÔþðÐHÔºK ZÌpLaR<ª+h,MÌÖg’Ü‘õI_¢Nк@7ëgùR3MÞЗwٚв•ó_±œýôÊNÊ õÛGɘ‡ðÃáGíÆ'â5P‡Š*VÌ‚™Ÿ²ðÅÊHamœÜ¸Øy£Nì£zRg0^³0gæÀs^%'œ5Áú@ q]lîçÝÖ|3ÂéÏ'|p½û0l¼ô–üåv!H÷©¤Œ’1ÇéqkÈ]v¡ Ú˜¸‰HXEÐHšXol²"”¡  ¿`Ñ}^„‚EXpÝ\ãcCýæé@²Ûõ N ’­ JêÕ3sšª¦ð¯ª×<ÉóÃðvd™0!·øˆÞ=1¨ª„ !¢õ­^#õbrÜpŒÉ°B[´)¿Öý5½:€ni,JÂtÎ|Vòòºà‹iÝÕ@j…ÇUCR•˜ñw4é`)ǽT$^‡Ÿí†ŒhlÚÃ¥˜AFR{†ÆpM cz,òW¸WzËvÇHÏÙÕ}°$à~OWZ 7 FÕ[Ü4ApâÈmŽ“„Üf7Sõæ~ƒ~ÃÍò{| ÌܹŸ1ós¦¾ý|îÌüŒÌ¤ ?oÇ? ë˜–î£Æžèù»çú׿Ô#(CÉÂ\4—¡À‰#s9^=GÚ¦ ]—-¸ÛP 3؉M õ5ÆÏ0F‘ÁÉ, bÝK_¿­èÓm#¡ª©æÕÕœ‹iɳYÃgó†ØÙäÀ •Ä7ĨäΑe)â, Ƭ4)Ö~;’M}û{ÝãF$UÍÀY&êhÀÆvR²v\Ãýœû[_­ÍûÊu÷q6µôß®è6°VA—CݼìÖ2–ÞWñ¿×<@ÃV,¹Í»IË%hM*æ¡ è<ƒF[¦½ Uç!”¡ ð%u¬WŒüÙ;&¢¶DéÔOùxñ U¬8ÏÚJÂóìc×Êš'$wKÆH ª¡eÚ k‘4Ã$Ò²ø¡i³Âzü÷r°JŒhˆ„¢ .ó’W³Š—Ó†|ž¹d5å;XxeQ(¥æq¼æQYcÇÌp„Í;1Ò¥wq} ~åuˆÍ0INêrkIE°— ‘ÝA3_°å þâföì~×½ÍÜÆ¯·¹²r£r°Þª*V ¹i‡bF]¤ýÓžî1"-¿0÷óUXpQ]pÑ\qÙ\r©—+@Yòëî>¶bÎo˜%¤­n4‹ªgæç”¡â‹ê%ï ŸR„¯ O²'d&óž‡ð%S…ÅZÚ¦_54ÄP£ÑcˆX’$˜$C\luø´^ë)"íI-Ò?-@Äù‚æÕ‹é‚çEä%|-ŸKÊ‹$éüC%ÓÈ"6ÌʆÂ7˜²b4’ŸƒXLâ#¨Øp:9°®I0­ÀG’b“ŒÄ%dÖ‘ŠÁ)˜ ˆ½A¤S¾:ì ·Kåïî% 7‚×—ð6wf7'ÈW½Ë{³/ÒÖÍ °j§Õ=íÌ-¹ ‹°`lÆ Íˆq2ᨙp쎘6sŠØzµ6„èñðÉøDÏ–w­Ñ¦«Xà Ûꢄà‰8NŽÉm;õ«¤ ×  hlõ”X¼F¢=ýÓ¤§×s¿…ÖõïâD ±ç¬JbYSNkŠÂrQe¼hŸÅÈsq\&)‹$]]a®Ôƒ ® ï9v%GÉŒ‘* 2$M‘¤ İ=¸FDk°iF’ÉŒc##ßà- ¦­Õ»Ç,J.Óèß `Ó¾ÕÞ£·vnd§lSîÄø¹ì°jhI% 6µä.ç4œP†Š2VaÁ´™qí¯™ù3?k¹…fÎLgT±ÞÄýoœ¥åk/_½:ÕUY„‚Å”¡dÞ̸öSçy/Âyöøëé hD›]|N?EšiË®›a«õðGçòK;6LkVa± ^Mifs¦õˆËæˆbyž¼’K>ÍÈ’íuLŒÔµå¢¶Äਂá²iøÁ´æ‡ñ’d>ÇN†ÈÑ;È1yŠI³voÅ%T†¶)I&Ͱ£cr8ÖÈYU0wPª%.íÔò—%oE£ïûù»…w·˜µ-i=æoÕ’nž¥å &tÕmwà5pÝ\óª|Í«úͯëW€PÅš*6ï” Øqåµ=h‹XPÔ-98kf\ù)‹P’™Œ‰;¢•°ÝH´/÷ºU|A\¼$N?Fši+› ë¿Jý­ô¥MóŦ!”%ájFóê’úrÊÔå¼NNøÂŽye®xå®(\ÀfŽ4KVEB•ÆYJkXÔ–ëRxá…0/™s&©’ÔǸNz[¬E³VWAMÇTÑXc$Ó;:"/ Ž«’Ó¦ÌRÅŒ~IÁýþ7?xwñ€ìMJ7S}y)ªòmB€n6஄výúª 9¤6aœŒ8M9o¦\fWÌüŒ2´Õ‰E,)CÑÕ)ðîZw—A™*ÏÜÏ1bpÆ1艳&nÄÀ¿ÜéÖeJBSByο@l‰ÉslÞA"ˆG¤írÓº!6%±®‰³9a6£* ˆgÙ{ÔÙ$ù‡%#Ë /W\˂Ҕ”Rt÷LÚ:q¨5BÕÃg’ Ì›ÀùÂóÈΆˆ­®n0i‚¤“dݛ≢˜,E†c²à Ž|Í¢É0]FsÊÅ+Óikh¢ìÒhg{x$`7Ð`¥ð¸5ùöø·1FÁÙÃ;à,žÒhCÑ¥ßf~Æ«ú5¯«W¼®/xY¿¢Åêù·CƒþPÎûº¦Vjz]lSkÅUÝz5C> ïc†’™|5¨äm£ËZ㇕jBy…_Àд@ã ›&ˆ‰­«m@‚ª?ã§st6#Ìzµ}ùðÈè ùè1çùg›/ãkžÕÏxîëÕëFÛê?ûÿ³÷žÝq#K·æ™peè)ÓîusçÎüÿÿ2ßfÝ;ï1ÝjÚr23æC(”!E‘UÙG襖!U‚ËȈ;ö65‚703†ßká¶´ü*þçÌ“ù i¹ ٌ̄ä`Lr4†¬ˆA …,Å G¤‹9#”ƒºäÒ ¡ÑkøægõÉ0]ïz5Ù³öÿ¢AÀU¡/•vž¹uÚiæòÝ##HMÊ yHØðÁ3õ3Ø‚Ä$±l5NãKˆ¦­& {ÍD;;®*8*¾Œ°mJ$C ;h@A³âXt׋B¼öP—hy ‹ÏÈð;8ÆŽÆHK 5êj¨*ülN}3Á]Oq³7,²óü=óÑÿdxpÊàà;(Ø’»`P)g%Wók|ËðÔ&`l\üµ^,—"\Ãui(ÜŒW#UÍ reœ!K‘,GÒ I²fF-ùdÂXàÈ×Þ!¡UêÙ—D˜®ƒÍÿÕ´ÃÊ)‡•yæ»Ç}VÈ/+jô}ó:ÐM‹%à1Æ0dÈYvFj“1çÙ9—õ/LëIÃÝä£i=Å©ëæý7ËÝwt­$p¦nDÚ5 ÓzÊi~ÊIvÜxØ;;²ê¢®Œà_y…5cÌp„TQ`qK¸½Äß^â&3Üí‚r!,ä=‹ñ)®ø3þÆãsŠÑ!ÃÑY‘1J8ãñÎs¥×\‡fnFª(Žb ò´}Fqv ˆ°°Â?j%8ÃÏÞñ[øI+07hˆf öð{`tˆæCL–’Oo' QŒW44òX‘ÙØ0W?G—²`dž쭫”ìîµZG:uCÔxsKîx5_îâÿZ,¬¹1œd–ƒdÌ›üMDÝÝŒÏÕg>->ò©üÄŸ|fáJj­·÷$öÄ#è™ó6ZžyÏ©hZϸ¨.ù÷Ñ¿cÅ’JÚ™€ôÛ~+r`!€ÔUPßbë+Œù3"ƒpW‘Ï?P¹ þò_:ê2Pé!Óá/L†ÿ72zÏ`|B1:¦ dEÞÈr ¾ô\¹+®ý5—•妾¡Ò0«]wÁ˜€oÊg ¿‹ácHùJpsŽüñ?_MædLš!I9pH>üÂA–P ª˜†–ܽÊßàÙr·*°ÜûÝÂ~vtK °ßô{h+O¾òû×DG]H°¨Íè€q2æ0­ÈLJ& ¹ÉIMA!97nBâd£ÿTc‚:¼:´VêP³Ð’Ô¤d&ôáäƒô€ÄDýÁuFf±>Á#ÁÖh5ÅO®ãôßâ _â®oXÜVT3Á…Nrêô?ü=ø7Òñ9ùhÈp4$Ïsò,:ó$6Ar¨‡¼¼¥ÔŠDj_³²±`“8d.ÚèéEÀΉaŽP©%©áÁqà‡e`XՌ܌Q6aœ^’8 T$«Ñé ¦®IˆÃë,Fû-ïôÓ½g½À°-͉ì[<ôªÞ urC&)ÇÙ‰$$‡¼)Þp=ø…‹ê‚?òiñ‰y˜Sù*N0Šôôàú·tG÷g­ŸSN±€ ~çwJWrU]óï£ßÈL†¡Ø F pÄ4Bóuý™êoÿ.ÍQ·?£*…ù"e®g¸ìŸò7pð+ãñ)ùhÌh0`0(HÓ”$I±6úð1 ’‚÷Å;rS ·uœøôꅡ椬`²h>*D7#BY)¯”im9ך³à8_ίn±uEqyéˆ)pÓÂí|\ü!Äã•ébù¦ur¿š™®ü{Ùü%Á¶.ݬëõ À¿²¸hd ?‡vHÐ3¼:¡âÃüV,‹°@«¸›Ö¸¦w¿&Cµë² W‚'àÑÑ*T\T—ܺr“q–’Š%±eYÀMCìç«¢’€¤Ô7×¸É ¢¡ 4¥9bjß2KÞà³ÇüfôŽáè€ÑhDQÄÅŸç9ÖÆ{fŒéÞ“ÂF}ƒQ2bæ¦|XüÉ—ò3e¨ñZD;%_i¼ƒõHÃ9rFø;†¿…”÷nÁ/aÁÜ—Èõ”Áí˜Æ“G ¡©ÅkcñÞ¨Þ¾ý˶Íм&°uîOãéC@©íðà«W n.À4ÿ©´“{ VN³~þŠ5–ëêš›ú–Ûú–™CINëfôYûÅûÞÊ$m€Û:Ô \Õ×ü>ÿ̤¼)Þpšrœ¡4ÃYMgQ4=¤ý'îhJp%Áy4¸FÕÇà“ªô òs’áO$ã7d£SÂÁ  ÈófçOâB–U¹iÜ“ƒ޳cþ}ô¢ð©úÌçò >”KØFôÓˆAS%%¡nÊ3'¬†ÏNPgXhÍ…·ÞÇéa´ J˜›„ßMF¹v>òôWbë½×&¨²¢ ¬/=¬:›i×PÕ¯ÎPÜ^{f°µ4èt+–ƒô€ßä7N³S®Ü5×å5Õòqñ‘[7m°ú¥ÊòŠÄý3Ž+Дneâ§ücöOfnʯî7ÃÈIM¥4RäÖ²Sʃÿ‹…?¢ªJ\]ãChzç“0ù“ɆGdòÁ"/(Šœ$IVÿ]¥•ËIvÌÿ1ü/Ffˆ™®ë~AиÈiûõ–ÆÎÛÄ™k ¾®+ìJøÓ{2ï°Mï³Á‹& ³dÀÜ$KÙ‚o_wÆÜTÅkAVA@}©`¥Âïk™ë݇>:V¾þ¬ÀSTc …-8ÊŽ8õ'\¥×Œc¡j(Å‹°èô Š¥<î´dÅ„R¡ÑÚ×\¹+Tà(=ä$íÁ"):ÐÓÙaüÔò†²,©ª ï} FHÓ”"ÏI²Œb0 hvý,ËHÓ¦ÞéÒþ»#†{À`8 O .ëhµ@X±fX`Ì@ÄxDR¼œ5”ÆâL‚¯^<Á…¸ûÅXK’ZlbImJf-ÖìÎsaëF§ëÕÀÒŸà”Ò+SuilÐÕ™²U@ *þEÖþÚ ÔN(5„8H¿?&¾”\T—\ÕWÌüœÒ—TZõ1¼ÝrÖŠ¢ÑÁØÃuuÍ?fÿDÔðnð–wò–`­ÅÚ@žçø1dysŽà}ÜyEH“„4MÉóŒ,KÉ›…Ÿ$ ÖÚ‡«]§ÅJÊÈy[¼á?ëÿd`\UW\¹ë§h(é(qØ`’’4Ù@t6YÀº€ú†ìÀ$‚$›Zln1©ÁZYªéf½þ˜äuñëV¼Le?ùp²Ÿ]D»:wõÃ#–õ¿Ž¥¸ d&Ê%·ÃdÀ›üœÏåþ1ÿ'vž`«+|£]¨ýE¿Cp°SãjÌvÿqê¹®oùûìŸ,B "eG‘1h,iyß"&ï=ÞûŽæÜzmšßîø-Øw_ÊW 5b(’‚·ù[‚r“4pín¢1M‡ÄÏ5FÐD«#+$©!ø¨bûü ÒocÉ`¬`Ò¤kÞQɬ[~·¤ëzAýÒ€Þ‰D]¾»¢˜Üñÿë™…Ygñ,™¤ŒìˆÄ¤Íý3d&‹ ¥*"qç9´Úg8÷ ¤ºÄ8J8-I°¤’‘Ú„Tâ욦Ýâ!t » Ƙ…ÿ­ å"¤’r”QñÊ]ó¹üB¥ÄìïÒŠ"‰ A"WÀÄ]Þ4=þ¾#4Ù«‰z6þzEÄtÇ ´>¼6~¹@`;yq©Ñú‹_ÿe~?åmõŒR“rŒað£dÄÈŽÉmNjR®«nõ–:Ô«œ ”J/õ”&xæaV‡ùŸd&cáJÞçœgç] o­íøýy‡vÁw­½- ÿAÃX½{eÄPØ’E9øÓ씓â”I=‚-Z4ëÙ’°¤+¨Õ5ÜJV€ÄnñËc7©-l¾¾m¶®‡Û;ðµ—Ö©Àq:LÖN}ŸG¹CéF‘GɈA2è”{lã¡ (ó0_¡ï«ìÂy«¶ìBÀÏÇòcÓ.¬HLÂazHarlbW^è•À¶‡‰GƒÄW,'Ù gÙgÙEs¾5e(·.Ó6•—uX_Ù9ßB¿†ôþ´W×…½;#Ý¡æ×ë]k7Ôð­7ë_³ è/ƒ‰Ã8éï‹wˆr“S˜‚«úŠi=eêg]OwÞ'\-í!ª›KcØ©I8ÎŽÛ!E2Ø  wTi‘MAvÎADêua ÎóSþWa^ϸÕI—Ý€NÏлúØàÐ)9õüKï+²_P pGʸDZõaÀ˜¬k¨ê݈õ]g#"¯rñ¯×¼C;àMñ†a2ä0sœñ¡ü“Ì~gê¦Bl¹uE¥®"{?)ºùt‰¡¼ %7UÎ §5øiðžÌ®é ûy²jëV˜œ³üœDJ_òiñ©A±­ Ñc£ìf™?ôc´ÿÜ6Øà/RlË—ÕšÿkT`Ùºøi¬À¥¯–%œö…5zÿ—pñªÿׂᒠ;dhŒìˆÔ¤,|ÉM}MÊ(ø©¾yQvÊŽ7¾ÉQk­©]tX¥  4©mëɽ"Ø»½?©I9IØœÏÕgƳ™¤õ/a’µÕÑvÐúû¦n ƒ/Qh‹yalÃÊ7ߌ6H‹ÂÔOù°ø@aó&žŒ$d&%5i´ºK" aä$ÙdÏcˆù|™A÷ŸÄ`pœEÒ‹Àa:æsyÁ—ò ×õuœ,lªHéÍf<5êHè‰(”p`Ç\d—gÇõd&'1ɳÞ#‹%3Géïï(CÉm}ËÄM¼DØ¯ÌÆCs€þö¾…îÛ·Ó6+ØmPOv|u[A ZBÐfjðÕˆŽ(7å÷ùT¡êbe")£dÈÈÉLF*™I&†ÉˆÉ±Í‹×Qgå~Mö×”-Bnóèøcr’~üÄÿžþ7(Qj…¡SgZÊ=-,燤!#Åö`íkÆÉ%å%§Ù1ša}õyî±Á€‰U‡é!??4ðûü‹PQ¹ºKd^2°Ôªj­ªm™}Y%«ÖÊêËÆ^/÷MÕIéK>—_:QMU%1‘6Jd6'%%3ƒ$þYad6mFX#åÖŠÁJÒXbEZgcØpzÁ‹¢@‡µ6Ê’ÙéU¨™ÖSªP1õ3ænN¥%N}G#ÞÇ3÷ÁápÜÔ·|,?QØ?d6%Õ4â*{_pmp±bÛoó7 Ìý‚‹ê‚ÅºŠ‡¾„ ë¹~ËÃ^53Þñ'oÀ˜xÒگ݉Êêâ×ͰÁ¦š‰›PiÕ#†+I£Û­Ø¸¸IHlBF-±›Û‚ܤä¦`”ŒÛERÛœÂdXI^ÍâïJñ5÷!ƒ!7§Ù)ÿ9úFɈOÕ>—Ÿ¹®¯™5ÖfíØ¯ê}yÐ#B~³ðf~Êï‹?(µD Œ’1C;ìås§C‘ 8ã¾T cqµ ÍÜ«š•ÏP¬¼ã[4ô8 ƾŽY€>P!K:ð.°±ñåmwZ3qñÓ•`"" *ÝöL¤{˜V,¹IÉLÁ²tÄA2æ4;å4;å0rŽÀŽÈD1Æâ¥Zijìc\ˆJ×&<ÍNšçù9›ý¤ lÀ¢±=ß•ÛÒúç(Ê,Ì™/\V í÷ƒw‡ÃŽÁh°Ï#…)Ȳk,ÿœýÎЙ˜[ª'+[ÂÕw[ü[~ÛŽ÷ÿ†¾k0z¨ïrj­ïàÛ1î%þmr ß "½Qã5¸tù‘¦!¨”T¡uó™³ð nÝ$’kì€-(LNnò˜)جù}Fjs2I_>.Ðê 4ÌA“F¾ú;} ™ÉI‘N¼p juÑÔ´wÇdG§‡¢¥öEù…¿ÍþŽgÙ)§ùi“i=OG  â¹É9ÍNùeø3Æ.«K.«ëÞBûþT½I€= þ>chÅS:&ÃC'™äŽ’Le£0X¦ÂÛ éÎÃi`*j Ìœ›zBV~‰Ý±¤’Û‚‘0JFœæ'œf'§Ç§×îå |ïµßÌh)ÄD’ÐYvÊ ¹.+<×DÓ’:¸NÄ£«$dË®Õ T¸¨.ù'ÿ‹¹[ð?Æÿƒ£ôÔ&ÏÑ8myšŸð_á?ÉL†×ÀUuo§eg×ÿÀÓ¯Ÿ¸v>›^S ½Â´ŸÈ¨Ü·mÜ ~ëBÓæ%lobká­TÑ•¶(˜b`r†ÉˆÃtÌ;ÛF.øˆcHÛZkòö¿¾¹Ç‹JšÖ§!fÃdDa êP3÷sp¸F[@w;AØ<Êö)7õ-3_RùŠãìˆ_ÝO ^c‘ç¹ÖX޳£(`"Ê—ê+ ¡k >opß²ºÿk‡S¼‚ ÛGÙî¿Ë ÐïÌ>ù‚å~'•u c§Ž2,¸­£áGJ.Ê+猓1ãtÀ02´#ÆÉFãиøû)plwŠ$çmñ€ÌcV³pe×!X}Ñä‰Á@;Y1§7ãÏÅ'þWòÿñ¶xÃarÀ8?GÃ`È% ‡É'Ù1§Ù S?ڇ꺎Ós„íRwÛ‹€õÕµëAÁ½¹}üaÏi–Ü Xm³)¯CWOµ(¹,¯ºîÁÐåGœçgœgç¼ÍßäY·Ë®,¸ KÎy~ÆØŽÉLJШ÷wÍ5ÞE[óÎ=tG«Uòꙇ.>bE¨Â‚߆¿1HýºãÐβIÈmœ¥8I9ËO1•áÖÝRùšç‚:ð¾1@§kö’ÀÆ‚’~%s7–y? à9˜FñF¡¢ê˜s‰IH%câ'Q…ÇW8Ô×£ìD,Ö$$Xc_dY`eÀTRÞ„s¦nÖŒÈB*\p{AšÛϬ}ÅUu ª¤’rœpªg˜`£Çž[°±,е÷À 8ÉŽù©xK¤//˜ù®xüþKµ·àYÑ'X/²_P°V»m¯YïJjîNŸ-¬ÌÊôåÌâÿ‚5·õ”€2u3.ë+þHþä(=ä0=à 9à0;dlÇŒÌèÅ–Blì –ÑúÛzÂBæø^o¼?@ô¨EÑSRÀ˜ùJà°:àÖM∮„#û¿þX ¹Í8ËÏšì$‚ÊUS9>ñºƒlûzZÇuà‹b)©Ü²ÎtU×ü…¹ümA~µ'Ã3ƒ©Ÿ2ós¾˜KòEFasÆé˜wù[Þoy§5¶°¤>ÁšiêÎàPˆeÆr“1q>¦Ÿ˜¸ Gû”áÇÇbéZ‚B ¤óFÔôÐ]q]_3u°0´’Ïñ´ÉlìŽ í€ÛzÂßgÿØlGïeÒ—6öà?n€d_—¹ên²VlE2„}Xí"‰\®3¤„(A5÷%“zÊY~Bnr2“7|‚È6|),CAbGÃT•7Å[þÍÏÈLÆUyÉ•»¦n­`ÓÝÇè†.>1°Þï0ù›>_9Ô´H†ÉÂÉMS×,4žé¼Ãñ¢ßqí¤à_póâî—5|Y¾@}ALz-EéC P†Š‹ò’™›sQ]òÁŽ9HFç‘CÐ"Í©MûM$ä{d­V@asÞo£{q:æÿ3c1- :ïXrOÏ8Ú p™iÍýœßç(C*¤ŒtÈŠÓæ3Ì ˜F_q˜ &CJ¿ Òª³–…ßcÀë ð§=‚Ö~×Ç^¨Àí2YÓ–ÞY_ xO îI·µ…רÞZ„’›úc¢€g&Y”Ê.ÞQ… +†Üƹ„D’®,øž—ËKj„óüŒÃô€0w ¾”x T¡jvÙY@m%á~ÁÇð‰Ûú–ãä_¿p”º¨Ù¿¢î°¿Øþ<°é˜Ãô€[W{üŽ®û±ø™>@$ÿÅ€Ídq“ ËUtï…é‹ÄÑaU„U:NƒR‹Q®«kTiìÀ§\”—çǧ‡§ÇK"Ñw¸Êu!ME;Ÿ½óüŒ_‡¿ði‘ñ¥º¤tUÏãqK‹(ªŽ’’wË—êK3Â=Œþ{,—VA‰ïò·T¡âù¾¤r5Òâ ;°¸×üB7»ñ ¬Áî¾îÞ<€²aòŽV{nýau‹Š€ƒÈ~ s®ê+¾T—§¼¼ç?†¿1°2É"WìJšýìå€Ò > lÁy~†S‡ Ìü‚«úE£¥×At V\pܺ[>•ŸÉmÎÎãd'¦»/ûÕ ÆÉˆ÷ù;¤9ÿR~‰®@,5$ža‚™U%Ucõ@_bРȨGÝT=Þr9¯Ò!¸wÒ±4ð8<¸3âàÑÄßâ5Db‘É'#†vHN±2yø=νe æ&ç8;„*TܺhLZ…È{ðžVîUlANë ËO‘oa2Ò›¬Ö}–¹-8É ø³üHas¦Î.çXú…úÎ÷þµ¯ôÉWvÈM ìp½${hôõ d Ñ;H¿/a6ë[VQŸ¨!½Ò@£‚Q _ø‚¨0­§±mX¼å$;‰‡&}ör`eqidÉ íÉ u„&‹z‹/ÌÂ|Ëô¦<ú^µ1·nŠÌ?TÛoòÓnúÒîylXˆD¯ã$ŽŠì˜©Q7d¯ïÑ“ZaþÉ]½˜- ªKn/Š-5˜–áí¯"Õ¹*ê ˜åÔáÇÏÌMùX~bîgcÈmŠ0ƈLŸôÌ7ÆËÀ¤!…†vˆL “zÂÌÏW÷Á'ð¥ûðÔM™û9µzÞægÌÝ‚¡`mò,8IJTTëˆq:â 1uC¦~†Ã±Û`u÷ÞöÕZÀ’¸Ÿ{±· ´éÌÖùfÝz+äÅñž–ê‚D©CÕðjþ\|"5Îלægœæ' íT“<6ÐÁR#ŒìòcD`â&\W×x•/©BÝ# éNÞ’Z= ?ãÚÝ6SzqAÚtÿ@TR"ššØÞæoñ!@ù‰…_4F&ûyå.bÜšú({¥Ç${Zÿ«z€_6]5±¿DVÐïÓ*çTk¾”‡àßF¿âÕs–1J†KõÜç¬\“KMÊ(Ây~Ë»%Wõ®¾Á¿Òµ}Ì)jo_¼*“z§ŧN¯±H˜}r&zsOV,GÙ¿~„¹_ð¥ºX»y¬|=X]媺âôŠ2€õ©2½·ŠY¿Ž÷ÏŠÌ4ˆ.Ý5—õ_ìE§Öce9“š¤1ý­ÂDÒ˜‚‹å,?cêgøà©ƒã¶ž¢žLîs%h`Ò‚™Í'c‚اK?`U é"§žågŒXœ†=·¥e1[AÂZp«ªõòÛ€ÚÏ‚û¬¦oa%°Í . ÔM6JÊÔM8ÉO9I8ÊŽ8J$ÃïŠFÊðazÀOƒ÷ÌÜ‚«ê’àW¥Äžö¬âgxõܺ ¦4¦à,?#¨Ç«mŽöût B&)C;ä sŽ%#Œ[àq=5åݨ~ý;t£Tظ£°*´³µkù¨î¹Ómr¬X‚.«Kæ~Ηú 'å gù)¿~!¥äZ,¾ðìÁÀ`'£FV]¸(/øc^P…š€ÇïÌÛOð꘸[ÊP2´C~©&¸¡Ãª"¢{o“Æ€70Â02NÆÑ‘Y•EP*õÏW±)º15ðâÀZ¢¿±Øu‹-ÀýèÙ_þD­úY˜3 ænÁÌÍI%elGQ¤Ô¤$&ÂÏœ‰¹Dã‘“ì4Šz'PF§&ç; JJÔ%X„šëú–ˤž¢I 7†l¿ìüÖAJ¡0±-x˜àÔájGI½W&Àöテü³ã%’ìëõÞ¨þVÕÿ²i6¸‡Ä ÓÇÔÍ ªó#–E¨8ÏO9ËOÈšéµç<Çvq ™¤œçü—ÿ/ ó;¿Ï?0ssTtMÕçq÷¢ýËԡ⺺æòOÎõ”“4Ú½í+®È¨©ˆedGœf§ÔÁ±ð ð³gA¨ €•…V•5w^!ïÉ gsü¯”ó ÏÞk`æç”¡Œ.»Á3÷sÆé# –¥‹ÑófBf2Þäç$IK7õ-ŸÊOO&ÉõïEË ¨CÍU}͇ùl”oï—Cì‘%(Ä 9ÉN˜¹WõÕŽ«d¹û¦µÝ³jüsK#ýj®‹€6ª½‰zÑ{¯½/Êø¯3b†p¦~Š©â}عÉ8+Nÿ‚âÙÍNÛ6ÙÈ‘L¸ÉO9ÍN¸¬®(CÙx „p•Ö\ÖWˆFvÄY~z¢û¥M·ìÀq2â,;ᦺ!•´ãé®–ïÊìW&†7;/Rt{¢w@÷Õþò¯³ò’ItÜ^Znߺ A•Ä$õÌüŒ÷ƒwdy)²ÏlliEHMÆP„£ô7Å9?㺺⦾e®‹¥»<îÄÚ·  Wå5U¨9ÉNøÙÍ Á#FöÈþÅCGɈ ÏéRIWÊØÍ4îÛÖǽKtùs׊‘—îåÞ(ø<¢Ì/6 ÈRÎGMM*´aà¹à؇é!ƬZ—= hH³Ãì€óüŒ¹_™[ , Oš}t¨CM©%?á§â3?£ 9`Lºç'ÁÀ¡DFb2"k$Þ¤OGØEéó•ͳ؃ðžÀvýßoK\v;}­_½oßšP}uÑ=²e·Žô"pU_S”Çé!ãtÄ8SØ<Ž?‡Ž^/å¶¾þIvB¥/¹²7ÌÁϧäqºv•¨tQ]2¶#޲£÷,¯fDKb ›3h¦7kuh#œúøýÿ¡ëç®÷S_vظéG³‡;Ä[õŽÅ®w0¯°ôWND6ÃÂcÙq=±Žö×e(ñµ'5 åƒtÈyæ8ÍOšÔôyõ!·9'°ÉMußÉGn]Рހ_¦Êòø@Ó‚s¿àsù…ÜÄÎÈ(‘îYÂBŒ1/d&–q鈙›G)uÝo?`}¹«*û´݃(¨®œürÑÉãØ–®D8+#¶qЋém¤ÞFÎÙv÷‚ÐDÿ(fw»€W%h|é[EÝàÍÇ8õÔ긮'|*?“šHe6j X¦Ü3‰Ž y Ƀá(;â 9àÖNX0gv¡^»$ß.Ü‚Ëê’Âæ¦‡„ÆÐtßO{Os›sp\=!í¦¦þío™*jz/ܨ53Ð5=½¯å²Ù}âím9Ô‰IÈlF&ƒ¤`h‡¶hD:âÌä¤Ý4Þ2!UÀ…š*TTÍÏeã6<ó3æ~Aéâ¤\­ÕÊðÈ.JQ¡Ò’‹ê²sôÍlF* ; °Å³S#‚ˆ%79‡ÉoŠsj"­¹*kQU¨Sõy¿UjÅu}K‘ ø)ÌÖT{÷[î1¶à4;eVÌ;oƒJ« y¸Ýâf«Ý4• ìRævì ´™¾ôÿó +,eÈI(lÁ(qœq’ÆzrdG õsĨѤÛvT¾dâgLÝŒ©Ÿ2u3në[.ëk®ê+&LP§Ô¾Z“rúöÂfÝUªPsY_rëncK.RØ%Nïµn¼ÏQ´db-‡Ù˜7þœZk¡âº¾A½v¤ž§%ABé+n™W9s_âÛŒò®U “sšPkÍÔÏøR~¹óù~ÛÕÉ×Ah‚Œ. Ï}Ðjö®þn¡ëoýÓ“+iÒú”„")˜£f‘ØÃ$š~ì€a2 °†vÐËV‰·# _04CÆaÈ<]pŒ§cŽÝ!·õ„i=eâ¦ÌC”+C…jxòkϦŽÇU}Åó‘A8ðX±$# Ïã¸Û~¾Ë0qžEŸÁú†Ï6bìÂfœHZø’™Ÿ3sñ¾ìƒ4™ˆìõ: ›s”R«ãOû1r0¢ ãÎq€U]ï]ô/˜°IXXýõ=ÂF}QÍvgÆ´sŒøiðŽ÷ù[޲#FvÈ(™¼)RR“JJÒh÷oÕçkh»™É0‰kÊXG¥‡œû3ªP1÷ó&+˜ðçâ#,>àª+\›…ȪÍ󷽸º¢‘wë§ü}þ;³0GQ ÉA…-È0ϲøÛÚ¡`rƒÇGqOÉ)MXÛ ºÇ,ÒV@–€S]Þc?càd&Ý»;sûÌljàƒGì†e÷7?Ë{Vñvàý–={SÚd0?LÙô1k¿…dÇÃdÌÏÅ{þσÿâ$;iz»I·KJ/í(¶wÖ ©M)´ï¤ èYø’ÛzBjRf~ÁÌÍ ÔÔíD÷¦ÿàƒvéŠ>fnƤžpãnØ'é F›ðL€ ERjŠÇs”’'©/#X¶ƒ·5(©CÅÜ/˜¸i”*!%]qgÞGHLŠ5 ^=äè$Ëû} b€>ðk«[Z;óÂAîc*ë½B ÁKu#¦’Ù”B N²cNòcγsÞï8J¢w+Àù;ÒÒ\s»u¶jë,,h ¿ ~ˆá,;ᢺ䪾dêgÔ¾¢Ô:~R+îðŒ²>øã‚ã²¼äoöïxõü4|Áç  +A³í ¼ÍÎ1 ×õ-µ¯ƒvá50q>•­bi2Ÿ}w¬±Ñ?ÁØZ‘ǧäÛu€dëŠZ]GºÓa¹€¯9šlÐ)·Ü}Èþ¨›Á%•Èß>Iùuð+¿ ã,;ãÀ$&Ùk«Ì`ÈlŠƒ¼ã(;â§Á{þ1ý›§\TÜpCY×1¥kÏå[ÒN¬£u·Q®ªë¨±¯žQ2ä7.BoÃÂ3ö”D$j%Úè#èê€P~+bµå=—;q-•»Õ³wI Þ(¥qÔ­ÿ¼qY÷ÏêÚΟHBarŠdÀ»ü¿æçâ'ÎòSr“?*Ý0F†^Áäœf§0ŽFœ‰± ÌܜҗTg@W6½‡ÜßöNyõ(ÊÌÏø\~៳r’p˜04Ãg²ÜŽ#´ÉRfnÎÇ$’–œºf ©ßü.If~¥pœQ6»ïs€Ì¦ ’!ÃÆGQzíC¯K¿Vt¬`[Y}Ùš(¾(À6ø¦)ŸÚ'È*ÑgÛÐݸ6›0XvÈIvÄûÁ;þmø¿!7)V¾÷a±œdÇŒ“…)ð˜ûÃ.xÐêÁÒ¶m±á'¢˜¹ŸÊÏd&Ãi 5)ÅsÍÐ'èl”»Én'#R“¡!¶òžFž‚*‹PR…ŠwBêÆcðy¨ÐBœ†ŒÀÔLz¥ÍS«Ù ¦Y3Ò ‚¼"*p·‹÷ýDh7-ZXV¢^ÝyqÎÏÅ[Þï8ÍOâNÛ.þï8ZØRSRŒ±gG¼/ÞáÔ‘™” _ùn×~ôÿ °MËFD#‚cÇÙ!‡zË•g°Ù„4(£dÈQzÄI~¤¾eæçTáéšz¡¡^—¾dî¸à¨¤Æ`HÌþ€ÏV44—Œƒä€ƒd•¹BŒ á±„ {A+=mÖŒ´ÖzúŠdÁ׉?úMEþ6Ô¥ac"–ÜF/»_ïùÏáp’3²£®æÿîÇŠ¤–P˜‚·ù9¹Í±’P†8î»ð%uc¶ñ-QKóÑ(+VkÍuuMj“~*æAeïòâ+%r“5ï-ŸÄP—.Z¤="*·×Ùy¨P«cæg\W·øÔ3´E§–´Ï€>H ŽÓ#fnʧ¤ø œ÷°"àAC÷+’“ìcõ÷€¿Â}øÆ°©òÍÇÙ1øuô3;øn–Ûyyr““æ)Ãdذ殹­oABU}š,] áÔS¹ 7å,;eê§T¾Bl{åòlqÌfgǼ ªPq]Þt •R.ª,kç#ô¤WLÝŒ‹ÏŒ’§é GÙ!¹<¨¨HœXù6=„m;„¢ñ:Ô¡¢Ò jÄD|eïA\ V,©É¢‚”<~ð«!B:ïô®,û¥‚€Úμ¯äÿú5YÐÍö=Viv¡Ž Ê¤ž1©§Lë9–¨è»ïÖ© d6êùÏÓy#Vb–ÛØJ°û¶í³Mõ]p­z"I#•¾ïÌÍP$9iÔ”\b*Sºomë7:j|× `U»|©aõ-§¾y =±ä&cдþÌ_ Dp3E- l5¶7>¹›…é‰Gs7ç¶žp]]Ç 5$Ï`°‘H‚1Ñä³°™¤˜ÆËàé¨SdÎÜ”ÛzB.‘e¹ÿÌ-² St ªvà£Kµ‡r?,oûšØÝ²gÞñ%Ö†tçïánK?è‘$—¿Õ;Àû[]«½Dä/Qÿw7ߦåì°='²*vêÔsSßò¡üÈE}Å",žÙ¥!v!†Éa#Ѷ‹cá+nê[®ªkæ~AÀ?ÕlKË¿mw¾¿]¸ä´CAÚôÓ_l`;æOìgJcr°2ôˆº,þ ë¿lê.é]륀:&nŠ,,Gé1U¨ž5 ™É'#f~N];h$µ[^€R‡šÛzBa ÞóF|dŸØFcÖ³¼‘dü?'KB¤¬â8«%ô«ÙBçÙæú¥û¼×Öû¿+ u¿~†uèÔ3u³æç7Qƒ@Ÿ14RíÃdÈЛðó;3€Pj%5 s?ü€½â±#5L†˜F‹²õkÜEÌéç¡]:–½À×6¶EðuÃÑ× V MØ3??rfaÆÂ/˜Ô“èä«áÙî¥AÈMÊØ¹µE@>Ý3©ÒšÒ•$bc ð @"+$0²#2“îî¶ iˆ%€¬eÖ»÷" ¦wxœµÖ5¤"ûˆ]Ïbm^†Š*T„f!î‹ÏÞ~fjnÝ„Ëê*’ZL±wRÁP$aÌ Š¬Ç–-øÔWšfgÔ@Œ›„Y•û Š-U±$’oÇ’¸Vú¥€¬Âº‰¼„ ¿Ý8=¹Ë `ÃëfãójuÜÔ·ä6çÔt>ßü5¤ª«¢3sU_s]ßP†ò&ôÀÇ\¤uJåcP]m6í“Чw‡uô\{_Ák,©œw„$ì¿S$»ú˲uYDcÕí³ƒ»|:É>¯®M|;a9ÌJ¥57%©n²[¦nÆÐ Á(–äUÕÑ[Þ3ó³Èc¯¯¸q*­îyv™y(µ:ªPS…’:D¡ÎÐð+öë±·dv’U{Yˆ>êCU s?gŒ:æýF€ÄDm€¡2•éÚ½Ó¡\Û¿ª]x”ׯX­S¾Å×DîlÆÖÕ”‹òŠ«úšI=aîçÝËûz`?¥ÆEFž›r]ÝpQ]q[ÝRúÆ-xÏ£NAcº@uõZ"Òþ× ‰ØØLFd&êÿÀu}ÓÙ‚­ÞAÙÇÛ‰†vÙH¨EâÆ iò šz ý87 I]:?„Ç–œQc ¢Ö:Î9<ÕX,©$d&%‹ß&îwwäž °u¥x5Ó€+@!¾t*Û#av)dÑï,{ Ò^ÞÖþàOD £dÌy~oþ3]>øó³í‡Å'þ9ÿëú_îþû>÷V4´?®ƒcêfÌüŒLÒgqX2õ2“’˜ÖÍù‰ÿ²‚×ÈuêLaÿ%€Cb32“E…`ý:ôÿÕa×ÿ¿{~{ ù*›•Í×±Q½'AR~Á7äeÎi~ÂI}Ì¡Ž—*­/0p¡¦Òš…+ùR^ð¥¼à¢ºîFXŸ»€i’j_3w1%ÃÎärŸ»¿éäÝ ¦&ʹwG|ð»ÚÙŠðl£Î"‚Å`1×A:$çkÀ&ëµunMAÖ…G^¼,ø¶¦Eè5w«›®'€ºHZje<0粺â÷ù,†wÅN³³¨{ÿÂÖ Z%_ªK>–Ÿùçâ.ªKfnFMÝ”ªr/ º— Mc{uæcP…ƒ®ç¼ÏÃ6Èù8sëf=ð±Àj²ø¼/ÀÚ¬ž,óÙûžåFÐRf{â íd¡ìq`§@·<Ac-£}uÐuÀÕ"àk{ˆÃáƒv–P‡×@n IA–C&ß«èæˆ`ÛÜ/ø°øÈÿžþ7ŸË‹(aÕÈr}ŸŒ%JW¡fæçÌü¬ aÏ3V±n.l…BMŽÁîˆmøþÑ_vïïø«]Å+›š€ë¨Ø ëóû›éæ¶¡¼9Û¨Bµ÷LÍÊ(6‘™8`2JFŒ’ajøž€_ãb;uSþ,?ñçâ#Ÿ«/ÜÔ“Žô³º ŸqùKKžñM &„g¨›úljr›7b¨,–<…ý’Ò¾G(;wÚk‹¼ÐË Ý>¦Ý]ŸÖ-Ö`›â¡RZ¥”&"<37§ž¤©¿ªPñóà=™I–x€î÷]Y¯7Û¬Ã㹪¯ù}þ?ùcþ'åU컳ý}vÁZ@-‚ºÑ#Ðû!˜€ r.)VDL/zJðÒyÐyk·È7÷íëèÀàÅ€zBtõ¼Eú’y¥•¯ O  5V C;@ÄDµ1˜F0b_‹MµMø#åC NŸŸùûìŸ|,?qY^G«.Xé·?Ð2ž¯S‡¾áÏï}.°ã¤&í<‘瘃|‡¬Ã}w€/Zlõûîftí3êP1©' ŠaîKγSŽÒC޳c ;vO—44;iÍUuÍU}ÃEyÉŸåg>•Ÿº´¬z /œ~¿LZx4ø÷WYìëUà2{TÂWõå€.~…&u‘5}üK·2øÓ|ŽS×iÌý‚Ï‹ Îò3þmø "áÁ€ñÑ¿~Ûg®¥ðÛR|ÝÒç'û¢ß”?æòß³ðçâc챇µ¯£ä—¼L®ÂÊsØë©õ ÃÝÌýEe] ¯• ]=£Í¨‡îí kÝoj­©«Š©™Qi\ÉèQ2d`$Æb±Áˆ4uiüÞí¼t¯ÑbË7z„qT3à4ö,|ÉÌ͸­'ü>ÿÀï‹?ø¼¸ ÖºÑÜÛ·<ÅcWü÷EÎå•‹º,×®f8¤·ëï×h‡`Û)ÊÖù?}ÀB~lÕv^C“LÜŒßç˜ù9ɘqÓÙ!ƒd@a3, ‰±¶`hŠ;@P¥»êEãGï)CÍÜͤÆÔMºŸÛúj‚„•&磯s[¾ F²ïÕªé±ÍÏ­º³<é¾Hÿó1MÖ·çk‘øoY,¶sa2Oº–ÕÊ H‰Ã@1=^Í[8¬ýzŸxÒÊ'ï%uÕåx Ì\ÔÁÿT~î&¶’ÇÙ1'Ù£dL&i§ëfS‹z6œ‡ŇP®«J#´3?㪺沾⦞2­'LýÅ‚ÆÅ¯½EõÂr\Ù)•¡Úkhju–eÕ.vÎÍÐ%͵ìs"@5¬5O­ ú‹\zp·ìY°%yjŒy~Œº-JU£Ö\uÇyXjžõöì%Çë­F\÷ë ¡)â8na¯IšAŽ¡tü~ônñ†Ò/¸­§L],-\p”¡âÖMšÑäE# Y®Þ—-ÃKÊ_k_1­§|1_Ȧ)¥/£ÂíN{/ûåÒEuIÕA?î>õ5'nÂçò3‰±ÌÃQÙßµs?gêæÜÔ7\U×ÔÁ=¹»³ÜùWǤvÿ=9,Ó7Ów¶à–ª¢!àB¸ÆØPÚèß_¯²ÒÚ{òbYã ´ç4PiEp¡ó“³bc ŠÁš„ܤQ®zËgºà¨CG’c³¯>©©CÝ  øÍ‘^yy‹¿e4jºÀ—\×7ü}öýŽVK,Ï\pT¾fêgÌÃâŽ}üa×Ò>ß¹_4Ħ’Ëúšÿžü}¯÷^›R3Š«DAÒ*”½åÿÐ{ò]“Ôß̾snÅA‘%:¯Új´[|ˆ CÍzü’•éÿ]Eê~— ?‰W×ÌŒÏ7ÀVÚ!å«på¦ü˜¬Ô ýÀó"ÞuV!*M™ñ¥¾¤oH¹Äaùï/ï£ì@O_;]ƒ‰›ByÑQiŸåZDVP•oÏ%`y²ºäÊê;¬{ÀÌÓ^$ÙÐø×Wð”±¥å¼GÜ;V°Ü…mM¯tÛÉÊWþ‰~¬´<Ÿ±<ÑmŸÝIë­8ídÕ;_ùÖ¿}¨Ëõ£›ü,ÙáÊIžtºá…Íkˆ_×n—]ß%õŽtF{š*»ÌTbü‹4£×3¹O¢ú¥³ûžï‹»½÷Kmë<ˆbD÷(½‹ àŽsësͱ&g9Ôã|] Qùqü8þÇ·ˆ‚I¦•y’`÷&>9#ÑY&›ºBnìÏOs‡sà¾l?Žïä0MûÝ«0h²ËkéïÜÚ€´2T²­æ^†…uÊÌÝ èAàÇñê¿Þ—õöµe¯¨Æã€¬äûKĵgË¿"P‘¶¦‘ÞÂׇ/hýÚ½ûqü8^ v¡}®@ í äè_—S°2<Þ0ü´Bb  ²‚ŠF^@_K¶C<ýù(ôÇÊÿq¼öÅß{»[Õ*YcAhÈÙ« ÿÅiÆA¿¥©ªJüÚ,@Uh+“¼ôm_aô²ÝVóë>oÁãÇñœ ·ÜW¤ëd%Åí(ƺú5})`¥ZW%¨b4îø!ÄxB0ˆ4 ¹Ð†.kxPPžÍ4ãÇñãxÎ@}QŸŒ" h3ù×ïd#ÿï:|-ÿ?‚×`  ÁxŒBð ‚UCÐÆ6¡ë ¬é±Ù«Q2Né@ðãxµ‡v$zì²2TÜßùV%ö^g/0AÚUUQQ ¢´ ˆ1¼àÛI 1ЖmÞè¨Ë=H`;7 QÆCľúòÇ@[÷¬vùßŧÑF|@à·€ H0˜Ú¨Ñ ê J5F‚ âEŒà5~—_6âÏF ˆi¤ Õ4A ÙÝ7 Væ€ÄikäGðãx½ @W>÷çdµ¾_eÂÊv? ÙM <­é£`¥‘°M hƇEc— †TÙ4‘(õ¡í¬þ$àÇñjs€¦£%ÖH>ë ÿÄï}r­ß£õ‹H>J¬˜šR.µÖZŒ¤‰M‹ Þi꽆˜µ¨¨ªªQiZ‚ªšŠªbM@M ˜Þa߯\ ƒ±düqü8^{ðÐÃßøÆ [ÞG—lÝ“,¸ÜõûˆÁ¬±b­ÅŠ] ¹€±6¨ª Á£Aü²æQmÌ(ÁŒñÓH7õŒ1Edkü‰]ÛˆŽüx~ÿ™B#6"jm\EíJØ¡‰KrZÑçæš†é§ÆIÉ[5:e†20c|ðÁ}ÇyئS`‚i€,ƒ€l§öÒ÷D÷˜Ç㕦,VU¼÷83€.GÞÁrHî-W¶OÁ+¢C¦žTÓãéx *A‚!,Ñ:ßXS«AÅ4¶õÚ]ý®N_Qõ®DåÇñãø+º ºö5ªag£ò_Ãú‹^šŒ ¢!nñÚx:IËÖÓ–ß«¡ŠÃŒFB#µ¨1ˆZ‚"¡óˆ—;k¡%ÁèÇñãø×‹àëÕeY½+Õ©¯eöŠ"ÁïK·P ѸX‚išÀе^½WTU=óÿ·w-«qQôܪnõŒ=’fY6YXB@$xÈ&‹|@> ?â_0øü Ùy¡}ƒ¼^’ØŽâÇv<ïéž~TÝ›Ew{žš‘"ƒQ(šBÝZÜsÏ}Ô­IÆsr%VÞ#ß§®ŠqÔ4™ÍµàÌÌùÝïW"0&»”³0«råeÑE`“Þ^'ÃäM°ÜÐ[zGòÖ&."uEBVŠäCIÞÌÅlÀ©¤_5û¿rZJÞjìN9\IûG®~åà*P¤D&5fðvôêÏ'=üâ»Ï?½\»^ þ˜Ì/Ö¤}‘p–6![˜¶­ £Ÿ«¸2Ÿ9×à8ÀáŠÉÿ2pðVÏôÉmEø.ì´_´Ÿ^ïÿâ×ü¦_÷v8MT>Ȉ¡„àÓ XXD,L~±<XLYý®´û_æ§ž7%à­xmùj.ö)É&ÌxøjØþýÇçkß×?ÙÙßþŒ4]/öi2 <@±pf‘oö‰HAåME.‘ïàp~E0‘æž‚°Ð¤®>O´)”ÆÏ3aA@6c·ã~çy÷—?¿üaÿ«ßÖvj{õæµC¿îï" k‡ÂL$¤)¯¼–— g1B. wp¸˜  qÊC¶lËÑQUãו0àýó¼@ã^Üÿã§—Oßþöïéέ›·¾¼ùuc¿ñ iU‡0„›š±@Hª¾[»â(ê„° œºwpØÈðçŽA زéüÚ~š ’¾ˆxÏ/›*PU ,BjdƇ¯MÜŽ†£Ân÷E÷MО¦_D"T^“ ’A>'”)'*qçú–{ùYãå§ɀHDÄ&ƒäMÒK{Ââaƒ³Ã‹€˜ÂØ=”}Óa@ œ ³1&á(jGý]Ü‘\–%ùÔ€$/BS~³ƒƒÃrãŸo+ŽY¦µÀŠˆ™Ø«Ý˜NNN¤ÙlÚ~¿ŸV>@ϰã}o€‚€$}©x&e1; œÝxO‡9y¿HêË’0 ªÔ«Ä°¶ô/1w3P¯×³·oßÎvww³B ÌÉ"âbI>ï{‹ÏÌÿÃWÝø¹bÈå2••Ë.! Ì8Xlb_ Ë€§§§rpp`ûý¾NrD¤µ†ïû ¢¼=—YÊ1àåT`3|ðîupøÈ¼ÿ¬Â–©?k7ëì??@«Õâf³™õz=Ûëõ¤ßï+5 «”bc cÈZ;YÌLÌ k-‰ˆÂòŽ,ö꼆A/#ŽÙEç"€££#`ŽŽŽÔÝ»wÓ0 =ß÷U£Ñf³©´Ö”$ 'I‚,Ë(Ë2•eYka­%Ä̪PÎøVV€,‘÷rÆ:´Nq«Õòž={¶uxx¸µ½½­ëõº—¦©êv»ªÓéT Æ*¬µÊ3QXœtp¸Ê ,NîÍ>[—ª!AõïÇwîÜŸœœ˜µ@Vk´Z-Á–ïûÜï÷=ñF£)¥€Xk¥P¥*Q–e¥PÎø¦Œ¿\¼"4æoÍ]”í_èý•ÊÍNk½~° °÷ïß/?R|ß—(ŠE‘cŒ1’eÒ4¥4M'¿Ex ÊРTDti§œ>Pcæžþ¬ŠÚÒ°A)%Íf“mj€÷îÝÓ4éápèõz=/Žc”†Ÿ$ ’$¡27¦i(cÌÜ;88X˜Xôl `E TèÉÞÞ^òøñc{!(H€vww™uE†!ÇcŠã˜â8®*€2P– ÁÌT?¹†`‡U ÷Mýåx‰¢( ‚ }ôè_˜àÁƒ¤µÖžçéÂãS’$Tª€ñxLa"Š"ŠãEi0¿8´è!ppp¸4¢˜Ê ƒÌóº„Ö±¶%{(Šüª=.€Lg~fªQ…`c°S ä3ªò?:ý‡W«¾öçuœ›=Ø‹<ß]°ŠŸ6Am A¨q/MÞƒÝõð¯ß€†@5 Žïm C¸)‘¦HDš£ée}^Ö©}Æynˆ1Tx¸VúÔ6ˆI{ÈÜ»õMö¡vä.Î÷œæ Ú´W$Ž6GCcÖ üšæW qŸÇÜŠ¢9 Î.€U>ŽÔ‰ÝÒn_×:Æï#§ó8U*˜‡C×‰Ñ ë¹&!îk,Z¢ ‚ÁÙC`[ÙܮɂTxÓö|v ÙGPS¾“¶ãø÷I¦÷o]þ 1ƃª{°—$ÀÍ¡ÛDE&ôµÆuñ¼r†ó>Âpî>·óO*0ßæõyl8÷Cšó1Z/®Å­«›„‡,@ÍÐMº0¡c•WŸîÿŒÃ?¢fðìTvw)ü3Ž“À¼ ¯fðj®ÿ:c/b gU´È}xÖÀd2!¸„¾ê´bÞé®sžØøø¸ˆï*V sÎÇ’;Ë·âLW!§"Ñ–&”@}BPñÖdºt T‘#>]ty÷lÝ O<¯+Ÿªjy؃½$ræ S'ã¤Qæ8ñêN µ$"wÁ.ÝmK¦gcâá¢Ø½ÑF±Ž7Dz':ÏÐÎ÷S¢dQª…ßó8'‰2ÇӗЋEñªþß¡³„®Ò‡ÍâÏ‘AzºiciÂC Ç‘'b,zÉ ÇI8®£Vz™ L ‰uq™ãÈõ]kNkÙC@‰_i¡Þ–NFÒtþzÛªB%:-¨§cJEz[–@¢ÈÍì% pôÁIšR“$´4Îq%Ц„Þ-†ÊÏ»ÔHĎױ‡,À‘ŽHnΤ³:€ß¼9~Ïã)OnΠcHñ1‰¥1Có÷âU*–DëØC Û~ )-‡„I"Ñò"­%Y¼ò{Oå8‰â¬©"Îâ>ñÙ­cI€ïÊ·!ËžCS6ÒZ²„RZ~ðÈ=&_8G>–-<ØË·%ʱCíÇp°íè’Š=üNmºëýoù Ò';J¶¾`º¥Ôæï‘×ûÞ?L–“ÞcÒZÒ—K¤Ï]æ+½š¹!V¸Îf©´ÒµsŸ§o­ý*R ´AIâIEND®B`‚quiterss-0.18.3/images/48x48/000077500000000000000000000000001265173051100155275ustar00rootroot00000000000000quiterss-0.18.3/images/48x48/quiterss.png000066400000000000000000000046701265173051100201230ustar00rootroot00000000000000‰PNG  IHDR00Wù‡ IDAThÞÝšyPUçÆ5ý#MäÆQ:v:µ™Ö¦í´Q›èÄnÚNÛ$mÔJ\Á Mö}WD@61j´Š‚¢E ¢ÈvÙ¹\á* RQYáéû~á^¹pî¹Ð6#í;óÌÎ÷¼çþžs>¾ïÜ)¦ü/kÊÿE€<ÿò3f|s¡×‚°¿Ÿø¤sùÉ%˜Œ"¶' =„¿müÆòeSµfΜ9í+nº)Ä,7Ûn!†Ø˜ñ“Ù;覿µØqÑW¨ŒédøÆ³–¸¤¾Œ“wSàVâ×·I!f9Ù”"ؘ‘Y§N:S;…F¸Øœƒ}ªDØØ`SÁæ¯]^×Í…ä<6…6‚‰Ù4˜Y"€²›/`¯j5mÁ櫯U›îlÆÅ, |‘½^ëó1 313ê °³š²‘Pû2ÀþºD¡=ªx”þWØ]³Ä³üR ¶\_/€™˜mƒ¡ç›²Oæ-…¶°*°†Tµô´@Ñ¡À©æ– ß¿£ýKÑ«ÜÞš`:^¦×Ç,ÌÄldÞ=xå^j²£fŒ§žõ?CVKöp›qióm+(sìÐSj…9”—ìÅ9)/³0³ÉXv23±G™ 𬠶`¢¥|ªÄ®êhÑ+'ÿ k <€´R¨»ÄGœ“ò2 313ÊHkÌÀîÚØÚúpâ4UßYÕâ‡2—¡ëN:o¼Tž?úTÞè-3êSyÒù@OW~0Žf­,ÌÄlò2ÖáLC:â”ñ¢É†æ^Ñã"!å³Z1U&Z¹n—>ô^ö_ÑWE ¦_©’Ž+ב,‡EÇ#ÆÉ«Îþ®é« 313ÊHmHf»B `7Fî O¨OÂÕ×ð°÷á¸B´wµ#ôœ' R>$¸õx^³Ï«õˆÆØÃÞÉ+±9ÏZ°0³É°Ì0Ç©úÓˆ­ÙCMŽ4÷ì *º&7å¡p@6ÄÀÀŽÜ9ŠÓ‡ÿ„žBSô«¬Ñ_;JtŽÇØcJ Öù¶â3˜…™˜e$×§ f4ò.õÃ¥¶+èyÑ«7Äàà ®Õ^GqÚ 4:b ÎVWõ4eϬ†Eözxymfa&f3àxÝ)º«»a_¸•æžÃ„åSêÒŽ2½!ºŸ¶£ë–3^4:ñâî°ø¸ÑžÆœ`ÝJçšÌÂLÌ&À‚©’ÅŠœ`[äH›V+*ŸVáÚÃHU§!¢&Jœ7¤¤úC’O㟥)èo Ã`“Õ.¸we%Ô9&â˜Ïõ7†bOæ§:×bfb6 ùfø\u»jâàPä »¢­’w‘ÁòÛ £Ü-<úX"n€¦†††Ð~#CíQxÑ삦̵°:¾J¨4õczÎ4¶ Ù™+èÎ;j¯Ã,ÌÄlÌ(àHí?h#’ ûZÑ*î¶¾ž¥¾hèlÞ¾¾><½í‚~¥ S×C¥¬ÂÙæsØ’ïË4 |yä´ 9áA­x·ìu³ÉXGƒ‡j!²:–š\Ä£o1äΪHÑ3ZNÅ®¨zRîînTe ì|4Ôjµø¥æŠUÒ¢Q°–_lBäÁtðϰɵÓö3 31Û:C*?GDU Eç mZ´”žV§‹¾Ñr+ñÂý·WL'Muöw‹V1»B'ØäÑþ“k/Ž5½ÌÂLÌ& ÝI5G.¸ŠGWüXænµ€oÝi/„s±»è)oZ¡VªòÝã׈Y˜‰Ù˜Q6@bÍ!š  Ø Å.Z9—x ŽÞG.¶^Fç@§ÁÚ»,@ç,¾†¾ŠâÅc”ŸÅ,ÌÄl²Ìip_õgdŽÆVjr¤¹+% sªù4?ï ¡¦ìÝŸC7AŸ_êó¶ŠÑ‚ÍÜP€„ê$„UFQ“»H.'—OœQŸ•^%4¥úô…«Ý;ÆÏ,ÌÄl¬E|U"vÙ©ØC$¢i›—›V9m—Çôj8*éU=«ãefb6fÔÀŒwWîG¨6€û¸åS„Öž6½!8äè}þˆê³0³™ [¹Ì»hñ‘oY0:ôL †u-ñÖñn8&ýÄZ¯èø˜…™˜Í`€èŠl¯Œ¤UÇ N4W5Š¡¯tåO*Ñ;ü~ÓÚÛ†¬Ö¸*|t|aÕQZÏèJ¡=b¤—{¥¼<Gú˜…™˜M6€iúìªØƒm‘ô‹æEžB©ôÁúŠƒø•‡h½¬ä¦TI/?7…¯Ž7÷Ñ-IïNº³0³1£l€ˆò8„TDP“·H¯J4¸æ«èû¯³üRêî{’ÞcwOêøô]?ýÞ9­‡Y˜‰ÙäÐðòX‹>Ôì:‚OÅ«¿Fü³TÕ<­Õñ¹+ü$—áŠ'UZ³0³1£Þki0¬,Aᢉ5ÞWˆó÷/h{4jìj’ôz—ëøê:ÆxÚzèx˜‰ÙÖÊXв(•‡ÓŠáû8M›œT%ÖÖñ]г3kÆ™…™˜el+D`ùNZ!|…¤îŽT%¨’´=…T†Kzx¤ïøÝéý &Vëa&f3 D2»ÑÜt%íU4Ï!]‡ý£ÕñüÉáãO´Rúï3Ú'xœY˜‰Ùd¬I[… ÅNø—…Q“¿VgÔ™záy®VèúGª‚¾ÈŒ®{Ý÷u<‘ô}WªŽ6žÔz˜‰Ù˜Q6@@IüÊÆí©= `:º†!ZèÕú } Ö Ï*í¨ =ÑÌÄl²ÌΚÁ#?¾¥¡ðPÒ0iäW¶þ%¡†˜¹äy ù*Bᥧ"ˆš_¹<ˆƒøoÇj}~fòNèªÔÖ—l‡< àS²¾¤ ÚÂ_µË#„¼‹B(ÀJÉß™û黎«N˜t¬I_=´é‚l¿t„íUGØ\±ŸTâ?xKøîëßzýÝ¿E~xÐäøÒŽåÉK'ë_ë%L›>í-:ñcÒÒû¤¤&™æ“æ‘~Iz›ômöXðÛùÓgÍšõ}##£YÃafOBýôÒ÷tž€Fž~žoXn²˜¶`Ñ|£ù‹I˜oôþâ÷ŒÞ[ôêõ«ßÍ3š÷›¹FsMZ8gÚœæ¼ÉÌÿäxp9.ݽIEND®B`‚quiterss-0.18.3/images/64x64/000077500000000000000000000000001265173051100155235ustar00rootroot00000000000000quiterss-0.18.3/images/64x64/quiterss.png000066400000000000000000000077111265173051100201160ustar00rootroot00000000000000‰PNG  IHDR@@ªiqÞIDATxÚå[ip×}ÿí“A€$’â)uE–âÈ•e[²Ý¤Ž­–ã&NãN“úS“é—N'ÓɇÌtú¡Lg:ÓN3Í´N›&®ã#¶¥Ä²-ÇGã*:-ê %Y$%Šà ’q.v_ß{8ˆcw˜ž$tÞÎ.ûïÿ{ÿã÷ÿ¿…@Áïsñ{ÞäÜÉCõ!J6¯­¡iKã6Ù*h‡ÍeƒÕf…,Ë… ^¿»Z#ЃÍOUU¨i‰XJ\Q•¤2¿puñ²–Ô–_ýÇãZ‡þò  †TËÅ£—¤íßÜú˜ÓöEQ;ù±lßÀHD%62µj ¿pö_ÏÿÍ©û•7þù„Âc>`à“ÖűEyðOúžjÝøŽE¶ÔûœM²ßå‡ÓâÜÐÂ'Ò L‡ƒXЇÒJZ ßzwòoÏøßú÷ö¥FNަ¸¬F"òêêªEÈ.I’|n[=¶¶£Ûۯ÷¡ˆ*QŒÎ]Ápð}y…,û¨fïr8²Ïרüæ½ @Q9•JY©²ø,’}MýjÙÎí~&5‹ÕtdC ï’]h¶úébî@,Åðô¢àM$rpjJÿù‘‹üs ¢Œ‡«W#Wqqei’Þ˜^±£a']ƒ\&&kétZH¦RÂZ„b§A…(XQVWcü¼ôžß¼'#ð%Sü4D£R5ó±.›IäÊÂ`ñw‘L‡Æo üö—S„" t*/ù!JU¡¶&K áŒÈ`¥ÑƒäoýíкÆŽæ]ÐèÊŸŠŒ`¶¡¾*VYÆœ,¤ :âŽ\ñµ[ µ§ùÿ’ +aŒEÇ~êt'šÚšè¹‚Ž0Kª_&‹y“¾‘¡–cVìØäÜ„Ç:ŽèÞ=›˜Åbj‘þÃHx¡dóÉy$µäG£ýŠŠ}’›’–[€‚§É*Vd…Èj3ª€"F ÕÅî{ ïCõC8Ðt7cžjÈdì~9û6Âéð:|AK4†MžúÏ2Ÿa»§‰^»y ¥’3$kMªÕn7Ü ’<ŽÕzjr€l÷lÃ-ââ­¹·1¾:Ž…ÔBmÙZZáåEXû÷A]ãëimÝ‚Cg†ñœ«Ä"UöyY z> ï8°.'Èéuõ¢ÓÙ‰`<ˆwæßÅ™Ð٪ͣ!G›¯$5NÑ3 lj mýô³%,yÜ• +K >€dÃ5ºÌú€ÑY׉¯Ö=‡ÛƉÙˆee]åoOÞ†×ÓNX-1+l]Ý ‰3”ÅY2רuµíÁ_ߌƒÚ[É¢‹ˆFðÝV?d‹Ìe •4 ÌfH5t áGÕ,|®í0v7ìÆÏ¦^ÂÈܲ޾¶,¿)0XzASnS`ä‚ò… Aš‚s ½$ªQ•×fFW¡¥èü^DÈh)UubÆ˜Ý‡Ž«ákø‡Ñïåÿï©ëßî‡×ҟ͇F«vÉ^£iôà[ý“õ'ñìÂãSïý ÷ 6BªsÍ–ƒŸ]ýL£vŸ^I/ٻ㫠8&y zÅ–“…”ˆofy”Ñÿ(¥Äãщü=¹s+¥›9:œÜñ1{Ïñîj€ØØï>/^:ÿ#ÄFÞǃÝiX^ºê*Ö^Øô¨oHÍ,áõ‰ŽÙ¿VêsZ[(OUaé‹–S› ê¯ÐD‰ÅÖ¯„Gq|æu4Ûš±¯ñSèwoF—³«",” †ÐÿÀwñôÙÿÄÓ×ã0Íá[ºýmcè´´¤‚Ù‰<3§á¢¯®YȆGËÀy!µ…ÁõK z%xõ–zìôìÀ½þhs´UÁb±à‰Ý_Ưºðü©Áçµ0:¶5S»6# Ž-RóÑ0 ÎkÍ÷ËvmNGÚ\à ë ƒa%‚ÿ]x÷]4-Ýßt¶y†LA¨³×áÁûÑ•X3qšÎF¢tÜ`£±)ÊÍuº¤(Ð5Sˆw&¤„P®¯ /c‚úûü÷r êä:S µ8ÜmùÔ/'`~n ´R ˜Õ¥PÝšV…‰n.@ ÂË€«´}–ÓÜp:BYÝ%3 úˆrÿ¥LÍ ’FÐq/SÓø¿Å_ãK¢ßÕ§ë…>k餿VúÍ"íDU1w‹‚‘Váï¦×e‰‡8É-b/½ë¬ªAÒa…¤Ö\ 0$ëÏV¬ÇÕtgnò 5 µ„«‘븼rsÔþ«ñ?¾ù úïá–ûÊ>O%ã°ê4¢S¤DiüÒžSùê)|½»éì-\9:œ4aB ™yÙ ÉGÌ5ÔŒâ‹û̹±ÎÂߣ›>K„ Tݯ¬Œš&AËÊ ^¤$h.9Ç5+g }ɉ7P× ÑMAbf c œs3½×KÇð½¹üù»°u¨ŽMn¸Ú»0tc£öVîõ½@1¹sÑ(ÓH©¬Î0 ïx _ë~w5î«xÿ©Å3xnòE®M<õ¥ªNæ.ÀÚÞÄ­›˜¹–ÆRÛ×phÏc¸§÷ØÐÚñïB#NßD||–@+z“1Îõ|€¦SÊaa’ årÁÚÝ ³ëÁúÞï¢|à ÊûGP‰Zv/+¸ž¥öΊ+wGð akÇã§töÀö‰Ç±¹½‡G¼_@01…„1(]ÍøÁ¼—/Ñ}áLzq*ž«O†ŒÃ hÊ>‚Sæ7¾ÒõÇ4-¾NÉØó°:Fó‚£¼oü"„½ß†o³³“ Ÿ qŸk?Œf{3d»î@=NSõÿIs/Îø4?uËAf<À-ŸB ë® 2û~¨í3øz%?SÈçíÌ<7õ"œ^'úúúÐÖÖ›ÍVß»hFùHûgù5É*Áåw¡¡Ó ‡ÏI¢¨û\Í$«((*†0Ïý˹·1¾ÊK^¦õ»û¸oèsõê@é§©O8µxÖÜÏÔ™>£xÉ„,½G­a0Ç2 &¦©Š¾’¿Çkñ¢rý-î~^/ Ø[ª­àS›¿Ž—¨ºŸ-ã ÒøYðeÚÚùó| Ó‚§Çÿ‹G󊲲T©¤¨D ±]R–¹?¹õS:‘áÕé×°¢TWûcáóá¶?¾½†Ï9x s cNÑáØ„;¼»«Ð5Z¯‚h¶1‚*Ï<ûLb¯Ò,ðï®ü=ŽÉØíªüÂaºŠ®ÍtbÙsoÅ&ñ:f‘æÓ`mLº#æ< wj XëI-…³oq`ñ=­¥+jÂáö‡á7pŒç–.˜‚ÉÆßáý„éœr,°Æ(ÀÈC!¬¾³1Œ?;ù<þ‡öhÚüíŠê?¾A£ƒGv—=K£ÚÅ|ED1ÞÞß´MVŸáês šaIA„ÁÆ@yQ¼¶®Ò/=:‡ŸN¾`jˬ±¸~ËAH‚\öœÛ±)ÜX7Þ2³0@ —Þò¹ÀZ¡³"TJ)?\¿°| ?ûaEîlü$öxïÐ1+…›•‘91_p§w‰0O†D³Z:J¸À‡ílñ•àÏM£„]²á>ÿÝÔ©YËÆOŃœ)µM4dÖë˜ÐšQ›@Y=€d“5G…òDH$šôlÅÖú-¤<Àc©§ÉL·ãS8O×J–VJâóeš šô|•Òb&¬®:;8àß7gß.[±3Kç9ùÑ«°kw7ÿ~1óš®6«$·;T•§¥¸Nrâ¡Ö?¤ßÇ÷pás+È&ø…öGðd÷W(åm*{2KˆN.ž65…žíðY½e×§¨/`ûÆZÐÆµ§Ôp×Ò`ý²¸h˜ ’\IZÈ,æ~¹ó1ôßc¸Šl5º)ÛûFÏ“è­ë.9Þš{×#7L¢B;öúî(7G…Þ4×dmä½p ‡€ÔÈ K¥ƒv7ìÄgKUl¯ÙÞD3ÀCe×#éHE-ØíÝ¥{iQóZh÷V- Ì "ÅEQÖ™JßÝ|WMÉÏ`}?†ê·”¹Å÷—/âZøºá8?ý®Í®ž²qc«¦Ñ`€&[ºÌĤ(jÎ `vÉP®µ1Aô"ÃÉÐ$UãâÝ »ÊƤ(Ó\H.šWFƒk-ˆ|%µ8!¶K8$GÍdÔ²‚"c”ïÓ܀ݷì.w~y¸êïZ{C¤tg°¢h%oˆÐ¤GS+r{½f´Ê15Ž[QcØ®R.Â63 `~G¿¶A xMa0c3!ÃXõ…¥¿¬×ÚÆ¢|¼^?¿b¼šlÕöÒ1«é(V•U“zCGþ^„¬,D_ ß2ÒJ¶ÅòÌ Õº56¾fø9{fÂĸ-åoD©æ°n¬9îòª°Žà¤š¢(I${°êík3oš’‘¢‰Ò,ðXð8ât²‚ÁÁ²4–÷':-ec’j"_B×k>‹¯èþ\D+s‚¤RA¤ì¥BÆð(^¸}´*ŽÏœÀ¥•‘Š™‚™M7q6iœä˜•ŠbãÝn¹x³±8Ð ,5ý§kßçt˜Ù[uTNÙ …fmLå§âÓxgþ=S_¼/ W} ëmko‰éAÙÆˆH SM%2ÜNQa_ ¾ ¯ÅÕ' ló“­(‹×Õn¦œ ]0Œ±¬ù¶x:NµëMþzm:>[6†˜0 [J‚(fPn ¹ßà”6V \H…x_O›NÌò^mco¤˜HÊLÔ Ñ€}¢©i¨jZE Å@*@pcýÄNä+(èÒ öjÞjŽõ‰Tî´šHÅDk2*Ø…:È’…É~1&Iò†€dß­Ysêk ¨…äܦSt.j©t*!Åì]}Ь7 F,DqcPäl3Z] & ¾ýc_ž^>Û.¶J&“m²d'W³«NñÓ4N‡7jcÂú"«|\:vå×õîvµ<¤$[•T–yGåcØr? ‰Ö­­ö™ÑÆ:\´;²ÀÈø]ù¹Èz©ÿÁ ïÌ¢¬»[\«á™H˜kÀôÈt¢¹§9 ªñétZ‹ÅbR*•ú¸ÀW²Iö\#ZÉ»Âóãóá#úh2RêC¡‚Á œH$¤Á¯Ë…’Š(×Ñ)’¼ ¶§¾õ”}çÀNñéçÿƒ¿°Dãß!ç”RÓ6œôšªñ0Or;^Ù]ìÔëç>Hý?Ñɾå–Ü5hIEND®B`‚quiterss-0.18.3/images/ImportFeeds.png000066400000000000000000000011061265173051100176550ustar00rootroot00000000000000‰PNG  IHDRóÿa IDATxÚ|SALA}3;³Ð’“¥Ä«xðd ` =pÈA$Á 7ÏžÕhBˆ‰Wox!)j N`¸x4ŽDуi8PÛÚîîøgvÛnµðšßþ™ÿúþŸ·L)µõõS×ó’Ê÷¬hèŒ3ÆØÉƒ±1˜Zý¥ã}.§.C>ŸW™l6ý/ob#|ùzLñ-Œc³6ŸNÃq <Êär Q«!„€”AèÜ¢ª®‹îT ÃÙ••L­NDô„–î×ä¾òÍïõÞ^,-/Ó³ÂÔä¤V;þ?A‹7,ú‹%Üêï7Q?Ã,\HÀ-]¯‰laÓ‰jѯïË8GBv\L 7 Úe ³«¯°ùyƒn’×[äœ#f·ctæÞ"=N´lSA›”¦xæñ*nžï‘#„%o#òÌÚÃÖ–eHmçåî÷½h:óaá|ר à&0œ•óõ½¹½'˜~—ÄïÊ)º¡ ¶@Òu A9Ãyõ,0Ó§§˜~‹d"…Ÿ¾›½&z8Á xË´ã²’É÷lcãà Æûž¡ä }“rÛ/rX§6‹v^\$h6˜ðñz÷.œ®«8<ÙÆáήtöbV{èênïD0òüöbÜî¸ÅÂTÆòœR·ì~Ü|¹u'J€¸ACk¨ö诠OÑ"Y`ÄIEND®B`‚quiterss-0.18.3/images/QuiteRSS16_NewNews.png000066400000000000000000000012221265173051100207270ustar00rootroot00000000000000‰PNG  IHDR(-SbPLTEÿÿÿt¼v¸}¢fÀj:»?<»@<¼A>Ôb?»B@Í\B¿HC¾CFÒmLÁVNÀTOÃORË]T½PU½PVÈ[\Îh]Ìb^Êi_ÎlbÎlcÊlcÏldÏneËmgM‚k\‡lÍslß‘q^tÏxu_’uÂ`€Ô…Õ……×…ˆÙ‡‰µŠµŠ¶‹¶Œ¶¬{ڋٕٗ‘Ù•‘Ú™‘ܛޗ+Ä-Å.ğ繠ߤ¢à¤¦´^©±a­ã®³æ¶´æ¶»è¿¼èÀ¼èÁ½@â½éÁ¾¡B¿@âÂHäÄìÇǤLÈZçÉZéËZêÌcëÍ¡EÑsìѤ‰ÑïÓÒ¢HÔëÖxñÖƒíÖ…îàýðèèýðÿÿñÁRòúóôª#÷Õ\ø·?øûùúÚKúÿÿûÔLûÜ_üÀZýÝaþ¡9ÿ£9ÿ®/ÿ»JÿÇzÿ˃ÿÓÿÞ¤ÿßoÿßrÿߤÿÿÌÿÿÿh®ìtRNS1—¬Éá·–2ÙIDATWc`ÀL¬Ôb?»B@Í\B¿HC¾CIÁSLÁVNÀTOÃOPÂXRÄZRË]U½PVÈ[Z×}[Çf\Èd\Îh]Ìb^Êi_ÎlbÎlcÊlcÏldÏneËmgÄclÍslß‘sÎ{tÏxuÂ`v/Ów0Ô{9«{<¯|Ë(Ô€Ô…Õ……×…ˆÙ‡‰5Ή>Ï‹AÏŒ>Óڋٕٗ‘Ù•‘Ú™‘Ü’:Ï’;Ï’KÒ“Eȓۙ–Û››Þ—Ÿç¹ ß¤¢?ѢतLΦ>ЪOÑ«QÒ¬rͭ㮳涴涻迼èÀ¼èÁ½éÁÄìÇÑïÓàýðèèýðÿÿòúóøûùúÿÿÿÿÿ¹Ž­tRNS1É÷úýdvÕè¼IDATWc`ÀŒLÆXÆÖ©ÓêËUÚvõ CL°É}Œ põe&(‚ˆÊÚe½J”A"ÄYÇ××Qß-ÃÊ=~jÊúáþW¬€r3c1Cé¬ÕIEND®B`‚quiterss-0.18.3/images/adblock.png000066400000000000000000000013731265173051100170410ustar00rootroot00000000000000‰PNG  IHDRóÿaÂIDAT8•“ÏkyÆ?™8Î61éa¬‹¢¶X )»ìЇR¼yðàAX<ì¥g1öOè!¸”B{ìQ©"¸°Ö]<,ÅúÐÄ6­‰iÓ¬N2|Mg¾{°‰b½ìçøòòðð¾Ïa?Ùï̾æú¾‰”)%†aLlnnnÉ=„²^¯K)¥ô%‹Qþ|¥ã@>4„ÙÝe¼/—i;s]Ó4y>?ÏH,†ÙÕ…68ØWÇy~üòeÞ:ÅÏÉ$Ïææ0uÛ¶±m›j•—7oòS2I-“áðìlè8ÎËN€l>Ÿïéé±?Œ+¥BR*Ezt”ír™7r&åp&C|j*¬Õj«ÃÃÃs^ìå:»²²Rô-‹—.É`yy¹dÛ]ØW¦R©´†a ¿Áó¼ R©¼ý¶Löó¿êų̈pÄ–ÀqIEND®B`‚quiterss-0.18.3/images/adblock_big.png000066400000000000000000000060431265173051100176610ustar00rootroot00000000000000‰PNG  IHDR00Wù‡ êIDAThÞµZ pe~ݹ!@€ HHqƒ,•åN%ac;BP ’Èâ±êŠ‹Bi‘rY¤uKWQÑ¢¹B€T¨M¹'‹lE”;A\R‘+„ÜÉL÷~¯ÓÓÓ9f&`W½êôL÷ÿß{ß{ÿë"«ªJžúý÷Áþvm$íʬ‡L’$1ø•)))‘0é^XVVÖ,Œƒ±G¨#»[øäääióçÏŸF÷è—™™ù4“àHxò¬Ü‘T,a3À/X° ’îññDgH¸6ÁŸMK£Ã&PÁ´i”Ayl‘‘” ËaÃõqœãœ ;NǦN¥,6ü½ÏÚ¾øâ®H¸$ 4ßøú]»h€Œ±“'ÓØ)SZÎ6}:…EGSجYöÔSöä“4dÆ€ÈX~÷NqïãÇ©xçÎN“; ¾î«¯hpÿþä«(¤67·˜ÝN*®ÉË‹(0¤>}èV—.$ß?IAAD~~¬MRí>/XH¿~$ef’­“$ä΀¯ýüsüÀä#À3 ®$uïNR¯^TŽ{7ïÛGIß|C¾þšÒΜ!¹G"R}} "^ r¦:z”l_~é1 ÙSÍWú) x_Nnö8@°ÇÙㆪ*sD}Ì@îÀÓº!¹üêêHmlt¯G‚Ìšd¡¶'™v" }†$–Q d®ZœW¼Èqë,¢{8=u3FŒï˵ÍÝnÇ3bã©•úzRjkïxE7Ñ ¨-µ˜ž”†éß+âý,®™¼„ÈyÁ»>Ü’ š|öF’}­òê$HWÃdG6púRI[]M**ŒĔĚn­tPf€N€õ{œ(÷Jÿ,.¦õßOQ8Ò~ù…¼°bËP¤ËHÒÍÁ¦clUÝÃT] À+55w¼n" ʤ^?;,‘°ëy#ÈÚMÏ+)¡$$çpt®A5[‰Uºäüy’¹§jñªI¿ßaÂØŠOl|i’T䃢G†ÉÞ7iÒj"z¸¯uÂù?ü@«¶m£9¯¼Bý|n”—“?/ަ<Q ¼ád=Ç Í&̈€.%ú–’"êµ!úÐCÔ š˜ aÇêæ®©©I'@!¡@,„EEQ œÄï»64‹£ "Ò¥k$²N¤ã ŒJH1iU3<à@ SD>è^$«1á¤gž¡‡¦z$?òA‹Ág¹£Gkg³„ÆÅÄ´ÌÇcܼI§°¦L1‚Ì%¡j Œï%=ú·#`INMìIåê$^\̺®Â¤uš˜ ÌN©EE㳈@#œñ8ÞØ˜¤dS „7®‰ ó‰äÕH0Fw# š^êÍ‘p”ƒI`p2å€ùYWÆ’ @+=oíZ ÀËeù8@ㆠ!M¡ ²Âó nø8G¼Ý$¶&ˆ¼ñ7‡8Ä\i÷]¿~]wãʺòã4™Û+’õFOâ3î·ßºÕq+–Û&xq-Ve½3uXWƸŠV„ÏݼÏïÆÚºÃ ­¯3|V9"- kGë€Ó*gÑ¿ÚÆ5YV×ÎÅ *¦"‘%nÍYãLow ×’c+N»Ï9¢¿e±øÍ«3Ö«pÅ… Tƒú? ‘PoÜ $¦B2'r˃f–^È™€y`É"!'2zòzc@»ž€^ÜÓt‚ð2ô´!X/4©€J™Ùº/jŨï“ÌWA{ íä¯È\…z£©Æ„<7:ÅÎ?[œœL3&QÀB¡UPXæ­â-ÆVâ‡Ä—Á«WÓyx·ÞÜMšºN^ÐzshAäêÅ‹Ø ð|W´Î—NœÐz­¡XTîõḶÀ_à¨,YBþXéÛ%PPPP*Gêë¯Ó9­·à( "ðÊÜ­@aJ Þë=&ÀúÏûî;6Z…ç¹TÊ&½›ÁWÄÆÒ¼d‰gOžV=òÕ㜄ÝçkØëa<™¸/^ù»k¥¥ôwô@AÐz:O«0%£\ ð•Ø÷ÚkÆó………å‹/΃çsqë^X9¸¹@¦ &±|ùrÛ‘#GŒHü1>žºoÜHá¥ÞâÆ*¼×Œ$^BVëÆ§ô?$;r‡4³ÕÁëÉØ#Ý€mõ¾s ä§bWC“î}¾êÙgiÂožgð±±±| ì:÷vÖý&'Ë–-³:tÈˆÄøU«¨ç{ïQ)¼ß¨{‹{<Ø|ö,-Åûì*¼Yb÷ =ÍzüNð1€lÂþèŸQ&ÿ À¥GŽÐ†¹siÅÀ¤‚8¯´Ú*k_ iMBî‰yóóóËçÍ›×&ø¶öFH YðŽ‘f˜˜˜H½6m¢RxL#ÁOp›¾Æqî  5Ô–… i ö” ­¸å%ü ñ>€¯F¯™) ž× øÚ•+iʺuø¼¼¼òÙ³g· ¾½Ýi'‹-²¥¦¦–‰ú; $zc»ñ"÷ü¢ìñÚÀÝâ¥KÔ|êJB ÆõÓÐýT †îíøÌqú4ѯ¿ –|ýóÏÓÔ·Þ2ê|NNN96Û:ßÑïN$ ?4Œîxá Þ²….ƒM¢ôqo€+Ü=Bß )ˆ‚™©¿ýF×{.—z ð g8ª|tt´Kð®~br"}SÛ¾}ûÊD/"Hä@1X˜ ×6t’E R™h†¿‹ðY`Ô Ÿe!±(býz£ÇÉÎÎ.ŠŠr ¼ËßȬ$ðÛ°mÏž=eâË ÓJžpón.€Í°Ù,T—YÃÑxy‰FŽü 69[ˆÏÙóâÀÞå3fÌp¼;\’¸WGgÀ»Kàw'ÑYðžh“ñìà]Zjddd®<Ú•æßëŸ=Ì$¶ÂþÛy—Æcl3ƒ÷Çÿ­b"qŽ_gaEwi<Æ!Oÿ[åÿœÈ Cì]KIEND®B`‚quiterss-0.18.3/images/add.png000066400000000000000000000010431265173051100161640ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆÏPLTEÿÿÿv;zˆÍ ¯öÝÿ£9z;zEJ¢P¥R§S¨TªWª[¯^°`³e¶f·l¼l¼pÀ sÁx¿ zÈ~à Î‚Ç‡Ì ˆÍˆÔ ŒÐŽÙ Ú ‘Õ ’Ü ”Ù ˜âœçâ ê¥ì¥î©ó­ô­ö®õ²ü·ÿºÿ»ÿ¿ÿ)Äÿ=ËÿRÐÿhÔÿ}Ùÿ’Ýÿ£Þÿ§ãÿ¼èÿÒ  tRNS .6CÌøøþGi­öIDAT8Ë“±N1 †¿\| 娑€U¼ÿÜ‘­s  Kb3$9®RÒHx³óÉvþü!ÛäÆÏ!-m@¼öHlnÞ¼bg¦ÖÝUífƒÃcàú[;ØPô+ Ôv¥Ò"à§ÇŠŸÀÁÇSÍ_A`¾?Õ‚‡”¹oßL[e.Tšò’¡}šOd¸šÔ„Ÿ.ðn¤ãªÃÝÀíÑÕBB`©þ±€ºs!,"ÀŸ¢’óÐöäj×~,7vT¾pºâÉ4èPnñ ÌÞÀi°ŽåÒ¹üMmÑ»%ƒÎÙv‰_T){ÕQ«–ªIEND®B`‚quiterss-0.18.3/images/add_t.png000066400000000000000000000012251265173051100165110ustar00rootroot00000000000000‰PNG  IHDRóÿa\IDATxÚ¤SKhSQ=÷6m’‡IKiK´`Á]¶üa‘BWu'Š‚EDì" .\„ZZ Jvv¥Ü”.Ä…†´JÅB´ ù4MÒæû>yùSpá…yÜwçÎ93sæ Ã0ð?ËÂ!DãàÒ †T >]Ç(C³GJ MbÌ;Kõ»L.ÌO àâ4ž»8o]9sÇúQVsØÊG‘Èl ´B0¼ŠrE››ŸÂå ~ç9Ø7ñìš+‘·X^÷£¤rv€•òT:°Sta1´‚BY{A™L6Æ‹!‡M >¹îÇâI¤¶cPuàΩjž~°ˆíH¦»ðu-MÇð‡»Æ’ä ÆFÆñíÏ+¤ 1*ЛmÆFÿF[ve½nòk˜aŸ¬Ý9w¤ç0ÂÉ&s™"Jz€÷E*‡K²+e8³»g*p¢%m‹êìÄÍ‘t‹TÞÓM©_. S•ºú²*#ÙI@Xä¿…—ûÌ$€T6 Õ±‰Ybà28]ï‰*ï‹0•h§ÞX €fõÑ1ñ´áè/E7lVª“ÌÚÑdá=Ÿ±/›ry")"ÐH~‡o-G2¡ÃÐ%,ÌfiðžÏ4Ê*ˆ¦ Ä)Æ,¿6HÊùûxãêÆÄQDwGà²õš™b ¹Ç~F dâ˜[xˆ«›ß;ÊýàµÒ‰Ñ>·€Ãn4êäŽç Uæí¤¦Úâ1ñ9ÿ0K!Ëï}» ÜLK’Ô¯±IEND®B`‚quiterss-0.18.3/images/arrow_down.png000066400000000000000000000005051265173051100176170ustar00rootroot00000000000000‰PNG  IHDR(-SPLTEÿÿÿLMD†DˆEˆFˆFŠGˆG‰GŠHˆK‹KŒ~¹~½‚ÜÕÓžÓŸÝ ¿¡»¡Ã¡Ô¢Ç¢Ê¢Ñ£Î¬Ù°ØS´Û*»Û:ÁÜIÄêSÇÝXÍàgÓávÔÜgÚ䆿ê˜Û^ŸtRNS3°ÅëÅÿnIDATW]ÍG€0 @cz½÷^ÿÿ@H€ãÓîÖ ] s.ÜùóØ8mÏL k*À’ 0—}¬ F_3j[¨?P /Š=¦¼àvSNû2?I|†ßÚA`ãÉÀ«ßùð$sÝd×IEND®B`‚quiterss-0.18.3/images/arrow_left.png000066400000000000000000000005161265173051100176040ustar00rootroot00000000000000‰PNG  IHDRóÿaIDATxÚÔ“=KA†ŸÝ[?ðgjiq'ø¬ ˜€‚ –¦I#V‚½Ú(I–)m´¶ X\«ÁÂÒ`Âéí®»9,=¢)Ä·™yyvfWXk'$cÆß¨JCà§` h‹ )™£øæLÃàÛØj’fÌigfl±¾f¯|qú=ÛŽi=í°< ·! |ƒáÓŽ’‰€K¥5öhó˜ä¥ŠQ°íRZÒÈ‚;w6©͸¬|¢Ÿõ`Ú{ç2/*6ÈI¼Â•’½J•WÓ}†V;G,2ñ„fÀZ«Ó¾Ú'’ÄIm}ƒ»û ®‰F\›(׮љ„¥Sò05ÃâoßEè´ð“ñÿ?Ó§~bf°Št“IEND®B`‚quiterss-0.18.3/images/arrow_right.png000066400000000000000000000005061265173051100177660ustar00rootroot00000000000000‰PNG  IHDRóÿa IDATxÚbüÿÿ?%€‰B0ð°L`$J!(¤þýc˜õ÷?C*3##Ðj°NP ‹];þß|²ä¿s;ˆûŸÁ¯hˆO/Ãú߀¦3üÇc=ÐfUEQ#…Ù ÅËSöTügdùÔÜ“ÊðëÏ|1úï?ÈµÌ —ŸÎa8ó4•¡5¼Á³›ñ? È×ÞÏÀ€×Ü_ +Ø!AÿõÏ;°8£K-Ã:V^†À4ƒ¼hm ô‚<ƒðÿT†‰f3ì©d0É…Œ‰Áî ÿ7Ü ùïÖ.cp ú÷çŸ1LãgÈÜZÂ`Ô|–‘Œt# u 0ýÌ`™Y†üšvMßIEND®B`‚quiterss-0.18.3/images/arrow_turn_left.png000066400000000000000000000010171265173051100206510ustar00rootroot00000000000000‰PNG  IHDR(-SPLTEÿÿÿLK9i*M9k9lI‹HŠLE€FG@†B‡C‡CˆDˆE‡EˆE‰F‡F‰G‡GˆG‰HŠI‰IŒJŒKŒKa›až|¨¯¹G»¿™»›Àœ½œÄŸ»ŸÁX Ï Ó¡È¡Ø¡Ü¡ß¡âªÉ«Ê¬Ê¬æ­Ë­Ë®Ì®Ò"°ÑT²æ%µÑe·ÕS·å4»Ó=¾Öy¾åA¿×tÂäPÈÛ†ÈÞ^Éå]Ðß›Ùã¤Üç™Üè•Ýè”Þè”ß蔾XãÌtRNS "#3?[„…”©±¼½Á:Õ!ТIDATW]ÈEÂ@Àßøàœw×àî.÷¿ ‹¡–pâ‡@€ÿÂwmä¼’äã@ ùT-ߟ¯×ûÑäH>Ô+Ãél2lwb|ÕÉK<™)ÖÎ;ÀB‹8c[º4_G°”Ðê­ÙÖ%H Ìæ@ûøÆ—&ÖÝ Xo"Ú_þ…:Ž ¡¨ª"„KQÜB3Ñ^½ùŸ›ËIEND®B`‚quiterss-0.18.3/images/arrow_up.png000066400000000000000000000005361265173051100173000ustar00rootroot00000000000000‰PNG  IHDR(-SPLTEÿÿÿF€G„B‡D‡DˆEˆF‡FˆF‰G‡GˆG‰GŠI‰JŠJŒ®€®›¾¹žÃ Á¡É¡Ï¡Ò¢Ë¢Õ¢Ù¢Ü¢à¦â§ç¬à²à#·ß0½ß>ÁàKÈáYÊÜ‚Ê܃ËÛŽÌâjÓàšÀ/6$tRNS"&3¼Íà´b®vIDATW]Í1 ƒ0„á» "Ž‚]Zðÿÿ¥vs1&~Æd;^‘$€¾@’ Ç6­Ý4ÏS—ax/fËg¸ÁÿN)|ý ñð/ù#f ® ÚåžÀˆd²¬~¸xÕª¬ì뺷-¦õÚ`(5)-À-IEND®B`‚quiterss-0.18.3/images/back_page.png000066400000000000000000000004631265173051100173350ustar00rootroot00000000000000‰PNG  IHDR(-SlPLTEÿÿÿÿ•œ[Tÿ™ ÿ•ý“ÿ•ý•ý•ý–ÿ£ÿ¤ÿ¤ ÿÙŠÿ·Uÿ£4ÿ¤5ÿÒÿØŠÿ؉ÿÙ‹ÿ•ÿ•ÿ¤5ÿ¨;ÿ¬Bÿ¯Hÿ³OÿµQÿ¸Wÿ׈ÿâ™ÂWûtRNS +-ªÆÆÌÌÌÒÒÒÕèðôöøùùþ+±t\IDATÓc` °°£ñ¹¤Pù‚(,üB’RPÔËÂ'®(¯¤ b@¥¢ rE@V^$`dã‘A6(Â-,ÅÄ L `NT‡10²²3) É Œ™/IEND®B`‚quiterss-0.18.3/images/backup.png000066400000000000000000000014131265173051100167020ustar00rootroot00000000000000‰PNG  IHDRóÿaÒIDATxÚœ“[HTQ†¿}ÎÑGÇÑ©h´2+ºQÒE¨ Jˆ$± zˆè½¤¥=Ø*zH´ŒŠ,»ÐM( ŠŠ"z2#0ºi½DMÚÄÌ8gΜÓ>ÇK=F‹³7¬µ×ú÷Úÿú`Ð.\ºÚ Ö Ëv,ç6!=!Äwkú5+ÿœI;ñò¼´´´g“&OÄ4!)Ã&*–DQ,EHOf*Šàýû.b±XÑÆõk;ìZÅÞ"‘È ·ÛnÞ}ê!wÂL„jY:JÑÜY¸¼£xÑù=aâv»œü¡4{KÆü/ѤÂÚ%Ð-ƒãGƒË…Z+(ÔA]ý•ï_ºñŒð`Èü!eà!ê¢t_ÓHHHü^vw¤æU ,•¹24½`ý†‚7Ãg,¨o8åÑ ‹_ÏPÒ¹Â&{ú(]²ý»6sàö:(œ€r"ƒiŸO“éÏ–'8ÖpÒãèz¼Üï÷¡§ç“4ݵ™üüæõ«×$ã?YvN^è’³ +ª†?+‹x\/w¢‘h±/ÃC(ww¦´@PãPçz:^¾åÊõt´?a{Å&Êî/§;›3•L_&Ñh¤ØPU¥4ÇŸ…0b¤ºÓä ˜Â¾Ðº>CKus¼®–ªŠÍœ¨;,)Œ PU­Ô0’É1cƒAR4ß“ÂÓ’´¿ümKnâËÊFÓ4êëë©Üº•ÕÛ——gObÌÚ®]¹ZÖÔtзÝ RÙ;ÿªäâȳ‘Ì)œBooØ!o{ugÏÐÜÜÜ&kËm«µµU’w”†£Ba*¼&,RdÛ÷îÞ¥çG/@ÕUU<|ø€ÊÊJᩯ/LKKË Þ4oý¥õß@ Ž–OÊ!ÖgË– t]·ì£°\^þÑ)˜4• o:=p.(ÄÑÚ¿›$ô¹™L²cçιü§Í\ü`ýUKŸWOIEND®B`‚quiterss-0.18.3/images/bulletNew.png000066400000000000000000000002401265173051100173730ustar00rootroot00000000000000‰PNG  IHDRíÝâRPLTEÿÿÿÕ“Õ“Õ“Õ“Õ“ìÏsýûµåŸ½—tRNSªÆòn•Ôø.IDAT[c`````ÀÏ2„Õ”! !w'í¢ÔU®® ‹8æH™¶Ž¨IEND®B`‚quiterss-0.18.3/images/bulletRead.png000066400000000000000000000002571265173051100175250ustar00rootroot00000000000000‰PNG  IHDRíÝâR!PLTEÿÿÿ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦±ÕŸ tRNS8qªâæòùlèÚ2IDAT[c„ ‚Á(¬e¤·‚‚‚Â•Ë Á ¡ÎŠ`†`x DJ¢¬—Hú 8ñÍNIEND®B`‚quiterss-0.18.3/images/bulletUnread.png000066400000000000000000000003721265173051100200660ustar00rootroot00000000000000‰PNG  IHDR(-SQPLTEÿÿÿKŒC{F‰H‰HŠI‰IŠJŠ\›cŸ~¾ÀˆÃ‰Æ‰ÇŠÈŽÆΔљÏ%´Úf·Út½Þz ‰o@tRNS3—¬-êRIDATWÍ;€ Á‚ Q>Þÿ –áY²å4 Û/X »[ ã\/WéNÀ´xÆf8å;'о>ÕkÔ|°F@¥NÛ©øÍ­F¤ú[šIEND®B`‚quiterss-0.18.3/images/bullet_error.png000066400000000000000000000005601265173051100201370ustar00rootroot00000000000000‰PNG  IHDR(-S“PLTEÿÿÿ "8P  ™™µ¶Ñéñçïüýþ*ÿ/þdKþeOþnVÿ8ÿ=ÿA'ÿH0ÿM0ÿT;ÿ^Eÿ^FÿlWþdNþeNþjQþnVÿ9ÿH*ÿI*ÿYAÿ]BÿcHÿmXÅáÈú&tRNS((5=>Xv‘‘£¤¶ÈÎÓØááëëþþþþþþþþþþþþ ¬fIDATWÅÈÅ€0AwN° Á­ÿêøp´ÀþváŸäˆ ‘PFæÒ¿œ„誗f©¯A‹éN7k ²³=™ØÅÑ…ý;öÓ0õ£ƒ°Þ<³2~Wfžè`¤¹ùþE™ÿ·7sIEND®B`‚quiterss-0.18.3/images/bullet_toggle_minus.png000066400000000000000000000005541265173051100215050ustar00rootroot00000000000000‰PNG  IHDR(-SœPLTEÿÿÿ€€€vvv‚‚‚ƒ‚‚ƒƒ‚ƒƒƒ„„ƒ…„„‡‰‹‹‘Ž“‘“—‘”—’”—“•˜”—š•˜›–˜›–˜œšœ œŸ¢Ÿ¢ž¡¤¡£§¨ª­®°³±´·²´·º¼Àº½À¿ÂÄÁÃÇÃÄÇÅÇÊÈÊÌÍÎÐÑÒÔÖÙÚÝÞáäåæìíîÿÿÿ9Í› tRNS +@C¶ÅShDêuIDATÁ1nÃ@0Žnÿ!]àÿÿ(@JWé-@º19y< ç{òõÀï{rùK@ûs™èZ½ËÐY)Ò”‘æÞEŽ4†æð*CÀ*#ÿÉ4Fš4†@Ù  ;Æ‘UÀ‘Ãô|mÇizÝК½€%f5 w±•”IEND®B`‚quiterss-0.18.3/images/bullet_toggle_plus.png000066400000000000000000000005701265173051100213330ustar00rootroot00000000000000‰PNG  IHDR(-SœPLTE€€€vvv‚‚‚ƒ‚‚ƒƒ‚ƒƒƒ„„ƒ…„„‡‰‹‹‘Ž“‘“—‘”—’”—“•˜”—š•˜›–˜›–˜œšœ œŸ¢Ÿ¢ž¡¤¡£§¨ª­®°³±´·²´·º¼Àº½À¿ÂÄÁÃÇÃÄÇÅÇÊÈÊÌÍÎÐÑÒÔÖÙÚÝÞáäåæìíîÿÿÿïTÝ tRNS +@C¶ÅShDêIDATÁ1JCQÀ9ï]’Ø(âþw$X‰…ØØå“üãLr½@n·ÉåÇäî3íÛ=Ý;^|é£2tvÊNSFšÇYެ4†æ^ù.‹n€]F:¿í“Ÿd#M`Д‘3áÏ¢gŒ•]ÀÊ’}¹žÖíÈÚ €öà°C3Q~ÝMAIEND®B`‚quiterss-0.18.3/images/bullet_update.png000066400000000000000000000006221265173051100202670ustar00rootroot00000000000000‰PNG  IHDR(-S®PLTEÿÿÿøøøÒÒÒøøøžššŸššžšš\XX]YXXUTYUU›——=31>54>656.-4+)PHGLC>MC>QJIJ@=KBALDDE=:F>=C95B95SJGUNMND>QIFn`WnaXoc[pd]Š{nt˜‘™•”©“½©–þ¼Å¸ªÏÈÂÖİÖÔÓתâлçÝÑçÝÒèÙÈèÚÈëçäïåÙõîçú÷ó‰5~6!tRNS!!"##&&&qqq€°µµµ¿¿¿ÐÐÑÖòò÷÷)ŠCÄrIDATWÊÁ ‚@€aÝtÐUWcóàû¿›haˆËŒNÓ¥)Ð[ÿñã7ñ!úä×ùˆçû[_’ªó•ïÊL!»:‹Ö5©BFD X‘×0§ €ÈÜ6¡B ≅íP0Lô…uœÏùo ¸5¶[n&¨IEND®B`‚quiterss-0.18.3/images/cleanup.png000066400000000000000000000031221265173051100170630ustar00rootroot00000000000000‰PNG  IHDR szzôIDATXÃí—}lUgÇ?Ͻ½çöu½}£·«…µ0lyŒÐ ¤eCç 0V mQ³£‰Å1Ê€M”b·A)B™­‹ ÂŒfQ) Ì)+µÝV7W¡EV¶¡Œk¡kh¡=÷߃HÇfÜ]c¨úéVñ ƒp3÷q¶¯§ådßÞ§ëö¸~¾ºð‘H¨INËŒÊ=§÷"=N£•²q©ã}ÞM-¦âéuWµák5"¤Íššù¹‚¼Ì-‘ÞH/!Ëò¢” zDËØ‚Yð/Ðóa'o?ÑXÕxqðŸpñëuB7¤þoÎÊ)˜4*q±×cYÑ11DÅÄ „ ­F+”RÁ¤Õ-5FË`ÿ:ÏåÔéöÆÍuíK÷Îpñ¡Z±¼@\(A“¿8éö‰S³“çû¢#r-Ëãõx ÷ãù-¿|z5ûÿø/;ó³V9xIEND®B`‚quiterss-0.18.3/images/close.png000066400000000000000000000002201265173051100165350ustar00rootroot00000000000000‰PNG  IHDR½Ê–tRNSÿ[‘"µIIDAT™cø Èá/Ý$ö.…ó÷ÌÙþלÝõ;®X¸Yÿš•«‘Í;°|íò½þÅûÿï_²Î_sHZM¶ûT¼ÖÓV¦MIEND®B`‚quiterss-0.18.3/images/close_hover.png000066400000000000000000000005551265173051100177530ustar00rootroot00000000000000‰PNG  IHDR ex„PLTEÿÿÿ™™™žžž   ¡¡¡¢¢¢£££¤¤¤¥¥¥¦¦¦§§§¨¨¨©©©ªªª¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´···¸¸¸¹¹¹ÊÊÊÍÍÍÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÕÕÕ×××ãããéééîîîïïïòòòôôôöööÿÿÿçß2@tRNS@æØf—IDAT]ÉI‚0@Q”!Ð$&mB*‚ ŠöýïgS ý»W?Šþ›äaON<‹XìÅû „TR€#;Q0ßr•_gP ;Õ²¥G|§Nê”- Â@ €F°st:[èi‡9¬;uô¡A9 ìÒaKc1R‡®d+ÏÞXӿЫÕÁ[êଫ}U7[uåÙsƒç-¼Ììß¾ö¹ =c§2IEND®B`‚quiterss-0.18.3/images/column.png000066400000000000000000000004041265173051100167310ustar00rootroot00000000000000‰PNG  IHDR(-S?PLTEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿðòõIT^`jsõöøÿÿÿÿÿÿÿÿÿIT^FQZIT]IT^\en\fnmv}ì£2®tRNSh‚œ¶½¿ÆÌÐÐÙêòþßÑ!dIDATWuÎY€ PÐâZñþg•²†ç£É<Z¥>1-Fžk|&¢‰'ÈÐSÀĸ (€d×ÞÁlNfZœsþõ¦ n ±«#\òt.6äÞN×öI½GcÿË ¹waIEND®B`‚quiterss-0.18.3/images/control_play.png000066400000000000000000000012051265173051100201410ustar00rootroot00000000000000‰PNG  IHDR(-S>PLTEÿÿÿ¦¦¦mmm¥¥¥’’’‘‘‘£££¢¢¢¢¢¢ikmprtqsusuwvy{xz|y{}z|{}{}€|~ˆŠŒŒŽ‘™™™™›žŸ¡ž ¡¡¡¡¢¢¢¨¨¨¨ª¬´¶·¶·»ÇÉÊÊÊËÊÌÍÌÎÏÍÏÐÎÎÏÎÑÑÎÑÒÐÐÐÐÒÓÑÓÓÑÓÔÒÒÑÒÓÓÔÕÖÔÖ×ÕרÖררÙ×ÙÚØÙÚÙÚÛÙÛÜÛÛÝÛÜÜÛÜÝÜÝÞÞßßÞßàßàáßáâàáâáâãâãäääååæçæåæçèêèçèèéêéêëëëìëìíììííìíííîíîïîîïïïðïðððñòñðòññòñòòòñòòòóòóôóóôôôöôõöö÷÷÷÷÷ùùúùùûýÿþþýÿþÿÿÿÿÿKF ÃtRNS13Fk•©ª÷øùóRSÎèIDATÁ;OÂPà÷ý¾ÓÓS¨\šâ¢qpq#ÆAWg·“š&FöB4r)ié9>Àé%°êNh{•Ý[ ùXÏ€°×O~vzwòV6TÜêO5êP6ëF*ëF+ìH-íR8íu`îK/ðM3ð§šò©žóV>óôU=ôV>ôZBôdNôiVô¬¡õ”„ömY÷cL÷gR÷hR÷xc÷¬žøiSø–†øº¯ø»¯ùnZúo[ûmWüq]üuaýs_þs_þt`ÿvbÿ|iÿ}iÿÿÿÓlÕªtRNS13FFk••©ª÷øùù6ï>ÁIDAT5ÁÁN1Ð{ß{¶N a£AeãÖÿÿ·Ä‰,À‘± ­ç˜È9Ĭ³”Ÿ3Ëp·¦>Ê©€Š¸¾ûo>™×FÅjcûq’vi‡{DŒúŸ0œýágï5·ÕëõZn ¢ìMf?¯Q-éz¡X,èz©1d`ÑæåºL&—× ;Š7?u>eý„ÅU:wå3+Zc›íz¼ÛÄhA(>Óù|šxPA˜¼¿â‹Eüu§ ¡ø|SÓø~RAØ ØQ»iªnW™M;  BÀ&CB¥.IEND®B`‚quiterss-0.18.3/images/editClear.png000066400000000000000000000004021265173051100173260ustar00rootroot00000000000000‰PNG  IHDR(-SKPLTEÿÿÿ™™™²²²™™™žžž¬¬¬²²²›››žžž¡¡¡¤¤¤¦¦¦©©©¬¬¬¯¯¯™™™›››žžž¡¡¡¤¤¤¦¦¦©©©¬¬¬¯¯¯²²²àl tRNSqqªªªªªªªª?ͺ WIDATÁG€0 ± =T›bóÿ—’! Ü‘ø§8’æ,ÈÜ}†ÙÝÉj3›&3«yŒÇmä5ìÉÀ§ß’žW\o‘G¥ª]§ª™ˆ´ÐŠYXJ’r ür€W{É¢[ìIEND®B`‚quiterss-0.18.3/images/email.png000066400000000000000000000007351265173051100165320ustar00rootroot00000000000000‰PNG  IHDR(-SØPLTEÿÿÿk¤Ík¤Íj¢ËV•ÄbžÊcžÊcŸÊe Ìf Ì‚µÛ‚¶Þ„¶Ú„¶Û‡ºÞˆ¹ÜˆºÜˆ¾æ“Ãä—ÄãžËë¡Êæ¯Ùö²àÿ²áÿ³áÿµáþ½æÿ¾æÿÁèÿÅä÷ÅéÿÆéÿÇéÿÇêÿÊëÿËìÿÏïÿÐïÿØóÿØôÿÙóÿÚôÿÛóÿÜôÿßöÿãõÿèùÿèúÿéûÿéýÿêúÿêýÿëýÿëþÿìûÿìþÿíþÿíÿÿïûÿñüÿôþÿõýÿõÿÿ÷ÿÿøÿÿúÿÿýÿÿþÿÿÿÿÿ‰t¡ÜtRNS03°Åò y¦s®IDATWu¡ AEï»ïÍè IpÀ ¨Xí~¼IË‚E“`²ù†uwžÁ žvo:øA´Wü³ØXoûuìÍ›óäîP¤º­œîé:3ªÒf×äN¸0,\àbѨ 7Db1ñàΉ&ÚµaíÆ¤4¶¶H˜¸0ìÜÁ R& mxtæq=÷ÌL™Jñ?=ssÏoÎ9s*Œ1°ZߨèaxÉDâ+;B@ñçáü|±¯½YûÔlšÿ©Ýn›z£Qù h¤Ÿ{-²_‰µxïC¥‚B¡€³³ëÍæj"³ÁZi­á8±Ù9¢ü Àå‰ çækkõÔOgâIÊæËóÈD<^™šÂÇZÖOJ%íÂY@"%OŠ®^ÏÃõ™¶þ¡p.@* ëoA®v逿õŸ;y‰Qgì|€Ö’#qr(~Í/´–ü9ãzHŒ¸.¼¹_¥åâÐì¡ ŽÃÎo—–PoP70ȘåÚú# gJÅÕ§Ÿ \{'‡¸7ý¿;»x¿µŒ»ÓË8ðö¹ Ã‹¨$Es©ÿpt²êxZ|‡q-º^»ŸÒ) ©¼¦Ð¥H4ØÞûÆÎÏŠ+¼äw>É[Ó·§óÂ.VJ­(}'…Í„8¤·¹ÙÎËëQ¸Q>Êßï êVÃEÏ]¤1Ž@¤ÿút׸w2ºýòf5ïŽM#Ø9­‹$çÀó·6_}½•`ˆ®’å0\]òÝý+ÀÇ'×ë51DóIEND®B`‚quiterss-0.18.3/images/feedDefault.png000066400000000000000000000014131265173051100176450ustar00rootroot00000000000000‰PNG  IHDRóÿaÒIDATxÚ”SKHTQþÎ9sçá{ÊÔIJìe„d%F™‘ºhBheBmZI´‚‚ˆ”‹Ü µ)*À ÉG¨)9j©9ãè¨ùšÇ½÷œÛ?w&]¸ê‡Ã}pþïÿ¾ï|‡É%ÿUK?`ÊÌÄ”6É„£‘ɹÑ0KñzÀ5@_ƒ% 0.-Ls‚þ3¾ ¶‚¨xÁezâ̾0ú_qw&øÎ28ŠkÀ3òÀ<™›€˜+á‹Ãþ¢ÉFÿkh‡ë§Ö’r²Ѿ—E§à<Ù–‘OMi@œ]²¤ƒ `Ñ‹ ”‚gæ¼€vìÔìôΧˆ¶Ý‚VZOŒªmvë –•€’G{"ïø¶}´™ç—À}þ!ŒîV=­Ô à8XK ërxHÙKäC-ü‚þé1"-`Ž| íNhåWà8pI’¡q(=lïW‚%¡¦¿ÁUÓžžK’"öT½ý¬å’sZÙe¨Å _šá¬n"•Ž ñ÷BMö@­†È¬t8+®Áuö.Œ®˜ƒm4ÊíDT`jn”†D7g»Ž“aÏy^½ãùbÚÿ´ÊF[’Z»<:• ˜Coèr€œ´Ìäœ<»ZÉ9˜¾ˆµß'2­˜LK͆9ðÆ6N쮀šùNAZýÇ€Óš‚«ö6œU7lÍæÐ;È©n0‡boäD—í•(,‡µèè7< ØÂCEÿ!™H:·ôuÀ ÏS·Ó€IXkóv„‰,093lAšÐ?? Bì89Þ ±¿òg'XÚVJj„œdd²Éí…ëôMCcz0h1žÃÍ(¹ë#Ú½{*ÁR²ˆêl‚.ÉàY”LFwBÐ=‰éæ}½‹lmìkýj`¬9ºÌŠ›7Œ%V2®›*n¦Ë³äôæ^ÿ+Àu¹?tEþ‚IEND®B`‚quiterss-0.18.3/images/filter.png000066400000000000000000000014601265173051100167240ustar00rootroot00000000000000‰PNG  IHDRóÿa÷IDAT8u’Mh\UÇ÷Í›Éd^’Icb›Ò$mcS Š EhÜ”š8.Z¿iµ nÄÔ"¢n­V©Vi£ A]¤P]I?œ¨éXÒi© $J‡èH™IðÍ›7Ÿïy ]ÔνÜßïüWí9~~Ûè#Û__üw?â ‰ö,hjͺSkRkhA´ PÖÂBß}Ö™lþk³©e!¾w+jÖ¢]˜þŽ †¡â MæJ{ów ÖB¶8<²¹køÜû˜©El…cg.ÐÕ¥³#B´­NË"ÚÞJÐ R(¹8e—‚[Æ)º,;%Þß÷4g“s˜EÔ¹½TdqÙe>WfÉÕh-h­ñ´0Ô¡»µHPÑÛâ§‚˜žë$lÛ°X 2º±‡—,ƒšl©Žö4í!E©ê1¿\f.ã°s ‹¿í2M7ŸTÀÖ=ï|÷åñ±Øú®6¦35´ö¨TëTkuÜZJµA¥Ú ÑhðìCÝØ… gÎÏ$®Ž Œ¸hO*õ—µsÇÀæ¾Á­ØuM‹©@€ˆFiÍî(YÛåÛK3‰ÙÉñ‰Ç?¼”6•R<÷ù•ô÷¯LêÜWÏ?‹­F°kŠPØÃÓ<Ϥ?ÚBÖq™úe6139>!"i€ÀàèaÂá0[öŽç“ï=™*÷ ïèîí´¬0 ÐAàPªpùòÕDê“ø¼&h ‡ñ<¡ØËùßÝŸòzw ©pû¶Þû;)–ª,ål®_½vaúãC¯Ý Jù'¥Øwú§ôôÉŽÞøíw^}0ÄŸ™s·þàç“/]…•R߬ L¥NÞYáý˱ÓÕz“¹ Ãhøà§¾äM`ÄO PJ­Dñg])$§n挕¯-’Þò€M"rÐ䥔â×SñWg¿ØðÀö'ü›|øŠÿlD)5iÜKû(q;ujüˆ“Ë ÃXK "oyøìÿø»ëa`—ˆ°ÚÀîÕù?+âsÊ©†ÔIEND®B`‚quiterss-0.18.3/images/filterOff.png000066400000000000000000000006101265173051100173530ustar00rootroot00000000000000‰PNG  IHDRµú7êOIDAT(SuÊß+ëqÆñç_ù¬\»ð‡œK·î\­±Œ¶ïÇœ!ŒX±£$)ò›±ÛHm‰åB¶$êp!¿ÊŹ8õ>(Âó\==/µ×,ÅËÉç~úèa˜ºˆÓ‰}öÊ©x´FmÜ‘aŸ UªT8å„2,3JŽ~ЀŸvzIñ‹$–©ç– ó—sЬf€Æè'Í4³8Έ þ÷sÅ\rÁ5”˜¥B‰æ¼ä »#.Ù!G†Ef˜$MŠ"YüN>Å$p%N('ÃÓL°Í2MNÆ“< H&è ²Ç«Ì±É<'ce%OIý”LÐmRd—,ëÌt2ñJH&´ñ›"kLÚx»‘< *¡n%$ÓÊ?ƈ Óõz#Yy¯©ÆéÀ“}Þê)Ï1Aû5°’/"ö=°’‰>ÙàSjU÷~þ[Ž!½‚£ËTIEND®B`‚quiterss-0.18.3/images/find.png000066400000000000000000000003011265173051100163500ustar00rootroot00000000000000‰PNG  IHDRíÝâRPLTEÿÿÿ™™™™™™™™™™™™™™™™™™™™™™™™ï=ÍatRNSUqªÆâ—±ìMIDAT[c`@ÓP0-ÖÑÑ&bd)U$iævöf ƒµ‰©+¬¦ ¦«jNGGÄd•ŽV¨-kGTÈÀ:¥z³žxoIEND®B`‚quiterss-0.18.3/images/findFeed.png000066400000000000000000000010641265173051100171430ustar00rootroot00000000000000‰PNG  IHDR(-SùPLTEÿÿÿóóóóóóèèèLLLÝÝÝÝÝÝ}}}xxxbbbxxxggglmnbbbgggššššššmno˜˜˜š››››œšššžLLLmmmcccWWWLLLWWW`aa€„†“““mmm•›˜Ÿ£™Ÿ£œ £¥§§bbb•›bbb®³µbbbkllbbblmovy{qqqLLLLLL»ÑÞ­Ï䦦¦¥¥¥æææ¥¥¥Âãøââ⬬¬¡¡¡©©©äää©ßÿ¯áÿµãÿ¶Úð¹âú»åÿÂèÿÈêÿÎìÿÐêûÔïÿÚñÿÜñýÝçîàóÿæõÿì÷ýìøÿòúÿÿÿÿŸ3íˆ?tRNS%,?JQRSU]__`bdefhi”š¡ª­±³³»»»»»»ÂÂÄÄÈÌÍÍÐ××âãìï÷øøùùùûýýýE®¦ë«IDAT•c`v>na`‘Ö‘•Ó–fó Uýý¼u\0á’°!Ô¦R©Ê—ªÊÿ+k-G d|˜ÐÀ¦øwŸ=Z;pDÒíìx¶§>=ë=F Ws—ö¯f ƒ~‡åæ*‚¥P(,–™ò<@¸ZÚ´’M6Â&ˆq3LŒqÙ¿ D ËßIÒ—¾n-m×H´¦ÔÃÝ^S…ÛT‚Ÿ¼XœC, vû<¹Åóù·´Â&ŽrH´Þ¾ JÖÃ&­c}ìµ~ó¥Z"U>=Çøú·Jñß,ý£Ô·ê¬‡M¢$Ùˆ#Š%е2®ÊÍÎʳ¥7©…u†Î Q *(£ùU¯RÜ(ÅÑ. Ž"RIIiÄ!V9\9?‚Gc„k¹1<7C#ŽÓ&•”8Ú HbR1ˆ…µ?Œ÷O0»úžû…I¦.ÞàóÒFO³Ø¨ VHÅ'1ÛOŒºüc(/ËLe–Bož{Ãw˜¯|C¬åzî&V˜^þ„ò²ˆI”ìt[“µ–¬›ÇåÕÂ;FzótyyŒJAÀ˹×;}±ÝÖ;mŬ¬ïÒã¥'€t*<·£üýrV€䀓‡ôB”àvŒä`­Žjçÿ–4z"jIEND®B`‚quiterss-0.18.3/images/flags/flag_brazil.png000066400000000000000000000011741265173051100210110ustar00rootroot00000000000000‰PNG  IHDRóÿaCIDATxÚ¤“OhAÆ¿Ùì¶!ÛRzÔž hÕàÁC$<äÐÔJA°E• Š7{,Šˆ(<øç&Å ZúÇS•&XÑV*ÑÆ¶IlºIf|oŒÅ\ÍÀ[˜Ý÷ûÞÛ7ߥY\æ¡«âq¥‚ˆ”õT-x‰ZÔU¦Ò¦‰'&ÃgcP²JI††ªô[eŽšªEÙ–pQ-,! ïtELÁºóýOORP¡}‰¸Ë~=mZàZ2‡‘ŒB3W\¸ÑýÌšœP$õ§å·ÀÃà6¤s!¢a=¤›Á1¼ Çqâå"–JJwÁŒž?òβ†¯tnGŸ >æ85×O+EjGá`t/žó`<ü÷Óß0”ZÐ̦Àêzñp¾/í~!¶Á‘ÝG{š©00œ™íÂüŽ4ú:w¡»c+î~ÏÖ¨§œCA¹à³l=îÛo |XF&«ðú†[x›—‡.³Œ b8—OU¹‚Ó3qÜ{Ÿ¤]+n…fiôÔÛÆZуól˜…„þÍdÐ31IŒñ·ÈÚÝ@ìK‰ìg XÃôq—^…ôl®ïa§7s“SøQrt.3Ìš|öÚx-IáH^Æð9 h½¸çIEND®B`‚quiterss-0.18.3/images/flags/flag_china.png000066400000000000000000000006201265173051100206030ustar00rootroot00000000000000‰PNG  IHDRóÿaWIDATxÚ¤S=KÄ@}›Ë‡Þ‘VAD-ÎþÐZü¶6þ¶k-õXÙŠ¥…ÊÁ…p¹/Oãf|ë$a9Á"2;oÞìNŒˆ h)áȘë8oØýÆ<Ò¿»òoZ0N˱ÜÇ”Z‰ó¹±£/'gÓ pyØDÑ"RCÇñ¬*Ëâ<†W:‚dDìï™&ímkdôô·è±¢~}³Ì˜ó°+fŽíˆw鵫ë.`¨ó‰°ä!eáуÌì‰ÞÇã+0 Hì3pM˜³ð,Ðã°Â€ ô-÷MÚYšAP3ˆi† ÞÕý0ÖÙÆôGžºÜ¥? ƒ§dývEïäÏ3ZS¬¦¤ê âe¯ï@õŒŽ¡«©,iäUý'å>X0OÜ–¤MV™P3×nPî[±¦íïü#ÀSyoáôOßLIEND®B`‚quiterss-0.18.3/images/flags/flag_czech.png000066400000000000000000000007631265173051100206250ustar00rootroot00000000000000‰PNG  IHDRóÿaºIDATxÚ¤S±NA}³»¾³/),C‹HTü@Ú|BÂQ:+ù‚„ÒñD©£´‰å"à7؈‚XQh B("‰„‘ˆ‘±-ûnw3{¾"ŽðÞîvwæÍ{3»d­Å4C`Ê¡¾íï~î…z©¯ ø…uÏRD΄[@±d·Û¬ÄÄf´¶QÙ0gÚv¯V«VÁ#\vB¨µ^屘óÑ6c¨ÌÍ>æ}Ã5à*t" ­ O?üÄÎYÙ´„¯J Èÿ˜‰å‡³žV¨ŒR…ÒÞÞ ›ñày„J4# Êѹê3€/!AûÀëú5j¿ÊËyD¼oFHpâèä(yÊ”ËK2ƒtå#‚—«ĈH‡XX½/'^ñ´Lñ÷6¾¾Ã›Æ&ð$ËiØ…þ`í$+Ø€óº¦6O?Í›Ÿ¾¬ãùià*Çlþ‰N(¸ ¢CåœÎ‰…{~ÔŠ˜or8NOÌ-ñIk©C+3Èõ›øÕxLí!g¦;œp»Q=ƒ:KyÖãÉ€†õ™t½\fÜ–Øsÿ lÙ{Þ¥M{ÿ0Žý¿âs¤u IEND®B`‚quiterss-0.18.3/images/flags/flag_finland.png000066400000000000000000000006741265173051100211450ustar00rootroot00000000000000‰PNG  IHDR(-SÉPLTEÿÿÿ»»»¹¹¹]©^©^ªjÅrÉyËzÊzËzÌ{Ë{Ì}Í~Ì~ÍÍ‚ÎƒÎ†Ð‡Ð‹ÒØF¬ãZ²å¡Íî¶¶¶···¸¸¸¹¹¹º¸·º¹¸»¹¸½¹·È½¹Ê¿¹Ë¿¹ËÀ¹ßàáàáâãââèææìèæôêäøøùúøøúùùûúùûûûûûüüüüýùøþðéþóíÿóíÿôíÿõíÿüïÿýüÿþöÿÿöÿÿùÿÿûÿÿÿÍ6tRNS03°ò£˜QIDATÁ±NÂPÐsûnÛ£(akØýÿOqu0lCI íõ¢ªå§óc…øÊÓñÞ½Î¦ß zY÷¥û¾:¬EQ™­Å.ìæ‚–Ùïo-:ýKQµ›c<þdKm£¶·kV -:­CmUyžÞ« /¹øžBÌ –\õc„WtÖ ÏýDäT†PK!â ü` 9êââ%bIEND®B`‚quiterss-0.18.3/images/flags/flag_france.png000066400000000000000000000007751265173051100207720ustar00rootroot00000000000000‰PNG  IHDRóÿaÄIDATxÚ¤“½NA…ÏŸ]Û`l%e”<@p‘‚*R*$Z*Ä#€¢ÿ@ÿI!ÿK%ÿL&ÿP-ÿR0ÿR1ÿ‡nÿtÿ”ÿ”ÿ–ÿ–ÿ—ÿ˜‰ÿ¢ÿÜÿÜÿÜÿáÿâÿê5ÿë%ÿôÿôÿüP˜mÂtRNS03°ò£˜QjIDAT]ÁK € мO¢9Žö¿£À]”"¯MB^ƒæÍķЏ0Íá5OÁ!_gªÎ+ÃÓ*ôè–AY:ðå&HQH°ˆRˆuì•q…yÁ‚"®!b:öêHy‹Ê–QøQ ×R!‰‹ŸÎIEND®B`‚quiterss-0.18.3/images/flags/flag_great_britain.png000066400000000000000000000010661265173051100223400ustar00rootroot00000000000000‰PNG  IHDRóÿaýIDATxÚ¤S=LSa=ïÕ(ø·‘ 1%i4tÀ† F qpqb€ ÆEŒ£“:èÚ„„ aÐ…¨`ÊB?ÅHj¤(Rõy¼ç{µ°’~Éiî;÷œ{¿{ß«GåeŸäƒÑ€Ÿ o² Ä…^¢¶‡ï–æ¹jœ XœrÒH+¼@¢Ÿ¿mN’ãƒüfá㗆⦆Â"§œ4Òʃ†~›?~‡OF3œø`é3 «Ááå<³RÔÀA±8夑öéX†¸ÜGÿ\Ýi|Ù* ­ýFf @ ¸Õrá!ïhÅ┓¦­ã96ó¿€Bïíâ<›®4`ôf‡ÑÐ{ùkH$<·¦  Û¶žŽÎæ²<-éü£.`(…’JÐ *ŽE‹Þýü)Vþ_ývÖî§œ øþ52ì/óÜ•ÝQ,çþòHšÎfXO g?‹c”FHF‚÷a©¶®_i8eXX ì·®‡U—‰›³Y·Í×Û¦ãà¢^Ùu8¸Ø8夑ÖyÌë£"†œ¯RItvz®ü‹iºNn„XÔUœrÒH›óOØŽ4÷Õ»L«C«u¸¾Þ±½›Üpœç XœrÒH;+îÚ=«šÈïÚØëúd?}´kõ»™^ ¸fœ XœrÒH»mh¾Ô‘×^±·ïƒžÐ+÷ïüO€P*wÑiÿIEND®B`‚quiterss-0.18.3/images/flags/flag_greece.png000066400000000000000000000007421265173051100207600ustar00rootroot00000000000000‰PNG  IHDRóÿa©IDATxÚ¤S=KA}{ÙDÁ‚¤ ¢FƒZ›v¢vÚ-ÄÂF ­ü ¢ˆ"Dl‚¥ `°Q£Áˆ…i s(1ÉÞ8›¿?ˆn˜ÛÞ¼7s³‚ˆPŽ(ÓÆ6  Pìy >ê†5 8uVüBÍ9ilI Þ™èEN)<æ -ZlTfPå2Šò,>wiñY:è_ˆH(Âm¶€¡õS „æü…ã€jeüàµÏËÃmÀ“ f½2)`pÒåâh¼Ê§ÅÀ{ô[T£[¹!.£ä öð‡[ V/ÄäÉ×þYÁH_Ö"{Í+i Þ$9¼†VC³ÓÇIEND®B`‚quiterss-0.18.3/images/flags/flag_hungary.png000066400000000000000000000005201265173051100211750ustar00rootroot00000000000000‰PNG  IHDR(-SPLTEÿÿÿ½)z"$&€FžGžb´b´oµ9wÈxÈ|Á4ƒÎ"·½¾¸¸”¹¹¹¹¸»º ƽÊܼ¹Ü¾¼Ü¿¼ðùûñøúòååø÷úøøúûÿÿÿÿÿ ÿ!ÿ$ÿ%ÿŸÿµ«ÿ¾¶ÿ¿¸ÿºÿÿÿSõBAtRNS03°ò£˜QjIDAT…ÁÁAЪžZÖÑþÿ÷¹ !f»HFÇÆÅ{ø‹mÉŽ¢8k9%Qк>‚œûU6ƒü&ßž${²²Ùø [j7_ŒÂùªÀÁéЉbÝÅ–Dq£‚2 ”Œ/v’Ø2~½CŽ'sB aÌIEND®B`‚quiterss-0.18.3/images/flags/flag_india.png000066400000000000000000000007241265173051100206120ustar00rootroot00000000000000‰PNG  IHDR(-SíPLTEÿÿÿðu>ˆ.žBŸC C D ¢D Œ: £D Œ<Ž=*´[+³\+´\,´\-´\2´jHÀsHÆkHÇkTÌvUÁùUÂùW¼éW¼êY¹æZºæ[—­l¿óÌöÌö¶º½º¸ºÄ©—ɼÄäîôéÌ»é;êοìñöíñõîoîoîñõîòöïoïqïqïó÷ñпòjòпõõööëåöõ÷÷õ÷øö÷øýÿÿ›'ÿœ+ÿ,ÿ¥1ÿ¦5ÿ§6ÿ¨6ÿ©4ÿ©6ÿݨÿá¹ÿá¿ÿáÀÿåÃÿùøÿþÿÿÿÿ—GÌtRNS03°ò£˜Q‘IDAT…ÁMÁ`Ð{ß÷Ú¨ÕˆØûß›`V?Qƒ¶ï’HCLœƒ¿˜Ö0 ï}³ b £Gßx“Æá™IzɼN599µÊ—wi^{¸«8÷[ìò¶¥‡³ìÃÛ`svVݸªÛnc6»‚FC„„éÅs$A’˜{J#a@&o |°!‰o¯'G[:†1¿“IEND®B`‚quiterss-0.18.3/images/flags/flag_iran.png000066400000000000000000000010471265173051100204560ustar00rootroot00000000000000‰PNG  IHDRóÿaîIDATxÚ¤SÏKQþî™7óÔ1‚ì…‹Šhaø<ÁÀEàÛ¸+(iô¸­ E»ZÖ¢¸‘„$5ž‚{”XADÐFÍ™yðô½™{:÷^+ZÞ.ßÌ9÷ûæžWz1ѳ@òøúëvÙ©—Æ u+& ¤@¨‚EmÉ‹7Ÿ 0%»ù,Ã:ÿB¸ß´T¨ÏÍÔY @V6q{餔P,âö â/&9r‡9³78”¦ÓÂÔåq„ƒùuhÆôî‚¡Ùýô™*Ò{ 'Òiö'­é ôE”Å!ijW/i²6wß>úì”qPÌ-àÒú–;ÁNmâ֨ŮUA%F/\Á›U ±ò–La(O›~5[”ÿÈ(à eOŸózA)¿[Ÿ‹ï³ËÕmÁY)Î3>WeK©p @nn¹’™8AðÉájcOEÜ…6 ´IúÁTqü§K ZžÇÑÌC'¯ÎCõU},´M„ã˜~ömç(¿V#k»ˆÉ0ŒÕÝ÷ž:í'U‡{¼ÏÚ6N‘x?t•.ŸEñé ˲¶(á‡\ÐßÃeŒ÷·TŸÇç¯ß¡…Ö;ÜÆÄOK7fE ¼JÈ5àöØ?ø5¢]*û©-dn£¼ÔÞ¥²çÛøS€§Û‚k«àªIEND®B`‚quiterss-0.18.3/images/flags/flag_italy.png000066400000000000000000000007761265173051100206570ustar00rootroot00000000000000‰PNG  IHDRóÿaÅIDATxÚ¤“½NA…ÏÝ™Y# Cè¡']:KHTˆ*Dñyˆ§@¢EŠ‘(E:Dƒ(x:ÚÄøßØÞ™áÜÙµe ªx¬ÙÑÞûÍ9w®%ƈUF†‡Ýý*דÇ>bðûðƒi—{Ÿ‚¢1››Øm6–O¿³šüëË- ?eBĨèco§ Obˆex̲4k?¿ëë€0ÕY<îìY=¹?náüæ Bæ°èâÇÑ„ ÚsP°ýùhÔ(•I—W¥ácTt°VsÈÄ"Lá6šdif!ËOçf£xúìu* â…ÜIªèÖðÐ` ³ Rú1·å Lê·K€> IÂdC߆Á&[èZß¹”32`ÐY°[p.‰%1B’»¤ \VNÕ:S Æ^DèϨñª6¡¤´rD“† Fþ,k ×hôÔw¤¥«,háF3ÜŒå/‹y;¹FŠæ˜·€5’k&)ÂK·d¢MòŒz]Òõ†é¼n”m–û¶A ›€ð€zߟj=§Ã¾Ÿi©¨°?¶¶ðñ› í9)=-ǧÒõ /«þ_u¸ºçeð{,IEND®B`‚quiterss-0.18.3/images/flags/flag_japan.png000066400000000000000000000006551265173051100206220ustar00rootroot00000000000000‰PNG  IHDR(-SÉPLTEÿÿÿ»»»¹¹¹¶¶¶···¸··¸¸¸¹¹¹ÝóöÞîñßàáßáâßâãßçéäåæäéêäëìåäåæöùèéêèëìêýÿììíìïðíÿÿïððïóóòÿÿóõõôôóõùûööøöûþ÷÷ø÷øøøøùøùùøùúøúûøûüùúúúD9úÿÿûK;ûûûûûüûýýûÿÿüüüýaBýgDýþþÿ ÿÿ ÿ%ÿ'ÿ/ÿ4ÿ6ÿ6ÿ7ÿ:ÿ>ÿÿÿ4¬ØJtRNS03°ò£˜QŽIDAT…Á±NQЙ¹³°f,M(¬øÿïá´¢Èf¹ce$6žƒ±Fð‹«Çé ˆDÒÀ|v®Ÿ$·€Nòƒ»‡òþ‚¯vBkè¸ØËQC GEÎEp.Eq\¤Jè.Å1&‡ë ¸9Án^¸Çí2EÆòØÄûxM{…žˆv?¨$ž}ºn2f›IEND®B`‚quiterss-0.18.3/images/flags/flag_lithuania.png000066400000000000000000000005431265173051100215030ustar00rootroot00000000000000‰PNG  IHDR(-SŸPLTEÿÿÿÿš»|Š}€K¥N§O§]±`²a³cÒdÒdÓe¼g¼h½“èU¢Úi§×‘¨Ø|¸ ¹ º» ÇÍÀÏÂÐÂÑíê’ÿÿÿ?ÿ?ÿ?ÿICÿ[=ÿb.ÿb/ÿm<ÿ”ÿ–ÿÔÿÕÿö±ÿö³ÿø¥ÿú´]¢gtRNS03°ò£˜QnIDAT•…Î1ƒP P;ß JHXzˆJÜÿ"=K‡v£w*D]龃 p6lw×øàÔoܳÛ"8 ôæÊŸØ2»ñUàúT°`ˆÙH*½h©Ûð)Wº‹Ì¨–NÀaÍðñ;9³ìÀøŸ/ÇŠ+\& º{IEND®B`‚quiterss-0.18.3/images/flags/flag_netherlands.png000066400000000000000000000005241265173051100220330ustar00rootroot00000000000000‰PNG  IHDR(-S“PLTEÿÿÿ½D«5©5ª6ªA«C«D¬R½S½bÏcÏ mÒiÈ_¼·½¾¸¸”¹¹¹º ºº¸Ëĺܼ¹Ü¾¼Ü¿¼ðùûñøúòååùù÷úù÷úùøûÿÿÿÿÿ ÿ!ÿ$ÿ%ÿŸÿµ«ÿ¾¶ÿ¿¸ÿºÿÿÿê”ÒÎtRNS03°ò£˜QkIDAT…Á1Â0ÀÝóZ)0eÄÿßG .p ’±ˆh˜Á_,«˜Ä³ÖS“Êç-ˆÁ¹¤l1øMîwƒ]­”R©¥]’­‹8b‡¬­“WWƒá¢p“Ú`|q#‰=ã× ¥J,f9­ 8IEND®B`‚quiterss-0.18.3/images/flags/flag_poland.png000066400000000000000000000004511265173051100210000ustar00rootroot00000000000000‰PNG  IHDRóÿaðIDATxÚ¤S» Â@œ»\L ˆÑô6~ˆUlíü¿P[“Bk¿Á_-½[wï@¬4%\`fgVÆ@c$L]×GçÜŽÈ¡«¥d4´Ö'#ä²ÜÂZÛksE¨ªóNàx{Ó6@×:ØA±, \ã‹`;Iœô+O…ú ±É”dÓž°aæ—çþç$Žû$ððÜ; ÑaO”ñwÖq²À®q"•ržÕ‚ƒEÁÛ/HNg=G¸¾DØ'0Oƒ@ˆ€p>¯03!Ý¡(8Í"Áö—Šê\¸ËÍ;h«¬\óäo©UcÏù-À&êj¦¢vEIEND®B`‚quiterss-0.18.3/images/flags/flag_portugal.png000066400000000000000000000010531265173051100213570ustar00rootroot00000000000000‰PNG  IHDRóÿaòIDATxÚ¤S¿KAþfïöö~˜HÌA@-Œ†+RHÀúlC I•ÂBÓ2]jÉŸ`!ˆB‚…Z*Viìb£‚6BB,„$†œ«w{žÞîÞìø³rÐ"÷``vÞ{ßû¾÷Þ ¥Ú1 mZRL‹UH¼FtãUð8Àé^åÝÕ×&¡Öß­CF’yâ*» …Š­P:Ì)exŠ8K+Ö²í$~GÔ•ÏŒ/L :5“¦/-e€4ƒKs5@:9 O+F‚F>óOàdY„w;lϼBÏÃøHÄßÔ2ú’tÂT| VhµÐE†q>Åî¾gÎ\³ŒÐRø5œÇØÆ Pì1r4€Ð´+-€:hIfýôý ðgvŠŒž,I™A ahšµÔ«- õæ1²ˆøþͳ.¾”—†¬ôˆ‘6åØQ  n3¸ ÝÄ,AÊ“9<Ù&ïß7†PøÉKZƒ3¿Ï+­EjH÷ŠA'ùæ3pôx ]ûxºS@!ØÞöœ(R€¤˜vqƒ¯Ž‘˘‡dYZæÙ8X|Æö™æ9×» L݆×ê²\tvÄ>ZÈ7G'䉟Žn/Òuô⥂ÇÉ<€úg•ɨ:¸÷¬2Sj:ô…iß™íþΗ ˆ­¨SOââƒIEND®B`‚quiterss-0.18.3/images/flags/flag_romania.png000066400000000000000000000007131265173051100211520ustar00rootroot00000000000000‰PNG  IHDRóÿa’IDATxÚ¤SËJÃ@=“LšZâW¸u-º—îE—~…{ DAüÁ¥à‚ŸÐJ´&mm'ã™GÌ(®ìÀÌÜÜǹç 7BkY–˜@Ší«Lô. Pã úx‡7£•Ï¢ @÷Й¢qßKS|{ºUiT:B>fææ9ð9ïk€°²Ü:Úð‰—­5i:ç¥ÂÁÉ%P.âèrŸ7‹”osgÜ{<2:Õ8»p Ÿ×‚锉  ;® „F6“Åd•M @}ƒ7ÀÕ/¦–âØÝµPH|” Rí<`PÒ!MaâXˆÀ?Wý·%‹š“z…`w;ÑìCòh1®å/C$‰Sdoß=dÑ00he¼A©x" ý=ró6ÀAoh‚,¬b'ÅR"ϨM£íc£÷ ?áÑbD³X¥vh0¥¯ RYf”‘±jO™ý2 FKÀ5íQ0Êv"t2aÆ^õ)ÿYjæ¿ñK€zĦº$ÌIEND®B`‚quiterss-0.18.3/images/flags/flag_russia.png000066400000000000000000000005451265173051100210350ustar00rootroot00000000000000‰PNG  IHDRóÿa,IDATxÚ¤“MNÃ@ …Ÿ3NSQDº¨8lª"°¢WaÍz`´¹Y ÄØ ñ#º”ÌLí†}¦Ä’g1Ò7~Ï“÷}"BÏà²,/s3Éí*G‘æ{‹¢@c­\‡Ú!°1X.3fj!ûû#×a¡ï¤P–ÞL¿<¾¬D’¾M°‡º=>L ,Ÿß¼ã5}ÆüúIŒ L:tjÎãâìsañC1ÆÙ±¡ µõfÃBšQ»öÓ=Q"ÀŠe”e$#|$8SaÊ(K÷øüäuUµ=èœEÛƒ8ÏQÝÝ‚?‡")ÂN&ð6HU £,;‰ f|ðW<@~a”¥e†/ï°»íN©XаÒrSIóÏ]²Ôw× HÑooŠÙ$IEND®B`‚quiterss-0.18.3/images/flags/flag_serbian.png000066400000000000000000000010531265173051100211450ustar00rootroot00000000000000‰PNG  IHDRóÿaòIDAT8’½kTAÅ÷Î{k|›l>ýŠ‘¤Ð!ÂÚÊÖNAA°,ÄÀÊFl S V JAP‰ "B41b &»Ù÷5s-6‰1âÆgŠaÎ9÷rFøÂÿÁ6çj=¸âdËõÁ¼'ÄòøÈØÛããÇÊà[ù&mæXO0áL½x~?jKŠÙ9J »&¨SÌéßÖ:aÎB-B°°.ÎNžÀ /V÷À›*Ÿça»‰#`bQW™Ò“×ICš‹S”ã‹Dƒ†>¢;ä˜÷B+a—ˆ&¡ :{è û2QÿÂíלּî"$%ý#+ŒÏŽQŠ Û&Á0‰hd/M;‹ŒjÖ #‰5¾tEW{û´¹ªZ¹vUkõeí£øMËµ× í¥ÐnŸ’„\¢€Qú_Qâƒìë¨uuâú÷Bع×hy¹ÁO¿Â·µy–î\§,’­­ñãæEÒQ\YßÒjBxSšõ ¦§_}²üûÓ=öõé3›¹{Ãf.ŸòfÖŽ69ùà¡Eذ×Ñ{KTÞ}¤f# ßz¤@;R¥D[¿t(Îï¸÷f¢*š¦é ¶£Ùlš$Ir¸Z­ÅqŒsç\[‘÷ï=Y–‘çùi­!"˜ý»:‘VïÍŒ__¥ RDœdIEND®B`‚quiterss-0.18.3/images/flags/flag_slovakia.png000066400000000000000000000011401265173051100213300ustar00rootroot00000000000000‰PNG  IHDRóÿa'IDATxÚ¤S=LSQþîOßOÉ«Ú JÄŸ 6bgL0ìâjHHdÐ89Y]œ$³èBâdˆ)4. j™H–öýÜãy¯U«a²'ùrÏ=÷žïüÜs¡‘èQt¹\~eŒ)ýI¬‹ŽJ8*G)eŒ×šØ¹X,¢øœþ!ÐJul¿D$¶¥ÅÅ’V²}P?ll d–VðÃ"Žâ·Ö2¡]4Úíƒf_¹¾ÝBu/€•ñ é[wpÌ’U;6ÏÃû¯¨l`u«û¨ÕC¬ó¡oÏï`­QÁã™ênöÄ8hcöÕ+ˆž ÍÑÆ§ß6Ç—¢Bdpoê>݆£`ø1â*ÝþãК[&«“Ü6@¿‡¬« ”@Üì äÔã¾°¯f ‡¤“º¥Fñ}nk7Îcôù2†Ï^Ã]&÷2}H»J¶ BîSݰâ@°<ì2*5àÅÔ}|ÙÚ…ýñÞ]¼Žs#'0V@'àÛK&ÃUå© °b³m²H± ˃·ÛäÜ,ÓÜËϼ ¨QÈSóÔ#CžÉ1†(8=HTš¤®Q×l ´ мœÇì³ÌÎOŸVÑ,@<Q.#Åï1”…šÅÏi8-ms3†™)f¦¹Ëœ,§©S|[tæª3 qoS±¯XÊb ¼d’»!ºp„$œûñqž¡þó/E¢×ïüS€Qjá”Rá VIEND®B`‚quiterss-0.18.3/images/flags/flag_south_korea.png000066400000000000000000000007631265173051100220540ustar00rootroot00000000000000‰PNG  IHDR(-SðPLTEÿÿÿ»»»¹¹¹I¬\»`¾ \µ[²b·\­aµ$Fž/:@OœA€ÄGBJ&xO†ÂP†ÁRz¼o=ˆRˆ¦G··¶···¸··¸¸¸¹¹¹ÄÅÐ2Q×)× 1Ü&Ü .ß9Vá<èûùé÷öêööëíîð0ððñðôôð÷÷ñðññòòñ÷÷òôóòôôóôòôôóôôõö÷÷÷÷ö÷øú÷ùø÷ùú÷úù÷ÿÿùñïúûûûûûûüüûþþûÿýüûûüüüüýýüÿÿýüþýÿÿþþÿþÿÿÿþüÿÿþÿÿÿÎ#O{tRNS03°ò£˜Q­IDATW…ÅÂ@'ÅÝɲÁÝ58 |þÿoöº¦ª_õmþâÔ… Ëå¤t'è7ɾé Îí%5fŸ­Ûg|?fi1_(ö.l¼çÀOÃÕ1S*W+µífx¢`f­x§ ew“®Iáj,F®tÄã¿æÆ•ÂÝBŒzýA_ ѺS@dˆ‰@ )‡ Ÿñ|JQø…UpN§iRBÅñ…òû+¼ ™"úN®áIEND®B`‚quiterss-0.18.3/images/flags/flag_spain.png000066400000000000000000000007321265173051100206370ustar00rootroot00000000000000‰PNG  IHDRóÿa¡IDATxÚ¤“¿KAÇ?3;u!•p„pHae#!uÓ¥‰AìÒD°N+þ b­uâ™? ØæŠ,D‘;FîÇžG ¬·3¾™=¹ÓF.÷Øïί}ß÷}ïÍ*磘™  ûB±<,ÊQVgà¦Ëß Û•-P¸J(kÁ®–—0™lÙ‹„«+C)˜ÞÞÃûš—»ò~Ÿ¿ëëòA°ý€aîæÞóYx 4Y¤-ÂèP=ú$cÚ²N„1Ñ}ø½kFøÞÆ´Øk ¾³A{|‘Ôn1&¾/Šr©¾‚;¤Í F™¶é©økæùr8Cí áéÏM:æD½´Z·C$§JàâÃ9óoi&üº9A¯'ðÕçìòî *PT|5±LÛ$T>¯òüM‹ó…ˆIk0åë"±íOÄ'Ö¨á+¾žƒßU¢ÈÉUÐÈ#Aœ´Û‘u#2«q÷.‘E—J\~¯`|Šcãרb!ïšò]ºë¥¨tªW¨AÓDâÊs* ѹСMêøP³äµþËFþo³yšÓ3ó–IEND®B`‚quiterss-0.18.3/images/flags/flag_sweden.png000066400000000000000000000010151265173051100210050ustar00rootroot00000000000000‰PNG  IHDRóÿaÔIDATxÚ¤S=oAœÝ[Ÿïüq‘ !åPEti"¨7± !Áo CT(T”´I)Ž¢¤€„ÆEÒ¥£â/¤HYF¾|Øw·»¼·çÄ>%Š„ü¤gY»3³³oö„µ³”ÄŒ%°ÚùÌ´`ȉõ€¤Û^É7w÷ÿœþè;Ž€’?“>¿€Öþ&U`qÓa6ž.¡Q¾€'Ì oÌ×ö<‰å/G-Å+çW^;&U #¼ÿþÎ?|íaLëSxd™ÁöÇE§¦Øvÿ’0AÊó‘ É+ˆ„tÚ”€!3£L;sÒ'ý*LÖDbJ€®å§p醩_œïií8Ìv–Þ¾Î:rTßÔ8T=>‡(¯P='ЏxŽ=[{ ®Ä‘,/=bvè|þdm*›k*‰8(çÀ~@&qÏ.w·¤10R³bõ÷u)€Å1šµÃNˆ-Ší‘¡âvÿçòÚ«s€ú ‘TNòšr—L[Nø–ôÀ¯ñX€ÿ` 2»ƒbÿIEND®B`‚quiterss-0.18.3/images/flags/flag_tajikistan.png000066400000000000000000000006671265173051100216750ustar00rootroot00000000000000‰PNG  IHDR(-SØPLTEÿÿÿ¾dYZ[\^abcgyz{|z{|"~'’0Ž4š ·ºº·Çʺºº º¸º¼ ËÁËÞÞÞäåµpïïïïï ï÷ÿð ððôõðô÷ðÿÿñôîñÿÿò®°ò°±ò°²óÉhóÏ|ô°³ôÐxø¥ ùµ.ù¶.ùЀùðâùøûùûÿúøúûÿÿýŽ}ÿªÿ­ÿó×ÿÿÿ‘=_UtRNS03°ò£˜Q‰IDAT…ÁÁjÂEÑû&3i­‚¸üÿ/ëZÚÒE É< "ŠÏá% §æ.>ótü“¸²‹\âŒ`ÌqI¯K¡î¶×Nû½‰á&ì4³æ·ÍÈT¿9ã¬Ú·æÑl–ƒ£*ƒ¬Z8„j÷-)Mûßö++F ãÅQ¹I9aî4Iâ‘yvºy9$ UIEND®B`‚quiterss-0.18.3/images/flags/flag_turkey.png000066400000000000000000000010061265173051100210430ustar00rootroot00000000000000‰PNG  IHDRóÿaÍIDATxÚ¤“ÏKAÇ¿3³Ù%›lÅzÈ¥«¼¥â¥ „âÑ[ñ"ôîÉSÏþ¥%Ò£JI‚? ¢¶ ^ì©‘@N*¢µÉ&5ÄÝéwvBØ^“Yvgæ}¾ß7ï­ÐZc˜!1äpjB”c`a@õЍúÅÁ.ÐírIp¦RÂÎô0Û&팃‹×E8Ébóx÷ÖØxã»ÃmÅ)EÞ 6bŸ7l ɳA€Ç×\aåzlnéÔùÔñD«I²ŒØ:ý“2BXþŒ-èéWˆ'¦ Nö7ÏÓë@ÒbxŸªBø;YŒ&§à¯®Pݹ"Zë[h~¯O €Á.mx k¥š§lŽäâçãˆ^Î$w&ooxæŽ)",ußüå‡ïB^_¢³´ ÿ¨yU…[.A]בÙþ](@´C[EH; xhP5‹üûE„Ÿö~ý os-¹<÷ã*[c=)£´¢}@‡€À‡¸¬"˜†höMrëêtŸ`Ÿ€^ŒzÒúÒŠöË4âqÓe™²Pµ¶îOsÿ÷@¿“LŒˆ_ìnƒ´2QMƒžæTþK‘öwþ'Àú²š¬Pm–ÀIEND®B`‚quiterss-0.18.3/images/flags/flag_ukraine.png000066400000000000000000000005061265173051100211620ustar00rootroot00000000000000‰PNG  IHDRóÿa IDATxÚ¤“1nÂ0†ÇAU U¬HHˆôÊVõ =BUõWà °Ñ¡h{"e`‘øõ]!&‰¼Øþ>ÿï%vªŠ6k-ÀûïexBid–’­^¿uývci6wž³À–¹#Àìã‚ ( ¿|ˆk&(9L@V¢é'}E‡pvA@G‹+މ§Žn=|Õþï¾ÕÚ7<uÎ N‡c¬èxô§xnêÕ&ÛCFÇÈž¦žçD÷´ØìãdŒ«¾ %UPÄ^HœèmëÂRÆÄ6Zç$gM©?q».ù_˜ïP%ò~c-Ì„ãîÊ»T´¾ öÈ_žìÑ9IEND®B`‚quiterss-0.18.3/images/flags/flag_vietnam.png000066400000000000000000000006531265173051100211720ustar00rootroot00000000000000‰PNG  IHDRóÿarIDATxÚ¤“;OÃ0…8¡ˆ t¤+?€•!fVV™‘˜º3²"!±2ÂÆÒ‰ˆê‹¶—9Î5¡dl-Yv®ïù||í(k-–iá‹R·%p°ˆXwê °›= Ë¥Øç2~Í5cε ñ¼³‡° ŽÀÑ!ƒF ®• / ÜvžæÄY\ßÈ0’b´ìÂì§qìE\óN,Ù·hjÀ'Ħ²K@ÊÌ”ãîT\Ü'@D¡!YqÔ¥hjÀ„´˜‚€Âœãeh1©Ãºp3\½}ÆÏ×™CˆÖ¢‘BzY†‡:kSÀyËJr~Ñ–µ*'l8˜dQ+9ÿ„I¯ì±/Üçy ®\‘K-š0ó·hÙWÛ¦÷ã )âéÀÃøkvušÍ¾F¤‡¾Ìì,:N:÷ßå|ÍÊuVµhj@ÁÄü5Í®¯«€zF\KyÊDwË¿µEZ¡–ý5–l? ÉFx‰üÞ/IEND®B`‚quiterss-0.18.3/images/flash.png000066400000000000000000000064061265173051100165410ustar00rootroot00000000000000‰PNG  IHDR00Wù‡gAMA¯È7Šé ½IDAThÞ½ZilT×>óf<Þ¼Ï0` ŒB@òËEm1!HeÉÒ¨jD©Š*Z(…Q ˆPb+ÿÚ$¥JBÙTŠYÕZI Ö`HHKÙjcf±=3o¦ç»~gtý˜± $yÒá>ïÝûåží>G,£‡½6nܘÎC Ï5Ç2&¯6âjej‘ÑápãñÝ+Vt?ìÚŽe`Æ üîl¾­cªeʹ’ÍÉÀõ1ÈÔÄ´ÿÞóòË/w|# ¬_¿>“ßYÆ· ,¼ŠF£d¿·ƒ7 Cö{¾üLõ|_¿jÕªÀ×ÂÀºuëœüìK|»†© …LÓT‰DÔ(¿ËÜät:Éår©$¿ƒøjÃüüüæÕ«W›_kÖ¬ñòs{ø¶ Ï àp8¬( )Â}zz:¥¥¥©1##C½ ©»»›zzzÔ˜’’Bn·[îAÂ¥‘3<Îæu[š–Ä ¼R…”0taa! 6ŒFŽI™™™ý$+—hÅçóÑåË—éÆÔÞÞ®ÀƒaaÚ±Þ» &X󧘶Ççøÿ73¥‰ÄÅXYYI“&MR’Pjjª]šqð`^æÀfNŸ>M—.]Rà1hÅz¿‡é%Þw[¿4ìžçámü¿, õûý~%í)S¦P~~¾’xNNŽéÉÆð2¿ì a¤··Wiã­[·èøñãJ+YYYÊüÀ„ÌÇ× ìõÞ¹oV®\ ³9ɋɵà´iÓèÑGU ååå©Q$ŽËæ]âLè sêŒ@£˜ûܹstìØ1% FLÊÒDõ+¯¼rzP8¸`Ã~ÈäÙ`€Ç‚µµµJúEEEJêX@÷"vðõØ`gB'0ºrå :tHÍ&Ä$y.ì‰É4[“2°|ùr¸Êð6ºäÁÈœ9s¨  €<eggÇ]¡¸F »Pt&"f”nwtQ[ûä÷¨|h1e¦§’ÉëA XïæÍ›´}ûv5¯® Ë;MÝ´iSÜźô…X2ðóUØ<¨®®N÷z½Jòâ˼îÓI^Lÿû mkÀ\~¸ü7tøø‡”UTF£*ÉéNeæØµ" ²¶;AåutÏ+˜ÐÀ‹©Mwñ?e’ãã˜$Î#VtL°a“^·Ú;éÿM # %Ý—t•Ð9b&Ö [î×Åkp`6cü›+ѾÁ¥Ûš^COsuwf}?L9ñ!µ~ÖB®ÌÆVàcØtˆž fÊäèˋ͈ yD_,eQB?o§'ˆv‚Z™ÆÄÿߟ°·3Xíd@[ÞÙE”‘Íòt#:*Lö@l[* LJ¾1¢îÙ¼ÜZÄèLÖ[Âß°žV0Т3 o»VºÎ4;|ô´ÃQ>‘ŒbÈwXâ5S'Põ¤qÊ{JºÑ"³§(ß)ÒOäŽít÷î];-Jºš¤ú2­ÍggBîu“êe K×¾ê 4vLÉs6[’—C\½ˆ‹–5²w °3…Û9hÝÁÀ:l¥j«ai nwàu€½A%›'ѵõ¯èì©fr{úR‰H6E³k§Òð²âxŠàt»¦a8BÊÞ-ì’·¯ êììTØdoXÿßbXÖ¸ÏEûôÓOã]6}b¹.]ýœ~¹z#QÎ2RÙþ9ËŒöô²;N£Ïûæ®M~¯—çˆòo©öäO×@¢®ßG}/¤´šû4ð.SP4I¡ñ$Õ‘L¢3 Ònfð? ¾nÁ"úânŒ|oß&…Ûôûh&Kÿ‰1>Â×HM–‚ØuãâÅ‹ýê`vcË–-Ý|Ó$Z—èÏ@]xQº"‰¶Ût¢ù­­ÿ=ùíïÓ¥ÏþGF *œ´±_T¶ŸÍ¶¿nÉ‹ìÓQ±Æ"LQ^8-‘Ôíàe‰þ ˜ôõë×õ>žmv {QÔHÄÃxøðazæ™g’û©³^¤›·:ØLXÒ™œvx¼}û0ÊÅF˜}¼/@¿ýõO©²Ü k‰ð;îdÀ™<Ö?xð éØ,'Ò¨WdL~1#$KÍÍÍÔÖÖ¦Šû~Z ^ÈCÆð1äÌ÷ôM…Ë QŒ“¶%?Y@ ç}’'Ë\/¤kZÖD=Œâ˜4óñ3í3°uëÖþ¡^ÍÒÔÔï(K'º´KC8¶õh¨›#+“Ý[×]Zö³hÓŠ…œ¦©´Æ9PܰK^ÀK].m}ûöõÃd½[ÌöB¼ÞêÏ+U!‡7÷Òúƒ: r²ÉÕ¤–:šç©)4å[chן6„7þj!¥¸œ÷ ZHŠu½ù‹õÐfD) ,RJZëïilmÛ¶-0þ|.¼Ž‡¥¨Þ¿¿j%¢½ L¯š@½aå–z(7#*G”ÑÓ5SiÜè)NÍG”Ž$Û°…„·k×®x£W³ÿ5Û·o$l-.X°lžàßúuçðò¢E‹hèС*[E] mpé"Hí´¿«ªªhÆŒªà–3®ûeÀa8@'OžTï@êzó˜/uÄÄà¿ü“ÆÄö`OˆçУ$~Cxܸq4qâDÕGÕaz%…w‘Uâ$æ“O>¡k×®©ÿ‰‹#°ÞƒÍÏfð~ȧ1ᵘ¨²Ÿ²è áÍ`x*Œ \È«@Èç1êM+ý¬A«ÏXàþ˜UcBtóäkx,M”¥Ý‰ú=‰Ž¥˜ÚàçqÐÍ࿺ƒnýš;w®úÔ€Y†.q²JJú™Y¢nÈmÔ§;wîüz>5HÀˆú؃­Cs{ Äl ÿÝÄϪ=ø7ó±Gfú}nÀÔç6è9YÀÕg6Výÿ܆A?ôç6ÿ’ÃDä-ñ‘IEND®B`‚quiterss-0.18.3/images/flashstart.png000066400000000000000000000036231265173051100176150ustar00rootroot00000000000000‰PNG  IHDR00ý 1 sBITUìFLIDATX…˜[l]G†¿Ù{Ÿís³Æ ØÇ ŠD!6¢Œ°¢ Ô¦¸jÓ'üRªª²¢*TÈ¥âj^ZÒÆéNôÁ "Š)$ލZD#ÚT\,_„šV¾³¯³x˜Ùûœc»qÛ=ò‘,ÍüÿZkÖúgÍ(a·ï‰Ãr„~jôS–Xd‰E5Ç…‡»­V7#8Õ##ÜÃQÊ´ÎTæ¯Î,çÕÌ#7>Áãgœª h²ß ÞAå¿l0©&Ýü']c‚^F“’’¢-…ÂÁÁÅÃÅÅÁÁ&ÔÔcéû"˜¨É BJJLLDDL‰"%Ê@ øø(àâ¢`^L,íJðØ ÌЧIˆˆˆ¹•ýÜNÅZ  Ñ¬sÞ¦@–ÕÈÉ+7%xô™’bJLDˆ|2EŠtdv¢Ñ$ÄDĬs…7ð)ãSÀEjìñÓïIðÈqžbl°ŸAöR¡‹"Êl(hMBH@Èÿx™ª”(à¡àÁS¿Ù‘àǃrQŠ ›|™OSeU\\È2›S‰%©ð s©àã¡5ô“+Û®ÉUéK ÙDs”ýì£ ßfI¯6 3êÔy‹—p¨Ð‹ZV‡ŸXj#ø‘+aÀXŸò-zè£/OC…¹XMJBLLÀ&ËœÁµ^0¯¾ôÓ°i“”˜ Ý(àåÃÍÿ+´ Ÿ:(ÑI»iÐ &EôX‹?¨p]÷&4XeˆCÔèÆÃÃÁÅA1Ëå¶l˼HmÆD¬s™?ÒM g…O>¹i=Ðãº7%¤Îmä#Þµ.oqš7m·ž-¹*æãÔ Iѽz܆è¡=žr']Übá]<ý:çø-õfòµÐlà|Š”&$$&A?ÔȽRÕÄ|–½ìµ¥oôÆÀ 1¯ò3^k¯RKc¼-P ÄG9D@ŒFªr H¥$DÄ R¡³%™,= y‡)~Íú …²{x”"&"!%½Ü·KòK]Hh°ÏÑK%ß^7§¸HDHDLĹÄ>j-­é«o²Aõ±—žrô°.§Ä„|‚Õ<ë|9Vw"BBBnð?oñÃøàæ>ø $&E—õ°£š”˜8„4“L ¶ÚjB.ñ}.o¡plZû2ðúˆ£ûîW¨â‘ [ Í—ä»`àC"ÞáÉ?šYåⲇ 1))ºß‘š)ú²º"%ÙB’äDöJø3'¸šÏrZü¨ØóOjŽô›Š¬Ø´4Còøgq¾ OÁƒÓ;_@F)ЦóÑ p{ðñw$ˆXå÷ü‡ÛM¨±é÷¾BŒ2#}’×¥pŸán±w4e…á]^áü …ßçæúÉdȾ”‚[º5!ILñý²J¦ËŽì—ˆÖ_ñÅË$–ÄÄAÇï—n)\çxƒŽ^ÌÌZvÅ>„3ÄGi‹ÜaÖ¬Kå‹ Õ±,ìá‰Ñ}©sœëö  MK‡  é;¥Cm¥‚ѱ¿Y‘MúX¿“;wû˜²e"òðù­‹î/oW/Öc|ê4ŽŽb«úˆ«ÖIé@æŠÅšípIYf¿¾ÆÊÓ÷¸¸¯–DüµmxU(“–ŸkGëã*¾¬÷^(ž7:õy*Ý*ts‰CE "³|Ú»k¬1ÓÐ!ü¬º¸óøÃbÒB»ñ ÅéKÜJ”ÍsªØá>cg~c ßÍ׫ó3ž²AÁF ¹S'^‹1Œ¿6p¯e‡±±üµ½…£LæÎ]öx`yŰKev6æßf‹2$Ú“wߌ•Ÿ^ñlä…D±ÿ3»÷nº[þο«Ë¿¢êÂC©IEND®B`‚quiterss-0.18.3/images/folder_add.png000066400000000000000000000013371265173051100175250ustar00rootroot00000000000000‰PNG  IHDRóÿa¦IDATxÚŒR[HQþþ9gvÝÕl½¥i*Yj$b½v±  Bì!‚ ì!*1 z*#z(±^„èÁ²ËCЃôj!¢¸¦Hb“.¥™byÙ5÷2§ÿÌx# ú™fξÿþQËv<PvZÈ !¿‡ùäÕ&¬9Q׊Yj粺V wAB ÷þ©l2@´æ»ƒÒœ"Cnr(Ûfç%D‡› Á̮ƞº'€A«YÝ—r?ÒD°ùt–0EWÒ- ó…ïâ“oVÁºâ@äük  £ð _+ …f£ÅyîG#.‹Û%±Ö2 aàs÷GÌ„&ø¨œDµŒ•(Úìíã¹½rà„GN*·j‚Õ5ˆ”€…ǹ%{yF+­˜[ΞNm"ŠÑžaL[_Ö yåÛ‘ž“˜u¤Ô²UÁðå *v`6ï’dXš°]˜GE}gâu*rÚI„š¹]’1X D%Ñ…+ l|„M0†‰éÆ…Ä•+÷n4Q‚¸01.ˆIˆ1ý„‡”GˆŠTV@,JÛÛ;ž;-”Nzîtæ<æûÎùh¼«qݶ’^e§á,È‹D¢™O¦s…Eú'A4¸s-ä:ÿK ee‚ £Oo–s‘I¢\în ~@H× yPP¶ÍÉ $gA)‚«¼gü¯A»¯f>*³Ií¥†Ëh`$CR©Mvä³ß€ù°ì .Dú¿hCøî±[a:MÖTz™™ÞbXL—ŒeÞ„!0?ô¿BË|TºQÇJœ8dŽqßú2° Ãíú© jBpp ^¾kLÉÎöh‡ŠË@×í©±I|™ÁjðÇÞv¡òìqW” |œI̚ȯ@RœDtË”$ËA$ÿÄÐÐÑÃ/ñ8i:éP§ÎÀ•+»“V#:>…ïk‰ÉóÆÆò<§€­ ìÕ¤q¦æ+ò%æ»GîŸã"ô#¯¡·žŒ¼ÒbáE”>Ïãäf™… 2,™^ #5¼Ž WyZܧ´…¹‰i 7{(œ1ÅÂ8vp'@^¶¢¬yO–ú¦Pí+‡úý3µïh”¡îJ[ÑÃôž?ƒ#*•SÖLV‡›i4^šoätýé Ô—I}®{ÐVSŸ²Òiõlm;OÅýñâwõU(+Å=¶µ>ÈÅŠ\ŠANt7jï Ìfg´ß²[.zÞήůW8=TP\dnÃB8aõj)s‘Í}S|¦@mûÇûï/Õ‹M+¯•‡¨¯ÃÛ‰ÞËŸÇ:ÿ¿Ž°•î9¯°…þ 0„°ñeo_IEND®B`‚quiterss-0.18.3/images/folder_star.png000066400000000000000000000013711265173051100177440ustar00rootroot00000000000000‰PNG  IHDRóÿaÀIDAT8Ë…’ßkTWÇ?sÎÙ»fýL6´hÔj#Ѧ•´ñ¡Q°êƒ`Aˆ 5ØHJ_ú/„>Ö¤‚h­X ˆŠˆâKE$„Ä$Å¥æÇZIÃÆ4kÒu½{ï>ܸú`éÀ™ÃÌwf¾ß‘¡®mG_©Q€‹X÷\ÄìIÂpõ‡oõ”C'¿ÔOÚÏB)ˆ#ÖÒr?b"okËÆb\"·á›Û5N£J¯ñ3¨ ‰å{ù¬ý)wÆŸK0xê`úáéõ‡oö:ôp–`òz9YD#ˆ@ØØDªª-ŽÄXf‡ú(ŽgHêñ@}rgã“ñR§aö¯IVµÔBqq•o$ 8ž!ÝÖ‹U¦Æ#Ý6<;·u• tmÏ¢%Q¢Q„–oV¡ª¢HuÝrRMçÁT@ôй;ûxÚ›½Þp|è;×Ð~«ù‡Öº†R†úŽªh¡økj¼ô‘M?A@TÈ`Rµ° –†ã×¾UÕ1T`!zÏ«xþëÎN _ê‹îf½ßñéåÝ껇¾ÎmîTUdà?mº{—úsÓùc¿Œ¶^ü}òÑþæšõ?~]÷["é-ÕàUòDdUÕ¨›g¶ÿ_㵤õeÓIEND®B`‚quiterss-0.18.3/images/folder_unread.png000066400000000000000000000012311265173051100202440ustar00rootroot00000000000000‰PNG  IHDRóÿa`IDAT8Ë“KHÔQÆçÞ;ŽMeMk!ô"£EAT¸($ZTälZÔ²M( !ŠL´mÊ" L A¢Â¨UYcÙÃ"S£dÒgœqþ÷´øX-Êgq÷|ç|ßw¯ô4olóùÜ6õb,bÝ«ñ+˜BÈËÆ]¿ù°b-ÝuˆuˆÈß×c0®èÝòúûKœzYr} ¨ ‘ÒZVǯ‚)4‹„öƒs$šöT½¾´¹zÙÎç7 Á’ÿÖÜC1‚žL*ˆRTºTI¥skç‚4&R b&'{Ð÷$Af$(‚‚ÃXG,izÕ²éD YCf4òÇ1ÐÝǼòæïn¦‘"Íûæ:1ùŸ|èJ0öãç¤^*TTW2»tŸÎ¡êAC+#gªÍu:ÄêÇ8Xsè:AA-K0Ø„WR® «`ämŸ¿_s"†ÔÐ3Ë–ÂØ'üp'Š AlƒÁ.ZÀÄuZ{ã54hóôJöŸÿÐæÄ£_¿P¶f=ä‡è 3i!ÐÞ{“§É7œ¬k J”,Y.?º8ºD»|¼Ä¯¼Ç¸Á˜MÁ™O„ÊŽ(ÐÜÇÓØ»ÔÞËÖš/Ö£JÖÛ¿ÖßÎ×¢C׫`×ßÌØÜÃÚŸ5ÚßÌÚàËÛáÎܶußãÍàÁŽàæÓáäÓâåÔâëÞäëßæÏ§çäÊçïàèìÖéÖµéìÖìñãíôëðïÚððÛõôãöôãøü÷ùýùúÿÿûþôûÿÿýÿÿþÿÿ9®ù€ tRNS"#3§°±»À3ô¹ØIDATÁ½NA€Ño6w¡CcÉ6.…ÄÆ¨bÃÛÙùöF ÄbcLü)±Ã ÊîÌÜ™ë9â €s{,ëO˜ìt}¥o Ð;ãwwâæš" p&=R'@V,F^fffR…³Jz¤fffM~ªfff;x³=z°>z¼>{°@{ÁA{ÂBz¬C{³C€³D~½D³E|¼E~±E€¶E€»F}ÁG~±G~¿G~ÁG°G²HzµH¯H°H€°H€²H€³H‚´H‚µHƒµHƒ¶I€²I€³I€´J€°J€±J€²J€´J€¼J²J´JµJ¶K€°K²K´K‚´K‚µL®L‚²L‚³L‚´L‚¶M‚²MƒµNƒ´O„´O“ËWŠÉ`ˆº`‹ÀÜîîåççæî÷éÿÿêÿÿëÿÿìÿÿîîîñýÿòþÿóÿÿôÿÿõþÿõÿÿ÷ÿÿøÿÿùÿÿúÿÿûÿÿüÿÿýÿÿþÿÿÿÿÿ©Ö§|"tRNS '+,05?CHcjlmª´ÄÆÒòØ×ã…IDAT8OÒOÂ@`NkµUTpî‰{ ²Å‰ T±*¸eh)¥Üÿ÷®Ãöª ‰oÒ6Í÷äzï¥6Ê›¿Q’U“óRÀ—dr]ª‰bUø¬æh0WØŒ˜fHÀf- É6‡ÍÀúíõ Çe2Úño0/ _•J¹\*‹B޶±i X2½ÂSæ7Ø4ƒ}ö`Í ŽÿÄHB¢÷ˉapw¹³ ¤R»Ë+«~ÿöƒ¶Ü{e®ü^(¼ÐõŠòôü¨sx ¦Éï|Ü€ãB¡Ä äY´÷  ÆdF±‚p㸴¢ubr¼—ÅahJhc??¦ ˜ÎF­ Bž$ŒXA6$# ÔßxH†·ÆÇáÞzpЗÛÔŸͰæ þ:ø­³u „¯/ÔIEND®B`‚quiterss-0.18.3/images/imagesOn.png000066400000000000000000000030551265173051100172030ustar00rootroot00000000000000‰PNG  IHDR szzôôIDATX×K¨^WÇkíçy|_b+Rp “ ÕŽtàc H¡±„ bq¤sX‚µ¥¤:vhѱÍë ‘ND¬±i›¦á’Ç}}¯sörpνÜïÞ$Mî†Íùà|{¯ÿþÿ×íu<àŸÿå_.÷&çK)Ük÷*ŠW»ò§‹ßúÐñˆÃUorþŸE=ô^óð»bà^x}ã)98[„ÇZÇ'ka”6 m*/$/D…¨àݰpYÖ$N0üšžÉ1Â$ §Ÿ$¡ Bö d ®ãÂý”1ã¤c @…& mPê‘ú:ÙÔëÜ)¨Àr1î |ûÒÆGf‚KY[Ïdòf?q×xGí„„Ú3(ÉCvàEðj8ܰ®ë•?¿ú ÝHŠqÏ>AûϨð½1qýáU0rpT^¨Â¼ŽBå ¾í[±ââï…jb˜R…–à[|¨ˆÚà]&¸ §™à=¾ò;ºA¾¼Æ@ò2dºj?oƒî.aknÜÜ+l/ ïÜîùp§ðÒ—3ª¦®Hþqbœ’}ƒóÑUxWá5á4ã$!ÒfCÖd'à B…¨ÂG»pk1ð¹è`ÖüƒI¶Â¡µ±%ù–b¨ ®ÆûŒ×€dT=ÖËý“0©ü Ì­™q½ƒ:)Ó¨ôVí—Bç„àïôà4)$BˆŸ¦w ¯'§'Ζkž]àpmËHA™fG“ÙAW”BÏ¢(®tÈ Ü˜„"…)z¢wÄàqñšPMxž˜"êת†?œ­NáúŽ‘ƒR©£lßfµt„ ¬:£[¬+è²—FÓ>¼ípÚ³={‚Ewïk¼6|æSwP©pÒàȨf0#×…?ì—÷· Ñ M<ù¿ÿ`wó}:C±Žà+àqƒþZ@ûçO±2Þ$¦|ñ³ïñµ§.³3›±»·É¼›±¹u•ݽž~êµ ÖxçG“dßüù5._ú.‹#¾–#%æhÙQ Ïÿâï<ñ¹·X¬*V½±êWäа ;ÖÀÔë±Ù‰§–ãÑ¥Šè™)zªE¦ RÕHUC®XƒO*¼÷Ä7~C¡cÆ,Cé1ƒÞ­prÜ&ÝÞÛÏ]ÚøÂx«!a,s=ÀÙO Ÿ>§lÚ “I’*Hñ\`Ù›èVUCEä¿úÁ‹ŸÿÆ __-çf}Wöîn.ž¼ð³ß–}¢Î5è™9]#“mk¨3*$dp4vc96D-³¬PÄŽØë–ówßþë67Ê:}òÂKƒæ­ƒiB¦&äTBêˆä 1">ÆaZ@V+ PlÅrµÅl³ÕŠårÁ|9c>^`få@ܶÆ2`Fd`‘IB&iÇß9BHˆK $C'È\)@_f¼ø¥÷î{ ïßšþPB÷û’z"m‚v <2!mBª ¡F\R!.ÃÜÐU‡ªýƒû•ã•ð^CÚMBÚ€4 ™ddÒ@Œ°}ƒ~ë.vs“þÖŒòŸÿ!ïÞ¦ùÉ+¤à8ÿÚ [ëWD×ÙüΛ€=€R¨Re¤ÍÛù7¶óô‚Í [õHéS 2ÝFï”—Ÿ}fó¸ËM`î Ò G¨"Òdl÷ØÛDNEälÁve…-Ar€à†Îz°ÛUàö}:ý90{  ðrã_Ȥ ç†d¤VX½asE‚b^ÀËØÚcð›ÝÞSïéo\END3¢ÞVA:LmlÄz°1ûø¯™‡0ìP®_Ŧ®ÆªH©.pÛëag…í,±­%vw» Áý”aƒé[{ôÐf»#ëO `ß§ò0:=`ýIX™ßyó¹K_íKy¤ïŽ£>?)€ù•׿ÿcàÜ 8ðùIÌ€k£…NòÍwàóûãÿ²Y7èªÆIEND®B`‚quiterss-0.18.3/images/label_gray.png000066400000000000000000000007251265173051100175430ustar00rootroot00000000000000‰PNG  IHDR(-SÞPLTEÿÿÿOOO\\\aaabbb€€€‚‚‚ƒ‚‚ƒƒƒ„„„…„„……„…………†††……††††‡‡‡‡‡‡ˆˆ‡‰‰ˆˆˆˆ‰‰ŠŠŠ‹‹‹Œ‹‹žŸžŸ¤£¥¤¤¥ªªª«««¬¬¬®®®»ÀÁÀÄÇÃÇÇÉÊÌÍÏÐÐÑÒÐÓÔÓÖØÓØØÓØÙÔØØÔØÙÕÙÚØÜÝÙÚÜÙÝÝÚÚÜÚÚÝÛÝÝÝÝÝÝßàâäåééëííîîîïîïðïïððòóñòóòòóòóôóôöôõöôö÷úûüüþþÿÿÿ%xÆøtRNS 338\•ç²’ IDATWUÌç‚ †a¢B4›–‰Mm—i{o[žÿ …Zï/îç».àk›†a‚hÚÝu/רh·~=S;Üä1éÄA«™m¾ØXÂÝùrul1—ÇXeÜÛîÈ<¡ÅÚk¾ãªÃ,ãa÷êIÌv`PyY‚ÿÃL `é=$¼æ¦EñhS MKÎóò?¦EדàoÆÂ÷=êõ(‡ñIEND®B`‚quiterss-0.18.3/images/label_green.png000066400000000000000000000007521265173051100177010ustar00rootroot00000000000000‰PNG  IHDR(-SðPLTEÿÿÿOOO«*±,¥)ª*¤*‡77•O7•P8–P9–P„„„…„„……„…………†††……††††‡‡‡‡‡‡ˆˆ‡‰‰ˆˆˆˆ‰‰ŠŠŠ‹‹‹Œ‹‹žŸžŸ¤£¥¤¤¥ªªª«««¬¬¬®®®¾ÐÇÃÕÍÇ×ÎÉÊÌÍÏÐÐÑÒÓÖØÕåÝØèàØêâØëãØìãÙÚÜÙêáÙëâÙëãÚÚÜÚÚÝÚíäÝßàÞïæßðæáðæâäåãðæééëííîîîïîïðïïððòóñòóòòóòóôóôöôõöôö÷úûüüþþÿÿÿV½.tRNS 338\•ç²’£IDATWUÊÕ‚0†á‰ÊÀálÁ»»»°¸ÿ»qúíyÿÀV1tÝîÔ›iž/nQ¯B$Ò™µ{³•ð…,h#Tm—¢Åý7h}IjÃéìP¦N÷‚<¥úb#sÔÌCh§~ìUÆÔ"îhôž{ ˜ÇÛ ûì’<^*¶—zͱZ3“"[+´M:&%fYñ“’ÉøÁß8Îã¼ßÉcwÖqIEND®B`‚quiterss-0.18.3/images/label_orange.png000066400000000000000000000010141265173051100200440ustar00rootroot00000000000000‰PNG  IHDR(-S PLTEÿÿÿOOO„„„…„„……„…………†††……††††‡‡‡‡‡‡ˆˆ‡‰‰ˆˆˆˆ‰‰ŠŠŠ‹‹‹Œ‹‹žŸžŸ¤£¥¤¤¥ªªª«««¬¬¬®®®ÉÊÌÍÏÐÐÑÒÓÖØÕÏÊÙÚÜÚÚÜÚÚÝÛÕÑÝßàߨÒâäåééëííîîîïîïðïèâïïððòóñòóòòóòóôóëæóíèóîéóîêóôöôíçôîèôîéôõöôö÷õðêöª|÷«}÷¬}ù­~ùóíú jú®úûüû°€ûôíü¢lü°€ü·üþþý£mý®zý°€ý¸ý¸ý¼ýôíþ½þÁÿ¤nÿôíÿÿÿ}ÔùtRNS 338\•ç²’ªIDATWMÌÕ‚@€á[Qd1Áî.ìÂBlEAyÿ'qAçj¾ÎŒI04͘€±l»ó+d7q†[´a8K¥½6GÃp¼Ífb®híà€¹b._¨Ç5ú+I––åRÇ4O×’,˧C•Tm%&¼êß„Ú=4¿ˆÈ’0Ô ‚»ž€>7„n€ùÏ‹ëýö4Œ ®ì_oŸiTÜŠâù3*eÿ7*˜ÅÜ?°J’¿uIEND®B`‚quiterss-0.18.3/images/label_purple.png000066400000000000000000000007631265173051100201120ustar00rootroot00000000000000‰PNG  IHDR(-SöPLTEÿÿÿOOOgÍhÍhÎl Îl Ïl Ïm Ïìí‚ì„„„…„„……„…………†††……††††‡‡‡‡‡‡ˆˆ‡‰‰ˆõˆˆˆˆ‰‰ŠŠŠ‹‹‹Œ‹‹‘#ÿžŸžŸ¤£¥¤¤¥ªªª«««¬¬¬®®®ºªÖÀ®ÛñÝÉÊÌÍÏÐÐÑÒÑ¿ëÓÖØÔÂîÔÅñÕÄðÕÆñÖÄïÖÅðÖÅñÖÇòÙÚÜÚÉõÚÚÜÚÚÝÜÊõÝÊõÝßàßÊõâäåééëííîîîïîïðïïððòóñòóòòóòóôóôöôõöôö÷úûüüþþÿÿÿ5òtRNS 338\•ç²’¦IDATWUÌå‚0†á‰…0±Q$tØÝÝ…ÅùŸŒèûk÷ó]× «jªªwÒ]×/W·H·f1V8«Äò£ÕNù¢'äQ Ö-ÇK‡oû ªÏËcÅrvÀŠHd›OYž0"B(ÜK¦½Â˜5-²ÙºçŸ4gmƒÜ«ñp.ØTæ=…a¸&Æ…7Vô6í—„a$Œ‹¢øÁß(Êã¼?F°‹âý,áIEND®B`‚quiterss-0.18.3/images/label_red.png000066400000000000000000000007541265173051100173550ustar00rootroot00000000000000‰PNG  IHDR(-SðPLTEÿÿÿOOO„„„…„„……„…………†††……††††‡‡‡‡‡‡ˆˆ‡‰‰ˆˆˆˆ‰‰ŠŠŠ‹‹‹Œ‹‹žŸžŸ¤£¥¤¤¥ªªª«««¬¬¬®®®ÉÊÌÍÏÐÐÑÒÒÓÓÖØÔÃÄÖ88×89×99Ø99ÙÇÊÙÚÜÚÚÜÚÚÝÝÊËÝßàâäåééëëØÙííîîîïîïðïÛÝïÝßïÞßïßßïïððÝÞðÞßðòóñßàñòóòòóòóôóPPóôöôQQôâãôõöôö÷öããøããùJJúKKúããúûüüþþÿ??ÿÿÿ²'²XtRNS 338\•ç²’¥IDATWMÊi@€á•›H›³\a•û>sD®ÂöÿÿmŞyÞ¼©H¢(ù€?ëúîð+ü±Zˆæ7¢gx­Õ“¡ÈÜ p+·š¥Xqú p… Ôéöú³2uf‰,l¢ÁpÄ2ÔZÛŸä1ï8ÈiŠcS™@zÏÝdƒzíd_ òa©Î5`Òï½j¨Ϥ°ö½ñLù&%nÛ‰?“"á“Âüý7£³`ÝËIEND®B`‚quiterss-0.18.3/images/label_yellow.png000066400000000000000000000007631265173051100201160ustar00rootroot00000000000000‰PNG  IHDR(-SöPLTEÿÿÿOOO„„„…„„……„…………†††……††††‡‡‡‡‡‡ˆˆ‡‰‰ˆˆˆˆ‰‰ŠŠŠ‹‹‹Œ‹‹žŸžŸ¤£¥¤¤¥ªªª«««¬¬¬®®®ÉÊÌÍÏÐÐÑÒÓÖØÙÚÜÚÚÜÚÚÝÝßàÞÞÒâäåãâ׿äØééëííîîîïîïðïïððòóñòóòòóòóôóñäóôöôôéôõêôõöôö÷õôèõõéõõêõ÷ê÷õêù÷êúöCúûüûúíüþþýÞ€ýöýúíþÞ€þ߀ÿÚnÿÛnÿßtÿßzÿ߀ÿöÿú ÿúíÿÿÿÿÿUxŠ¥tRNS 338\•ç²’¦IDATWMÌW‚0@ш]Q¬`ï½`ï"XÐaÿ›1ƒÎ×Ü7ç t ²$É®àgŠ2ÿ ?)f‚é¡D-,Kå¨/0 AXß›•\(Ûûa¡é°]­ÕûyâÄ\C&‚F‹eˆ·Wdš¦ntyÛ^ns³àT ÷ÔÊxïƒäiÿ´?¨œcÀÄχÇ^¨qa-ÕxÇ\㶬ȟqEÿ¿qa<îþÙÛUˆzaIEND®B`‚quiterss-0.18.3/images/layout_classic.png000066400000000000000000000010331265173051100204510ustar00rootroot00000000000000‰PNG  IHDRóÿaâIDATxÚœSÍJAþºgzf]÷g!¼å¢¾€G}}/²‚?‡@DˆAÄÓzóâ‚ÈI>@ŒO þ ®¬«;ÓꙞq¢FÁjš)Š®o¾úªŠuûuÝ ¥'•‚> ¯›¢ËèpÆ ,îÛ”ü}¨­0ŒhÆ Õsm²0½sìit,ž¥É‚3Øœ#-©³ €¾sƒ¡s‘ÿº«^2Ln©·LçÚÒ ŸœüŽàä÷öõ2ŽŸžþ‰â,® ›Q¤§§Z7;¡æº9ÊÑ ß8¡X,=“–ej²“]Çy[¹ØÅYFƒäަ „ 8O^§PòþÛRÛÒæ‡Ž°’o%ä°©T #€©,j:ò¶Ê0°² Mý†jø4"AÀõ:ÞúÉwÊðæKp„ø—™ ÕêwMÜÔëCms ×—˜ý2@!@ BÁJ(jf•ÊVV×¢ŽŒ~‰Dtx 3ïû¾7oLìúõo…bq‚‚ñ'¬1c>7…ÃS)‡öhTÿC:V¤£ã’$†/"’¤÷Ýq%zz”L&”L$Ç%I.^”$}L¥‰F/ðƒmW„BÄwã¬D¡p ¶c ùBªêjÖ®Zµ#‹…šÂámƒxT’ðÞ²sí\œ³ä‹õõ \D‚€æ]»¤­Zà‡ˆó\¹÷¦$`,ciÙ4™¥,mlº8OYëÍâE>½ßIΛ¨ÙÓ¹#Gá¥8²²¼€÷Ž ·_àC!°õgY–øÁèÝûéÞÛÄ”3Qƃ ФkÌת¤&p­½]’Ô—É(ÿ3§þl¶Äóy³Y=}Ú³]_[[$I¯—Ôèád{uè~wà9}ë¾"΃±ëÃÞyÅü­«™µfŸ—Ïä'•¬üÒðœ÷ì]WO`Ý_asÐU×@ÅXø~ðz|¬ç·Æ”L´–ówß`¼ïÁ9Èd¨}ÐÉêL#fT¢ê9L=ÕFò\Û´šx.UŠrgç¿3œËª¯uŸ’+èÖ͒¤›GZÕ5 z`¢±Xoc5(c@ÆaTdã‰ÃäV:q–w7n!çèwþuzýº¶pUÅѺTn¢®ÜGë™È“Þ~ÇɾâŽãðv`; $:IOÍ`år0Æ, /%eËùœBzÖ*!#IEND®B`‚quiterss-0.18.3/images/loading.gif000066400000000000000000000150311265173051100170340ustar00rootroot00000000000000GIF89a¥dfd´¶´ŒŽŒÜÞÜ|z|¤¢¤ÌÊÌôòôtrtœšœ„†„ÔÖÔtntÄÂÄìê쬮¬lnl”–”ÔÒÔüúülfl¼¾¼”Ž”äæä„‚„¬ª¬ÔÎÔ|v|¤ž¤Œ†Œ¼º¼äâä|~|¤¦¤ÌÎÌôöôtvtœžœÜÚÜÄÆÄìîì´²´üþüljl”’”ŒŠŒÿÿÿ!ÿ NETSCAPE2.0!ù .,œ@—Ðõ a(*ÕD5N2+ °œŒ&Í Y.ëä0> Œ);: Ê— IqhݨIа؇*, ,M()ˆw B( !—.&(*&‹,,)L"e e€&Bz ! ' °a'!) &ÍC()) uCA!ù -,…lfl´¶´ŒŽŒÜÞÜ|z|ÌÊ̤¢¤ôòôtrtÔÖÔœšœìêìÄÂÄŒŠŒ¬®¬lnl”–”ìæì„‚„ÔÒÔüúü¼¾¼”Ž”äæä„~„ÔÎÔ¬ª¬|v|ÜÖÜljl¼º¼äâä|~|ÌÎ̤¦¤ôöôtvtœžœìîìÄÆÄ´²´tntüþü”’”ÜÚÜÿÿÿ À–°uÑHRá0RÄ£ (ª&E±!!$%…¥¢P†(¡‘h–)£sD²0›Â‘^HxC*## %M& ŠC# +’B(š-& w& %%Y,g' gN  B(!´-*È ÒC Ú#MA!ù /,…dfd´¶´ŒŽŒÜÞܤ¢¤|z|ÌÊÌôòôœšœtrtìê쬮¬Œ†ŒÔÖÔÄÂÄœ–œlnl”–”ìæì¬ª¬„‚„üúülfl¼¾¼”Ž”äæä¬¦¬„~„ÔÒÔ¤ž¤ÜÖܼº¼äâ䤦¤|~|ÌÎÌôöôœžœ|v|ìîì´²´ŒŠŒÄÆÄüþüljl”’”ÜÚÜÿÿÿÀ—ð•A1 Š4VPdÂbY'A$*0 :  ÆÕ`$«ÕK‘bDÌMáªRY})LyC$$-ƒM…-‹N’B$'' %™/ '!xƒ £!rƒ'Y YC+  z(¬ .²/*# pƒ ×$MA!ù .,…dfd´¶´ŒŽŒÜÞÜ|z|ÌÊ̤¢¤ôòôÔÖÔtrtœšœìê섆„¬®¬ÄÂÄlnl”–”ìæì„‚„ÔÒÔüúülfl¼¾¼”Ž”äæä„~„ÔÎÔ¬ª¬ÜÖÜ´®´¼º¼äâä|~|ÌÎ̤¦¤ôöô|v|œžœìî쌊ŒÄÆÄüþüljl”’”ÜÚÜ´²´ÿÿÿŸ@—Ð…i $Æ3R2‘P=6§è”É †“JU9e]žÓi5h~$€ÇµX £¦r²¤\++LzN)" …MŽ%%ŒN##`“{•-"™.# yŒ&&#& … Y-gB) ¼( & ±.,,&ÏC,!,§BA!ù .,…dfd´¶´ŒŽŒÜÞÜ|z|ÌÊ̤¢¤ôòôtrtÔÖÔœšœìê쬮¬ÄÂÄŒ†Œlnl”–”ìæìÔÒÔ¬ª¬üúülflľĔޔäæä„‚„ÔÎÔ¬¦¬|v|ÜÖܼº¼äâä„~„ÌÎ̤¦¤ôöôtvtœžœìîì´²´ÄÆÄŒŠŒüþüljl”’”ÜÚÜÿÿÿœ@—еð@23R<)$ˆÀ!!&'ƒ%HA&±ºd] «4h~•ÈeR( £¦’ZU>( LzB 'Š…M  "C**!•B—O'(œ.#y*#¥*µ³  g&&ª*(!&  MÅ-&³z#- Ö&¼.A!ù 0,…dfd´¶´ŒŽŒÜÞܤ¢¤ÌÊÌ|z|ôòôœšœtrtÔÖÔÄÂĬ®¬œ–œìê쌆ŒlnlľĔ–”ÔÒÔüúülfl¼¾¼”Ž”äæä¬ª¬ÔÎÔ„‚„¤ž¤|v|ÜÖÜ´®´¼º¼äâ䤦¤ÌÎÌ|~|ôöôœžœtvtÄÆÄìî쌊Œüþüljl”’”ÜÚÜ´²´ÿÿÿž@˜战*I3RPÉE¥ÚlHŠ3`B´/FƒdèH´°“ 5C­S"KeDŒRSHi%! {C,†M,$C, —B Ÿ0 . (z—++%(.+ºB¸M%%»0+. .ÃϯB+.!)h{%áÄMA!ù /,…dfd´¶´ŒŽŒÜÞÜ|z|¤¢¤ÌÊÌôòôtrt„†„œšœìê쬮¬ÔÖÔtntÄÂÄlnlìæì„‚„üúülflľĔ–”äæä„~„¬ª¬ÔÒÔŒ†Œ¤ž¤´®´ÜÖܼº¼”’”äâä|~|¤¦¤ÌÎÌôöô|v|œžœìîìÄÆÄüþüljlŒŠŒ´²´ÜÚÜÿÿÿ™À—ð…Je Îg1ª …“Âl‰ó“)p2Ÿ'!‘œ´/ #Óº4/ †ñ:´ZŸRS8Q˜ aL{B ))…M' .ŽC))–B+ ž/"!$zŽ#%!–%'·.*{*·/Ä.!!(%ÌÌÀN !((Ì¯Ö ËÃMA!ù /,…dfd´¶´ŒŽŒÜÞܤ¢¤ÌÊÌ|z|ôòôœšœ¬®¬trtÄÂÄìêìÔÖÔ„†„lnlľĔ–”ìæì¬ª¬üúülfl¼¾¼”Ž”äæä¬¦¬ÔÒÔ„‚„¤ž¤´®´ÜÖܼº¼äâ䤦¤ÌÎÌ„~„ôöôœžœ|v|ÄÆÄìî쌊Œüþüljl”’”´²´ÜÚÜÿÿÿšÀ—ð…*tJ¥Œ…1ªD“ ¡„`±ŠsÑš„Z–OFJ´¯Æ§õ‘41Ǧõ:„!¤¦R0.(zC(~-"'"…M)C " •B˜” h…$ +$..•+œ  *z B*Æ $Ê*.,«* ($ÉÌ$(ؾCA!ù 0,…dfd´¶´ŒŽŒÜÞÜ|z|ÌÊ̤¢¤ôòôtrt„†„¬®¬ÄÂÄìêìÔÖÔtntœšœlnlľÄìæì„‚„ÔÒÔ¬ª¬üúülfl¼¾¼œ–œäæä„~„ÔÎÔ¬¦¬Œ†Œ´®´¼º¼”’”äâä|~|ÌÎ̤¦¤ôöô|v|ÄÆÄìîìÜÚÜœžœüþüljlŒŠŒ´²´ÿÿÿž@˜v *Š1²(O¥d0dB ‹³ ¼¨…â U´0³`5% 3… ¦¦ÐbHx4"(zC)  …M%!"ŽC# –B '"*ž0%. h…&&"")–•) ,M|--%B, )&, ®Ë&Í, ®NÙâÛMA!ù 1,…lfl´¶´ŒŽŒÜÞÜ|z|ÌÊ̤¢¤ôòôtrtÔÖÔ¬®¬ÄÂÄœšœìê섆„lnlľÄìæìÔÒÔ¬ª¬üúü¼¾¼œ–œäæä„‚„ÔÎÔ¬¦¬|v|ÜÖÜ´®´¤ž¤Œ†Œljl¼º¼”’”äâä|~|ÌÎ̤¦¤ôöôtvtÄÆÄœžœìîìtntüþüÜÚÜ´²´ŒŠŒÿÿÿœÀ˜0vH,¯Pa5¶\‹JèÕ™˜ )Š3Qˆ.J…€É£zic£‚š9l¼¢Eì$)IÎÍ“B$j\ MM"!#ƒƒ0  ŒM #l”1)›”$"+ -œ'f +‚”s²'«C& C''Z& "x1Æ-- ÏB-Ç-$&#MA!ù 0,…dfd´¶´ŒŽŒÜÞܤ¢¤|z|ÌÊÌôòôtrtœšœ¬®¬ÔÖÔìêìÄÂÄ„†„tnt”–”ìæì¬ª¬ÔÒÔüúülnl¼¾¼”Ž”äæä¬¦¬„‚„ÔÎÔ|v|¤ž¤´®´ÜÖÜljl¼º¼äâ䤦¤|~|ÌÎÌôöôtvtœžœìîìÄÆÄŒŠŒüþü”’”´²´ÜÚÜÿÿÿ™@˜f”–Æä0²D%Cr)J§h²1”“†UÊ‹4s˜ e*âà%27)Šq ÖMB( " €Š0-- )‘Š)&’C+ &,¡&+e&&v0°©w .C,I$ ±,, ' ±B&Ò"MA!ù ,,…dfd´¶´ŒŽŒÜÞÜ|z|¤¢¤ÌÊÌôòô¬®¬trtŒ†ŒÔÖÔÄÂÄœšœìêìlnl„‚„¬ª¬üúülfl¼¾¼”–”äæä„~„¬¦¬ÔÒÔ´®´ÜÖܼº¼”’”äâä|~|¤¦¤ÌÎÌôöô|v|ŒŠŒÄÆÄœžœìîìüþüljl´²´ÜÚÜÿÿÿ@–%², %Ãê0¢‹LÈ` P8”Ó²Ú,6]' bhY'Ï` jž*„%±x,’¦PB‰€NxzC ''„M€mB “”! ""y”,¡£"(g„* $,¯"LC"*C$  %§Ã) ¢MÖ$·CA!ù .,…dfd´¶´ŒŽŒÜÞܤ¢¤ÌÊÌ|z|ôòôœšœ¬®¬ÔÖÔtrtÄÂÄìê섆„lnl”–”¬ª¬ÔÒÔüúülflľĔޔäæä¬¦¬ÔÎÔ„‚„¤ž¤´®´ÜÖܼº¼äâ䤦¤ÌÎÌ|~|ôöôœžœ|v|ÄÆÄìî쌊Œüþüljl”’”´²´ÜÚÜÿÿÿ™@—Ð5¹ $É`4¦ƒ–B2™”³ñ‰º†ÇSк—ô¤y(bc¾nºR&Nâ0:êvg #M †L‰B #€‰$#f )ž+ w™¥C+ .&B,((¹(* &»€ * Ð",—B%,MA!ù /,…dfd´¶´ŒŽŒÜÞÜÌÊÌ|z|¤¢¤ôòôtrtœšœÔÖÔÄÂÄìê쌆Œ¬®¬lnlľĔ–”ìæìÔÒÔüúülfl¼¾¼”Ž”äæäÔÎÔ„‚„¬ª¬|v|¤ž¤ÜÖܼº¼äâäÌÎÌ„~„¤¦¤ôöôtvtœžœÄÆÄìî쌊Œ´²´üþüljl”’”ÜÚÜÿÿÿžÀ—ðEAa\H i8\0 K¡È„+æÁÀx!Âi’}‘PhŠv²€(^Îá̤„,Ÿ…DR3‡${~C*+†‡/ *+”C.*–B'* –&' -tL (/#,, KC- B¾)†%ŽB"¦CA!ù 3,…dfd´¶´ŒŽŒÜÞÜ|z|¤¢¤ÌÊÌôòôœšœtrt„†„ÔÖÔÄÂÄìê쬮¬œ–œlnlľĔ–”ìæì„‚„ÔÒÔüúülfl¼¾¼”Ž”äæä„~„¬ª¬ÔÎÔ¤ž¤|v|Œ†ŒÜÖÜ´®´¼º¼äâä|~|¬¦¬ÌÎÌôöôœžœtvtÄÆÄìîìüþüljl”’”ŒŠŒÜÚÜ´²´ÿÿÿšÀ™pÖ:°&M5l¢Œ$)Ó´š–' :]Tb×Y…²8•Ihi››âa…jµ,aø µZÅ<kzC.ƒC##.Š‹3./“3'2 ‹2$ yM+,3 *LC l 2'))#ob% 0// ËC20±CA!ù .,…dfd´¶´ŒŽŒÜÞÜ|z|ÌÊ̤¢¤ôòôtrtÄÂÄœšœ„†„ÔÖÔ¬®¬tntìêìlnlľĜ–œ„‚„üúülfl¼¾¼”–”äæä„~„ÔÒÔ¬ª¬ÜÖÜ´®´¼º¼”’”äâä|~|ÌÎ̤¦¤ôöô|v|ÄÆÄœžœŒŠŒìîìüþüljlÜÚÜ´²´ÿÿÿ›@—Ð¥¢R©Ç2lRH¤cz¨šÅ'ôðÀ ˜« ” I3HRÍ¡ ¤ÑF+>$iD |M+#…C &&B •. &%p… %'fM--. #$N B'u¡LÀ (( 'ÌM'  ¥BA!ù 0,…dfd´¶´ŒŽŒÜÞÜ|z|¤¢¤ÌÊÌôòôtrtœšœÔÖÔìê쌆Œ¬®¬ÄÂÄlnl”–”ìæì„‚„ÔÒÔüúülfl¼¾¼”Ž”äæä„~„¬ª¬ÔÎÔ|v|¤ž¤ÜÖÜ´®´¼º¼äâä|~|¤¦¤ÌÎÌôöôtvtœžœìî쌊ŒÄÆÄüþüljl”’”ÜÚÜ´²´ÿÿÿœ@˜¶¢PJ‡C‰2lÈ…µRZ˜â²„Z`0‹*làP›”Eh°€…*¡)\a\®’†ÅRЭ. ,)M‡C$$& B) —0 *$ "(*.bt s/" %h/~0# )Š ÊLB- '#$ÍM #Ô§CA!ù 0,…dfd´¶´ŒŽŒÜÞܤ¢¤ÌÊÌ|z|ôòôtrtœšœ¬®¬ÔÖÔÄÂÄtntìê섆„lnlľĔ–”¬ª¬ÔÒÔüúülfl¼¾¼”Ž”äæä¬¦¬ÔÎÔ„‚„¤ž¤´®´ÜÖܼº¼äâ䤦¤ÌÎÌ|~|ôöô|v|œžœÄÆÄìî쌊Œüþüljl”’”´²´ÜÚÜÿÿÿ¡@˜–Z­*%äj8¬,Edé*-…09"GQ¨a± f%åÈ`‹“b WŽP¨4A@^vM)**L/ ‰C $.‘B$™0# .u‰*Wv/ (%0 **.¸M €0"--' / ³ ".  #oCA;quiterss-0.18.3/images/logo.png000066400000000000000000000120571265173051100164030ustar00rootroot00000000000000‰PNG  IHDR``â˜w8öIDATxÚí] ”Õ¹þªª—™i˜éž¥Afg¶5EQ0Ç@žçó—D OfQÑsòB¢Ô¸„÷ŒIŽ ÊS_£b4yžq;  "ñÁ0cf†™éYzï®zÿ½]½÷tWuWãrúöù »–¿ºÿïþËýï­QQ”ðÅAD©}¡­D@‰€¼utt=ôX___æp8ÊM&Ó„Õ›WÜsÞ«v_°í\¥}øöÖŒ1Ý1 ‚0PA°ŒKÀ;ï¼#>ðÀfI’ …•œ³ÙTnºP2KóKýTDÁÆtÇt¸úÑ›i“D0¥’#`ãÆ–þþ~Ñív‹KÿóŒÛ$‹´ˆž(‰&Ø,Pgs¢ÙÑ‚é5Ç—Õå5¤3˜î¸I—«Y¾^%ÁLÛÊÒ4ŽŽš¼^¯$Y¥³EIl2™Ìä‹Êá(w mòœÜt ¾Ñ¼¨„h›<›tV ¦;¦C¦K¦S¦o»Ý.-_¾\|ñÅMIx<ÉçóI@@¢¦³mVÉŠªr;fMjôšh¨j$†g–LW3m\wL‡\ÑšÌf³ÔÙÙiN³òûæP(d‡Ãfæ¿Ø¶2“-Õ­¨'ÅW£6ó~ì!÷Á2@Q_Õ¶ÒY×Óa4&0Ä\|OOiÅŠ¡Ô4THoŽŠÞë«šà…ŸŒ}‚mŸý{‡÷–O}¶ |Œ‚h²7sÝ1&6ò2âØØ˜¨yeÕö¡Ûóür]ž®2À/ûÑí%…ý1½¥6Y–ò2‚F""Ø¿>îçðñ-IöR‡_Õ‘tW¿’ÿH8*€dE¦w2OiÔ×FoôÃðíÃ]ì}!²”D])J¬TŠàU»˜Ðe„¯W·ÝAœ6q„¼áBéŒwZ•ŒkAqÕk1§¯ZS¨ÇŸÖÿ9¬3–q,:ÚË·(U—β» %î‚´°ùUka_gôÂÚ´Ö–ÅX9ta¸pbcúRKm² D…´×÷§]† /À‰Ž9„/ëK0ÕåÂÄ)§‡ï>Ll8“FÆø¾|_‰®HK—Õœ†ŽN:¦á[“ÎÆÕÓ®âøÝI¿åˆ~^6i)?æ ïý0À2õT{_B ï%XZãôÁ^ÈA¹`'”MgúæxTO•6fËÙ¢ä\ØxaŒ˜›gÝL„,C«mê1¾aRòIáÊêÛ ø>‚#°LjÄIr¡@¾Á8î5˜ÎPhN̸Xº”ž«MÐJ„\€u'ÜD„¨ˆj<9ï=ÆAVpÕÔ+)ƒº‘»ªè÷{ÃhòŽ¢îò'à¼t+ê.ax,ßÙ çeOBqï¡/FêZ‰ •(¾ý¨½è!~lF$ÛÉö]þ8&Û›øµãºâƒ×B ˆº0EÈîX7æŽ~9÷œßp^ĵ„d¼¯TÀýæ::…À¡»8Èp'ÿ—¶ö)cûÉç›ÙTAT!ñml_àÐÝtü])çÆÏ¾coÞ‚·Žöðk#CNÔaþµ EIÕ¥K{øà#iø`hDZhgÓ8bÃÜÛ1ÕÞŠ-Çáåá=ÐGÅ ÑTAÿ—CÊ" íXT¿/¦@ŠìcÇHÖøyLÉŠÈ´òkìüh[¬“ YÄ µ $xŽBKQA²‚†v§áმ9®yÿìý_{wàûPѲ¦[æ¯ÃÕ'_…­•S°©[ÁØîCûCäÖÕ^.$BŒTu³BL>‡d0YL&“½©üZ¶:¤2sR–•Øq ,E¤' Z±‹¬á™îgpÏþûp­JÈ߈¡Àa$˜L&,i9w-Ûˆž)Sñ㡉Ûõ)}ÃÌæHš ¶:ÁÒS’Ád1™Löþº:TN®„µÒ I“r°bÉØEVòÇîgñÓ½ë9ì³Q$4×5ã¾oÝ‹Ym‹qU`2öØ ïG©W‹fR$S–¨t,;‡Ëd0YL¦\_‰¤|ËDrs’”aN@Ñœºkˆª RŠ3Ø¥º¬kß¿Owÿ‘¬ÂU<‘W^^ŽrÖ.¾­õx¾Û‹‘w?FØíSݑƞODzsعL“UÕP…ŠZLe&¶Ò!s§-?‡1@«1Þvôî$«øYÁD°tÒjµbéô³pë™ëðrõ lw ðt…x²“–zŽQŒœ³Ý%b{ådTN©Dyu9$«”u d¨ Ê\Z-n¥rGï+ª{ÚB»3o"Ìä·ÛæcÝi7cR¹åͳic]BÍj윚2P°ˆ2;Ë‚$m¥hš’”•ÄqÀ±›ßMîéÞý÷“E<“7 l±q­'`q6¡a1 ’ ±sÑ9’I䑽$Ärÿx ¿P¤(IAå‹h/s×´>¯`; ÿ#˜ì“!òEjá4?/°,‡eIIñ!ÒÓEK˜Ÿ;Ù3¦ñç'ô~Å‘pêª$åËß›zÇyçbAõŽÜ9¶~¸‚ÃxäУzâC(BèàŸamœ%4pQofŒDnÊÿÏ~ø:ЀÊÌ·±}‘8 Ò9Gamš……ÃG!³9‚¬ß%êÌ9ae|ò8Ú9–9ÏÂ÷Z/çx`á¯9~2ó‡8¯a ßodÖtï'¿Ö|>„Þ·‰€™P‚C ½ÞÌ•6Ú±z§/ìéÁð»{ù6AŠÞ”Ь 3q‚×…?¤¹"šMgÄÍŸV[KŒ˜(!KgÂav4¡>LÖpß'›°£ogÎðŽÀ,ÉÔ’caƒÔÓe¯ƒ¯€‡y±Í6…csw/¿Mûüüv,äQ:·µee0Â&å Í‚””êF¡´œßp.nŸ»ß%R8 »ùæ™îç°™\Ò¸ïá0‚_€ÕÙDFùA4[8Ò‹Á×ÞÃßMËð^ídÊííïÕNÂ=c•Øñ&¹¤n:ÖB†@D”‘-piª4r> iPa\cÊg$Ü6g=Îr.)À%uŒKB €|ä-X[gÑ'7w/#ïïÃ0áã)?ÁÌybí)ß§ô²ŒcÂä‰82©·ÈõØsÃoíR37,Sšqü˜‹¯¦È­3h^K¥ÙaÜRD¡…4;·Š8ù”6öP\Ø”œý~?Ì®}°Lm#OÒ‡¡WÞÁÈ‘Q|<ãn4¿õõõXÜp*Ö,à©§¥ÂŠ Î‰ëkpšÑûÏA üõ Ècý$c6Ú¤ k˜–4lYJæÙbLˆE‰¸}ÎÏÈU5ë¦á°û0î'\ $~Èfú¶lÀÑ¿¼ˆNyºÛîÀôéÓqÜqÇñ’Ëv¾ÛzÅ¥*žÈ˜ËL°ÕÚPU_…Ÿššñ쨅Îý —áfë…‚áÜ“òI+tu´’\Z-ö˜ˆøñ̸Rì¤=Í¥ç( f‹=sïÃÞ–Ø?ã˜ç\ŽiÓ¦ÁétòR… Ä »fôJ 5<.쨞‚k”V¬ 6ák+³4~ $µ„¯±::Ê¥RlHní#˜RÚy «Ý\ÁŠ [¹ ›Í†ÖÖVÌ;mmmü}uu5/Qd"ž‘[5m’xé¡rŠŽÖÔL«ãïÍä\­(Ï GE)Ê1‰(åRœé z­î܆ÕP $†¡á‚¢9­ ^ áš»]{8ž=ò<¶tnÅúïÀú}·sRØv# aÊùÑÌó4ë„}'½ß¥ÃvKUúWëAŠAËR2f´Bîùw»ö ÿM„lÀýþ‹“a W;j·Ï׬™û< û:ìº ŸI/Eäc˜‡Ý]x”Èøù¾;¸«2¢]Ñú,°ÏÓt}V;b××ÓZh,¢UþxS2Æ–" PËÓŸ;ò'È8·~•æ±³@–镟OSP„R„’t@a`.ê¹#/ˆˆW rG?<þ:ÍùÑCë–ßL– oõµwÈ$­ô-ªˆ¨E0o°Žd-«4_O/áçé´‚ÄŒšŽº ¡€8 ]#6ønKQÉW_Ñz‰¦km'ÂõÍbA‹­IGš¬3Ãæ„£S’Åš’gniÓÑAÙS>m>‘°Äyº¦kíìMg,Ð6.¸úãS’…Ç%5¦¿1?­×Wë ʯô½NV0¬Ã š(4é Âq唨ê¸Ôº_ñÐáÚG$<‘ —‘+*†07§9 Uï3h>I³ÂÅ_´‡\ÑcyÀzëçâœò_ÕiíÆé2FÄ€c¸41µ±x°³ï5ÝçYw:ª4¸"=VÀJZݱKc7j'Þ§š{Oó„&¬nX‰ë¿÷-¸3ö™mgûµÈÙÞó¢îÀÌ”µdÒ✲™«ÓE, òÙd&tZYãV×@L‹°žwýŒÇ 3®á=±%¥×°Ïl;ÛÏŽÓÒSë|’RÔ.퀕(ôÈoŸ««÷Z Òrw@;}Áõ³oISz6ÍŽgçåò¯[‰½m‰ó´Ü± ÿu1¦QÔ< ¾M5) Ê|iÖ;.m¹8/_Ï΋ô®ñÚ°Z¾Ðoöœ—žÖ\‘«4„yt£î”Ï!ª™zE¾ÊO$ÉÉÖ^탗ô´3È r{í$´ëqCŠáËR2 \3e¥!Y9ÛuZ…uè˜«È )/KI»Q;Ýõè%æúq¹\Q‡ëC>¿ 9#2GÓÇñevº?ÓYö˜‹œï3ä¡} îyÍ<ÖÒÃôöØœ5JMõł쳊/z\›Ý\©ái)±'×UŒCÆuM9ü¶Þ‘—‚Ãîn‚ö^;Ï>'§Ì.òZÆ#ˆëȘ42º$]ïê5-.CK{…²>÷–½£ìÖ™ ejBâmªŠ¶çLj‰ ³ð¥i{t§†É‹XT.·­í¶®øé#øÍ?Æ«ýob/ªñÆ>³íl?;Ž_ÈMÛ…æîÅ2'l6Ež áõ»–Cˆ<ÔQÛßÿìòtã…ž—¸{Y×ñóØg¶í7¢1BågC.Y¨,!eUDaÕP!¾¶…ýM|ýþ~CQã€!OÌøiÃÔûñ,HPí@(â2ůøŸ2h@—eY ‡C„ 5s?¢ A"ˆ*J*#¢ KtówA2"ÅC~ƒ~„Â!õo KüeR_6ÓÄT˜3L‚)2'VÈêh ¬ÃŠ?ì Š?àƒÏï…ßïáD„CþY…RzÅ^¢y/óÝùLÈêgS•¹ª[P„0)\ö“ò½¾1x<£p»‡áöŒÀë…GÅðè` 〩tlH3ì=»‡ßúØ,¶!$xÉ ) ³7Û3Ãà`O YHûíÎß“›é.3•…™¹Ÿ1· ®á> ÐÁÏc` —0>ôÀ„ÞFd>¼³ëó¾zg(zØ ë§bX¢½ÁR†o|K$  †ìɾÖÝóä¿m{á.~ꊧ.~fõÓÿúÜÒ§ÿå¹3KÐŒ3T|ƒpM$—§&>‰˜½UKð«ÿûTB¼*<%äĈªËB‚Þü™rR1aÜÅZ;pÞ¼y¾ÆÆÆ‘ªª*·ÕjK  „ܨ9 Â°=¬vìñÇDBÏE]4âp8‚D‚ÛétŽUVV—,@3¢Š—3ôxYÓ@ìÖ[oºöÚk׬Y3¶|ùr÷9çœãYµj•kÅŠCô¹„ì8JTß»T F ^‚Ÿ!g)‚z¨½½=¸dÉÿ%—\âY»v­‡Hñ\wÝu%ä·ú¿—!ªçÿNPÄ‹bü}IEND®B`‚quiterss-0.18.3/images/logo_text.png000066400000000000000000000044271265173051100174510ustar00rootroot00000000000000‰PNG  IHDRª2û°ž¿PLTEÿÿÿfffzzz}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fffiiilllzzz}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fffiiilllssszzz}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fff}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fff}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fffpppssszzz}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fffsssvvv}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fffiiisss}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦fffiiilllpppsssvvvzzz}}}€€€„„„‡‡‡‹‹‹ŽŽŽ‘‘‘•••˜˜˜›››ŸŸŸ¢¢¢¦¦¦Ž¢*¥tRNS88888888888888888UUUUUUUUUUUUUUUUUUqqqqqqqqqqqqqqªªªªªªªªªªªªªªªªªÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆÆââââââââââââââââ@†IDAThÞíW [ÕFu"« ˜¶`pIëA‚O¬"K. hlA×´ŠV1­RÓ]@õwîíÎËÞgmK¿r¾ræÌ;'y“™›Mì?ƒMV7¬nX]7V+ëÿ–Õ†Þ!ކÂ<N=æ;OaƒAa¢¯ ¦êm¨¢r•p3Ô&«G.(ŒíXkê"ˆ|Ç~Àêñ'(.‘üGÇhÏØQ™ÿäÃìÚjãô"ÅðVIÔ8òÕãÇmœ’zñtVÇâÇ&=Á´±zy) —WŸú4CžO|vú¥Ó(7%ô¥œn ½´:ñ\`bd䑤Çó]†0üL1@.•“=áH4w32¡Ý«£/£[ Ñ.³ùZíÃðƒyÄŒ=8ûBòlÚÒ7+bf‰ÆjFE4Z=ñ‘–yûi3 ¨eÙ\ѲtúŽˆÈµé+ýé2mõ ÉXkÒÿˆÌ„ñ©Ó*àŽQËî¼”;@ù2â¬î"í:¤WQnFÞa(èX&øÃ:kál¹•±Ž6š5£¿®\%¿JåfiõÜ `ÎtÜEáÐN¤‡P>g¸¦×V`Ä®9ªÌmÅ‘»DKdß*Ðc†QZ!“ÚGÀ+D—¯£pÝÐm(ßCnÓW-Œµ¼²qûLBÆLÇ=u½…zÚ&Õ'»³¬¶¾Fñ 7€"›2òI›¶¶Î#oT° ßÍ{ºEG…IØC»Åt{ÇÙº+ôü“Z¿ÑJ­Þ|¸I¬ åg{5cì°á„2¤÷åȧÐxºùçØsXǼ¹“CP!«™$îï•Y¶?¥ò…íÚê$¹eù ôm‹;;o8¡â79ÏÈ“§Uíy…yý¬Î[ºLÃ*&sDoRË­%±V¶é¥ÊÞºTÕ2l¡!ÙëWÆh<é¢ ³ë éPòî:b·´šxß:ÍŽ€ì® 'ôy·ÙJ&F£3ëÕÞÕy× WÁ¹9ºµ€U³ÍI<ÖÛj9Ùp› '”‘ Uêˉ­VÐŽææ«H'O³rµ7[rÝÙe³õr«âðè×ýòì‚3$M™~à ­¥ƒExš ÖOpìv"ÇÑ[ö£ub*¤õX°zOÜÛªs‹8¢ûLmPCꤷ m§ÀAl´g»h7@-/f­ÈQ™©F•/ô\ÜêQ»];E±ó‚ïD®ë‹Šz¨TŽ%ˆãÇM ÒÒçŸØ©Ce‘ÅÇð*­4«$‘VKTYÂXµ¨C—fJH•ÉkÅ’c3¦Ê¬&ªˆ(±ªÒË¢ cš€ˆ¡M¤ÎѵêÌé&+óc­úí±jœIÚ©Vë©ÅDÍ],¦Nt4‚ú™¡2b¼±ñÔ8É4=<<Œå=ä)^$_ Åæ# 9-Î;”‡u À.-ØxX$ŸÒXVÇB‘ 1æ èR® íMvÊ¢ÉqÞ¢„*2«Òº÷E¯^) ZkÃÿS¨JF6`{ÈÊ4d$•´JÏñͳ,ô—iÕT–:ÕÆ¨UVÐóà‰[ôÛ¾^È=•xPŽ5®R´+•ð`°‘¢^¥¼%zù,Gt,Ÿöˆš·²ç–‘ë­"P`s*õ;àK{§ù(•J­þÁ©ÍDØ B*ÏÏŒµ†›©D½ªñàk¶NaYýñÕ¾}û¾øA‹~{£ x'«Ѹ¨´Lä0gýYýðgOs¥r=׺ x^àxž“PäO¶]‘?¹–UöÉ÷?I| |Ä,΄|Q…à^^ñNÂУ c¡^±«nØPˆ+qȯ¬­ ä2s¢0ˆ3**?«Üšpd<ûŠ£Œçøàˆ[QWi•¯nH‰<܉">Âc0¹£¬Æ¾çº1Øãðù½`òC2h`ÔÛ­®i¬G>ÿÝÂ@_ÉxZôb–ñ#îŠÇ®}Ã~ÈcüX<(·Ç{ܘëülAŽò±Ê6xàújYU¢;¡ëg<î ã8tH·€ß;·%D\÷=Z•îÔÕ¶ªÄÈ‹¸ÉÀË)ò©ÕP-¡«ô†Þ‡UÞæé«eU‹>¸‹BODXëÄÅ4ZuBi""èuÞãS嫞¿Ò¾¹R«Zôà¥ÇEâ=7[žÇ— çà…Àb¸pÿe«.¼r×S%Ù0M·=äb§Õ‰ëª=ؕ۫(¯2ù»[ýçúÿÕ l`½àO8½ÿY8, IEND®B`‚quiterss-0.18.3/images/markRead.png000066400000000000000000000015201265173051100171620ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆPLTEÿÿÿNŽ@†AƒA†B†C†D†F‰G‰GŠG‹HˆH‰HŠIŠIŒJ‹K‹½€µ€¶€·€¿©¬µ¸¹¼½‚®‚¯‚°‚±‚²‚´‚Ú²š³š¼šÊšËšÌšÎšÐšÒšÔ›²›µ›¶›¸›º›»›½›¾›¿›À›Á›Â›Ã›Ä›Å›Ç›É›Ê›Øœ·œ¹œ»œÂœÃœÅœËœÎœÐœÒœÔœÖµº¾ÀÂÄÆÇÈÊËž¼žÉŸÜ Ï Ñ Ó Õ × Ù ß¡»¡Á¡Ã¡Å¡Ç¡É¡Ì¡Í¡Î¢¾°æ!·ë+½í4Áí=Áð4ÆîEÉðNËñMÏðXÔòaØójÜósàõ{åö„åø}éöŽïø•¸üZtRNS7=Æ òohIDAT8Ëc`$(W€ 0óñ13àÌ--xT0s5ëè4s1ã–o4ÓÕ5kÄ¥‚™«ÁÜÜÓÓ"´I„»|½§¥——WX–œ 6yî:/+ooï„byA6¨&ùZk=›ðlUAvVˆÌüüÌù[[;;»ˆ5¸ßóûï½ "Ü͸téîÒåOx1Ǻ~Wá­»Zù=‘¶Ôý'ÛëîmKÛÕÞ*ýÅ¥žŸ“›¯w¿Z3ë¿`hT'I²9¤w]Á•‘Ÿ››oØfkÊù¢«ïi¬é\ˆ‹^46ª%ÙÀƒp×P…‚:ÏÌ5éß.Ý1ïswǽ¬2(c ÝéX¹û!¶hµ¡I•Àg‘HþŽ ˆÂù¬\“®ns 㪫3«še¬"ÌlØ›Æ*;Àœ•ŠÉÐÞQp®­+ñÏþl[ׯ°j§Œ9ÞáÐÙÂ3g ‡Žw€9Û§ã“…S>•* õŽ N•Àe-4Å¿]Ü~¥¾;…UµÉб“ÃÚÝIè g³:Ê›–·.Oû ”rHW/¯O‡ä àa™ ’o §Ú§¸Œ¦¸úM´+u{“±²]Êì;Õ[ý¦×5ÎÁ•›âpÉîÓi‚E"ƒLúœ"¦zq Ìx0OþÖó[tG2Ÿo )ã Pèá×óMªí§^JÀªw¥ho,¬üãf5Ö‡æã±ó°ñè"|ìÝ9…Žÿí˜FäŒ NNQCJÖÓróZ_ÊgÕ=3¿y­&ùÂÜ%SÖ“ˆ{ÆÀµ0û‘Êmƒ)_Ô„õÔ`+ßEpªüOo©°zÏý¸«oúB2ìž—'¸æÈvµÃ[÷©˜#Ì¡½›¶ÝEg^¦ÀòÎtl>1ýÞ Ñðî&f[°•V¸<ãÑ.H!eöï PP_oyØæV`ëüÀJšIH˜ü‘°ŠÞ©¬¨=ŽwƳÊý tÐrYè¡n'¸½+ ›úSÐwPŠî}€îý>L̶.À| ü'õQ(‹éz©¨ræ<¼b¸¶ªLÀW]q¸Ú,`±(¢ÐÑËcõ!n=(GG„‹Îú Ìr´uÏÀà@úü ÁQõâØ¶' ÿ·0Odqèg -¹ /{¹ôlq[ÊÀéY¸¡9W[$¬˜|]Þ;:ÚÒ7v+0ËК†§ŒèëÐs˜ ‡©ò>ªœ²µ˜ÉÿJ#8ûýÄPÿ>Ƥ.)k©lkÉîä/›†00 D߀‹š ø¢U‚%m´ûËiK‹èÞ¾Ê,EK(ƒ§uè=Æ£ûU}4ÌMÙ$øÇ£ðFáü÷¬« æ=+ØKà _550o?žã€þ)zOé°°YƒVž•ì¦Ê›€­²H±,lÄCôösѵîãTyÿH¶ÑñäÛ¨òãÿï¤þ¾J¸æÔ¢ï=ú¢“ôET eß{zãqm‹M¥<æ[, k±á}5zNq(®ñ Pœ¤õ”­=pÃd…Dø-g>>Æs—Aà?|½•ÎÏC"ܧ¢x%èR¡ùP<–Õ ïŒiMôš¸ÎCá"–\_a‹Ôp¥‚²oë%äd,…ÀË^ø²ŠÎÐ=8§GÂ3Äcà6œ“£g»9/®ÙNbÌøf….N¤òXDhȹ™ËÀ¿ÆÃN±™Þ'Àe \CƒÑ9q,^gÛ™÷EáÒÞìö…ÇzI(tr <žµ|/¹áªSl®³:KùÌH¸ÎÐû3#ó4FóÚvU>Iøxc =©t ü–Dx_òÀÇ 'àyŸ#ç(ŸÉ–Ãpc…}dÛ' ÷ɨ½R‹³Ÿ‰Šø¯ƒáú;‰ã4þ€ºšÕTEn‚g>!£"a KÄø‹(BtÅ? þ!U~Œn2ΨÏ'Ôí“0F„¸>¸RN¶4¿ Ÿp·ÿ$?±X±ª®>g§Ûëww¸Ÿ Ÿ€[Dè•Ô˜Ó‚I™ðúín¯w\À-©¡_Ìi¼¦ÿÜÊ'-`TÝ‘ˆùw{²ñ-š Ô0 ýD[IEND®B`‚quiterss-0.18.3/images/menu.png000066400000000000000000000004651265173051100164070ustar00rootroot00000000000000‰PNG  IHDRóÿaüIDATxÚœ’?ʃ@Åg×í…tI‘xÏ,SyEð6¼Œ $¶)DüßßWíú``fá7̼YEшÎtLµ˜¦éÇñóÁƒÏóLëºR–e´,‹r€+Æqd(\ו:+ʲ¤<Ï%ŒÎèŠØómÅ?õž#ªª:q$çyÚ€•@ð@WÒ˲ ÇqhŸDUœsjšæÍ‡a`Ø3 Cêû^9À€[Á¾7Õ^¬@—¢(}Ãß¶mÓn¦ª à4MoÛVzàû>u]§`ÀŠº®M’Dû `™iš÷í„×#lM^L÷ÿÿ×G€#X w®à IEND®B`‚quiterss-0.18.3/images/noicon.png000066400000000000000000000001401265173051100167160ustar00rootroot00000000000000‰PNG  IHDR I´è·PLTEÿÿÿ§ÄÈtRNS@æØf IDATcä —š­RIEND®B`‚quiterss-0.18.3/images/options.png000066400000000000000000000012011265173051100171230ustar00rootroot00000000000000‰PNG  IHDR(-S/PLTEÿÿÿz|~FGH89:vxzoqrvxz‰‹‰‹‡‰‹‰‹~€‚moqijlkmoijlikmƒ…vxzˆŠŒlnpqsu}}‚prtnprruvƒ…moqoqsqsutvxxz||~€}€‚„‚„†…‡‰‡‰‹‰‹‹ŒŽ’Ž’Ž‘”‘“‘”’“’””—˜š™›šœž›ŸŸ¡ ¢¤¨ª¬¬®¯¯±²°²³³³·´¶¸¶·º·¸»·¹¼·º¼¹»¾º¼¾¾¿Â¿ÀÃÂÄÅÂÄÆÂÅÆÃÅÇÄÆÈÈÉÌÊÌÎÌÎÐÎÐÒÏÏÑÏÐÒÐÑÓÒÔÖÔÕ×Ô֨רÚ×ÙÛØÙÚØÙÛØÚÜÛÝßÞßáßáãáãäççéëìîÏ­6"tRNS"#$/3=Nœ­¯¯°²²º½¿¿ÀÁëííïïïïñþþþ;Ê¡»ßIDATÁ?OÂ@€á÷ww¥¡Ö–¨$qÐI¿¿qprMD’¶`0ÀÑûãóÓ܆2Ÿ¶V ÊOŠmfÙº\)Ð8¯²ê/ìÓõ² ¢pÙÔʦÚ:{sæ@ß_–ÝP½Wu/§|P™øä7IëO›´wúÃóÅD‰JD/…ù"ŽC?8ÓU¯ÀXÚæ*/ Hµ·ˆbx=©S-:­'Ó NßËîüõàÒÃöÃïdl?ÄÃ’è¸òI'8D  €üV]•?c­IEND®B`‚quiterss-0.18.3/images/page_copy.png000066400000000000000000000007711265173051100174110ustar00rootroot00000000000000‰PNG  IHDR(-SáPLTE.‡¹/ˆ¹0ˆº1‰º2‰»2Š»3Š»&‚¶"€µ'ƒ·'ƒ·-‡¹,…·p¬t®v°v°v°w°{³}³~´´´µ µ!€µ"€µ$¶%‚¶2Š»m«Ï¬Õå®Öæ¯Öæ°×æ°×ç±×ç±Øç³Ùè¸ÜêºÝê»Üë¼Ýë¼Þë½ÝëÃÜìÄÜìÇãíÇäïÈãíÍæðÍçðÏçðÏèñÐèñÑèñÓêñØìóÙìóÚìóÜîôÞðöáðöäñ÷åòøæòøçóøçõøéôùôûüÿÿÿ’RWÁtRNS03¤§¬ÕïòDOîb·IDATÁÁJBQÀ¹÷'® •VA› …Úµóÿñ\ØFŠˆH!%ï;ÍÄÕäÒÔØ¢‚˜<‚ͱ/[Ãýj™›SQj‰¦¯Ítµ|Ÿeýþ ¯ÝiÁå™Í1ÇC™ o·«¥— WRÒ›®–_Á¨™ŒÏ þ‚mÅ0ן~Ê,£SYe—DxJ·$öë–ÚyýÚÚ0çO¸yzͤè"­º"@Ý­[¢tû8ƒú È.+MõOD"¸IEND®B`‚quiterss-0.18.3/images/panel_hide.png000066400000000000000000000002761265173051100175330ustar00rootroot00000000000000‰PNG  IHDRÉøˆyPLTEÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€-= tRNS5_¼Òãóü&cúlEIDAT[c`€AÀÂ7Ñæ ¢Í@Z¸U€A((d‘T£Ö,(ܦd…,’ÀºÔZÚÁ ¡Ì$¨9êŠØM†1Vk f/ÎIEND®B`‚quiterss-0.18.3/images/panel_show.png000066400000000000000000000003021265173051100175700ustar00rootroot00000000000000‰PNG  IHDRÉøˆyPLTEÿÿÿ€€€€€€€€€€€€€€€€€€€€€€€€-= tRNS5_¼Òãóü&cúlIIDAT[c„8¥Ô! ¡Ì$C­¥MÄÊ0´H1Ôš…Û€‚‚I ¢Í@}­ ↠cÌ‘¬À`Lö fTvQIEND®B`‚quiterss-0.18.3/images/preferencesFeed.png000066400000000000000000000013411265173051100205220ustar00rootroot00000000000000‰PNG  IHDRóÿa¨IDATxÚŒSMHTQþîû™÷žã8¨¹p,M­Ä…•Z˜JµÈpÕ$ ®ÜmjÕ¢…BµhB›h#…[µÉÔD3ËŸ™œtb|ïÝ{;oÆQ‰Œ<Þ}çžï;?ßy¬ìödCABäâSa~ˆ@ú[J )DŸü’”Ȳ ;ÌókŒÃ€Uºý®PÚ„ÈU ôp3¤ê„K$.ÒdĦx@Jáe"§.m¯<‡O¦Új×Á]¥GN¦ßR fB/€d&q h\ÈgçÓTƒCœ®W6Þ?¹ºs˜~KÁØWÓÅ*&°Nýn@ò4›Àw à >¤”\TO\Çž‚Zì ð:¨<Õ {y<1EÔ/£N’i„:žNðr±#8^5«° ˳“p’ ì­oÇÌàCÁQRU ™œÓó ¨Åá­b7j°p­­üóû2D‚!XÆçp6’(ojÇüÄ8U”„H}ÜUšÌ(FI?di_‚« Ÿ¾‡¸€¾ò¿æ^c~|º¿ˆfäÃÂÔ$ÍB‹oɘcå@**؉n é.IÃI‡nl ¡f~–Æzq°å 'ßamÍ^jŒ U2›AêX S‡á£i ]ÐYÉ<º‹’3ÝèO5cnðV¿/Æ#c-#=õ¶*°LÒu{Åðç‚yÖµ~]7{ÑÑë©‹z«¤É͘¦EËôW<”,KBïž-ºˆŸÒ-UhÙË˂܅€mÆÌE€H*c1Wx)惦«Êfe—¶ÍP‘8ЕuŠ÷Áõ*ðkl-xëU€ÖùŸ-x‰¼X/ŸJ«îýt’eæsžïÿŒ´ÅèNÇoy%–¼ž˜æIEND®B`‚quiterss-0.18.3/images/printer.png000066400000000000000000000011161265173051100171200ustar00rootroot00000000000000‰PNG  IHDR(-SPLTERŒÂRÂSÂTŒ¾WŒ½XŒº}wq……„†††‡…„ˆ†„‰†‚‹†‚Œ…€U‰¸ƒƒƒL~«yyyF…½GƒºH†¿Iƒ·K³K‚³K…ºN„µN…·O„µabdghjhgghikijljkmkkloopwy{x{}zwu||}}||}}}~~~~‚€‚…†ˆ…†‰†ƒ††‰‡ƒ€Ž’‘”—˜›˜™œ£¢£¤¢¤¨¦¨ªª­«¬¯¬¬¯³µ¸¹»½¾¿Â¿àÿÀáÿÄÅÈÉÉËÐÑÓÑÒÕÖ×ÚÙòÿÚóÿÜïÿÝðÿßàáëëíòóôòôóóÿÿôþÿôÿÿõÿÿ÷ÿÿøøùøÿÿüÿÿýÿÿÿÿÿQ¦ë¼tRNS#3°°¿À4>f‘ÎIDATÁ1KAÐïÛÛ°·§'"‚‚M ;ÁÖÆÿnekgaa`ÁB%ÂÉ:3æÞãðYŽþ”íäÚ‹‡ûfÝÃÖC¿oûoOZLjªK³|`¶T…ä+.Ö)P_{åÍ-ƒ7íObÓ®ï¢Ú>³ ,$f’úáïæ-3×9º>9º>|… Ž"–(Ÿ%-¨-3±59º>;»@A¾GÌ® S tRNS1ÉÕÕÚÚòúþuýÅGIDATUÁG€@Ä@/9cæÿEâ€ÔUÐÊϼèÓ »C£®PxñâÄ-ˆk˜p nA܃xñ RW(†;4Ë_õ¼lá -U=¹ÏIEND®B`‚quiterss-0.18.3/images/readSection.png000066400000000000000000000005071265173051100177000ustar00rootroot00000000000000‰PNG  IHDRµú7êIDAT(‘cøÏ€V þÿòxpЧÏ_ð§Nñ´Ùïþßù?ý?Vìü)ó_ý?óÁÿ»ÿ'ýƒ*R÷ž¯âQ»ú=PzÉÿ›ÿÏþ·ï+ào<ÿÿÿêû îÿ|–ÿøìÿŠÿ·þŸüo×Ã$VP÷øËÿ}ÿÿ_øzáÇO¿öü_÷ÿP·m?H¬ úÅ‹;þmú÷àßï»ÿmùwúßÁ¯Æ p_pZ—߸4c;þ;öÇ'Ó^a¤€b`t)9èÿþÿ»ÿý·î+²4Ô l¢žgö]¿úŸq'²4<ØE=‹ÏÏýoÕ³#.Ø„\dÓ .ÇYÌÿÙˆM$>hç8 6IEND®B`‚quiterss-0.18.3/images/save_as.png000066400000000000000000000012651265173051100170630ustar00rootroot00000000000000‰PNG  IHDRóÿa|IDATxÚŒRKkAþº{fvgvc²ŸDÝ»!^ÌÅ‹‚ˆ7s#ˆ‚D(¨ëë# >ð`sÒ,"QÑ`Lj0&ºvwfº­î]b,¦fºkª«¿¯¾bMéì±r /ú¡D zþiœÜ¢—-8"?.8¿Ä(ÆÏ¥L¾¥_¹²‚å&x7spq$“I„aˆ-;váåÀlèì„ër“kŒU?£EžàÇ Z(%R=iê§[¤¹UÑmÛwïOû¸ÍM.csz£×_¢ÎáÔ‚kçNâÅ£ûðlFëSxˆ¡§ý Ê”#L.«APTÉÒ»¢¯Pï0 ~.átïùÙê½é?ëì—ˆf1¨ÂWä‹ ¢@ûÁ¬‹ô ÿÀ 5c¤'û[ÂD,‚ %õÈËç!9¯6±Q‚|`½ŽæeHî‡ r¡™ Ýq˜~èçÝ0Á&®9[(ÏaՈЭÍK0ùmeÉðñìN¬jpœ‹•GŸT)T”D”0Êr€¥‰8M¤B‰Pe®^ÁÈë7hiÙ„¶¶vøA`pòÕkÖBO¯AR(f (D<’æAKב^½mGª»Ûö}ŸFE½*ÍŒs-X³éËjÚ2£õ½[}Pa€¾›7HF žë"æyˆF½ÙY²Ô÷O™ËÏÐ5S °¯~ÑÖ±\¢´wÿAãó™VKYNÞ4÷Gcêñ{Û¨@Tj hè¨M±>åÐaϱÀæ)¾ÿi¿@Cö?»ÁMgIEND®B`‚quiterss-0.18.3/images/share.png000066400000000000000000000010041265173051100165330ustar00rootroot00000000000000‰PNG  IHDRóÿaËIDATxÚì“¿kaÇ¿w½$µ$ôšÒØ“4šPš¡&¥ Ե꒡C0:¸èTpÈêÐÿ¡C¥CÅ ¢”j% [E ¥ 6þˆH¢C©Pc.wiïî}ï}}Ó¸©S‡.ýÂgxŸ÷y?ðððJœs%2Ž˜ã(ïî§þsÅÁƒâ €ì×Á–¾ cg^O>©ùÕgkË328÷ˆNtà‡p悹ä*£ö¼KjÁø%½Îq8£´éR²15™ž±l Šh\áÜÍÒcI’(>ÿ 0çQotü†M¡÷̸F®µ'ö OÅs±a2X– %tþrFËÂÜ©äŒÝ¹ÝrêPÚÈ~UK¨lÐÒu$RQ%0P`?vŽ#o_ öÒ-5Cp0 vŸ_Pþ^‚ï”}§û9µu˜Œ†™˜P4JˆÁ`!ÏŽœóßíèéö«^tÉ™…Ñ´ÑjØ0,÷u¹ÖZÿðMÿšÌ.Þ~þôÉ´ô~iÄr0:»jËfãׯ†sBímÛ÷š´¸ùÅ\¿÷°úF›í’À„}Ò?ö ŽÛI]ðóÏã¿"üü`R Ĭ¡P%IEND®B`‚quiterss-0.18.3/images/share/000077500000000000000000000000001265173051100160325ustar00rootroot00000000000000quiterss-0.18.3/images/share/blogger.png000066400000000000000000000003141265173051100201570ustar00rootroot00000000000000‰PNG  IHDRíÝâR$PLTEÿÿÿþfþrþ‚2þž^þªnþ²‚þ¾ŽþήþÚ¾þöîþþþ¨/ø²tRNS@æØfVIDAT[c`FC*¬Ú½CÄß½{÷DCj·ËêÍ †ôVAïm† Pj÷FÆVAÁhP±Ëî…Pí» !î^6j+ÜR˜3Û× (ÑäCIEND®B`‚quiterss-0.18.3/images/share/evernote.png000066400000000000000000000017131265173051100203710ustar00rootroot00000000000000‰PNG  IHDRóÿa’IDATxÚ%’ûO“w‡ûlb˜” ™3¡ŒR¡\ ½H¡´Ú–¾@¹É­”Ë”Ë ¥X.r©ŽÛÁ@Ý„E#"[˜H†Ãâ Î%Û̶lɶ,[f–%TŸ½¼ûáäûýåóœçœ™c4)9ãü¡¿í¯ ê FÝóšþ²£ÐÉщ¥”“5IF_8)Ý¡$y‚ÈôE>Æ”™øù#oü0•7Ri¿g¢ý3ŽžôU‰œnKÁû©ñ¯«ño•Òóeç–õ4ÜÖa:†¦;êYrWð‹òy%Þ)X6§$æhb¢ŽpôpZ‹Š Ÿ3½zê&ôt,›ð®Yq-¨Ií C¦î=h»—ûWsº8žxe’’LM&Ú,=Ùz²2´¨U˜œY\Ü,§uEGæÐAdéý!ß}»Ü«=m•J…N§Ãb­ ¥×œo!/ßÈȺK纑HdhÀ»d#RAìëGHJL–ÂV«•²²2jjjp¹\TVVá,.Áf?Íèçn.n äŒG#Ë~74pi½‚¸Ä7‰?®@£ÑHKKKq»Ý´4·ÐÉÃÈ•v ¶g3ºZÏðv¦I  L>­E“§DÿƒAÒ­®®¦¹¹™N—µ§<{qE %ŒÞu3²#¦å"`"dwæY-…MZâ%b4AêÖØÔˆÇãÁëõJ°:·‹â¢†—kÞ±“?³¸¼ûÞ·N*P)SHOÕ`ʳPT褥£‘¶¶6ëÏâªuK{ëUø·-˜¯ŠKÔMíß½ð(—k?TóñC¯4ëù g9×ÚÀÛ³’þÕÛ}’¾Ã.`+8ÅØÆúç`þð2ý̾@뺒m#s?×°öÜÇö¿cÒÌ‹[8«ÌŒÎ¶²ùÛ ùfGOÊéÙÒa¾.̾¨Y¡cS…ÿI.Óß3ÿS+·Ðžïïû{N‡œVäý ñ˜rS£š2¨öõÙÈeTK[ô¹À™réÖšuU8óŠ‚üx·6þXàÊsÀIî5tÇOÁìëlŒ=„yëš§*[)–©ß2Ÿäê ³Ó½m5¥È±QüÃ}ï ÝÙÁžD4Êš5¡Â#C68©Ì.ý/G™u»¥9Áõå‹Ñ~¬ö4 X€7FâÖg!®ÑZYxbèÄ«à›ÇÃä÷NˆK§DÎ¥]+?hª‰0Cï›u© ®¦f”(À®F~4ÔÇ/Îñó3‘CGR£ÁWG¶°€ N­ÜV, ¬-…¶­L©"`Ûk_ü>¿Æ(EŲ=­RŒÇ=“#0§0½ñLJV!=„.ʤ4ò—«@ô6è¶ ÙÛêl pûÞIO Cû¡ 3€»¹úÞ¶#Æbð»ñçHxg“íjÁêb/HÿR˜AëUßN~!²´y2–Ù€©IEND®B`‚quiterss-0.18.3/images/share/linkedin.png000066400000000000000000000002501265173051100203320ustar00rootroot00000000000000‰PNG  IHDRíÝâRPLTEv³v´wµ0À@–Åp°Ôàîöð÷úÿÿÿ¢: tRNSeñ¤£P:IDAT[c`T!C‘AIÙÌbP2/FgÀ¥4š:ÌÛ ŒŠŽ$#$¢ Âbü (@X sGñéqxIEND®B`‚quiterss-0.18.3/images/share/livejournal.png000066400000000000000000000003111265173051100210650ustar00rootroot00000000000000‰PNG  IHDRíÝâRPLTEÿÿÿÿÿÿ€ÿÀÀÀÿÿÿ€€€€€ïó´JtRNS@æØfbKGDˆHOIDAT[c`PRb&#'0CYQ"¤ä"RqQM )9……˜TCaB¡Ø„ †2©¹¸ƒMP‚1˜”\\À ¥r¨ÍJ0'eË[qpIEND®B`‚quiterss-0.18.3/images/share/pocket.png000066400000000000000000000003641265173051100200300ustar00rootroot00000000000000‰PNG  IHDRíÝâR*PLTEÿÿÿýóôüçéûÛßúÏÔùÃÊø·¿÷«´öŸªô‰–ñevðYlïMaîBW?ÀÖ– tRNS0?P`pŸÏÞîEDv®lIDATÁ1Á`Я„¹0XmÝ­b1¸€ÄŒ®ÑÅÞÉÜ#$ŒF¡åÝÅ{™–RJ)Mz` @Ês'^ißÙ‹±žª^¸$krõk¦Oß´Ü·|²n™»ä$“Ža™$ÕæT'ÑõN drÕIEND®B`‚quiterss-0.18.3/images/share/printfriendly.png000066400000000000000000000007371265173051100214400ustar00rootroot00000000000000‰PNG  IHDR(-SÒPLTEÿÿÿvvv¦¦¦ÍÍͪ««²³³>??âããÔÕÖÜÜÜÄÅÅÇÇÈBCCKLLììíîîîñññY“r°ð’‘‘¨¨¨«Ïj»¼½Çã“ÌÍÎÏÐÐÒÓÔÒá¹ÕÖÖÙÚÚÙäÇÞßàßæÔáââååæææçéêëêêêðððòòòô–]ôôôõööööö÷÷÷ùùùûûûÿÿÿ„9ú'tRNS #(38=C€‡¥½ÈÉÉÊÊÜèñòòã—©%•IDATÁ;NÃ@ÀÙõs@D(ˆ ~÷? )ÒDH4qœµ—™·Ÿß“`ÔÞa>“ ÞÀF¶z¶¿RºµRÇ»â eÿ—úpÿQ~íÅõ+ÃøºÐe›Z»+ ‡§uŸÒ[• ÷Ýyí1L@Hz·äŽm ëÜèN™ú¥>×–å<ßh`º,ÿ­7k»ãd¢IEND®B`‚quiterss-0.18.3/images/share/twitter.png000066400000000000000000000005741265173051100202500ustar00rootroot00000000000000‰PNG  IHDRóÿaCIDATxÚcøÿÿ?%˜j¼ûþ‹›xßñ»uûo4Î;ÿ0&SWè¿òÌF˜d¬?ëð†)gþ3L»ðŸaâÉÿ Žî—Ÿ´ïÁ¼ “P °ßöøHA†óóa¦Ÿ{þÁ€aÉãÿ kÞ!ðÂûÿù×¼ø|þÕ'æÝþ\V0çÆî]ï@åï¹9E3¯ò£¨‡Ň5׎­|6ˆaæ•ÿØ Œ@<ÿöGÿ†wŸ±i@Æ{>ÞÆ‡ëïx{›€íøÿ¹·?£Ž~>„MóûŸí±&$P´B] cÛ;†Î½ÿæßFÑúË6¨ff\)$¡qþý«ßÂð¼û?:ï}ù’æ›@q+„Aþe§Of""Û%º9OMIEND®B`‚quiterss-0.18.3/images/share/vk.png000066400000000000000000000007241265173051100171630ustar00rootroot00000000000000‰PNG  IHDRóÿa›IDATxÚc`úÀ#{Ê¿ÂY¿|ógÞöÈšRóÌžzׯhö¯€â¹¿€rjæÀÕgMIª} Ò_ÄX2÷gLÃÊÿ T:÷¿Wî46ß‚™>QµËÿÇ5¯þÛ¸êPÙ¼PË8‚Jçý‡©é0%¾yÍÿ¤öõÿ£ê–ÿ÷É› RU¿ürǰxxÍ’ÿ 1ïÜi qHH/Ð)ú@oA‚ ƒËæõ/š¥3„Alÿ¢ÙZ!å _'´¬ýŸØ¶îDíR7ôÁþ *›ß Ò ’ˆ®_ñ?¢zé fˆY»ôFlãJ° ·Þ”̵ƒ$Ð$ňš%WZ!¦Ç·@¼3ìd¨Ø«µËcÄF@ñC W>ƒ €iÄ…£Vüôl÷ÌÉ<(†Åè†@]õäB @txõ’ÿ^9S'b¸hˆYDÍÒ‹ÈNŽú=¤b¡EXÕ¢ h…y¥XÐ; Áå *£ê–ýF-0—€Ä1Ádô9H¨nÕ0ÈKÀ|4™š0Z]IEND®B`‚quiterss-0.18.3/images/sortIndicatorA.png000066400000000000000000000002731265173051100203650ustar00rootroot00000000000000‰PNG  IHDR(-S6PLTEÿÿÿ9Vi9[o=_q@\lS˜½[…ž^“³ƒÈ넮ŽË엳²Ýò·âôÀäõÁãôÊæõìáºTtRNSv“Í82IDATÓc`d@Œ Œ@À"Ìlì(LœÜžÉQ"€É'ne p0v“ÛÈg¹0Ç6œ²ÈžŽCØ!äâ ÀÞzö2R©^—””p3á‘Ý ÀîînÇ|Æ6póÉŸ÷Àx"OºÉm'±›ˆ‰¾ÍM‚-.âúlŒ¯Ü…qŒùæ)…éQ J ð|!–à„•N¡vr–€¹ÔŠ úF€bÒÞÞ>Ì„GiÃâ‡Çí# u(â(g*‡aE÷‡â'˜ž Š ØvXÇ¢ÊE*gK–¨³Ž)Ô^?¹ _”#20‘)E‡ÃLx9Ð"˜"ÊÅBÎ!"&ÝŒw_ãGµ(òñ‰ ¬Èºäzü[ð/†Ü‘¿¹©OèÅWä³¹·¾øÊ1ìïÉñ#Zh» éD²à„é>Ä>>3á‘âÀ††«èTXÑÇ¢þ‰ >C”"%QäÂjrã–˜˜¶Pÿ…§Ý‰œÉ™¢ *ªp"7ªçÜKÎÅr¸}ÝÒÒRVVfq8Ì„G„±ÔY*¤¡#0\}Nó¹H´Áˆ”¥(fœÄüqìdRnÇ_È\ç¶SGeº^Çí1 6È€qä&MÞÜe¢\˜(£âu~~>hùp˜ so =xð ļì¦`É­‘‘š˜h“ qšè{Œ éH1ؽ%ãó+ômK|ð%† Ç:¸Úæ‹vÄïGæ½Bb¾Ç‚“$—E:‘ž#ŸH¡DF…’‚Á‡#FŒfÂK¡­­­øI¬-T$_Çà“RwèùFÑHg÷gÄg`Ñ”BV„øÊ~nOþ@8´ˆ&F¸ˆ»øCr&‘E¹žÒ! hC‡i™ÉM©üò0O°d3a.ØÖÖæ«=!A.$Xò컹}z57Ñ ÎõFîfàQ/ºÁ&R¨&Š( Ü1¨€D¤8]Î݉Šð)„¸2:çRÎþÎä™ 3aÎØÔÔ„ß’ÛB³9 Êw r²"þpÕŽ 'd ]ü>Aùk¹¦#jŒ¡)1=\ã A+¤%Š.6ã£(|r…¬k‘ø÷™“HÄQ²ÿ0æF„ê#0dct"Šõâ°D¢=qé‘ëd@±Æ (ådå TDÚô±ªxEKLÈO ŠJ(LÈ'¡˜IB†_‘ã×f¤ÈåCQzýý‡™07H(H7ߺ#¢f…XG}¤ùÂ$1ܹ#£vrB±æF ^óg˜ˆIg\åó9Å÷`b»øwaõƒ?É'|!01Ä#çÈ$Ñöí0---¦nwÖ5°3¤Å…\çâžFŠ\á¶“Ð…qS\/| %ôèO,Ǯܣ¸|+hdYÈeGÌ$bÒƒhìáç%²k(lÕbnD{/·Ð û ‡*…X¹­-Tä@1 SdÈÛ&R¨BMÜ"Â¥PñÂÄqŒš3Á]ŽäòDt&Å¢g )ŸBC~üÉÇ÷gˆvQ¢OúTF|$ººhXpŸp˜ ¹xB­×5Rø$Š.‹RCÔHÅÃ’Bý-52ÒÁÈýJŒÈ<†SŒöŠ“°GÔWQ*C«CÄ«à\±µrx‹ìÇÞfpak8ÒÆƒwww?ºûáÍÍ›÷vìyOŸ‰ÔÈ‚Q3ËfþÙäËñŠ‹‹Å §ÌE>Å4щ·C¤Pþ›Šb-÷­›¾Äˆ:™åÄaòº=E‡žŸÉè«‘¡Ô'1lÅ7eq•2¦‰%Äu$œ€œ×¿ßüA س/þkËÏw´íhìnx°_W¦ ËM{OÛ¾õµWŽ¿ !#—£$u¹4Ò“nÔi …èc\[3d\ÿìbø8Ç‘TÅÀt%K¬î¢z)–RÑ©@òkõŒA1Ø%NXir<Ó‚,œo‰_±7Ím LØÙÙiÏýðŽÿ;{:’yùEùE%©’’‚’T^Á±ŠÀºƒ:ÒííÝíÝí{zv?µÿ‰÷A+Š–F‘͈bÆ2¹µSñ×ùg ÙNEM2޹ˆ»%ᔇæÇ…Š$‘z‘Õ+ØŠMâT¹:gÔ$ £D’$'ÂVYY9`&´4ˆmsókà@ °8¿¸²¸rÚ¨£GÔ$SÇ*wÔoßV·µ¡­¡­»­=ݾåàéôùNøqÊ }äÆLÑbI<ÑY/Ê! “§S„ì¢!ÙU,@?2.Ô° ]•òq+ zŒu(h&”BaXò~¨J Éiâ—M® ^QQ1ЭÖ:àoa²°¢¸rö˜¹+'—•—V³ a^Aa~ñ¦Ú=ñ_w]WýiA†&2K èWqâÂÄì$…²D«&?œˆ£‘1ÜÎThƒÔ u‡Ô'Ž?¨E™Á†å†ôÀ€'ãò:1ä(ßœÆÍ6¢ÉDEb1bÄ!#߀õ¢®®>©W.-Ê/œ\=e\Å„êâêÂü"|²µuË1¿É¥Sð·ºt$~–öî¶¶ÎÖƒ]­]¦ ¿¢UÄ`k÷Sù¦êñ`4å…Ÿ¥Î•´!ä—ç‡++¯Â*Â[÷Fø GÔ€f0já¹>–¸É‡£¯£uQ#ýÃOèú!N‚‡dõ·ª’‘ã+&L¨˜XßU¿­eûúƵEÉâc „/Ö½8¿â„1Ec&VNêènßÛ´§®­ÎM\ ÅPI%Ñ J<Úñc£}yUÉv *\ÊâÖÑÈ}½P¤G_3 …D+±/Îá"G"1ê(r)·¬DÆÐ‰Ë6‹@·Oœõü &Ó‘nßupgGOgmÇþc „©Š]m;+S•™Tï’•ž$ø2!†0ÎôóµD^á“Û]y€¨r=qbt¸E×âB +•=ÇT&ž&B:fÁO3ðz¡b])Ó?.ܨa¢¢†é?‡òòrè7`&dû÷†©ÙÞÓÑÑû¯½÷ݱ½¯Žöžöìr“]vúOA2ãC1Íq ‡†’Dƒ§a)¡‚Q¡,{H&PŸÆ¢^‰2ê¨x ËŠP\á>÷*ÆLÞ"þÕZbù8&×f-1ä,ùC¦ÁC¨ÿ™.èÿél¸À+wîÄ‹_M˜ÈK Œêí fœŒDb‰Ÿ0TöðŸåb)Îø¥“¸(’žÞ2‰Ä‹+9þblŠÂZ1M)þ ß‚"î)^êÅ«m©&\=°–˜òòrÅsÄÄÑÌ@xPÝ@7ÍùÛötû‹õ/>üÖ²†Î!å+¦;Ò—4¼Utúº÷ÿ,‘襾tËEÓ¯¿dó²—bžÉJ¢ýÄÑýfÄšk¢KÔhŠ " eE‰Eu„ëEh¸FìÜ¢$››@†+o‡dú×DÕk«)â¥èêI³¢ŽŠ€+”:¬ªªrÙm±@˜ª±®ìó37~¢dÑ™£ÎÄ¿}íµ?Ýzï ‰1cF7µ””ËK5™L—IºF¹ûK*Æã«úØæ™ìBÓC Qra’OÜP%O¥TLdÏ#.OІ™˜1.Fª‚3ˆÎ-¤ n¤¿Nés¦¸ïõþJÅ^¥¹—¨}u7d_¥Pèr ÙEa5Ó/”$·Û˜¢š¯Íùêà ØÓ•^ܰ¯xÁÕ麕‰< ðwõÔ¯(žwÑâU÷ý¶ªýÖS¦·Èª½¸DOws~ÍÈEͧ­VŠtí΢Òž1//?/{SÎYŸáÞ^—g™p&)u…ê Š5‘ ,FÉEr éKÎró¤…ü¤ÂEH¨óç3Þ¹B âõ’Šbd¶^Ï7²~!nRè@9pLÓ¬ -ÑçU;RۘšÏOý\mGí¿lþ¾ÕÓmé‰mÍ£?ýsÓÝÙ+ 8Ltíÿ-~Ó,Øú®-“—iß4êã?2r|Âäç§ù ž,KöÉØ™¾=à ¼/§žzjÛÀùMI’"É1V £áÞˆ¹Bì†ë›RB|H¤SÑÆ£´àT(—t×1QÕ1BŸû×R2I.‡}YY8pp³zÈÖÑŒÃáÑó½×ÖÜ~Âßÿáí¿Üþ_=Ý=«2%gþñ¦TM9HÚ//ÏôÖÝðgU^¦eSgËÆCûVf{à ɼÎ}MϽÝÜS4•fŒ'vsÙ’'¼(ÉñÛEèIô¡Æ/‘íbBJ–"¬†r>œ7bRh­£ǃ„…þ}Ë=þÛ…U Sy©*æç ŠgŽZrjÕ)w®þÞKZ»7ì>³¡½xÆXLûÌ!É7I÷Øk)ÍôßÍ$zçzOÛæÝØÝö³Šq函ù‡î1ã–÷s%ò¤bîl¡8!ˆ:*fáÿB~ ¸Ai›ٹŨÉïJQzÝ4"¦ è½™”ªõ¡†¡¡+Œ,²hq¡–-Tæ(líÿ$üÿrýj7ÿíª“K'Ï-Ÿ=¶xì-¨·¼ïïVŒ\ùý?þÛË»ê¿Üºµdî¤dqa/c-K‰þj`^º­ãàÆí?¨/X_1vÄèÒdQêÐeœ8*Û‡E¤UÍÏc"p÷¡¨¿tX²É×6SqR%‡ïܹ³©©ÉŸI&L1b„Nb SC¥h$±>¡Ð_Z&ÆX=§!TÞÆH!Ý‘uG9+++‹‹‹‡(æ0lM!º½Rÿ þ-;^Pµ`JéäÅ£N/l]Œ%“Ϙ;rÎ7žü»ßÚ}ç+oO_p|u&Ýc¼ ‚æ+DÐ=umoìúêÁêÎÑååÕ%©©¼džC*7Ìp,é– ë`îæâÁƒ÷îÝ»gÏÛcÔî0}úôqãÆ•––©ÄµaÍÒD·¤Ø÷‚úàïƒ>h;Û¸í†nÐÉd@A-r¼1‹û¶¥¥e÷îÝ!%ðVRSƒ5"Ò‹èNd2þÖÖÖúKgII †Âs†TiÅ)ÜPÀµÙ¿NÄ8þøã¡â¯+ßtuBãBIC«ñïÁ]¿^PuòûG.š_1o—Q]VýÃ?ûÁ?®øÞç7¿pˆ]3ê›JfO2©ü,%Fp!æ©éÉܸíõ·šþ>q\Ù¸eÕ%ɤL“0‡˜Éøœþ~yžk%wÝò¼fÍšuëÖÙ®2dÛºµ×sÜqÇ-Y²¿®hJ-@6|Tì(*&UáEsssoËØü~󡼼ܟ‚»víÂn¾ döìÙ\´óM¦¡2ò–…¸OÏa`õêÕx2q~ú©S§ÎŸ?Ô¨QJ·‰õë×oÛ¶mÿþ`á•Í›7Ûgâĉ¸/B¹x8¯½öž^ˆ#ØËnX=O>ùdüpGS'tÿi³hÄ‹óÆœsññ ”1í¾væWÿ0nÅ·Wþð#»j/j~µtþÔ¼ÒbÓ£^W^"ÝÚÖº~˲ÆÄÒâq5#Š*Š’I²’ôOØÊ„”À8%tÝ$Þ²eËsÏ=êóƒoø†©³téÒiÓ¦]xá…¡¸qL;zØÀ[o½E®‘èŸyæìÆ÷Ñ=l!¢èvss w­<ÛžÝæÍ›wê©§rä3>úhäCv[}v=ztUU•gÇŽÏ?ÿ< “R6×Ýu×½~ÂmOî{ÿEL©³¦9fĘ;—¯ëÀë—íè.Ÿ‡+ÓVÐ]ËŽî‡ò–UŒ)=¢°¼0/?/¨úJÉ"¢Xè«6–(žzê)¬Í&ÛX&æT{üñÇ/¸à‚ÒÈhtã*ê¾}ûÈ•@6ý˹CŠó÷™1c†ƒ¦ÇXë2­;#佘OÆn )ÜÅ‚ üÓ<+V¬ˆÿÝæ#ðÃÒ3ÐÆŽ€±cè3<Ç'‘#(>ƒQ/>þ±ÅÇÇ¿¼ÙÇÍúÖn[ýÐuÅ“æ™T›éy[½¤ vY»«ttYQe‘Ïín3ÓßO(pû„ßü±6‹+=4è'–ýìâío-×O<ÑG>Á’Þ~0DÝxqNvóG³†·j¼ùæ›ä‚¡‰ÎCˆl6ØhnÄŠ“‰H¹páB7 Z>Nqqquuµ{ Í“ª6ÕÕî’?,Oâ/euu{"«dúÔ‡øÈÊMµµžŒ§åÔ%¸º~5þ;æœ+Çd*biÕûºÔLÊ´=ß«òAØ[»-ên|(¿WZTŒ¨[ÇÊôGõB½Fªdñ‡?ü¡®®Žü®“&M‚4e{ñc1Í6;VåW—WØO‰ó}§öa>K礱óq[êË Ã”ÙGƒR‰4ÂE¾XE’* 5qÙfÉ’%˜dÀóçÏïììêü=1«À‡˜þe€7üõ??Öi¢‘b’ùìÃ>>1e} c1cÆX‹"¨Ÿpùû[‰Ú^ðäÉ“¹œùöÛoc7Lñ‘#GBé***Ca°[{{;9 E|'@tT®¸³cÕ ƒœ}öÙ8)_h çe7@— IÒ~ÞÐÐÐÛ2É—}î¹çÊ$ÙmÑ¢E¸*2øŽ¢8Ú—h×Wmí°8úÙ)ŸÆßº®úm­Û­Ýe(8lèjü¿oþÒé5¯ÖÅÞ †-ËJ'ÌÎtèV3yÙ0˜¼D2Ù¶kO¦½³dƤLw’QvÑÈËt¿]8qöÂ77<6ºZVYÆt·™ÄQ2ÙϱÐBž$+ëÌ™3 ÝÐpZr-`QLw·~ïåË—û;à[ÌßЉõôÓOûû¼ÿýï÷mw[¶lyòÉ'ý°`Âáp,í!›„쌻ðÅÑW³[È–ho|Ö¬YЦÁn%rÌã3jÔ(.%úÐÂFvÀ¹ô6f³gϽ[Ï;>!Dj%p/¸Î‹/¾Ëâ€`•+g½@‚L¿÷Ù¥¡¶cÿºÆõ€åà0‰£¶¶l»aæ—j G+ Lì{¾pþG3]µ½4˜HöJ¤™žæ5›y³;|°¡©|á¼D^*ëÀHdºë ÇÏš³~岎î‚ü‚ø·)†¹_¹ßó lC~T,çÖ–À‹Ú'Pˆ™Ün\r›:u*¹HJ|2,ÙÁA4¦•ÒI_Ö¦²råJ ?åX3ÀbÁCðÔúúz~”¯ÅÙÝðønNÔô‹8º *¢Õ¨• föG!ƒ@ †Ä‹åFP.ÞYg}Bàxί9×b€\±å+õkº¶ÛØÕø­ ·düeçÕœ#îÐÖÚ”JvåWŽêi|Ãäç'’ù=Í­ /­¿·.ùÇÒ±ÙGYmãóU§/Ì++é 7íiί=ª¨(Õ™N”&DW¢bu^o®z‘Âj`$" aéõÛñ1'¹Äå1’1A$òÓšìC„%.j:ZÛ½{wà ¦]h°ÿ³Ï>Ó ÙÕÕ½÷Œ3Îð'„@r¬U>‰ólCv}iB/yt¸Í§žz ëxÛúåÅêiÎ{ik4‘k†\qfüøñ‰í CßrPÞ¸òÜÈ+Æ_Žë7¾P÷ÐÿØ¥»~³­uÛg²/Dë«”ÖL4éæÞùšŸêØùVÓšMÏ—]òÒ¨MU½¶Ç—ê ö¨»ñÉ?–4»xê$“N˜îú¢ ³ì¯]]1)l ¥ù„¦y íÓšhdkñè?Ÿ£ðÖ*‘Ü q”ˆ¥”Ø0‰gœì`ßvvB_Å_nòã;­Mìô /[È´ìfGûAôõÉ8Ôçƒ $· $Ò#–3ì}s+È\ 8Ýìmf6öZl âÔÉV33»áîpø¸qã€É!07¸‡Vvt~Å\ükŸØñðžeOÕ>[4]óæ'‡½fõÝÏž4Û˜V\kÓªõí;ßÚ4ñ¦YSNøË¢ÚûöÝß; “»ó“7צn[»¹¬¶®âÔ°sÁØI3·n^Õ9>¿(?l™Éd¤BO¾?À÷FøH N6+òùQFJ±Çhä(hnNPÉywîÜIö±f7¡Å'XÑ Ðò÷ÁÔ[(þ®X±Âß ÐËYMÌîÆUAW$þñ1cÆ8ð¼ýöÛäz 7559xXÙgΜ9¾ÅeìØ±!F Z²nËnÓ:‡|VÄmb ‚Êí¯„É÷f·U«VMŸ>kµom&4^·,ÝÙ“_”]†•3åºS¿y:JK„ìú[ïÅÎ!ø~Ž¥“N®:É;‘—ð²ØÓV—¶ÌM£FªqFPjkCAñ+Z‡éÊb÷ǯK²û¬ùÁWö8ÀH„5 Ñù>ÀøY¸öeG#»áR­òÉK~øö<©'žËdÓ‚ì `ƒ@²:ÑiÓ¦™xUIÐ[PP€å BÁóÏ?OpÈãÑBÛèì†gNâÞëhÆ ¤9Ò ÅíŠñ—Í*›q÷›÷è»­©_ócsï_L‰N!ùó‰W¯ˆGÄ®geDf3,Ñ zÉgƒ˜gXʼ›^ÖÛæo'œpÖrwŠ×_Hnö[ÿ¤ÜÎá<„öwÉXüDXÀ˜ìàü¤ZÙ ë óYëU-ü72ˆoƒ\¡à¹Ä?»á-@Hj¥=öØcøwª§tŠxbDë¶wA ÝY³­²á’~ÿûßGJ‹G˜ û±C‡á·Þkig|ñ8üM奆rˆ¦ß9é￳ñN]E\]¿vCõ«ó*æè£A(½zâU÷íx þâÓ§¶ËKŒ Ž!©ƒö+ˆEBHz~€‹EfÀã?N8aĈ‹/ö.œÄH^…Ɇªr¯·ÏÄrˆ9G’Ù!*­#Ù RÙܹsÔ-̾شi>ô³¹ É€±¥ˆ{²8t»Ùðáš5k@›X¶È>V!”8p€œÑò*~¬_<ðÀÉ'Ÿ|ÒI')Éò b2‚£î#È„!ŠÈdCGýЇ«Öº¿½4U(.½xrÉ  Ñôæ¹_ý/¨ˆ}cŠÛÝ[îùΉߊLD\<êýî},Òês w“Î{~ ¦ß ÛMuíZzÙXDO<ñD÷3~øQyF9¾½âŠ+HÎ>·.¬ZµjìØ±½á ­­˜šxKæ‡]×op[íËŸ©à[Q"E¯!˜‘¡0Ÿxâ‰E‹Á|)ÑÆsCØÆEžsÎ9þP\x¶×ãÎXTT„)NV€Ù"ÇŽãp¹‚"Î%bˆõØq øáÞñ¨‰páÂ…öRÝÒ³*»añš1cþú·¸A<œ—_¦ Å€Û3anÃÖ²qΉíduÃ:üËÒãÄŒ»˜!mþxëÏt~çÕï}sþ-‘£}eæ—¿¹áöx,(„­9à)e#üB&óæÍã{9»)'‡ÈtÕUWAW!r/·"Ú˜ie(hA~N-¦Ä…¶¸ßšŸeÙ²e˜g¸ÌBÀæÊ+¯´èï‘Uæõìægu€ëü‚Öˆµ0r7nœ/•abqª$ÂÖâ‚ßÝœèå<Џ;Ð ¹­^r Øè‹aNƒ6p‡¬û Ãêêj¢]–.!ƒË´q¶òòòk®¹Æz&p¿ ƒéA„âÃþð;`˜1Ch– Qð¿wþê÷{¯žøÑm­ÛaÐÚß±t8ÙÂnŸ˜ø±HÏO*/¯7ˆwŸ\|ñÅÏ<ó $œ8g<í´ÓÎ;ï<#•*ÅßSO=õW¿úUèØ~ðƒÄ`€yfsáTF(Åî@Æ7òÜbœn@ÈÌàIQ‚ ë¼2ÜÎd½Ü´sÊ)§üö·¿%£á^Þ÷¾÷Y#m|O£Ýe7ç™±ôpZÖ1l¤u4w.ŠÌ@¸°Ÿ˜úß;üýÞ'²PŒ{Košó¿¾ûê?)8üáëwß:ÿï"-4“J'™£\Z§^%i‡•B‚ìB· ýÒ ,Lhü´bƒAûwΜ9ØçÑG%ƒ,^¼³¡¥¥…Ä$_ÙãKƒÄ¾öÙgãÅ‹/¾¢2bn¹ð !¬BÀ&fLŸÛq" Ðúr]³Š³„h¡ösà“T”€$Œ‚ëÁ@âµµÕl2qhƒ–R4q âáßpà H7nÜa/”Ap¸äuQCõƒÙ,+>_÷â§}Àˆ‰Ã«&^ñ£7¬ŒùTíòsk"<§Ÿœtõ?lüÇH4ZòPï­KäU?äwî¹çbÑðíÒ¥KÉä¶ôãlCŸ`1í0vìØá$ÆùóçÛ™Ão½õVn wVLµo|ã&ÜkÖýиT,¸N[ïÐ^€-ˆ*Ú/ºè"p>öwµCíQ3gÎä­Wìymm2Ýἑ—^z©os;;S-‹û|ëÖ­¤ƒ'äÆÈœ@dãÔNS»"´Ã²½¿¿|\„ºüç“>~{˜ {£õ•· ±iJ\6ÒÐ×HUë‰$9êî»ï>ãŒ3ìÛõë×c%¾ùæ›CmëxàÇŸ|þóŸ‡jäwnñËFð˜2ïI…lâß{€‡tqíÆ âQJâ›@›{î“Qjú·+ôoÐ* O芄I’þŸÂ–g}ŸZ˜Ëí_6ÿð¤Ê>=å“qvÆÖÔ¯ )‡ÀçEÇ}0Š GMŠ"ÃÃÝž¤&ˆ¡~ô’ä Ù@©X·n¿ÛÖìæÞºJ‡ÜÞóÄO@Ãüö·¿ ^µj¤»¼›Ò·4 4ý£áô0.~:R¶$§‹¬c§e'O{ͶwÒŸ sâ¢0R¾,GkkÖÿdëÏ?=åÏãìüÅ×ß¾ñÎ0>vù¸?‹0‘UŸº½u§.v÷µ­§¢oí`ú‡°…€êÞ‚ô^yåå졈s“M™:ujUUæœýKHÉX×ÕÕa Z]Èí°}ûv|Ž£l*(ÐÚ·«W¯¶5àüÃÁÏõõõðܰܩÀ;Æ@W´n·ñãÇCÒ µ”ñ©­†i5af›6m²ûÛÌz7Bccãž={œ½wôèÑÖ:mÚ1Á„‡JfÊaìèÚ†u?ÝúóOÅÀ!¨ììš%ËBéò^2¼@'Ã…U'Ý¿óAÕSHó 9$x!PbÂ!û;Møä'?ù›ßü&ä¡ÂD'9‡n>Ù)eÿÞu×]_úÒ—>úѾüòËçg?ûÙ ÜsÏ=!N¿`Ëo¼ÑÎÔŸüä'îsŒÿ•¯|…‹|÷Þ{¯½$È-_¾ãÛoñ‹_À>Ç·_øÂðùwܱdɬ)x ‰z„ ]t^ÿèG?Âë /¼pÆ ÷ÝwŸ5œà®$éã/¤kÜ&Æ|î¹ç¹+¯¼G-]ºtöìÙ€"˜ÿòË/·… ¿ûÝïBYÒšššž|òÉk®¹Æš:ñú¥—^‚FjM_X;,±dà «².骫®:ÿüóñ9^›l|/¤zÈóê*jÔl€¹.ƒßŸ×=ûö §:-rOÀ Bic@($ì¯B“HyÄL¨ã /¦|îiÃ׬Y)óÞ >mÚ4 dÒ¤I¼P/6Ìà »aÞ8ƒ>¦é¹Ù {ðÁ1Úm·Ýf1ë­·b‚â«_ÿú×øoíçØáé§Ÿ>묳H2»]{íµ€fðí·ßÈÁ~÷»ßáð¯ýëöp€aÅŠ‹/&ÌÓO?¨°nz€Ðà[ ¼}èCx£ð»qa§~õÕW-ZøÙä ðË_þ²¥M\?nðºë®Ãk¬ÖH‹×?ÿùϱáÖ€: ðúë¯Ç5C }ì±Ç\k ðüì†×ø‹·X¤€=|‹Çø|Ѿ}·‰£þý Ê0N*MïÄŠùÎø¹§mßk-›4E¼×Ò±ÅÇEÚi€¢³Ç,yh÷Ã!á6R"½xì‡îzãßwh Kàeðý.¾yÆoDÁK³¹=Å… Š]¯M ƒ'é …W\q…ßBÊÅ<³²®µ ‚÷ìç8—“íçgŸ}¶/ÄÚÙÍôUµÁ]k×®…„l£ð°§åI 8ç—¿ü¥­ ºƒ¹"œxk[jÚ "•ª%‚/¸àûÝÙH{ƒövm=åæìf! < zììì3f èÔl\<0æÇ âC+”â‰óïŒ8š;&ÔªHU|qúç 4’Ï/ƒçŒ>s×ÁÝ÷lýYˆÇþõõ»n™ûµH¿Æy¦v¥8>àq.åð#¦EÒ Ïcò›Â+î’|(ú0|d’¦kbH@ÈOà Óó ŠŸ @²êx ¨sÒ¯%[èè ‡Ÿgc#Ðå´l’»Uñùºuë,rÀƒó¹}ìc{ä‘G ![¡S ýVd¾¸h`6ëÂ~h[²áC°·›6hûãsÛ·"¨+‡ƒcñœÜ~HY¸ÐÊù¡¹ýnaÂŒo`¿ë&_£3¾dÜÿ™wó½Û~±¦a¸Ã^ÿÿ{ÞÍ‘×svÍ¿ ácûžˆ¼ŒÉ¥8''ú[GIÐŒ«Àü+_±ô=ò¡¦äÔ„I,«ý Œg)ŽôÄ…ôk›À”±m ßuо8á„ þÛ& @Ú¦¿xË–-³ùì®Úg>ó¼I>úè£Ðú ú2°wUö²Ë.#ežzê)|]Ú~â²+ì-b­(Ì™*ÖÑÜ0a¸WïI•ó#§¾Û°g‡ë%*kʆ¶I†Ëkÿ(’¡8,˜K&moÝ%fX*“Xr;d§1ý‹Y8“ 1–Š?‡Þ¹…³¢ï߃Žex³†S“í¿ °|æ™gð90ãÚ•®¢ ŽäïÚz¤P!aºÃ!–Ö‚ àY;*ÄHKPsçε»mܸÑZe p>ûì³`T¥‰š} åð§?ý)0æz’Bc´}<Ýhƒc§OŸþðû'oEP¼¶êß<ðÙÏ~ÖEà[—èüneBcúA+ñèpøý×ïUÄG÷>qv͒¼ˆ ¶³Âd¸±éµ¹å³´cG/^¾¥êŒ Ö5s)ü2ø¤Î¯Ï†uÞ!Ðwšùò›èÄö‘|Ä`,À€@°°wùå—câÞvÛmxmXBÍ#Þ¹Ðà—\r †½ãŽ;<|á !Ð…oA€+W®´ Þ~Ûç>÷9{ñf7cSv/…œïî-DMÜÅÒ¥K­!Ԇ„çwÞÏ~ö3+‘B-te°@ìÝ»÷Î;ﺀ1\§sE|õ«_Åç·Ür‹ý ‚:>9˜Ð/¾B‡úÄÄ«qMWŒ»ôŸ7ÿPü꾿ŠDõé#O ð¥ºU:«‚jgF,y見#I;NBz<Ø…¸Lÿ5 ºÁÁu¾Sž Ô²;êSŸä¶lÙ‚ñ¡ÝÿÚk¯½ôÒK¡Úá5„=Û†0ª­ÀíÞ~âŸ~ìn×\s `lƒ*¡þÙ2ªøðƒâg“hñvñâÅ®]¼ñÆ¡%â@»§è©õJœ9sæM7ÝdÎSN9ÅædAñÃ5Øjq¸› ¼áñ¬Í ìgcìSÅE~ë[ß²ögû­ýÊöZzǘpˆ'Î8.4™>Y4áQn‰‰³A?„)Jk6ÔwÖW©PeÖÙ pé¶ÖèÔLéÔö¦Ý&oJÌ ¤C5Ç’hÈñ¥\â‡$±¾|ˆ]1û‹Qð9´ ›ñM&7>w˜äNBã5¥°º™ ܱp &´G¹öƒ&ÜìÁøŽ]ªí¡É9Ðí`Gó£Þœ=ÆßßP³SSSc ¹öÉ[æ·>X0™à>äû¼«ÄÑ>äãç%ñíäÊÖT¸ÿÜ~ß_ÍøKýð Æœ{Ï–{ùçM]Mméöâd‘rleª<¢ÂCéÆ ·¯ðVÕ¾ÞÈ«!†:чhÐçXÃúÝŠÁ_&Mwgƒ¤‰Ñ’Tø4j(œoïq_9K #oTª¡=z´«òüîÚra˜É¸”ó~0DõŠÃÞ‚²é¡ð·í­»šºšËSeÊászeNùðm­Ûç¨éI•'.ßÿ¬DøT'ô¥PMf­|C6J'z¥jy+–3R3]#ÕÌ IGÖJ E‡:}˜$ò³+Qoþ…ñÛ«««]ú廄CwÖû8Ì&zù‰ä ‡ÕÉê×»wÝäGØ9%g¶ë^ÑAhÛhÂô+yØO2$®yߤÁ¡¨{/B–2/õòJ ¶H’¤­¼<݆i¼’»‘ á@1jÔÈ “›l\¨^±÷˜gBÏbq´–¡µ±œ 2#zÃRw?û“ê»ïDrý¾ý†`’8èBàBcH2T²”ÝBE<%c~æaäÂÁe`÷TÅóºOp–ªª*g}·‚0.ŠþSÓÕ<ìÉôä%ò7fGO‡Þl“Ñâ ´`R倨/d õ§¬SŠB^ ^oÆ1§?qZ T U”½H itŠn-à ~À¾…FaWž*áúL ™.ùįļKõÀ# ºº£ÞÚÛ^;¶ø¸Á]Ö––ízFÔò·W^[úqU-œaÇÑ…Zßœ«æ­mØ@p™‘ú0ú=ëůDùÓñ•è´ 4è7â,Dòn9õ…è ÂËò†OL8"nIb¾Âb¾o(1—-^ãúGe;¢¾ëA˜ 㨟e—p”øDíÓ×Núøà†}©þe}‡í­;}Í{Úöê ¨Q [ÃÊÄÈlBž¡¨ò)è°ÇEAßÕÎ{'q.âA¸ ¢F†f¤ŒÛi©6‡H¶6\)ŒýÞcBê©Oôi_Ž;X’_2ÐkSáX=9¸±«¹«§K¯ä=±dÂŽƒB©¬mwœX9OeGLË^@„8j¼„@"ŽŠ(µu.ˆ›žäþ*þ@?«›û ;‰å$t —CfÏHƒ ¹Z÷"M¯ÊävèììuÓ¨›…¤F†3{òkRè%ÔŠˆ+l!™“#\×î’†r¡Ú!’ôMS@`UUÕ1ùaÂ>ùL†áŽƒ»ÜõÛ+Æ ,ñnÿo§FÆ«M›u‚ %B3ñ pPB ‡Â:ÇÃhDåPÄž³òs9з¸ÆqøÜH6ÅÔé[8‰%F¶Xˆ‰—™1^ü7¯&êæ ËKlà@[·û˜áyðpô¶ødž;Ð[¿9&@jÑ$ÒB\Ð\à.Íaµ0l€q ÉÑHòšAä7ݪˆs$‘?2b†èf"H8’9‰…”Lñ,d·mûÈÇïø^Ó ©œÆqÖú›™_PôCèw¿ù“H\ h+‰jÌ4h©ÛGÅ lÃÂÐìï;'È“ Õ#'1©·Éçt¤MR<;ÝuòŸŠE”?­O,H.ÃdÓŽKJJŽ1Ì©N豃èdkêjþæ†;&–Œ?cô¢1…5.Ã}OÛ¾w¾T·ÚZP9m1ÚéÜ€â¼ÆLh‘³ã#ãBE9ÓíS¡^““ÇĈÈ•$å5E¹Ýˆ¬|ÉK*îh£ÒŽI̦ò ó’Éîî®¶ŽV“ì­ü›gòzLOèX mÇö]¹ºôu oj¸õ(˜ðª­)eð ëÙrÜ+ºŠ!$äK0jaO¹b¤ªÕ¡˜ŸÄHܶÏN& Ú`B%·õë+**ŽUÌ…8š8Tг78&“4Çô–9, ù~¼s ÑE=—µE5BÜ”¢k\º°JN$–ÄWô@rÍ~˜A$†8xl#0â(WoôBO:¹ÕKø ¯ÆÏ1°ùuGµòœýxACz.šŠM§M8<%$£Š3ž{öB¾ŠbEcˆñBú/ÀáЋ‹‹m• –ÓÝétW2™ìMô±coìhúØxFÉDöÖ%ˆh]™H-Cz\¨‰êÜÒ£_¼ª +%Y D qf¨0T(§‰Hì=þÎåååÇ<æ€ {L¦;ÝÕÕÝ™ìêÈKæç'Ry½éK™>±äØxFéžn Þ•‰Ô‰Qô@Åc¤îH!~ÓÝJÞŽ±Üî" ·þ‡¾aɯ³JV?¯Ë5jTaa¡yolƒgŠüÊŽ®öî¼ÎŽÎö^‹Lï-Jæ%ñúô–8²uCÃúÆ®†öL{:‘~O=;1-P¡Á8q¡&Cä@sqiB¬H"éB‰¶zÖ’/KRè¦L¸[gg'¤Pèï5$¦R)Û±±W.¨,©+=+sn:ëHw§‰-^L*÷E,êŠ}0Å9MÒgMÿZÑ¤Ž ?>7Qú/|/™èˆÇjŸŸ_TTÔÖÖ†¿â͆à³àJSŠoƒ A1Ò¡'FÃ)E.LÀ-2:+¥ß¬7â=e‰*bÅzýõ×ñs±«« Ϥh‘žanhúl¤Zë ’9T¸5’Ÿ7TL‰ ÙG¯›@@ÞâfÝ ¸}×’>ÔC—{#xL wÁó¬'.q¿b¨ìEÌ”½¯=‘B‰AˆƒS w?õÈ¿7¥ÐA2!žÝîÝ»mïEY›În@£h çÐÒ¨4$âa™þþbçMÒ*Ò¨ÁŸDd²‡„¶Ð(>If72xœ¸PÕbHˆz1áižÄ¤Tµ«T(š[Èc5,ü¤°3§¬¬ì½ÌfB̹ºº:^ÔÔÔttt@(-..Æ£Ä xKê7›@½w± G‘M B…NhÍQdcÝÁ€ådè´P´ é$.Tq*/ Ë0R½P’Á`áî’LT޼é_$›HJª‰Ö&n°1ý“zÁÃâù¾ýöÛxôv.âÁA ]Ï›iY^:Nñ颔€!‘ú‚FM{÷WE’4èôb· Âþnv²úe9ã¤2ˆjXÈcÂ鈜äãÔ!‡DúC}wyV õµ˜a&Œæ@ {:ºÏýŠ·|ÊŠ!üB”¸nàáP .2žbC×ÏÛÐG‘åBSÙ¯ÏË E~Q Ñ6£È¨|·{€‹ÆLnŠé4áRNx )siqA¤8p Tªˆ¨y>Kø‡8w¶¨¤ùbžé_É ó'½·³½ZñRýÃí>NÜ"ŸÛÉáö÷¿òGóß’º÷¾8Êa²þ‹s7T¶P™ßŠËž7~ˆ“ÛnÔ’¤\{ …8|uuµ}€Ãð‹%ŽZäBš/⓾ ¦ éÐÀk"©W‘ ·•Ûb*¹³œ~C^ Ç„~ŒÈáêÜbõ)"9G¬–-:Zò&»JB-×cyœO}âÒiÈ"e½¾"=¼E0!æ¢íuÌÕEÚä;øœC³Pk>ŽÅÞÃÏB ¡)Žs7 Cã+ T^Ù/dÿPäÌPÎèíàXâé‚¢°ê0A,1>?‹6‘Àa)tLîß¿¿%í Kœ3üqŽ±àŠ‘Zóù‚¢_²Z±èˆ•?qñ~‡ÒC—_×Ißy¥s‹±©W§æ%›Br¦èpÆ »1a•hwDœ‰s¸xƒB+++‡¥Ð0!–«††"=†Š½sù-dºäV¼!Ïž(ÖÖtZ”ByÆ-¹`~I¡Î-:™èÒŽpB¹¼.4Ì7ÅLŒXhð+ ê™"[>Ùì¤a€ ÀÆÆFç3ý‹±Wž_ÉOô›µu& qˆBc(šLTÿ"EeÑÕîwkuÔPŸ”1­ÿ‘¡Ò¼Ø„n€1RAÑø’BÅ‚¿¡Ô ß1¬€ ­-ÔB1þ”å<ã[,¹zFDPr¸a]¦uO½¨¹‰}äC–$]Ô+öFvn1RQ@¯VgEb/5ƼJQMT%(®Ø³w¯ï@~oFf† žEêŽs_~÷?Ò¹E’ ·v0áö)Š*ÅK¤)~²…êÓÄ©ï"æF( GHØÆWÅÅÅÊâ;¼ nWð—ë{ŠÀ~îk€Üì*vÈ3Ù^ªØ­—Á•0 él"*B%¥M @”(¦DµÌLÈ£ÛND;Š¢êåmœÜk8ì<ª. |èO/%°3$݉=É8`ìÏÌi3ÔyFLnô+ÙÅSŸ;#±ÄøÆÜ_§T¡&ZY($Z [ãÍ›"ef1¾Ü¯vÃõLî´çµ¹¶íä0NŽÚ­;»Aç!2"e™@-mbÙ̇Ÿ«ð%2°X&”ˆ¾º–hÞ¹E˜.×EŠ"§…ÆŒ/õ¥S?(‚wÒ&"@(™,@ÐÛÛÛ‡r¶ÿįwTœžIEND®B`‚quiterss-0.18.3/images/starOff.png000066400000000000000000000004751265173051100170500ustar00rootroot00000000000000‰PNG  IHDRµú7êIDAT(ScøÏ€¢q›²šºð(’XúpÉc)  ™ªZ¯»ô5·‡‚HÓ¾üÿòÏ##¯x¢r"{Âç÷œþñï?üø×{:b~dOTÎ+°‚Ò›_½þóåÿ×ÿ0ðhÎË?_}”+xÈiTxå×4på—QáCN¨¸´B·=@–Þö@+” É‘|‚Ó‘¤OãDñ…©Ö’È í0ÑBQ`îqáÝÿÿÇ¿‡- [rüûÿÿçß™y (°Š9ùgÊ)— 99—Ši§Nü±ˆAQÀ§¦š*cË*ÀÀÈÀÈ* c«šÊ§†¢à>Ó}¶ûÌ°Ð»Ï ä1¡(À 8!‘G˜÷ÔIEND®B`‚quiterss-0.18.3/images/starOn.png000066400000000000000000000010341265173051100167020ustar00rootroot00000000000000‰PNG  IHDR(-SðPLTEÿÿÿööö÷÷÷óóóÿäËßßßßßßãáßÇÇÇþöíÿöî›”›•¹­¢ÿèÔÿéÔþðãÿðãš’Œ›’Œ·­¤·®¤þÒ©ÿÓªÿÙ¸ÿ¶r55þÔ¬ÿׯg;ÿÙ²ÿÛµ?% þŸDÿ¸vW1 W1 }B ÿ©ZÿžEþŸDÿ¶rÿ¶s¢j+¢m-ÿ´pÿ´q”Uþ§Fÿ«Jæ†!æ‡$ÿ?ÿ@ï!ñ”(þªJþ²[ÿ˜2þ8þ®Gÿ²Jþ½bÿ»`þ¢2þ¢7þ¢8ÿ 9ÿ¢:þ·Oþ²Eþ³EþµGþµIþ¶Gþ·Iþ·Jþ·Mþ¹QHuºÈHtRNS &&**25==HHU\\ejlqqx„…ŠŒŒ–—ŸŸ¤¸¸ÄÄËËÐÕââäçççîïðôôúúüþ+­A“IDATuÁÕ‚PЭb`w Ø-vwAðÿÿF†û‚3ºþ©´ñ%t8†áài™fÙÑ:Æ_í f‘6v«>Ñí›í¾‰ðÖÎO²½.u/,¢¼$ÛBa“údëI`ÒcÒ¤Ó(¦¸7Nªz2v0åÛ¤‹7¦×˜¤’ ºÜ¼’à <,¼Àá‡dþ®­mÞIEND®B`‚quiterss-0.18.3/images/starSection.png000066400000000000000000000005531265173051100177370ustar00rootroot00000000000000‰PNG  IHDRµú7ê2IDAT(Sc` þ#ÁéYÓ»ùh ä%>ÜÿX^‡5¦þÖ¯@PׂCA¦éá+ÿ}ü¿ö²±ªžÌœôžÔùýGï~»ñïÖÿ»ß&MŸÙ“™óŸ¢@zë“Gß?þÿúÿåÿ ÿ.ɯÿßý¿ñ}Ë“ÿÒœV…Û?Ÿýéÿ¹ÿ§ÿ’—þŸý¿õ³UáN¨¸ B\¸üïì¿@xöߥ .„2p!9R@°rúõÿ§ÿûw H^ý_1M@ÅöZûwœûøÿ¾û€ä¹ÿûvØj¡(pô8øàðÿMR—¤.ÙôáÈÿýì=P¸Älÿ5óˆ_——œ_Åì#Û9Å (PÓNU´e``d`dP´ÕNPC I¦ÿlÿ™áAÌ ä1Áà"€àÍ_­¼IEND®B`‚quiterss-0.18.3/images/tab_go.png000066400000000000000000000010721265173051100166710ustar00rootroot00000000000000‰PNG  IHDRóÿaIDATxÚÄSÏKQþÞÝ$þhkñ$ö/(¤7¥P±‘’RÐJ©à%ÐKïæàÁŠÐKoíQˆ µ¥ÝHHjDéIS ÖVMKJ-TEÉf÷uÞÆˆJ‚̾™ï›oæÍ2¥.c—4Vv‚#‰{EÛžuU¨ )Üõ9g–ˆ$cæITƒ¹`¢‘v´¶øß§;ÇA§±Øú¼~3Û.„“C!S긮}МU™…=pB3vŒ‚ã6?3t´Þn F¦ðj:=KÁjwZvsS²ùC4x¿WÂï«¡Š>4Öð×e>¾ó žÂ4–²}ÔdC•ÆÊ²Ê_‡6ê=T2…ð`-ÆÏœ ýHŠ„XŽs]Ì­NPή‹“Áç‰É£# ’+Ô{9É'¢Í혈?}‰¿Ö‘H8Ä$¸™ü·û!8Œ˜”¤¥·+x ê·©NRï\”†ø»°ŽåoïOf騷`$<“ã~`‹Ùñ^©‡•ü”“^»TDÜ€Aíì±/0®•ÀŠZ°­’/(åÝê8û¡;æ@¥ c”ûÒ@Í[,O•üÍm`þ#Ìôb-ÙÍcr÷tŽAMlC § îÆ »¶3¯PÁ6NzÆïT9…UŽÒÕ×3«üVnõÏirvåã?¹ò¬±F< KIEND®B`‚quiterss-0.18.3/images/trash.png000066400000000000000000000014251265173051100165610ustar00rootroot00000000000000‰PNG  IHDRóÿaÜIDATxÚlSÛKaÿíÌîÎîÎj¦ Šâ¥ž z2m×Ö[©+>$ÒCôÐ_!=±ÑSOI‘´EàZ†’.®¢i‚â­ZRVwÝËÌ^æ²×KÖaÎÌw¾9ç÷ýÎå3ô÷÷ã¤!ÃÏÕƒUÒYq«YÙìñ†a`4²ƒ Ëu5¤§Èÿ”¨`àJú1ÊÖºŸÞ© Ð&©‰l¤2ï¾üînÍø!3fòþ€ü³†û2-2´~6ñ»)`}x<‚D{²rà£êŒO 1óv{±šP¡õ{uÕx1¤ ¦¢Z6*åÄóöçQ1ýèˆA–6Y–…ª*ÅõÎëÄÄíÑ8&¥,.–œAEwpÕéÔ|ÏsÁﳪÚ-Ë2  °E"X\,€QaG0ó-ö|p–³1£©S/®‘‚oMæn3gC]íˆ)³3SxØvUåE”¬gu¡ÎRQTÈõä+«?è0ØÎŽŽ+Ÿ—G¢Ñ(ÎWWBL¦±´´Ÿoq+ëëØ‹Æuï/JË˰¿·†ò)miiFScAÔ„·=ÎLf3IpœŸG>‚¡:õôöÏ…öJ‰D{vV+‡X")“Ñf`à52 Í-­ºs{G—Nû­× ±À² ¾ÎÍS[x°"'IÒ]®F„©˜ã_tÛ74¨ÝêéÁáx2ZÕ—WW˜ž†ÅbA"×4cc£1¸ÙîÖ¿1 Ö…Žkh»ÑJA@,G"!Ð8ˆ Ÿ†}:àIYE=“µµ5O$¼­Ÿ‹ H§RHŠqÉ$u# Y–PQY•«›l»;;Ø mjó³¯z<žwùùùM‡•a’ã¸BÊïÒïMlmoÃ騧âJú¦ÓéåP(4Ô××÷Ê‹¹@ZpâJDs÷„Çÿ…ú]ÒðÀ]X¿d|°„IEND®B`‚quiterss-0.18.3/images/trayNews.png000066400000000000000000000012171265173051100172530ustar00rootroot00000000000000‰PNG  IHDR(-S_PLTEÿÿÿt¼vn¸a¢fÀj:»?<»@<¼A>Ôb?»B@Í\B¿HC¾CFÒmLÁVNÀTOÃORË]TM‚T½PU½PVÈ[Y\‡\Îh]Ìb^Êi_^_ÎlbÎlc_’cÊlcÏldÏneËmiµjµk¶l¶lÍslß‘tÏxuÂ`~+Ä~.Ä-Å€Ô…Õ……×…ˆÙ‡¬{ڋٕٗ‘Ù•‘Ú™‘ܛޗ@âž@âŸç¹ ß¤¢à¤£H䦴^©±a¬Zç­Zé­ã®®Zê±cë³æ¶´æ¶¹sì»è¿¼èÀ¼èÁ½éÁ¾xñ¾¡B¿ëÁƒíÁ…îÄìÇǤLÍ¡EѤ‰ÑïÓÒ¢HàýðèèýðÿÿñÁRòúóôª#÷Õ\ø·?øûùúÚKúÿÿûÔLûÜ_üÀZýÝaþ¡9ÿ£9ÿ®/ÿ»JÿÇzÿ˃ÿÓÿÞ¤ÿßoÿßrÿߤÿÿÌÿÿÿB•0ëtRNS1—¬Éá·–2ÙIDATWc`ÀL¬jtRNS[Š*EDIDATcäüÎÈmÊÈuŒ‘kˆ²" ?ZÙm0ŠnIEND®B`‚quiterss-0.18.3/images/triangleR.png000066400000000000000000000002041265173051100173610ustar00rootroot00000000000000‰PNG  IHDR6!£¸PLTEÿÿÿ°¸ÉJU_JV_1ÿÍetRNS[ÏL¢!IDAT[cTdr*Æ@ÂÙÆ‹dFÉ6û^ ¨IEND®B`‚quiterss-0.18.3/images/triangleT.png000066400000000000000000000002071265173051100173660ustar00rootroot00000000000000‰PNG  IHDR6!£¸PLTEÿÿÿ°¸ÉJU_JV_1ÿÍetRNS[ÏL¢$IDATc`ÆÆÆ *Æ& BÎN@1E¨HJ3ŽSSïIEND®B`‚quiterss-0.18.3/images/updateAllFeeds.png000066400000000000000000000032771265173051100203310ustar00rootroot00000000000000‰PNG  IHDR szzô†IDATXýW}LUe°@0®BYh~`Z6QÙU+4™:+§B©å×,t~ä4u¥²pºH]"(Ü{'¢S”äkˆ0B§ Úò«HÍ)6mæþõô{Þçî˽ºÚ<Ûo‡s8ïûüžßóñ>W©ÿwu£,E”d;ÔÏô½Z~m•ꡞÐeӆ–Ý:@ÔüѱÑ"Í“U|ÓåQ›ÐnõÞˆ±Ó¸{ƒx[Œuþ@8eâ9÷5¢ƒ‰ ÇZLtý ѵ,¢£ ²]íÂw~¾„‚ÀßT¿”èv1¼($ºYÐ9n‘ÿƒÖ…h‚Ý=€  Jó#râ¹f6Ö&jZMäP²£^ £Àô*@´Øìß·óµX¦ 8ñnOŒ„eõ‚qÀŠoºãn#º¼•èj:þ§nx#Á/#ØT‰ãç “Ü­“@¸›À @"Wd{hRP£a Ñ• NÒ›¾HDÜOV9t0 v…QÜÜHÃó6%ÞxècQ œ€D2¡Dãz¢Ó ‰¾SYåD—šj¨Þìn±È6bk 3XÞ_Úfæ€p`ã)ìI”3dÜ-ÈŽ’{+ò';˜>S/w¬Žxw‚êæŠTéO 묞nðs&âÚ¸„ÚØ€)“TÒÃU­Éì GE !Ú‡ªØ-`RÙP©ôm¢sHÊ4u{H›õ¯'ªHí=W—'9{»ÁÏüžËÌ­oÒ x ˆ‰R“ñ¿Ûä •Ò<ô*ÑÁ¡Þwß@¢–l¨ÕƒÖ¾¥ž3íûÑ&µŽÊPÃM%“;ÆÒeñ¬[hU@R2î~QÀMb__¢Ã#Ab¸ T1‹¨€M3‘áè×0}E îígX;’ldôlZ:Õš„VTTŠÓý!oHX1B”á0ìÐa”v ¨±Ý û¹cDzåÀëTuîîWêe£Þ+>àšöFÀ$ñâƒdõí‡ùc‰ŽØyv!r!Õ #ç Óíµiˆ–2ãÆl]AäŠWKðÝHÔ+ZZßø É™¥âÉHT<‘¨àu&ƒöܸÑ$ÀÍ ¥Ä T&‰ã³cÑ@nVøöj¹Ö\ìC…~: G߉ nŽG,²&2ð!ñeƒy±n”N1.ÒH4¾ÇC³À¼üQZ¥Øçžaœ3‚røL˜ÓˆJ& øï“óÛ%²œhE`W0Öü1DUƒq45-UMŒl1NÃ6ɵÍëù4åžßíâr5ŽÂ‰ÚÏaxª8h¢|†,QÑ8AaœÈU7Ÿ“Ðåë4ÓyÄÇx‹¹´‚ÏŽ‹&:»³ÁtAÙ»‚ò÷…D¦›@˜^7\âU2IÀÉä.gè<˜?J=ëƒ@¸NäŠx|¿=^”µeï‰Ç3•bïqš¤™G¶–•*•õ“­R1¡Ú%8Ísû¼îCÉ£êOa$.í@WÅüP·Xž'ÀŒPƒorûÛ4Ë00n€Š!‰òx‘È”KË"-¨Ë™{Í1Su÷N]²*Q*Ê4x|޼ӸDE٦و¸>I®P]ÿ8Ë ÈW…®cÞ;™ “ßæÒ·*Ör¢ :¨ur¼œë‰ê¹’Å£y¸©g›Öc94i´šFŽ®R"Us,²%ˆŒ5`~ 1ýÃ…ÍÇ‚f"uk#pz™ùi‘'j“ð~ÙX5kži7^óAr£Ê§"»HÉñä2dO)+†•BÄ=Ú4®‚†U8-¡B]’'˜bߺNàVÝ1Ÿºµ= ÝÑ^ó"fÎ’šà¦¢%'r['#V í¼exf™'ê1®ŸZHÕ Œ9Ôc\÷36³Ã³VªNÖL„eµ‚ßY¡Gøvš“‰Î~)Jt†ß‘Ìõ ¾Uñ6ª›ê”Ý_T9C64½:½TÀŸ]Ó^NÎ_¶ã¨ÝLt¾Î¥ÎoÂhÏ£ú*NäÒÝÔƒ„ýÎZUL¹Ñ¢• ìÝjAã+0TE&aþ¸é iÆ=]WÒ ¬ öušñÆÃcÔGX~£<ÓÕ³%Îç·ˆ·î~bPqÀ„ÇÀ›À`_Ìœàûò—!ajZC’ÚO¯j/w ‚ýUoCÊóÇÊc Ì8Ôüõ»Ñœ÷BÆÁã´oxc¶Ó'qù­ÓfñÔÖn¼þ׿ONñ–!°ôIEND®B`‚quiterss-0.18.3/images/updateFeed.png000066400000000000000000000014601265173051100175050ustar00rootroot00000000000000‰PNG  IHDR D¤ŠÆ‰PLTEÿÿÿ%(A+#.#/""435E 6>6w9A–G«Q«Q¦N£Mÿ™ ´TÀZïoþ†îoü{û{ßgÝgÞgÿŽÿ‘ÿ’ü"ìmüz÷yðx ëw þ¨Dþ¦?÷rÿ£4ÿ¼YÿÃeÿÄeÿ²M÷rÿª@ÿ°JÿŸ,ÿ§;ÿÏ{ÿÔ„ÿâ™ù‘ÿÿ’ÿ•ÿ•ÿ•ÿ–ÿ—ÿ—ÿš#ÿœ'ÿŸ,ÿ -ÿ¢1ÿ¤5ÿ¥5ÿ§:ÿ©?ÿ¬Cÿ­Dÿ®Eÿ®Hÿ±Lÿ³Qÿ¶Vÿ¸Zÿ»\ÿ»_ÿ¾dÿÀhÿÁfÿÂcÿÃmÿÇfÿÇrÿÊvÿËmÿËoÿÌpÿÌ{ÿÍtÿÎsÿÏ|ÿÐwÿÐyÿÒzÿÒÿÔ~ÿÕ„ÿÖÿ×…ÿ׉ÿ׋ÿÙˆÿÚÿÛŒÿÜ”ÿÝÿß“ÿß™ÿá–ÿáŸÿãšÿä¤ÿæ©ÿèªÿ鯮|Ð?@tRNS -17<>>@@B^wx|“©´´µµ·¸ººÆÆÆÇÌÐÒÖØÞáååæèìîïøøüüüþþóAGIDAT8Ë¥’»OÃ0‡²uéÔ93 TâGbb@* ¥¼‘Cì\h^ò«)±À-Iô›òørþÝ]0êÿAÀƒ3÷ îèôäx¹­‚ƒÔÃó‚ ¾lÏ ÔC"¤ôä'Ýd_HÕ²»B_Èß± Ö I’«‚7®ÿ‚À5*'¨oÇž%8!÷}¿Øi Ãaz-a–³‹ðvïÕlëè\–³Ì4âmSªí2fçûê›ILårœEW»_ß_Œ¯¶Y&ñgÞO8”?ç{iÚ˜nCÖ6( „¸Bˆ)ÒöQ'Ižl©GA“®]¼?¥¹ví\‚·¢ˆu ÂkTTËOæÅã T»âÞbIEND®B`‚quiterss-0.18.3/images/update_page.png000066400000000000000000000012471265173051100177200ustar00rootroot00000000000000‰PNG  IHDRóÿanIDAT8Ë}Ó]htÆñÏÿœc®)S,ѦKˆQ¤2 ‘¤vÑEu£Ån*­.z¡§Œ@9¬Ixa/Þ„½âUˆÓ“™¦Q ³²¹­ô¬¹¹—ί‹³7EüßýøÃ—ç÷{ž'E„”’½h29Jc‡”äÓ:'þRD°#“SB äH›$ˆVáÙ#œë }'—»÷¦¼õez¬ˆ×ãÜþˆž¶ˆÞÃ1© UÄ;Ë"¾ÑûUÄžïO*H)‰sÂÂUœncíóÛ%½>® Eˆ™Dó–ðÈ6¾xšâÒDÁV OÒu’Š*jîæ»©lÿÒc›W¯7¤Éà%ŽíáÞøºåíÈÚlöbzöS1Ê'Ïý¬Òí€|»ùvÇãÕ`ñp“?NS·–°® 3 þܹô_pß.O|Ó¬cšÃø}ù‡¶|ŸhrKÿI”{˜½€‹'}ÛãDõ6k®²ò­L6½VúÍ•!ªæ3Øw ` ›¹µŒÔ‹Â©ìt¯Ë„R´¸UM=óê¸ÒGLFºÈ¢;9j;^¹ ÒÂeEKî§xáA’‘2`ÈA—»-¨g郜9ür´ö&ï¥M~„<úÁ ½üØÆ¥.¥¿|”ƒÝ goTÝ@ßY~—>oöÓ¾fL弫£<æfðçQÙ¶æà™Žn\n¯_>[玧øû,÷là̾©þCöfF‡¨¾‹þú9t>M+SM¼i·ªÊ‡Ô6r[G¶HùiiÃMã÷J(K×´±öÓF«_é%³¬’1g¬¼^QÓuê\‰E¨Ÿ;oTõÿvMý<ýj8IEND®B`‚quiterss-0.18.3/images/warning.png000066400000000000000000000007571265173051100171140ustar00rootroot00000000000000‰PNG  IHDR(-SÛPLTEÊ‚8Ë‚9˃9Ë„:Ì„:Ì…;ÿÿÿÊ‚8ʃ9É€6É€5Ê€5É€8È~3Ç~3È~3?Ig?KdLUiP\wS]lT[lÇ|8Ç|9Ç}8È9É~8É‚<É‚?Ê‚:˃:Í„3͆;Ô—[Õ—WטSÞÈžä¸zæ¿é¼K꾆ñÄúà£ýèÁÿÃ2ÿÅ'ÿÇ8ÿÈ=ÿÊ:ÿË4ÿÌPÿÎDÿÏ=ÿÏ@ÿÏFÿÕKÿÕMÿÖDÿÖMÿ×oÿÛRÿÜKÿáVÿâVÿãUÿåVÿå²ÿèžÿéUÿì¤ÿðÁÿóÆ(h tRNS !3DXm”»ÏÏÇ\„÷²IDATUÁÍNÂP€Ñof.––JÆŠ1 úþÏdHÜ7–˜ý™;ÒeÏ‘;æR0±'g¢L¼¨ªÂ™$nrõøJï7éaÿÉ~8e@/+k[«J̈eóñý+öréFÁŒñé¾ÏQ_EZCñõjÓ§ˆÔoVkÇ´h?š«etÏÝÕ-vuè"}ý5*}Ø9Õåv05'‰Æv¨åý@FÔð(Gy# ¢ä T’”Ì%gîíÜBä­œæIEND®B`‚quiterss-0.18.3/images/world.png000066400000000000000000000015511265173051100165670ustar00rootroot00000000000000‰PNG  IHDRóÿa0IDATxÚd“{hVuÇ?ç=gïmÛ¥Y›Ûœ—h‹ÕŒ˜t³é’+D$pA£5" Jéåˆû#h üG‚ ¥½SØ"¦Í\n“šlï¦{·wWß빟Óï¼6˜õƒÎïw~Ïç÷<ßçy$þ³Ö~ÒßeÚò«¶#Ãù誊âC“}ÖÑ™Ÿ|sõ]×u‘V6½;TCŽ<÷D7/mYfcÙÒί¶5b^;ݱôçDŽOòŽaò Â6W¾wì}¥¨l·$I~ÃDÎ)/vrîä쑽_ˆ;cžóÿ¦qÕªVêUhÕ™h'WÂ^=Îÿ0ûo“]µôIEND®B`‚quiterss-0.18.3/images/world_go.png000066400000000000000000000015511265173051100172540ustar00rootroot00000000000000‰PNG  IHDRóÿa0IDATxÚŒ“[L\U†¿sf€:™VªèLk )ð tZ*šªªm¤MLûÀK“6ÁL£Æ¤1õµkÒ&MÚø Ñ^LÔĉ…¢õíjÁN¹P.Ãe.ç²kD ¾¹’?ûœ½óÿk­í­EÏt å«ô˜í˜ï;J¯÷< ]Óÿ†¡«NŸaŸÒu§[ÓëÃ\%{Ø}þT¼yÿöWøÐÌ&’S™~zïíªï¸vêærfã%Ó°N¬1…‹ãª‹f 0~þðN^Ц˜ÛÃÐL)Ó˜²¾¦|Ë‹”„ÑÚÞO¥7°^DWžŠ¦/Þrp7…·¦™ÍαÂÛ}žm·ðíàÇ|IN<€aºqå1ÐV\Û>WùäÔn6Ypf™·EÅoðxÉnÝßÈzýdìüà0Ÿ±oçÛ¸¶q6çѪ€¦ï-/ÝÄÄ2L.o”¾ŸaE’t&˜X,'m‡±UX2Ckwe[®£ôüç< r0þ|–\“É”b.« þ‚ç “o6mè@—,…ÊÆ«¨Û w»Å3‚èž)M(tÇpè#f\Æ’bZjV2€Ï·ŠÞ?N20݈%‚‡êN‘Ê£æ[ÔæW±§`‡´àzDB_0–¹M"™âöäa üð½\/@ß—ç(Mh¤$‘Ò‚4Tá•íí¹ÿ¶¬+cÔ­Åë­WÞ«É+Œ’g¤If6óùÍÏýõUÚ޼ĢÝžŽëI¹z˜[SŸ²oÇQ¹'Ÿ4ýù0¸â<Àeï»Û‹ÁÕèêÜ î9Ÿ¡N¿„XVxZ”€òDÝ™Çl¦gáétaÊÛªìêö³áé€gÜá°ZŽÕ °´ˆM Í'6øø1²ŒŽ“U€« ˆMÀ7þÍWƉ° ˜»08Ñîí;ÕZŒ^$ŠR°‚ «ÈšQÜUµ,‡Ö\ÔwCVæó2Ø1[jiš=öSÁÞ=ëïrøs îç+ߖλû_“½€YãèN?ËGñê}èÒ£— #ÿÈA4ï_ØeJü`11¶¥3JIEND®B`‚quiterss-0.18.3/images/zoom_in.png000066400000000000000000000013631265173051100171130ustar00rootroot00000000000000‰PNG  IHDRóÿaºIDATxÚ”’_HSQÇ¿çþÙæ¦SWkµ©1,e™†ièPŒÔÊD"z_*ÈžÍFAš!T¢BúÒ£/’PPLFQÔlÿÐÚœÿWVjS·ÝÝÛÙJ¹Jýà\î=çûýœßùÞC «ážmRT¸ )ªÚš$ìa¹ö‚zG3v”$I ›ή²ÙÝæCF³µDoŠ­R3˜…÷þz=sEMoL¼ï<>k>VnLÌ©Â#g †æÕàyŽc`5­£.o Ëcð¹sÖ¯Mró¶³¢M—‘eÔXÊQ÷|Òô{ÑqnZ« ¸ZœFµ wœf¤®€.ý 1¦—wÁD"­…eèvêP“«Ce¶k´û3 X# x%µšC¿/™eˆé·$QT2:-†É(LOÀ÷¡Fj•‘øà‘ªå16€MÕB¤z9€Dƒ°…‚XÕ×Ú‘@JžCËí.„6B°Ý·!D~ëâz9@º ÐÀXø—#èyxa ˆ™ïv7!‚?Eð‘˜.B;؈J$,*Šõ W YK „ß9ff¨O¤ ïÇz`a¬nË`f)Ô;>䯕ýn,øW€µ(lltg +A *•p`Ôé†FÅ$ɱ~ŒO[ÊGŽÍÒ›ròñäG &‘ š§ °0^œ$vx‡‡1í_©Ó¼³{PÚä ò›˜×ß\aÏÈÐëóò3‘šHo‰ç¿1âþŒÕÅT•¤–Z`yNû'5Ø ÷0v¡m°²«¾´Ñ7õå"E+¤ÍÛzfŽOªMó3¾øŸBî%D¥ñ­#ÈËH‡!–lŽF ¶ïÞYWm† Ð&cJm}679}ÞÚøŠìü« úZk\´;pŒˆ—}—¿ðôþ ‘½OЃ¿š,¼Êë §IEND®B`‚quiterss-0.18.3/images/zoom_out.png000066400000000000000000000013611265173051100173120ustar00rootroot00000000000000‰PNG  IHDRóÿa¸IDATxÚ”“]HSaÇÿï9g;ºéÌåT6] ËX¥*¶ C· ))è"¼É@/ºìû¦ ‰ºd7uç D Š’®ÖH%‘.ÚüœÎØd›;Ÿ½›lA<œsÞ÷ÿüÎó<ïó¤Ù÷—õ]ª,݃*gí-v‹°\wUûH'ö™ªª »wÝbí˜Ùæ8b²$wi0Z„|kþé¥Ú[Ÿ-Œõœ[´Õ4˜sŽ7âÅx´òa9*a.B¨HH*âq‘(h€ #˜ðø Ïbr3×Ý_Íúƒ«ÁÉq<µ½A9?°È#’౱š0êG‹ðšÎÀ"Î&;FÝõêÞ î<+:CV«ÉTy² Ùù9tJ”Ôvt#оߨ\Y@ã™ÀÞ „‡áú‰ÚC„ÛL^év¹ÛÏvfW¯ÒîkwA‡u“6"·¹dX¤N -Õ©Œ vÍL½(YZÚšLírÑÛlõ†<Ìêo—~Í_vt|$ûÿ²ªþÇMÞälpŒ‚ß×^½Ÿîû@ ’ö>C/Sô³.nY\òAIEND®B`‚quiterss-0.18.3/lang/000077500000000000000000000000001265173051100144045ustar00rootroot00000000000000quiterss-0.18.3/lang/lang.pri000066400000000000000000000023771265173051100160520ustar00rootroot00000000000000INCLUDEPATH += $$PWD DEPENDPATH += $$PWD TRANSLATIONS += lang/quiterss_de.ts lang/quiterss_ru.ts \ lang/quiterss_es.ts lang/quiterss_fr.ts lang/quiterss_hu.ts \ lang/quiterss_sv.ts lang/quiterss_sr.ts lang/quiterss_nl.ts \ lang/quiterss_fa.ts lang/quiterss_it.ts lang/quiterss_zh_CN.ts \ lang/quiterss_uk.ts lang/quiterss_cs.ts lang/quiterss_pl.ts \ lang/quiterss_ja.ts lang/quiterss_ko.ts lang/quiterss_pt_BR.ts \ lang/quiterss_lt.ts lang/quiterss_zh_TW.ts lang/quiterss_el_GR.ts \ lang/quiterss_tr.ts lang/quiterss_ar.ts lang/quiterss_sk.ts \ lang/quiterss_tg_TJ.ts lang/quiterss_pt_PT.ts lang/quiterss_vi.ts \ lang/quiterss_ro_RO.ts lang/quiterss_fi.ts lang/quiterss_gl.ts \ lang/quiterss_bg.ts lang/quiterss_hi.ts isEmpty(QMAKE_LRELEASE) { Q_OS_WIN:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\lrelease.exe else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease } updateqm.input = TRANSLATIONS updateqm.output = $$DESTDIR/lang/${QMAKE_FILE_BASE}.qm updateqm.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm $$DESTDIR/lang/${QMAKE_FILE_BASE}.qm updateqm.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += updateqm quiterss-0.18.3/lang/quiterss_ar.ts000066400000000000000000005647031265173051100173340ustar00rootroot00000000000000 AboutDialog About حول Revision تنقيح Version الاصدار QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS برنامج Ù…ÙØªÙˆØ­ المصدر متعدد المنصات قارئ خلاصات اخبار RSS/Atom Includes: يحتوي: Application directory: مجلد التطبيق: Resource directory: مجلد المصدر: Data directory: مجلد البيانات: Backup directory: مجلد النسخ الإحتياطي: Database file: مل٠قاعدة البيانات: Settings file: مل٠الاعدادات: Log file: مل٠السجل: Authors المالكون History تاريخ License الرخصة Information معلومات AdBlockAddSubscriptionDialog Add Subscription Ø§Ø¶Ø§ÙØ© اشتراك Title: عنوان: Address: العنوان: Add new subscription to AdBlock: Ø¥Ø¶Ø§ÙØ© إشتراك جديد لـ AdBlock: AdBlockCustomList Custom Rules قواعد محددة AdBlockDialog AdBlock Configuration إعدادات AdBlock Enable AdBlock ØªÙØ¹ÙŠÙ„ AdBlock Search... بحث... Options خيارات AdBlock AdBlock Use only essential part of EasyList (for performance reasons) استخدم الاجزاء الاساسية Ùقط من ايزيلست (لاغراض الاداء) Add Rule Ø§Ø¶Ø§ÙØ© قاعدة Remove Rule حذ٠قاعدة Add Subscription Ø§Ø¶Ø§ÙØ© اشتراك Remove Subscription حذ٠اشتراك Update Subscriptions تحديث الاشتراكات Learn about writing rules... تعلم حول كتابة القواعد... AdBlockIcon AdBlock lets you block unwanted content on web pages يسمح لك ادبلوك بايقا٠المحتوى غير المرغوب به على ØµÙØ­Ø§Øª الويب AdBlock ادبلوك Show AdBlock &Settings اظهار اعدادات &ادبلوك Disable on %1 الغاء ØªÙØ¹ÙŠÙ„ ÙÙŠ %1 Disable only on this page الغاء Ø§Ù„ØªÙØ¹ÙŠÙ„ Ùقط ÙÙŠ هذة Ø§Ù„ØµÙØ­Ø© Blocked Popup Windows حجب Ø§Ù„Ù†ÙˆØ§ÙØ° المنبثقة %1 with (%2) %1 مع (%2) No content blocked لم يتم حجب محتويات Blocked URL (AdBlock Rule) - click to edit rule عنوان محجوب (قاعدة ادبلوك) - انقر لتحرير القاعدة AdBlockManager EasyList ايزي لست AdBlockSubscription Cannot load subscription! لا يمكن تحميل الاشتراك! AdBlockTreeWidget Add Rule Ø§Ø¶Ø§ÙØ© قاعدة Remove Rule حذ٠قاعدة Add Custom Rule Ø§Ø¶Ø§ÙØ© قاعدة معدلة Please write your rule here: الرجاء كتابة قواعدك هنا: %1 (recently updated) %1 (تم تحديثة مؤخرا) %1 (Error: %2) %1 (خطاء: %2 ) AddFeedWizard Add Feed Ø§Ø¶Ø§ÙØ© حقل Create New Feed انشاء حقل جديد Use title of the feed as displayed name استخدم عنوان الحقل كما الاسم المعروض Server requires authentication: الخادم يحتاج الى مصادقة: Username: اسم المستخدم: Password: كلمة المرور: Feed URL or website address: حقل URL عنوان الموقع: Feeds الحقول All Feeds جميع الحقول New Folder... مجلد جديد... Displayed name: الاسم المعروض: Location: الموقع: URL error! URL خطاء! Duplicate feed! حقل مكرر! Can't find feed URL! لايمكن ايجاد الحقل URL! Request failed! ÙØ´Ù„ الطلب! AddFolderDialog Add Folder Ø§Ø¶Ø§ÙØ© مجلد Feeds حقول All Feeds جميع الحقول Name: اسم: Location: موقع: AuthenticationDialog Save password Ø­ÙØ¸ كلمة المرور Authorization required يحتاج الى مصادقة Server: خادم: Message: رسالة: Username: اسم مستخدم: Password: كلمه مرور: CategoriesTreeWidget Unread غير المقروء Starred معلم بنجمه Deleted تم المسح Labels ملصقات Open in New Tab ÙØªØ­ ÙÙŠ تبويب جديد Clear 'Deleted' مسح 'محذوÙ' Mark Read وضع اشارة مقروء CleanUpWizard Clean Up تنظي٠Choose Feeds اختيار الحقل All Feeds جميع الحقول Clean Up Options خيارات التنظي٠Maximum age of news in days to keep: اقصى ÙØªØ±Ø© للاخبار المحÙوظه بالايام: Maximum number of news to keep: اقصى عدد من الاخبار ليتم Ø­ÙØ¸Ù‡Ø§: Delete read news حذ٠الاخبار المقروئة Never delete unread news لا تحذ٠الاخبار الغير مقروئة ابدا Never delete starred news لاتحذ٠الاخبار المعلمة بنجمة ابدا Never delete labeled news لا تحذ٠الاخبار الملصقة ابدا Clean up 'Deleted' مسح 'محذوÙ' Purge DB مسح DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear حذ٠كامل للسجلات المعلمه 'محذوÙÙ‡' من قاعده البيانات الاخبار القديمة قد تعاود الظهور Information معلومات Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash الكائن موقو٠بواسطة ClickToFlash Hide object Ø§Ø®ÙØ§Ø¡ الكائن Add '%1' to whitelist Ø§Ø¶Ø§ÙØ© '%1' الى القائمه البيضاء CustomizeToolbarDialog Customize Main Toolbar تخصيص شريط الادوات الرئيسي Customize Feeds Toolbar تخصيص شريط ادوات الحقول Customize News Toolbar تخصيص شريط ادوات الاخبار Load images تحميل الصور Separator ÙØ§ØµÙ„ Icon ايقونة Text نص Text Beside Icon نص بجانب الايقونة Text Under Icon نص اسÙÙ„ الايقونة Big كبير Normal عادي Small صغير Style: نمط: Icon Size: حجم الايقونة: Add Ø§Ø¶Ø§ÙØ© Remove حذ٠Move up تحريك للاعلى Move down تحريك للاسÙÙ„ Default Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ DownloadItem Remaining time unavailable الوقت المتبقي غير معرو٠Error: Cannot write to file! خطاء: لايمكن الكتابة على الملÙ! Error: خطاء: few seconds ثوان معدودة seconds ثواني minutes دقائق hours ساعات Unknown size حجم غير معرو٠Unknown speed سرعة غير Ù…Ø¹Ø±ÙˆÙØ© %2 - unknown size (%3) %2 - حجم غير معرو٠(%3) Remaining %1 - %2 of %3 (%4) متبقي %1 - %2 من %3 (%4) Cancelled - %1 تم الالغاء - %1 Delete file حذ٠المل٠Do you want to also delete downloaded file? هل تريد ايضا Ø­Ø°Ù Ø§Ù„Ù…Ù„ÙØ§Øª المحمله؟ Open File ÙØªØ­ مل٠Open Folder ÙØªØ­ مجلد Copy Download Link نسخ رابط التحميل Cancel Downloading الغاء التحميل Remove حذ٠Cancelled تم الالغاء Error خطاء Not found غير موجود Sorry, the file %1 was not found! نأسÙ, المل٠%1 ليس Ù…ØªÙˆÙØ±! DownloadManager Clear مسح File %1 (*.%2) مل٠%1 (*.%2) All Files (*.*) جميع Ø§Ù„Ù…Ù„ÙØ§Øª (*.*) Save As... Ø­ÙØ¸ باسم... Executable: تنÙيذي: Arguments: وسيطات: FeedPropertiesDialog Properties خصائص General عام Columns الأعمدة Authentication المصادقة Status الحالة Title: عنوان: Homepage: ØµÙØ­Ø© البداية: Feed URL: حقل URL: Load Title تحميل عنوان Load Favicon تحميل ايقونه Ù…ÙØ¶Ù„Ø© Select Icon... أختر أيقونة... Select Icon اختر أيقونة Disable update تعطيل التحديثات Automatically update every تحديث تلقائي كل seconds ثواني minutes دقائق hours ساعات Starred معلم بنجمة Load images تحميل الصور Display in new tab on startup عرض ÙÙŠ تبويب جديد عند بداية التشغيل Show news' description instead of loading web page اظهار وصÙ' الاخبار بدلا من تحميل ØµÙØ­Ø§Øª الويب Automatically delete duplicate news حذ٠الاخبار المتكررة بشكل تلقائي Display الشاشة Reading Enable JavaScript ØªÙØ¹ÙŠÙ„ JavaScript Right-to-left layout تنسيق من اليسار لليمين Ascending تصاعدي Descending تنازلي Sort by: ترتيب بواسطة: Add Ø§Ø¶Ø§ÙØ© Remove حذ٠Move up تحريك للاعلى Move down تحريك للاسÙÙ„ Default Ø§ÙØªØ±Ø§Ø¶ÙŠ Server requires authentication: الخادم يحتاج الى مصادقة: Username: اسم المستخدم: Password: كلمة المرور: Feeds count: عداد الحقول: Description: وصÙ: Status: الحالة Created: انشاء: Last update: اخر تحديث: News count: عداد الاخبار: Good جيد Long ago ;-) منذ ÙØªØ±Ù‡ طويلة ;-) new جديد unread غير مقروء Image files Ù…Ù„ÙØ§Øª صور Select Image اختيار صورة Load icon: can't open a file! تحميل الايقونة: لايمكن ÙØªØ­ المل٠FilterRulesDialog Filter Rules قواعد المرشح Feeds حقول All Feeds كل الحقول Filter name: اسم المرشح: Match all news مطابقة كل الاخبار Match all conditions مطابقة كل الظرو٠Match any condition مطابقة اي ظر٠Perform these actions: تنÙيذ هذه الإجراءات: Please enter name for the filter. يرجى ادخال اسم للمرشح. Please enter search condition for the news filter. يرجى ادخال شرط البحث من اجل مرشح الاخبار. FindFeed Find Name ايجاد اسم Find Link ايجاد رابط FindTextContent Find in News بحث ÙÙŠ الاخبار Find in Titles ايجاد ÙÙŠ العنوان Find in Authors ايجاد ÙÙŠ المؤل٠Find in Categories ايجاد ÙÙŠ التصني٠Find in Descriptions بحث ÙÙŠ الوص٠Find in Links بحث ÙÙŠ الروابط Find in Browser بحث ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­ FtpDownloader Canceled! تم الالغاء ItemAction Mark News as Read تعليم الخبر كـ مقروء Add Star Ø§Ø¶Ø§ÙØ© نجمة Delete حذ٠Add Label Ø§Ø¶Ø§ÙØ© ملصق Play a Sound تشغيل صوت Show News in Notifier عرض الأخبار ÙÙŠ التنبيهات Browse استعراض Play تشغيل Add Action Ø§Ø¶Ø§ÙØ© إجراء Delete Action حذ٠إجراء Open File... ÙØªØ­ ملÙ... ItemCondition Title عنوان Description وص٠Author مؤل٠Category تصني٠State حالة Link رابط News اخبار New جديد Read مقروء Starred معلم بنجمة Add Condition Ø§Ø¶Ø§ÙØ© شرط Delete Condition حذ٠شرط contains يحتوي doesn't contains لا يحتوي is هو isn't غير begins with البدء بي ends with الانتهاء بي Regular expressions تعابير شائعة LabelDialog New Label ملصق جديد Load icon... تحميل الايقونة... Default Ø§ÙØªØ±Ø§Ø¶ÙŠ Select color... تحديد لون... Name: اسم: Icon: ايقونة: Color text: لون النص: Color background: لون الخلÙية: Image files Ù…Ù„ÙØ§Øª صور Select Image اختيار صورة Load icon: can't open a file! تحميل الايقونة: لايمكن ÙØªØ­ المل٠MainApplication Saving data... Ø­ÙØ¸ البيانات... MainWindow &AdBlock &ادبلوك Hide Categories Ø§Ø®ÙØ§Ø¡ Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª Show Categories اظهار Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª Select OPML-File اختر OPML-مل٠OPML-Files (*.%1 *.%2) Ù…Ù„ÙØ§Øª-OPML (*.1% *.2%( Import canceled الغاء الاستيراد Import: can't open a file استيراد: لا يمكن ÙØªØ­ المل٠OPML-Files (*.%1) OPML-Ù…Ù„ÙØ§Øª Export canceled تم الغاء التصدير Export: can't open a file تصدير: لا يمكن ÙØªØ­ المل٠Unread: %1 غير مقروء: %1 All: %1 الجميع: %1 (Browser) (Ù…ØªØµÙØ­) New News: %1 اخبار جديدة: %1 Unread News: %1 اخبار غير مقروئة: %1 &Add &Ø§Ø¶Ø§ÙØ© Add New Feed Ø§Ø¶Ø§ÙØ© حقل جديد &Feed... &حقل... F&older... &مجلد... Add New Folder Ø§Ø¶Ø§ÙØ© مجلد جديد Open in New Tab ÙØªØ­ ÙÙŠ تبويب جديد &Delete... &حذÙ... Delete Selected Feed حذ٠الحقل المحدد &Import Feeds... &استيراد حقول... Import Feeds from OPML File استيراد حقول من مل٠OPML &Export Feeds... &تصدير حقول... Export Feeds to OPML File تصدير حقول الى مل٠OPML E&xit اغلاق Update Feed تحديث الحقول Update Current Feed تحديث الحقل الحالي Update All تحديث الكل Update All Feeds تحديث جميع الحقول Mark All Feeds Read تعليم جميع الحقول كـ مقروء Mark Read/Unread وضع علامة مقروء /غير مقروء Mark Current News Read/Unread تعليم الخبر الحالي كـ مقروء/غير Ù…ÙØ±ÙˆØ¡ Mark All News Read تعليم جميع الاخبار كـ مقروء Downloads التنزيلات Clean Up... تنظي٠News Filters... مرشحات الاخبار... Filter News... الاخبار المرشحة... Options... خيارات... Open Options Dialog ÙØªØ­ خصائص مربع الحوار Filter Feeds مرشح الحقول Show All عرض الكل Show New عرض الجديد Show Unread عرض الغير مقروء Show Starred Feeds اظهار الحقول المعلمة بنجمة Show Not Working Feeds اظهار الحقول اللتي لا تعمل Filter News مرشح الاخبار Show Starred اظهار المعلم بنجمة Show Not Starred اظهار غير المعلم بنجمة Show Unread or Starred اظهار غير المقروء او المعلم بنجمة Show Last Day اظهار اخر يوم Show Last 7 Days اظهار اخر 7 ايام About... حول... Show 'About' Dialog اظهار مربع حوار 'حول' Check for Updates... البحث عن التحديثات... Report a Problem... الابلاغ عن مشكلة... Open News ÙØªØ­ الاخبار Open in Browser ÙØªØ­ ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­ Open in External Browser ÙØªØ­ ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­ الخارجي Open News in External Browser ÙØªØ­ الخبر ÙÙŠ Ù…ØªØµÙØ­ خارجي Open News in New Tab ÙØªØ­ الخبر ÙÙŠ تبويب جديد Open in Background Tab ÙØªØ­ ÙÙŠ تبويب ÙÙŠ الخلÙية Open News in Background Tab ÙØªØ­ الخبر ÙÙŠ تبويب ÙÙŠ الخلÙية Star تعليم Mark News Star تعليم الخبر بنجمة Delete حذ٠Delete Selected News حذ٠الاخبار المحددة Delete All News حذ٠جميع الاخبار Delete All News from List حذ٠جميع الاخبار من القائمة Restore استعادة Restore News استعادة الاخبار Copy Link نسخ الرابط Restore last deleted news استعادة اخر الاخبار Ø§Ù„Ù…Ø­Ø°ÙˆÙØ© Mark Read وضع اشارة مقروء Mark Feed Read تعليم الحقل كـ مقروء Properties خصائص &File &مل٠Count Unread News عد الاخبار الغير مقروئة Count All News عد جميع الاخبار Last Update اخر تحديث Reset browser zoom إعادة ضبط تكبير Ø§Ù„Ù…ØªØµÙØ­ Print Web Page طباعة ØµÙØ­Ø© الويب Preview Web Page استعراض ØµÙØ­Ø© الويب Save page in database حقظ Ø§Ù„ØµÙØ­Ø© ÙÙŠ قاعدة البيانات Save page in database instead of news description Ø­ÙØ¸ Ø§Ù„ØµÙØ­Ø© ÙÙŠ قاعدة البيانات بدلا من وص٠الاخبار Confirm Delete تأكيد الحذ٠Are you sure to delete selected elements? هل انت متأكد من حذ٠العناصر المحددة؟ Menu قائمة Add Feed... Ø§Ø¶Ø§ÙØ© حقل... &Create Backup... &إنشاء تسخة احتياطية... S&how Menu Bar عرض شريط القائمة Stop Update Feeds ايقا٠تحديث الحقول Open News Description ÙØªØ­ وص٠الخبر Copy News Link نسخ رابط الخبر &View &عرض Fee&ds حقول &News &اخبار &Browser &Ù…ØªØµÙØ­ &Tools &ادوات &Help &مساعدة Main Toolbar شريط الادوات الرئيسي Customize Toolbar تخصيص شريط الادوات Main Toolbar... شريط الادوات الرئيسي... Customize Toolbar... تخصيص شريط الادوات... Feeds Toolbar... شريط ادوات الحقول... News Toolbar... شريط ادوات الاخبار... Lock Toolbar Ø§Ù‚ÙØ§Ù„ شريط الادوات Hide Toolbar Ø§Ø®ÙØ§Ø¡ شريط الادوات Layout تنسيق Classic كلاسيكي Newspaper ØµØ­ÙŠÙØ© Application Style نمط التطبيق System نظام System2 نظام2 Green اخضر Orange برتقالي Purple Ø¨Ù†ÙØ³Ø¬ÙŠ Pink زهري Gray رمادي Browser Position موقع Ø§Ù„Ù…ØªØµÙØ­ Top القمة Bottom القاع Right اليمين Left اليسار Show Window عرض Ø§Ù„Ù†Ø§ÙØ°Ø© Previous Feed الحقل السابق Next Feed الحقل التالي Previous News الخبر السابق Next News الخبر اللاحق News Page Up ØµÙØ­Ø© اخبار للاعلى News Page Down ØµÙØ­Ø© اخبار للاسÙÙ„ Next Unread News الخبر الغير مقروء التالي Previous Unread News الخبر الغير مقروء السابق Switch Focus to Next Panel نقل التركيز للوحة التالية Switch Focus to Next Panel (Tree Feeds, List News, Browser) نقل التركيز للوحة التالية (شجرة حقول, قائمة اخبار, Ù…ØªØµÙØ­) Switch Focus to Previous Panel نقل التركيز للوحة السابقة Switch Focus to Previous Panel (Tree Feeds, Browser, List News) نقل التركيز للوحة السابقة (شجرة الحقول, Ù…ØªØµÙØ­, قائمة الاخبار) Show/Hide Tree Feeds عرض/Ø§Ø®ÙØ§Ø¡ شجرة الحقول Minimize to Tray تصغير لدرج النظام Minimize Application to Tray تصغير التطبيق لدرج النظام Columns الأعمدة Show Indentation اظهار البادئة Search Feed بحث عن حقل Zoom تكبير Zoom In تقريب Zoom in in browser تكبير ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­ Zoom Out تصغير Zoom out in browser تصغير ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­ 100% 100% Print... طباعة... Print Preview... عرض قبل الطباعه... Page up (Browser) ØµÙØ­Ø© للاعلى (Ù…ØªØµÙØ­) Page down (Browser) ØµÙØ­Ø© للاسÙÙ„ (Ù…ØªØµÙØ­) Save As... Ø­ÙØ¸ باسم... Save Page As... Ø­ÙØ¸ Ø§Ù„ØµÙØ­Ø© بأسم... Show/Hide اظهار/Ø§Ø®ÙØ§Ø¡ Feeds Toolbar شريط ادوات الحقول News Toolbar شريط ادوات الاخبار Browser Toolbar شريط ادوات Ø§Ù„Ù…ØªØµÙØ­ Panel Categories لوحة Ø§Ù„ØªØµÙ†ÙŠÙØ§Øª Status Bar شريط الحالة Full Screen ملئ الشاشة Stay On Top البقاء ÙÙŠ الواجهة Categories ØªØµÙ†ÙŠÙØ§Øª Label ملصق Show labels menu اظهار قائمة الملصقات Close Tab اغلاق التبويب Close Other Tabs اغلاق التبويبات الاخرى Close All Tabs اغلاق جميع التبويبات Switch to next tab التبديل للتبويب التالي Switch to previous tab التبديل للتبويب السابق Unread غير المقروء Starred معلم بنجمه Deleted تم المسح Labels ملصقات Decrease news list/increase browser تقليل قائمة الاخبار/زيادة Ø§Ù„Ù…ØªØµÙØ­ Increase news list/decrease browser زيادة قائمة الاخبار/تقليل Ø§Ù„Ù…ØªØµÙØ­ Find ايجاد Open Homepage Feed ÙØªØ­ حقل Ø§Ù„ØµÙØ­Ø© الرئيسية Sort by Name ترتيب حسب الاسم Collapse All Folders تصغير جميع المجلدات Expand All Folders تكبير جميع المجلدات Next Folder المجلد التالي Previous Folder المجلد السابق Expand Folder تكبير المجلد Setting Page: Labels اعداد Ø§Ù„ØµÙØ­Ø©: الملصقات Share مشاركة Sort By ترتيب بواسطة Ascending تصاعدي Descending تنازلي Check for updates البحث عن تحديثات A new version of QuiteRSS... نسخه جديدة من QuiteRSS... Loading... تحميل... Web Page ØµÙØ­Ø© انترنت Save As Ø­ÙØ¸ باسم HTML-Files (*.%1) HTML-Ù…Ù„ÙØ§Øª Text files (*.%2) Ù…Ù„ÙØ§Øª نصية Save As: can't open a file Ø­ÙØ¸ باسم: لا يمكن ÙØªØ­ المل٠Choose Directory اختيار الوجهة Important مهم Work عمل Personal شخصي To Do للقيام بها Later ÙÙŠ ما بعد Amusingly بطريقة مسلية NetworkManager SSL Certificate Error! خطاء ÙÙŠ شهادة SSL ! The "%1" server has the following errors in the SSL certificate: الخادم "%1" يحتوي على الخطاء التالي ÙÙŠ شهادة SSL: <b>Organization: </b> <b>منظمة: </b> <b>Domain Name: </b> <b>اسم النطاق: </b> <b>Expiration Date: </b> <b>تاريخ الانتهاء: </b> <b>Error: </b> <b>خطاء: </b> Would you like to make an exception for this certificate? هل تريد انشاء استثناء لهذه الشهادة؟ NewsFiltersDialog News Filters مرشحات الاخبار Feeds الحقول Filter Name اسم المرشح New... جديد... Edit... تحرير... Delete... حذÙ... Move up تحريك لاعلى Move down تحريك لاسÙÙ„ Run Filter تشغيل مرشح Delete Filter حذ٠مرشح Are you sure you want to delete the filter '%1'? هل انت متاكد من انك تريد حذ٠هذا المرشح '%1'ØŸ NewsHeader Icon Feed ايقونة حقل Title عنوان Published تم النشر Received تم الاستقبال Author المؤل٠Category تصني٠Read مقروء Star تعليم Label ملصق Feed Title عنوان الحقل Link رابط NewsItem Mark Read/Unread وضع علامة مقروء /غير مقروء Delete News من اليمين لليسار NewsTabWidget Loading... (%p%) تحميل... (%p%) Home المنزل Open Page in External Browser ÙØªØ­ Ø§Ù„ØµÙØ­Ø© ÙÙŠ Ù…ØªØµÙØ­ خارجي Open Link in External Browser ÙØªØ­ الرابط ÙÙŠ Ù…ØªØµÙØ­ خارجي Open Link ÙØªØ­ الرابط Open in New Tab ÙØªØ­ ÙÙŠ تبويب جديد Save Link... Ø­ÙØ¸ الرابط... Save Image... Ø­ÙØ¸ الصورة... Copy Link نسخ الرابط Copy نسخ Go Back العودة للخل٠Go Forward للامام Stop توق٠Reload اعادة تحميل Copy Image نسخ الصورة Copy Image Address نسخ عنوان الصورة Load Images تحميل الصور Auto Load Images to News View تحميل تلقائي للصور لعرض الأخبار No Load Images لا صور محملة No Load Images to News View لا صور محملة لعرض الأخبار Close Tab اغلاق التبويب Auto Load Images in News View تحميل الصور تلقائيا ÙÙŠ عرض الاخبار Don't Load Images لا تقم بتحميل الصور Don't Load Images in News View لا تحمل الصور ÙÙŠ عرض الاخبار Comments تعليقات Author: %1 مؤلÙ: %1 audio صوت video Ùيديو media الوسائط Link to رابط الى Mark Read/Unread تعليم مقروء/غير مقروء Mark News Star تعليم الخبر بنجمة Label ملصق Share مشاركة Open News in External Browser ÙØªØ­ الخبر ÙÙŠ Ù…ØªØµÙØ­ خارجي Delete حذ٠NotificationWidget Close اغلاق Mark All News Read تعليم جميع الاخبار كـ مقروء Previous Page Ø§Ù„ØµÙØ­Ø© السابقة Next Page Ø§Ù„ØµÙØ­Ø© اللاحقة Incoming News: %1 اخبار قادمة: %1 Page %1 of %2 ØµÙØ­Ø© %1 من %2 OptionsDialog Options خيارات General عام System Tray درج النظام Network Connections اتصالات الشبكة Browser Ù…ØªØµÙØ­ Feeds حقول Labels ملصقات Notifications تنبيهات Passwords كلمات مرور Language لغة Fonts & Colors خطوط & الوان Keyboard Shortcuts اختصارات لوحة Ø§Ù„Ù…ÙØ§ØªÙŠØ­ Warning: key is already assigned to تحذير: Ø§Ù„Ù…ÙØªØ§Ø­ معين مسبقا الى Show splash screen on startup عرض شاشة البداية عند التشغيل Reopen last opened feeds on startup اعادة ÙØªØ­ الحقول Ø§Ù„Ù…ÙØªÙˆØ­Ù‡ سابقا عند بدء التشغيل Open new tab next to active ÙØªØ­ تبويب جديد بجانب التبويب Ø§Ù„ÙØ¹Ø§Ù„ Hide feeds tree when opening tabs Ø§Ø®ÙØ§Ø¡ شجرة الحقول عند ÙØªØ­ تبويبات Show default rss-icon instead of favourite one عرض ايقونة rss Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠØ© بدلا من Ø§Ù„Ù…ÙØ¶Ù„Ø© Automatically collapse folders تصغير المجلدات بشكل تلقائي Show close button on tab اظهاز زر الاغلاق ÙÙŠ التبويب Automatically check for updates البحث عن تحديثات بشكل تلقائي Help improve QuiteRSS by sending usage information المساعدة ÙÙŠ تحسين QuiteRSS بارسال معلومات الاستخدام Store a DB in memory (requires program restart) تخزين DB ÙÙŠ الذاكرة(يحتاج لاعادة تشغيل البرنامج) Save DB stored in memory to file every Ø­ÙØ¸ قاعدة البيانات المخزنة ÙÙŠ الذاكرة الى مل٠كل minutes دقائق Run QuiteRSS at Windows startup تشغيل QuiteRSS عند بدء تشغيل النظام Show system tray icon عرض ايقونة درج النظام starting QuiteRSS تشغيل QuiteRSS minimizing QuiteRSS تصغير QuiteRSS closing QuiteRSS اغلاق QuiteRSS Show static icon عرض ايقونة ثابتة Change icon for incoming new news تغيير الايقونة للاخبار الجديدة القادمة Show count of new news اظهار عداد للاخبار الجديدة Show count of unread news اظهار عداد للاخبار العير مقروئة Single click instead of double click for show window نقرة واحدة بدلا من النقر المزدوج لعرض Ø§Ù„Ù†Ø§ÙØ°Ø© Empty working set on minimize to tray ØªÙØ±ÙŠØº مجموعة العمل عند التصغير لدرج النظام Move to the system tray when: نقل الى درج النظام عند: Tray icon behavior: سلوك ايقونة النظام: Direct connection to the Internet اتصال مباشر للانترنت System proxy configuration (if available) اعدادات بروكسي النظام (ان كان Ù…ØªÙˆÙØ±) Manual proxy configuration: اعداد البروكسي يدويا: Proxy server: خادم البروكسي: Port: Ø§Ù„Ù…Ù†ÙØ°: Username: اسم المستخدم: Password: كلمة المرور: Request timeout: انتهاء وقت الطلب: Number of requests: عدد مرات الطلب: Number of retries: عدد مرات اعادة المحاولة: Options network requests when updating feeds (requires program restart): خيارات طلبات الشبكة عند تحديث الحقول (تحتاج لاعادة تشغيل البرنامج): Use embedded browser استخدم Ø§Ù„Ù…ØªØµÙØ­ المضمن Use external browser استخدم Ù…ØªØµÙØ­ خارجي Default external browser Ø§Ù„Ù…ØªØµÙØ­ الخارجي Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ Following external browser: تتبع Ø§Ù„Ù…ØªØµÙØ­ الخارجي: Browse... استعراض... Load images تحميل الصور Enable JavaScript ØªÙØ¹ÙŠÙ„ JavaScript Enable plug-ins ØªÙØ¹ÙŠÙ„ Ø§Ù„Ø§Ø¶Ø§ÙØ§Øª Open links in embedded browser in background ÙØªØ­ الروابط ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­ المضمن بالخلÙية Open links in external browser in background (experimental) ÙØªØ­ الروابط ÙÙŠ Ù…ØªØµÙØ­ خارجي ÙÙŠ الخلÙيه (تجريبي) Default zoom on pages: التقريب Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ ÙÙŠ Ø§Ù„ØµÙØ­Ø§Øª: Browser selection: اختيار Ø§Ù„Ù…ØªØµÙØ­: External browser: Ù…ØªØµÙØ­ خارجي: Content: المحتويات: User style sheet: نمط ØµÙØ­Ø© المستخدم: Maximum pages in cache العدد الاقصى Ù„Ù„ØµÙØ­Ø§Øª ÙÙŠ ذاكرة التخزين المؤقت Store cache in: التخزين المؤقت ÙÙŠ: Maximum size of disk cache الحجم الاقصى لذاكرة التخزين المؤقت MB Ù….ب Use disk cache استخدم ذاكرة التخزين المؤقت ÙÙŠ القرص Allow local data to be set السماح بتحديد البيانات المحليه Keep local data only until quit application ابقاء البيانات المحلية حتى اغلاق التطبيق Block sites from setting any data منع المواقع من تعديل اي بيانات Clear مسح Cookies: الكعكات Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. اضغط لتشغيل الÙلاش هي Ø§Ø¶Ø§ÙØ© تقوم بايقا٠التحميل التلقائي لمحتويات الÙلاش ÙÙŠ Ø§Ù„ØµÙØ­Ø©. تستطيع دائما تحميل محتويات الÙلاش يدويا بالضغط على ايقونة تشغيل الÙلاش. Use Click to Flash استخدم اضغط لتشغيل الÙلاش Add... Ø§Ø¶Ø§ÙØ©... Remove... حذÙ... Ask where to save each file before downloading اسال اين ØªØ­ÙØ¸ كل مل٠قبل التحميل Download location: موقع التحميل: History تاريخ Click to Flash اضغط لتشغيل الÙلاش Downloads التحميلات Automatically update the feeds on startup تحديث الحقول تلقائيا عند التشغيل Automatically update the feeds every تحديث تلقائي للحقول كل seconds ثواني hours ساعات Nothing to do لاشيء ليتم عملة Dec ديسمبر December ديسمبر Display format for date: عرض تهيئة التاريخ: time: الوقت: Alternating row background colors ص٠الوان الخلÙية بالتناوب Simplified representation of date and time تقديم مبسط للتاريخ Ùˆ الوقت Show All عرض الكل Show New عرض الجديد Show Unread عرض الغير مقروء Show Starred اظهار المعلم بنجمة Show Not Starred اظهار غير المعلم بنجمة Show Unread or Starred اظهار غير المقروء او المعلم بنجمة Show Last Day اظهار اخر يوم Show Last 7 Days اظهار اخر 7 ايام Style sheet for news: Mark news as read: تعليم الخبر كـ مقروء: on selecting. With timeout ØªÙØ¹ÙŠÙ„ التحديد. بوقت محدد after switching to another news بعد الانتقال لخبر اخر Mark displayed news as read when switching feeds تعليم الخبر المعروض ب مقروء عند تبديل الحقول Mark displayed news as read when closing tab تعليم الخبر المعروض ب مقروء عند اغلاق التبويب Mark displayed news as read on minimize تعليم الخبر المعروض ب مقروء عند التصغير Change behavior of action 'Next Unread News' تغيير سلوك الاجراء 'الخبر التالي الغير مقروء' starred news الاخبار المعلمة بنجمة labeled news الاخبار الملصقة Automatically mark identical news as read اشر تلقائيا على الرسائل المتطابقة كـ مقروئة Prevent accidental deletion of: منع الحذ٠عن طريق الخطاء: Enable cleanup on shutdown ØªÙØ¹ÙŠÙ„ التنظي٠عند الاغلاق Maximum age of news in days to keep: اقصى ÙØªØ±Ø© للاخبار المحÙوظه بالايام: Maximum number of news to keep: اقصى عدد من الاخبار ليتم Ø­ÙØ¸Ù‡Ø§: Delete read news حذ٠الاخبار المقروئة Never delete unread news لا تحذ٠ابدا الاخبار الغير مقروئة Never delete starred news لاتحذ٠الاخبار المعلمة بنجمة ابدا Never delete labeled news لا تحذ٠الاخبار الملصقة ابدا Clean up 'Deleted' تنظي٠'محذوÙ' Enable DB optimization (slower shutdown) ØªÙØ¹ÙŠÙ„ تحسين DB (اغلاق ابطاء) Reading جاري القرائة Clean Up تنظي٠New... جديد... Edit... تحرير... Delete... حذÙ... Move up تحريك للاعلى Move down تحريك للاسÙÙ„ Show when inactive main window أظهر عندما تصبح Ø§Ù„Ù†Ø§ÙØ°Ø© الرئيسية غير نشطة Screen الشاشة Transparency Ø§Ù„Ø´ÙØ§Ùية Show titles feeds اظهار عناوين الحقول Show icon feed اظهار ايقونات الحقول Show button 'Mark All News Read' عرض زر 'تعليم جميع الاخبار كـ مقروء' Show button 'Mark Read/Unread' عرض زر 'تعليم مقروء/غير مقروء' Show button 'Open in External Browser' عرض زر 'ÙØªØ­ ÙÙŠ Ø§Ù„Ù…ØªØµÙØ­ الخارجي' Show button 'Delete News' عرض زر 'حذ٠الخبر' Play sound for incoming new news تشغيل صوت للاخبار الجديدة القادمة Play تشغيل Display notification for incoming news عرض تنبيه للاخبار القادمة Top Left اعلى اليسار Top Right اعلى اليمين Bottom Left اسÙÙ„ اليسار Bottom Right اسÙÙ„ اليمين Review مراجعة Position موقع Show maximum of عرض العدد الاقصى من item on page notification نقطة على ØµÙØ­Ø© التنبية Width list items عرض قائمة النقاط pixels بكسلات Close notification after اغلاق التنبيهات بعد Do not show notification in fullscreen mode لا تظهر التنبيهات ÙÙŠ وضع ملى الشاشة Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: عرض الحقول المحددة Ùقط: Notification تنبية Sound صوت Selection of feeds اختيار الحقول All Feeds جميع الحقول Site موقع User مستخدم Password كلمة مرور Delete حذ٠Delete All حذ٠الكل Show Passwords اظهار كلمات المرور Version النسخة Author المؤل٠Contact اتصال Choose language: اختيار اللغة: Type نوع Font خط Feeds list font خط قائمة الحقول News list font خط قائمة الاخبار News title font خط عنوان الاخبار News text font خط نص الاخبار Notification font خط التنبيهات Change... تغيير... Reset اعادة تعيين Feeds list color لون قائمة الحقول Feeds list background خلÙية قائمة الحقول News list color لون قائمة الاخبار News list background خلÙية قائمة الاخبار Focused news color لون الخبر المحدد Focused news background color لون خلÙية الخبر المحدد Link color لون الرابط Title color لون العنوان Date color لون التاريخ Author color لون المؤل٠News text color لون خط الخبر News title background خلÙية عنوان الخبر News background خلÙية الخبر Feed with new news حقل بأخبار جديدة Count of unread news in feeds tree عدد الاخبار الغير مقروئة ÙÙŠ شجرة الحقول Disabled feed تعطيل الحقل Alternating row colors الوان صÙو٠متناوبة Notification text color لون نص التنبية Notification background color لون خلÙية التنبة Auto load images in news view تحميل الصور تلقائيا ÙÙŠ عرض الاخبار Text color of new news لون النص للخبر الجديد Show feeds tree toggle اظهار شجره تبديل الحقول Clear new status when minimize to tray Set focus on the last opened news التركيز على اخر خبر Ù…ÙØªÙˆØ­ Set focus at the top of news list التركيز على اعلى قائمة الاخبار Set focus on the unread news التركيز على الاخبار غير المقروئة Open the news ÙØªØ­ الاخبار Default news filter: مرشح الاخبار Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ: Action on feed opening: Show news description instead of loading web page أظهر وص٠الأخبار بدلا من تحميل ØµÙØ­Ø© الويب Text color of unread news لون الخط للأخبار الغير مقروئه Focused feed color لون الحقل المحدد Focused feed background color لون خلÙية الحقل المحدد Standard قياسي Fixed ثابت Serif Serif Sans Serif Sans Serif Cursive نسخية Fantasy خيالي Default font size حجم الخط Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ Fixed font size حجم الخط الثابت Minimum font size اقل حجم للخط Minimum logical font size اقل حجم معقول للخط Font families: ÙØµØ§Ø¦Ù„ الخطوط: Font sizes: احجام الخطوط: Fonts خطوط Fonts Browser خطوط Ø§Ù„Ù…ØªØµÙØ­ Colors الالوان Filter المرشح Action الاجراء Description الوص٠Shortcut اختصار Shortcut: اختصار: Open File... ÙØªØ­ ملÙ... Select Style Sheet File اختيار نمط المل٠Open Directory... ÙØªØ­ مجلد... Add site to whitelist Ø§Ø¶Ø§ÙØ© الموقع للقائمة البيضاء Site without 'http://' (ex. youtube.com) الموقع بدون 'http://' (مثل. youtube.com) QAbstractSpinBox &Step up &درجة للاعلى Step &down درجة &للاسÙÙ„ &Select All &تحديد الكل QDialogButtonBox Close اغلاق Cancel الغاء &Yes &نعم &No &لا QFtp Not connected غير متّصÙÙ„ Host %1 not found لا يمكن العثور على المضي٠%1 Connection refused to host %1 Ø±ÙØ¶ الاتصال بالمضي٠1% Connection timed out to host %1 انتهاء وقت الاتصال بالمضي٠1% Connected to host %1 تم الاتصال بالمضي٠%1 Connection refused for data connection Ø±ÙØ¶ الاتصال لبيانات الاتصال Unknown error خطأ غير معرو٠Connecting to host failed: %1 ÙØ´Ù„ الاتصال بالمضي٠: %1 Login failed: %1 ÙØ´Ù„ الدخول: %1 Listing directory failed: %1 ÙØ´Ù„ ترتيب المجلدات: %1 Changing directory failed: %1 ÙØ´Ù„ تغيير المجلدات: %1 Downloading file failed: %1 ÙØ´Ù„ تحميل ملÙ:⎠%1 Uploading file failed: %1 ÙØ´Ù„ Ø±ÙØ¹ ملÙ: Removing file failed: %1 ÙØ´Ù„ حذ٠ملÙ: Creating directory failed: %1 ÙØ´Ù„ انشاء المجلدات: %1 Removing directory failed: %1 ÙØ´Ù„ حذ٠المجلدات: %1 Connection closed تمّ غلق الاتصال QLineEdit &Undo &تراجع &Redo &أعاد عمل Cu&t &قص &Copy &نسخ &Paste &لصق Delete حذ٠Select All تحديد الكل QMultiInputContext Select IM اختيار IM QObject Cannot start external program لايمكن تشغيل البرنامج الخارجي Cannot start external program! %1 لايمكن تشغيل البرنامج الخارجي! %1 Error خطاء QTextControl &Undo &تراجع &Redo &اعادة ÙØ¹Ù„ Cu&t &قص &Copy &نسخ &Paste &لصق Delete حذ٠Select All اختيار الكل Copy &Link Location نسخ &موقع الرابط QWizard Cancel الغاء < &Back < &للخل٠&Finish &انهاء &Next > &التالي > RSSDetectionWidget Untitled feed حقل من دون عنوان RequestFeed Server requires authentication! الخادم يحتاج الى مصادقة! Server replied: Not Found! استجابة الخادم: غير موجود! Redirect error! خطاء ÙÙŠ اعادة التوجية! Request timeout! انتهاء وقت الطلب! SQLiteDriver Error opening database خطاء ÙÙŠ ÙØªØ­ قاعدة البيانات Error closing database خطاء ÙÙŠ اغلاق قاعدة البيانات Unable to begin transaction Unable to commit transaction Unable to rollback transaction SQLiteResult Unable to fetch row غير قادر على جلب الص٠No query لا إستعلام Unable to execute statement Unable to execute multiple statements at a time Unable to reset statement Unable to bind parameters Parameter count mismatch SslErrorDialog SSL Certificate Error! خطاء ÙÙŠ شهادة SSL ! Only for this session لهذذ الجلسذ Ùقط UpdateAppDialog Check for Updates البحث عن تحديثات Checking for updates... البحث عن تحديثات... Loading history... تحميل التاريخ... Don't remind about this version لا تذكرني حول هذا الاصدار &Install &تثبيت You already have the latest version ÙŠØªÙˆÙØ± لديك النسخة الاحدث A new version of QuiteRSS is available! هناك نسخه احدث Ù…ØªÙˆÙØ±Ø© من QuiteRSS! Click here to go to the download page اضغط هنا للانتقال Ù„ØµÙØ­Ø© التحميل Your version is: نسختك هي: Current version is: النسخة الحالية: Error checking updates خطاء ÙÙŠ ÙØ­Øµ التحديثات quiterss-0.18.3/lang/quiterss_bg.ts000066400000000000000000006023131265173051100173100ustar00rootroot00000000000000 AboutDialog About За програмата Revision Ð ÐµÐ²Ð¸Ð·Ð¸Ñ Version ВерÑÐ¸Ñ QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS е многоплатформен четец за RSS/Atom новини Ñ Ð¾Ñ‚Ð²Ð¾Ñ€ÐµÐ½ код Includes: Включва: Application directory: Папка на приложението: Resource directory: Папка Ñ Ñ€ÐµÑурÑи: Data directory: Папка Ñ Ð´Ð°Ð½Ð½Ð¸: Backup directory: Папка Ñ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð¸ копиÑ: Database file: Файл за база данни: Settings file: Файл Ñ Ð½Ð°Ñтройки: Log file: Файл Ñ Ð¾Ñ‚Ñ‡ÐµÑ‚Ð¸: Authors Ðвтори History ИÑÑ‚Ð¾Ñ€Ð¸Ñ License Лиценз Information Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ AdBlockAddSubscriptionDialog Add Subscription Добави абонамент Title: Заглавие: Address: ÐдреÑ: Add new subscription to AdBlock: Добави нов абонамент към AdBlock: AdBlockCustomList Custom Rules СобÑтвени правила AdBlockDialog AdBlock Configuration ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½Ð° AdBlock Enable AdBlock Разреши AdBlock Search... ТърÑене... Options ÐаÑтройки AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Използвай Ñамо оÑновната чаÑÑ‚ на EasyList (от ÑÑŠÐ¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° бързина) Add Rule Добави правило Remove Rule Премахни правило Add Subscription Добави абонамент Remove Subscription Премахни абонамент Update Subscriptions Обнови абонамент Learn about writing rules... Ðаучи за пиÑането на правила... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock позволÑва блокирането на нежелано Ñъдържание в уеб Ñайтовете AdBlock AdBlock Show AdBlock &Settings Покажи &наÑтройките на AdBlock Disable on %1 Забрани на %1 Disable only on this page Забрани за тази Ñтраница Blocked Popup Windows Блокирани попъпи %1 with (%2) %1 Ñ (%2) No content blocked ÐÑма блокирано Ñъдържание Blocked URL (AdBlock Rule) - click to edit rule Блокиран URL (правило на AdBlock) - щракни за промÑна AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Ðе мога да Ð·Ð°Ñ€ÐµÐ´Ñ Ð°Ð±Ð¾Ð½Ð°Ð¼ÐµÐ½Ñ‚Ð°! AdBlockTreeWidget Add Rule Добави правило Remove Rule Премахни правило Add Custom Rule Добави ÑобÑтвено правило Please write your rule here: Ðапиши твоето правило тук: %1 (recently updated) %1 (наÑкоро обновени) %1 (Error: %2) %1 (Грешка: %2) AddFeedWizard Add Feed Добави емиÑÐ¸Ñ Create New Feed Създай нова емиÑÐ¸Ñ Use title of the feed as displayed name Използвай заглавието на емиÑиÑта като име за показване Server requires authentication: Сървърът изиÑква автентикациÑ: Username: ПотребителÑко име: Password: Парола: Feed URL or website address: URL на емиÑиÑта или Ð°Ð´Ñ€ÐµÑ Ð½Ð° Ñайта: Feeds ЕмиÑии All Feeds Ð’Ñички емиÑии New Folder... Ðова папка... Displayed name: Име за показване: Location: МеÑтоположение: URL error! Грешка URL! Duplicate feed! Дублирана емиÑиÑ! Can't find feed URL! Ðе мога да Ð¾Ñ‚ÐºÑ€Ð¸Ñ URL на емиÑиÑта! Request failed! ЗаÑвката е неуÑпешна! AddFolderDialog Add Folder Добави папка Feeds ЕмиÑии All Feeds Ð’Ñички емиÑии Name: Име: Location: МеÑтоположение: AuthenticationDialog Save password Запиши паролата Authorization required ИзиÑква Ñе Ð¾Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Server: Сървър: Message: Съобщение: Username: ПотребителÑко име: Password: Парола: CategoriesTreeWidget Unread Ðепрочетени Starred Ð¡ÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Deleted Изтрити Labels Етикети Open in New Tab Отвори в нов таб Clear 'Deleted' ИзчиÑти 'Изтрити' Mark Read Отбележи като прочетени CleanUpWizard Clean Up ИзчиÑти Choose Feeds Избери емиÑии All Feeds Ð’Ñички емиÑии Clean Up Options Опции за изчиÑтване Maximum age of news in days to keep: Да бъдат запазени новини, не по-Ñтари от: Maximum number of news to keep: МакÑимален брой новини, които ще бъдат запазени: Delete read news Изтрий прочетените новини Never delete unread news Ðе изтривай непрочетени новини Never delete starred news Ðе изтривай новини ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Never delete labeled news Ðе изтривай новини Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚ Clean up 'Deleted' ИзчиÑти 'Изтрити' Purge DB Изпразни DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Премахни напълно запиÑите, които Ñа маркирани като 'изтрити' от DB. Възможно е да Ñе поÑвÑÑ‚ Ñтари новини Information Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Clean Up wizard deleted %1 news Помощникът за изчиÑтване изтри %1 новини ClickToFlash Object blocked by ClickToFlash Обект, блокиран от ClickToFlash Hide object Скрий обекта Add '%1' to whitelist Добави '%1' към Ð±ÐµÐ»Ð¸Ñ ÑпиÑък CustomizeToolbarDialog Customize Main Toolbar Промени Главна лента Ñ Ð¼ÐµÐ½ÑŽÑ‚Ð° Customize Feeds Toolbar Промени лента Ñ Ð•Ð¼Ð¸Ñии Customize News Toolbar Промени лента Ñ Ðовини Load images Зареди изображениÑта Separator Разделител Icon Икона Text ТекÑÑ‚ Text Beside Icon ТекÑÑ‚ към иконата Text Under Icon ТекÑÑ‚ под иконата Big ГолÑм Normal Ðормален Small Малък Style: Стил: Icon Size: Размер на икони: Add Добави Remove Премахни Move up Ðагоре Move down Ðадолу Default По подразбиране DownloadItem Remaining time unavailable ÐедоÑтъпно оÑтаващо време Error: Cannot write to file! Грешка: Ðе мога да пиша във файла! Error: Грешка: few seconds нÑколко Ñекунди seconds Ñекунди minutes минути hours чаÑа Unknown size ÐеизвеÑтена големина Unknown speed ÐеизвеÑтна ÑкороÑÑ‚ %2 - unknown size (%3) %2 - неизвеÑтен размер (%3) Remaining %1 - %2 of %3 (%4) ОÑтаващи %1 - %2 от %3 (%4) Cancelled - %1 Отказан - %1 Delete file Изтрий файла Do you want to also delete downloaded file? ÐаиÑтина ли желаете да изтриете и ÑÐ²Ð°Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»? Open File Отвори файл Open Folder Отвори папка Copy Download Link Копирай връзката за ÑвалÑне Cancel Downloading Откажи ÑвалÑнето Remove Премахни Cancelled Отказано Error Грешка Not found Ðе намерен Sorry, the file %1 was not found! СъжалÑвам, файлът %1 не беше открит! DownloadManager Clear ИзчиÑти File %1 (*.%2) Файл %1 (*.%2) All Files (*.*) Ð’Ñички файлове (*.*) Save As... Съхрани като Executable: Изпълним: Arguments: Ðргументи: FeedPropertiesDialog Properties СвойÑтва General Общи Columns Колони Authentication ÐÐ²Ñ‚ÐµÐ½Ñ‚Ð¸ÐºÐ°Ñ†Ð¸Ñ Status Ð¡Ñ‚Ð°Ñ‚ÑƒÑ Title: Заглавие: Homepage: Ðачална Ñтраница: Feed URL: URL на емиÑиÑта: Load Title Зареди заглавието Load Favicon Зареди Favicon Select Icon... Избери икона... Select Icon Избери икона Disable update Забрани обновÑване Automatically update every ОбновÑвай автоматично на вÑеки seconds Ñекунди minutes минути hours чаÑа Starred Ð¡ÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Load images Зареди изображениÑта Display in new tab on startup При Ñтартиране покажи в нов таб Show news' description instead of loading web page Покажи опиÑание на новината вмеÑто зареждане на уеб Ñтраницата Automatically delete duplicate news Ðвтоматично изтривай дублирани новини Display Показване Reading Четене Enable JavaScript Разреши Right-to-left layout Разположение от дÑÑно на лÑво Ascending ВъзходÑщо Descending ÐизходÑщо Sort by: Подреди по: Add Добави Remove Премахни Move up Ðагоре Move down Ðадолу Default По подразбиране Server requires authentication: Сървърът изиÑква автентикациÑ: Username: ПотребителÑко име: Password: Парола: Feeds count: Брой емиÑии Description: ОпиÑание: Status: СтатуÑ: Created: Създаден: Last update: ПоÑледно обновÑване: News count: Ðовини: Good Добре Long ago ;-) Много отдавна ;-) new нови unread непрочетени Image files Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Select Image Избери изображение Load icon: can't open a file! Зареждане на икона: не мога да Ð¾Ñ‚Ð²Ð¾Ñ€Ñ Ñ„Ð°Ð¹Ð»Ð° FilterRulesDialog Filter Rules Правила за филтри Feeds ЕмиÑии All Feeds Ð’Ñички емиÑии Filter name: Име на филтър: Match all news Съвпадение във вÑички новини Match all conditions Съвпадение на вÑички уÑÐ»Ð¾Ð²Ð¸Ñ Match any condition Съвпадение Ñ ÐºÐ¾ÐµÑ‚Ð¾ и да е уÑловие Perform these actions: Изпълни тези дейÑтвиÑ: Please enter name for the filter. Въведи име за филтъра. Please enter search condition for the news filter. Въведи за филтъра уÑÐ»Ð¾Ð²Ð¸Ñ Ð·Ð° търÑене. FindFeed Find Name ТърÑи име Find Link ТърÑи връзка FindTextContent Find in News ТърÑи в новините Find in Titles ТърÑи в заглавиÑта Find in Authors ТърÑи в авторите Find in Categories ТърÑи в категориите Find in Descriptions ТърÑи в опиÑаниÑта Find in Links ТърÑи във връзките Find in Browser ТърÑи в браузъра FtpDownloader Canceled! Отказано! ItemAction Mark News as Read Отбележи новините като прочетени Add Star Добави звезда Delete Изтрий Add Label Добави етикет Play a Sound Възпроизведи звук Show News in Notifier Покажи новините в ИзвеÑÑ‚Ð¸Ñ‚ÐµÐ»Ñ Browse Прегледай Play Възпроизведи Add Action Добави дейÑтвие Delete Action Изтрий дейÑтвие Open File... Отвори файл... ItemCondition Title Заглавие Description ОпиÑание Author Ðвтор Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ State СъÑтоÑние Link Връзка News Ðовини New Ðови Read Четени Starred Ð¡ÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Add Condition Добави уÑловие Delete Condition Изтрий уÑловие contains Ñъдържа doesn't contains не Ñъдържа is е isn't не е begins with започва Ñ ends with завършва на Regular expressions Regular expressions LabelDialog New Label Ðов етикет Load icon... Зареди икона... Default По подразбиране Select color... Избери цвÑÑ‚... Name: Име: Icon: Икона: Color text: ЦвÑÑ‚ на текÑта: Color background: ЦвÑÑ‚ на фона: Image files Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Select Image Избери изображение Load icon: can't open a file! Зареди икона: не мога да Ð¾Ñ‚Ð²Ð¾Ñ€Ñ Ñ„Ð°Ð¹Ð»Ð°! MainApplication Saving data... СъхранÑвам данните... MainWindow &AdBlock &AdBlock Hide Categories Скрий категориите Show Categories Покажи категориите Select OPML-File Избери OPML-файл OPML-Files (*.%1 *.%2) OPML-файлове (*.%1 *.%2) Import canceled Отказано импортиране Import: can't open a file Импорт: не мога да Ð¾Ñ‚Ð²Ð¾Ñ€Ñ Ñ„Ð°Ð¹Ð»Ð° OPML-Files (*.%1) OPML-файлове (*.%1) Export canceled Отказан екÑпорт Export: can't open a file ЕкÑпорт: не мога да Ð¾Ñ‚Ð²Ð¾Ñ€Ñ Ñ„Ð°Ð¹Ð»Ð° Unread: %1 Ðепрочетени: %1 All: %1 Ð’Ñички: %1 (Browser) (Браузър) New News: %1 Ðови новини: %1 Unread News: %1 Ðепрочетени новини: %1 &Add &Добави Add New Feed Добави нова емиÑÐ¸Ñ &Feed... &ЕмиÑии... F&older... &Папка... Add New Folder Добави нова папка Open in New Tab Отвори нов таб &Delete... &Изтриване Delete Selected Feed Изтрий избраните емиÑии &Import Feeds... &Импорт на емиÑии... Import Feeds from OPML File Импортирай емиÑии от OPML файл &Export Feeds... Е&кÑпорт на емиÑии... Export Feeds to OPML File ЕкÑпорт на емиÑии в OPML файл E&xit Из&ход Update Feed Обнови емиÑиите Update Current Feed Обнови текущата емиÑÐ¸Ñ Update All Обнови вÑички Update All Feeds Обнови вÑички емиÑии Mark All Feeds Read Отбележи вÑички емиÑии като прочетени Mark Read/Unread Отбележи Прочетени/Ðепрочетени Mark Current News Read/Unread Отбележи текущите новини като Прочетени/Ðепрочетени Mark All News Read Отбележи вÑички новини като прочетени Downloads ИзтеглÑÐ½Ð¸Ñ Clean Up... ПочиÑтване... News Filters... Филтри за новините... Filter News... Филтрирай новините... Options... ÐаÑтройки... Open Options Dialog Отвори диалога Ñ Ð½Ð°Ñтройките Filter Feeds Филтрирай емиÑиите Show All Покажи вÑички Show New Покажи новите Show Unread Покажи непрочетените Show Starred Feeds Покажи емиÑиите ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Show Not Working Feeds Покажи не работещите емиÑии Filter News Филтрирай новините Show Starred Покажи ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Show Not Starred Покажи без звезда Show Unread or Starred Покажи непрочетени или ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Show Last Day Покажи поÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð´ÐµÐ½ Show Last 7 Days Покажи поÑледните 7 дни About... За програмата... Show 'About' Dialog Покажи диалога 'За програмата' Check for Updates... Провери за обновлениÑ... Report a Problem... Докладвай за проблем Open News Отвори новините Open in Browser Отвори в браузъра Open in External Browser Отвори във външен браузър Open News in External Browser Отвори новините във външен браузър Open News in New Tab Отвори новините в нов таб Open in Background Tab Отвори в таб на заден план Open News in Background Tab Отвори новините в таб на заден план Star Звезда Mark News Star Отбележи новините ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Delete Изтрйи Delete Selected News Изтрий отбелÑзаните новини Delete All News Изтрий вÑички новини Delete All News from List Изтрий вÑички новини от ÑпиÑъка Restore ВъзÑтанови Restore News ВъзÑтанови новините Copy Link Копирай връзката Restore last deleted news ВъзÑтанови поÑледните изтрити новини Mark Read Отбележи като прочетени Mark Feed Read Отбележи емиÑиÑта като прочетена Properties СвойÑтва &File &Файл Count Unread News Брой непрочетени новини Count All News Брой новини вÑичко Last Update ПоÑледно обновÑване Reset browser zoom ВъзÑтанови увеличението на текÑта Print Web Page Отпечати уеб Ñтраницата Preview Web Page Преглед на уеб Ñтраницата Save page in database Съхрани Ñтраницата в базата данни Save page in database instead of news description Съхрани Ñтраницата в базата данни вмеÑто в опиÑанието на новините Confirm Delete Потвърди изтриването Are you sure to delete selected elements? ÐаиÑтина ли иÑкаш да изтриеш избраните елементи? Menu Меню Add Feed... Добави емиÑиÑ... &Create Backup... &Създай резервно копие S&how Menu Bar Покажи &Меню лентата Stop Update Feeds Спри обновÑването на емиÑиите Open News Description Отвори опиÑанието на новините Copy News Link Копирай връзката към новините &View Пре&глед Fee&ds &ЕмиÑии &News &Ðовини &Browser &Браузър &Tools ИнÑ&трументи &Help &Помощ Main Toolbar Главна лента Customize Toolbar Промени лентата Main Toolbar... Главна лента... Customize Toolbar... Промени лентата... Feeds Toolbar... Лента Ñ ÐµÐ¼Ð¸Ñии... News Toolbar... Лента Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸... Lock Toolbar Заключи лентата Hide Toolbar Скрий лентата Layout Разположение Classic КлаÑичеÑко Newspaper ВеÑтник Application Style Стил на приложението System СиÑтемен System2 СиÑтемен2 Green Зелен Orange Оранжев Purple Виолетов Pink Розов Gray Сив Browser Position Разположение на браузъра Top Горе Bottom Долу Right ДÑÑно Left ЛÑво Show Window Покажи прозорец Previous Feed Предишна емиÑÐ¸Ñ Next Feed Следваща емиÑÐ¸Ñ Previous News Предишни новини Next News Следващи новини News Page Up Ðовини Ñтраница нагоре News Page Down Ðовини Ñтраница надолу Next Unread News Следващи непрочетени новини Previous Unread News Предишни непрочетени новини Switch Focus to Next Panel ПремеÑти фокуÑа на ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» Switch Focus to Next Panel (Tree Feeds, List News, Browser) ПремеÑти фокуÑа на ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» (дърво Ñ ÐµÐ¼Ð¸Ñии, ÑпиÑък Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸, браузър) Switch Focus to Previous Panel ПремеÑти фокуÑа на Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» Switch Focus to Previous Panel (Tree Feeds, Browser, List News) ПремеÑти фокуÑа на Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Ð¿Ð°Ð½ÐµÐ» (дърво Ñ ÐµÐ¼Ð¸Ñии, ÑпиÑък Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸, браузър) Show/Hide Tree Feeds Покажи/Ñкрий дървото Ñ ÐµÐ¼Ð¸Ñиите Minimize to Tray Минимизирай в system tray Minimize Application to Tray Минимизирай приложението в system tray Columns Колони Show Indentation Покажи отмеÑтване Search Feed ТърÑи в емиÑÐ¸Ñ Zoom Мащабиране Zoom In Увеличаване Zoom in in browser Увеличаване в браузър Zoom Out ÐамалÑване Zoom out in browser ÐамалÑване в браузър 100% 100% Print... Печат Print Preview... Преглед за печат Page up (Browser) Страница нагоре (Браузър) Page down (Browser) Страница надолу (Браузър) Save As... Съхрани като... Save Page As... Съхрани Ñтраницата като... Show/Hide Покажи/Ñкрий Feeds Toolbar Лента Ñ ÐµÐ¼Ð¸Ñии News Toolbar Лента Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ Browser Toolbar Лента Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ Panel Categories Панел Ñ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¸ Status Bar Лента за ÑÑ‚Ð°Ñ‚ÑƒÑ Full Screen ЦÑл екран Stay On Top Винаги най-отгоре Categories Категории Label Етикет Show labels menu Покажи меню Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚Ð¸ Close Tab Затвори таба Close Other Tabs Затвори другите табове Close All Tabs Затвори вÑички табове Switch to next tab Премини в ÑÐ»ÐµÐ´Ð²Ð°Ñ‰Ð¸Ñ Ñ‚Ð°Ð± Switch to previous tab Премини в Ð¿Ñ€ÐµÐ´Ð¸ÑˆÐ½Ð¸Ñ Ñ‚Ð°Ð± Unread Ðепрочетени Starred Ð¡ÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Deleted Изтрити Labels Етикети Decrease news list/increase browser Ðамали ÑпиÑъка Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸/увеличи браузъра Increase news list/decrease browser Увеличи ÑпиÑъка Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸/намали браузъра Find ТърÑене Open Homepage Feed Отвори Ñтраницата на емиÑиÑта Sort by Name Подреждане по име Collapse All Folders Свий вÑички папки Expand All Folders Отвори вÑички папки Next Folder Следваща папка Previous Folder Предишна папка Expand Folder Отвори папката Setting Page: Labels Страница наÑтройки: Етикети Share Сподели Sort By Подреждане по Ascending ВъзходÑщо Descending ÐизходÑщо Check for updates Провери за Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ A new version of QuiteRSS... Има нова верÑÐ¸Ñ Ð½Ð° QuiteRSS... Loading... Зареждане... Web Page Уеб Ñтраница Save As Съхрани като HTML-Files (*.%1) HTML-Файлове (*.%1) Text files (*.%2) ТекÑтови файлове (*.%2) Save As: can't open a file Съхрани като: не мога да Ð¾Ñ‚Ð²Ð¾Ñ€Ñ Ñ„Ð°Ð¹Ð»Ð° Choose Directory Избери папка Important Важни Work Работни Personal Лични To Do Задачи Later За по-къÑно Amusingly Забавни NetworkManager SSL Certificate Error! Грешка в SSL Ñертификата! The "%1" server has the following errors in the SSL certificate: Сървърът "%1" отговори ÑÑŠÑ Ñледната грешка за SSL Ñертификата: <b>Organization: </b> <b>ОрганизациÑ: </b> <b>Domain Name: </b> <b>Домейн: </b> <b>Expiration Date: </b> <b>Дата на валидноÑÑ‚: </b> <b>Error: </b> <b>Грешка: </b> Would you like to make an exception for this certificate? Желаете ли да направите изключение за този Ñертификат? NewsFiltersDialog News Filters Филтри за новините Feeds ЕмиÑии Filter Name Име на филтъра New... Ðов... Edit... ПромÑна... Delete... Изтриване... Move up ПремеÑти нагоре Move down ПремеÑти надолу Run Filter Изпълни филтъра Delete Filter Изтрий филтъра Are you sure you want to delete the filter '%1'? ÐаиÑтина ли иÑкаш да изтриеш филтър '%1'? NewsHeader Icon Feed Икона на емиÑиÑта Title Заглавие Published Публикувана Received Получена Author Ðвтор Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Read Прочетена Star Звезда Label Етикет Feed Title Заглавие на емиÑиÑта Link Връзка NewsItem Mark Read/Unread Отбележи прочетени/непрочетени Delete News Изтрий новините NewsTabWidget Loading... (%p%) Зареждане... (%p%) Home Ðачало Open Page in External Browser Отвори Ñтраницата във външен браузър Open Link in External Browser Отвори връзката във външен браузър Open Link Отвори връзката Open in New Tab Отвори в нов таб Save Link... Съхрани връзката... Save Image... Съхрани изображението... Copy Link Копирай връзката Copy Копирай Go Back Върни Ñе Go Forward Иди напред Stop Спри Reload Презареди Copy Image Копирай изображението Copy Image Address Копирай адреÑа на изображението Load Images Зареди изображениÑта Auto Load Images to News View Ðвтоматично зареждай Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ преглед на новините No Load Images Ðе зареждай изображениÑта No Load Images to News View Ðе зареждай изображениÑта при преглед на новините Close Tab Затвори таба Auto Load Images in News View Ðвтоматично зареждай изображениÑта при преглед на новините Don't Load Images Ðе зареждай изображениÑта Don't Load Images in News View Ðе зареждай изображениÑта при преглед на новините Comments Коментари Author: %1 Ðвтор: %1 audio звук video видео media Ð¼ÐµÐ´Ð¸Ñ Link to Връзка към Mark Read/Unread Отбележи прочетени/непрочетени Mark News Star Отбележи новините ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Label Етикет Share Сподели Open News in External Browser Отвори новините във външен браузър Delete Изтрий NotificationWidget Close Затвори Mark All News Read Отбележи вÑички новини като прочетени Previous Page Предишна Ñтраница Next Page Следваща Ñтраница Incoming News: %1 ВходÑщи новини: %1 Page %1 of %2 Страница %1 от %2 OptionsDialog Options ÐаÑтройки General Общи System Tray System tray Network Connections Мрежови връзки Browser Браузър Feeds ЕмиÑии Labels Етикети Notifications ИзвеÑÑ‚Ð¸Ñ Passwords Пароли Language Език Fonts & Colors Шрифтове и цветове Keyboard Shortcuts Бързи клавиши Warning: key is already assigned to Внимание: клавишът е аÑоцииран Ñ Show splash screen on startup Покажи информационен екран при Ñтартиране Reopen last opened feeds on startup При Ñтартиране отвори поÑледно отворените емиÑии Open new tab next to active Отвори нов таб до Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¸Ñ Hide feeds tree when opening tabs При отварÑне на табове Ñкрий дървото Ñ ÐµÐ¼Ð¸Ñии Show default rss-icon instead of favourite one Покажи rss-икона по подразбиране вмеÑто favourite Automatically collapse folders Ðвтоматично Ñвий папките Show close button on tab Покажи бутон за затварÑне на таба Automatically check for updates ПроверÑвай автоматично за Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Help improve QuiteRSS by sending usage information Помогнете за подобрÑването на QuiteRSS чрез изпращане на ÑтатиÑтики Store a DB in memory (requires program restart) Запазвайте DB в паметта (изиÑква реÑтарт на програмата) Save DB stored in memory to file every ЗапиÑвайте DB от паметта във файл на вÑеки minutes минути Run QuiteRSS at Windows startup Стартирай QuiteRSS заедно Ñ Windows Show system tray icon Покажи икона в system tray starting QuiteRSS Ñтартиране на QuiteRSS minimizing QuiteRSS минимизиране на QuiteRSS closing QuiteRSS затварÑне на QuiteRSS Show static icon Покажи Ñтатична икона Change icon for incoming new news Промени иконата Ñпоред приÑтигащи нови новини Show count of new news Покажи Ð±Ñ€Ð¾Ñ Ð½Ð° новите новини Show count of unread news Покажи Ð±Ñ€Ð¾Ñ Ð½Ð° непрочетените новини Single click instead of double click for show window Показване на прозореца Ñ ÐµÐ´Ð¸Ð½Ð¸Ñ‡ÐµÐ½ клик вмеÑто двоен Empty working set on minimize to tray Изпразни ползваната памет при минимизиране в tray Move to the system tray when: ПремеÑти в system tray при: Tray icon behavior: Поведение на tray иконата: Direct connection to the Internet Директна връзка Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚ System proxy configuration (if available) ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ ÑиÑтемно прокÑи (ако е налично) Manual proxy configuration: Ръчна ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½Ð° прокÑи: Proxy server: ПрокÑи Ñървър: Port: Порт: Username: ПотребителÑко име: Password: Парола: Request timeout: Таймаут на заÑвката: Number of requests: Брой заÑвки: Number of retries: Брой опити: Options network requests when updating feeds (requires program restart): ÐаÑтройки за мрежовите заÑвки при обновление на емиÑиите (изиÑква реÑтарт на програмата): Use embedded browser Използвай Ð²Ð³Ñ€Ð°Ð´ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ Use external browser Използвай Ð²ÑŠÐ½ÑˆÐ½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ Default external browser Външен браузър по подразбиране Following external browser: Ð¡Ð»ÐµÐ´Ð½Ð¸Ñ Ð²ÑŠÐ½ÑˆÐµÐ½ браузър: Browse... Прегледай... Load images Зареди изображениÑта Enable JavaScript Разреши JavaScript Enable plug-ins Разреши добавки Open links in embedded browser in background ОтварÑй връзките във Ð²Ð³Ñ€Ð°Ð´ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ във фонов режим Open links in external browser in background (experimental) ОтварÑй връзките във Ð²ÑŠÐ½ÑˆÐ½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÑŠÑ€ във фонов режим (екÑпериментално) Default zoom on pages: Мащабиране за Ñтраниците по подразбиране: Browser selection: Избор на браузър: External browser: Външен браузър: Content: Съдържание: User style sheet: ПотребителÑки Ñтилове: Maximum pages in cache МакÑимум Ñтраници в кеша Store cache in: СъхранÑвай кеша в: Maximum size of disk cache МакÑимален обем на диÑÐºÐ¾Ð²Ð¸Ñ ÐºÐµÑˆ MB MB Use disk cache Използвай диÑков кеш Allow local data to be set Разреши Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° локални данни Keep local data only until quit application СъхранÑвай локалните данни до изход от програмата Block sites from setting any data Блокирай Ñайтовете да не пращат данни Clear ПочиÑти Cookies: БиÑквитки: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash е добавка, коÑто блокира автоматичното зареждане на Flash в Ñтраницата. Винаги може да бъде зареден ръчно, като кликнете на иконата Flash play. Use Click to Flash Използвай Click to Flash Add... Добави... Remove... Премахни... Ask where to save each file before downloading Питай вÑеки път къде да бъде Ñъхранено вÑÑко изтеглÑне Download location: МеÑтоположение за ÑвалÑне: History ИÑÑ‚Ð¾Ñ€Ð¸Ñ Click to Flash Click to Flash Downloads ИзтеглÑÐ½Ð¸Ñ Automatically update the feeds on startup Ðвтоматично обновÑвай емиÑиите при Ñтартиране Automatically update the feeds every ОбновÑвай автоматично емиÑиите на вÑеки seconds Ñекунди hours чаÑа Nothing to do Ðе прави нищо Dec Дек December Декември Display format for date: Формат на датата: time: чаÑ: Alternating row background colors Редуващи Ñе цветове на фона на редовете Simplified representation of date and time ОпроÑтено предÑтавÑне на дата и Ñ‡Ð°Ñ Show All Покажи вÑички Show New Покажи новите Show Unread Покажи непрочетените Show Starred Покажи ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Show Not Starred Покажи без звезда Show Unread or Starred Покажи непрочетени или ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Show Last Day Покажи поÑледен ден Show Last 7 Days Покажи поÑледните 7 дни Style sheet for news: Стил за новините Mark news as read: Отбележи новините като прочетени: on selecting. With timeout при избор. Ð¡ÑŠÑ Ð·Ð°ÐºÑŠÑнение after switching to another news Ñлед преминаване на друга новина Mark displayed news as read when switching feeds При преминаване на друга емиÑиÑ, отбележи показаните новини като прочетени Mark displayed news as read when closing tab При затварÑне на таба, отбележи показаните новини като прочетени Mark displayed news as read on minimize При минимизиране отбележи показаните новини като прочетени Change behavior of action 'Next Unread News' Промени поведението на дейÑтвие "Следваща непрочетена новина" starred news новини ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° labeled news новини Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚ Automatically mark identical news as read ОтбелÑзвай автоматично идентични новини като прочетени Prevent accidental deletion of: Предпазвай Ñлучайно изтриване на: Enable cleanup on shutdown Разреши изчиÑтване при затварÑне Maximum age of news in days to keep: Пази новини не по-Ñтари от (дни): Maximum number of news to keep: Пази новини, не повече от: Delete read news Изтрий прочетените новини Never delete unread news Ðикога не изтривай непрочетени новини Never delete starred news Ðикога не изтривай новини ÑÑŠÑ Ð·Ð²ÐµÐ·Ð´Ð° Never delete labeled news Ðикога не изтривай новини Ñ ÐµÑ‚Ð¸ÐºÐµÑ‚ Clean up 'Deleted' ИзчиÑти 'Изтрити' Enable DB optimization (slower shutdown) Разреши Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð½Ð° DB (по-бавно затварÑне) Reading Четене Clean Up ПочиÑтване New... Ðово... Edit... Редактиране... Delete... Изтриване... Move up Ðагоре Move down Ðадолу Show when inactive main window Покажи при неактивен прозорец Screen Екран Transparency ПрозрачноÑÑ‚ Show titles feeds Покажи заглавиÑта на емиÑиите Show icon feed Покажи иконите на емиÑиите Show button 'Mark All News Read' Покажи бутон "Отбележи вÑички новини като прочетени" Show button 'Mark Read/Unread' Покажи бутон 'Отбележи Прочетени/Ðепрочетени' Show button 'Open in External Browser' Покажи бутон 'Отвори във външен браузър' Show button 'Delete News' Покажи бутон 'Изтрий новините' Play sound for incoming new news Възпроизведи звук при нови новини Play Възпроизведи Display notification for incoming news Покажи извеÑтие за нови новини Top Left Горе лÑво Top Right Горе дÑÑно Bottom Left Долу лÑво Bottom Right Долу дÑÑно Review Преглед Position Разположение Show maximum of Покажи не повече от item on page notification новини на Ñтраница при извеÑÑ‚Ñване Width list items Ширина на ÑпиÑъка pixels пикÑела Close notification after Затвори извеÑтието Ñлед Do not show notification in fullscreen mode Ðе показвай извеÑÑ‚Ð¸Ñ Ð² режим на цÑл екран Display Показване Action mouse on news opening: ДейÑтвие Ñ Ð¼Ð¸ÑˆÐºÐ°Ñ‚Ð° върху новина отварÑ: Single Click: Единично щракване: Double Click: Двойно щракване: Middle Click: Средно щракване: Only show selected feeds: Покажи Ñамо избрани емиÑии: Notification ИзвеÑтие Sound Звук Selection of feeds Избор на емиÑии All Feeds Ð’Ñички емиÑии Site Сайт User Потребител Password Парола Delete Изтрий Delete All Изтрий вÑички Show Passwords Покажи паролите Version ВерÑÐ¸Ñ Author Ðвтор Contact Контакти Choose language: Избери език Type Тип Font Шрифт Feeds list font Шрифт за ÑпиÑъка Ñ ÐµÐ¼Ð¸Ñии News list font Шрифт за ÑпиÑъка Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ News title font Шрифт за заглавие на новини News text font Шрифт за текÑта на новини Notification font Шрифт при извеÑтие Change... ПромÑна... Reset Ðулиране Feeds list color ЦвÑÑ‚ на ÑпиÑъка Ñ ÐµÐ¼Ð¸Ñии Feeds list background Фон на ÑпиÑъка Ñ ÐµÐ¼Ð¸Ñии News list color ЦвÑÑ‚ на ÑпиÑъка Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ News list background Фон на ÑпиÑъка Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ Focused news color ЦвÑÑ‚ на новина на Ñ„Ð¾ÐºÑƒÑ Focused news background color Фон на новина на Ñ„Ð¾ÐºÑƒÑ Link color ЦвÑÑ‚ на връзки Title color ЦвÑÑ‚ на Ð·Ð°Ð³Ð»Ð°Ð²Ð¸Ñ Date color ЦвÑÑ‚ на дата Author color ЦвÑÑ‚ на автор News text color ЦвÑÑ‚ на текÑта на новини News title background Фон на заглавието на новини News background Фон на новини Feed with new news ЕмиÑÐ¸Ñ Ñ Ð½Ð¾Ð²Ð¸ новини Count of unread news in feeds tree Брой непрочетени новини в дървото Ñ ÐµÐ¼Ð¸Ñии Disabled feed Забранена емиÑÐ¸Ñ Alternating row colors Ðлтернативни цветове на редовете Notification text color ЦвÑÑ‚ на текÑта при извеÑтие Notification background color ЦвÑÑ‚ на фона при извеÑтие Auto load images in news view Ðвтоматично зареждай изображениÑта при преглед на новини Text color of new news ЦвÑÑ‚ на текÑта на новите новини Show feeds tree toggle Превключване на дървото Ñ ÐµÐ¼Ð¸Ñиите Clear new status when minimize to tray ИзчиÑти ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð¾Ð²Ð¸ при минимизиране в tray Set focus on the last opened news Сложи на Ñ„Ð¾ÐºÑƒÑ Ð¿Ð¾Ñледната отворена новина Set focus at the top of news list Сложи на Ñ„Ð¾ÐºÑƒÑ Ð½Ð°Ð¹-горната новина от ÑпиÑъка Set focus on the unread news Сложи на Ñ„Ð¾ÐºÑƒÑ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡ÐµÑ‚ÐµÐ½Ð¸Ñ‚Ðµ новини Open the news Отвори новините Default news filter: Филтър по подразбиране за новини: Action on feed opening: ДейÑтвие при отварÑне на емиÑиÑ: Show news description instead of loading web page Покажи опиÑанието на новината вмеÑто зареждане на уебÑтраницата Text color of unread news ЦвÑÑ‚ на текÑта за непрочетените новини Focused feed color ЦвÑÑ‚ на емиÑиÑта на Ñ„Ð¾ÐºÑƒÑ Focused feed background color ЦвÑÑ‚ на фона на емиÑиÑта на Ñ„Ð¾ÐºÑƒÑ Standard Стандартен Fixed ФикÑиран Serif Серифен Sans Serif БезÑерифен Cursive Ðаклонен Fantasy Фентъзи Default font size Размер по подразбиране Fixed font size ФикÑиран размер Minimum font size Минимален размер Minimum logical font size Минимален логичеÑки размер Font families: СемейÑтва шрифтове Font sizes: Размери шрифтове Fonts Шрифтове Fonts Browser Преглед на шрифтове Colors Цветове Filter Филтър Action ДейÑтвие Description ОпиÑание Shortcut ПрÑк път Shortcut: ПрÑк път: Open File... Отвори файл... Select Style Sheet File Избери файл ÑÑŠÑ Ñтилове Open Directory... Отвори папка... Add site to whitelist Добави Ñайта в Ð±ÐµÐ»Ð¸Ñ ÑпиÑък Site without 'http://' (ex. youtube.com) Сайт без 'http://' (напр. youtube.com) QAbstractSpinBox &Step up Ðа&горе Step &down Ðа&долу &Select All Избери &вÑички QDialogButtonBox Close Затвори Cancel Откажи &Yes &Да &No &Ðе QFtp Not connected ÐÑма връзка Host %1 not found ХоÑÑ‚ %1 не е намерен Connection refused to host %1 Връзката към хоÑÑ‚ %1 отказана Connection timed out to host %1 Таймаут при опит за връзка Ñ Ñ…Ð¾ÑÑ‚ %1 Connected to host %1 Свързан към хоÑÑ‚ %1 Connection refused for data connection Отказана връзка за данни Unknown error ÐеизвеÑтна грешка Connecting to host failed: %1 Връзката до хоÑта Ñе провали: %1 Login failed: %1 ÐеуÑпешен вход: %1 Listing directory failed: %1 Получаване на ÑпиÑъка неуÑпешно: %1 Changing directory failed: %1 ÐеуÑпешна промÑна на директориÑ: %1 Downloading file failed: %1 ИзтеглÑнето на файла е неуÑпешно: %1 Uploading file failed: %1 Качване на файл неуÑпешно: %1 Removing file failed: %1 ÐеуÑпешно премахване на файл: %1 Creating directory failed: %1 ÐеуÑпешно Ñъздаване на директориÑ: %1 Removing directory failed: %1 ÐеуÑпешно премахване на директориÑ: %1 Connection closed Връзката прекъÑната QLineEdit &Undo &Undo &Redo &Redo Cu&t Из&Ñ€Ñзване &Copy &Копиране &Paste &Вмъкване Delete Изтриване Select All Избери вÑички QMultiInputContext Select IM Избери IM QObject Cannot start external program Ðе мога да Ñтартирам външна програма Cannot start external program! %1 Ðе мога да Ñтартирам външна програма! %1 Error Грешка QTextControl &Undo &Undo &Redo &Redo Cu&t Из&Ñ€Ñзване &Copy &Копиране &Paste &Вмъкване Delete Изтриване Select All Избери вÑички Copy &Link Location Копиране на връ&зката QWizard Cancel Отказ < &Back < Ð&азад &Finish &Завършване &Next > Ðа&пред > RSSDetectionWidget Untitled feed Ðеозаглавена емиÑÐ¸Ñ RequestFeed Server requires authentication! Сървърът изиÑква автентикациÑ! Server replied: Not Found! Отговор на Ñървъра: Ðенамерен! Redirect error! Грешка при пренаÑочване! Request timeout! Таймаут на заÑвката! SQLiteDriver Error opening database Грешка при отварÑне на базата данни Error closing database Грешка при затварÑне на базата данни Unable to begin transaction Ðе мога да започна Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Unable to commit transaction Ðе мога да Ð¿Ð¾Ñ‚Ð²ÑŠÑ€Ð´Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ Unable to rollback transaction Ðе мога да възÑÑ‚Ð°Ð½Ð¾Ð²Ñ Ñ‚Ñ€Ð°Ð½Ð·Ð°ÐºÑ†Ð¸Ñ SQLiteResult Unable to fetch row Ðе мога да прочета ред No query ÐÑма Ð²ÑŠÐ¿Ñ€Ð¾Ñ Unable to execute statement Ðе мога да Ð¸Ð·Ð¿ÑŠÐ»Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° Unable to execute multiple statements at a time Ðе мога да Ð¸Ð·Ð¿ÑŠÐ»Ð½Ñ Ð½Ñколко команди едновременно Unable to reset statement Ðе мога да нулирам команда Unable to bind parameters Ðе мога да задам параметри Parameter count mismatch БроÑÑ‚ на параметрите не Ñъвпада SslErrorDialog SSL Certificate Error! Грешка в SSL Ñертификата! Only for this session Само за тази ÑеÑÐ¸Ñ UpdateAppDialog Check for Updates Провери за Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Checking for updates... ПроверÑвам за обновлениÑ... Loading history... Зареждам иÑториÑта... Don't remind about this version Ðе ми напомнÑй за тази верÑÐ¸Ñ &Install &ИнÑталирай You already have the latest version Вие имате поÑледна верÑÐ¸Ñ A new version of QuiteRSS is available! Има нова верÑÐ¸Ñ Ð½Ð° QuiteRSS! Click here to go to the download page Щракни тук, за да отидеш до Ñтраницата за изтеглÑне Your version is: Вашата верÑÐ¸Ñ Ðµ: Current version is: Текущата верÑÐ¸Ñ Ðµ: Error checking updates Грешка при проверÑване за Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ quiterss-0.18.3/lang/quiterss_cs.ts000066400000000000000000005516021265173051100173310ustar00rootroot00000000000000 AboutDialog About O aplikaci Revision Revize Version Verze QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS je open-source a multi-platformní RSS/Atom ÄteÄka Includes: Obsahuje: Application directory: Adresář aplikace: Resource directory: Adresář zdrojů: Data directory: Adresář dat: Backup directory: Adresář záloh: Database file: Soubor databáze: Settings file: Soubor nastavení: Log file: Soubor logu: Authors AutoÅ™i History Historie License Licence Information Informace AdBlockAddSubscriptionDialog Add Subscription PÅ™idat sadu filtrů Title: Název: Address: Adresa: Add new subscription to AdBlock: PÅ™idat novou sadu filtrů do AdBlocku: AdBlockCustomList Custom Rules Vlastní filtry AdBlockDialog AdBlock Configuration Nastavení AdBlocku Enable AdBlock Povolit AdBlock Search... Najít... Options Nastavení AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Použít pouze základní Äást EasyList (z výkonnostních důvodů) Add Rule PÅ™idat pravidlo Remove Rule Odebrat pravidlo Add Subscription PÅ™idat sadu filtrů Remove Subscription Odebrat sadu filtrů Update Subscriptions Aktualizovat sady filtrů Learn about writing rules... Další informace o psaní pravidel... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock umožňuje blokovat nežádoucí obsah na webových stránkách AdBlock AdBlock Show AdBlock &Settings Zobrazit na&stavení AdBlock Disable on %1 Zakázat na %1 Disable only on this page Zakázat pouze na této stránce Blocked Popup Windows Blokovaná vyskakovací okna %1 with (%2) %1 s (%2) No content blocked Žádný blokovaný obsah Blocked URL (AdBlock Rule) - click to edit rule Blokovaná URL adresa (Pravidlo v AdBlock) - kliknÄ›te pro upravení pravidla AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Nepovedlo se naÄíst sadu filtrů! AdBlockTreeWidget Add Rule PÅ™idat pravidlo Remove Rule Odebrat pravidlo Add Custom Rule PÅ™idat vlastní pravidlo Please write your rule here: Zde napiÅ¡te vlastní pravidlo: %1 (recently updated) %1 (naposledy aktualizováno) %1 (Error: %2) %1 (Chyba: %2) AddFeedWizard Add Feed PÅ™idat kanál Create New Feed PÅ™idat nový kanál Use title of the feed as displayed name Použít název kanálu jako zobrazovaný název Server requires authentication: Server vyžaduje pÅ™ihlášení: Username: Uživatelské jméno: Password: Heslo: Feed URL or website address: URL kanálu nebo adresa webové stránky: Feeds Kanály All Feeds VÅ¡echny kanály New Folder... Nová složka... Displayed name: Zobrazovaný název: Location: UmístÄ›ní: URL error! Chybná URL! Duplicate feed! Duplicitní kanál! Can't find feed URL! Nelze nalézt URL kanálu! Request failed! Požadavek selhal! AddFolderDialog Add Folder PÅ™idat složku Feeds Kanály All Feeds VÅ¡echny kanály Name: Název: Location: UmístÄ›ní: AuthenticationDialog Save password Uložit heslo Authorization required Vyžadováno pÅ™ihlášení Server: Server: Message: Zpráva: Username: Uživatelské jméno: Password: Heslo: CategoriesTreeWidget Unread NepÅ™eÄteno Starred OznaÄené hvÄ›zdiÄkou Deleted Smazané Labels Å títky Open in New Tab Otevřít v nové záložce Clear 'Deleted' VyÄistit 'Smazané' Mark Read OznaÄit za pÅ™eÄtené CleanUpWizard Clean Up ÄŒiÅ¡tÄ›ní Choose Feeds VýbÄ›r kanálů All Feeds VÅ¡echny kanály Clean Up Options Nastavení ÄiÅ¡tÄ›ní Maximum age of news in days to keep: Smazat novinky starší více než (dnů): Maximum number of news to keep: Smazat novinky pÅ™esahující celkový poÄet (nejstarší): Delete read news Smazat pÅ™eÄtené novinky Never delete unread news Nikdy nemazat nepÅ™eÄtené novinky Never delete starred news Nikdy nemazat novinky oznaÄené hvÄ›zdiÄkou Never delete labeled news Nikdy nemazat novinky oznaÄené Å¡títkem Clean up 'Deleted' Odstranit 'Smazané' Purge DB VyÄistit DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear ÚplnÄ› odstranit záznamy oznaÄené 'Smazané' z DB. Staré novinky se mohou znovu objevit Information Informace Clean Up wizard deleted %1 news Průvodce ÄiÅ¡tÄ›ním odstranil %1 novinek ClickToFlash Object blocked by ClickToFlash Objekt zablokován doplňkem Click to Flash Hide object Skrýt objekt Add '%1' to whitelist PÅ™idat '%1' na whitelist CustomizeToolbarDialog Customize Main Toolbar Upravit hlavní liÅ¡tu Customize Feeds Toolbar Upravit liÅ¡tu kanálů Customize News Toolbar Upravit liÅ¡tu novinek Load images NaÄítat obrázky Separator OddÄ›lovaÄ Icon Ikonka Text Text Text Beside Icon Text vedle ikonky Text Under Icon Text pod ikonkou Big Velká Normal Normální Small Malá Style: Styl: Icon Size: Velikost ikonek: Add PÅ™idat Remove Odebrat Move up Nahoru Move down Dolů Default Výchozí DownloadItem Remaining time unavailable Zbývající Äas není dostupný Error: Cannot write to file! Chyba: Nelze zapisovat do souboru! Error: Chyba: few seconds pár sekund seconds sekund minutes minut hours hodin Unknown size Neznámá velikost Unknown speed Neznámá rychlost %2 - unknown size (%3) %2 - neznámá velikost (%3) Remaining %1 - %2 of %3 (%4) Zbývá %1 - %2 z %3 (%4) Cancelled - %1 ZruÅ¡eno - %1 Delete file Smazat soubor Do you want to also delete downloaded file? Chcete také smazat stažený soubor? Open File Otevřít soubor Open Folder Otevřít složku Copy Download Link Kopírovat odkaz ke stažení Cancel Downloading ZruÅ¡it stahování Remove Odebrat Cancelled ZruÅ¡eno Error Chyba Not found Nenalezeno Sorry, the file %1 was not found! Omlouváme se, soubor ⎠%1 ⎠nebyl nalezen! DownloadManager Clear VyÄistit File %1 (*.%2) Soubor %1 (*.%2) All Files (*.*) VÅ¡echny soubory (*.*) Save As... Uložit jako... Executable: Spustitelný soubor: Arguments: Parametry: FeedPropertiesDialog Properties PÅ™edvolby General Obecné Columns Sloupce Authentication PÅ™ihlášení Status Stav Title: Název: Homepage: Web: Feed URL: URL kanálu: Load Title NaÄíst název Load Favicon NaÄíst ikonku Select Icon... Vybrat ikonku... Select Icon Vybrat ikonku Disable update Zakázat aktualizace Automatically update every Automaticky aktualizovat každých seconds sekund minutes minut hours hodin Starred OznaÄené hvÄ›zdiÄkou Load images NaÄítat obrázky Display in new tab on startup Po spuÅ¡tÄ›ní zobrazit v nové záložce Show news' description instead of loading web page Zobrazovat popis novinky místo naÄítání webové stránky Automatically delete duplicate news Automaticky odstranit duplicitní novinky Display Zobrazení Reading ÄŒtení Enable JavaScript Povolit JavaScript Right-to-left layout Rozvržení zprava doleva Ascending VzestupnÄ› Descending SestupnÄ› Sort by: Řadit dle: Add PÅ™idat Remove Odebrat Move up Posunout nahoru Move down Posunout dolů Default Výchozí Server requires authentication: Server vyžaduje pÅ™ihlášení: Username: Uživatelské jméno: Password: Heslo: Feeds count: PoÄet kanálů: Description: Popis: Status: Stav: Created: VytvoÅ™eno: Last update: Poslední aktualizace: News count: PoÄet novinek: Good Dobrý Long ago ;-) Kdysi dávno ;-) new nové unread nepÅ™eÄteno Image files Obrázky Select Image Vybrat obrázek Load icon: can't open a file! VýbÄ›r ikonky: soubor nelze otevřít FilterRulesDialog Filter Rules Pravidla filtru Feeds Kanály All Feeds VÅ¡echny kanály Filter name: Název filtru: Match all news Odpovídá vÅ¡em novinkám Match all conditions Odpovídá vÅ¡em podmínkám Match any condition Neodpovídá žádné podmínce Perform these actions: Vykonat tyto akce: Please enter name for the filter. Prosím zadejte název filtru. Please enter search condition for the news filter. Prosím zadejte podmínku filtru. FindFeed Find Name Najít název Find Link Najít odkaz FindTextContent Find in News Najít v novinkách Find in Titles Najít v názvech Find in Authors Najít v autorech Find in Categories Najít v kategoriích Find in Descriptions Najít v popisech Find in Links Najít v odkazech Find in Browser Vyhledávání v prohlížeÄi FtpDownloader Canceled! ZruÅ¡eno! ItemAction Mark News as Read OznaÄit novinky za pÅ™eÄtené Add Star OznaÄit hvÄ›zdiÄkou Delete Smazat Add Label PÅ™idat Å¡títek Play a Sound PÅ™ehrát zvuk Show News in Notifier Zobrazit novinky v oknÄ› oznámení Browse Procházet Play PÅ™ehrát Add Action PÅ™idat akci Delete Action Smazat akci Open File... Otevřít soubor ... ItemCondition Title Název Description Popis Author Autor Category Kategorie State Stav Link Odkaz News Novinky New Nová Read PÅ™eÄtená Starred OznaÄená hvÄ›zdiÄkou Add Condition PÅ™idat podmínku Delete Condition Smazat podmínku contains obsahuje doesn't contains neobsahuje is je isn't není begins with zaÄíná na ends with konÄí na Regular expressions Regulární výraz LabelDialog New Label Nový Å¡títek Load icon... Vybrat ikonku... Default Výchozí Select color... Vybrat barvu... Name: Název: Icon: Ikonka: Color text: Barva textu: Color background: Barva pozadí: Image files Obrázky Select Image Vybrat obrázek Load icon: can't open a file! VýbÄ›r ikonky: soubor nelze otevřít MainApplication Saving data... Ukládání dat... MainWindow &AdBlock &AdBlock Hide Categories Skrýt kategorie Show Categories Zobrazit kategorie Select OPML-File Vybrat soubor OPML OPML-Files (*.%1 *.%2) Soubory OPML (*.%1 *.%2) Import canceled Import zruÅ¡en Import: can't open a file Import: nelze otevÅ™it soubor OPML-Files (*.%1) Soubory OPML (*.%1) Export canceled Export zruÅ¡en Export: can't open a file Export: nelze otevřít soubor Unread: %1 NepÅ™eÄteno: %1 All: %1 VÅ¡e: %1 (Browser) (ProhlížeÄ) New News: %1 Nové novinky: %1 Unread News: %1 NepÅ™eÄtené novinky: %1 &Add PÅ™id&at Add New Feed PÅ™idat nový kanál &Feed... &Kanál... F&older... Sl&ožka... Add New Folder PÅ™idat novou složku Open in New Tab Otevřít v nové záložce &Delete... &Smazat... Delete Selected Feed Smazat vybraný kanál &Import Feeds... &Importovat kanály... Import Feeds from OPML File Importovat kanýly z OPML souboru &Export Feeds... &Exportovat kanály... Export Feeds to OPML File Exportovat kanály do OPML souboru E&xit U&konÄit Update Feed Aktualizovat kanál Update Current Feed Aktualizovat vybraný kanál Update All Aktualizovat vÅ¡e Update All Feeds Aktualizovat vÅ¡echny kanály Mark All Feeds Read OznaÄit vÅ¡echny kanály za pÅ™eÄtené Mark Read/Unread OznaÄit za pÅ™eÄtené/nepÅ™etené Mark Current News Read/Unread OznaÄit aktuální novinku za pÅ™eÄtenou/nepÅ™eÄtenou Mark All News Read OznaÄit vÅ¡echny novinky za pÅ™eÄtené Downloads Stahování Clean Up... ÄŒiÅ¡tÄ›ní... News Filters... Filtry novinek... Filter News... Filtr novinky... Options... Nastavení... Open Options Dialog Otevřít dialogové okno s nastavením Filter Feeds Filtr kanálů Show All Zobrazit vÅ¡e Show New Zobrazit nové Show Unread Zobrazit nepÅ™eÄtené Show Starred Feeds Zobrazit kanály oznaÄené hvÄ›zdiÄkou Show Not Working Feeds Zobrazit nefunkÄní kanály Filter News Filtr novinek Show Starred Zobrazit oznaÄené hvÄ›zdiÄkou Show Not Starred Zobrazit neoznaÄené hvÄ›zdiÄkou Show Unread or Starred Zobrazit nepÅ™eÄtené nebo oznaÄené hvÄ›zdiÄkou Show Last Day Zobrazit za poslední den Show Last 7 Days Zobrazit za posledních 7 dní About... O aplikaci... Show 'About' Dialog Otevřít dialogové okno s informacemi o aplikaci Check for Updates... Zkontrolovat aktualizace... Report a Problem... Nahlásit problém... Open News Otevřít novinky Open in Browser Otevřít v prohlížeÄi Open in External Browser Otevřít v externím prohlížeÄi Open News in External Browser Otevřít novinku v externím prohlížeÄi Open News in New Tab Otevřít v nové záložce Open in Background Tab Otevřít v nové záložce na pozadí Open News in Background Tab Otevřít novinku v nové záložce na pozadí Star HvÄ›zdiÄka Mark News Star OznaÄit novinky hvÄ›zdiÄkou Delete Smazat Delete Selected News Smazat vybrané novinky Delete All News Smazat vÅ¡echny novinky Delete All News from List Smazat vÅ¡echny novinky ze seznamu Restore Obnovit Restore News Obnovit novinky Copy Link Kopírovat odkaz Restore last deleted news Obnovit poslední smazanou novinku Mark Read OznaÄit za pÅ™eÄtené Mark Feed Read OznaÄit kanál za pÅ™eÄtený Properties PÅ™edvolby &File &Soubor Count Unread News PoÄet nepÅ™eÄtených novinek Count All News PoÄet vÅ¡ech novinek Last Update Poslední aktualizace Reset browser zoom Obnovit výchozí zobrazení v prohlížeÄi Print Web Page Tisk webové stránky Preview Web Page Náhled webové stránky Save page in database Uložit stránku v databázi Save page in database instead of news description Uložit stránku do databáze místo popisu novinky Confirm Delete Potvrzení smazání Are you sure to delete selected elements? Opravdu chcete smazat vybrané elementy? Menu Hlavní nabídka Add Feed... PÅ™idat kanál... &Create Backup... &VytvoÅ™it zálohu... S&how Menu Bar Zobrazit hlavní nabídku Stop Update Feeds Zastavit aktualizaci kanálů Open News Description Otevřít popis novinky Copy News Link Kopírovat odkaz novinky &View &Zobrazit Fee&ds Kanál&y &News &Novinky &Browser &ProhlížeÄ &Tools &Nástroje &Help &NápovÄ›da Main Toolbar Hlavní nástrojovou liÅ¡tu Customize Toolbar Upravit nástrojovou liÅ¡tu Main Toolbar... Hlavní nástrojovou liÅ¡tu... Customize Toolbar... Upravit nástrojovou liÅ¡tu... Feeds Toolbar... Nástrojovou liÅ¡tu kanálů... News Toolbar... Nástrojovou liÅ¡tu novinek... Lock Toolbar Uzamknout nástrojovou liÅ¡tu Hide Toolbar Skrýt nástrojovou liÅ¡tu Layout Rozvržení Classic Klasické Newspaper Noviny Application Style Vzhled aplikace System Systém System2 Systém 2 Green Zelený Orange Oranžový Purple Fialový Pink Růžový Gray Å edý Browser Position UmístÄ›ní prohlížeÄe Top NahoÅ™e Bottom Dole Right Vpravo Left Vlevo Show Window Zobrazit okno Previous Feed PÅ™edchozí kanál Next Feed Další kanál Previous News PÅ™edchozí novinka Next News Další novinka News Page Up Posunout stránku novinek nahoru News Page Down Posunout stránku novinek dolů Next Unread News Další nepÅ™eÄtená novinka Previous Unread News PÅ™edchozí nepÅ™eÄtená novinka Switch Focus to Next Panel PÅ™epnout na další panel Switch Focus to Next Panel (Tree Feeds, List News, Browser) PÅ™epnout na další panel (Strom kanálů, Seznam novinek, ProhlížeÄ) Switch Focus to Previous Panel PÅ™epnout na pÅ™edchozí panel Switch Focus to Previous Panel (Tree Feeds, Browser, List News) PÅ™epnout na pÅ™edchozí panel (Strom kanálů, ProhlížeÄ, Seznam novinek) Show/Hide Tree Feeds Zobrazit/skrýt strom kanálů Minimize to Tray Minimalizovat do systémové liÅ¡ty Minimize Application to Tray Minimalizovat aplikaci do systémové liÅ¡ty Columns Sloupce Show Indentation Zobrazit odsazení Search Feed Najít kanál Zoom Zobrazení Zoom In PÅ™iblížit Zoom in in browser PÅ™iblížit v prohlížeÄi Zoom Out Oddálit Zoom out in browser Oddálit v prohlížeÄi 100% 100% Print... Tisk... Print Preview... Náhled tisku... Page up (Browser) Posunout stránku výše (prohlížeÄ) Page down (Browser) Posunout stránku níže (prohlížeÄ) Save As... Uložit jako... Save Page As... Uložit stránku jako... Show/Hide Zobrazit/Skrýt Feeds Toolbar Nástrojovou liÅ¡tu kanálů News Toolbar Nástrojovou liÅ¡tu novinek Browser Toolbar Nástrojovou liÅ¡tu prohlížeÄe Panel Categories Panel kategorií Status Bar Stavový řádek Full Screen Celá obrazovka Stay On Top Vždy navrchu Categories Kategorie Label Å títek Show labels menu Zobrazit nabídku Å¡títků Close Tab Zavřít záložku Close Other Tabs Zavřít ostatní záložky Close All Tabs Zavřít vÅ¡echny záložky Switch to next tab PÅ™epnout na další záložku Switch to previous tab PÅ™epnout na pÅ™edchozí záložku Unread NepÅ™eÄteno Starred OznaÄit hvÄ›zdiÄkou Deleted Smazané Labels Å títky Decrease news list/increase browser ZmenÅ¡it seznam novinek/zvÄ›tÅ¡it prohlížeÄ Increase news list/decrease browser ZvÄ›tÅ¡it seznam novinek/zmÄ›nÅ¡it prohlížeÄ Find Najít Open Homepage Feed Otevřít domovskou stránku kanálu Sort by Name Řadit dle názvu Collapse All Folders Sbalit vÅ¡echny složky Expand All Folders Rozbalit vÅ¡echny složky Next Folder Další složka Previous Folder PÅ™edchozí složka Expand Folder Rozbalit složku Setting Page: Labels Stránka nastavení: Å títky Share Sdílet Sort By Řadit dle Ascending VzestupnÄ› Descending SestupnÄ› Check for updates Zkontrolovat aktualizace A new version of QuiteRSS... Nová verze QuiteRSS... Loading... NaÄítání... Web Page Webová stránka Save As Uložit jako HTML-Files (*.%1) HTML soubory (*.%1) Text files (*.%2) Textové soubory (*.%2) Save As: can't open a file Uložit jako: nelze otevřít soubor Choose Directory Vybrat adresář Important Důležité Work Pracovní Personal Osobní To Do Úkol Later PozdÄ›ji Amusingly Zábava NetworkManager SSL Certificate Error! Chyba SSL certifikátu! The "%1" server has the following errors in the SSL certificate: Server "%1" obsahuje následující chybu v SSL certifikátu: <b>Organization: </b> <b>Organizace: </b> <b>Domain Name: </b> <b>Název domény: </b> <b>Expiration Date: </b> <b>Datum expirace: </b> <b>Error: </b> <b>Chyba: </b> Would you like to make an exception for this certificate? Chcete pro tento certifikát pÅ™idat výjimku? NewsFiltersDialog News Filters Filtry novinek Feeds Kanály Filter Name Název filtru: New... Nový... Edit... Upravit... Delete... Smazat... Move up Nahoru Move down Dolů Run Filter Spustit filtr Delete Filter Smazat filtr Are you sure you want to delete the filter '%1'? Opravdu chcete smazat filtr '%1'? NewsHeader Icon Feed Ikonka kanálu Title Název Published ZveÅ™ejnÄ›no Received PÅ™ijato Author Autor Category Kategorie Read PÅ™eÄteno Star HvÄ›zdiÄka Label Å títek Feed Title Název kanálu Link Odkaz NewsItem Mark Read/Unread OznaÄit za pÅ™eÄtené/nepÅ™etené Delete News Smazat novinku NewsTabWidget Loading... (%p%) NaÄítání... (%p%) Home Domů Open Page in External Browser Otevřít stránku v externím prohlížeÄi Open Link in External Browser Otevřít odkaz v externím prohlížeÄi Open Link Otevřít odkaz Open in New Tab Otevřít odkaz v nové záložce Save Link... Uložit odkaz... Save Image... Uložit obrázek... Copy Link Kopírovat odkaz Copy Kopírovat Go Back Vrátit se zpÄ›t Go Forward VpÅ™ed Stop Zastavit Reload Znovu naÄíst Copy Image Kopírovat obrázek Copy Image Address Kopírovat adresu obrázku Load Images NaÄítat obrázky Auto Load Images to News View Automaticky naÄítat obrázky v pÅ™ehledu novinek No Load Images NenaÄítat obrázky No Load Images to News View NenaÄítat obrázky v pÅ™ehledu novinek Close Tab Zavřít záložku Auto Load Images in News View Automaticky naÄítat obrázky v zobrazení novinek Don't Load Images NenaÄítat obrázky Don't Load Images in News View NenaÄítat obrázky v zobrazení novinek Comments Komentáře Author: %1 Autor: %1 audio audio video video media multimedia Link to Odkaz na Mark Read/Unread OznaÄit za pÅ™eÄtené/nepÅ™etené Mark News Star OznaÄit novinky hvÄ›zdiÄkou Label Å títek Share Sdílet Open News in External Browser Otevřít novinku v externím prohlížeÄi Delete Smazat NotificationWidget Close Zavřít Mark All News Read OznaÄit vÅ¡echny novinky za pÅ™eÄtené Previous Page PÅ™edchozí stránka Next Page Další stránka Incoming News: %1 Příchozí novinky: %1 Page %1 of %2 Stránka %1 ze %2 OptionsDialog Options Nastavení General Obecné System Tray Systémová liÅ¡ta Network Connections PÅ™ipojení Browser ProhlížeÄ Feeds Kanály Labels Å títky Notifications Oznámení Passwords Hesla Language Jazyk Fonts & Colors Písma & barvy Keyboard Shortcuts Klávesové zkratky Warning: key is already assigned to Varování: klÃ­Ä je již pÅ™idÄ›len k Show splash screen on startup PÅ™i spuÅ¡tÄ›ní zobrazit startovací obrazovku Reopen last opened feeds on startup Po spuÅ¡tÄ›ní znovu otevřít poslední kanály Open new tab next to active Otevřít novou záložku vedle aktuální záložky Hide feeds tree when opening tabs Po otevÅ™ení záložky skrýt seznam kanálů Show default rss-icon instead of favourite one Zobrazovat výchozí RSS ikonku místo oblíbené Automatically collapse folders Automaticky sbalit složky v seznamu kanálů Show close button on tab Zobrazit tlaÄítko zavřít na záložce Automatically check for updates Automaticky kontrolovat dostupnost aktualizací Help improve QuiteRSS by sending usage information Pomoct vylepÅ¡it QuiteRSS zasíláním informací o používání Store a DB in memory (requires program restart) Ukládat DB do pamÄ›ti (vyžaduje restartování programu) Save DB stored in memory to file every Pokaždé uložit DB z pamÄ›ti do soubor minutes minut Run QuiteRSS at Windows startup Spustit QuiteRSS pÅ™i startu Windows Show system tray icon Zobrazovat ikonku v systémové liÅ¡tÄ› starting QuiteRSS SpuÅ¡tÄ›ní QuiteRSS minimizing QuiteRSS Minimalizování QuiteRSS closing QuiteRSS ZavÅ™ení QuiteRSS Show static icon Zobrazovat statickou ikonku Change icon for incoming new news ZmÄ›nit ikonku pÅ™i stažení nových novinek Show count of new news Zobrazovat poÄet novÄ› pÅ™ijatých novinek Show count of unread news Zobrazovat poÄet nepÅ™eÄtených novinek Single click instead of double click for show window Pro zobrazení okna použít pouze jedno kliknutí místo dvou Empty working set on minimize to tray Vyprázdnit pracovní sadu pÅ™i minimalizaci do systémové liÅ¡ty Move to the system tray when: PÅ™esunout do systémové liÅ¡ty v případÄ›: Tray icon behavior: Chování ikonky v systémové liÅ¡tÄ›: Direct connection to the Internet Přímé spojení do internetu System proxy configuration (if available) Systémové nastavení proxy (pokud je dostupné) Manual proxy configuration: Vlastní nastavení proxy: Proxy server: Proxy server: Port: Port: Username: Uživatelské jméno: Password: Heslo: Request timeout: ÄŒasový limit pro požadavky: Number of requests: PoÄet požadavků: Number of retries: PoÄet pokusů: Options network requests when updating feeds (requires program restart): Možnosti požadavků na aktualizaci kanálů (vyžaduje restartování programu); Use embedded browser Použít integrovaný prohlížeÄ Use external browser Použít externí prohlížeÄ Default external browser Použít výchozí externí prohlížeÄ Following external browser: Použít vybraný externí prohlížeÄ: Browse... Procházet... Load images NaÄíst obrázky Enable JavaScript Povolit JavaScript Enable plug-ins Povolit zásuvné moduly Open links in embedded browser in background Odkazy v integrovaném prohlížeÄi otevírat na pozadí Open links in external browser in background (experimental) Odkazy v externím prohlížeÄi otevírat na pozadí (experimentální) Default zoom on pages: Výchozí pÅ™iblížení na stránkách: Browser selection: VýbÄ›r prohlížeÄe: External browser: Externí prohlížeÄ: Content: Obsah: User style sheet: Vlastní styly: Maximum pages in cache Maximální poÄet stránek v mezipamÄ›ti Store cache in: Ukládat do: Maximum size of disk cache Maximální velikost mezipamÄ›ti MB MB Use disk cache Použít mezipaměť Allow local data to be set Povolit nastavení dat daného webu Keep local data only until quit application Uchovat data jen do ukonÄení aplikace Block sites from setting any data Zakázat webům nastavit jakákoli data Clear Vymazat Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. ClickToFlash je doplnÄ›k, který blokuje automatické naÄítání Flash obsahu stránky. Zablokovaný obsah můžete ruÄnÄ› spustit kliknutím na ikonku pÅ™ehrát Flash. Use Click to Flash Použít doplňek Click to Flash Add... PÅ™idat... Remove... Odebrat... Ask where to save each file before downloading PÅ™ed stažením se vždy zeptat na místo uložení každého souboru Download location: Místo pro ukládání: History Historie Click to Flash Click to Flash Downloads Stahování Automatically update the feeds on startup Automaticky aktualizovat kanály pÅ™i spuÅ¡tÄ›ní Automatically update the feeds every Automaticky aktualizovat kanály každých seconds sekundách hours hodin Nothing to do NedÄ›lat nic Dec Pro December Prosinec Display format for date: Zobrazovaný formát data: time: Äasu: Alternating row background colors OznaÄit každý druhý řádek seznamu novinek jinou barvou Simplified representation of date and time ZjednoduÅ¡ený formát data a Äasu Show All Zobrazit vÅ¡e Show New Zobrazit nové Show Unread Zobrazit nepÅ™eÄtené Show Starred Zobrazit oznaÄené hvÄ›zdiÄkou Show Not Starred Zobrazit neoznaÄené hvÄ›zdiÄkou Show Unread or Starred Zobrazit nepÅ™eÄtené nebo oznaÄené hvÄ›zdiÄkou Show Last Day Zobrazit za poslední den Show Last 7 Days Zobrazit za posledních 7 dní Style sheet for news: CSS styly pro novinky: Mark news as read: OznaÄit novinku za pÅ™eÄtenou: on selecting. With timeout pÅ™i vybrání s prodlevou after switching to another news po pÅ™echodu na jinou novinku Mark displayed news as read when switching feeds OznaÄit novinky za pÅ™eÄtené pÅ™i zmÄ›nÄ› kanálu Mark displayed news as read when closing tab OznaÄit novinky za pÅ™eÄtené pÅ™i zavÅ™ení záložky Mark displayed news as read on minimize OznaÄit novinky za pÅ™eÄtené pÅ™i minimalizaci okna Change behavior of action 'Next Unread News' ZmÄ›nit chování akce 'Další nepÅ™eÄtené novinky' starred news novinky oznaÄené hvÄ›zdiÄkou labeled news novinky oznaÄené Å¡títkem Automatically mark identical news as read Automaticky oznaÄit stejné novinky jako pÅ™eÄtené Prevent accidental deletion of: Zabránit náhodnému odstranÄ›ní: Enable cleanup on shutdown Povolit ÄiÅ¡tÄ›ní pÅ™i vypínání Maximum age of news in days to keep: Smazat novinky starší více než (dnů): Maximum number of news to keep: Smazat novinky pÅ™esahující celkový poÄet (nejstarší): Delete read news Smazat pÅ™eÄtené novinky Never delete unread news Nikdy nemazat nepÅ™eÄtené novinky Never delete starred news Nikdy nemazat novinky oznaÄené hvÄ›zdiÄkou Never delete labeled news Nikdy nemazat novinky oznaÄené Å¡títkem Clean up 'Deleted' Odstranit 'Smazané' Enable DB optimization (slower shutdown) Povolit optimalizaci DB (pomalejší vypínání) Reading ÄŒtení Clean Up ÄŒiÅ¡tÄ›ní New... Nový... Edit... Upravit... Delete... Smazat... Move up Nahoru Move down Dolů Show when inactive main window Zobrazit pÅ™i neaktivním hlavním oknÄ› Screen Obrazovka Transparency Průhlednost Show titles feeds Zobrazit názvy kanálů Show icon feed Zobrazit ikonku kanálu Show button 'Mark All News Read' Zobrazit tlaÄítko 'OznaÄit vÅ¡echny novinky za pÅ™eÄtené' Show button 'Mark Read/Unread' Zobrazit tlaÄítko 'OznaÄit za pÅ™eÄtené/nepÅ™eÄtené' Show button 'Open in External Browser' Zobrazit tlaÄítko 'Otevřít v externím prohlížeÄi' Show button 'Delete News' Zobrazit tlaÄítko 'Smazat novinku' Play sound for incoming new news PÅ™ehrát zvuk pÅ™i pÅ™ijení novinky: Play PÅ™ehrát Display notification for incoming news Zobrazit oznámení pro novÄ› příchozí novinky Top Left Vlevo nahoÅ™e Top Right Vpravo nahoÅ™e Bottom Left Vlevo dole Bottom Right Vpravo dole Review Náhled Position UmístÄ›ní Show maximum of Zobrazit maximálnÄ› item on page notification položek v oknÄ› upozornÄ›ní Width list items Šířka položek seznamu pixels pixelů Close notification after Zavřít okno po Do not show notification in fullscreen mode Nezobrazovat oznámení v režimu celé obrazovky Display Zobrazení Action mouse on news opening: Akce myÅ¡i pÅ™i otevírání novinky: Single Click: Double Click: Middle Click: Only show selected feeds: Zobrazovat pouze pro vybrané kanály: Notification UpozornÄ›ní Sound Zvuk Selection of feeds VýbÄ›r kanálů All Feeds VÅ¡echny kanály Site Stránka User Uživatelské jméno Password Heslo Delete Smazat Delete All Smazat vÅ¡e Show Passwords Zobrazit hesla Version Verze Author Autor Contact Kontakt Choose language: VýbÄ›r jazyka: Type Druh Font Písmo Feeds list font Písmo seznamu kanálů News list font Písmo seznamu novinek News title font Písmo titulku novinek News text font Písmo textu novinek Notification font Písmo okna oznámení Change... ZmÄ›nit... Reset Výchozí Feeds list color Barva seznamu kanálů Feeds list background Barva pozadí seznamu kanálů News list color Barva seznamu novinek News list background Barva pozadí seznamu novinek Focused news color Barva oznaÄené novinky Focused news background color Barva pozadí oznaÄené novinky Link color Barva odkazu Title color Barva titulku Date color Barva data Author color Barva autora News text color Barva písma novinek News title background Barva pozadí titulku News background Barva pozadí novinky Feed with new news Kanál s novou novinkou Count of unread news in feeds tree PoÄet nepÅ™eÄtených novinek v seznamu kanálů Disabled feed Zakázaný kanál Alternating row colors Barva pozadí každého druhého řádku Notification text color Barva písma upozornÄ›ní Notification background color Barva pozadí upozornÄ›ní Auto load images in news view Automaticky naÄítat obrázky v zobrazení novinek Text color of new news Barva písma novÄ› pÅ™ijaté novinky Show feeds tree toggle Zobrazit pÅ™epínání seznamu kanálů Clear new status when minimize to tray Vynulovat poÄet novinek pÅ™i minimalizaci do systémové liÅ¡ty Set focus on the last opened news Vybrat poslední otevÅ™enou novinku Set focus at the top of news list Vybrat první novinku v seznamu Set focus on the unread news Vybrat první nepÅ™eÄtenou novinku Open the news Otevřít novinku Default news filter: Výchozí filtr novinek: Action on feed opening: Akce pÅ™i otevÅ™ení kanálu: Show news description instead of loading web page Zobrazovat popis novinky místo naÄítání webové stránky Text color of unread news Barva písma nepÅ™eÄtené novinky Focused feed color Barva oznaÄeného kanálu Focused feed background color Barva pozadí oznaÄeného kanálu Standard Standardní Fixed S pevnou šířkou Serif Patkové Sans Serif Bezpatkové Cursive Kurzíva Fantasy Fantasy Default font size Výchozí velikost písma Fixed font size Velikost písma s pevnou šířkou Minimum font size Minimální velikost písma Minimum logical font size Minimální logická velikost písma Font families: Písmo: Font sizes: Velikost písma: Fonts Písma Fonts Browser Písma v prohlížeÄi Colors Barvy Filter Filtr Action Akce Description Popis Shortcut Zkratka Shortcut: Zkratka Open File... Otevřít soubor... Select Style Sheet File Vybrat soubor se styly Open Directory... Otevřít adresář... Add site to whitelist PÅ™idat stránku na whitelist Site without 'http://' (ex. youtube.com) Stránka bez 'http://' (napÅ™. youtube.com) QAbstractSpinBox &Step up &Zvýšit hodnotu Step &down Snížit ho&dnotu &Select All &Vybrat vÅ¡e QDialogButtonBox Close Zavřít Cancel ZruÅ¡it &Yes &Ano &No &Ne QFtp Not connected NepÅ™ipojeno Host %1 not found Hostitel %1 nenalezen Connection refused to host %1 Spojení odmítnuto hostitelem %1 Connection timed out to host %1 VyprÅ¡el Äasový limit pÅ™ipojení k hostiteli %1 Connected to host %1 PÅ™ipojeno k hostiteli %1 Connection refused for data connection Spojení odmítnuto datovým pÅ™ipojením Unknown error Neznámá chyba Connecting to host failed: %1 PÅ™ipojení k hostiteli selhalo: %1 Login failed: %1 PÅ™ihlášení selhalo: %1 Listing directory failed: %1 Výpis adresáře selhal: %1 Changing directory failed: %1 ZmÄ›na adresáře selhala: %1 Downloading file failed: %1 Stažení souboru selhalo: %1 Uploading file failed: %1 Nahrání souboru selhalo: %1 Removing file failed: %1 Smazání souboru selhalo: %1 Creating directory failed: %1 VytvoÅ™ení adresáře selhalo: %1 Removing directory failed: %1 Smazání adresáře selhalo: %1 Connection closed Spojení ukonÄeno QLineEdit &Undo &Vrátit &Redo &Opakovat Cu&t Vyjmou&t &Copy &Kopírovat &Paste &Vložit Delete Smazat Select All Vybrat vÅ¡e QMultiInputContext Select IM Vybrat IM QObject Cannot start external program Nelze spustit externí program Cannot start external program! %1 Nelze spustit externí program! %1 Error Chyba QTextControl &Undo &Vrátit &Redo &Opakovat Cu&t Vyjmou&t &Copy &Kopírovat &Paste &Vložit Delete Smazat Select All Vybrat vÅ¡e Copy &Link Location Kopírovat odkaz &umístÄ›ní QWizard Cancel ZruÅ¡it < &Back < &ZpÄ›t &Finish &DokonÄit &Next > &Další > RSSDetectionWidget Untitled feed Nepojmenovaný kanál RequestFeed Server requires authentication! Server vyžaduje pÅ™ihlášení! Server replied: Not Found! OdpoveÄ serveru: Nenalezeno! Redirect error! Chyba pÅ™esmÄ›rování! Request timeout! ÄŒasový limit požadavku vyprÅ¡el! SQLiteDriver Error opening database Chyba pÅ™i otevírání databáze Error closing database Chyba pÅ™i zavírání databáze Unable to begin transaction Nelze spustit transakci Unable to commit transaction Nelze vykonat transakci Unable to rollback transaction Nelze vrátit transakci SQLiteResult Unable to fetch row Nelze naÄíst řádek No query Žádný dotaz Unable to execute statement Nelze spustit příkaz Unable to execute multiple statements at a time Nelze spustit více příkazů najednou Unable to reset statement Nelze vyresetovat příkaz Unable to bind parameters Nelze pÅ™edat parametry Parameter count mismatch Chybný poÄet parametrů SslErrorDialog SSL Certificate Error! Chyba SSL certifikátu! Only for this session Pouze pro tuto relaci UpdateAppDialog Check for Updates Zkontrolovat aktualizace Checking for updates... Kontrola aktualizací... Loading history... NaÄítání historie... Don't remind about this version NepÅ™ipomínat tuto verzi &Install &Instalovat You already have the latest version Nejsou dostupné žádné aktualizace A new version of QuiteRSS is available! Je dostupná nová verze QuiteRSS! Click here to go to the download page KliknÄ›te zde pro pÅ™echod na stránku ke stažení Your version is: VaÅ¡e verze: Current version is: NejnovÄ›jší verze: Error checking updates Chyba kontroly aktualizací quiterss-0.18.3/lang/quiterss_de.qph000066400000000000000000001142201265173051100174450ustar00rootroot00000000000000 Stop Stop Previous Letzte Datei Next Nächste Datei Pause Pause Open Geöffnet Play Wiedergabe Volume Lautstärke Playlist (show/hide) Wiedergabeliste (anzeigen/verstecken) Open File... Datei öffnen... Aspect ratio Seitenverhältnis Scale mode Modus Skalieren Default Standart Stretch to window Auf Fenstergröße strecken Mute Stummschaltung Play/Pause Wiedergabe/Pause Full screen Vollbild Media files (all types) Medien Dateien (Alle Formate) Video files Video Dateien Audio files Audio Dateien All files Alle Dateien Stop Abbrechen Reload Neu laden Go Forward Vor Go Back Zurück Copy Kopieren Copy Link Link-Adresse kopieren Save Link... Ziel speichern unter... Open in New Window In neuem Fenster öffnen Icon size Icon-größe Are you sure to delete the feed '%1'? Sind Sie sicher, um den Feed '%1' löschen? Delete feed Löschen Feed Select OPML-file Wählen Sie OPML-Datei OPML-files (*.opml) OPML-Dateien (*.opmll *.xml) Import canceled Importieren abgesagt Import: can't open a file Import: kann keine Datei öffnen Unread: %1 Ungelesen: %1 All: %1 Alle: %1 Error loading to WebVeiw Fehler beim Laden zu WebView Load images Bilder laden Auto load images to news view Auto lastimages zur nachrichtenansicht No load images Keine lastimages No load images to news view Keine lastimages zur nachrichtenansicht Loading... (%p%) Laden... (%p%) Feeds Feeds Title: Titel: Author: Autor: Update feeds... (%p%) Aktualisiere feeds... (%p%) &Add... &Hinzufügen... Add new feed Hinzufügen neuer Feed &Delete... &Löschen... Delete selected feed Löschen ausgewählt Feed &Import feeds... &Import-Feeds... Import feeds from OPML file Import-Feeds aus OPML-Datei E&xit B&eenden Update current feed Aktualisieren Sie gegenwärtiges Feed About... Über... Update all Alle aktualisieren Delete selected news Löschen ausgewählter Artikel &Edit B&earbeiten Mark news star Markieren Stern Artikel Properties feed Eigenschaften Feed Delete Löschen Star Stern Mark Read Als gelesen markieren Update feed Feed aktualisieren Unread news: %1 Ungelesene Artikel: %1 New news: %1 Neu Artikel: %1 Export canceled Exportieren abgebrochen Export: can't open a file Export: kann keine Datei öffnen Update done Aktualisieren Sie getan &Export feeds... &Export-Feeds... Export feeds to OPML file Export-Feeds zu OPML-Datei Mark all feeds Read Markieren alle Feeds gelesen Mark Read/Unread Alle gelesen/ungelesen Mark current news read/unread Markieren aktuellen Artikel als gelesen/ungelesen Mark all news Read Artikel als gelesen markieren News filters... Filters Artikel... Filter news... Filter Artikel... Options... Einstellungen... Open options gialog Öffnen Einstellungen-Dialog Filter Filter Show All Alle anzeigen Show New Neue anzeigen Show Unread Ungelesene anzeigen Show Star Stern anzeigen Show 'About' dialog Anzeigen "Über"-Dialog Check for updates... Nach Updates suchen... Open in Browser Im Browser öffnen &View &Ansicht Fee&ds Fee&ds &News A&rtike &Tools &Werkzeuge &Help &Hilfe ToolBar Werkzeugleiste Style Stil Icon Symbol Text Text Text under icon Text unter Symbolen Text beside icon Text neben Symbolen Icon Symbol Previous feed Voriger Feed Next feed Nächster Feed Show ToolBar Werkzeugleiste anzeigen Big Groß Normal Normal Small Klein Show window Fenster Wiederherstellung Acknowledgements: Danksagungen: &Close S&chließen The authors: Die Autoren: Version Version Add feed Hinzufügen Feed Feed Title: Feed Titel: Feed URL: Feed URL: General Allgemein Homepage: Homepage: Load feed title Laden Feed Titel Category Kategorie Published Veröffentlicht Read Gelesen Received Erhalten A new version of QuiteRSS is available! Die neue Version ist verfügbar QuiteRSS! Click here to go to the download page Klicken Sie hier, um zur Download-Seite zu gehen Current version is: Aktuelle Version: Error checking updates Fehlerüberprüfung Updates Loading history... Das Laden der Geschichte... You already have the latest version Sie haben bereits die neueste Version Your version is: Ihre Version ist: Mark selected news as read after Ausgewählte Artikel als gelesen markieren Action Aktion Automatically update the feeds every Alle Feeds nach dieser Zeit aktualisieren Automatically update the feeds on start-up Alle Feeds beim Start aktualisieren Browser Browser Change icon for incoming new news Ändern Symbol auf eingehende neue Artikel Change... Ändern... Choose language: Wählen eine Sprache: Clear Löschen Clear status new on minimize to tray Löschen des neuen Status beim in den Tray minimieren closing QuiteRSS schließen QuiteRSS Description Beschreibung Direct connection to the Internet Direkte Verbindung zum Internet Empty working set on minimize to tray Lösen Speicher beim Minimieren in den Tray Enable JavaScript JavaScript aktivieren Enable plug-ins Plug-Ins aktivieren English (%1) Englisch (%1) Feeds list font Feeds Liste Schriftart Font Schriftart Fonts Schriftarten hours Stunden Keyboard shortcuts Tastenkombinationen Language Sprache Manual proxy configuration: Manuelle Proxy-Konfiguration: minimizing QuiteRSS minimierung QuiteRSS minutes Minuten Move to the system tray when: Verschieben auf System Tray, wenn: Network Connections Netzwerkverbindungen News font Artikel Schriftart News list font Schriftart Liste der Artikel Notifications Benachrichtigungen Password: Kennwort: Play sound for incoming new news Sound abspielen bei eingehenden neuen Artikel Port: Port: Proxy server: Proxy-Server: Reading Lesen Reset Zurücksetzen Russian (%1) Russisch (%1) seconds Sekunden System tray System Tray Show count of new news Zeige Anzahl der neuen Artikel Show count of unread news Zeige Anzahl der ungelesenen Artikel Show static icon Zeige statisches Symbol Single click instead of double click for show window Ein Klick statt Doppelklick, um das Fenster anzuzeigen starting QuiteRSS starten QuiteRSS System proxy configuration (if available) Systemeigene Proxykonfiguration (falls vorhanden) Tray icon behavior: Das Verhalten im System Tray Symbol: Type Art Use the embedded browser Verwenden des integrierten Browsers Username: Benutzername: Show splash screen Begrüßungsbildschirm beim Start anzeigen Show system tray icon Symbol im System Tray anzeigen German (%1) Deutsch (%1) Clean Up Aufräumen Reopen last opened feeds on startup Öffnen Sie zuletzt geöffnete Feeds beim Starten Show news' description instead loading web page Zeigen Beschreibung des Artikels statt dem Herunterladen einer Web Page Maximum number of news to keep: Maximale Anzahl der zu behaltenden Artikel: Maximum age of news in days to keep: Maximale After der Artikel (in Tagen): Delete read news Gelesene Artikel löschen Never delete unread news Ungelesene Artikel nie löschen Never delete starred news Sternen Artikel nie löschen Style application Style-Anwendung Cancel Abbrechen &Undo &Rückgängig &Redo Wieder&herstellen Cu&t &Ausschneiden &Copy &Kopieren &Paste Einf&ügen Select All Alles auswählen Copy &Link Location &Link-Adresse kopieren Green Grün Orange Orange Purple Lila Pink Rosa Gray Grau Open in external browser Im externen Browser öffnen Home Haus &Yes &Ja &No &Nein OPML-files (*.opml) OPML-Dateien (*.opmll) Select IM Eingabemethode auswählen &Step up &Inkrementieren Step &down &Dekrementieren &Select All &Alles auswählen &Next > &Next > < &Back < &Back &Finish Ab&schließen Create new feed Schaffen Sie neues Feed Use title of the feed as displayed name Verwenden Titel des Feed als angezeigten Namen Feed URL or website address: Feed-URL oder eine Website-Adresse: Displayed name: Angezeigter Name: URL error! URL Fehler! Duplicate feed! Duplizieren Feed! Can't find feed URL! Sie finden nicht die URL des Feed! Show/hide tree feeds Anzeigen / ausblenden Baum-Feeds Switch focus between panels (tree feeds, list news, browser) Schalten Sie den Fokus zwischen Panels (Baum-Feeds, Nachrichten-Liste, Browser) Switch focus between panels Schalten Sie den Fokus zwischen Panels Contact Kontakt Hungarian (%1) Ungarisch (%1) Opening feed: Eröffnung der Feed: Nothing to do Nichts zu tun Open news Artikel öffnen Position at top of list news Position an der Spitze der Liste Artikels Position on last opened news Position über zuletzt geöffnete Artikel Open in new tab In neuem Tab öffnen A new version of QuiteRSS... Eine neue Version von QuiteRSS... Top Oben Browser position Position des Browsers Bottom Unten Right Rechts Bottom Unten Left Links Columns Spalten Count news unread Anzahl ungelesenen Artikel Last updated Zuletzt aktualisiert Count news all Anzahl alle Artikel Display feed on startup Anzeige Feeds beim Start Use embedded browser Den eingebetteten Browser benutzen Use following external browser: Den folgenden externen Browser benutzen: Use standard external browser Den externen Standardbrowser benutzen Browser selection: Browser-Auswahl: Content: Inhalte: Close tab Tab schließen Filter name: Filter Name: Open in background tab In Hintergrund-Tab öffnen Open news in new tab Artikel in neuem Tab öffnen New... Neu... Name filter Name Filter Move up Nach oben Move down Nach unten Apply selected filter Anwenden Filter ausgewählt Delete filter Löschen Filter Are you sure to delete the filter '%1'? Sind Sie sicher um den Filter '%1' löschen? Filter rules Filter-Regeln Match all conditions Erfüllt alle Bedingungen Match any condition Entspricht einem beliebigen Bedingung Match all news Erfüllt alle Artikel Perform these actions: Folgende Aktionen ausführen: Please enter name for the filter. Bitte geben Sie Namen für den Filter. Please enter search condition for the news filter. Bitte geben Sie Suchbedingung für den Filter Artikel. Status Artikelstatus Add condition Bedingung hinzufügen Delete condition Bedingung löschen doesn't contains nicht enthält contains enthält is ist isn't ist nicht begins with beginnt mit ends with endet mit Add star Mark mit Sternchen Mark news as read Artikel als gelesen markieren Add action Aktion hinzufügen Delete action Aktion löschen Find in browser Suche im Browser Display notification for incoming news Anzeigen einer Benachrichtigung über eingehende Artikel Show maximum of Ein Maximum anzeigen von news on page notification Artikel auf Seite Benachrichtigung Width news list Die Breite einer Liste der Artikel pixels Pixel Close notification after Die Schließen Benachrichtigung nach Notification font Schriftart Benachrichtigung Delete all news from list Löschen Sie alle Artikel von der Liste Delete all news Löschen Sie alle Artikel Minimize to tray Zum Tray minimieren Minimize application to tray Minimieren Anwendung auf das Tray Starred Favoriten All Feeds Alle Feeds Starred Stern December Dezember Display format for date and time in list of news: Anzeigeformat für Datum und Uhrzeit in der Liste der Neuigkeiten: Previous News Voriger Artikel Show Starred Feeds Favoriten anzeigen Feeds Find Link Link suchen Find Name Name suchen Created: Erstellt: Display feed in new tab on startup Anzeige Feed in neuem Tab öffnen beim Start Long ago ;-) Vor langer Zeit ;-) News count: Anzahl der Artikel: Status Status Search Feed Suche Feed Mark displayed news as read on minimize Angezeigte Artikel beim Minimieren als gelesen markieren Mark displayed news as read when closing tab Angezeigte Artikel beim Schließen des Tabs als gelesen markieren Mark displayed news as read when switching feeds Angezeigte Artikel beim Wechseln des Feeds als gelesen markieren Only show selected feeds: Nur zeigen ausgewählte Feeds: Position on unread news Position auf dem ungelesen Artikel Store a DB in memory (requires program restart) Bewahren Sie eine DB im Speicher (erfordert Neustart des Programms) Show Deleted Gelöschte anzeigen Restore Wiederherzustellen Restore News Wiederherstellen News Restore Wiederherzustellen Sort By Sortieren nach Sort by Title Sortieren nach Titel Open links in external browser in background (experimental) Öffne Links in externen Browser im Hintergrund (experimentell) News panel font (Title, Author) Schriftart Artikel Panel (Titel, Autor) &Update &Aktualisieren Report a Problem... Ein Problem melden... Main Toolbar Hauptsymbolleiste Customize Toolbar Symbolleiste anpassen Hide Toolbar Symbolleiste ausblenden Zoom Zoom Zoom In Zoomen Zoom in in browser Zoomen im Browser Zoom Out Verkleinern Zoom out in browser Verkleinern im Browser 100% 100% Reset zoom in browser Zurücksetzen zoom im Browser Print... Drucken... Print Web page Drucken Web Page Print Preview... Druckvorschau... Preview Web page Vorschau Web Page Toolbars Symbolleisten Web Page Web Page Browser Toolbar Browser Werkzeugleiste Browser Toolbar Browser Werkzeugleiste News Toolbar Artikel Werkzeugleiste Full Screen Vollbild Full Screen Vollbild Revision Revision Includes: Inklusive: Authors Autoren History Geschichte License Lizenz Open Page in External Browser Seite öffnen im externen Browser Open Link in External Browser Link öffnen in einem externen Browser New Folder... Neuer Ordner... Location: Location: Stay On Top Im Vordergrund Properties Eigenschaften Delete Folder Ordner löschen Are you sure to delete the folder '%1'? Sind Sie sicher, um den Ordner "%1" löschen? Name: Name: F&older... &Ordner... Add New Folder Hinzufügen neuen Ordner Open News in External Browser Artikel öffnen im externen Browser Show Not Starred Anzeigen ohne Stern Add Label Hinzufügen Label New Label Neues Label Important Wichtig Work Arbeiten Personal Persönliche To Do Machen Later Später Amusingly Amüsant Load icon... Hochladen das Symbol... Select color... Wählen Sie Farbe... Color text: Farbe Text: Color background: Farbe Hintergrund: Select Image Wählen Sie Bild Image files (*.jpg; *.jpeg; *.png; *.bmp) Image-Dateien (*.jpg; *.jpeg; *.png; *.bmp) Load icon: can't open a file Hochladen das Symbol: kann keine Datei öffnen Label Label Feed Feed Copy Image Grafik kopieren Copy Image Address Kopieren Sie Adresse Grafik Open links in embedded browser in background Öffne Links in intern Browser im Hintergrund on selecting. With timeout bei der Auswahl. Mit Erwartung after switching to another news nach dem Übergang einem anderen Artikel Never delete labeled news Labeled Artikel nie löschen &Install &Install Don't remind about this version Erinnere mich nicht zu dieser Version Deleted Gelöscht Hide Categories Verbergen Sie Kategorien Show Categories Zeigen Sie Kategorien Feeds Toolbar Feeds Werkzeugleiste Categories Kategorien Switch to previous tab Schalten zur vorigen Tab Switch to next tab Schalten auf der nächsten Tab quiterss-0.18.3/lang/quiterss_de.ts000066400000000000000000005510301265173051100173070ustar00rootroot00000000000000 AboutDialog About Über Revision Revision Version Version QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS ist ein quelloffener plattformübergreifender RSS/Atom-Newsreader Includes: Unter Verwendung von: Application directory: Anwendungsverzeichnis: Resource directory: Quellverzeichnis: Data directory: Datenverzeichnis: Backup directory: Sicherungsverzeichnis Database file: DB-Datei: Settings file: Konfigurationsdatei: Log file: Protokolldatei: Authors Autoren History Versionshistorie License Lizenz Information Information AdBlockAddSubscriptionDialog Add Subscription Filterabonnement hinzufügen Title: Titel: Address: Adresse: Add new subscription to AdBlock: Neues AdBlock-Filterabonnement hinzufügen: AdBlockCustomList Custom Rules Eigene Filterregel AdBlockDialog AdBlock Configuration AdBlock-Einstellungen Enable AdBlock AdBlock aktivieren Search... Suche... Options Optionen AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Nur wesentliche Teile der EasyList nutzen (reduziert Systemauslastung) Add Rule Filterregel hinzufügen Remove Rule Filterregel entfernen Add Subscription Filterabonnement hinzufügen Remove Subscription Filterabonnement entfernen Update Subscriptions Filter aktualisieren Learn about writing rules... Wie erstelle ich eigene Filter... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock blockt Werbung auf Webseiten AdBlock AdBlock Show AdBlock &Settings AdBlock-Einstellungen Disable on %1 Deaktiviere für %1 Disable only on this page Deaktiviere nur für diese Seite Blocked Popup Windows Popup-Fenster geblockt %1 with (%2) %1 mit (%2) No content blocked Kein Inhalt geblockt Blocked URL (AdBlock Rule) - click to edit rule Geblockte URL - zum Bearbeiten anklicken AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Filterabonnement konnte nicht geladen werden! AdBlockTreeWidget Add Rule Regel hinzufügen Remove Rule Regel entfernen Add Custom Rule Eigenen Filter hinzufügen Please write your rule here: Eigenen Filter hier erstellen: %1 (recently updated) %1 (kürzlich erneuert) %1 (Error: %2) %1 (Fehler: %2) AddFeedWizard Add Feed Feed hinzufügen Create New Feed Neuen Feed erstellen Use title of the feed as displayed name Feed als Name anzeigen Server requires authentication: Server benötigt Autorisation: Username: Benutzername: Password: Passwort: Feed URL or website address: URL oder Webseitenadresse: Feeds Feeds All Feeds Alle Feeds New Folder... Neuer Ordner... Displayed name: Angezeigter Name: Location: Ort: URL error! URL-Fehler! Duplicate feed! Feed bereits vorhanden! Can't find feed URL! URL nicht erreichbar! Request failed! Anfrage fehlgeschlagen! AddFolderDialog Add Folder Ordner hinzufügen Feeds Feeds All Feeds Alle Feeds Name: Name: Location: Ort: AuthenticationDialog Save password Passwort speichern Authorization required Autorisation benötigt Server: Server: Message: Mitteilung: Username: Benutzername: Password: Passwort: CategoriesTreeWidget Unread Ungelesen Starred Mit Stern Deleted Gelöschte Labels Kennzeichnung Open in New Tab In neuem Reiter öffnen Clear 'Deleted' Gelöschte entfernen Mark Read Gelesene markieren CleanUpWizard Clean Up Bereinigen Choose Feeds Feed auswählen All Feeds Alle Feeds Clean Up Options Bereinigungs-Optionen Maximum age of news in days to keep: Maximales Alter zu behaltender Nachrichten (in Tagen): Maximum number of news to keep: Maximale Anzahl zu behaltender Nachrichten: Delete read news Gelesene Nachrichten löschen Never delete unread news Ungelesene Nachrichten nie löschen Never delete starred news Nachrichten mit Stern nie löschen Never delete labeled news Nachrichten mit Kennzeichnung nie löschen Clean up 'Deleted' Gelöschte entfernen Purge DB DB leeren Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Als gelöscht markierte Einträge endgültig aus DB entfernen. Ältere Nachrichten könnten erneut angezeigt werden Information Information Clean Up wizard deleted %1 news Es wurden %1 Nachrichten gelöscht ClickToFlash Object blocked by ClickToFlash Objekt durch ClickToFlash geblockt Hide object Objekt verbergen Add '%1' to whitelist '%1 zur Positivliste hinzufügen CustomizeToolbarDialog Customize Main Toolbar Hauptsymbolleiste anpassen Customize Feeds Toolbar Feed-Symbolleiste anpassen Customize News Toolbar Nachrichtensymbolleiste anpassen Load images Bilder laden Separator Trennlinie Icon Symbol Text Text Text Beside Icon Text neben Symbol Text Under Icon Text unter Symbol Big Groß Normal Normal Small Klein Style: Stil: Icon Size: Symbolgröße: Add Hinzufügen Remove Entfernen Move up Nach oben Move down Nach unten Default Standard DownloadItem Remaining time unavailable Verbleibende Zeit unbekannt Error: Cannot write to file! Fehler: Kann Datei nicht erstellen! Error: Fehler: few seconds einige Sekunden seconds Sekunden minutes Minuten hours Stunden Unknown size Unbekannte Dateigröße Unknown speed Unbekannte Geschwindigkeit %2 - unknown size (%3) %2 - unbekannte Dateigröße (%3) Remaining %1 - %2 of %3 (%4) Verbleibende Zeit %1 - %2 von %3 (%4) Cancelled - %1 Abgebrochen - %1 Delete file Datei löschen Do you want to also delete downloaded file? Heruntergeladene Datei ebenfalls löschen? Open File Datei öffnen Open Folder Ordner öffnen Copy Download Link Zieladresse kopieren Cancel Downloading Herunterladen abbrechen Remove Entfernen Cancelled Abgebrochen Error Fehler Not found Nicht gefunden Sorry, the file %1 was not found! Datei %1 wurde nicht gefunden! DownloadManager Clear Liste leeren File %1 (*.%2) Datei %1 (*.%2) All Files (*.*) Alle Dateien (*.*) Save As... Speichern als... Executable: Ausführbare Datei: Arguments: Parameter: FeedPropertiesDialog Properties Eigenschaften General Allgemein Columns Spalten Authentication Autorisation Status Status Title: Name: Homepage: Startseite: Feed URL: URL: Load Title Nachrichten-Titel laden Load Favicon Bevorzugtes Symbol laden Select Icon... Symbol wählen... Select Icon Symbol wählen Disable update Nicht aktualisieren Automatically update every Automatisch aktualisieren alle seconds Sekunden minutes Minuten hours Stunden Starred Mit Stern versehen Load images Bilder laden Display in new tab on startup Nachricht beim Start in neuem Reiter anzeigen Show news' description instead of loading web page Nachrichtenbeschreibung anzeigen, Webseite nicht laden Automatically delete duplicate news Doppelte Nachrichten automatisch entfernen Display Anzeige Reading Lesen Enable JavaScript JavaScript aktivieren Right-to-left layout Layout von rechts nach links Ascending Aufsteigend Descending Absteigend Sort by: Sortieren nach: Add Hinzufügen Remove Entfernen Move up Nach oben Move down Nach unten Default Standard Server requires authentication: Server benötigt Autorisation: Username: Benutzername: Password: Passwort: Feeds count: Anzahl der Feeds: Description: Beschreibung: Status: Status: Created: Erstellt: Last update: Zuletzt aktualisiert: News count: Anzahl der Nachrichten: Good In Ordnung Long ago ;-) Vor Ewigkeiten ;-) new neu unread ungelesen Image files Bilddateien Select Image Bild wählen Load icon: can't open a file! Symbol laden: Kann Datei nicht öffnen! FilterRulesDialog Filter Rules Filterregeln Feeds Name des Feeds All Feeds Alle Feeds Filter name: Name des Filters: Match all news Trifft auf alle Nachrichten zu Match all conditions Erfüllt alle Bedingungen Match any condition Erfüllt beliebige Bedingung Perform these actions: Folgende Aktionen ausführen: Please enter name for the filter. Dem Filter einen Namen geben. Please enter search condition for the news filter. Suchbedingungen für den Nachrichtenfilter eingeben. FindFeed Find Name Name suchen Find Link Zieladresse suchen FindTextContent Find in News Nachrichten durchsuchen Find in Titles Titel durchsuchen Find in Authors Autoren durchsuchen Find in Categories Kategorien durchsuchen Find in Descriptions Nachrichtenbeschreibungen durchsuchen Find in Links Zieladressen durchsuchen Find in Browser Webseite durchsuchen FtpDownloader Canceled! Abgebrochen! ItemAction Mark News as Read Nachricht als gelesen markieren Add Star Mit Stern versehen Delete Löschen Add Label Kennzeichnung hinzufügen Play a Sound Klang abspielen Show News in Notifier Nachrichten im Popup-Fenster anzeigen Browse Durchsuchen Play Abspielen Add Action Aktion hinzufügen Delete Action Aktion löschen Open File... Datei öffnen... ItemCondition Title Titel Description Beschreibung Author Autor Category Kategorie State Status Link Adresse News Nachrichten New Neu Read Gelesen Starred mit Stern Add Condition Bedingung hinzufügen Delete Condition Bedingung löschen contains enthält doesn't contains enthält nicht is ist isn't ist nicht begins with beginnt mit ends with endet mit Regular expressions Regulärer Ausdruck LabelDialog New Label Neue Kennzeichnung Load icon... Programmsymbol laden... Default Standard Select color... Farbe auswählen... Name: Name: Icon: Symbol: Color text: Textfarbe: Color background: Hintergrundfarbe: Image files Bilddateien Select Image Bild auswählen Load icon: can't open a file! Symbol laden: Kann Datei nicht öffnen! MainApplication Saving data... Speichere... MainWindow &AdBlock &AdBlock Hide Categories Kategorien ausblenden Show Categories Kategorien anzeigen Select OPML-File OPML-Datei auswählen OPML-Files (*.%1 *.%2) OPML-Dateien (*.%1 *.%2) Import canceled Import abgebrochen Import: can't open a file Import: kann Datei nicht öffnen OPML-Files (*.%1) OPML-Dateien (*.%1) Export canceled Export abgebrochen Export: can't open a file Export: kann Datei nicht öffnen Unread: %1 Ungelesen: %1 All: %1 Alle: %1 (Browser) (Browser) New News: %1 Neue Nachrichten: %1 Unread News: %1 Ungelesene Nachrichten: %1 &Add &Hinzufügen Add New Feed Neuen Feed hinzufügen &Feed... &Feed... F&older... &Ordner... Add New Folder Neuen Ordner hinzufügen Open in New Tab In neuem Reiter öffnen &Delete... &Löschen... Delete Selected Feed Ausgewählten Feed löschen &Import Feeds... &Feeds importieren... Import Feeds from OPML File Feeds aus OPML-Datei importieren &Export Feeds... &Feeds exportieren... Export Feeds to OPML File Feeds in OPML-Datei exportieren E&xit &Beenden Update Feed Feed aktualisieren Update Current Feed Markierten Feed aktualisieren Update All Alle aktualisieren Update All Feeds Alle Feeds aktualisieren Mark All Feeds Read Alle Feeds als gelesen markieren Mark Read/Unread Als gelesen/ungelesen markieren Mark Current News Read/Unread Aktuelle Nachricht als gelesen/ungelesen markieren Mark All News Read Alle Nachrichten gelesen Downloads Downloads Clean Up... Bereinigen... News Filters... Nachrichtenfilter... Filter News... Nachrichten filtern... Options... Optionen... Open Options Dialog Optionen Filter Feeds Feeds filtern Show All Alle anzeigen Show New Neue anzeigen Show Unread Ungelesene anzeigen Show Starred Feeds Feeds mit Stern anzeigen Show Not Working Feeds Defekte Feeds anzeigen Filter News Nachrichten filtern Show Starred Nachrichten mit Stern anzeigen Show Not Starred Nachrichten ohne Stern anzeigen Show Unread or Starred Ungelesene oder Nachrichten mit Stern anzeigen Show Last Day Letzten Tag anzeigen Show Last 7 Days Letzte 7 Tage anzeigen About... Über... Show 'About' Dialog Über Check for Updates... Programmaktualisierung suchen... Report a Problem... Ein Problem melden... Open News Nachricht öffnen Open in Browser Im internen Browser öffnen Open in External Browser Im externen Browser öffnen Open News in External Browser Nachricht im externen Browser öffnen Open News in New Tab Nachricht in neuem Reiter öffnen Open in Background Tab In Hintergrund-Reiter öffnen Open News in Background Tab Nachricht in Hintergrund-Reiter öffnen Star Stern Mark News Star Nachricht mit Stern versehen Delete Löschen Delete Selected News Ausgewählte Nachricht löschen Delete All News Alle Nachrichten löschen Delete All News from List Alle Nachrichten aus Liste löschen Restore Wiederherstellen Restore News Nachricht wiederherstellen Copy Link Zieladresse kopieren Restore last deleted news Zuletzt gelöschte Nachricht wiederherstellen Mark Read Als gelesen markieren Mark Feed Read Feed als gelesen markieren Properties Eigenschaften &File &Datei Count Unread News Zeige Anzahl ungelesener Nachrichten Count All News Zeige Anzahl aller Nachrichten Last Update Zuletzt aktualisiert Reset browser zoom Browserzoom zurücksetzen Print Web Page Webseite drucken Preview Web Page Webseitenvorschau Save page in database Seite in DB speichern Save page in database instead of news description Seite statt Nachrichtenbeschreibung in DB speichern Confirm Delete Löschen bestätigen Are you sure to delete selected elements? Ausgewählte Elemente wirklich löschen? Menu Menü Add Feed... Feed hinzufügen &Create Backup... &Sicherung erstellen... S&how Menu Bar &Menüleiste anzeigen Stop Update Feeds Aktualisierung abbrechen Open News Description Nachrichtenbeschreibung öffnen Copy News Link Zieladresse kopieren &View &Ansicht Fee&ds &Feeds &News &Nachricht &Browser &Browser &Tools &Werkzeuge &Help &Hilfe Main Toolbar Hauptsymbolleiste Customize Toolbar Symbolleiste anpassen Main Toolbar... Hauptsymbolleiste... Customize Toolbar... Symbolleiste anpassen... Feeds Toolbar... Feed-Symbolleiste... News Toolbar... Nachrichten-Symbolleiste... Lock Toolbar Symbolleiste fixieren Hide Toolbar Symbolleiste verbergen Layout Layout Classic Klassisch Newspaper Zeitung Application Style Erscheinungsbild System System System2 System2 Green Grün Orange Orange Purple Lila Pink Rosa Gray Grau Browser Position Position des Browsers Top Oben Bottom Unten Right Rechts Left Links Show Window Fenster anzeigen Previous Feed Vorheriger Feed Next Feed Nächster Feed Previous News Vorherige Nachricht Next News Nächste Nachricht News Page Up Vorherige Nachricht News Page Down Nächste Nachricht Next Unread News Nächste ungelesene Nachricht Previous Unread News Vorherige ungelesene Nachricht Switch Focus to Next Panel Zum nächsten Paneel wechseln Switch Focus to Next Panel (Tree Feeds, List News, Browser) Nächstes Paneel anzeigen (Baumansicht, Nachrichtenliste, Browser) Switch Focus to Previous Panel Zum vorherigen Paneel wechseln Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Vorheriges Paneel anzeigen (Baumansicht, Nachrichtenliste, Browser) Show/Hide Tree Feeds Baumansicht anzeigen/ausblenden Minimize to Tray In Systemleiste minimieren Minimize Application to Tray Anwendung in Systemleiste minimieren Columns Spalten Show Indentation Markierung anzeigen Search Feed Feed suchen Zoom Zoom Zoom In Vergrößern Zoom in in browser Browseransicht vergrößern Zoom Out Verkleinern Zoom out in browser Browseransicht verkleinern 100% 100% Print... Drucken... Print Preview... Druckvorschau... Page up (Browser) Eine Seite vor (Browser) Page down (Browser) Eine Seite zurück (Browser) Save As... Speichern als... Save Page As... Seite speichern als... Show/Hide Anzeigen/verbergen Feeds Toolbar Feed-Symbolleiste News Toolbar Nachrichten-Symbolleiste Browser Toolbar Browsersymbolleiste Panel Categories Paneel-Kategorien Status Bar Statusleiste Full Screen Vollbild Stay On Top Immer im Vordergrund Categories Kategorien Label Kennzeichnung Show labels menu Kennzeichnungsmenü anzeigen Close Tab Reiter schließen Close Other Tabs Andere Reiter schließen Close All Tabs Alle Reiter schließen Switch to next tab Zum nächsten Reiter wechseln Switch to previous tab Zum vorherigen Reiter wechseln Unread Ungelesen Starred Mit Stern Deleted Gelöschte Labels Kennzeichnung Decrease news list/increase browser Nachrichtenliste verkleinern/Browseransicht vergrößern Increase news list/decrease browser Nachrichtenliste vergrößern/Browseransicht verkleinern Find Suchen Open Homepage Feed Startseite öffnen Sort by Name Nach Name sortieren Collapse All Folders Alle Ordner einklappen Expand All Folders Alle Ordner ausklappen Next Folder Nächster Ordner Previous Folder Vorheriger Ordner Expand Folder Ordner ausklappen Setting Page: Labels Einstellungen: Kennzeichnung Share Teilen Sort By Sortieren nach Ascending Aufsteigend Descending Absteigend Check for updates Programmaktualisierung suchen A new version of QuiteRSS... Eine neue Version von QuiteRSS... Loading... Lädt... Web Page Webseite Save As Speichern als HTML-Files (*.%1) HTML-Dateien (*.%1) Text files (*.%2) Textdateien (*.%2) Save As: can't open a file Speichern als: kann Datei nicht öffnen Choose Directory Verzeichnis auswählen Important Wichtig Work Arbeit Personal Persönliches To Do Noch zu tun Later Später Amusingly ;-) NetworkManager SSL Certificate Error! Fehlerhaftes SSL-Zertifikat! The "%1" server has the following errors in the SSL certificate: Der "%1" Server weist folgende Fehler im SSL-Zertifikat auf: <b>Organization: </b> <b>Organisation: </b> <b>Domain Name: </b> <b>Name der Domain: </b> <b>Expiration Date: </b> <b>Gültig bis: </b> <b>Error: </b> <b>Fehler: </b> Would you like to make an exception for this certificate? SSL-Zertifikat akzeptieren? NewsFiltersDialog News Filters Nachrichtenfilter Feeds Name des Feeds Filter Name Namen filtern New... Neu... Edit... Bearbeiten... Delete... Löschen... Move up Nach oben Move down Nach unten Run Filter Filter verwenden Delete Filter Filter löschen Are you sure you want to delete the filter '%1'? Den Filter '%1' wirklich löschen? NewsHeader Icon Feed Symbol Title Nachricht Published Erstellt Received Erhalten Author Autor Category Kategorie Read Gelesen Star Stern Label Kennzeichnung Feed Title Feed Link Adresse NewsItem Mark Read/Unread Als gelesen/ungelesen markieren Delete News Nachricht löschen NewsTabWidget Loading... (%p%) Lädt... (%p%) Home Startseite Open Page in External Browser Seite im externen Browser öffnen Open Link in External Browser Zieladresse in externem Browser öffnen Open Link Zieladresse öffnen Open in New Tab In neuem Reiter öffnen Save Link... Ziel speichern unter... Save Image... Bild speichern... Copy Link Zieladresse kopieren Copy Kopieren Go Back Zurück Go Forward Vorwärts Stop Abbrechen Reload Neu laden Copy Image Bild kopieren Copy Image Address Bildadresse kopieren Load Images Bilder laden Auto Load Images to News View Bilder automatisch mitladen No Load Images Keine Bilder laden No Load Images to News View Keine Bilder in Nachrichtenansicht anzeigen Close Tab Reiter schließen Auto Load Images in News View Bilder automatisch mitladen Don't Load Images Bilder nicht mitladen Don't Load Images in News View Keine Bilder in Nachrichtenansicht laden Comments Kommentare Author: %1 Autor: %1 audio Audio video Video media Medien Link to Verknüpfung mit Mark Read/Unread Als gelesen/ungelesen markieren Mark News Star Nachricht mit Stern markieren Label Kennzeichnung Share Teilen Open News in External Browser Nachricht im externen Browser öffnen Delete Löschen NotificationWidget Close Schließen Mark All News Read Alle Nachrichten als gelesen markieren Previous Page Vorherige Seite Next Page Nächste Seite Incoming News: %1 Eingehende Nachrichten: %1 Page %1 of %2 Seite %1 von %2 OptionsDialog Options Optionen General Allgemein System Tray Systemleiste Network Connections Netzwerkverbindungen Browser Browser Feeds Feeds Labels Kennzeichnung Notifications Benachrichtigungen Passwords Passwörter Language Sprache Fonts & Colors Schriftarten & Farben Keyboard Shortcuts Tastaturkürzel Warning: key is already assigned to Warnung: Schlüssel wurde bereits zugewiesen Show splash screen on startup Begrüßungsbildschirm beim Start anzeigen Reopen last opened feeds on startup Zuletzt geöffneten Feed beim Programmstart laden Open new tab next to active Neuen Reiter neben aktivem öffnen Hide feeds tree when opening tabs Feeds-Baumansicht verbergen, wenn Reiter geöffnet wird Show default rss-icon instead of favourite one Immer Standard-RSS-Symbol anzeigen Automatically collapse folders Ordner automatisch einklappen Show close button on tab Schließen-Knopf auf Reiter anzeigen Automatically check for updates Automatisch nach Programmaktualisierung suchen Help improve QuiteRSS by sending usage information QuiteRSS durch Senden von Nutzungsdaten verbessern helfen Store a DB in memory (requires program restart) Eine DB im Speicher behalten (erfordert Neustart des Programms) Save DB stored in memory to file every Gerade verwendete DB in Datei speichern alle minutes Minuten Run QuiteRSS at Windows startup QuiteRSS mit Windows starten Show system tray icon Symbol in Systemleiste anzeigen starting QuiteRSS QuiteRSS gestartet wird minimizing QuiteRSS QuiteRSS minimiert wird closing QuiteRSS QuiteRSS beendet wird Show static icon Statisches Symbol anzeigen Change icon for incoming new news Programmsymbol bei eingehenden neuen Nachrichten ändern Show count of new news Anzahl neuer Nachrichten anzeigen Show count of unread news Anzahl ungelesener Nachrichten anzeigen Single click instead of double click for show window Programmfenster mit einfachem Klick öffnen Empty working set on minimize to tray Beim Minimieren in Systemleiste Speicher löschen Move to the system tray when: In Systemleiste minimieren, wenn: Tray icon behavior: Verhalten des Systemleistensymbols: Direct connection to the Internet Direkte Internetverbindung System proxy configuration (if available) Systemeigene Proxykonfiguration (falls vorhanden) Manual proxy configuration: Manuelle Proxykonfiguration: Proxy server: Proxyserver: Port: Port: Username: Benutzername: Password: Passwort: Request timeout: Zeitlimit (in Sekunden): Number of requests: Anzahl der Anfragen: Number of retries: Anzahl der Versuche: Options network requests when updating feeds (requires program restart): Optionen Netzwerkanfragen beim Aktualisieren (erfordert Neustart des Programms): Use embedded browser Internen Browser benutzen Use external browser Externen Browser benutzen Default external browser Externer Standard-Browser Following external browser: Diesen externen Browser benutzen: Browse... Durchsuchen... Load images Bilder laden Enable JavaScript JavaScript aktivieren Enable plug-ins Erweiterungen aktivieren Open links in embedded browser in background Zieladresse im internen Browser im Hintergrund öffnen Open links in external browser in background (experimental) Zieladresse im externen Browser im Hintergrund öffnen (experimentell) Default zoom on pages: Standardzoom Webseiten: Browser selection: Browserauswahl: External browser: Externer Browser: Content: Inhalt: User style sheet: Benutzerdefinierter Stil: Maximum pages in cache Maximale Anzahl von Seiten im Cache Store cache in: Cache speichern unter: Maximum size of disk cache Maximale Größe des Festplatten-Caches MB MB Use disk cache Festplatten-Cache benutzen Allow local data to be set Speicherung lokaler Daten zulassen Keep local data only until quit application Lokale Daten bis zum Beenden der Anwendung behalten Block sites from setting any data Webseiten daran hindern, Daten zu setzen Clear Leeren Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Die Click To Flash-Erweiterung unterbindet das automatische Laden von Flash-Inhalten einer Seite. Durch Klick auf das Abspielsymbol können Flash-Inhalte aktiviert werden. Use Click to Flash Click to Flash verwenden Add... Hinzufügen... Remove... Entfernen... Ask where to save each file before downloading Vor Herunterladen von Dateien nach dem Speicherort fragen Download location: Speicherort: History Verlauf Click to Flash Click to Flash Downloads Downloads Automatically update the feeds on startup Alle Feeds beim Start aktualisieren Automatically update the feeds every Alle Feeds aktualisieren nach seconds Sekunden hours Stunden Nothing to do Nichts tun Dec Dez December Dezember Display format for date: Datumsformat: time: Zeit: Alternating row background colors Zeilenhintergrundfarbe ändern Simplified representation of date and time Vereinfachte Datums-und Zeitanzeige Show All Alle anzeigen Show New Neue anzeigen Show Unread Ungelesene anzeigen Show Starred Nachrichten mit Stern anzeigen Show Not Starred Nachrichten ohne Stern anzeigen Show Unread or Starred Ungelesene oder Nachrichten mit Stern anzeigen Show Last Day Letzten Tag anzeigen Show Last 7 Days Letzte 7 Tage anzeigen Style sheet for news: Stilvorlage für Nachrichten: Mark news as read: Nachricht als gelesen markieren: on selecting. With timeout beim Auswählen. Mit Zeitlimit after switching to another news beim Wechsel zu einer anderen Nachricht Mark displayed news as read when switching feeds Angezeigte Nachricht beim Wechsel des Feeds als gelesen markieren Mark displayed news as read when closing tab Angezeigte Nachricht beim Schließen des Reiters als gelesen markieren Mark displayed news as read on minimize Angezeigte Nachricht beim Minimieren als gelesen markieren Change behavior of action 'Next Unread News' Verhalten von "Nächste ungelesene Nachricht" ändern starred news Nachrichten mit Stern labeled news Nachrichten mit Kennzeichnung Automatically mark identical news as read Identische Nachrichten automatisch als gelesen markieren Prevent accidental deletion of: Unbeabsichtigtes Löschen verhindern: Enable cleanup on shutdown Reinigung beim Beenden aktivieren Maximum age of news in days to keep: Maximale Aufbewahrungszeit von Nachrichten (in Tagen): Maximum number of news to keep: Maximale Anzahl zu behaltender Nachrichten: Delete read news Gelesene Nachrichten löschen Never delete unread news Ungelesene Nachrichten nie löschen Never delete starred news Nachrichten mit Stern nie löschen Never delete labeled news Nachrichten mit Kennzeichnung nie löschen Clean up 'Deleted' Gelöschte entfernen Enable DB optimization (slower shutdown) DB-Optimierung aktivieren (verlangsamt Beenden) Reading Lesen Clean Up Bereinigen New... Neu... Edit... Bearbeiten... Delete... Löschen... Move up Nach oben Move down Nach unten Show when inactive main window Bei Inaktivität Hauptfenster anzeigen Screen Bildschirm Transparency Transparenz Show titles feeds Name des Feeds anzeigen Show icon feed Symbol anzeigen Show button 'Mark All News Read' Schaltfläche 'Alle Nachrichten als gelesen markieren' anzeigen Show button 'Mark Read/Unread' Schaltfläche 'Als gelesen/ungelesen markieren' anzeigen Show button 'Open in External Browser' Schaltfläche 'Im externen Browser öffnen' anzeigen Show button 'Delete News' Schaltfläche 'Gelöschte Nachrichten' anzeigen Play sound for incoming new news Klang bei neuer Nachricht abspielen Play Anhören Display notification for incoming news Popup bei neuer Nachricht anzeigen Top Left Oben links Top Right Oben rechts Bottom Left Unten links Bottom Right Unten rechts Review Vorschau Position Position Show maximum of Maximale Anzahl von item on page notification Nachrichten im Popup Width list items Breite der Nachrichtenliste pixels Pixel Close notification after Popup schließen nach Do not show notification in fullscreen mode Keine Benachrichtigungen im Vollbildmodus anzeigen Display Anzeige Action mouse on news opening: Maus-Aktion beim Öffnen von Nachrichten: Single Click: Einfacher Klick: Double Click: Doppelklick: Middle Click: Mittelklick: Only show selected feeds: Nur ausgewählte Feeds anzeigen: Notification Popup-Fenster Sound Klang Selection of feeds Feed-Auswahl All Feeds Alle Feeds Site Webseite User Benutzer Password Passwort Delete Löschen Delete All Alle löschen Show Passwords Passwörter anzeigen Version Version Author Autor Contact Kontakt Choose language: Sprache wählen: Type Art Font Schriftart Feeds list font Schriftart Feed-Liste News list font Schriftart Nachrichtenliste News title font Schriftart Nachrichtentitel News text font Schriftart Nachrichten Notification font Schriftart im Popup Change... Ändern... Reset Zurücksetzen Feeds list color Farbe Feed-Liste Feeds list background Hintergrund Feed-Liste News list color Farbe Nachrichtenliste News list background Hintergrund Nachrichtenliste Focused news color Farbe markierte Nachricht Focused news background color Hintergrundfarbe markierte Nachricht Link color Farbe Zieladresse Title color Farbe Titel Date color Farbe Datum Author color Farbe Autor News text color Farbe Nachrichtentext News title background Hintergrund Nachrichtentitel News background Hintergrund Nachricht Feed with new news Feed mit neuen Nachrichten Count of unread news in feeds tree Anzahl ungelesener Nachrichten in Feed-Baumansicht Disabled feed Deaktivierter Feed Alternating row colors Wechselnde Zeilenfarben Notification text color Schriftfarbe im Popup Notification background color Hintergrundfarbe im Popup Auto load images in news view Bilder automatisch in Nachrichtenansicht laden Text color of new news Textfarbe neuer Nachrichten Show feeds tree toggle Paneel-Umschalter für Feed-Liste an der Seite anzeigen Clear new status when minimize to tray Neuen Status beim Minimieren in Systemleiste löschen Set focus on the last opened news Fokus auf zuletzt geöffnete Nachricht setzen Set focus at the top of news list Fokus auf oberste Nachricht der Liste setzen Set focus on the unread news Fokus auf ungelesene Nachrichten setzen Open the news Nachricht öffnen Default news filter: Hauptnachrichtenfilter: Action on feed opening: Aktion beim Öffnen des Feeds: Show news description instead of loading web page Nachrichtenbeschreibung anzeigen, Webseite nicht laden Text color of unread news Textfarbe ungelesener Nachrichten Focused feed color Farbe markierter Feed Focused feed background color Hintergrundfarbe markierter Feed Standard Standard Fixed Festgesetzt Serif Serif Sans Serif Sans Serif Cursive Kursiv Fantasy Fantasy Default font size Standardschriftgröße Fixed font size Festgesetzte Schriftgöße Minimum font size Minimale Schriftgröße Minimum logical font size Minimale Schriftgröße (Logical) Font families: Schriftfamilie: Font sizes: Schriftgrößen: Fonts Schriftarten Fonts Browser Schriftartenauswahl Colors Farben Filter Filter Action Aktion Description Beschreibung Shortcut Tastaturkürzel Shortcut: Tastaturkürzel: Open File... Datei öffnen... Select Style Sheet File Benutzerdefinierten Stil auswählen Open Directory... Verzeichnis öffnen... Add site to whitelist Webseite zur Positivliste hinzufügen Site without 'http://' (ex. youtube.com) Webseite ohne ' http:// ' (z.B.: youtube.com) QAbstractSpinBox &Step up &eins nach oben Step &down &eins nach unten &Select All &Alles auswählen QDialogButtonBox Close Schließen Cancel Abbrechen &Yes &Ja &No &Nein QFtp Not connected Nicht verbunden Host %1 not found Host %1 nicht gefunden Connection refused to host %1 Verbindung zu Host %1 abgelehnt Connection timed out to host %1 Zeitüberschreitung bei Verbindung zu Host %1 Connected to host %1 Verbunden mit Host %1 Connection refused for data connection Verbindung für Datentransfer abgelehnt Unknown error Unbekannter Fehler Connecting to host failed: %1 Verbindung zu Host fehlgeschlagen: %1 Login failed: %1 Anmeldung fehlgeschlagen: %1 Listing directory failed: %1 Auflistung des Verzeichnisses fehlgeschlagen: %1 Changing directory failed: %1 Wechsel zum Verzeichnis fehlgeschlagen: %1 Downloading file failed: %1 Herunterladen der Datei fehlgeschlagen: %1 Uploading file failed: %1 Hochladen der Datei fehlgeschlagen: %1 Removing file failed: %1 Entfernen der Datei fehlgeschlagen: %1 Creating directory failed: %1 Erstellen des Verzeichnisses fehlgeschlagen: %1 Removing directory failed: %1 Entfernen des Verzeichnisses fehlgeschlagen: %1 Connection closed Verbindung beendet QLineEdit &Undo &Rückgängig &Redo &Wiederholen Cu&t &Ausschneiden &Copy &Kopieren &Paste &Einfügen Delete Löschen Select All Alles auswählen QMultiInputContext Select IM Eingabemethode auswählen QObject Cannot start external program Kann externes Programm nicht starten Cannot start external program! %1 Kann externes Programm nicht starten! %1 Error Fehler QTextControl &Undo &Rückgängig &Redo &Wiederholen Cu&t &Ausschneiden &Copy &Kopieren &Paste &Einfügen Delete Löschen Select All Alles auswählen Copy &Link Location &Zieladresse kopieren QWizard Cancel Abbrechen < &Back < &Zurück &Finish &Abschließen &Next > &Weiter > RSSDetectionWidget Untitled feed Unbenannter Feed RequestFeed Server requires authentication! Server benötigt Autorisation! Server replied: Not Found! Server-Antwort: Nicht gefunden! Redirect error! Weiterleitungsfehler! Request timeout! Anfrage-Zeitlimit überschritten! SQLiteDriver Error opening database Fehler beim Öffnen der DB Error closing database Fehler beim Schließen der DB Unable to begin transaction Transaktion kann nicht gestartet werden Unable to commit transaction Transaktion kann nicht ausgeführt werden Unable to rollback transaction Transaktion kann nicht wiederholt werden SQLiteResult Unable to fetch row Zeile kann nicht abgerufen werden No query Keine Anfrage Unable to execute statement Anweisung kann nicht ausgeführt werden Unable to execute multiple statements at a time Mehrere Anweisungen können nicht gleichzeitig ausgeführt werden Unable to reset statement Anweisung kann nicht zurückgesetzt werden Unable to bind parameters Parameter können nicht übermittelt werden Parameter count mismatch Parameter stimmen nicht überein SslErrorDialog SSL Certificate Error! Fehlerhaftes SSL-Zertifikat! Only for this session Nur für diese Sitzung UpdateAppDialog Check for Updates Programmaktualisierung suchen Checking for updates... Suche Programmaktualisierung... Loading history... Versionshistorie wird geladen... Don't remind about this version Auf diese Version nicht mehr hinweisen &Install &Installieren You already have the latest version Sie haben bereits die neueste Version A new version of QuiteRSS is available! Eine neue Version von QuiteRSS ist verfügbar! Click here to go to the download page Zur Download-Seite Your version is: Ihre Version: Current version is: Aktuelle Version: Error checking updates Fehler beim Prüfen von Programmaktualisierungen quiterss-0.18.3/lang/quiterss_el_GR.ts000066400000000000000000006133571265173051100177220ustar00rootroot00000000000000 AboutDialog About Σχετικά Revision ΑναθεώÏηση Version Έκδοση QuiteRSS is a open-source cross-platform RSS/Atom news reader Το QuiteRSS είναι ένας open-source και cross-platform RSS/Atom αναγνώστης νέων Includes: ΣυμπεÏιλαμβάνει: Application directory: Κατάλογος ΕφαÏμογών: Resource directory: Κατάλογος πηγών: Data directory: Κατάλογος δεδομένων: Backup directory: Τοποθεσία αντιγÏάφων ασφαλείας: Database file: ΑÏχείο βάσης δεδομένων: Settings file: ΑÏχείο Ïυθμίσεων: Log file: ΑÏχείο καταγÏαφών: Authors ΣυγγÏαφείς History ΙστοÏικό License Άδεια Information ΠληÏοφοÏίες AdBlockAddSubscriptionDialog Add Subscription ΠÏοσθήκη συνδÏομής Title: Τίτλος: Address: ΔιεÏθυνση: Add new subscription to AdBlock: ΠÏοσθήκη νέας συνδÏομής στο AdBlock: AdBlockCustomList Custom Rules ΠÏοσαÏμοσμένοι Κανόνες AdBlockDialog AdBlock Configuration ΔιαμόÏφωση του AdBlock Enable AdBlock ΕνεÏγοποίηση του AdBlock Search... Αναζήτηση... Options Επιλογές AdBlock AdBlock Use only essential part of EasyList (for performance reasons) ΧÏήση μόνων των απαÏαίτητων στοιχείων του EasyList Add Rule ΠÏοσθήκη κανόνα Remove Rule ΑφαίÏεση κανόνα Add Subscription ΠÏοσθήκη συνδÏομής Remove Subscription ΑφαίÏεση συνδÏομής Update Subscriptions ΕνημέÏωση συνδÏομών Learn about writing rules... Μάθετε πεÏισσότεÏα... AdBlockIcon AdBlock lets you block unwanted content on web pages Το AdBlock σας επιτÏέπει τη φÏαγή του ανεπιθÏμητου πεÏιεχομένου των ιστοσελίδων AdBlock AdBlock Show AdBlock &Settings Εμφάνιση &Ρυθμίσεων AdBlock Disable on %1 ΑπενεÏγοποίηση στο %1 Disable only on this page ΑπενεÏγοποίηση μόνο για τη σελίδα Blocked Popup Windows Αποκλεισμένα αναδυόμενα παÏάθυÏα %1 with (%2) %1 με (%2) No content blocked Δεν έχει μπλοκαÏιστεί τίποτα Blocked URL (AdBlock Rule) - click to edit rule ΜπλοκαÏισμένη URL (Κανόνας AdBlock) - κάντε κλικ για επεξεÏγασία AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Αδυναμία φόÏτωσης συνδÏομής! AdBlockTreeWidget Add Rule ΠÏοσθήκη κανόνα Remove Rule ΑφαίÏεση κανόνα Add Custom Rule ΠÏοσθήκη Ï€ÏοσαÏμοσμένου κανόνα Please write your rule here: Εισάγετε τον κανόνα εδώ: %1 (recently updated) %1 (ενημεÏώθηκε Ï€Ïόσφατα) %1 (Error: %2) %1 (Σφάλμα: %2) AddFeedWizard Add Feed ΠÏοσθήκη Feed Create New Feed ΔημιουÏγία Feed Use title of the feed as displayed name ΧÏήση του τίτλου του feed ως όνομα Server requires authentication: Ο διακομιστής απαιτεί ταυτοποίηση: Username: Όνομα χÏήστη: Password: Κωδικός Ï€Ïόσβασης: Feed URL or website address: ΔιεÏθυνση ιστοσελίδας ή feed: Feeds Ροές All Feeds Όλες οι Ïοές New Folder... Îέος φάκελος... Displayed name: Όνομα: Location: Τοποθεσία: URL error! Σφάλμα URL! Duplicate feed! Διπλότυπο feed! Can't find feed URL! Δεν βÏέθηκε το URL του feed! Request failed! Η αίτηση απέτυχε! AddFolderDialog Add Folder ΠÏοσθήκη φακέλου Feeds Ροές All Feeds Όλες οι Ïοές Name: Όνομα: Location: Τοποθεσία: AuthenticationDialog Save password Αποθήκευση ÎºÏ‰Î´Î¹ÎºÎ¿Ï Authorization required Απαιτείται έγκÏιση Server: Διακομιστής: Message: Μήνυμα: Username: Όνομα χÏήστη: Password: Κωδικός Ï€Ïόσβασης: CategoriesTreeWidget Unread Μη αναγνωσμένο Starred Με αστεÏίσκο Deleted ΔιαγÏαμμένο Labels Ετικέτες Open in New Tab Άνοιγμα σε νέα καÏτέλα Clear 'Deleted' ΚαθαÏισμός «ΔιαγÏαμμένων» Mark Read Σημείωση ως αναγνωσμένο CleanUpWizard Clean Up ΚαθαÏισμός Choose Feeds Επιλογή Ïοών All Feeds Όλες οι Ïοές Clean Up Options Επιλογές ΚαθαÏÎ¹ÏƒÎ¼Î¿Ï Maximum age of news in days to keep: Μέγιστο χÏονικό διάστημα αποθήκευσης των νέων σε ημέÏες: Maximum number of news to keep: Μέγιστος αÏιθμός νέων: Delete read news ΔιαγÏαφή αναγνωσμένων νέων Never delete unread news Îα μην γίνεται διαγÏαφή των μη αναγνωσμένων ειδήσεων Never delete starred news Îα μην γίνεται διαγÏαφή των ειδήσεων με αστεÏίσκο Never delete labeled news Îα μην γίνεται διαγÏαφή των ειδήσεων με ετικέτα Clean up 'Deleted' ΚαθαÏισμός «διαγÏαμμένων» Purge DB ΔιαγÏαφή ΒΔ Totally remove records that had marked 'deleted' from DB. Ancient news could reappear ΠλήÏης αφαίÏεση εγγÏαφών μαÏκαÏισμένες ως «διαγÏαμμένες» στη ΒΔ. ΑÏχαία νέα μποÏεί να επανεμφανιστοÏν Information ΠληÏοφοÏίες Clean Up wizard deleted %1 news Ο οδηγός καθαÏÎ¹ÏƒÎ¼Î¿Ï Î´Î¹Î­Î³Ïαψε %1 ειδήσεις ClickToFlash Object blocked by ClickToFlash Το αντικείμενο μπλοκαÏίστηκε από το ClickToFlash Hide object ΑπόκÏυψη αντικειμένου Add '%1' to whitelist ΠÏοσθήκη «%1» στη λευκή λίστα CustomizeToolbarDialog Customize Main Toolbar ΠαÏαμετÏοποίηση της κÏÏιας γÏαμμής εÏγαλείων Customize Feeds Toolbar ΠαÏαμετÏοποίηση της γÏαμμής εÏγαλείων Ïοών Customize News Toolbar ΠαÏαμετÏοποίηση της γÏαμμής εÏγαλείων ειδήσεων Load images ΦόÏτωση εικόνων Separator ΔιαχωÏιστικό Icon Εικονίδιο Text Κείμενο Text Beside Icon Κείμενο δίπλα από το εικονίδιο Text Under Icon Κείμενο κάτω από το εικονίδιο Big Μεγάλο Normal Κανονικό Small ΜικÏÏŒ Style: Στιλ: Icon Size: Μέγεθος εικόνας: Add ΠÏοσθήκη Remove ΑφαίÏεση Move up Μετακίνηση επάνω Move down Μετακίνηση κάτω Default ΠÏοεπιλογή DownloadItem Remaining time unavailable Ο xÏόνος που απομένει δεν είναι διαθέσιμος Error: Cannot write to file! Σφάλμα: Δεν είναι δυνατή η εγγÏαφή στο αÏχείο! Error: Σφάλμα: few seconds λίγα δευτεÏόλεπτα seconds δευτεÏόλεπτα minutes λεπτά hours ÏŽÏες Unknown size άγνωστο μέγεθος Unknown speed άγνωστη ταχÏτητα %2 - unknown size (%3) %2 - αγνώστο μεγέθος (%3) Remaining %1 - %2 of %3 (%4) Υπόλοιπο %1 - %2 απο %3 (%4) Cancelled - %1 ΑκυÏώθηκε - %1 Delete file ΔιαγÏαφή αÏχείου Do you want to also delete downloaded file? Επιθυμείτε επίσης να διαγÏάψετε το ληφθέν αÏχείο; Open File Άνοιγμα αÏχείου Open Folder Άνοιγμα φακέλου Copy Download Link ΑντιγÏαφή τοποθεσίας Cancel Downloading ΑκÏÏωση λυψης Remove ΑφαίÏεση Cancelled ΑκÏÏωση Error Σφαλμα Not found Δεν βÏέθηκε Sorry, the file %1 was not found! Συγνωμη, το αÏχειο %1 δεν βÏεθηκε! DownloadManager Clear ΕκκαθαÏιση File %1 (*.%2) ΑÏχειο %1 (*.%2) All Files (*.*) Ολα τα αÏχεια (*.*) Save As... Αποθήκευση Ως... Executable: Εκτελέσιμο: Arguments: ΕπιχειÏήματα: FeedPropertiesDialog Properties Ιδιότητες General Γενικά Columns Στήλες Authentication Ταυτοποίηση Status Κατάσταση Title: Τίτλος: Homepage: ΚεντÏική σελίδα: Feed URL: URL του Feed: Load Title ΦόÏτωση τίτλου Load Favicon ΦόÏτωση Favicon Select Icon... Επιλογή εικονιδίου... Select Icon Επιλογή εικονιδίου Disable update ΑπενεÏγοποίηση ενημεÏώσεων Automatically update every Αυτόματη ανανέωση κάθε seconds δευτεÏόλεπτα minutes λεπτά hours ÏŽÏες Starred ΜαÏκαÏισμένο Load images ΦόÏτωση εικόνων Display in new tab on startup Εμφάνιση σε νέα καÏτέλα κατά την εκκίνηση Show news' description instead of loading web page Εμφάνιση της πεÏιγÏαφής των ειδήσεων αντί για φόÏτωση της σελίδας Automatically delete duplicate news Αυτόματη διαγÏαφή διπλότυπων ειδήσεων Display Εμφάνιση Reading Ανάγνωση Enable JavaScript ΕνεÏγοποίηση JavaScript Right-to-left layout Διάταξη δεξιά Ï€Ïος τα αÏιστεÏά Ascending ΑÏξουσα Descending Φθίνουσα Sort by: Ταξινόμηση κατά: Add ΠÏοσθήκη Remove ΑφαίÏεση Move up Μετακίνηση επάνω Move down Μετακίνηση κάτω Default ΠÏοεπιλογή Server requires authentication: Ο διακομιστής απαιτεί ταυτοποίηση: Username: Όνομα χÏήστη: Password: Κωδικός Ï€Ïόσβασης: Feeds count: Πλήθος Ïοών: Description: ΠεÏιγÏαφή: Status: Κατάσταση: Created: ΔημιουÏγήθηκε: Last update: Τελευταία ανανέωση: News count: Πλήθος νέων: Good Καλή Long ago ;-) Î Î¿Î»Ï Ï€Ïίν ;-) new νέο unread μη αναγνωσμένο Image files ΑÏχεία εικόνων Select Image Επιλογή εικόνας Load icon: can't open a file! ΦόÏτωση εικόνας: το αÏχείο δεν μποÏεί να ανοιχθεί! FilterRulesDialog Filter Rules Κανόνες φίλτÏου Feeds Feeds All Feeds Όλες οι Ïοές Filter name: Όνομα φίλτÏου: Match all news ΤαίÏιασμα με όλα τα νέα Match all conditions ΤαίÏιασμα με όλες τις συνθήκες Match any condition ΤαίÏιασμα με οποιαδήποτε από τις συνθήκες Perform these actions: Εκτέλεση των παÏακάτω ενεÏγειών: Please enter name for the filter. Εισάγετε όνομα για το φίλτÏο. Please enter search condition for the news filter. Εισάγετε συνθήκη αναζήτησης για το φίλτÏο. FindFeed Find Name ΕÏÏεση ονόματος Find Link ΕÏÏεση συνδέσμου FindTextContent Find in News Αναζήτηση στις ειδήσεις Find in Titles ΕÏÏεση στους τίτλους Find in Authors ΕÏÏεση στους συγγÏαφείς Find in Categories ΕÏÏεση στις κατηγοÏίες Find in Descriptions Αναζήτηση στην πεÏιγÏαφή Find in Links Αναζήτηση στους δεσμοÏÏ‚ Find in Browser Αναζήτηση στον πεÏιηγητή FtpDownloader Canceled! ΑκυÏώθηκε! ItemAction Mark News as Read Σήμανση ειδήσεων ως αναγνωσμένες Add Star ΠÏοσθήκη αστεÏίσκου Delete ΔιαγÏαφή Add Label ΠÏοσθήκη ετικέτας Play a Sound ΑναπαÏαγωγή ήχου Show News in Notifier Εμφάνιση των ειδήσεων στις ειδοποιήσεις Browse ΠεÏιήγηση Play ΑναπαÏαγωγή Add Action ΠÏοσθήκη ΕνέÏγειας Delete Action ΔιαγÏαφή ΕνέÏγειας Open File... Άνοιγμα αÏχείου... ItemCondition Title Τίτλος Description ΠεÏιγÏαφή Author ΣυγγÏαφέας Category ΚατηγοÏία State Κατάσταση Link ΣÏνδεσμος News Ειδήσης New Îέο Read Αναγνωσμένο Starred Με αστεÏίσκο Add Condition ΠÏοσθήκη Συνθήκης Delete Condition ΔιαγÏαφή Συνθήκης contains πεÏιέχει doesn't contains δεν πεÏιέχει is είναι isn't δεν είναι begins with αÏχίζει με ends with τελειώνει με Regular expressions Κανονικές εκφÏάσεις LabelDialog New Label Îέα Ετικέτα Load icon... ΦόÏτωση εικονιδίου... Default ΠÏοεπιλογή Select color... Επιλογή ΧÏώματος... Name: Όνομα: Icon: Εικονίδιο: Color text: ΧÏώμα κειμένου: Color background: ΧÏώμα φόντου: Image files ΑÏχεία εικόνων Select Image Επιλογή εικόνας Load icon: can't open a file! ΦόÏτωση εικόνας: δεν μποÏεί να ανοιχθεί! MainApplication Saving data... Αποθήκευση δεδομένων... MainWindow &AdBlock &AdBlock Hide Categories ΑπόκÏυψη ΚατηγοÏιών Show Categories Εμφάνιση ΚατηγοÏιών Select OPML-File Επιλογή OPML αÏχείου OPML-Files (*.%1 *.%2) ΑÏχεία OPLM (*.%1 *.%2) Import canceled Η εισαγωγή ακυÏώθηκε Import: can't open a file Εισαγωγή: σφάλμα κατα το άνοιγμα αÏχείου OPML-Files (*.%1) ΑÏχείο OPML (*.%1) Export canceled Η εξαγωγή ακυÏώθηκε Export: can't open a file Εξαγωγή: σφάλμα κατά το άνοιγμα του αÏχείου Unread: %1 Μη αναγνωσμένα: %1 All: %1 Όλα: %1 (Browser) (ΠεÏιηγητής) New News: %1 Îέα: %1 Unread News: %1 Μη αναγνωσμένα νέα: %1 &Add &ΠÏοσθήκη Add New Feed ΠÏοσθήκη νέας Ïοής &Feed... &Ροή... F&older... Φά&κελος... Add New Folder ΠÏοσθήκη νέου φακέλου Open in New Tab Άνοιγμα σε νέα καÏτέλα &Delete... &ΔιαγÏαφή... Delete Selected Feed ΔιαγÏαφή της επιλεγμένης Ïοής &Import Feeds... &Εισαγωγή Ïοών... Import Feeds from OPML File Εισαγωγή Ïοής από αÏχείο OPML &Export Feeds... &Εξαγωγή Ïοών... Export Feeds to OPML File Εξαγωγή των Ïοών σε αÏχείο OPML E&xit &Έξοδος Update Feed ΕνημέÏωση της Ïοής Update Current Feed ΕνημέÏωση της επιλεγμένης Ïοής Update All ΕνημέÏωση όλων Update All Feeds ΕνημέÏωση όλων των Ïοών Mark All Feeds Read Σημείωση των Ïοών ως αναγνωσμένες Mark Read/Unread Σημείωση ως αναγνωσμένο/μη αναγνωσμένο Mark Current News Read/Unread Σημείωση της επιλεγμένης είδησης ως αναγνωσμένη/μη αναγνωσμένη Mark All News Read Σημείωση όλων των ειδήσεων ως αναγνωσμένες Downloads Λήψεις Clean Up... ΚαθαÏισμός... News Filters... ΦίλτÏα ειδήσεων... Filter News... ΦιλτÏάÏισμα ειδήσεων... Options... Επιλογές... Open Options Dialog Άνοιγμα επιλογών Filter Feeds ΦίλτÏο Ïοών Show All Εμφάνιση όλων Show New Εμφάνιση νέων Show Unread Εμφάνιση μη αναγνωσμένων Show Starred Feeds Εμφάνιση των Ïοών με αστεÏίσκο Show Not Working Feeds Εμφάνιση μη λειτουÏγικών Ïοών Filter News ΦίλτÏο Ειδήσεων Show Starred Εμφάνιση αυτών με αστεÏίσκο Show Not Starred Εμφάνιση αυτών χωÏίς αστεÏίσκο Show Unread or Starred Εμφάνιση των μη αναγνωσμένων ή των σημειωμένων με αστεÏίσκο Show Last Day Εμφάνιση της τελευταίας ημέÏας Show Last 7 Days Εμφάνιση των τελευταίων 7 ημεÏών About... Σχετικά... Show 'About' Dialog Εμφάνιση του διαλόγου «Σχετικα» Check for Updates... Έλεγχος για ενημεÏώσεις... Report a Problem... ΑναφοÏά Ï€Ïοβλήματος... Open News Άνοιγμα της είδησης Open in Browser Άνοιγμα στον πεÏιηγητή Open in External Browser Άνοιγμα σε εξωτεÏικό πεÏιηγητή Open News in External Browser Άνοιγμα των ειδήσεων σε εξωτεÏικό πεÏιηγητή Open News in New Tab Άνοιγμα των ειδήσεων σε νέα καÏτέλα Open in Background Tab Άνοιγμα σε καÏτέλα παÏασκηνίου Open News in Background Tab Άνοιγμα των ειδήσεων σε καÏτέλα στο παÏασκήνιο Star ΑστεÏίσκος Mark News Star Σημείωση της είδησης με αστεÏίσκο Delete ΔιαγÏαφή Delete Selected News ΔιαγÏαφή επιλεγμένων ειδήσεων Delete All News ΔιαγÏαφή όλων των ειδήσεων Delete All News from List ΔιαγÏαφή όλων των ειδήσεων από τη λίστα Restore ΕπαναφοÏά Restore News ΕπαναφοÏά ειδήσεων Copy Link ΑντιγÏαφή Συνδέσμου Restore last deleted news Ανάκτηση τελευταίων διαγÏαμμένων ειδήσεων Mark Read Σημείωση ως αναγνωσμένο Mark Feed Read Σημείωση Ïοής ως αναγνωσμένη Properties Ιδιότητες &File &ΑÏχείο Count Unread News ΚαταμέτÏηση των μη αναγνωσμένων ειδήσεων Count All News ΚαταμέτÏηση όλων των ειδήσεων Last Update Τελευταία ενημέÏωση Reset browser zoom ΕπαναφοÏά εστίασης στον πεÏιηγητή Print Web Page ΕκτÏπωση ιστοσελίδας Preview Web Page ΠÏοεπισκόπηση Σελίδας Save page in database Αποθήκευση της σελίδας στη βάση δεδομένων Save page in database instead of news description Αποθήκευση σελίδας στην Βάση Δεδομένων αντί για πεÏιγÏαφή νέων Confirm Delete Επιβεβαίωση ΔιαγÏαφής Are you sure to delete selected elements? Είστε σίγουÏος-η ότι θέλετε να διαγÏάψετε τα επιλεγμένα στοιχεία; Menu ÎœÎµÎ½Î¿Ï Add Feed... ΠÏοσθήκη Ïοής... &Create Backup... &ΔημιουÏγία ΑντιγÏάφου Ασφαλείας... S&how Menu Bar &Εμφάνιση γÏαμμής Î¼ÎµÎ½Î¿Ï Stop Update Feeds Διακοπή ενημέÏωσης Ïοών Open News Description Άνοιγμα πεÏιγÏαφής ειδήσεων Copy News Link ΑντιγÏαφή συνδέσμου ειδήσεων &View Π&Ïοβολή Fee&ds &Ροές &News &Ειδήσεις &Browser &ΠεÏιηγητής &Tools ΕÏ&γαλεία &Help &Βοήθεια Main Toolbar ΚÏÏια γÏαμμή εÏγαλείων Customize Toolbar ΠαÏαμετÏοποίηση της γÏαμμής εÏγαλείων Main Toolbar... ΚÏÏια γÏαμμή εÏγαλείων... Customize Toolbar... ΠαÏαμετÏοποίηση της γÏαμμής εÏγαλείων... Feeds Toolbar... ΓÏαμμή εÏγαλείων Ïοών... News Toolbar... ΓÏαμμή εÏγαλείων ειδήσεων... Lock Toolbar Κλείδωμα της γÏαμμής εÏγαλείων Hide Toolbar ΑπόκÏυψη της γÏαμμής εÏγαλείων Layout Διάταξη Classic Κλασική Newspaper ΕφημεÏίδα Application Style Στιλ εφαÏμογής System ΣÏστημα System2 ΣÏστημα2 Green ΠÏάσινο Orange ΠοÏτοκαλί Purple Μώβ Pink Ρόζ Gray ΓκÏί Browser Position Θέση πεÏιηγητή Top ΚοÏυφή Bottom Κάτω μέÏος Right Δεξιά Left ΑÏιστεÏά Show Window Εμφάνιση παÏαθÏÏου Previous Feed ΠÏοηγοÏμενο feed Next Feed Επόμενη Ïοή Previous News ΠÏοηγοÏμενη είδηση Next News Επόμενη είδηση News Page Up ΠÏοηγοÏμενη σελίδα News Page Down Επόμενη σελίδα Next Unread News Επόμενη μη αναγνωσμένη είδηση Previous Unread News ΠÏοηγοÏμενη μη αναγνωσμένη είδηση Switch Focus to Next Panel Εναλλαγή εστίασης στον επόμενο πίνακα Switch Focus to Next Panel (Tree Feeds, List News, Browser) Εναλλαγή εστίασης στον επόμενο πίνακα (ΔέντÏο Ïοών, λίστα ειδήσεων, πεÏιηγητής) Switch Focus to Previous Panel Εναλλαγή εστίασης στον Ï€ÏοηγοÏμενο πίνακα Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Εναλλαγή εστίασης στον Ï€ÏοηγοÏμενο πίνακα (ΔέντÏο Ïοών, λίστα ειδήσεων, πεÏιηγητής) Show/Hide Tree Feeds Εμφάνιση/ΑπόκÏυψη δέντÏου Ïοών Minimize to Tray Ελαχιστοποίηση στο πλαίσιο συστήματος Minimize Application to Tray Ελαχιστοποίηση της εφαÏμογής στο πλαίσιο συστήματος Columns Στήλες Show Indentation Εμφάνιση εσοχών Search Feed Αναζήτηση Ïοής Zoom Εστίαση Zoom In Μεγέθυνση Zoom in in browser Μεγέθυνση στον πεÏιηγητή Zoom Out ΣμίκÏυνση Zoom out in browser ΣμίκÏυνση στον πεÏιηγητή 100% 100% Print... ΕκτÏπωση... Print Preview... ΠÏοεπισκόπηση ΕκτÏπωσης... Page up (Browser) ΠÏοηγοÏμενη σελίδα (ΠεÏιηγητής) Page down (Browser) Επόμενη σελίδα (ΠεÏιηγητής) Save As... Αποθήκευση ως... Save Page As... Αποθήκευση σελίδας ως... Show/Hide Εμφάνιση/ΑπόκÏυψη Feeds Toolbar ΓÏαμμή εÏγαλείων Ïοών News Toolbar ΓÏαμμή εÏγαλείων ειδήσεων Browser Toolbar ΓÏαμμή εÏγαλείων πεÏιηγητή Panel Categories ΚατηγοÏίες πινάκων Status Bar ΓÏαμμή κατάστασης Full Screen ΠλήÏης οθόνη Stay On Top ΠαÏαμονή στο Ï€Ïοσκήνιο Categories ΚατηγοÏίες Label Ετικέτα Show labels menu Εμφάνιση Î¼ÎµÎ½Î¿Ï ÎµÏ„Î¹ÎºÎµÏ„ÏŽÎ½ Close Tab Κλείσιμο καÏτέλας Close Other Tabs Κλείσιμο των άλλων καÏτελών Close All Tabs Κλείσιμο όλων των καÏτελών Switch to next tab Μετάβαση στην επόμενη καÏτέλα Switch to previous tab Μετάβαση στην Ï€ÏοηγοÏμενη καÏτέλα Unread Μη αναγνωσμένο Starred Με αστεÏίσκο Deleted ΔιαγÏαμμένο Labels Ετικέτες Decrease news list/increase browser Μείωση της λίστας ειδήσεων / αÏξηση του πεÏιηγητή Increase news list/decrease browser ΑÏξηση της λίστας ειδήσεων / μείωση του πεÏιηγητή Find Αναζήτηση Open Homepage Feed Άνοιγμα αÏχικής Ïοής Sort by Name Ταξινόμηση ανά όνομα Collapse All Folders ΣÏμπτυξη όλων των φακέλων Expand All Folders Ανάπτυξη όλων των φακέλων Next Folder Επόμενος φάκελος Previous Folder ΠÏοηγοÏμενος φάκελος Expand Folder Ανάπτυξη φακέλου Setting Page: Labels Σελίδα επιλογών: Ετικέτες Share ΔιαμοιÏασμός Sort By Ταξινόμηση κατά Ascending ΑÏξουσα Descending Φθίνουσα Check for updates Έλεγχος για ενημεÏώσεις A new version of QuiteRSS... Μία νέα έκδοση του QuiteRSS... Loading... ΦόÏτωση... Web Page Ιστοσελίδα Save As Αποθήκευση ως HTML-Files (*.%1) ΑÏχεία HTML (*.%1) Text files (*.%2) ΑÏχεία κειμένου (*.%2) Save As: can't open a file Αποθήκευση ως: σφάλμα κατά το άνοιγμα αÏχείου Choose Directory Επιλογή φακέλου Important Σημαντικό Work ΕÏγασία Personal ΠÏοσωπικό To Do ΠÏος υλοποίηση Later ΑÏγότεÏα Amusingly Ψυχαγωγία NetworkManager SSL Certificate Error! Σφάλμα Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL! The "%1" server has the following errors in the SSL certificate: Ο διακομιστής "%1" αντιμετωπίζει τα παÏακάτω σφάλματα στο πιστοποιητικό SSL: <b>Organization: </b> <b>ΟÏγάνωση: </b> <b>Domain Name: </b> <b>Όνομα τομέα: </b> <b>Expiration Date: </b> <b>ΗμεÏομηνία λήξης: </b> <b>Error: </b> <b>Σφάλμα: </b> Would you like to make an exception for this certificate? Επιθυμείτε να κάνετε μια εξαίÏεση για αυτό το πιστοποιητικό; NewsFiltersDialog News Filters ΦίλτÏα ειδήσεων Feeds Ροές Filter Name Όνομα φίλτÏου New... Îέο... Edit... ΕπεξεÏγασία... Delete... ΔιαγÏαφή... Move up Μετακίνηση πάνω Move down Μετακίνηση κάτω Run Filter Εκτέλεση φίλτÏου Delete Filter ΔιαγÏαφή φίλτÏου Are you sure you want to delete the filter '%1'? Είστε σίγουÏος-η ότι θέλετε να διαγÏάψετε το φίλτÏο «%1»; NewsHeader Icon Feed Εικονίδιο Ïοής Title Τίτλος Published Δημοσιευμένο Received Ελήφθη Author ΣυγγÏαφέας Category ΚατηγοÏία Read Αναγνωσμένο Star ΑστεÏίσκος Label Ετικέτα Feed Title Τίτλος Ïοής Link ΣÏνδεσμος NewsItem Mark Read/Unread Σημείωση ως αναγνωσμένο/μη αναγνωσμένο Delete News ΔιαγÏαφή των ειδήσεων NewsTabWidget Loading... (%p%) ΦόÏτωση... (%p%) Home ΑÏχική Open Page in External Browser Άνοιγμα σελίδας σε εξωτεÏικό πεÏιηγητή Open Link in External Browser Άνοιγμα συνδέσμου σε εξωτεÏικό πεÏιηγητή Open Link Άνοιγμα συνδέσμου Open in New Tab Άνοιγμα σε νέα καÏτέλα Save Link... Αποθήκευση συνδέσμου... Save Image... Αποθήκευση εικόνας... Copy Link ΑντιγÏαφή συνδέσμου Copy ΑντιγÏαφή Go Back Πίσω Go Forward ΕμπÏός Stop Διακοπή Reload ΕπαναφόÏτωση Copy Image ΑντιγÏαφή της εικόνας Copy Image Address ΑντιγÏαφή της διεÏθυνσης της εικόνας Load Images ΦόÏτωση των εικόνων Auto Load Images to News View Αυτόματη φόÏτωση των εικόνων στην Ï€Ïοβολή ειδήσεων No Load Images ΧωÏίς φόÏτωση των εικόνων No Load Images to News View ΧωÏίς φόÏτωση των εικόνων στην Ï€Ïοβολή των ειδήσεων Close Tab Κλείσιμο της καÏτέλας Auto Load Images in News View Αυτόματη φόÏτωση των εικόνων στην Ï€Ïοβολή των ειδήσεων Don't Load Images ΧωÏίς φόÏτωση των εικόνων Don't Load Images in News View ΧωÏίς φόÏτωση των εικόνων στη λίστα ειδήσεων Comments Σχόλια Author: %1 ΣυγγÏαφέας: %1 audio ήχος video βίντεο media πολυμέσα Link to ΣÏνδεση με Mark Read/Unread Σημείωση ως αναγνωσμένο/μη αναγνωσμένο Mark News Star Σημείωση ειδήσεων με αστεÏίσκο Label Ετικέτα Share ΔιαμοιÏασμός Open News in External Browser Άνοιγμα της είδησης σε εξωτεÏικό πεÏιηγητή Delete ΔιαγÏαφή NotificationWidget Close Κλείσιμο Mark All News Read Σημείωση όλων των ειδήσεων ως αναγνωσμένες Previous Page ΠÏοηγοÏμενη σελίδα Next Page Επόμενη σελίδα Incoming News: %1 ΕισεÏχόμενες ειδήσεις: %1 Page %1 of %2 Σελίδα %1 από %2 OptionsDialog Options Επιλογές General Γενικά System Tray Πλαίσιο συστήματος Network Connections Συνδέσεις δικτÏου Browser ΠεÏιηγητής Feeds Ροές Labels Ετικέτες Notifications Ειδοποιήσεις Passwords Κωδικοί Ï€Ïόσβασης Language Γλώσσα Fonts & Colors ΓÏαμματοσειÏές & ΧÏώματα Keyboard Shortcuts ΣυντομεÏσεις πληκτÏολογίου Warning: key is already assigned to ΠÏοσοχή: το κλειδί υπάÏχει ήδη Show splash screen on startup Εμφάνιση εικόνας εκκίνησης στην έναÏξη Reopen last opened feeds on startup Άνοιγμα εκ νέου των τελευταίων Ïοών κατά την εκκίνηση Open new tab next to active Άνοιγμα νέας καÏτέλας δίπλα στην ενεÏγή Hide feeds tree when opening tabs ΑπόκÏυψη δέντÏου Ïοών κατά το άνοιγμα καÏτελών Show default rss-icon instead of favourite one Εμφάνιση του Ï€Ïοεπιλεγμένου εικονιδίου rss αντί για το Ï€Ïοτιμώμενο Automatically collapse folders Αυτόματη σÏμπτυξη των φακέλων Show close button on tab Εμφάνιση του ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï ÎºÎ»ÎµÎ¹ÏƒÎ¯Î¼Î±Ï„Î¿Ï‚ στην καÏτέλα Automatically check for updates Αυτόματος έλεγχος για ενημεÏώσεις Help improve QuiteRSS by sending usage information Βοηθήστε στη βελτίωση του QuiteRSS με την αποστολή στατιστικών χÏήσης Store a DB in memory (requires program restart) Αποθήκευση της βάσης δεδομένων στη μνήμη (απαιτεί επανεκκίνηση του Ï€ÏογÏάμματος) Save DB stored in memory to file every Αποθήκευση της ΒΔ σε αÏχείο κάθε minutes λεπτά Run QuiteRSS at Windows startup Εκτέλεση του QuiteRSS κατά την εκκίνηση του Windows Show system tray icon Εμφάνιση εικονιδίου στο πλαίσιο συστήματος starting QuiteRSS εκκίνηση του QuiteRSS minimizing QuiteRSS ελαχιστοποίηση του QuiteRSS closing QuiteRSS κλείσιμο του QuiteRSS Show static icon Εμφάνιση ÏƒÏ„Î±Ï„Î¹ÎºÎ¿Ï ÎµÎ¹ÎºÎ¿Î½Î¹Î´Î¯Î¿Ï… Change icon for incoming new news Αλλαγή εικονιδίου για τα εισεÏχόμενες ειδήσεις Show count of new news Εμφάνιση πλήθους ειδήσεων Show count of unread news Εμφάνιση πλήθους μη αναγνωσμένων ειδήσεων Single click instead of double click for show window Μονό αντί για διπλό κλικ για την εμφάνιση νέου παÏαθÏÏου Empty working set on minimize to tray Απαλοιφή της εÏγασίας στο σÏνολό της κατά την ελαχιστοποίηση στο πλαίσιο συστήματος Move to the system tray when: Μετακίνηση στο πλαίσιο συστήματος όταν: Tray icon behavior: ΣυμπεÏιφοÏά εικονιδίου του πλαισίου συστήματος: Direct connection to the Internet Άμεση σÏνδεση στο διαδίκτυο System proxy configuration (if available) ΔιαμόÏφωση διαμεσολαβήτή συστήματος (εάν υπάÏχει) Manual proxy configuration: ΧειÏοκίνητη ÏÏθμιση διαμεσολαβητή: Proxy server: Διαμεσολαβητής: Port: ΘÏÏα: Username: Όνομα χÏήστη: Password: Κωδικός Ï€Ïόσβασης: Request timeout: ΧÏονικό ÏŒÏιο αίτησης: Number of requests: ΑÏιθμός αιτήσεων: Number of retries: ΑÏιθμός επαναλήψεων: Options network requests when updating feeds (requires program restart): Επιλογές αιτήσεων δικτÏου κατά την ανανέωση των Ïοών (απαιτεί επανεκκίνηση του Ï€ÏογÏάμματος): Use embedded browser ΧÏήση του ενσωματωμένου πεÏιηγητή Use external browser ΧÏήση εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÎµÏιηγητή Default external browser ΠÏοεπιλεγμένος εξωτεÏικός πεÏιηγητής Following external browser: ΑκολουθοÏμενος εξωτεÏικός πεÏιηγητής: Browse... ΠεÏιήγηση... Load images ΦόÏτωση εικόνων Enable JavaScript ΕνεÏγοποίηση της JavaScript Enable plug-ins ΕνεÏγοποίηση Ï€Ïοσθέτων Open links in embedded browser in background Άνοιγμα συνδέσμων στον ενσωματωμένο πεÏιηγητή στο παÏασκήνιο Open links in external browser in background (experimental) Άνοιγμα συνδέσμων σε εξωτεÏικό πεÏιηγητή στο παÏασκήνιο (πειÏαματικό) Default zoom on pages: ΠÏοεπιλεγμένη εστίαση στις σελίδες: Browser selection: Επιλογή πεÏιηγητή: External browser: ΕξωτεÏικός πεÏιηγητής: Content: ΠεÏιεχόμενο: User style sheet: ΦÏλλο στιλ χÏήστη: Maximum pages in cache Μέγιστος αÏιθμός αποθηκευμένων σελίδων Store cache in: Αποθήκευση κÏυφής μνήμης σε: Maximum size of disk cache Μέγιστο μέγεθος κÏυφής μνήμης στον δίσκο MB MB Use disk cache ΧÏήση κÏυφής μνήμης στον δίσκο Allow local data to be set Îα επιτÏέπεται o καθοÏισμός των τοπικών δεδομένων Keep local data only until quit application ΔιατήÏηση των τοπικών δεδομένων μόνο μέχÏι την έξοδο της εφαÏμογής Block sites from setting any data Îα μην επιτÏέπεται στου ιστοτόπους να αποστέλλουν δεδομένα Clear ΚαθαÏισμός Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Το Click To Flash είναι ένα Ï€Ïόσθετο το οποίο μπλοκάÏει το αυτόματο φόÏτωμα του Flash. ΜποÏείτε να φοÏτώσετε τα αντικείμενα flash κάνοντας κλικ στο εικονίδιο. Use Click to Flash ΧÏήση του Click to Flash Add... ΠÏοσθήκη... Remove... ΑφαίÏεση... Ask where to save each file before downloading Ζητήστε τη θέση αποθήκευσης κάθε αÏχείου Ï€Ïιν από τη λήψη Download location: Τοποθεσία λήψης: History ΙστοÏικό Click to Flash Click to Flash Downloads Λήψεις Automatically update the feeds on startup Αυτόματη ανανέωση των Ïοών κατά την εκκίνηση Automatically update the feeds every Αυτόματη ανανέωση των Ïοών κάθε seconds δευτεÏόλεπτα hours ÏŽÏες Nothing to do Καμία ενέÏγεια Ï€Ïος εκτέλεση Dec Δεκ December ΔεκέμβÏιος Display format for date: ΜοÏφή εμφάνισης για την ημεÏομηνία: time: ÏŽÏα: Alternating row background colors Εναλλαγή χÏÏ‰Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Ï†ÏŒÎ½Ï„Î¿Ï… γÏαμμών Simplified representation of date and time Απλοποιημένη εμφάνιση ημ/νίας και ÏŽÏας Show All Εμφάνιση όλων Show New Εμφάνιση νέων Show Unread Εμφάνιση των μη αναγνωσμένων Show Starred Εμφάνιση αυτών με αστεÏίσκο Show Not Starred Εμφάνιση αυτών χωÏίς αστεÏίσκο Show Unread or Starred Εμφάνιση των μη αναγνωσμένων ή αυτών με αστεÏίσκο Show Last Day Εμφάνιση τελευταίας ημέÏας Show Last 7 Days Εμφάνιση τελευταίων 7 ημεÏών Style sheet for news: ΦÏλλο στιλ για τις ειδήσεις: Mark news as read: Σημείωση των ειδήσεων ως αναγνωσμένες: on selecting. With timeout κατά την επιλογή. Με χÏονικό ÏŒÏιο after switching to another news μετά από εναλλαγή σε άλλη είδηση Mark displayed news as read when switching feeds Σημείωση των ειδήσεων ως αναγνωσμένες κατά την εναλλαγή Ïοής Mark displayed news as read when closing tab Σημείωση των ειδήσεων ως αναγνωσμένες κατά το κλείσιμο της καÏτέλας Mark displayed news as read on minimize Σημείωση των ειδήσεων αναγνωσμένες κατά την ελαχιστοποίηση Change behavior of action 'Next Unread News' Αλλαγή συμπεÏιφοÏάς «Επόμενη μη αναγνωσμένη είδηση» starred news ειδήσεις με αστεÏίσκο labeled news ειδήσεις με ετικέτα Automatically mark identical news as read Αυτόματη σημείωση των πανομοιότυπων ειδήσεων ​​ως αναγνωσμένες Prevent accidental deletion of: ΑποτÏοπή τυχαίας διαγÏαφής του: Enable cleanup on shutdown ΕνεÏγοποίηση του καθαÏÎ¹ÏƒÎ¼Î¿Ï ÎºÎ±Ï„Î¬ την έξοδο Maximum age of news in days to keep: Μέγιστος χÏόνος αποθήκευσης των ειδήσεων σε ημέÏες: Maximum number of news to keep: Μέγιστο πλήθος διατήÏησης ειδήσεων: Delete read news ΔιαγÏαφή αναγνωσμένων ειδήσεων Never delete unread news Îα μην γίνεται ποτέ διαγÏαφή των μη αναγνωσμένων ειδήσεων Never delete starred news Îα μην γίνεται ποτέ διαγÏαφή των ειδήσεων με αστεÏίσκο Never delete labeled news Îα μην γίνεται ποτέ διαγÏαφή των ειδήσεων με ετικέτα Clean up 'Deleted' ΚαθαÏισμός των «διαγÏαμμένων» Enable DB optimization (slower shutdown) ΕνεÏγοποίηση βελτιστοποίησης ΒΔ (καθυστέÏηση στην έξοδο) Reading Ανάγνωση Clean Up ΚαθαÏισμός New... Îέο... Edit... ΕπεξεÏγασία... Delete... ΔιαγÏαφή... Move up Μετακίνηση πάνω Move down Μετακίνηση κάτω Show when inactive main window Εμφάνιση όταν το κυÏίως παÏάθυÏο είναι ανενεÏγό Screen Οθόνη Transparency Διαφάνεια Show titles feeds Εμφάνιση τίτλων των Ïοών Show icon feed Εμφάνιση εικονιδίου Ïοής Show button 'Mark All News Read' Εμφάνιση του ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï Â«Î£Î·Î¼ÎµÎ¯Ï‰ÏƒÎ· όλων των ειδήσεων ως αναγνωσμένες» Show button 'Mark Read/Unread' Εμφάνιση του ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï Â«Î£Î·Î¼ÎµÎ¯Ï‰ÏƒÎ· ως αναγνωσμένο/μη αναγνωσμένο» Show button 'Open in External Browser' Εμφάνιση του ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï Â«Î†Î½Î¿Î¹Î³Î¼Î± σε εξωτεÏικό πεÏιηγητή» Show button 'Delete News' Εμφάνιση του ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï Â«Î”Î¹Î±Î³Ïαφή είδησης» Play sound for incoming new news ΑναπαÏαγωγή ήχου για τα εισεÏχόμενα νέα Play ΑναπαÏαγωγή Display notification for incoming news Εμφάνιση ειδοποίησης για τα εισεÏχόμενα νέα Top Left Πάνω αÏιστεÏά Top Right Πάνω δεξιά Bottom Left Κάτω αÏιστεÏά Bottom Right Κάτω δεξιά Review ΑναθεώÏηση Position Θέση Show maximum of Μέγιστη εμφάνιση item on page notification αντικείμενων στη σελίδα ειδοποιήσεων Width list items Πλάτος λίστας αντικειμένων pixels εικονοστοιχεία Close notification after Κλείσιμο ειδοποιήσεων μετά από Do not show notification in fullscreen mode ΑπενεÏγοποίηση εμφάνισης ειδοποιήσεων σε λειτουÏγία πλήÏους οθόνης Display Εμφάνιση Action mouse on news opening: ΕνέÏγεια Ï€Î¿Î½Ï„Î¹ÎºÎ¹Î¿Ï Î±Î½Î¿Î¯Î³Î¼Î±Ï„Î¿Ï‚ ειδήσεων: Single Click: Μονό κλικ: Double Click: Διπλό κλικ: Middle Click: Μεσαίο κλικ: Only show selected feeds: Εμφάνιση μόνο των επιλεγμένων Ïοών: Notification Ειδοποίηση Sound Ήχος Selection of feeds Επιλογή Ïοών All Feeds Όλες οι Ïοές Site Ιστοσελίδα User ΧÏήστης Password Κωδικός Ï€Ïόσβασης Delete ΔιαγÏαφή Delete All ΔιαγÏαφή όλων Show Passwords Εμφάνιση κωδικών Ï€Ïόσβασης Version Έκδοση Author ΣυγγÏαφέας Contact Επαφή Choose language: Επιλογή γλώσσας: Type ΤÏπος Font ΓÏαμματοσειÏά Feeds list font ΓÏαμματοσειÏά της λίστας Ïοών News list font ΓÏαμματοσειÏά της λίστας ειδήσεων News title font ΓÏαμματοσειÏά των τίτλων ειδήσεων News text font ΓÏαμματοσειÏά του κειμένου των ειδήσεων Notification font ΓÏαμματοσειÏά των ειδοποιήσεων Change... Αλλαγή... Reset ΕπαναφοÏά Feeds list color ΧÏώμα λίστας Ïοών Feeds list background ΧÏώμα φόντου λίστας Ïοών News list color ΧÏώμα λίστας ειδήσεων News list background Φόντο λίστας ειδοποιήσεων Focused news color ΧÏώμα Ï„Ïέχουσας είδησης Focused news background color ΧÏώμα φόντου της Ï„Ïέχουσας είδησης Link color ΧÏώμα συνδέσμων Title color ΧÏώμα τίτλων Date color ΧÏώμα ημεÏομηνίας Author color ΧÏώμα συγγÏαφέα News text color ΧÏώμα γÏαμματοσειÏάς ειδήσεων News title background Φόντο τίτλου ειδήσεων News background Φόντο ειδήσεων Feed with new news Ροή με νέες ειδήσεις Count of unread news in feeds tree ΚαταμέτÏηση των μη αναγνωσμένων ειδήσεων στο δέντÏο Ïοών Disabled feed ΑπενεÏγοποιημένη Ïοή Alternating row colors Εναλλαγή χÏÏ‰Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î³Ïαμμών Notification text color ΧÏώμα κειμένου ειδοποιήσεων Notification background color ΧÏώμα φόντου ειδοποιήσεων Auto load images in news view Αυτόματη φόÏτωση εικόνων στην εμφάνιση των ειδήσεων Text color of new news ΧÏώμα γÏαμματοσειÏάς των νέων ειδήσεων Show feeds tree toggle Εμφάνιση του ÎºÎ¿Ï…Î¼Ï€Î¹Î¿Ï ÎµÎ¼Ï†Î¬Î½Î¹ÏƒÎ·Ï‚/απόκÏυψης του δέντÏου Ïοών Clear new status when minimize to tray ΕκκαθάÏιση της κατάστασης νέου κατά την ελαχιστοποίηση στο πλαίσιο συστήματος Set focus on the last opened news Εστίαση στις τελευταία ανοιγμένες ειδήσεις Set focus at the top of news list Εστίαση στο πάνω μέÏος της λίστας ειδήσεων Set focus on the unread news Εστίαση στις μη αναγνωσμένες ειδήσεις Open the news Άνοιγμα των ειδήσεων Default news filter: ΠÏοεπιλεγμένο φίλτÏο ειδήσεων: Action on feed opening: ΕνέÏγεια κατά το άνοιγμα της Ïοής: Show news description instead of loading web page Εμφάνιση πεÏιγÏαφής ειδήσεων αντί για φόÏτωση της σελίδας Text color of unread news ΧÏώμα γÏαμματοσειÏάς των μη αναγνωσμένων ειδήσεων Focused feed color ΧÏώμα Ï„Ïέχουσας Ïοής Focused feed background color ΧÏώμα φόντου της Ï„Ïέχουσας Ïοής Standard Τυπικό Fixed ΣταθεÏÏŒ Serif Serif Sans Serif Sans Serif Cursive Cursive Fantasy Fantasy Default font size ΠÏοεπιλεγμένο μέγεθος γÏαμματοσειÏάς Fixed font size Μέγεθος γÏαμματοσειÏάς σταθεÏÎ¿Ï Ï€Î»Î¬Ï„Î¿Ï…Ï‚ Minimum font size Ελάχιστο μέγεθος γÏαμματοσειÏάς Minimum logical font size Ελάχιστο μέγεθος λογικής γÏαμματοσειÏάς Font families: Οικογένειες γÏαμματοσειÏών: Font sizes: Μεγέθη γÏαμματοσειÏών: Fonts ΓÏαμματοσειÏές Fonts Browser ΠεÏιηγητής γÏαμματοσειÏών Colors ΧÏώματα Filter ΦίλτÏο Action ΕνέÏγεια Description ΠεÏιγÏαφή Shortcut Συντόμευση Shortcut: Συντόμευση: Open File... Άνοιγμα αÏχείου... Select Style Sheet File Επιλογή αÏχείου φÏλλου στιλ Open Directory... Άνοιγμα καταλόγου... Add site to whitelist ΠÏοσθήκη ιστοσελίδας στη λευκή λίστα Site without 'http://' (ex. youtube.com) Ιστοσελίδα χωÏίς «http://» (πχ. youtube.com) QAbstractSpinBox &Step up &Βήμα πάνω Step &down Βήμα &κάτω &Select All &Όλα QDialogButtonBox Close Κλείσιμο Cancel ΆκυÏο &Yes &Îαι &No &Όχι QFtp Not connected Μη συνδεδεμένο Host %1 not found Ο διακομιστής %1 δεν βÏέθηκε Connection refused to host %1 Η σÏνδεση με τον υπολογιστή %1 αποÏÏίφθηκε Connection timed out to host %1 Η σÏνδεση με τον υπολογιστή %1 έληξε Connected to host %1 Συνδεδεμένο με τον υπολογιστή %1 Connection refused for data connection Η σÏνδεση απέÏÏιψε τη σÏνδεση δεδομένων Unknown error Άγνωστο σφάλμα Connecting to host failed: %1 Η σÏνδεση με το διακομιστή απέτυχε: %1 Login failed: %1 Η είσοδος απέτυχε: %1 Listing directory failed: %1 Η εμφάνιση λίστας απέτυχε: %1 Changing directory failed: %1 Η αλλαγή φακέλου απέτυχε: %1 Downloading file failed: %1 Η λήψη απέτυχε: %1 Uploading file failed: %1 Η αποστολή απέτυχε: %1 Removing file failed: %1 Η διαγÏαφή απέτυχε: %1 Creating directory failed: %1 Η δημιουÏγία καταλόγου απέτυχε: %1 Removing directory failed: %1 Η διαγÏαφή του καταλόγου απέτυχε: %1 Connection closed Η σÏνδεση τεÏματίστηκε QLineEdit &Undo &ΑναίÏεση &Redo Επανα&φοÏά Cu&t &Αποκοπή &Copy &ΑντιγÏαφή &Paste &Επικόλληση Delete ΔιαγÏαφή Select All Επιλογή όλων QMultiInputContext Select IM Επιλογή μεθόδου εισαγωγής QObject Cannot start external program Δεν είναι δυνατή η έναÏξη εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματος Cannot start external program! %1 Δεν είναι δυνατή η έναÏξη εξωτεÏÎ¹ÎºÎ¿Ï Ï€ÏογÏάμματος! %1 Error Σφάλμα QTextControl &Undo &ΑναίÏεση &Redo Επανα&φοÏά Cu&t &Αποκοπή &Copy &ΑντιγÏαφή &Paste &Επικόλληση Delete ΔιαγÏαφή Select All Επιλογή Όλων Copy &Link Location ΑντιγÏαφή &διεÏθυνσης Î´ÎµÏƒÎ¼Î¿Ï QWizard Cancel ΆκυÏο < &Back < &Πίσω &Finish &ΟλοκλήÏωση &Next > &Επόμενο > RSSDetectionWidget Untitled feed Ροή χωÏίς όνομα RequestFeed Server requires authentication! Ο διακομιστής απαιτεί ταυτοποίηση! Server replied: Not Found! Ο διακομιστής απάντησε: Δεν βÏέθηκε! Redirect error! Σφάλμα ανακατεÏθυνσης! Request timeout! Η σÏνδεση έληξε! SQLiteDriver Error opening database Σφάλμα ανοίγματος βάσης δεδομένων Error closing database Σφάλμα κλεισίματος βάσης δεδομένων Unable to begin transaction Αδυναμία εκκίνησης συναλλαγής Unable to commit transaction Αδυναμία ολοκλήÏωσης συναλλαγής Unable to rollback transaction Αδυναμία ακÏÏωσης συναλλαγής SQLiteResult Unable to fetch row Αδυναμία φόÏτωσης γÏαμμής No query Δεν υπάÏχει εÏώτημα Unable to execute statement Αδυναμία εκτέλεσης εÏωτήματος Unable to execute multiple statements at a time Αδυναμία εκτέλεσης πολλαπλών εÏωτημάτων Unable to reset statement Αδυναμία Î¼Î·Î´ÎµÎ½Î¹ÏƒÎ¼Î¿Ï ÎµÏωτήματος Unable to bind parameters Αδυναμία οÏÎ¹ÏƒÎ¼Î¿Ï Ï€Î±ÏαμέτÏων Parameter count mismatch Λάθος καταμέτÏηση παÏαμέτÏων SslErrorDialog SSL Certificate Error! Σφάλμα Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï SSL! Only for this session Μόνο για αυτήν τη συνεδÏία UpdateAppDialog Check for Updates Έλεγχος για ενημεÏώσεις Checking for updates... Έλεγχος για ενημεÏώσεις... Loading history... ΦόÏτωση ιστοÏικοÏ... Don't remind about this version Îα μην γίνει υπενθÏμιση για αυτή την έκδοση ξανά &Install &Εγκατάσταση You already have the latest version Έχετε την τελευταία έκδοση A new version of QuiteRSS is available! ΥπάÏχει μια νέα έκδοση του QuiteRSS! Click here to go to the download page Κάντε κλικ για να μεταβείτε στην σελίδα λήψεων Your version is: Η έκδοσή σας είναι: Current version is: Η Ï„Ïέχουσα έκδοση είναι: Error checking updates Σφάλμα ελέγχου για ενημεÏώσεις quiterss-0.18.3/lang/quiterss_en.ts000066400000000000000000005435411265173051100173310ustar00rootroot00000000000000 AboutDialog About Revision Version QuiteRSS is a open-source cross-platform RSS/Atom news reader Includes: Application directory: Resource directory: Data directory: Backup directory: Database file: Settings file: Log file: Authors History License Information AdBlockAddSubscriptionDialog Add Subscription Title: Address: Add new subscription to AdBlock: AdBlockCustomList Custom Rules AdBlockDialog AdBlock Configuration Enable AdBlock Search... Options AdBlock Use only essential part of EasyList (for performance reasons) Add Rule Remove Rule Add Subscription Remove Subscription Update Subscriptions Learn about writing rules... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock Show AdBlock &Settings Disable on %1 Disable only on this page Blocked Popup Windows %1 with (%2) No content blocked Blocked URL (AdBlock Rule) - click to edit rule AdBlockManager EasyList AdBlockSubscription Cannot load subscription! AdBlockTreeWidget Add Rule Remove Rule Add Custom Rule Please write your rule here: %1 (recently updated) %1 (Error: %2) AddFeedWizard Add Feed Create New Feed Use title of the feed as displayed name Server requires authentication: Username: Password: Feed URL or website address: Feeds All Feeds New Folder... Displayed name: Location: URL error! Duplicate feed! Can't find feed URL! Request failed! AddFolderDialog Add Folder Feeds All Feeds Name: Location: AuthenticationDialog Save password Authorization required Server: Message: Username: Password: CategoriesTreeWidget Unread Starred Deleted Labels Open in New Tab Clear 'Deleted' Mark Read CleanUpWizard Clean Up Choose Feeds All Feeds Clean Up Options Maximum age of news in days to keep: Maximum number of news to keep: Delete read news Never delete unread news Never delete starred news Never delete labeled news Clean up 'Deleted' Purge DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Information Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash Hide object Add '%1' to whitelist CustomizeToolbarDialog Customize Main Toolbar Customize Feeds Toolbar Customize News Toolbar Load images Separator Icon Text Text Beside Icon Text Under Icon Big Normal Small Style: Icon Size: Add Remove Move up Move down Default DownloadItem Remaining time unavailable Error: Cannot write to file! Error: few seconds seconds minutes hours Unknown size Unknown speed %2 - unknown size (%3) Remaining %1 - %2 of %3 (%4) Cancelled - %1 Delete file Do you want to also delete downloaded file? Open File Open Folder Copy Download Link Cancel Downloading Remove Cancelled Error Not found Sorry, the file %1 was not found! DownloadManager Clear File %1 (*.%2) All Files (*.*) Save As... Executable: Arguments: FeedPropertiesDialog Properties General Columns Authentication Status Title: Homepage: Feed URL: Load Title Load Favicon Select Icon... Select Icon Disable update Automatically update every seconds minutes hours Starred Load images Display in new tab on startup Show news' description instead of loading web page Automatically delete duplicate news Display Reading Enable JavaScript Right-to-left layout Ascending Descending Sort by: Add Remove Move up Move down Default Server requires authentication: Username: Password: Feeds count: Description: Status: Created: Last update: News count: Good Long ago ;-) new unread Image files Select Image Load icon: can't open a file! FilterRulesDialog Filter Rules Feeds All Feeds Filter name: Match all news Match all conditions Match any condition Perform these actions: Please enter name for the filter. Please enter search condition for the news filter. FindFeed Find Name Find Link FindTextContent Find in News Find in Titles Find in Authors Find in Categories Find in Descriptions Find in Links Find in Browser FtpDownloader Canceled! ItemAction Mark News as Read Add Star Delete Add Label Play a Sound Show News in Notifier Browse Play Add Action Delete Action Open File... ItemCondition Title Description Author Category State Link News New Read Starred Add Condition Delete Condition contains doesn't contains is isn't begins with ends with Regular expressions LabelDialog New Label Load icon... Default Select color... Name: Icon: Color text: Color background: Image files Select Image Load icon: can't open a file! MainApplication Saving data... MainWindow &AdBlock Hide Categories Show Categories Select OPML-File OPML-Files (*.%1 *.%2) Import canceled Import: can't open a file OPML-Files (*.%1) Export canceled Export: can't open a file Unread: %1 All: %1 (Browser) New News: %1 Unread News: %1 &Add Add New Feed &Feed... F&older... Add New Folder Open in New Tab &Delete... Delete Selected Feed &Import Feeds... Import Feeds from OPML File &Export Feeds... Export Feeds to OPML File E&xit Update Feed Update Current Feed Update All Update All Feeds Mark All Feeds Read Mark Read/Unread Mark Current News Read/Unread Mark All News Read Downloads Clean Up... News Filters... Filter News... Options... Open Options Dialog Filter Feeds Show All Show New Show Unread Show Starred Feeds Show Not Working Feeds Filter News Show Starred Show Not Starred Show Unread or Starred Show Last Day Show Last 7 Days About... Show 'About' Dialog Check for Updates... Report a Problem... Open News Open in Browser Open in External Browser Open News in External Browser Open News in New Tab Open in Background Tab Open News in Background Tab Star Mark News Star Delete Delete Selected News Delete All News Delete All News from List Restore Restore News Copy Link Restore last deleted news Mark Read Mark Feed Read Properties &File Count Unread News Count All News Last Update Reset browser zoom Print Web Page Preview Web Page Save page in database Save page in database instead of news description Confirm Delete Are you sure to delete selected elements? Menu Add Feed... &Create Backup... S&how Menu Bar Stop Update Feeds Open News Description Copy News Link &View Fee&ds &News &Browser &Tools &Help Main Toolbar Customize Toolbar Main Toolbar... Customize Toolbar... Feeds Toolbar... News Toolbar... Lock Toolbar Hide Toolbar Layout Classic Newspaper Application Style System System2 Green Orange Purple Pink Gray Browser Position Top Bottom Right Left Show Window Previous Feed Next Feed Previous News Next News News Page Up News Page Down Next Unread News Previous Unread News Switch Focus to Next Panel Switch Focus to Next Panel (Tree Feeds, List News, Browser) Switch Focus to Previous Panel Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Show/Hide Tree Feeds Minimize to Tray Minimize Application to Tray Columns Show Indentation Search Feed Zoom Zoom In Zoom in in browser Zoom Out Zoom out in browser 100% Print... Print Preview... Page up (Browser) Page down (Browser) Save As... Save Page As... Show/Hide Feeds Toolbar News Toolbar Browser Toolbar Panel Categories Status Bar Full Screen Stay On Top Categories Label Show labels menu Close Tab Close Other Tabs Close All Tabs Switch to next tab Switch to previous tab Unread Starred Deleted Labels Decrease news list/increase browser Increase news list/decrease browser Find Open Homepage Feed Sort by Name Collapse All Folders Expand All Folders Next Folder Previous Folder Expand Folder Setting Page: Labels Share Sort By Ascending Descending Check for updates A new version of QuiteRSS... Loading... Web Page Save As HTML-Files (*.%1) Text files (*.%2) Save As: can't open a file Choose Directory Important Work Personal To Do Later Amusingly NetworkManager SSL Certificate Error! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Domain Name: </b> <b>Expiration Date: </b> <b>Error: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters Feeds Filter Name New... Edit... Delete... Move up Move down Run Filter Delete Filter Are you sure you want to delete the filter '%1'? NewsHeader Icon Feed Title Published Received Author Category Read Star Label Feed Title Link NewsItem Mark Read/Unread Delete News NewsTabWidget Loading... (%p%) Home Open Page in External Browser Open Link in External Browser Open Link Open in New Tab Save Link... Save Image... Copy Link Copy Go Back Go Forward Stop Reload Copy Image Copy Image Address Load Images Auto Load Images to News View No Load Images No Load Images to News View Close Tab Auto Load Images in News View Don't Load Images Don't Load Images in News View Comments Author: %1 audio video media Link to Mark Read/Unread Mark News Star Label Share Open News in External Browser Delete NotificationWidget Close Mark All News Read Previous Page Next Page Incoming News: %1 Page %1 of %2 OptionsDialog Options General System Tray Network Connections Browser Feeds Labels Notifications Passwords Language Fonts & Colors Keyboard Shortcuts Warning: key is already assigned to Show splash screen on startup Reopen last opened feeds on startup Open new tab next to active Hide feeds tree when opening tabs Show default rss-icon instead of favourite one Automatically collapse folders Show close button on tab Automatically check for updates Help improve QuiteRSS by sending usage information Store a DB in memory (requires program restart) Save DB stored in memory to file every minutes Run QuiteRSS at Windows startup Show system tray icon starting QuiteRSS minimizing QuiteRSS closing QuiteRSS Show static icon Change icon for incoming new news Show count of new news Show count of unread news Single click instead of double click for show window Empty working set on minimize to tray Move to the system tray when: Tray icon behavior: Direct connection to the Internet System proxy configuration (if available) Manual proxy configuration: Proxy server: Port: Username: Password: Request timeout: Number of requests: Number of retries: Options network requests when updating feeds (requires program restart): Use embedded browser Use external browser Default external browser Following external browser: Browse... Load images Enable JavaScript Enable plug-ins Open links in embedded browser in background Open links in external browser in background (experimental) Default zoom on pages: Browser selection: External browser: Content: User style sheet: Maximum pages in cache Store cache in: Maximum size of disk cache MB Use disk cache Allow local data to be set Keep local data only until quit application Block sites from setting any data Clear Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Use Click to Flash Add... Remove... Ask where to save each file before downloading Download location: History Click to Flash Downloads Automatically update the feeds on startup Automatically update the feeds every seconds hours Nothing to do Dec December Display format for date: time: Alternating row background colors Simplified representation of date and time Show All Show New Show Unread Show Starred Show Not Starred Show Unread or Starred Show Last Day Show Last 7 Days Style sheet for news: Mark news as read: on selecting. With timeout after switching to another news Mark displayed news as read when switching feeds Mark displayed news as read when closing tab Mark displayed news as read on minimize Change behavior of action 'Next Unread News' starred news labeled news Automatically mark identical news as read Prevent accidental deletion of: Enable cleanup on shutdown Maximum age of news in days to keep: Maximum number of news to keep: Delete read news Never delete unread news Never delete starred news Never delete labeled news Clean up 'Deleted' Enable DB optimization (slower shutdown) Reading Clean Up New... Edit... Delete... Move up Move down Show when inactive main window Screen Transparency Show titles feeds Show icon feed Show button 'Mark All News Read' Show button 'Mark Read/Unread' Show button 'Open in External Browser' Show button 'Delete News' Play sound for incoming new news Play Display notification for incoming news Top Left Top Right Bottom Left Bottom Right Review Position Show maximum of item on page notification Width list items pixels Close notification after Do not show notification in fullscreen mode Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Notification Sound Selection of feeds All Feeds Site User Password Delete Delete All Show Passwords Version Author Contact Choose language: Type Font Feeds list font News list font News title font News text font Notification font Change... Reset Feeds list color Feeds list background News list color News list background Focused news color Focused news background color Link color Title color Date color Author color News text color News title background News background Feed with new news Count of unread news in feeds tree Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view Text color of new news Show feeds tree toggle Clear new status when minimize to tray Set focus on the last opened news Set focus at the top of news list Set focus on the unread news Open the news Default news filter: Action on feed opening: Show news description instead of loading web page Text color of unread news Focused feed color Focused feed background color Standard Fixed Serif Sans Serif Cursive Fantasy Default font size Fixed font size Minimum font size Minimum logical font size Font families: Font sizes: Fonts Fonts Browser Colors Filter Action Description Shortcut Shortcut: Open File... Select Style Sheet File Open Directory... Add site to whitelist Site without 'http://' (ex. youtube.com) QAbstractSpinBox &Step up Step &down &Select All QDialogButtonBox Close Cancel &Yes &No QFtp Not connected Host %1 not found Connection refused to host %1 Connection timed out to host %1 Connected to host %1 Connection refused for data connection Unknown error Connecting to host failed: %1 Login failed: %1 Listing directory failed: %1 Changing directory failed: %1 Downloading file failed: %1 Uploading file failed: %1 Removing file failed: %1 Creating directory failed: %1 Removing directory failed: %1 Connection closed QLineEdit &Undo &Redo Cu&t &Copy &Paste Delete Select All QMultiInputContext Select IM QObject Cannot start external program Cannot start external program! %1 Error QTextControl &Undo &Redo Cu&t &Copy &Paste Delete Select All Copy &Link Location QWizard Cancel < &Back &Finish &Next > RSSDetectionWidget Untitled feed RequestFeed Server requires authentication! Server replied: Not Found! Redirect error! Request timeout! SQLiteDriver Error opening database Error closing database Unable to begin transaction Unable to commit transaction Unable to rollback transaction SQLiteResult Unable to fetch row No query Unable to execute statement Unable to execute multiple statements at a time Unable to reset statement Unable to bind parameters Parameter count mismatch SslErrorDialog SSL Certificate Error! Only for this session UpdateAppDialog Check for Updates Checking for updates... Loading history... Don't remind about this version &Install You already have the latest version A new version of QuiteRSS is available! Click here to go to the download page Your version is: Current version is: Error checking updates quiterss-0.18.3/lang/quiterss_es.ts000066400000000000000000005513701265173051100173350ustar00rootroot00000000000000 AboutDialog About Acerca de Revision Revisión Version Versión QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS es un lector de noticias RSS/Atom de código abierto multi-plataforma Includes: Incluye: Application directory: Directorio de la aplicación: Resource directory: Directorio de recursos: Data directory: Directorio de datos: Backup directory: Directorio de respaldo: Database file: Archivo de la base de datos: Settings file: Configuración de archivos: Log file: Archivo de registro: Authors Autores History Historia License Licencia Information Información AdBlockAddSubscriptionDialog Add Subscription Añadir subscripción Title: Título: Address: Dirección: Add new subscription to AdBlock: Añadir subscripción a AdBlock: AdBlockCustomList Custom Rules Reglas personalizadas AdBlockDialog AdBlock Configuration Configuración de AdBlock Enable AdBlock Activar AdBlock Search... Buscar... Options Opciones AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Utilicar sólo una parte esencial de EasyList (por razones de rendimiento) Add Rule Añadir regla Remove Rule Eliminar regla Add Subscription Añadir subscripción Remove Subscription Eliminar subscripción Update Subscriptions Actualizar subscripciones Learn about writing rules... Aprender acerca de la escritura de reglas... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock le permite bloquear los contenidos no deseados en las páginas web AdBlock AdBlock Show AdBlock &Settings Mostrar &Configuraciones de Adblock Disable on %1 Deshabilitar en %1 Disable only on this page Deshabilitar sólo en esta página Blocked Popup Windows Bloquear ventanas flotantes %1 with (%2) %1 con (%2) No content blocked No hay contenido bloqueado Blocked URL (AdBlock Rule) - click to edit rule URL Bloqueada (Regla de Adblock) - Clic para editar regla AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! ¡No se pudo leer la subscripción! AdBlockTreeWidget Add Rule Añadir regla Remove Rule Eliminar regla Add Custom Rule Añadir regla personalizada Please write your rule here: Por favor escriba su regla aquí: %1 (recently updated) %1 (actualizado recientemente) %1 (Error: %2) %1 (Error: %2) AddFeedWizard Add Feed Agregar canal Create New Feed Crear nuevo canal Use title of the feed as displayed name Usar el título de la fuente como nombre para mostrar Server requires authentication: El servidor requiere autenticación: Username: Usuario: Password: Contraseña: Feed URL or website address: URL del canal o dirección web: Feeds Canales All Feeds Todos los canales New Folder... Nueva carpeta... Displayed name: Nombre para mostrar: Location: Dirección: URL error! ¡URL inválida! Duplicate feed! ¡Canal duplicado! Can't find feed URL! ¡No se puede encontrar la URL del canal! Request failed! ¡La petición fallo! AddFolderDialog Add Folder Agregar carpeta Feeds Canales All Feeds Todos los canales Name: Nombre: Location: Dirección: AuthenticationDialog Save password Guardar contraseña Authorization required Autorización requerida Server: Servidor: Message: Mensaje: Username: Usuario: Password: Contraseña: CategoriesTreeWidget Unread Sin leer Starred Destacados Deleted Eliminado Labels Etiquetas Open in New Tab Abrir en una nueva pestaña Clear 'Deleted' Limpiar 'Eliminados' Mark Read CleanUpWizard Clean Up Limpiar Choose Feeds Seleccionar Canales All Feeds Todos los canales Clean Up Options Limpiar Opciones Maximum age of news in days to keep: Numero máximo de días a mantener las noticias: Maximum number of news to keep: Numero máximo de noticias a conservar: Delete read news Eliminar noticias leidas Never delete unread news Nunca eliminar noticias sin leer Never delete starred news Nunca eliminar noticias destacadas Never delete labeled news Nunca eliminar noticias etiquetadas Clean up 'Deleted' Limpiar 'Eliminados' Purge DB Purgar Base de Datos Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Remover completamente registros marcados como 'Eliminados' Noticias antiguas podrían reaparecer. Information Información Clean Up wizard deleted %1 news El asistente de limpieza elimino %1 noticias ClickToFlash Object blocked by ClickToFlash Objeto bloqueado por ClickToFlash Hide object Ocultar objeto Add '%1' to whitelist Agregar '%1' como confiable CustomizeToolbarDialog Customize Main Toolbar Personalizar barra principal Customize Feeds Toolbar Personalizar barra de canales Customize News Toolbar Personalizar barra de noticias Load images Cargar imágenes Separator Separador Icon Icono Text Texto Text Beside Icon Texto junto al icono Text Under Icon Texto bajo el icono Big Grande Normal Normal Small Pequeño Style: Estilo: Icon Size: Tamaño de los iconos: Add Agregar Remove Eliminar Move up Mover arriba Move down Mover abajo Default Por defecto DownloadItem Remaining time unavailable Tiempo restante no disponible Error: Cannot write to file! Error: ¡No se puede escribir el archivo! Error: Error: few seconds Algunos segundos seconds segundos minutes minutos hours horas Unknown size Tamaño desconocido Unknown speed Velocidad desconocida %2 - unknown size (%3) %2 - Tamaño desconocido (%3) Remaining %1 - %2 of %3 (%4) Faltan %1 - %2 de %3 (%4) Cancelled - %1 Cancelado - %1 Delete file Eliminar archivo Do you want to also delete downloaded file? Open File Abrir archivo Open Folder Abrir carpeta Copy Download Link Copiar link de descarga Cancel Downloading Cancelar Descarga Remove Eliminar Cancelled Cancelado Error Error Not found No encontrado Sorry, the file %1 was not found! Disculpa, el archivo %1 no se pudo encontrar DownloadManager Clear Limpiar File %1 (*.%2) Archivo %1 (*.%2) All Files (*.*) Todos los archivos (*.*) Save As... Guardar como... Executable: Ejecutable: Arguments: Argumentos: FeedPropertiesDialog Properties Propiedades General General Columns Columnas Authentication Autenticación Status Estado Title: Título: Homepage: Página de inicio: Feed URL: URL del canal: Load Title Cargar Tabla Load Favicon Cargar Favicon Select Icon... Seleccionar icono... Select Icon Seleccionar icono Disable update Apagar actualizaciones Automatically update every Actualizar automáticamente cada seconds segundos minutes minutos hours horas Starred Destacados Load images Cargar imágenes Display in new tab on startup Mostrar canal en una nueva pestaña al iniciar Show news' description instead of loading web page Mostrar descripción de las noticias en lugar de la página web Automatically delete duplicate news Eliminar noticias duplicadas de forma automática Display Mostrar Reading Enable JavaScript Activar JavaScript Right-to-left layout Disposición de derecha a izquierda Ascending Ascendente Descending Descendente Sort by: Ordenar por: Add Agregar Remove Eliminar Move up Mover arriba Move down Mover abajo Default Por defecto Server requires authentication: ¡El servidor requiere contraseña! Username: Usuario: Password: Contraseña: Feeds count: Description: Descripción: Status: Estado: Created: Creado: Last update: última actualización: News count: Número de noticias: Good Bueno Long ago ;-) Antiguo ;-) new nuevo unread sin leer Image files Archivos de imagen Select Image Seleccionar Imagen Load icon: can't open a file! Cargar icono: ¡No puede abrir el archivo! FilterRulesDialog Filter Rules Reglas de filtrado Feeds Canales All Feeds Todos los canales Filter name: Filtrar nombre: Match all news Coincidir todas las noticias Match all conditions Coincidir con todas las condiciones Match any condition Coincidir cualquier condición Perform these actions: Llevar a cabo las siguientes acciones: Please enter name for the filter. Por favor ingrese el nombre del filtro. Please enter search condition for the news filter. Por favor ingrese la condición para filtrar. FindFeed Find Name Buscar nombre Find Link Buscar enlace FindTextContent Find in News Buscar en noticias Find in Titles Buscar por títulos Find in Authors Buscar por autores Find in Categories Buscar por categorías Find in Descriptions Find in Links Buscar en Enlaces Find in Browser Buscar en el explorador FtpDownloader Canceled! ¡Cancelado! ItemAction Mark News as Read Marcar noticias como leídas Add Star Destacar Delete Eliminar Add Label Agregar etiqueta Play a Sound Reproducir un sonido Show News in Notifier Mostrar Noticias en la notificación Browse Explorar Play Reproducir Add Action Agregar acción Delete Action Eliminar acción Open File... Abrir Archivo... ItemCondition Title Título Description Descripción Author Autor Category Categoría State Estado Link Enlace News New Nuevo Read Leído Starred Destacado Add Condition Agregar condición Delete Condition Eliminar condición contains Contiene doesn't contains No contiene is es isn't no es begins with comienza con ends with termina con Regular expressions Expresiones regulares LabelDialog New Label Nueva etiqueta Load icon... Cargar icono... Default Por defecto Select color... Seleccionar color... Name: Nombre: Icon: Icono: Color text: Color del texto: Color background: Color del fondo: Image files Archivos de imagen Select Image Seleccionar imagen Load icon: can't open a file! Cargar icono: ¡no puede abrir el archivo! MainApplication Saving data... Guardando Datos... MainWindow &AdBlock &Adblock Hide Categories Ocultar Categorías Show Categories Mostrar categorías Select OPML-File Seleccionar archivo OPML OPML-Files (*.%1 *.%2) Archivos OPML (*.%1 *.%2) Import canceled Importación cancelada Import: can't open a file Importar: no se puede abrir el archivo OPML-Files (*.%1) Archivos OPML (*.%1) Export canceled Exportar Cancelado Export: can't open a file Exportar: no se puede abrir el archivo Unread: %1 Actualizado: %1 All: %1 Todos: %1 (Browser) (Navegador) New News: %1 Noticias nuevas: %1 Unread News: %1 Noticias sin leer: %1 &Add Agregar Add New Feed Agregar Nuevo Canal &Feed... Canal... F&older... Carpeta... Add New Folder Agregar Nueva Carpeta Open in New Tab Abrir en nueva pestaña &Delete... &Eliminar Delete Selected Feed Eliminar canales seleccionados &Import Feeds... &importar canales... Import Feeds from OPML File Importar canales desde archivo OPML &Export Feeds... &Exportar canales... Export Feeds to OPML File Exportar canales en archivo OPML E&xit &Salir Update Feed Actualizar canal Update Current Feed Actualizar canal actual Update All Actualizar todo Update All Feeds Actualizar todos los canales Mark All Feeds Read Marcar todos los canales como leídos Mark Read/Unread Marcar como Leído/No Leído Mark Current News Read/Unread Marcar noticias como leídas/nuevas Mark All News Read Marcar todas las noticias como leídas Downloads Descargas Clean Up... Limpiar... News Filters... Filtros de noticias... Filter News... Filtrar noticias... Options... Opciones... Open Options Dialog Abrir diálogo de opciones Filter Feeds Filtrar noticias Show All Mostrar todos Show New Mostrar nuevos Show Unread Mostrar no leídos Show Starred Feeds Mostrar destacados Show Not Working Feeds Mostrar fuentes que no funcionan Filter News Filtrar noticias Show Starred Mostrar destacados Show Not Starred Mostrar no destacados Show Unread or Starred Mostrar destacados o sin leer Show Last Day Mostrar el último día Show Last 7 Days Mostrar los 7 últimos días About... Acerca de... Show 'About' Dialog Mostrar diálogo de información Check for Updates... Buscar actualizaciones... Report a Problem... Reportar problema... Open News Noticias abiertas Open in Browser Abrir en el explorador Open in External Browser Abrir en explorador externo Open News in External Browser Abrir las noticias en el explorador externo Open News in New Tab Abrir noticias en una nueva pestaña Open in Background Tab Abrir en una pestaña secundaria Open News in Background Tab Abrir noticias en una pestaña secundaria Star Destacado Mark News Star Marcar noticias como destacadas Delete Eliminar Delete Selected News Eliminar noticias seleccionadas Delete All News Eliminar todas las noticias Delete All News from List Eliminar todas las noticias de la lista Restore Restaurar Restore News Restaurar noticias Copy Link Copiar enlace Restore last deleted news Restaurar últimas noticias eliminadas Mark Read Marcar como leído Mark Feed Read Marcar canal como leído Properties Propiedades &File &Archivo Count Unread News Contar noticias sin leer Count All News Contar todas las noticias Last Update Última actualización Reset browser zoom Reiniciar zoom del navegador Print Web Page Imprimir página web Preview Web Page Previsualizar página web Save page in database Guardar página en base de datos Save page in database instead of news description Guardar la página en la base de datos en lugar de la descripción de las noticias Confirm Delete Confirmar borrado Are you sure to delete selected elements? ¿Está seguro de querer borrar elementos seleccionados? Menu Menú Add Feed... &Create Backup... &Crear respaldo... S&how Menu Bar Mostrar barra de menú Stop Update Feeds Open News Description Abrir descripción de las noticias Copy News Link Copiar enlace de las noticias &View &Ver Fee&ds &Canales &News &Noticias &Browser &Explorador &Tools &Herramientas &Help &Ayuda Main Toolbar Barra principal Customize Toolbar Personalizar barra de herramientas Main Toolbar... Barra principal... Customize Toolbar... Personalizar barra de herramientas... Feeds Toolbar... Barra de canales... News Toolbar... Barra de noticias... Lock Toolbar Bloquear barra de herramientas Hide Toolbar Esconder barra de herramientas Layout Plantilla Classic Clásica Newspaper Periódico Application Style Estilo de la aplicación System Sistema System2 Sistema2 Green Verde Orange Naranja Purple Púrpura Pink Rosado Gray Gris Browser Position Posición del explorador Top Arriba Bottom Abajo Right Derecha Left Izquierda Show Window Mostrar ventana Previous Feed Canal anterior Next Feed Siguiente canal Previous News Noticia anterior Next News Noticia siguiente News Page Up Página de Noticias Arriba News Page Down Página de Noticias Abajo Next Unread News Siguientes noticias sin leer Previous Unread News Anteriores noticias sin leer Switch Focus to Next Panel Cambiar enfoque al panel siguiente Switch Focus to Next Panel (Tree Feeds, List News, Browser) Cambiar enfoque al panel siguiente (Lista Canales, Lista Noticias, Explorador) Switch Focus to Previous Panel Cambiar enfoque al panel anterior Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Cambiar enfoque al panel anterior (Lista canales, lista noticias, explorador) Show/Hide Tree Feeds Mostrar/Ocultar lista canales Minimize to Tray Minimizar al área de notificación Minimize Application to Tray Minimizar aplicación al área de notificación Columns Columnas Show Indentation Mostrar sangría Search Feed Buscar canal Zoom Zoom Zoom In Zoom + Zoom in in browser Zoom + en el explorador Zoom Out Zoom - Zoom out in browser Zoom - en el explorador 100% 100% Print... Imprimir... Print Preview... Vista previa de impresión... Page up (Browser) Página arriba (Explorador) Page down (Browser) Página abajo (Explorador) Save As... Guardar como... Save Page As... Guardar página como... Show/Hide Mostrar/Ocultar Feeds Toolbar Barra de canales News Toolbar Barra de noticias Browser Toolbar Barra del explorador Panel Categories Panel de categorías Status Bar Barra de estado Full Screen Pantalla completa Stay On Top Siempre visible Categories Categorías Label Etiqueta Show labels menu Mostrar etiquetas en el menú Close Tab Cerrar pestaña Close Other Tabs Cerrar todas las demás pestañas Close All Tabs Cerrar todas las pestañas Switch to next tab Cambiar a la siguiente pestaña Switch to previous tab Cambiar a la anterior pestaña Unread Sin leer Starred Destacados Deleted Eliminado Labels Etiquetas Decrease news list/increase browser Minimizar lista de noticias/Maximizar explorador Increase news list/decrease browser Maximizar lista de noticias/Minimizar explorador Find Buscar Open Homepage Feed Abrir página principal Sort by Name Ordenar por Nombre Collapse All Folders Minimizar todas las carpetas Expand All Folders Desplegar todas las carpetas Next Folder Siguiente carpeta Previous Folder Anterior carpeta Expand Folder Expandir carpeta Setting Page: Labels Configuración de página: Etiquetas Share Compartir Sort By Ordenar por: Ascending Ascendente Descending Descendente Check for updates Actualizar A new version of QuiteRSS... Nueva versión de QuiteRSS... Loading... Cargando... Web Page Pagina web Save As Guardar como HTML-Files (*.%1) Archivos HTML (*.%1) Text files (*.%2) Archivos de texto (*.%2) Save As: can't open a file Guardar como: no puede abrir el archivo Choose Directory Elegir Directorio Important Importante Work Trabajo Personal Personal To Do Por hacer Later Después Amusingly Gracioso NetworkManager SSL Certificate Error! ¡Error en el Certificado SSL! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Organization: </b> <b>Domain Name: </b> <b>Domain Name: </b> <b>Expiration Date: </b> <b>Expiration Date: </b> <b>Error: </b> <b>Error: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters Filtros de noticias Feeds Canales Filter Name Filtrar por nombre New... Nuevo... Edit... Editar... Delete... Eliminar... Move up Mover arriba Move down Mover abajo Run Filter Aplicar filtro Delete Filter Eliminar filtro Are you sure you want to delete the filter '%1'? ¿Está seguro de borrar el filtro '%1'? NewsHeader Icon Feed Icono del canal Title Título Published Publicado Received Recibido Author Autor Category Categoría Read Leído Star Destacado Label Etiqueta Feed Title Título de la fuente Link Enlace NewsItem Mark Read/Unread Marcar leído/nuevo Delete News Borrar noticias NewsTabWidget Loading... (%p%) Cargando...(%p%) Home Inicio Open Page in External Browser Abrir en explorador externo Open Link in External Browser Abrir enlace en el explorador externo Open Link Abrir enlace Open in New Tab Abrir en una nueva pestaña Save Link... Guardar enlace... Save Image... Guardar imagen... Copy Link Copiar enlace Copy Copiar Go Back Ir atrás Go Forward Ir adelante Stop Detener Reload Recargar Copy Image Copiar imagen Copy Image Address Copiar dirección de la imagen Load Images Cargar Imágenes Auto Load Images to News View Cargar imágenes automáticamente al ver noticias No Load Images No cargar imagenes No Load Images to News View No cargar imágenes en la vista de noticias Close Tab Cerrar pestaña Auto Load Images in News View Auto cargar imágenes en el visor de noticias Don't Load Images No cargar imágenes Don't Load Images in News View No cargar imágenes automáticamente al abrir las noticias Comments Comentarios Author: %1 Autor: %1 audio audio video video media multimedia Link to Enlazar a Mark Read/Unread Marcar Leído/Nuevo Mark News Star Marcar noticias como destacadas Label Etiqueta Share Compartir Open News in External Browser Abrir las Noticias en el Explorador Externo Delete Eliminar NotificationWidget Close Cerrar Mark All News Read Marcar todas las noticias como leídas Previous Page Página anterior Next Page Página siguiente Incoming News: %1 Noticias entrantes: %1 Page %1 of %2 Página %1 de %2 OptionsDialog Options Opciones General General System Tray Ãrea de notificacion Network Connections Conexiones de red Browser Explorador Feeds Canales Labels Etiquetas Notifications Notificaciones Passwords Contraseñas Language Idioma Fonts & Colors Letra y colores Keyboard Shortcuts Atajos de teclado Warning: key is already assigned to Precaución: La llave ya esta asignada Show splash screen on startup Mostrar logo al iniciar Reopen last opened feeds on startup Reabrir los últimos canales vistos al iniciar Open new tab next to active Abrir una nueva pestaña contigua a la actual Hide feeds tree when opening tabs Ocultar árbol de canales cuando se abra una nueva pestaña Show default rss-icon instead of favourite one Mostrar icono rss normal en lugar del favicon Automatically collapse folders Contraer carpetas automáticamente Show close button on tab Mostrar botón de cierre en pestaña Automatically check for updates Buscar actualizaciones automáticamente Help improve QuiteRSS by sending usage information Ayude a mejorar QuiteRSS enviando la información de uso Store a DB in memory (requires program restart) Cargar la base de datos en memoria (requiere reiniciar el programa) Save DB stored in memory to file every Guardar DB almacenada en memoria a un archivo cada minutes minutos Run QuiteRSS at Windows startup Iniciar QuiteRSS al iniciar el sistema Show system tray icon Mostrar icono en el área de notificación starting QuiteRSS Al iniciar QuiteRSS minimizing QuiteRSS Al minimizar QuiteRSS closing QuiteRSS Al cerrar QuiteRSS Show static icon Mostrar icono fijo Change icon for incoming new news Cambiar el icono al encontrar nuevas noticias Show count of new news Mostrar el número de noticias nuevas Show count of unread news Mostrar el número de elementos sin leer Single click instead of double click for show window Un solo click en lugar de dos para mostrar la ventana principal Empty working set on minimize to tray Limpiar set de trabajo al minimizar al área de notificación Move to the system tray when: Mover al área de notificación: Tray icon behavior: Comportamiento del icono en el área de notificación: Direct connection to the Internet Conexión directa a Internet System proxy configuration (if available) Usar configuración de proxy del sistema (si esta disponible) Manual proxy configuration: Configuración manual de proxy: Proxy server: Servidor Proxy: Port: Puerto: Username: Usuario: Password: Contraseña: Request timeout: Tiempo de espera: Number of requests: Número de solicitudes Number of retries: Número de reintentos Options network requests when updating feeds (requires program restart): Opciones peticiones de red cuando se actualicen las fuentes (requiere reiniciar QuiteRSS ) Use embedded browser Usar explorador interno Use external browser Usar explorador externo Default external browser Explorador externo por defecto Following external browser: Este explorador externo: Browse... Buscar... Load images Cargar imágenes Enable JavaScript Permitir JavaScript Enable plug-ins Permitir plug-ins Open links in embedded browser in background Abrir enlaces en el explorador interno en segundo plano Open links in external browser in background (experimental) Abrir enlaces en el explorador en segundo plano (experimental) Default zoom on pages: Zoom por defecto en las páginas Browser selection: Selección de explorador: External browser: Explorador externo: Content: Contenido: User style sheet: Hoja de estilo del usuario: Maximum pages in cache Número máximo de páginas en cache: Store cache in: Guardar cache en: Maximum size of disk cache Tamaño máximo de cache en disco MB MB Use disk cache Usar cache en disco Allow local data to be set Permitir que se establezcan datos locales Keep local data only until quit application Mantener datos locales unicamente hasta que se cierre la aplicacion Block sites from setting any data No permitir que los sitios establescan ningun dato Clear Limpiar Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash es un complemento para que se auto cargue contenido FLASH en la pagina. Una vez bloqueado siempre puedes cargarlo manualmente haciendo click en el icono. Use Click to Flash Usar Click To Flash Add... Agregar... Remove... Eliminar... Ask where to save each file before downloading Preguntar dónde guardar antes de descargar Download location: Ubicación de descargas: History Historial Click to Flash Click To Flash Downloads Descargas Automatically update the feeds on startup Actualizar canales automáticamente al iniciar Automatically update the feeds every Actualizar canales automáticamente cada seconds segundos hours horas Nothing to do No hacer nada Dec Dic December Diciembre Display format for date: Formato de la fecha: time: Hora: Alternating row background colors Color de fondo alternado en las filas Simplified representation of date and time Presentación simplificada de fecha y hora Show All Mostrar todos Show New Mostrar Nuevos Show Unread Mostrar no leídos Show Starred Mostrar Destacados Show Not Starred Mostrar No Destacados Show Unread or Starred Mostrar destacados o sin leer Show Last Day Mostrar Noticias del ultimo día Show Last 7 Days Mostrar noticias de los ultimos 7 dias Style sheet for news: Hoja de estilo para las noticias Mark news as read: Marcar noticias como leídas. on selecting. With timeout Al seleccionar. Esperando after switching to another news Después de cambiar a otras noticias Mark displayed news as read when switching feeds Marcar noticias como leídas al cambiar de canal Mark displayed news as read when closing tab Marcar noticias como leídas al cerrar la pestaña Mark displayed news as read on minimize Marcar noticias como leídas al minimizar Change behavior of action 'Next Unread News' Cambiar el comportamiento de 'Siguientes noticias sin leer' starred news Noticias destacadas labeled news Notocias etiquetadas Automatically mark identical news as read Marcar automaticamente como leídas las noticias idénticas Prevent accidental deletion of: Prevenir eliminacion accidental de: Enable cleanup on shutdown Habilitar limpieza al apagar Maximum age of news in days to keep: Número máximo de días a mantener noticias: Maximum number of news to keep: Número máximo de noticias a conservar: Delete read news Eliminar noticias leídas Never delete unread news Nunca eliminar noticias sin leer Never delete starred news Nunca eliminar noticias destacadas Never delete labeled news Nunca eliminar noticias etiquetadas Clean up 'Deleted' Limpiar 'Eliminados' Enable DB optimization (slower shutdown) Habilitar la optimización de la BD (Apagado lento) Reading Leyendo Clean Up Limpieza New... Nuevo... Edit... Editar... Delete... Eliminar... Move up Mover arriba Move down Mover abajo Show when inactive main window Mostrar cuando este inactiva la pantalla principal Screen Pantalla Transparency Transparencia Show titles feeds Mostrar títulos de los canales Show icon feed Mostrar icono del canal Show button 'Mark All News Read' Mostrar botón "Marcar Todas Las Noticias Como Leidas" Show button 'Mark Read/Unread' Mostrar botón "Marcar Leído/Nuevo" Show button 'Open in External Browser' Mostrar botón "Abrir en explorador externo" Show button 'Delete News' Mostrar botón "Borrar noticias" Play sound for incoming new news Reproducir sonido al encontrar noticias nuevas Play Reproducir Display notification for incoming news Mostrar notificación para noticias nuevas Top Left Superior izquierda Top Right Superior derecha Bottom Left Inferior izquierda Bottom Right Inferior derecha Review Revisión Position Posición Show maximum of Mostrar máximo item on page notification Artículo en la página de notificación Width list items Elementos de la lista pixels pixels Close notification after Cerrar notificación después de Do not show notification in fullscreen mode No mostrar notificaciones en modo Pantalla Completa Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Sólo mostrar para los canales seleccionados: Notification Notificación Sound Sonido Selection of feeds Selección de canales All Feeds Todos los canales Site Sitio User Usuario Password Contraseña Delete Eliminar Delete All Eliminar todo Show Passwords Mostrar contraseñas Version Versión Author Autor Contact Contacto Choose language: Seleccionar lenguaje: Type Tipo Font Fuente Feeds list font Fuente de la lista de canales News list font Fuente de la lista de noticias News title font Fuente de la lista de noticias News text font Fuente de la lista de noticias Notification font Fuente de las notificaciónes Change... Cambiar... Reset Reiniciar Feeds list color Color de la lista de feeds Feeds list background Color del fondo de la lista de canales News list color Color de la lista de noticias News list background Color del fondo de la lista de noticias Focused news color Color de noticia seleccionada Focused news background color Color de fondo de noticia seleccionada Link color Color de enlaces Title color Color de título Date color Color de fecha Author color Color del autor News text color Color de texto en las noticias News title background Color del fondo del título de las noticias News background Fondo de las noticias Feed with new news Canales con noticias nuevas Count of unread news in feeds tree Contar noticias sin leer en el árbol de fuentes Disabled feed Canales deshabilitados Alternating row colors Alternar color en las filas Notification text color Color del texto en las notificaciones Notification background color Color del fondo en las notificaciones Auto load images in news view Cargar imágenes automáticamente al abrir las noticias Text color of new news Color de texto de las noticias nuevas Show feeds tree toggle Mostrar árbol de canales al borde de la ventana Clear new status when minimize to tray Reiniciar elementos nuevos al minimizar al área de notificación Set focus on the last opened news Posicionarse en las ultimas noticias vistas Set focus at the top of news list Posicionarse en el inicio de la lista de noticias Set focus on the unread news Posicionarse el las noticias sin leer Open the news Abrir las noticias Default news filter: Filtro de noticias principal: Action on feed opening: Acción al abrir un canal: Show news description instead of loading web page Mostrar descripción de las noticias en lugar de cargar web Text color of unread news Color de texto en las noticias sin leer Focused feed color Color Canal seleccionado Focused feed background color Color de fondo canal seleccionado Standard Estandar Fixed Fijado Serif Serif Sans Serif Sans Serif Cursive Cursiva Fantasy Fantasia Default font size Fuente con tamaño por defecto Fixed font size Tamaño de fuente ajustado Minimum font size Tamaño minimo de fuente Minimum logical font size Tamaño mínimo logico de fuente Font families: Familia de fuentes: Font sizes: Tamaños de fuente: Fonts Fuentes Fonts Browser Explorador de fuentes: Colors Colores Filter Filtro Action Acción Description Descripción Shortcut Atajo Shortcut: Atajo Open File... Abrir archivo... Select Style Sheet File Seleccionar hoja de estilo Open Directory... Abrir direcctorio... Add site to whitelist Agregar sitio como confiable Site without 'http://' (ex. youtube.com) Sitio sin 'http://' ejem. (www.youtube.com ) QAbstractSpinBox &Step up &Paso arriba Step &down Paso &abajo &Select All &Seleccionar todo QDialogButtonBox Close Cerrar Cancel Cancelar &Yes &Sí &No &No QFtp Not connected No connectado Host %1 not found Servidor %1 no encontrado Connection refused to host %1 Conexión rechazada desde el servidor %1 Connection timed out to host %1 Expiro el tiempo al conectar a %1 Connected to host %1 Conectado al servidor %1 Connection refused for data connection Conexion reusada para datos Unknown error Error desconocido Connecting to host failed: %1 A fallado la conexion al servidor: %1 Login failed: %1 A fallado la autenticación: %1 Listing directory failed: %1 A fallado el listar directorio: %1 Changing directory failed: %1 Cambiar directorio a fallado: %1 Downloading file failed: %1 Descargar archivo a fallado: %1 Uploading file failed: %1 Cargar archicho a fallado: %1 Removing file failed: %1 Eliminar archivo a fallado: %1 Creating directory failed: %1 Crear directorio a fallado: %1 Removing directory failed: %1 Eliminar directorio a fallado: %1 Connection closed Conexion cerrada QLineEdit &Undo &Deshacer &Redo &Rehacer Cu&t &Cortar &Copy &Copiar &Paste &Pegar Delete Eliminar Select All Seleccionar todo QMultiInputContext Select IM Seleccionar IM QObject Cannot start external program No se puede iniciar programa externo Cannot start external program! %1 No se puede iniciar programa externo %1 Error Error QTextControl &Undo &Deshacer &Redo &Rehacer Cu&t &Cortar &Copy &Copiar &Paste &Pegar Delete Eliminar Select All Seleccionar todo Copy &Link Location Copiar &enlace QWizard Cancel Cancelar < &Back <&Atras &Finish &Finalizar &Next > &Siguiente> RSSDetectionWidget Untitled feed Fuente sin título RequestFeed Server requires authentication! ¡El servidor requiere autenticación! Server replied: Not Found! El servidor respondió: ¡No encontrado! Redirect error! ¡Error de redirección! Request timeout! ¡La petición expiró! SQLiteDriver Error opening database Error al abrir la base de datos Error closing database Error al cerrar la base de datos Unable to begin transaction No se pudo comenzar la transacción Unable to commit transaction No se pudo realizar la transacción Unable to rollback transaction No se pudo deshacer la transacción SQLiteResult Unable to fetch row No se puedo obtener la lista No query No preguntar Unable to execute statement No es posible ejecutar el estado Unable to execute multiple statements at a time No se puede ejecutar varias instrucciones a la vez Unable to reset statement No es posible restablecer el estado Unable to bind parameters No se puede enlazar parámetros Parameter count mismatch Recuento de parámetros desajustado SslErrorDialog SSL Certificate Error! ¡Error en el Certificado SSL! Only for this session UpdateAppDialog Check for Updates Buscar actualizaciones Checking for updates... Buscando actualizaciones... Loading history... Cargando historial... Don't remind about this version No informar acerca de esta versión &Install Instalar You already have the latest version Ya tienes la última versión A new version of QuiteRSS is available! ¡Una nueva versión de QuiteRSS está disponible! Click here to go to the download page Click aquí para ir a la página de descarga Your version is: Tu versión es: Current version is: La última versión es: Error checking updates Error al buscar actualizaciones quiterss-0.18.3/lang/quiterss_fa.ts000066400000000000000000005673451265173051100173250ustar00rootroot00000000000000 AboutDialog About درباره Revision ویرایش Version نسخه QuiteRSS is a open-source cross-platform RSS/Atom news reader کوآیت آر Ø§ÙØ³ Ø§ÙØ³ یک برنامه متن باز خواننده اخبار آر Ø§ÙØ³ Ø§ÙØ³/اÙÛŒ تی لو اÙÙ… هست Includes: شامل: Application directory: پوشه برنامه: Resource directory: دایرکتوری منابع: Data directory: پوشه داده Backup directory: پوشه پشتیبان: Database file: ÙØ§ÛŒÙ„ پایگاه داده: Settings file: ÙØ§ÛŒÙ„ تنظیمات: Log file: ÙØ§ÛŒÙ„ وقایع: Authors برنامه نویسان History تاریخچه License مجوز Information اطلاعات AdBlockAddSubscriptionDialog Add Subscription Ø§ÙØ²ÙˆØ¯Ù† اشتراک Title: عنوان: Address: آدرس: Add new subscription to AdBlock: Ø§ÙØ²ÙˆØ¯Ù† اشتراک جدید به اَدبلاک: AdBlockCustomList Custom Rules دستورات دستی AdBlockDialog AdBlock Configuration پیکربندی اَدبلاک Enable AdBlock ÙØ¹Ø§Ù„سازی اَدبلاک Search... جستجو.. Options گزینه ها AdBlock اَدبلاک Use only essential part of EasyList (for performance reasons) Ùقط Ø§Ø³ØªÙØ§Ø¯Ù‡ از بخش ضروری EasyList (به علت کارایی بهتر) Add Rule Ø§ÙØ²ÙˆØ¯Ù† دستور Remove Rule حذ٠دستور Add Subscription Ø§ÙØ²ÙˆØ¯Ù† اشتراک Remove Subscription حذ٠اشتراک Update Subscriptions بروزرسانی اشتراک ها Learn about writing rules... آموزش بیشتر برای نوشتن دستور.. AdBlockIcon AdBlock lets you block unwanted content on web pages اَدبلاک به شما اجازه مسدوکردن محتوای ناخواسته ØµÙØ­Ø§Øª وب را میدهد AdBlock اَدبلاک Show AdBlock &Settings نمایش تنظبمات اَدبلاک& Disable on %1 ØºÛŒØ±ÙØ¹Ø§Ù„سازی در %1 Disable only on this page ØºÛŒØ±ÙØ¹Ø§Ù„ازی Ùقط در این ØµÙØ­Ù‡ Blocked Popup Windows پنجره پاپ آپ بسته شده %1 with (%2) %1 با (%2) No content blocked محتوایی مسدود نشده است Blocked URL (AdBlock Rule) - click to edit rule آدرس مسدود شده (دستور اَدبلاک) - برای ویرایش کلیک کنید AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! اشتراک را نمیتوان بارگیری کرد AdBlockTreeWidget Add Rule Ø§ÙØ²ÙˆØ¯Ù† دستور Remove Rule حذ٠دستور Add Custom Rule Ø§ÙØ²ÙˆØ¯Ù† دستور دستی Please write your rule here: دستور خود را اینجا بنویسید: %1 (recently updated) %1 (اخیرا بروز شده) %1 (Error: %2) %1 (خطا: %2) AddFeedWizard Add Feed Ø§ÙØ²ÙˆØ¯Ù† Ùید Create New Feed ایجاد Ùید جدید Use title of the feed as displayed name از عنوان Ùید بعنوان نام نمایش داده شده Ø§Ø³ØªÙØ§Ø¯Ù‡ Ú©Ù† Server requires authentication: سرور نیاز به مجوز دارد Username: نام کاربر: Password: رمزعبور: Feed URL or website address: آدرس Ùید یا آدرس وبسایت: Feeds Ùیدها All Feeds تمام Ùیدها New Folder... پوشه جدید... Displayed name: نام نمایش داده شده: Location: مکان: URL error! خطای آدرس! Duplicate feed! Ùید تکراری! Can't find feed URL! آدرس Ùید را نمیتوان ÛŒØ§ÙØª! Request failed! درخواست موÙÙ‚ نشد! AddFolderDialog Add Folder Ø§ÙØ²ÙˆØ¯Ù† پوشه Feeds Ùیدها All Feeds تمام Ùیدها Name: نام: Location: مکان: AuthenticationDialog Save password ذخیره رمزعبور Authorization required مجوز نیاز است Server: سرور: Message: پیام: Username: نام کاربر: Password: رمزعبور: CategoriesTreeWidget Unread خوانده نشده Starred ستاره دار Deleted حذ٠شده Labels برچسب ها Open in New Tab بازکردن در تب جدید Clear 'Deleted' پاکسازی 'حذ٠شده' Mark Read نشانه به خوانده شده CleanUpWizard Clean Up پاکسازی Choose Feeds Ùیدها را انتخاب کنید All Feeds تمام Ùیدها Clean Up Options گزینه های پاکسازی Maximum age of news in days to keep: حداکثر سن اخبار در روز برای Ø­ÙØ¸ کردن: Maximum number of news to keep: حداکثر تعداد اخبار برای Ø­ÙØ¸ کردن: Delete read news حذ٠اخبار خوانده شده Never delete unread news هرگز اخبار خوانده نشده را پاک Ù†Ú©Ù† Never delete starred news هرگز اخبار ستاره دار شده را پاک Ù†Ú©Ù† Never delete labeled news هرگز برچسب اخبار را حذ٠نکن Clean up 'Deleted' پاکسازی 'حذ٠شده' Purge DB تهی کردن پایگاه داده Totally remove records that had marked 'deleted' from DB. Ancient news could reappear حذ٠کلی رکوردهایی Ú©Ù‡ در پایگاه داده بعنوان 'حذ٠شده' نشانه گذاری شده است ممکن است اخبار قدیمی مجددا ظاهر شود Information اطلاعات Clean Up wizard deleted %1 news ویزارد پاکسازی اخبار %1 را حذ٠کرد ClickToFlash Object blocked by ClickToFlash Ø´ÛŒ توسط کلیک در Ùلش مسدود شده است Hide object مخÙÛŒ کردن Ø´ÛŒ Add '%1' to whitelist Ø§ÙØ²ÙˆØ¯Ù† '%1' به لیست سÙید CustomizeToolbarDialog Customize Main Toolbar Ø³ÙØ§Ø±Ø´ÛŒ کردن نوارابزار اصلی Customize Feeds Toolbar Ø³ÙØ§Ø±Ø´ÛŒ کردن نوارابزار Ùیدها Customize News Toolbar Ø³ÙØ§Ø±Ø´ÛŒ کردن نوارابزار اخبار Load images بارگیری عکس ها Separator جداساز Icon آیکون Text متن Text Beside Icon متن درکنار آیکون Text Under Icon متن زیر آیکون Big بزرگ Normal عادی Small Ú©ÙˆÚ†Ú© Style: حالت: Icon Size: اندازه آیکون: Add Ø§ÙØ²ÙˆØ¯Ù† Remove حذ٠Move up انتقال به بالا Move down انتقال به پایین Default پیش ÙØ±Ø¶ DownloadItem Remaining time unavailable زمان باقیمانده موجود نیست Error: Cannot write to file! خطا:نمیتوان در ÙØ§ÛŒÙ„ نوشت Error: خطا: few seconds چند ثانیه seconds ثانیه minutes دقيقه hours ساعت Unknown size حجم نامشخص Unknown speed سرعت نامشخص %2 - unknown size (%3) %2 - حجم نامشخص (%3) Remaining %1 - %2 of %3 (%4) باقیمانده %1 - %2 از %3 (%4) Cancelled - %1 لغو شده - %1 Delete file Ø­Ø°Ù ÙØ§ÛŒÙ„ Do you want to also delete downloaded file? آیا میخواهید ÙØ§ÛŒÙ„ دانلود شده را هم حذ٠کنید؟ Open File بازکردن ÙØ§ÛŒÙ„ Open Folder بازکردن پوشه Copy Download Link Ú©Ù¾ÛŒ لینک دانلود Cancel Downloading لغو دانلود Remove حذ٠Cancelled لغو شده Error خطا Not found ÛŒØ§ÙØª نشد Sorry, the file %1 was not found! Ù…ØªØ§Ø³ÙØ§Ù†Ù‡ ÙØ§ÛŒÙ„ %1 ÛŒØ§ÙØª نشد DownloadManager Clear پاکسازی File %1 (*.%2) ÙØ§ÛŒÙ„ %1 (*.%2) All Files (*.*) همه ÙØ§ÛŒÙ„ ها (*.*) Save As... ذخیره بعنوان... Executable: ÙØ§ÛŒÙ„ اجرای: Arguments: نشانوند: FeedPropertiesDialog Properties مشخصات General عمومی Columns ستون ها Authentication بررسی مجوز Status وضعيت Title: عنوان: Homepage: ØµÙØ­Ù‡ خانگی: Feed URL: آدرس Ùید: Load Title بارگیری عنوان Load Favicon بارگیری آیکون وبسایت Select Icon... انتخاب آیکون... Select Icon انتخاب آیکون Disable update ØºÛŒØ±ÙØ¹Ø§Ù„سازی بروزرسانی Automatically update every بروزرسانی خودکار هر seconds ثانیه minutes دقيقه hours ساعت Starred ستاره دار Load images بارگیری عکس ها Display in new tab on startup نمایش در تب جدید در Ø§ÙØ³ØªØ§Ø±Øª آپ Show news' description instead of loading web page نمایش توضیحات اخبار بجای بارگیری ØµÙØ­Ù‡ وب Automatically delete duplicate news حذ٠خودکار اخبار تکراری Display نمایش Reading خواندن Enable JavaScript ÙØ¹Ø§Ù„سازی جاوا اسکریپت Right-to-left layout چینش راست به Ú†Ù¾ Ascending صعودی Descending نزولی Sort by: مرتبسازی با: Add Ø§ÙØ²ÙˆØ¯Ù† Remove حذ٠Move up انتقال به بالا Move down انتقال به پایین Default پیش ÙØ±Ø¶ Server requires authentication: سرور نیاز به مجوز دارد Username: نام کاربر: Password: رمزعبور: Feeds count: تعداد Ùید: Description: توضيحات: Status: وضعيت: Created: ايجاد شده: Last update: آخرین بروزرسانی: News count: تعداد اخبار: Good خوب Long ago ;-) مدت ها پیش ;-) new جدید unread خوانده نشده Image files ÙØ§ÛŒÙ„ های عکس Select Image انتخاب عکس Load icon: can't open a file! بارگیری آیکون:ÙØ§ÛŒÙ„ را نمیتوان باز کرد FilterRulesDialog Filter Rules دستورات Ùیلتر Feeds Ùیدها All Feeds تمام Ùیدها Filter name: نام Ùیلتر: Match all news تطابق همه اخبار Match all conditions تطابق همه شرط ها Match any condition تطابق هر شرطی Perform these actions: اجرای این عملکردها: Please enter name for the filter. Ù„Ø·ÙØ§ نام Ùیلتر را وارد کنید Please enter search condition for the news filter. Ù„Ø·ÙØ§ شرط جستجو برای Ùیلتر اخبار را وارد کنید FindFeed Find Name ÛŒØ§ÙØªÙ† نام Find Link ÛŒØ§ÙØªÙ† لینک FindTextContent Find in News ÛŒØ§ÙØªÙ† در اخبار Find in Titles ÛŒØ§ÙØªÙ† در عناوین Find in Authors ÛŒØ§ÙØªÙ† نویسنده ها: Find in Categories ÛŒØ§ÙØªÙ† در دسته ها Find in Descriptions ÛŒØ§ÙØªÙ† در توضیحات Find in Links ÛŒØ§ÙØªÙ† در لینک ها Find in Browser ÛŒØ§ÙØªÙ† در مرورگر FtpDownloader Canceled! لغو شده! ItemAction Mark News as Read نشانه اخبار بعنوان خوانده شده Add Star Ø§ÙØ²ÙˆØ¯Ù† ستاره Delete حذ٠Add Label Ø§ÙØ²ÙˆØ¯Ù† برچسب Play a Sound پخش یک صدا Show News in Notifier نمایش اخبار در اطلاع دهنده Browse جستج. Play پخش Add Action Ø§ÙØ²ÙˆØ¯Ù† اقدام Delete Action حذ٠اقدام Open File... بازکردن ÙØ§ÙŠÙ„.. ItemCondition Title عنوان Description توضيحات Author سازنده Category دسته State وضعیت Link لینک News اخبار New جدید Read خواندن Starred ستاره دار Add Condition Ø§ÙØ²ÙˆØ¯Ù† شرط Delete Condition حذ٠شرط contains شامل doesn't contains نیست شامل is است isn't نیست begins with آغاز Ù…ÛŒ شود با ends with پایان Ù…ÛŒ یابد با Regular expressions عبارات منظم LabelDialog New Label برچسب جدید Load icon... بارگیری آیکون... Default پیش ÙØ±Ø¶ Select color... انتخاب رنگ... Name: نام: Icon: آیکون: Color text: رنگ متن: Color background: رنگ پس زمینه: Image files ÙØ§ÛŒÙ„ عکس Select Image انتخاب عکس Load icon: can't open a file! بارگیری آیکون:ÙØ§ÛŒÙ„ را نمیتوان باز کرد MainApplication Saving data... ذخیره داده.. MainWindow &AdBlock اَدبلاک& Hide Categories مخÙÛŒ کردن دسته ها Show Categories نمایش دسته ها Select OPML-File ÙØ§ÛŒÙ„ اÙÙ¾ÛŒ اÙÙ… اÙÙ„ را انتخاب کنید OPML-Files (*.%1 *.%2) ÙØ§ÛŒÙ„ های ا٠پی اÙÙ… اÙÙ„ (*.%1 *.%2) Import canceled واردکردن:لغو شد Import: can't open a file واردکردن:ÙØ§ÛŒÙ„ را نمیتوان بازکرد OPML-Files (*.%1) ÙØ§ÛŒÙ„ های ا٠پی اÙÙ… اÙÙ„ (*.%1) Export canceled خروجیگیری لغو شد Export: can't open a file خروجیگیری:ÙØ§ÛŒÙ„ را نمیتوان بازکرد Unread: %1 خوانده نشده: %1 All: %1 همه: %1 (Browser) مرورگر New News: %1 اخبار جدید: %1 Unread News: %1 اخبار خوانده نشده: %1 &Add &Ø§ÙØ²ÙˆØ¯Ù† Add New Feed Ø§ÙØ²ÙˆØ¯Ù† Ùید جدید &Feed... &Ùید... F&older... &پوشه... Add New Folder Ø§ÙØ²ÙˆØ¯Ù† پوشه جدید Open in New Tab بازکردن در تب جدید &Delete... &حذÙ.. Delete Selected Feed حذ٠Ùید انتخاب شده &Import Feeds... واردکردن Ùیدها.. Import Feeds from OPML File واردکردن Ùید از ÙØ§ÛŒÙ„ اÙÙ¾ÛŒ اÙÙ… اÙÙ„ &Export Feeds... خروجیگیری Ùیدها.. Export Feeds to OPML File خروجیگیری Ùید به ÙØ§ÛŒÙ„ اÙÙ¾ÛŒ اÙÙ… اÙÙ„ E&xit Ø®&روج Update Feed بروزرسانی Ùید Update Current Feed بروزرسانی Ùید ÙØ¹Ù„ÛŒ Update All بروزرسانی همه Update All Feeds بروزرسانی همه Ùیدها Mark All Feeds Read نشانه همه Ùیدها بخوانده شده Mark Read/Unread نشانه خوانده/خوانده نشده Mark Current News Read/Unread نشانه اخبار ÙØ¹Ù„ÛŒ به خوانده/خوانده نشده Mark All News Read نشانه همه اخبار بخوانده شده Downloads دانلودها Clean Up... پاکسازی... News Filters... Ùیلتر اخبار... Filter News... Ùیلتر اخبار... Options... گزینه ها.. Open Options Dialog بازکردن پنجره گزینه ها Filter Feeds Ùیلتر Ùیدها Show All نمايش همه Show New نمایش جدید Show Unread نمایش خوانده نشده Show Starred Feeds نمایش Ùید ستاره دار Show Not Working Feeds نمایش Ùیدهایی Ú©Ù‡ کار نمیکند Filter News Ùیلتر اخبار Show Starred نمایش ستاره دار Show Not Starred نمایش بی ستاره ها Show Unread or Starred نمایش خوانده نشده یا ستاره دار Show Last Day نمایش روز گذشته Show Last 7 Days نمایش 7 روز گذشته About... درباره.. Show 'About' Dialog نمایش پنجره،درباره Check for Updates... بررسی برای بروزرسانی.. Report a Problem... گزارش یک مشکل... Open News بازکردن اخبار Open in Browser بازکردن در مرورگر Open in External Browser بازکردن در مرورگر خارجی Open News in External Browser بازکردن اخبار در مرورگر خارجی Open News in New Tab بازکردن اخبار در تب جدید Open in Background Tab بازکردن در تب پس زمینه Open News in Background Tab بازکردن اخبار در تب پس زمینه Star ستاره Mark News Star نشانه اخبار به ستاره Delete حذ٠Delete Selected News حذ٠اخبار انتخاب شده Delete All News حذ٠همه اخبار Delete All News from List حذ٠همه اخبار از لیست Restore بازگردانی Restore News بازگردانی اخبار Copy Link Ú©Ù¾ÛŒ لینک Restore last deleted news بازگردانی آخرین اخبار حذ٠شده Mark Read نشانه به خوانده شده Mark Feed Read نشانه Ùید به خوانده شده Properties مشخصات &File &ÙØ§ÛŒÙ„ Count Unread News تعداد اخبار خوانده نشده Count All News تعداد همه اخبار Last Update آخرین بروزرسانی Reset browser zoom ریست زوم مرورگر Print Web Page چاپ ØµÙØ­Ù‡ وب Preview Web Page پیشنمایش ØµÙØ­Ù‡ وب Save page in database ذخیره ØµÙØ­Ù‡ در پایگاه داد Save page in database instead of news description ذخیره ØµÙØ­Ù‡ در پایگاه داده بجای توضیحات اخبار Confirm Delete تایید حذ٠Are you sure to delete selected elements? آیا میخواهید عناصر انتخاب شده حذ٠شود؟ Menu منو Add Feed... Ø§ÙØ²ÙˆØ¯Ù† Ùید... &Create Backup... ایجاد &پشتیبان... S&how Menu Bar نمایش &نوار منو Stop Update Feeds توق٠بروزرسانی Ùیدها Open News Description بازکردن توضیحات اخبار Copy News Link Ú©Ù¾ÛŒ لینک اخبار &View &مشاهده Fee&ds Ùید&ها &News اخبار &Browser &مرورگر &Tools &ابزارها &Help &راهنما Main Toolbar نوارابزار اصلی Customize Toolbar Ø³ÙØ§Ø±Ø´ÛŒ کردن نوار ابزار Main Toolbar... نوارابزار اصلی... Customize Toolbar... Ø³ÙØ§Ø±Ø´ÛŒ کردن نوارابزار... Feeds Toolbar... نوارابزار Ùیدها... News Toolbar... نوارابزار جدید... Lock Toolbar Ù‚ÙÙ„ نوارابزار Hide Toolbar مخÙÛŒ کردن نوارابزار Layout چینش Classic قدیمی Newspaper روزنامه Application Style سبک برنامه System سيستم System2 سیستم2 Green سبز Orange نارنجی Purple ارغواني Pink صورتی Gray خاکستری Browser Position موقعیت مرورگر Top بالا Bottom پائين Right راست Left Ú†Ù¾ Show Window نمایش پنجره Previous Feed Ùید قبلی Next Feed Ùید بعدی Previous News اخبار قبلی Next News اخبار بعدی News Page Up اخبار به بالای ØµÙØ­Ù‡ News Page Down اخبار به پایین ØµÙØ­Ù‡ Next Unread News اخبار بعدی خوانده نشده Previous Unread News اخبار قبلی خوانده نشده Switch Focus to Next Panel تعویض کانون به پنل بعدی Switch Focus to Next Panel (Tree Feeds, List News, Browser) تعویض کانون به پنل بعدی (Ùیدهای درختی،مرورگر،لیست اخبار) Switch Focus to Previous Panel تعویض کانون به پنل قبلی Switch Focus to Previous Panel (Tree Feeds, Browser, List News) تعویض کانون به پنل قبلی (Ùیدهای درختی،مرورگر،لیست اخبار) Show/Hide Tree Feeds نمایش/عدم نمایش Ùیدهای درختی Minimize to Tray کمینه کنار ساعت Minimize Application to Tray کمینه برنامه کنارساعت Columns ستون ها Show Indentation نمایش ØªÙˆØ±ÙØªÚ¯ÛŒ Search Feed جستجوی Ùید Zoom زوم Zoom In بزرگنمایی Zoom in in browser بزرگنمایی در مرورگر Zoom Out کوچکنمایی Zoom out in browser کوچکنمایی در مرورگر 100% 100% Print... چاپ... Print Preview... پیشنمایش چاپ... Page up (Browser) ØµÙØ­Ù‡ بالا (مرورگر) Page down (Browser) ØµÙØ­Ù‡ پایین (مرورگر) Save As... ذخیره بعنوان... Save Page As... ذخیره ØµÙØ­Ù‡ بعنوان... Show/Hide نمایش/عدم نمایش Feeds Toolbar نوارابزار Ùیدها News Toolbar نوارابزار اخبار Browser Toolbar نوارابزار مرورگر Panel Categories پنل دسته بندی ها Status Bar نوار وضعیت Full Screen تمام ØµÙØ­Ù‡ Stay On Top ماندن در بالا Categories دسته ها Label برچسب Show labels menu نمایش منوی برچسب ها Close Tab بستن تب Close Other Tabs بستن سایر تب ها Close All Tabs بستن همه تب ها Switch to next tab Ø±ÙØªÙ† به تب بعدی Switch to previous tab Ø±ÙØªÙ† به تب قبلی Unread خوانده نشده Starred ستاره دار Deleted حذ٠شده Labels برچسب ها Decrease news list/increase browser کاهش لیست اخبار/Ø§ÙØ²Ø§ÛŒØ´ مرورگر Increase news list/decrease browser Ø§ÙØ²Ø§ÛŒØ´ لیست اخبار/کاهش مرورگر Find ÛŒØ§ÙØªÙ† Open Homepage Feed بازکردن ØµÙØ­Ù‡ خانگی Ùید Sort by Name مرتبسازی با نام Collapse All Folders بستن همه پوشه ها Expand All Folders بازکردن همه پوشه ها Next Folder پوشه بعدی Previous Folder پوشه قبلی Expand Folder بازکردن پوشه Setting Page: Labels تنظیمات ØµÙØ­Ù‡:برچسب ها Share اشتراک گذاری Sort By مرتبسازی با Ascending صعودی Descending نزولی Check for updates بررسی برای بروزرسانی A new version of QuiteRSS... یک نسخه جدید برنامه... Loading... بارگیری.. Web Page ØµÙØ­Ù‡ وب Save As ذخیره بعنوان HTML-Files (*.%1) ÙØ§ÛŒÙ„ های اÙÚ† تی اÙÙ… اÙÙ„ (*.%1) Text files (*.%2) ÙØ§ÛŒÙ„ های متنی (*.%2) Save As: can't open a file ذخیره بعنوان:ÙØ§ÛŒÙ„ را نمیتوان بازکرد Choose Directory انتخاب مسیر پوشه Important مهم Work کار Personal شخصی To Do برای انجام Later بعدا Amusingly مضحک NetworkManager SSL Certificate Error! خطای گواهینامه Ø§ÙØ³ Ø§ÙØ³ اÙÙ„ The "%1" server has the following errors in the SSL certificate: سرور "%1" خطای زیر را در گواهینامه Ø§ÙØ³ Ø§ÙØ³ اÙÙ„ خود دارد: <b>Organization: </b> <b>سازمان: </b> <b>Domain Name: </b> <b>نام دامنه: </b> <b>Expiration Date: </b> <b>تاریخ انقضاء: </b> <b>Error: </b> <b>خطا: </b> Would you like to make an exception for this certificate? Ù…ÛŒ خواهید برای این گواهینامه استثناء قائل بشید؟ NewsFiltersDialog News Filters Ùیلتر اخبار Feeds Ùیدها Filter Name نام Ùیلتر New... جدید.. Edit... ویرایش.. Delete... حذÙ.. Move up انتقال به بالا Move down انتقال به پایین Run Filter اجرای Ùیلتر Delete Filter حذ٠Ùیلتر Are you sure you want to delete the filter '%1'? آیا میخواهید Ùیلتر '%1' را حذ٠کنید؟ NewsHeader Icon Feed آیکون Ùید Title عنوان Published تاریخ انتشار Received Ø¯Ø±ÛŒØ§ÙØª شده Author سازنده Category دسته Read خواندن Star ستاره Label برچسب Feed Title عنوان Ùید Link لینک NewsItem Mark Read/Unread نشانه خوانده/خوانده نشده Delete News حذ٠اخبار NewsTabWidget Loading... (%p%) بارگیری... (%p%) Home خانه Open Page in External Browser بازکردن ØµÙØ­Ù‡ در مرورگر خارجی Open Link in External Browser بازکردن لینک در مرورگر خارجی Open Link بازکردن لینک Open in New Tab بازکردن در تب جدید Save Link... ذخیره لینک.. Save Image... ذخیره عکس... Copy Link Ú©Ù¾ÛŒ لینک Copy Ú©Ù¾ÛŒ Go Back برگرد Go Forward بروجلو Stop توق٠Reload بارگیری مجدد Copy Image Ú©Ù¾ÛŒ عکس Copy Image Address Ú©Ù¾ÛŒ آدرس عکس Load Images بارگیری عکس ها Auto Load Images to News View بارگیری خودکار عکس در مشاهده اخبار No Load Images عکسی بارگیری Ù†Ú©Ù† No Load Images to News View عکسی برای مشاهده اخبار بارگیری Ù†Ú©Ù† Close Tab بستن تب Auto Load Images in News View بارگیری خودکار تصاویر در مشاهده اخبار Don't Load Images عکسی بارگیری Ù†Ú©Ù† Don't Load Images in News View عکسی در مشاهده اخبار بارگیری Ù†Ú©Ù† Comments نظرات Author: %1 نویسنده: %1 audio صدا video ویدیو media رسانه Link to لینک به Mark Read/Unread نشانه خوانده/خوانده نشده Mark News Star نشانه اخبار به ستاره Label برچسب Share اشتراک گذاری Open News in External Browser بازکردن اخبار در مرورگر خارجی Delete حذ٠NotificationWidget Close بستن Mark All News Read نشانه همه اخبار بخوانده شده Previous Page ØµÙØ­Ù‡ قبلی Next Page ØµÙØ­Ù‡ بعدی Incoming News: %1 ورودی اخبار: %1 Page %1 of %2 ØµÙØ­Ù‡ %1 از %2 OptionsDialog Options گزینه ها General عمومی System Tray کنارساعت Network Connections ارتباطات شبکه Browser مرورگر Feeds Ùیدها Labels برچسب ها Notifications اطلاع رسانی Passwords رمزعبورها Language زبان Fonts & Colors Ùونت & رنگ ها Keyboard Shortcuts میانبرهای ØµÙØ­Ù‡ کلید Warning: key is already assigned to هشدار:کلید ازقبل اختصاص داده شده به Show splash screen on startup نمایش Ø§ÙØ³Ù¾Ù„Ø´ اسکرین در Ø§ÙØ³ØªØ§Ø±Øª آپ Reopen last opened feeds on startup بازکردن مجدد آخرین Ùید بازشده در Ø§ÙØ³ØªØ§Ø±Øª آپ Open new tab next to active بازکردن تب جدید کنار تب ÙØ¹Ø§Ù„ Hide feeds tree when opening tabs مخÙÛŒ کردن Ùید درختی حین بازکردن تب ها Show default rss-icon instead of favourite one نمایش آیکون پیش ÙØ±Ø¶ آر Ø§ÙØ³ Ø§ÙØ³ بجای موردعلاقه Automatically collapse folders بستن خودکار پوشه Show close button on tab نمایش دکمه بستن در تب Automatically check for updates بررسی خودکار برای بروزرسانی Help improve QuiteRSS by sending usage information Ú©Ù…Ú© به بهترسازی برنامه با ارسال اطلاعات مصر٠Store a DB in memory (requires program restart) (ذخیره پایگاه داده در Ø­Ø§ÙØ¸Ù‡ (برنامه باید ریستارت شود Save DB stored in memory to file every ذخیره پایگاه داده ذخیره شده در Ø­Ø§ÙØ¸Ù‡ در ÙØ§ÛŒÙ„ هر minutes دقيقه Run QuiteRSS at Windows startup Ø§ÙØ¬Ø±Ø§ÛŒ برنامه در Ø§ÙØ³ØªØ§Ø±Øª آپ ویندوز Show system tray icon نمایش آیکون کنارساعت starting QuiteRSS شروع برنامه minimizing QuiteRSS کمینه کردن برنامه closing QuiteRSS بستن برنامه Show static icon نمایش آیکون استاتیک Change icon for incoming new news تغیر آیکون برای اخبار جدید ورودی Show count of new news تعداد نمایش اخبار جدید Show count of unread news تعداد نمایش اخبار خوانده نشده Single click instead of double click for show window یک بار کلیک بجای دومرتبه کلیک برای نمایش پنجره Empty working set on minimize to tray خالی کردن مجموعه کاری در کمینه کنار ساعت Move to the system tray when: انتقال به کنارساعت حین: Tray icon behavior: Ø±ÙØªØ§Ø± آیکون کنارساعت: Direct connection to the Internet ارتباط مستقیم به اینترنت System proxy configuration (if available) تنظیمات پراکسی سیستم،اگرموجود بود Manual proxy configuration: پیکربندی دستی پراکسی: Proxy server: سرور پراکسی: Port: پورت: Username: نام کاربر: Password: رمزعبور: Request timeout: درخواست تایم اوت: Number of requests: تعداد درخواست ها: Number of retries: تعداد سعی مجدد: Options network requests when updating feeds (requires program restart): گزینه های درخواست شبکه هنگام بروزرسانی Ùیدها،برنامه باید ریستارت شود Use embedded browser Ø§Ø³ØªÙØ§Ø¯Ù‡ از مرورگر جاسازشده Use external browser Ø§Ø³ØªÙØ§Ø¯Ù‡ از مرورگر خارجی Default external browser مرورگر خارجی پیش ÙØ±Ø¶ Following external browser: مرورگر خارجی زیر: Browse... جستجو.. Load images بارگیری عکس ها Enable JavaScript ÙØ¹Ø§Ù„سازی جاوا اسکریپت Enable plug-ins ÙØ¹Ø§Ù„سازی Ø§ÙØ²ÙˆÙ†Ù‡ Open links in embedded browser in background بازکردن لینک ها در مرورگر جاسازی شده در پس زمینه Open links in external browser in background (experimental) (بازکردن لینک ها در مرورگر خارجی در پس زمینه (آزمایشی Default zoom on pages: زوم پیش ÙØ±Ø¶ در ØµÙØ­Ø§Øª Browser selection: انتخاب مرورگر: External browser: مرورگر خارجی: Content: محتوا: User style sheet: ورقه سبک کاربری: Maximum pages in cache حداکثر ØµÙØ­Ø§Øª در Ú©ÙŽØ´ Store cache in: ذخیره Ú©ÙŽØ´ در: Maximum size of disk cache حداکثر حجم Ú©ÙŽØ´ دیسک MB مگابایت Use disk cache Ø§Ø³ØªÙØ§Ø¯Ù‡ از Ú©ÙŽØ´ دیسک Allow local data to be set اجازه به تنظیم داده محلی Keep local data only until quit application Ø­ÙØ¸ داده محلی Ùقط تا خروج از برنامه Block sites from setting any data مسدودسازی سایت های از تنظیم هرگونه داده Clear پاکسازی Cookies: Ú©ÙˆÚ©ÛŒ: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. کلیک روی Ùلش یک پلاگین هست Ú©Ù‡ بارگیری محتوای Ùلش موجود در ØµÙØ­Ù‡ را خودکار مسدود میکند Use Click to Flash Ø§Ø³ØªÙØ§Ø¯Ù‡ از کلیک روی Ùلش Add... Ø§ÙØ²ÙˆØ¯Ù†... Remove... حذÙ... Ask where to save each file before downloading قبل از دانلود پرسش اینکه کجا هر ÙØ§ÛŒÙ„ ذخیره شود Download location: مکان دانلود: History تاریخچه Click to Flash کلیک روی Ùلش Downloads دانلودها Automatically update the feeds on startup بروزرسانی خودکار Ùید در Ø§ÙØ³ØªØ§Ø±Øª آپ Automatically update the feeds every بروزرسانی خودکار Ùید هر seconds ثانیه hours ساعت Nothing to do کاری انجام نده Dec دسامبر December دسامبر Display format for date: ÙØ±Ù…ت نمایش تاریخ: time: زمان: Alternating row background colors رنگهای متناوب پس زمینه سطر Simplified representation of date and time نمایش ساده تاریخ Ùˆ زمان Show All نمايش همه Show New نمایش جدید Show Unread نمایش خوانده نشده Show Starred نمایش ستاره دار Show Not Starred نمایش بی ستاره ها Show Unread or Starred نمایش خوانده نشده یا ستاره دار Show Last Day نمایش روز گذشته Show Last 7 Days نمایش 7 روز گذشته Style sheet for news: استیل شیت برای اخبار: Mark news as read: نشانه اخبار بعنوان خوانده شده: on selecting. With timeout در انتخاب.با تایم اوت after switching to another news بعداز Ø±ÙØªÙ† به اخباری دیگر Mark displayed news as read when switching feeds نشانه اخبار نمایش داده شده بعنوان خوانده شده حین تعویض Ùیدها Mark displayed news as read when closing tab نشانه اخبار نمایش داده شده بعنوان خوانده شده حین بستن تب Mark displayed news as read on minimize نشانه اخبار نمایش داده شده به خوانده شده در کمینه Change behavior of action 'Next Unread News' تغییر Ø±ÙØªØ§Ø± اقدام 'اخبار خوانده نشده بعدی' starred news اخبار ستاره دار labeled news اخبار برچسب دارشده Automatically mark identical news as read نشانه گذاری خودکار اخبار همسان بعنوان خوانده شده Prevent accidental deletion of: جلوگیری از حذ٠تصادÙÛŒ: Enable cleanup on shutdown ÙØ¹Ø§Ù„سازی پاکسازی در شات دان Maximum age of news in days to keep: حداکثر سن اخبار در روز برای Ø­ÙØ¸ کردن: Maximum number of news to keep: حداکثر تعداد اخبار برای Ø­ÙØ¸ کردن: Delete read news حذ٠اخبار خوانده شده Never delete unread news هرگز اخبار خوانده نشده را پاک Ù†Ú©Ù† Never delete starred news هرگز اخبار ستاره دار شده را پاک Ù†Ú©Ù† Never delete labeled news هرگز برچسب اخبار را حذ٠نکن Clean up 'Deleted' پاکسازی 'حذ٠شده' Enable DB optimization (slower shutdown) ÙØ¹Ø§Ù„سازی بهسازی پایگاه داده (شات دان آهسته تر) Reading خواندن Clean Up پاکسازی New... جدید.. Edit... ویرایش.. Delete... حذÙ.. Move up انتقال به بالا Move down انتقال به پایین Show when inactive main window وقتی Ú©Ù‡ پنجره اصلی غیر ÙØ¹Ø§Ù„ است نشان بده Screen ØµÙØ­Ù‡ Transparency پشت نمایی Show titles feeds نمایش عناوین Ùیدها Show icon feed نمایش آیکون Ùید Show button 'Mark All News Read' نمایش دکمه 'نشانه همه اخبار بخوانده شده' Show button 'Mark Read/Unread' نمایش دکمه 'نشانه خوانده/خوانده نشده' Show button 'Open in External Browser' نمایش دکمه 'بازکردن در مرورگر خارجی' Show button 'Delete News' نمایش دکمه 'حذ٠اخبار' Play sound for incoming new news پخش صدا برای ورودی جدید اخبار Play پخش Display notification for incoming news نمایش اطلاع رسانی برای اخبار ورودی Top Left بالا از Ú†Ù¾ Top Right بالا از راست Bottom Left پایین از Ú†Ù¾ Bottom Right پایین از راست Review بازبینی Position موقعیت Show maximum of نمایش حداکثر item on page notification آیتم در ØµÙØ­Ù‡ اطلاع رسانی Width list items عرض لیست آیتم ها pixels پیکسل Close notification after بستن اطلاع رسانی بعداز Do not show notification in fullscreen mode اطلاع رسانی را درحالت تمام ØµÙØ­Ù‡ نشان نده Display نمایش Action mouse on news opening: اقدام ماوس در بازکردن اخبار Single Click: یک مرتبه کلیک: Double Click: دو مرتبه کلیک: Middle Click: کلیک وسط ماوس: Only show selected feeds: Ùقط Ùیدهای انتخاب شده را نشان بده: Notification اطلاع رسانی Sound صدا Selection of feeds انتخاب Ùیدها All Feeds تمام Ùیدها Site سایت User کاربر Password رمزعبور Delete حذ٠Delete All حذ٠همه Show Passwords نمایش رمزعبورها Version نسخه Author سازنده Contact تماس Choose language: انتخاب زبان: Type نوع Font Ùونت Feeds list font Ùونت لیست Ùیدها News list font Ùونت لیست اخبار News title font Ùونت عنوان اخبار News text font Ùونت متن اخبار Notification font Ùونت اطلاع رسانی Change... تغییر.. Reset ریست Feeds list color رنگ لیست Ùیدها Feeds list background پس زمینه لیست Ùیدها News list color رنگ لیست اخبار News list background پس زمینه لیست اخبار Focused news color رنگ اخبار در کانون Focused news background color رنگ پس زمینه اخبار در کانون Link color رنگ لینک Title color رنگ عنوان Date color رنگ تاریخ Author color رنگ نویسنده News text color رنگ متن اخبار News title background پس زمینه عنوان اخبار News background پس زمینه اخبار Feed with new news Ùید با اخبار جدید Count of unread news in feeds tree تعداد اخبار خوانده نشده در Ùید درختی Disabled feed Ùیدهای ØºÛŒØ±ÙØ¹Ø§Ù„ شده Alternating row colors متناوب کردن رنگ های سطر Notification text color رنگ متن اطلاع رسانی Notification background color رنگ پس زمینه اطلاع رسانی Auto load images in news view بارگیری خودکار تصاویر در مشاهده اخبار Text color of new news رنگ متن اخبار جدید Show feeds tree toggle نمایش ضامن Ùید درختی Clear new status when minimize to tray پاکسازی وضعیت جدید حین کمینه کنار ساعت Set focus on the last opened news تنظیم کانون به آخرین اخبار باز شده Set focus at the top of news list تنظیم کانون به بالای لیست اخبار Set focus on the unread news تنظیم کانون به اخبار خوانده نشده Open the news بازکردن اخبار Default news filter: Ùیلتر پیش ÙØ±Ø¶ اخبار: Action on feed opening: اقدام در بازکردن Ùیدها Show news description instead of loading web page نمایش توضیح اخبار بجای بارگیری ØµÙØ­Ù‡ وب Text color of unread news رنگ متن اخبار خوانده نشده Focused feed color رنگ Ùید در کانون Focused feed background color رنگ پس زمینه Ùید در کانون Standard استاندارد Fixed ثابت شده Serif Tahoma Sans Serif Tahoma Cursive خط شکسته Fantasy ÙØ§Ù†ØªØ²ÛŒ Default font size اندازه پیش ÙØ±Ø¶ Ùونت Fixed font size اندازه Ùونت ثابت شده Minimum font size حداقل اندازه Ùونت Minimum logical font size حداقل اندازه منطقی Ùونت Font families: خانواده Ùونت: Font sizes: اندازه Ùونت: Fonts Ùونت ها Fonts Browser مرورگر Ùونت Colors رنگ ها Filter Ùیلتر Action اقدام Description توضيحات Shortcut میانبر Shortcut: میانبر: Open File... بازکردن ÙØ§ÙŠÙ„.. Select Style Sheet File ÙØ§ÛŒÙ„ ورقه سبک کاربری را انتخاب کنید Open Directory... بازکردن دایرکتوی... Add site to whitelist Ø§ÙØ²ÙˆØ¯Ù† سایت به لیست سÙید Site without 'http://' (ex. youtube.com) Ú©Ù¾ÛŒ بدون 'http://' (ex. youtube.com) QAbstractSpinBox &Step up گام به بالا Step &down گام به پایین &Select All &انتخاب همه QDialogButtonBox Close بستن Cancel لغو &Yes &بله &No &خير QFtp Not connected متصل نشده است Host %1 not found میزبان %1 ÛŒØ§ÙØª نشد Connection refused to host %1 ارتباط رد شده با میزبان %1 Connection timed out to host %1 خطای تایم اوت به میزبان %1 Connected to host %1 اتصال به میزبان %1 Connection refused for data connection ارتباط برای داده ارتباطی رد میکند Unknown error خطای ناشناخته Connecting to host failed: %1 موÙÙ‚ به اتصال به میزبان نشد: %1 Login failed: %1 موÙÙ‚ به ورود نشد: %1 Listing directory failed: %1 موÙÙ‚ به لیست گیری دایرکتوری نشد: %1 Changing directory failed: %1 موÙÙ‚ به تغییر دایرکتوری نشد: %1 Downloading file failed: %1 موÙÙ‚ به دانلود ÙØ§ÛŒÙ„ نشد: %1 Uploading file failed: %1 موÙÙ‚ به آپلود ÙØ§ÛŒÙ„ نشد: %1 Removing file failed: %1 موÙÙ‚ به Ø­Ø°Ù ÙØ§ÛŒÙ„ نشد: %1 Creating directory failed: %1 موÙÙ‚ به ایجاد دایرکتوری نشد: %1 Removing directory failed: %1 موÙÙ‚ به حذ٠دایرکتوری نشد: %1 Connection closed ارتباط بسته شده است QLineEdit &Undo &آندو &Redo &ریدو Cu&t &کات &Copy &Ú©Ù¾ÛŒ &Paste &چسباندن Delete حذ٠Select All انتخاب همه QMultiInputContext Select IM Ø¢ÛŒ اÙÙ… را انتخاب کنید QObject Cannot start external program برنامه خارجی را نمیتوان اجرا کرد Cannot start external program! %1 برنامه خارجی را نمیتوان اجرا کرد! %1 Error خطا QTextControl &Undo &آندو &Redo &ریدو Cu&t &کات &Copy &Ú©Ù¾ÛŒ &Paste &چسباندن Delete حذ٠Select All انتخاب همه Copy &Link Location Ú©Ù¾ÛŒ &مکان لینک QWizard Cancel لغو < &Back < &قبلی &Finish Ù¾&ايان &Next > &بعدی > RSSDetectionWidget Untitled feed Ùید بیعنوان RequestFeed Server requires authentication! سرور نیاز به مجوز دارد! Server replied: Not Found! پاسخ سرور:ÛŒØ§ÙØª نشد! Redirect error! خطای تغییر مسیر! Request timeout! درخواست تایم اوت! SQLiteDriver Error opening database خطای بازکردن پایگاه داده Error closing database خطای بستن پایگاه داده Unable to begin transaction قادر به شروع تراکنش نیست Unable to commit transaction قادر به ذخیره تراکنش نیست Unable to rollback transaction قادر به عقبگرد تراکنش نیست SQLiteResult Unable to fetch row قادر به Ø¯Ø±ÛŒØ§ÙØª ردی٠نیست No query جستار ندارد Unable to execute statement قادر به اجرای دستور نیست Unable to execute multiple statements at a time قادر به اجرای دستورهای متعدد در یک زمان نیست Unable to reset statement قادر به ریست دستور نیست Unable to bind parameters قادر به متصل کردن پارامتر نیست Parameter count mismatch عدم تطابق تعداد پارامتر SslErrorDialog SSL Certificate Error! خطای گواهینامه Ø§ÙØ³ Ø§ÙØ³ اÙÙ„ Only for this session Ùقط برای این جلسه UpdateAppDialog Check for Updates بررسی برای بروزرسانی Checking for updates... درحال بررسی برای بروزرسانی... Loading history... بارگیری تاریخچه.. Don't remind about this version درباره این نسخه یاد آوری Ù†Ú©Ù† &Install &نصب You already have the latest version شما جدیدترین نسخه را دارید A new version of QuiteRSS is available! نسخه جدید برنامه موجود است! Click here to go to the download page برای Ø±ÙØªÙ† به ØµÙØ­Ù‡ دانلود اینجا کلیک کنید Your version is: نسخه شما هست: Current version is: نسخه ÙØ¹Ù„ÛŒ هست: Error checking updates خطا بررسی بروزرسانی quiterss-0.18.3/lang/quiterss_fi.ts000066400000000000000000005410521265173051100173200ustar00rootroot00000000000000 AboutDialog About Tietoja Revision Revisio Version Versio QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS on alustariippumaton avoimen lähdekoodin RSS/Atom -uutislukija Includes: Sisältää: Application directory: Resource directory: Data directory: Backup directory: Database file: Settings file: Log file: Authors Tekijät History Historia License Lisenssi Information AdBlockAddSubscriptionDialog Add Subscription Title: Otsikko: Address: Add new subscription to AdBlock: AdBlockCustomList Custom Rules AdBlockDialog AdBlock Configuration Enable AdBlock Search... Options Asetukset AdBlock Use only essential part of EasyList (for performance reasons) Add Rule Remove Rule Add Subscription Remove Subscription Update Subscriptions Learn about writing rules... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock Show AdBlock &Settings Disable on %1 Disable only on this page Blocked Popup Windows %1 with (%2) No content blocked Blocked URL (AdBlock Rule) - click to edit rule AdBlockManager EasyList AdBlockSubscription Cannot load subscription! AdBlockTreeWidget Add Rule Remove Rule Add Custom Rule Please write your rule here: %1 (recently updated) %1 (Error: %2) AddFeedWizard Add Feed Lisää syöte Create New Feed Luo uusi syöte Use title of the feed as displayed name Käytä syötteen nimenä syötteen otsikkoa Server requires authentication: Palvelin vaatii kirjautumisen: Username: Käyttäjänimi: Password: Salasana: Feed URL or website address: Syötteen URL tai web-osoite: Feeds Syötteet All Feeds Kaikki syötteet New Folder... Uusi kansio... Displayed name: Syötteen nimi: Location: Sijainti: URL error! URL virhe! Duplicate feed! Syöte on jo listallasi! Can't find feed URL! Syötteen URL:ia ei löytynyt! Request failed! Pyyntö epäonnistui! AddFolderDialog Add Folder Lisää kansio Feeds Syötteet All Feeds Kaikki syötteet Name: Nimi: Location: Sijainti: AuthenticationDialog Save password Tallenna salasana Authorization required Kirjautuminen vaaditaan Server: Palvelin: Message: Viesti: Username: Käyttäjänimi: Password: Salasana: CategoriesTreeWidget Unread Lukemattomat Starred Tähdellä merkityt Deleted Poistetut Labels Nimikkeet Open in New Tab Avaa uudessa välilehdessä Clear 'Deleted' Tyhjennä 'Poistetut' Mark Read CleanUpWizard Clean Up Siivous Choose Feeds Valitse syötteet All Feeds Kaikki syötteet Clean Up Options Siivouksen asetukset Maximum age of news in days to keep: Kuinka monen päivän vanhoja uutisia säilytetään: Maximum number of news to keep: Kuinka monta uutista säilytetään: Delete read news Poista luetut uutiset Never delete unread news Älä koskaan poista lukemattomia uutisia Never delete starred news Älä koskaan poista tähdellä merkittyjä uutisia Never delete labeled news Älä koskaan poista nimikkeellisiä uutisia Clean up 'Deleted' Siivoa poistetut Purge DB Puhdista tietokanta Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Poista lopullisesti poistetuksi merkityt uutiset tietokannasta. Erittäin vanhoja uutisia saattaa ilmestyä uudelleen. Information Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash ClickToFlash esti objektin Hide object Piilota objekti Add '%1' to whitelist Lisää '%1' sallittujen listalle CustomizeToolbarDialog Customize Main Toolbar Muokkaa päätyökalupalkkia Customize Feeds Toolbar Muokkaa syötetyökalupalkkia Customize News Toolbar Muokkaa uutistyökalupalkkia Load images Lataa kuvat Separator Erotin Icon Kuvake Text Teksti Text Beside Icon Teksti kuvakkeiden vieressä Text Under Icon Teksti kuvakkeiden alla Big Suuri Normal Normaali Small Pieni Style: Tyyli: Icon Size: Kuvakkeen koko: Add Lisää Remove Poista Move up Siirrä ylös Move down Siirrä alas Default Oletus DownloadItem Remaining time unavailable Jäljellä oleva aika ei ole saatavilla Error: Cannot write to file! Virhe: Tiedostoon ei voida kirjoittaa! Error: Virhe: few seconds muutama sekunti seconds sekuntia minutes minuuttia hours tuntia Unknown size Tuntematon koko Unknown speed Tuntematon nopeus %2 - unknown size (%3) %2 - tuntematon koko (%3) Remaining %1 - %2 of %3 (%4) Jäljellä %1 - %2 / %3 (%4) Cancelled - %1 Peruutettu - %1 Delete file Poista tiedosto Do you want to also delete downloaded file? Open File Avaa tiedosto Open Folder Avaa kansio Copy Download Link Kopioi latauslinkki Cancel Downloading Peruuta lataus Remove Poista Cancelled Peruutettu Error Virhe Not found Ei löydetty Sorry, the file %1 was not found! Tiedostoa %1 ei löydetty! DownloadManager Clear Tyhjennä File %1 (*.%2) Tiedosto %1 (*.%2) All Files (*.*) Kaikki tiedostot (*.*) Save As... Tallenna nimellä... Executable: Sovellus: Arguments: Argumentit: FeedPropertiesDialog Properties Ominaisuudet General Yleiset Columns Sarakkeet Authentication Kirjautuminen Status Tila Title: Otsikko: Homepage: Kotisivu: Feed URL: Syötteen URL: Load Title Lataa otsikko Load Favicon Lataa favicon Select Icon... Valitse kuvake... Select Icon Valitse kuvake Disable update Älä päivitä Automatically update every Päivitä automaattisesti joka seconds sekunti minutes minuutti hours tunti Starred Merkitse tähdellä Load images Lataa kuvat Display in new tab on startup Näytä käynnistettäessä uudessa välilehdessä Show news' description instead of loading web page Näytä uutisten kuvaus verkkosivun lautauksen sijaan Automatically delete duplicate news Poista uutisten kopiot automaattisesti Display Reading Enable JavaScript Right-to-left layout Ascending Nouseva Descending Laskeva Sort by: Järjestä: Add Lisää Remove Poista Move up Siirrä ylös Move down Siirrä alas Default Oletus Server requires authentication: Palvelin vaatii kirjautumisen: Username: Käyttäjänimi: Password: Salasana: Feeds count: Description: Kuvaus: Status: Tila: Created: Luotu: Last update: Viimeisin päivitys: News count: Uutisten määrä: Good Hyvä Long ago ;-) Kauan sitten ;-) new uutta unread lukematonta Image files Kuvatiedostot Select Image Valitse kuva Load icon: can't open a file! Lataa kuvake: tiedosta ei voitu avata! FilterRulesDialog Filter Rules Suodattimen säännöt Feeds Syötteet All Feeds Kaikki syötteet Filter name: Suodattimen nimi: Match all news Kaikki uutiset Match all conditions Täytä kaikki ehdot Match any condition Täytä jokin ehdoista Perform these actions: Suorita nämä toiminnot: Please enter name for the filter. Anna suodattimelle nimi. Please enter search condition for the news filter. Anna uutissuodattimelle hakuehto. FindFeed Find Name Hae nimiä Find Link Hae linkkejä FindTextContent Find in News Hae uutisia Find in Titles Find in Authors Find in Categories Find in Descriptions Find in Links Find in Browser Hae selaimesta FtpDownloader Canceled! Peruutettu! ItemAction Mark News as Read Merkitse uutiset luetuiksi Add Star Merkitse tähdellä Delete Poista Add Label Lisää nimike Play a Sound Toista ääni Show News in Notifier Näytä uutiset ilmoituslaatikossa Browse Selaa Play Toista Add Action Lisää toiminto Delete Action Poista toiminto Open File... Avaa tiedosto... ItemCondition Title Otsikko Description Kuvaus Author Tekijä Category Ryhmä State Tila Link News New Uusi Read Luettu Starred Tähdellä merkitty Add Condition Lisää ehto Delete Condition Poista ehto contains sisältää doesn't contains ei sisällä is on isn't ei ole begins with alkaa ends with loppuu Regular expressions LabelDialog New Label Uusi nimike Load icon... Lataa kuvake... Default Oletus Select color... Valitse väri... Name: Nimi: Icon: Kuvake: Color text: Tekstin väri: Color background: Taustan väri: Image files Kuvatiedostot Select Image Valitse kuva Load icon: can't open a file! Lataa kuvake: tiedosta ei voitu avata! MainApplication Saving data... MainWindow &AdBlock Hide Categories Piilota ryhmät Show Categories Näytä ryhmät Select OPML-File Valitse OPML-tiedosto OPML-Files (*.%1 *.%2) OPML-tiedostot (*.%1 *.%2) Import canceled Tuonti peruutettiin Import: can't open a file Tuonti: tiedostoa ei voitu avata OPML-Files (*.%1) OPML-tiedostot (*.%1) Export canceled Vienti peruutettiin Export: can't open a file Vienti: tiedostoa ei voitu avata Unread: %1 Lukemattomia: %1 All: %1 Kaikkiaan: %1 (Browser) New News: %1 Uusia uutisia: %1 Unread News: %1 Lukemattomia uutisia: %1 &Add &Lisää Add New Feed Lisää uusi syöte &Feed... &Syöte... F&older... &Kansio... Add New Folder Lisää uusi kansio Open in New Tab Avaa uudessa välilehdessä &Delete... &Poista... Delete Selected Feed Poista valittu syöte &Import Feeds... Tuo syötte&itä... Import Feeds from OPML File Tuo syötteitä OPML-tiedostosta &Export Feeds... Vie syött&eitä... Export Feeds to OPML File Vie syötteitä OPML-tiedostoon E&xit &Sulje Update Feed Päivitä syöte Update Current Feed Päivitä nykyinen syöte Update All Päivitä kaikki Update All Feeds Päivitä kaikki syötteet Mark All Feeds Read Merkitse kaikki syötteet luetuksi Mark Read/Unread Merkitse luetuksi/lukemattomaksi Mark Current News Read/Unread Merkitse nykyinen uutinen luetuksi/lukemattomaksi Mark All News Read Merkitse kaikki uutiset luetuiksi Downloads Lataukset Clean Up... Siivoa... News Filters... Uutissuodattimet... Filter News... Suodata uutisia... Options... Asetukset... Open Options Dialog Avaa Asetus-ikkuna Filter Feeds Suodata syötteitä Show All Näytä kaikki Show New Näytä uudet Show Unread Näytä lukemattomat Show Starred Feeds Näytä tähdellä merkityt syötteet Show Not Working Feeds Näytä ei-toimivat syötteet Filter News Suodata uutisia Show Starred Näytä tähdellä merkityt Show Not Starred Näytä tähdettömät Show Unread or Starred Näytä lukemattomat tai tähdellä merkityt Show Last Day Näytä tämänpäiväiset Show Last 7 Days Näytä viimeiset 7 päivää About... Tietoja... Show 'About' Dialog Näytä Tietoja-ikkuna Check for Updates... Tarkista päivitykset... Report a Problem... Ilmoita ongelmasta... Open News Avaa uutiset Open in Browser Avaa selaimessa Open in External Browser Avaa ulkoisessa selaimessa Open News in External Browser Avaa uutiset ulkoisessa selaimessa Open News in New Tab Avaa uutiset uudessa välilehdessä Open in Background Tab Avaa taustavälilehdessä Open News in Background Tab Avaa uutiset taustavälilehdessä Star Mark News Star Merkitse tähdellä Delete Poista Delete Selected News Poista valitut uutiset Delete All News Poista kaikki uutiset Delete All News from List Poista kaikki uutiset listalta Restore Palauta Restore News Palauta uutiset Copy Link Kopioi linkki Restore last deleted news Palauta viimeksi poistetut uutiset Mark Read Merkitse luetuksi Mark Feed Read Merkitse syöte luetuksi Properties Ominaisuudet &File &Tiedosto Count Unread News Count All News Last Update Reset browser zoom Print Web Page Preview Web Page Save page in database Save page in database instead of news description Confirm Delete Are you sure to delete selected elements? Menu Add Feed... &Create Backup... S&how Menu Bar Stop Update Feeds Open News Description Copy News Link &View &Näkymä Fee&ds &Syötteet &News &Uutiset &Browser S&elain &Tools Työ&kalut &Help &Ohje Main Toolbar Päätyökalupalkki Customize Toolbar Muokkaa työkalupalkkia Main Toolbar... Päätyökalupalkki... Customize Toolbar... Muokkaa työkalupalkkia... Feeds Toolbar... Syötetyökalupalkki... News Toolbar... Uutistyökalupalkki... Lock Toolbar Lukitse työkalupalkki Hide Toolbar Piilota työkalupalkki Layout Classic Newspaper Application Style Sovelluksen tyyli System Järjestelmä System2 Järjestelmä 2 Green Vihreä Orange Oranssi Purple Violetti Pink Pinkki Gray Harmaa Browser Position Selaimen sijainti Top Ylhäällä Bottom Alhaalla Right Oikealla Left Vasemmalla Show Window Näytä ikkuna Previous Feed Edellinen syöte Next Feed Seuraava syöte Previous News Edelliset uutiset Next News Seuraavat uutiset News Page Up Uutislistassa sivu ylöspäin News Page Down Uutislistassa sivu alaspäin Next Unread News Seuraava lukematon uutinen Previous Unread News Edellinen lukematon uutinen Switch Focus to Next Panel Siirrä kohdistus seuraavaan paneeliin Switch Focus to Next Panel (Tree Feeds, List News, Browser) Siirrä kohdistus seuraavaan paneeliin (Syötteet, Uutislista, Selain) Switch Focus to Previous Panel Siirrä kohdistus edelliseen paneeliin Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Siirrä kohdistus edelliseen paneeliin (Syötteet, Selain, Uutislista) Show/Hide Tree Feeds Näytä/piilota syötteet Minimize to Tray Pienennä järjestelmäpalkkiin Minimize Application to Tray Pienennä sovellus järjestelmäpalkkiin Columns Sarakkeet Show Indentation Näytä sisennys Search Feed Etsi syöte Zoom Suurennuslasi Zoom In Suurenna Zoom in in browser Suurenna selaimessa Zoom Out Pienennä Zoom out in browser Pienennä selaimessa 100% 100% Print... Tulosta... Print Preview... Tulostuksen esikatselu... Page up (Browser) Page down (Browser) Save As... Tallenna nimellä... Save Page As... Tallenna sivu nimellä... Show/Hide Näytä/Piilota Feeds Toolbar Syötetyökalupalkki News Toolbar Uutistyökalupalkki Browser Toolbar Selaintyökalupalkki Panel Categories Ryhmät -paneeli Status Bar Full Screen Koko näyttö Stay On Top Pysy päällimmäisenä Categories Ryhmät Label Nimike Show labels menu Näytä nimikevalikko Close Tab Sulje välilehti Close Other Tabs Sulje muut välilehdet Close All Tabs Sulje kaikki välilehdet Switch to next tab Siirry seuraavaan välilehteen Switch to previous tab Siirry edelliseen välilehteen Unread Starred Deleted Labels Nimikkeet Decrease news list/increase browser Pienennä uutislistaa/suurenna selainta Increase news list/decrease browser Suurenna uutislistaa/pienennä selainta Find Etsi Open Homepage Feed Avaa kotisivusyöte Sort by Name Collapse All Folders Pienennä kansiot Expand All Folders Laajenna kansiot Next Folder Seuraava kansio Previous Folder Edellinen kansio Expand Folder Laajenna kansio Setting Page: Labels Asetussivu: Nimikkeet Share Jaa Sort By Järjestä Ascending Nouseva Descending Laskeva Check for updates Tarkista päivitykset A new version of QuiteRSS... Uusi versio QuiteRSS:stä... Loading... Ladataan... Web Page Verkkosivu Save As Tallenna nimellä HTML-Files (*.%1) HTML-tiedostot (*.%1) Text files (*.%2) Tekstitiedostot (*.%2) Save As: can't open a file Tallenna nimellä: tiedostoa ei voitu avata Choose Directory Important Tärkeä Work Työ Personal Henkilökohtainen To Do To do Later Myöhemmin Amusingly Hassu NetworkManager SSL Certificate Error! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Domain Name: </b> <b>Expiration Date: </b> <b>Error: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters Uutissuodattimet Feeds Syötteet Filter Name New... Uusi... Edit... Muokkaa... Delete... Poista... Move up Siirrä ylös Move down Siirrä alas Run Filter Aja suodatin Delete Filter Poista suodatin Are you sure you want to delete the filter '%1'? NewsHeader Icon Feed Syötteen kuvake Title Otsikko Published Julkaistu Received Vastaanotettu Author Tekijä Category Ryhmä Read Luettu Star Tähti Label Nimike Feed Title Link Linkki NewsItem Mark Read/Unread Merkitse luetuksi/lukemattomaksi Delete News NewsTabWidget Loading... (%p%) Ladataan... (%p%) Home Koti Open Page in External Browser Avaa sivu ulkoisessa selaimessa Open Link in External Browser Avaa linkki ulkoisessa selaimessa Open Link Avaa linkki Open in New Tab Avaa uudessa välilehdessä Save Link... Tallenna linkki... Save Image... Tallenna kuva... Copy Link Kopioi linkki Copy Kopioi Go Back Takaisin Go Forward Eteenpäin Stop Pysäytä Reload Lataa uudelleen Copy Image Kopioi kuva Copy Image Address Kopioi kuvan osoite Load Images Lataa kuvat Auto Load Images to News View Lataa kuvat automaattisesti uutisnäkymään No Load Images Älä lataa kuvia No Load Images to News View Älä lataa kuvia uutisnäkymään Close Tab Sulje välilehti Auto Load Images in News View Don't Load Images Don't Load Images in News View Comments Kommentit Author: %1 Tekijä: %1 audio ääni video video media media Link to Linkitä Mark Read/Unread Mark News Star Label Share Open News in External Browser Delete NotificationWidget Close Sulje Mark All News Read Merkitse kaikki uutiset luetuiksi Previous Page Next Page Incoming News: %1 Uusia uutisia: %1 Page %1 of %2 Sivu %1 / %2 OptionsDialog Options Asetukset General Yleiset System Tray Järjestelmäpalkki Network Connections Yhteydet Browser Selain Feeds Syötteet Labels Nimikkeet Notifications Ilmoitukset Passwords Salasanat Language Kieli Fonts & Colors Kirjasimet & Värit Keyboard Shortcuts Pikanäppäimet Warning: key is already assigned to Varoitus: näppäin on jo asetettu Show splash screen on startup Näytä aloitusruutu käynnistyessä Reopen last opened feeds on startup Avaa käynnistyessä viimeksi avatut syötteet Open new tab next to active Avaa uusi välilehti aktiivisen viereen Hide feeds tree when opening tabs Piilota syötteet kun uusi välilehti avataan Show default rss-icon instead of favourite one Näytä oletus rss-kuvake suosikin sijaan Automatically collapse folders Pienennä kansiot automaattisesti Show close button on tab Automatically check for updates Tarkista päivitykset automaattisesti Help improve QuiteRSS by sending usage information Store a DB in memory (requires program restart) Säilytä tietokanta muistissa (vaatii uudelleenkäynnistyksen) Save DB stored in memory to file every Tallenna tietokanta tiedostoon joka minutes minuutti Run QuiteRSS at Windows startup Suorita QuiteRSS Windowsin käynnistyksessä Show system tray icon Näytä järjestelmäpalkin kuvake starting QuiteRSS QuiteRSS käynnistetään minimizing QuiteRSS QuiteRSS pienennetään closing QuiteRSS QuiteRSS suljetaan Show static icon Näytä staattinen kuvake Change icon for incoming new news Näytä erilainen kuvake kun uusia uutisia on saatavilla Show count of new news Näytä uusien uutisten määrä Show count of unread news Näytä lukemattomien uutisten määrä Single click instead of double click for show window Yksi klikkaus kahden sijaan näyttääksesi ikkunan Empty working set on minimize to tray Tyhjennä työjoukko pienennettäessä järjestelmäpalkkiin Move to the system tray when: Pienennä järjestelmäpalkkiin kun: Tray icon behavior: Järjestelmäpalkin kuvakkeen käytös: Direct connection to the Internet Suora yhteys Internettiin System proxy configuration (if available) Järjestelmän välityspalvelinasetukset (jos saatavilla) Manual proxy configuration: Mukautetut välityspalvelinasetukset: Proxy server: Välityspalvelin: Port: Portti: Username: Käyttäjänimi: Password: Salasana: Request timeout: Number of requests: Number of retries: Options network requests when updating feeds (requires program restart): Yhteysasetukset syötteiden päivitykselle (vaatii uudelleenkäynnistyksen): Use embedded browser Käytä sisäistä selainta Use external browser Käytä ulkoista selainta Default external browser Oletusselain Following external browser: Muu selain: Browse... Selaa... Load images Lataa kuvat Enable JavaScript Salli JavaScript Enable plug-ins Salli liitännäiset Open links in embedded browser in background Avaa linkit sisäisessä selaimessa taustalla Open links in external browser in background (experimental) Avaa linkit ulkoisessa selaimessa taustalla (kokeellinen) Default zoom on pages: Oletussuurennus sivuilla: Browser selection: Selaimen valinta: External browser: Ulkoinen selain: Content: Sisältö: User style sheet: Käyttäjän tyylisivu: Maximum pages in cache Sivuja enintään välimuistissa Store cache in: Välimuistin sijainti: Maximum size of disk cache Levyvälimuistin enimmäiskoko MB MB Use disk cache Käytä levyvälimuistia Allow local data to be set Salli paikallisen datan asettaminen Keep local data only until quit application Poista paikallinen data kun sovellus suljetaan Block sites from setting any data Estä sivuja asettamasta mitään dataa Clear Tyhjennä Cookies: Keksit: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash on liitännäinen joka estää Flash-sisällön automaattisen lataamisen. Voit ladata sisällön manuaalisesti painamalla kuvaketta. Use Click to Flash Käytä Click To Flash -liitännäistä Add... Lisää... Remove... Poista... Ask where to save each file before downloading Kysy minne tiedosto tallennetaan ennen latausta Download location: Latausten sijainti: History Historia Click to Flash Click to Flash Downloads Lataukset Automatically update the feeds on startup Päivitä syötteet ohjelman käynnistyessä Automatically update the feeds every Päivitä syötteet automaattisesti joka seconds sekunti(a) hours tunti Nothing to do Älä tee mitään Dec joulu December joulukuu Display format for date: Päivämäärän muotoilu: time: aika: Alternating row background colors Vaihteleva rivien taustaväri Simplified representation of date and time Päivämäärän ja ajan yksinkertaistettu esitys Show All Näytä kaikki Show New Näytä uudet Show Unread Näytä lukemattomat Show Starred Näytä tähdellä merkityt Show Not Starred Näytä tähdettömät Show Unread or Starred Näytä lukemattomat tai tähdellä merkityt Show Last Day Näytä tämänpäiväiset Show Last 7 Days Näytä viimeiset 7 päivää Style sheet for news: Mark news as read: Merkitse uutiset luetuksi: on selecting. With timeout valittaessa, viiveellä after switching to another news vaihdettaessa toiseen uutiseen Mark displayed news as read when switching feeds Merkitse uutiset luetuksi kun syötettä vaihdetaan Mark displayed news as read when closing tab Merkitse uutiset luetuksi kun välilehti suljetaan Mark displayed news as read on minimize Merkitse uutiset luetuksi pienennettäessä Change behavior of action 'Next Unread News' Vaihda toiminnon 'Seuraava lukematon uutinen' käytöstä starred news tähdellä merkityt uutiset labeled news nimikkeelliset uutiset Automatically mark identical news as read Merkitse identtiset uutiset luetuksi automaattisesti Prevent accidental deletion of: Estä tahaton poistaminen: Enable cleanup on shutdown Siivoa suljettaessa Maximum age of news in days to keep: Kuinka monen päivän vanhoja uutisia säilytetään: Maximum number of news to keep: Kuinka monta uutista säilytetään: Delete read news Poista luetut uutiset Never delete unread news Älä koskaan poista lukemattomia uutisia Never delete starred news Älä koskaan poista tähdellä merkittyjä uutisia Never delete labeled news Älä koskaan poista nimikkeellisiä uutisia Clean up 'Deleted' Siivoa poistetut Enable DB optimization (slower shutdown) Tietokannan optimointi (hitaampi sammutus) Reading Lukeminen Clean Up Siivous New... Uusi... Edit... Muokkaa... Delete... Poista... Move up Siirrä ylös Move down Siirrä alas Show when inactive main window Screen Transparency Show titles feeds Show icon feed Show button 'Mark All News Read' Show button 'Mark Read/Unread' Show button 'Open in External Browser' Show button 'Delete News' Play sound for incoming new news Toista ääni kun uusia uutisia on saatavilla Play Toista Display notification for incoming news Näytä ilmoitus kun uusia uutisia on saatavilla Top Left Ylhäällä vasemmalla Top Right Ylhäällä oikealla Bottom Left Alhaalla vasemmalla Bottom Right Alhaalla oikealla Review Esikatselu Position Sijainti Show maximum of Näytä enintään item on page notification Width list items pixels pikseliä Close notification after Näytä ilmoitus Do not show notification in fullscreen mode Älä näytä ilmoituksia kokoruututilassa Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Näytä vain valitut syötteet: Notification Sound Selection of feeds All Feeds Kaikki syötteet Site Sivu User Käyttäjä Password Salasana Delete Poista Delete All Poista kaikki Show Passwords Näytä salasanat Version Versio Author Tekijä Contact Kontakti Choose language: Valitse kieli: Type Tyyppi Font Kirjasin Feeds list font Syötelistan kirjasin News list font Uutislistan kirjasin News title font Uutisotsikon kirjasin News text font Uutistekstin kirjasin Notification font Ilmoituksen kirjasin Change... Vaihda... Reset Palauta Feeds list color Syötelistan väri Feeds list background Syötelistan taustaväri News list color Uutislistan väri News list background Uutislistan taustaväri Focused news color Kohdistetun uutisen väri Focused news background color Kohdistetun uutisen taustaväri Link color Linkin väri Title color Otsikon väri Date color Päivämäärän väri Author color Tekijän väri News text color Uutistekstin väri News title background Uutisotsikon tausta News background Uutisen tausta Feed with new news Syöte jossa uusia uutisia Count of unread news in feeds tree Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view Text color of new news Uusien uutisten tekstin väri Show feeds tree toggle Clear new status when minimize to tray Set focus on the last opened news Set focus at the top of news list Set focus on the unread news Open the news Default news filter: Action on feed opening: Show news description instead of loading web page Text color of unread news Lukemattomien uutisten tekstin väri Focused feed color Kohdistetun syötteen väri Focused feed background color Kohdistetun syötteen taustaväri Standard Normaali Fixed Tasalevyinen Serif Serif Sans Serif Sans Serif Cursive Kursiivi Fantasy Fantasia Default font size Oletus fonttikoko Fixed font size Tasalevyisen fontin koko Minimum font size Minimi fonttikoko Minimum logical font size Minimi looginen fonttikoko Font families: Fonttiryhmät: Font sizes: Fonttikoot: Fonts Kirjasimet Fonts Browser Fonttiselain Colors Värit Filter Suodatin Action Toiminto Description Kuvaus Shortcut Pikanäppäin Shortcut: Pikanäppäin: Open File... Avaa tiedosto... Select Style Sheet File Valitse tyylitiedosto Open Directory... Avaa kansio... Add site to whitelist Lisää sivu sallittujen listalle Site without 'http://' (ex. youtube.com) Sivu ilman protokollaa (esim. youtube.com) QAbstractSpinBox &Step up Siirrä ylös Step &down Siirrä alas &Select All Valitse kaikki QDialogButtonBox Close Sulje Cancel Peruuta &Yes Kyllä &No Ei QFtp Not connected Ei yhdistetty Host %1 not found Isäntää %1 ei löydetty Connection refused to host %1 Yhteyttä ei sallittu isäntään %1 Connection timed out to host %1 Yhteys aikakatkaistiin isäntään %1 Connected to host %1 Yhdistetty isäntään %1 Connection refused for data connection Datayhteyttä ei sallittu Unknown error Tuntematon virhe Connecting to host failed: %1 Yhdistäminen isäntään epäonnistui: %1 Login failed: %1 Kirjautuminen epäonnistui: %1 Listing directory failed: %1 Kansiolistaus epäonnistui: %1 Changing directory failed: %1 Kansion vaihtaminen epäonnistui: %1 Downloading file failed: %1 Tiedoston lataus epäonnistui: %1 Uploading file failed: %1 Tiedoston lähetys epäonnistui: %1 Removing file failed: %1 Tiedoston poistaminen epäonnistui: %1 Creating directory failed: %1 Kansion luonti epäonnistui: %1 Removing directory failed: %1 Kansion poistaminen epäonnistui: %1 Connection closed Yhteys katkaisu QLineEdit &Undo Kumoa &Redo Toista Cu&t Leikkaa &Copy Kopioi &Paste Liitä Delete Poista Select All Valitse kaikki QMultiInputContext Select IM Valitse IM QObject Cannot start external program Ei voitu ajaa ulkoista sovellusta Cannot start external program! %1 Ei voitu ajaa ulkoista sovellusta! %1 Error QTextControl &Undo Kumoa &Redo Toista Cu&t Leikkaa &Copy Kopioi &Paste Liitä Delete Poista Select All Valitse kaikki Copy &Link Location Kopioi &linkin sijainti QWizard Cancel Peruuta < &Back < &Edellinen &Finish &Lopeta &Next > &Seuraava > RSSDetectionWidget Untitled feed RequestFeed Server requires authentication! Palvelin vaatii kirjautumisen! Server replied: Not Found! Palvelin vastasi: Ei löytynyt! Redirect error! Uudelleenohjaus -virhe! Request timeout! Pyyntö aikakatkaistiin! SQLiteDriver Error opening database Error closing database Unable to begin transaction Unable to commit transaction Unable to rollback transaction SQLiteResult Unable to fetch row No query Unable to execute statement Unable to execute multiple statements at a time Unable to reset statement Unable to bind parameters Parameter count mismatch SslErrorDialog SSL Certificate Error! Only for this session UpdateAppDialog Check for Updates Tarkista päivitykset Checking for updates... Tarkistetaan päivityksiä... Loading history... Ladataan historiaa... Don't remind about this version Älä muistuta tästä versiosta &Install &Asenna You already have the latest version Sinulla on jo uusin versio A new version of QuiteRSS is available! Uusi versio QuiteRSS:stä on saatavilla! Click here to go to the download page Klikkaa tästä avataksesi lataussivun Your version is: Sinun versiosi: Current version is: Nykyinen versio: Error checking updates Virhe tarkistettaessa päivityksiä quiterss-0.18.3/lang/quiterss_fr.ts000066400000000000000000005562661265173051100173460ustar00rootroot00000000000000 AboutDialog About À propos Revision Révision Version Version QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS est un agrégateur de flux RSS/Atom multiplate-forme open-source Includes: Inclut : Application directory: Répertoire de l'application : Resource directory: Répertoire des ressources : Data directory: Répertoire des données : Backup directory: Répertoire de sauvegarde : Database file: Fichier de la base de données : Settings file: Fichier des paramètres : Log file: Fichier du journal Authors Auteurs History Histoire License Licence Information Information AdBlockAddSubscriptionDialog Add Subscription Ajouter un abonnement Title: Titre : Address: Adresse : Add new subscription to AdBlock: Ajouter un nouvel abonnement à AdBlock : AdBlockCustomList Custom Rules Règles personnalisées AdBlockDialog AdBlock Configuration Configuration d'AdBlock Enable AdBlock Activer AdBlock Search... Recherche... Options Options AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Utilisez seulement une partie essentielle de EasyList (pour des raisons de performances) Add Rule Ajouter une règle Remove Rule Supprimer la règle Add Subscription Ajouter un abonnement Remove Subscription Supprimer l'abonnement Update Subscriptions Mise à jour abonnements Learn about writing rules... Apprendre sur l'écriture de règles... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock vous permet de bloquer des contenus non désirés sur les pages Web AdBlock AdBlock Show AdBlock &Settings Afficher AdBlock et paramètres Disable on %1 Désactiver sur %1 Disable only on this page Désactiver uniquement pour ​​cette page Blocked Popup Windows Fenêtres popup bloquées %1 with (%2) %1 avec (%2) No content blocked Pas de contenu bloqué Blocked URL (AdBlock Rule) - click to edit rule URL bloquée (règle AdBlock) - cliquez pour modifier la règle AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Ne peut pas charger abonnement ! AdBlockTreeWidget Add Rule Ajouter une règle Remove Rule Supprimer la règle Add Custom Rule Ajouter une règle personnalisée Please write your rule here: S'il vous plaît écrivez votre règle ici : %1 (recently updated) %1 (récemment mis à jour) %1 (Error: %2) %1 (Erreur : %2) AddFeedWizard Add Feed Ajouter un flux Create New Feed Créer un nouveau flux Use title of the feed as displayed name Utiliser le titre du flux comme nom affiché Server requires authentication: Le serveur requiert une authentification : Username: Nom d'utilisateur : Password: Mot de passe : Feed URL or website address: URL du flux ou adresse du site Web : Feeds Flux All Feeds Tous les flux New Folder... Nouveau dossier... Displayed name: Nom affiché : Location: Emplacement : URL error! Erreur d'URL ! Duplicate feed! Flux en double ! Can't find feed URL! Impossible de trouver l'URL du flux ! Request failed! La requête a échoué ! AddFolderDialog Add Folder Ajouter un dossier Feeds Flux All Feeds Tous les flux Name: Nom : Location: Emplacement : AuthenticationDialog Save password Enregistrer le mot de passe Authorization required Autorisation requise Server: Serveur : Message: Message : Username: Nom d'utilisateur : Password: Mot de passe : CategoriesTreeWidget Unread Non lu Starred Étoilé Deleted Supprimé Labels Étiquettes Open in New Tab Ouvrir dans un nouvel onglet Clear 'Deleted' Effacer « Supprimé » Mark Read Marquer comme lu CleanUpWizard Clean Up Nettoyer Choose Feeds Choisir les flux All Feeds Tous les flux Clean Up Options Nettoyer Options Maximum age of news in days to keep: Âge maximum des articles en jours à garder : Maximum number of news to keep: Nombre maximum d'articles à garder : Delete read news Supprimer les articles lus Never delete unread news Ne jamais supprimer les articles non lus Never delete starred news Ne jamais supprimer les articles étoilés Never delete labeled news Ne jamais supprimer les articles étiquetés Clean up 'Deleted' Nettoyer « Supprimé » Purge DB Purger la BD Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Supprimer totalement les archives qui étaient marqués « supprimé » de la BD. Les anciens articles pourraient réapparaître Information Information Clean Up wizard deleted %1 news L'assistant Nettoyeur a supprimé 1% nouvelles ClickToFlash Object blocked by ClickToFlash Objet bloqué par ClickToFlash Hide object Cacher l'objet Add '%1' to whitelist Ajouter « %1 » à la liste blanche CustomizeToolbarDialog Customize Main Toolbar Configurer la barre d'outils principale Customize Feeds Toolbar Configurer la barre d'outils des flux Customize News Toolbar Configurer la barre d'outils des articles Load images Charger les images Separator Séparation Icon Icônes seules Text Texte seul Text Beside Icon Texte contre les icônes Text Under Icon Texte sous les icônes Big Grande Normal Moyenne Small Petite Style: Style : Icon Size: Taille des icônes : Add Ajouter Remove Supprimer Move up Vers le haut Move down Vers le bas Default Par défaut DownloadItem Remaining time unavailable Temps restant non disponible Error: Cannot write to file! Erreur : impossible d'écrire dans le fichier ! Error: Erreur : few seconds quelques secondes seconds secondes minutes minutes hours heures Unknown size Taille inconnue Unknown speed Vitesse inconnue %2 - unknown size (%3) %2 - taille inconnue (%3) Remaining %1 - %2 of %3 (%4) Restant %1 - %2 de %3 (%4) Cancelled - %1 Annulé - %1 Delete file Supprimer le fichier Do you want to also delete downloaded file? Voulez-vous supprimer aussi fichier téléchargé ? Open File Ouvrir fichier Open Folder Ouvrir dossier Copy Download Link Copier le lien de téléchargement Cancel Downloading Annuler le téléchargement Remove Supprimer Cancelled Annulé Error Erreur Not found Pas trouvé Sorry, the file %1 was not found! Désolé, le fichier 1% n'a pas été trouvé ! DownloadManager Clear Effacer File %1 (*.%2) Fichier %1 (*.%2) All Files (*.*) Tous les fichiers (*.*) Save As... Enregistrer sous... Executable: Exécutable : Arguments: Arguments : FeedPropertiesDialog Properties Propriétés General Général Columns Colonnes Authentication Authentification Status État Title: Titre : Homepage: Page d'accueil : Feed URL: URL du flux : Load Title Charger le titre Load Favicon Charger Favicon Select Icon... Sélectionner une icône... Select Icon Sélectionner une icône Disable update Désactiver la mise à jour Automatically update every Mettre à jour automatiquement toutes les seconds secondes minutes minutes hours heures Starred Étoilé Load images Charger les images Display in new tab on startup Montrer dans un nouvel onglet au démarrage Show news' description instead of loading web page Afficher la description des articles au lieu de charger la page web Automatically delete duplicate news Supprimer automatiquement les articles en double Display Afficher Reading Lecture Enable JavaScript Activer JavaScript Right-to-left layout Disposition de droite à gauche Ascending Croissant Descending Décroissant Sort by: Trier par : Add Ajouter Remove Supprimer Move up Déplacer vers le haut Move down Déplacer vers le bas Default Par défaut Server requires authentication: Le serveur requiert une authentification : Username: Nom d'utilisateur : Password: Mot de passe : Feeds count: Décompte des flux : Description: Description : Status: Statuts : Created: Créé : Last update: Dernière mise à jour : News count: Nombre d'articles : Good Bon Long ago ;-) Il y a longtemps ;-) new nouveau(x) unread non lu(s) Image files Fichiers image Select Image Sélectionner une image Load icon: can't open a file! Charger icône : impossible d'ouvrir un fichier ! FilterRulesDialog Filter Rules Règles de filtrage Feeds Flux All Feeds Tous les flux Filter name: Nom du filtre : Match all news Correspondre à tous des articles Match all conditions Correspondre à toutes les conditions Match any condition Correspondre à n'importe quelle condition Perform these actions: Effectuer ces actions : Please enter name for the filter. Introduisez un nom pour le filtre. Please enter search condition for the news filter. Introduisez une condition de recherche pour le filtre. FindFeed Find Name Trouver le nom Find Link Trouver le lien FindTextContent Find in News Chercher dans l'article Find in Titles Chercher dans le titre Find in Authors Chercher dans les auteurs Find in Categories Chercher dans les catégories Find in Descriptions Trouver dans les descriptions Find in Links Trouver dans les liens Find in Browser Chercher dans le navigateur FtpDownloader Canceled! Annulé ! ItemAction Mark News as Read Marquer l'article comme lu Add Star Ajouter étoile Delete Supprimer Add Label Ajouter une étiquette Play a Sound Jouer un son Show News in Notifier Voir les articles dans le notifieur Browse Naviguer Play Jouer Add Action Ajouter une action Delete Action Supprimer action Open File... Ouvrir un fichier... ItemCondition Title Titre Description Description Author Auteur Category Catégorie State État Link Lien News Articles New Nouveau Read Lu Starred Étoilé Add Condition Ajouter une condition Delete Condition Supprimer condition contains contient doesn't contains ne contient pas is est isn't n'est pas begins with commence par ends with se termine par Regular expressions Expressions régulières LabelDialog New Label Nouvelle étiquette Load icon... Charger une icône... Default Par défaut Select color... Sélectionner une couleur... Name: Nom : Icon: Icône : Color text: Couleur du texte : Color background: Couleur du fond : Image files Fichiers image Select Image Sélectionner une image Load icon: can't open a file! Charger icône : impossible d'ouvrir un fichier ! MainApplication Saving data... Sauvegarde des données... MainWindow &AdBlock &AdBlock Hide Categories Cacher les catégories Show Categories Afficher les catégories Select OPML-File Sélectionner un fichier OPML OPML-Files (*.%1 *.%2) Fichiers OPML (*.%1 *.%2) Import canceled Importation annulée Import: can't open a file Importation : impossible d'ouvrir un fichier OPML-Files (*.%1) Fichiers OPML (*.%1) Export canceled Exportation annulé Export: can't open a file Exportation : impossible d'ouvrir un fichier Unread: %1 Non lus : %1 All: %1 Tous : %1 (Browser) (Navigateur) New News: %1 Articles nouveaux : %1 Unread News: %1 Articles non lus : %1 &Add &Ajouter Add New Feed Ajouter un nouveau flux &Feed... &Flux... F&older... D&ossier... Add New Folder Ajouter un nouveau dossier Open in New Tab Ouvrir dans un nouvel onglet &Delete... &Supprimer... Delete Selected Feed Supprimer le flux sélectionné &Import Feeds... &Importer des flux... Import Feeds from OPML File Importer les flux d'un fichier OPML &Export Feeds... &Exporter des flux... Export Feeds to OPML File Exporter les flux vers un fichier OPML E&xit &Quitter Update Feed Mettre à jour le flux Update Current Feed Mettre à jour le flux actuel Update All Mettre à jour tous Update All Feeds Mettre à jour tous les flux Mark All Feeds Read Marquer tous les flux lus Mark Read/Unread Marquer lu/non lu Mark Current News Read/Unread Marquer l'article actuel lu/non lu Mark All News Read Marquer tous les articles lus Downloads Téléchargements Clean Up... Nettoyer... News Filters... Filtre des articles... Filter News... Filtrer les articles... Options... Options... Open Options Dialog Ouvrir la boîte de dialogue de configuration Filter Feeds Filtrer les flux Show All Afficher tous Show New Afficher le nouveau Show Unread Afficher non lus Show Starred Feeds Afficher les flux étoilés Show Not Working Feeds Afficher les flux ne fonctionnant pas Filter News Filtrer les articles Show Starred Afficher étoilés Show Not Starred Afficher non étoilés Show Unread or Starred Afficher non lus ou étoilés Show Last Day Afficher le dernier jour Show Last 7 Days Afficher les 7 derniers jours About... À propos... Show 'About' Dialog Afficher la boîte de dialogue « À propos » Check for Updates... Vérifier les mises à jour... Report a Problem... Rapporter un problème... Open News Ouvrir l'article Open in Browser Ouvrir dans un navigateur internet Open in External Browser Ouvrir dans un navigateur internet externe Open News in External Browser Ouvrir l'article dans un navigateur internet externe Open News in New Tab Ouvrir article dans un nouvel onglet Open in Background Tab Ouvrir dans un onglet d'arrière-plan Open News in Background Tab Ouvrir article dans un onglet d'arrière-plan Star Étoile Mark News Star Marquer l'article comme étoilé Delete Supprimer Delete Selected News Supprimer l'article sélectionné Delete All News Supprimer tous les articles Delete All News from List Supprimer tous les articles de la liste Restore Restaurer Restore News Restaurer l'article Copy Link Copier le lien Restore last deleted news Restaurer le dernier article supprimé Mark Read Marquer lu Mark Feed Read Marquer le flux lu Properties Propriétés &File &Fichier Count Unread News Compter les articles non lus Count All News Compter tous les articles Last Update Dernière mise à jour Reset browser zoom Réinitialiser le zoom du navigateur Print Web Page Imprimer la page web Preview Web Page Aperçu de la page web Save page in database Sauvegarder la page dans la base de données Save page in database instead of news description Sauvegarder la page dans la base de données à la place de la description des articles Confirm Delete Confirmer la suppression Are you sure to delete selected elements? Êtes-vous sûr(e) de vouloir supprimer les éléments sélectionnés ? Menu Menu Add Feed... Ajouter un flux... &Create Backup... &Créer une sauvegarde... S&how Menu Bar Voir la barre de menu Stop Update Feeds Arrêter la mise à jour des flux Open News Description Ouvrir la description de l'article Copy News Link Copier le lien de l'article &View Afficha&ge Fee&ds F&lux &News A&rticles &Browser &Navigateur &Tools &Outils &Help &Aide Main Toolbar Barre d'outils principale Customize Toolbar Configurer la barre d'outils Main Toolbar... Barre d'outils principale... Customize Toolbar... Configurer la barre d'outils... Feeds Toolbar... Barre d'outils des flux... News Toolbar... Barre d'outils des articles... Lock Toolbar Verrouiller la barre d'outils Hide Toolbar Cacher la barre d'outils Layout Agencement Classic Classique Newspaper Journal Application Style Style de l'application System Système System2 Système2 Green Vert Orange Orange Purple Pourpre Pink Rose Gray Gris Browser Position Position du navigateur Top En haut Bottom En bas Right À droite Left À gauche Show Window Afficher la fenêtre Previous Feed Flux précédent Next Feed Flux suivant Previous News Article précédent Next News Article suivant News Page Up Page suivante articles News Page Down Page précédente articles Next Unread News Article non lu suivant Previous Unread News Article non lu précédent Switch Focus to Next Panel Basculer le focus au panneau suivant Switch Focus to Next Panel (Tree Feeds, List News, Browser) Basculer le focus au panneau suivant (arborescence des flux, liste des articles, navigateur) Switch Focus to Previous Panel Basculer le focus au panneau précédent Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Basculer le focus au panneau précédent (arborescence des flux, navigateur, liste des articles) Show/Hide Tree Feeds Afficher/cacher arborescence des flux Minimize to Tray Minimiser vers la boîte à miniatures Minimize Application to Tray Minimiser application vers la boîte à miniatures Columns Colonnes Show Indentation Afficher indentation Search Feed Recherche flux Zoom Zoom Zoom In Agrandir Zoom in in browser Agrandir dans le navigateur Zoom Out Rétrécir Zoom out in browser Rétrécir dans le navigateur 100% 100% Print... Imprimer... Print Preview... Aperçu avant impression... Page up (Browser) Page avant (Navigateur) Page down (Browser) Page après (Navigateur) Save As... Enregistrer sous... Save Page As... Enregistrer la page sous... Show/Hide Afficher/Cacher Feeds Toolbar Barre d'outils des flux News Toolbar Barre d'outils des articles Browser Toolbar Barre d'outils du navigateur Panel Categories Panneau des catégories Status Bar Barre de statut Full Screen Plein écran Stay On Top Rester au-dessus Categories Catégories Label Étiquette Show labels menu Afficher le menu étiquettes Close Tab Fermer l'onglet Close Other Tabs Fermer les autres onglets Close All Tabs Fermer tous les onglets Switch to next tab Passer à l'onglet suivant Switch to previous tab Passer à l'onglet précédent Unread Non lus Starred Étoilés Deleted Supprimés Labels Étiquettes Decrease news list/increase browser Réduire la liste des articles/agrandir le navigateur Increase news list/decrease browser Agrandir la liste des articles/réduire le navigateur Find Trouver Open Homepage Feed Ouvrir la page d'accueil du flux Sort by Name Trier par nom Collapse All Folders Réduire tous les dossiers Expand All Folders Développer tous les dossiers Next Folder Dossier suivant Previous Folder Dossier précédant Expand Folder Développer le dossier Setting Page: Labels Mise en page : étiquettes Share Partager Sort By Trié par Ascending Croissant Descending Décroisant Check for updates Vérifier les mises à jour A new version of QuiteRSS... Une nouvelle version de QuiteRSS... Loading... Chargement en cours... Web Page Page web Save As Enregistrer sous HTML-Files (*.%1) Fichiers HTML (*.%1) Text files (*.%2) Fichiers texte (*.%2) Save As: can't open a file Enregistrement : impossible d'ouvrir un fichier Choose Directory Choisir le répertoire Important Important Work Travail Personal Personnel To Do À faire Later Plus tard Amusingly Amusant NetworkManager SSL Certificate Error! Erreur de certificat SSL ! The "%1" server has the following errors in the SSL certificate: Le serveur « %1 » a les erreurs suivantes dans le certificat SSL : <b>Organization: </b> <b>Organisation : </b> <b>Domain Name: </b> <b>Nom de domaine : </b> <b>Expiration Date: </b> <b>Date d'expiration : </b> <b>Error: </b> <b>Erreur : </b> Would you like to make an exception for this certificate? Voulez-vous faire une exception pour ce certificat ? NewsFiltersDialog News Filters Filtres des articles Feeds Flux Filter Name Nom du filtre New... Nouveau... Edit... Édition... Delete... Supprimer... Move up Vers le haut Move down Vers le bas Run Filter Activer le filtre Delete Filter Supprimer filtre Are you sure you want to delete the filter '%1'? Êtes-vous sûr(e) de vouloir supprimer le filtre « %1 » ? NewsHeader Icon Feed Icône flux Title Titre Published Publié Received Reçu Author Auteur Category Catégorie Read Lu Star Étoile Label Étiquette Feed Title Titre du flux Link Lien NewsItem Mark Read/Unread Marquer lu/non lu Delete News Supprimer les articles NewsTabWidget Loading... (%p%) Chargement en cours... (%p%) Home Maison Open Page in External Browser Ouvrir la page dans un navigateur externe Open Link in External Browser Ouvrir le lien dans un navigateur externe Open Link Ouvrir le lien Open in New Tab Ouvrir dans un nouvel onglet Save Link... Enregistrer le lien... Save Image... Enregistrer l'image... Copy Link Copier le lien Copy Copier Go Back Précédent Go Forward Suivant Stop Arrêter Reload Recharger Copy Image Copier l'image Copy Image Address Copier l'adresse de l'image Load Images Charger les images Auto Load Images to News View Charger automatiquement les images dans la vue articles No Load Images Ne pas charger les images No Load Images to News View Ne pas charger automatiquement les images dans la vue articles Close Tab Fermer onglet Auto Load Images in News View Charger automatiquement les images dans les articles Don't Load Images Ne pas charger les images Don't Load Images in News View Ne pas charger les images dans les articles Comments Commentaires Author: %1 Auteur : %1 audio audio video vidéo media média Link to Lien vers Mark Read/Unread Marquer lu/non lu Mark News Star Marquer l'article comme étoilé Label Étiquette Share Partager Open News in External Browser Ouvrir l'article dans un navigateur internet externe Delete Supprimer NotificationWidget Close Fermer Mark All News Read Marquer tous les articles comme lus Previous Page Page précédente Next Page Page suivante Incoming News: %1 Articles entrants : %1 Page %1 of %2 Page %1 de %2 OptionsDialog Options Configuration General Général System Tray Boîte à miniatures Network Connections Connexions réseau Browser Navigateur Feeds Flux Labels Étiquettes Notifications Notifications Passwords Mots de passe Language Langue Fonts & Colors Polices & couleurs Keyboard Shortcuts Raccourcis clavier Warning: key is already assigned to Attention : la clé est déjà attribué à Show splash screen on startup Afficher l'écran de démarrage Reopen last opened feeds on startup Rouvrir au démarrage les flux ouverts la dernière fois Open new tab next to active Ouvrir un nouvel onglet à côté de l'actif Hide feeds tree when opening tabs Cacher l'arborescence des flux lors de l'ouverture des onglets Show default rss-icon instead of favourite one Afficher l'icône RSS par défaut au lieu du favori Automatically collapse folders Réduire automatiquement les dossiers Show close button on tab Afficher le bouton fermer sur l'onglet Automatically check for updates Vérifier automatiquement les mises à jour Help improve QuiteRSS by sending usage information Aidez à améliorer QuiteRSS en envoyant des informations d'utilisation Store a DB in memory (requires program restart) Stocker une base de données dans la mémoire (nécessite le redémarrage du programme) Save DB stored in memory to file every Sauvegarder la BD en mémoire dans un fichier chaque minutes minutes Run QuiteRSS at Windows startup Exécuter QuiteRSS au démarrage de Windows Show system tray icon Afficher l'icône dans la boîte à miniatures starting QuiteRSS lors du démarrage de QuiteRSS minimizing QuiteRSS lors de la minimisation de QuiteRSS closing QuiteRSS lors de l'arrêt de QuiteRSS Show static icon Afficher icône statique Change icon for incoming new news Changer l'icône quand il y a de nouveaux articles Show count of new news Afficher le nombre d'articles nouveaux Show count of unread news Afficher le nombre d'articles non lus Single click instead of double click for show window Clic simple au lieu de clic double pour afficher une fenêtre Empty working set on minimize to tray Effacer ensemble de travail lors du passage à la boîte à miniatures Move to the system tray when: Passer à la boîte à miniatures : Tray icon behavior: Comportement de l'icône dans la boîte à miniatures : Direct connection to the Internet Connexion directe à internet System proxy configuration (if available) Configuration globale du serveur mandataire (si disponible) Manual proxy configuration: Configuration manuelle du serveur mandataire (proxy) : Proxy server: Serveur mandataire (proxy) : Port: Port : Username: Nom d'utilisateur : Password: Mot de passe : Request timeout: Délai de la requête dépassé : Number of requests: Nombre de requêtes : Number of retries: Nombre de tentatives : Options network requests when updating feeds (requires program restart): Options des requêtes réseau lors de l'actualisation des flux (nécessite le redémarrage du programme) : Use embedded browser Utiliser le navigateur intégré Use external browser Utiliser un navigateur externe Default external browser Navigateur externe par défaut Following external browser: Navigateur externe suivant : Browse... Naviguer... Load images Charger les images Enable JavaScript Activer JavaScript Enable plug-ins Activer les modules externes Open links in embedded browser in background Ouvrir les liens dans le navigateur intégré en arrière-plan Open links in external browser in background (experimental) Ouvrir les liens dans un navigateur externe en arrière-plan (expérimental) Default zoom on pages: Zoom par défaut sur ​​les pages : Browser selection: Sélection du navigateur : External browser: Navigateur externe : Content: Contenu : User style sheet: Feuille de style de l'utilisateur : Maximum pages in cache Nombre maximal de pages dans le cache Store cache in: Stocker le cache dans : Maximum size of disk cache Taille maximale du cache disque MB Mio Use disk cache Utiliser le cache disque Allow local data to be set Permettre aux données locales d'être fixées Keep local data only until quit application Conserver les données locales que jusqu'à la fermeture de l'application Block sites from setting any data Interdire aux sites de stocker des données Clear Effacer Cookies: Cookies : Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. « Cliquez pour Flasher » est un plugin qui bloque le chargement automatique des contenus Flash de la page. Vous pouvez toujours les charger manuellement en cliquant sur l'icône « Jouer Flash ». Use Click to Flash Utiliser « Cliquez pour Flasher » Add... Ajouter... Remove... Supprimer... Ask where to save each file before downloading Demander où enregistrer les fichiers avant de les télécharger Download location: Emplacement téléchargements : History Historique Click to Flash Cliquez pour Flasher Downloads Téléchargements Automatically update the feeds on startup Mettre automatiquement les flux à jour au démarrage Automatically update the feeds every Mettre automatiquement les flux à jour toutes les seconds secondes hours heures Nothing to do Ne rien faire Dec Déc December Décembre Display format for date: Format d'affichage de la date : time: heure : Alternating row background colors Alterner les couleurs d'arrière-plan des lignes Simplified representation of date and time Représentation simplifiée de la date et de l'heure Show All Afficher tout Show New Afficher nouvelle Show Unread Afficher non lu Show Starred Afficher étoilé Show Not Starred Afficher non étoilé Show Unread or Starred Afficher non lu étoilé Show Last Day Afficher le dernier jour Show Last 7 Days Afficher les 7 derniers jours Style sheet for news: Feuille de style pour les nouvelles : Mark news as read: Marquer l'article comme lu : on selecting. With timeout à la sélection. Avec une temporisation after switching to another news en passant à un autre article Mark displayed news as read when switching feeds Marquer les articles affichés comme lus lors du passage à un autre flux Mark displayed news as read when closing tab Marquer les articles affichés comme lus lors de la fermeture de l'onglet Mark displayed news as read on minimize Marquer les articles affichés comme lus lors du passage à la boîte à miniatures Change behavior of action 'Next Unread News' Changer le comportement de l'action « Article non lu suivant » starred news articles étoilés labeled news articles étiquetés Automatically mark identical news as read Marquer automatiquement les articles identiques comme lus Prevent accidental deletion of: Éviter toute suppression accidentelle de : Enable cleanup on shutdown Activer le nettoyage à l'arrêt Maximum age of news in days to keep: Âge maximal en jours des articles à conserver : Maximum number of news to keep: Nombre maximal des articles à conserver : Delete read news Supprimer les articles lus Never delete unread news Ne jamais supprimer les articles non lus Never delete starred news Ne jamais supprimer les articles étoilés Never delete labeled news Ne jamais supprimer les articles étiquetés Clean up 'Deleted' Nettoyer « Supprimé » Enable DB optimization (slower shutdown) Activer l'optimisation de la BD (arrêt lent) Reading Lecture Clean Up Nettoyage New... Nouveau... Edit... Édition... Delete... Supprimer... Move up Vers le haut Move down Vers le bas Show when inactive main window Montrer quand la fenêtre principale est inactive Screen Écran Transparency Transparence Show titles feeds Montrer les titres des flux Show icon feed Montrer l'icône flux Show button 'Mark All News Read' Voir le bouton « Marquer tous les articles comme lus » Show button 'Mark Read/Unread' Voir le bouton « Marquer lu/non lu » Show button 'Open in External Browser' Voir le bouton « Ouvrir dans un navigateur internet externe » Show button 'Delete News' Voir le bouton "Supprimer les articles" Play sound for incoming new news Jouer un son lors de l'arrivée de nouveaux articles Play Jouer Display notification for incoming news Afficher la notification pour les articles entrants Top Left En haut à gauche Top Right En haut à droite Bottom Left En bas à gauche Bottom Right En bas à droite Review Réviser Position Position Show maximum of Afficher un maximum de item on page notification article sur la page de notification Width list items Largeur de la liste articles pixels pixels Close notification after Fermer la notification après Do not show notification in fullscreen mode Ne pas afficher les notifications en mode plein écran Display Affichage Action mouse on news opening: Action de la souris à l'ouverture des articles : Single Click: Simple clique : Double Click: Double clique : Middle Click: Clique du milieu : Only show selected feeds: Afficher seulement les flux sélectionnés : Notification Notification Sound Son Selection of feeds Sélection des flux All Feeds Tous les flux Site Site User Utilisateur Password Mot de passe Delete Supprimer Delete All Supprimer tous Show Passwords Afficher les mots de passe Version Version Author Auteur Contact Contact Choose language: Choisir une langue : Type Type Font Police Feeds list font Police de la liste des flux News list font Police de la liste des articles News title font Police du titre des articles News text font Police du texte des articles Notification font Police de la notification Change... Modifier... Reset Réinitialiser Feeds list color Couleur de la liste des flux Feeds list background Fond de la liste des flux News list color Couleur de la liste des articles News list background Fond de la liste des articles Focused news color Couleur des articles ciblés Focused news background color Couleur de fond des articles ciblés Link color Couleur lien Title color Couleur titre Date color Couleur date Author color Couleur auteur News text color Couleur du texte des articles News title background Fond du titre de l'article News background Fond d'article Feed with new news Flux avec de nouveaux articles Count of unread news in feeds tree Compter les articles non lus dans l'arbre des flux Disabled feed Flux désactivé Alternating row colors Couleurs alternantes des lignes Notification text color Couleur du texte des notifications Notification background color Couleur de fond des notifications Auto load images in news view Charger automatiquement les images dans les articles Text color of new news Couleur texte des nouveaux articles Show feeds tree toggle Voir l'arbre des flux basculer Clear new status when minimize to tray Effacer l'état nouveau lors du passage à la boîte à miniatures Set focus on the last opened news Mettre le focus sur le dernier article lu Set focus at the top of news list Mettre le focus sur le sommet de la liste des articles Set focus on the unread news Mettre le focus sur les articles non lus Open the news Ouvrir les articles Default news filter: Filtre par défaut de nouvelles : Action on feed opening: Action à l'ouverture de flux : Show news description instead of loading web page Afficher la description des articles au lieu de charger la page web Text color of unread news Couleur texte des articles non lus Focused feed color Couleur du flux ciblé Focused feed background color Couleur de fond du flux ciblé Standard Standard Fixed Corrigé Serif Sérif Sans Serif Sans Sérif Cursive Cursive Fantasy Fantaisie Default font size Taille de police par défaut Fixed font size Taille de police fixe Minimum font size Taille minimale des polices Minimum logical font size Taille minimale logique des polices Font families: Familles des polices : Font sizes: Tailles de la police : Fonts Polices Fonts Browser Polices navigateur Colors Couleurs Filter Filtre Action Action Description Description Shortcut Raccourci Shortcut: Raccourci : Open File... Ouvrir fichier... Select Style Sheet File Sélectionnez une feuille de style Open Directory... Ouvrir le répertoire... Add site to whitelist Ajouter le site à la liste blanche Site without 'http://' (ex. youtube.com) Site sans « http:// » (ex. youtube.com) QAbstractSpinBox &Step up &Augmenter Step &down &Diminuer &Select All Tout &sélectionner QDialogButtonBox Close Fermer Cancel Annuler &Yes &Oui &No &Non QFtp Not connected Pas connecté Host %1 not found Hôte %1 non trouvé Connection refused to host %1 Connexion refusée pour l’hôte %1 Connection timed out to host %1 Délai de connexion dépassé pour l’hôte %1 Connected to host %1 Connecté à l'hôte %1 Connection refused for data connection Connexion refusée pour une connexion de données Unknown error Erreur inconnue Connecting to host failed: %1 Échec de connexion à l’hôte : %1 Login failed: %1 Échec de la connexion : %1 Listing directory failed: %1 Échec du listage du répertoire : %1 Changing directory failed: %1 Échec du changement du répertoire : %1 Downloading file failed: %1 Échec du téléchargement du fichier : %1 Uploading file failed: %1 Échec du téléchargement du fichier : %1 Removing file failed: %1 Échec de la suppression du fichier : %1 Creating directory failed: %1 Échec de la création du répertoire : %1 Removing directory failed: %1 Échec de la suppression du répertoire : %1 Connection closed Connexion fermée QLineEdit &Undo &Annuler &Redo &Rétablir Cu&t Co&uper &Copy Cop&ier &Paste Co&ller Delete Supprimer Select All Tout sélectionner QMultiInputContext Select IM Sélectionner la méthode de saisie QObject Cannot start external program Impossible de démarrer le programme externe Cannot start external program! %1 Impossible de démarrer le programme externe ! %1 Error Erreur QTextControl &Undo &Annuler &Redo &Rétablir Cu&t Co&uper &Copy Cop&ier &Paste Co&ller Delete Supprimer Select All Tout sélectionner Copy &Link Location Copier l'adresse du &lien QWizard Cancel Annuler < &Back < &Précédent &Finish &Terminer &Next > &Suivant > RSSDetectionWidget Untitled feed Flux sans titre RequestFeed Server requires authentication! Le serveur requiert une authentification ! Server replied: Not Found! Le serveur a répondu : Introuvable ! Redirect error! Erreur de redirection ! Request timeout! Dépassement de temps pour la requête ! SQLiteDriver Error opening database Erreur lors de l'ouverture de la base de données Error closing database Erreur lors de la fermeture de la base de données Unable to begin transaction Impossible d'initier la transaction Unable to commit transaction Impossible de valider la transaction Unable to rollback transaction Impossible d'annuler la transaction SQLiteResult Unable to fetch row Impossible de récupérer la ligne No query Pas de requête Unable to execute statement Impossible d'exécuter l'instruction Unable to execute multiple statements at a time Impossible d'exécuter plusieurs instructions à la fois Unable to reset statement Impossible de réinitialiser l'instruction Unable to bind parameters Impossible de lier des paramètres Parameter count mismatch Décalage du nombre de paramètres SslErrorDialog SSL Certificate Error! Erreur de certificat SSL ! Only for this session Seulement pour cette session UpdateAppDialog Check for Updates Vérifier les mises à jour Checking for updates... Vérification des mises à jour en cours... Loading history... Chargement de l'historique en cours... Don't remind about this version Ne pas rappeler cette version &Install &Installer You already have the latest version Vous avez déjà la dernière version A new version of QuiteRSS is available! Une nouvelle version de QuiteRSS est disponible ! Click here to go to the download page Cliquez ici pour aller à la page de téléchargement Your version is: Votre version est : Current version is: La version actuelle est : Error checking updates Erreur de vérification des mises à jour quiterss-0.18.3/lang/quiterss_gl.ts000066400000000000000000005510441265173051100173260ustar00rootroot00000000000000 AboutDialog About Acerca de Revision Revisión Version Versión QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS é un lector de novas RSS/Atom multiplataforma de código fonte aberto Includes: Inclúe: Application directory: Directorio da aplicación: Resource directory: Directorio de recursos: Data directory: Directorio de datos: Backup directory: Directorio da copia de seguranza: Database file: Ficheiro da base de datos: Settings file: Axustes do ficheiro: Log file: Ficheiro de rexistro: Authors Autores History Historial License Licenza Information Información AdBlockAddSubscriptionDialog Add Subscription Engadir subscrición Title: Título: Address: Enderezo: Add new subscription to AdBlock: Engadir nova subscrición a AdBlock: AdBlockCustomList Custom Rules Personalizar regras AdBlockDialog AdBlock Configuration Configuración de AdBlock Enable AdBlock Activar AdBlock Search... Procurar... Options Opcións AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Empregar só unha parte esencial de EasyList (por razóns de rendemento) Add Rule Engadir regra Remove Rule Eliminar regra Add Subscription Engadir subscrición Remove Subscription Eliminar subscrición Update Subscriptions Actualizar subscricións Learn about writing rules... Saber como definir regras... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock permíteche bloquear contido non desexado das páxinas web AdBlock AdBlock Show AdBlock &Settings Mostrar &axustes de AdBlock Disable on %1 Desactivar en %1 Disable only on this page Desactivar só nesta páxina Blocked Popup Windows Xanelas emerxentes bloqueadas %1 with (%2) %1 con (%2) No content blocked Non hai contido bloquedo Blocked URL (AdBlock Rule) - click to edit rule URL bloqueado (por unha regra de AdBlock) - preme para editar a regra AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Non se pode cargar a subscrición! AdBlockTreeWidget Add Rule Engadir regra Remove Rule Eliminar regra Add Custom Rule Engadir regra personalizada Please write your rule here: Por favor, escribe a túa regra aquí: %1 (recently updated) %1 (de recente actualización) %1 (Error: %2) %1 (Erro: %2) AddFeedWizard Add Feed Engadir canle Create New Feed Crear unha nova canle Use title of the feed as displayed name Utilizar o título da canle como o nome que se mostrará Server requires authentication: O servidor require autenticarse Username: Nome de usuario: Password: Contrasinal: Feed URL or website address: URL da canle ou enderezo web: Feeds Canles All Feeds Todas as canles New Folder... Novo cartafol... Displayed name: Nome para mostrar: Location: Localización: URL error! Erro no URL! Duplicate feed! Canle duplicada! Can't find feed URL! Non se pode atopar o URL da canle! Request failed! Erro de solicitude! AddFolderDialog Add Folder Engadir cartafol Feeds Canles All Feeds Todas as canles Name: Nome: Location: Localización: AuthenticationDialog Save password Gardar contrasinal Authorization required Autorización obrigatoria Server: Servidor: Message: Mensaxe: Username: Nome de usuario: Password: Contrasinal: CategoriesTreeWidget Unread Sen ler Starred Destacadas Deleted Eliminadas Labels Etiquetas Open in New Tab Abrir nunha nova lapela Clear 'Deleted' Baleirar 'Eliminadas' Mark Read Marcar como lida CleanUpWizard Clean Up Limpeza Choose Feeds Escoller canles All Feeds Todas as canles Clean Up Options Opcións de limpar Maximum age of news in days to keep: Número máximo de días para manter as novas: Maximum number of news to keep: Número máximo de novas para manter: Delete read news Eliminar novas lidas Never delete unread news Nunca eliminar novas sen ler Never delete starred news Nunca eliminar novas destacadas Never delete labeled news Nunca eliminar novas etiquetadas Clean up 'Deleted' Baleirar 'Eliminadas' Purge DB Purgar base de datos Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Elimnar totalmente os rexistros marcados como 'eliminados'. As novas antigas poderían reaparecer Information Información Clean Up wizard deleted %1 news O asistente Clean Up eliminou %1 novas ClickToFlash Object blocked by ClickToFlash Obxecto bloqueado por ClickToFlash Hide object Agochar obxecto Add '%1' to whitelist Sinalar '%1' como confiable CustomizeToolbarDialog Customize Main Toolbar Personalizar barra principal Customize Feeds Toolbar Personalizar barra de canles Customize News Toolbar Personalizar barra de novas Load images Cargar imaxes Separator Separador Icon Icona Text Texto Text Beside Icon Texto xunto a icona Text Under Icon Texto embaixo da icona Big Grande Normal Normal Small Pequeno Style: Estilo: Icon Size: Tamaño da icona: Add Engadir Remove Eliminar Move up Subir Move down Baixar Default Por defecto DownloadItem Remaining time unavailable Tempo restante non dispoñible Error: Cannot write to file! Erro: non se pode editar o ficheiro! Error: Erro: few seconds uns segundos seconds segundos minutes minutos hours horas Unknown size Tamaño descoñecido Unknown speed Velocidade descoñecida %2 - unknown size (%3) %2 - tamaño descoñecido (%3) Remaining %1 - %2 of %3 (%4) Faltan %1 - %2 de %3 (%4) Cancelled - %1 Cancelado - %1 Delete file Eliminar ficheiro Do you want to also delete downloaded file? Queres tamén eliminar o ficheiro descargado? Open File Abrir ficheiro Open Folder Abrir cartafol Copy Download Link Copiar ligazón de descarga Cancel Downloading Cancelar descarga Remove Eliminar Cancelled Cancelado Error Erro Not found Non se atopa Sorry, the file %1 was not found! Sentímolo, o ficheiro %1 non se atopou! DownloadManager Clear Limpar File %1 (*.%2) Ficheiro %1 (*.%2) All Files (*.*) Todos os ficheiros (*.*) Save As... Gardar como... Executable: Executable: Arguments: Argumentos: FeedPropertiesDialog Properties Propiedades General Xeral Columns Columnas Authentication Autenticación Status Estado Title: Título: Homepage: Páxina de inicio: Feed URL: URL da canle: Load Title Cargar título Load Favicon Cargar favicona Select Icon... Seleccionar icona... Select Icon Seleccionar icona Disable update Deshabilitar actualizacións Automatically update every Actualizar automaticamente cada seconds segundos minutes minutos hours horas Starred Destacadas Load images Cargar imaxes Display in new tab on startup Mostrar nunha nova lapela ao iniciar Show news' description instead of loading web page Mostrar a descrición das novas no canto de cargar a páxina web Automatically delete duplicate news Eliminar automaticamente as novas duplicadas Display Mostrar Reading Lectura Enable JavaScript Activar JavaScript Right-to-left layout Deseño de dereita a esquerda Ascending Ascendente Descending Descendente Sort by: Ordenar por: Add Engadir Remove Eliminar Move up Subir Move down Baixar Default Por defecto Server requires authentication: O servidor require autenticarse: Username: Nome de usuario: Password: Contrasinal: Feeds count: Número de canles: Description: Descrición: Status: Estado: Created: Creado: Last update: Última actualización: News count: Número de novas: Good Bo Long ago ;-) Antigo ;-) new nova unread sen ler Image files Ficheiros de imaxe Select Image Seleccionar imaxe Load icon: can't open a file! Cargar icona: non se pode abrir o ficheiro! FilterRulesDialog Filter Rules Regras de filtraxe Feeds Canles All Feeds Todas as canles Filter name: Nome do filtro: Match all news Coincidir todas as novas Match all conditions Cumprir todas as condicións Match any condition Cumprir calquera condición Perform these actions: Levar a cabo as seguintes accións: Please enter name for the filter. Por favor, indica un nome para o filtro. Please enter search condition for the news filter. Por favor, insire a condición para filtrar. FindFeed Find Name Procurar nome Find Link Procurar ligazón FindTextContent Find in News Procurar nas novas Find in Titles Buscar nos títulos Find in Authors Buscar nos autores Find in Categories Buscar nas categorías Find in Descriptions Buscar nas descricións Find in Links Buscar nas ligazóns Find in Browser Procurar no navegador FtpDownloader Canceled! Cancelada! ItemAction Mark News as Read Marcar novas como lidas Add Star Engadir a favoritos Delete Eliminar Add Label Engadir etiqueta Play a Sound Reproducir un son Show News in Notifier Mostrar novas no notificador Browse Explorar Play Reproducir Add Action Engadir acción Delete Action Eliminar acción Open File... Abrir ficheiro... ItemCondition Title Título Description Descrición Author Autor Category Categoría State Estado Link Ligazón News Novas New Nova Read Lidas Starred Destacadas Add Condition Engadir condición Delete Condition Eliminar condición contains contén doesn't contains non contén is é isn't non é begins with comeza con ends with remata en Regular expressions Expresións regulares LabelDialog New Label Nova etiqueta Load icon... Cargar icona... Default Por defecto Select color... Seleccionar cor... Name: Nome: Icon: Icona: Color text: Cor do texto: Color background: Cor de fondo: Image files Ficheiros de imaxe Select Image Seleccionar imaxe Load icon: can't open a file! Cargar icona: non se pode abrir o ficheiro! MainApplication Saving data... A gardar datos... MainWindow &AdBlock &AdBlock Hide Categories Agochar categorías Show Categories Mostrar categorías Select OPML-File Seleccionar ficheiro OPML OPML-Files (*.%1 *.%2) Ficheiros OPML (*.%1 *.%2) Import canceled Importación cancelada Import: can't open a file Importación: non se pode abrir o ficheiro OPML-Files (*.%1) Ficheiros OPML (*.%1) Export canceled Exportación cancelada Export: can't open a file Exportación: non se pode abrir o ficheiro Unread: %1 Sen ler: %1 All: %1 Todo: %1 (Browser) (Navegador) New News: %1 Noticias novas: %1 Unread News: %1 Novas sen ler: %1 &Add &Engadir Add New Feed Engadir nova canle &Feed... &Canle... F&older... &Cartafol... Add New Folder Engadir novo cartafol Open in New Tab Abrir nunha nova lapela &Delete... &Eliminar... Delete Selected Feed Eliminar a canle seleccionada &Import Feeds... &Importar canles... Import Feeds from OPML File Importar canles desde un ficheiro OPML &Export Feeds... &Exportar canles... Export Feeds to OPML File Exportar canles a un ficheiro OPML E&xit &Saír... Update Feed Actualizar canle Update Current Feed Actualizar canle actual Update All Actualizar todo Update All Feeds Actualizar todas as canles Mark All Feeds Read Marcar todas as canles como lidas Mark Read/Unread Marcar como lida/sen ler Mark Current News Read/Unread Marcar novas como lidas/sen ler Mark All News Read Marcar todas as novas como lidas Downloads Descargas Clean Up... Limpar... News Filters... Filtros de novas... Filter News... Filtrar novas... Options... Opcións... Open Options Dialog Abrir diálogo de opcións Filter Feeds Filtrar canles Show All Mostrar todo Show New Mostrar novas Show Unread Mostrar non lidas Show Starred Feeds Mostrar canles destacadas Show Not Working Feeds Mostrar canles que non están a funcionar Filter News Filtrar novas Show Starred Mostrar destacadas Show Not Starred Mostrar as non destacadas Show Unread or Starred Mostrar non lidas ou destacadas Show Last Day Mostrar novas do último día Show Last 7 Days Mostrar novas dos últimos 7 días About... Acerca de... Show 'About' Dialog Mostrar diálogo de información Check for Updates... Comprobar actualizacións... Report a Problem... Informar dun problema... Open News Abrir novas Open in Browser Abrir no navegador Open in External Browser Abrir nun navegador externo Open News in External Browser Abrir as novas nun navegador externo Open News in New Tab Abrir novas nunha nova lapela Open in Background Tab Abrir nunha lapela secundaria Open News in Background Tab Abrir novas nunha lapela secundaria Star Destacar Mark News Star Marcar noticias como destacadas Delete Eliminar Delete Selected News Eliminar novas seleccionadas Delete All News Eliminar todas as novas Delete All News from List Eliminar todas as novas da listaxe Restore Restaurar Restore News Restaurar novas Copy Link Copiar ligazón Restore last deleted news Restaurar as últimas novas eliminadas Mark Read Marcar como lida Mark Feed Read Marcar canle como lida Properties Propiedades &File &Ficheiro Count Unread News Número de novas sen ler Count All News Todas as novas Last Update Última actualización Reset browser zoom Restablecer zoom do navegador Print Web Page Imprimir páxina web Preview Web Page Previsualizar páxina web Save page in database Gardar páxina na base de datos Save page in database instead of news description Gardar a páxina na base de datos no canto da descrición Confirm Delete Confirmar a eliminación Are you sure to delete selected elements? Tes a certeza de querer eliminar os elementos seleccionados? Menu Menú Add Feed... Engadir canle... &Create Backup... &Crear copia de seguranza... S&how Menu Bar Mostrar a barra do menú Stop Update Feeds Parar a actualización das canles Open News Description Abrir descrición das novas Copy News Link Copiar ligazón das novas &View &Ver Fee&ds &Canles &News &Novas &Browser &Navegador &Tools &Ferramentas &Help &Axuda Main Toolbar Barra principal Customize Toolbar Personalizar barra de ferramentas Main Toolbar... Barra principal... Customize Toolbar... Personalizar barra de ferramentas... Feeds Toolbar... Barra de canles... News Toolbar... Barra de novas... Lock Toolbar Bloquear barra Hide Toolbar Agochar barra Layout Deseño Classic Clásico Newspaper Xornal Application Style Estilo da aplicación System Sistema System2 Sistema2 Green Verde Orange Laranxa Purple Púrpura Pink Rosa Gray Gris Browser Position Posición do navegador Top Arriba Bottom Abaixo Right à dereita Left à esquerda Show Window Mostrar xanela Previous Feed Canle anterior Next Feed Canle seguinte Previous News Nova anterior Next News Nova seguinte News Page Up Retroceso da páxina de novas News Page Down Avance da páxina de novas Next Unread News Seguinte nova sen ler Previous Unread News Anterior nova sen ler Switch Focus to Next Panel Cambiar enfoque no seguinte panel Switch Focus to Next Panel (Tree Feeds, List News, Browser) Cambiar enfoque no seguinte panel (árbore de canles, listaxe de novas, navegador) Switch Focus to Previous Panel Cambiar foco no anterior panel Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Cambiar enfoque no anterior panel (árbore de canles, listaxe de novas, navegador) Show/Hide Tree Feeds Mostrar/agochar árbore de canles Minimize to Tray Minimizar á bandexa do sistema Minimize Application to Tray Minimizar programa á bandexa do sistema Columns Columnas Show Indentation Mostrar sangría Search Feed Procurar canle Zoom Zoom Zoom In Aumentar Zoom in in browser Aumentar no navegador Zoom Out Diminuír Zoom out in browser Diminuír no navegador 100% 100% Print... Imprimir... Print Preview... Imprimir previsualización... Page up (Browser) Páxina anterior (navegador) Page down (Browser) Páxina seguinte (navegador) Save As... Gardar como... Save Page As... Gardar páxina como... Show/Hide Mostrar/agochar Feeds Toolbar Barra de canles News Toolbar Barra de novas Browser Toolbar Barra do navegador Panel Categories Panel de categorías Status Bar Barra de estado Full Screen Pantalla completa Stay On Top Sempre visible Categories Categorías Label Etiqueta Show labels menu Mostrar menú de etiquetas Close Tab Pechar lapela Close Other Tabs Pechar as outras lapelas Close All Tabs Pechar todas as lapelas Switch to next tab Cambiar á seguinte lapela Switch to previous tab Cambiar á anterior lapela Unread Sen ler Starred Destacadas Deleted Eliminadas Labels Etiquetas Decrease news list/increase browser Diminuír listaxe de novas/aumentar navegador Increase news list/decrease browser Aumentar listaxe de novas/aumentar navegador Find Procurar Open Homepage Feed Abrir páxina principal Sort by Name Ordenar por nome Collapse All Folders Contraer todos os cartafoles Expand All Folders Expandir todos os cartafoles Next Folder Cartafol seguinte Previous Folder Cartafol anterior Expand Folder Expandir cartafol Setting Page: Labels Axustes da páxina: etiquetas Share Compartir Sort By Ordenar por Ascending Ascendente Descending Descendente Check for updates Comprobar actualizacións A new version of QuiteRSS... Unha nova versión de QuiteRSS... Loading... A cargar... Web Page Páxina web Save As Gardar como HTML-Files (*.%1) Ficheiros HTML (*.%1) Text files (*.%2) Ficheiros de texto (*.%2) Save As: can't open a file Gardar como: non se pode abrir o ficheiro Choose Directory Elixir directorio Important Importante Work Traballo Personal Persoal To Do Para facer Later Máis tarde Amusingly Gracioso NetworkManager SSL Certificate Error! Erro do certificado SSL! The "%1" server has the following errors in the SSL certificate: O servidor "%1" ten os seguintes erros no certificado SSL: <b>Organization: </b> <b>Organización: </b> <b>Domain Name: </b> <b>Nome do dominio: </b> <b>Expiration Date: </b> <b>Data de vencemento: </b> <b>Error: </b> <b>Erro: </b> Would you like to make an exception for this certificate? Queres facer unha excepción para este certificado? NewsFiltersDialog News Filters Filtros de novas Feeds Canles Filter Name Nome do filtro New... Nova... Edit... Editar... Delete... Eliminar... Move up Subir Move down Baixar Run Filter Executar filtro Delete Filter Eliminar filtro Are you sure you want to delete the filter '%1'? Tes a certeza de querer eliminar o filtro '%1'? NewsHeader Icon Feed Icona da canle Title Título Published Data de publicación Received Hora de recepción Author Autor/a Category Categoría Read Lidas Star Destacadas Label Etiqueta Feed Title Título da canle Link Ligazón NewsItem Mark Read/Unread Marcar como lida/sen ler Delete News Eliminar novas NewsTabWidget Loading... (%p%) A cargar... (%p%) Home Inicio Open Page in External Browser Abrir páxina nun navegador externo Open Link in External Browser Abrir ligazón nun navegador externo Open Link Abrir ligazón Open in New Tab Abrir nunha nova lapela Save Link... Gardar ligazón... Save Image... Gardar imaxe... Copy Link Copiar ligazón Copy Copiar Go Back Volver Go Forward Avanzar Stop Parar Reload Actualizar Copy Image Copiar imaxe Copy Image Address Copiar enderezo da imaxe Load Images Cargar imaxes Auto Load Images to News View Cargar automaticamente as imaxes na vista de novas No Load Images Non cargar imaxes No Load Images to News View Non cargar imaxes na vista de novas Close Tab Pechar lapela Auto Load Images in News View Cargar automaticamente imaxes na vista de novas Don't Load Images Non cargar as imaxes Don't Load Images in News View Non cargar as imaxes na vista de novas Comments Comentarios Author: %1 Autor/a: %1 audio audio video vídeo media multimedia Link to Ligar a Mark Read/Unread Marcar como lida/sen ler Mark News Star Marcar noticias como destacadas Label Etiqueta Share Compartir Open News in External Browser Abrir as novas nun navegador externo Delete Eliminar NotificationWidget Close Pechar Mark All News Read Marcar todas as novas como lidas Previous Page Páxina anterior Next Page Páxina seguinte Incoming News: %1 Novas entrantes: %1 Page %1 of %2 Páxina %1 de %2 OptionsDialog Options Opcións General Xeral System Tray Bandexa do sistema Network Connections Conexións de rede Browser Navegador Feeds Canles Labels Etiquetas Notifications Notificacións Passwords Contrasinais Language Idioma Fonts & Colors Fontes & Cores Keyboard Shortcuts Atallos do teclado Warning: key is already assigned to Aviso: a chave xa está asignada a Show splash screen on startup Mostrar pantalla principal Reopen last opened feeds on startup Ao iniciar abrir as últimas canles vistas Open new tab next to active Abrir unha nova lapela ao pé da que está activa Hide feeds tree when opening tabs Agochar árbore de canles ao abrir as lapelas Show default rss-icon instead of favourite one Mostrar icona predefinida de RSS no canto da favicona correspondente Automatically collapse folders Contraer cartafoles automaticamente Show close button on tab Mostrar o botón de pechar na lapela Automatically check for updates Comprobar actualizacions automaticamente Help improve QuiteRSS by sending usage information Axuda a mellorar QuiteRSS enviando informacións sobre o seu emprego Store a DB in memory (requires program restart) Almacenar a base de datos na memoria (cómpre reiniciar o programa) Save DB stored in memory to file every Gardar o ficheiro da base de datos almacenada na memoria cada minutes minutos Run QuiteRSS at Windows startup Executar QuiteRSS ao iniciar Windows Show system tray icon Mostrar icona na área de notificacións ou bandexa do sistema starting QuiteRSS ao iniciar QuiteRSS minimizing QuiteRSS ao minimizar QuiteRSS closing QuiteRSS ao pechar QuiteRSS Show static icon Mostrar icona estática Change icon for incoming new news Cambiar icona para as novas entrantes Show count of new news Mostrar o número de noticias novas Show count of unread news Mostrar o número de novas sen ler Single click instead of double click for show window Prema simple no canto de dupla para mostrar a xanela principal Empty working set on minimize to tray Baleirar a área de traballo ao minimizar á bandexa Move to the system tray when: Mover á área de notificacións ou bandexa do sistema cando: Tray icon behavior: Comportamento da icona na bandexa de entrada: Direct connection to the Internet Conexión directa á internet System proxy configuration (if available) Configuración do proxy do sistema (se está dispoñible) Manual proxy configuration: Configuración manual do proxy: Proxy server: Servidor proxy: Port: Porto: Username: Nome de usuario: Password: Contrasinal: Request timeout: Tempo de espera: Number of requests: Número de solicitudes: Number of retries: Número de intentos: Options network requests when updating feeds (requires program restart): Opcións de conexión cando se actualicen as canles (cómpre reiniciar o programa): Use embedded browser Usar navegador interno Use external browser Usar navegador externo Default external browser Navegador externo predefinido Following external browser: Un navegador externo concreto: Browse... Explorar... Load images Cargar imaxes Enable JavaScript Activar JavaScript Enable plug-ins Activar complementos (plug-ins) Open links in embedded browser in background Abrir ligazóns en segundo plano no navegador interno Open links in external browser in background (experimental) Abrir ligazóns en segundo plano no navegador externo (experimental) Default zoom on pages: Zoom predefinido nas páxinas: Browser selection: Selección de navegador: External browser: Navegador externo: Content: Contido: User style sheet: Usar folla de estilo: Maximum pages in cache Número máximo de páxinas na caché Store cache in: Almacenamento na caché: Maximum size of disk cache Tamaño máximo da caché no disco MB Mb Use disk cache Usar caché no disco Allow local data to be set Permitir que se establezan datos locais Keep local data only until quit application Manter datos locais só ata que se peche o programa Block sites from setting any data Bloquear sitios que queiran establecer calquera dato Clear Limpar Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash é un complemento que bloquea que se cargue automaticamente contido flash da páxina web. Unha vez bloqueado, sempre poderás cargalo manualmente premendo na icona. Use Click to Flash Usar Click to Flash Add... Engadir... Remove... Eliminar... Ask where to save each file before downloading Preguntar onde gardar os ficheiros antes de descargalos Download location: Descargar localización: History Historial Click to Flash Click to Flash Downloads Descargas Automatically update the feeds on startup Actualizar automaticamente as canles ao iniciar Automatically update the feeds every Actualizar automaticamente as canles cada seconds segundos hours horas Nothing to do Non facer nada Dec Dec December Decembro Display format for date: Mostrar formato das datas: time: hora: Alternating row background colors Cor de fondo alternante nas filas Simplified representation of date and time Representación simplificada de data e hora Show All Mostrar todo Show New Mostrar novas Show Unread Mostrar non lidas Show Starred Mostrar destacadas Show Not Starred Mostrar as non destacadas Show Unread or Starred Mostrar destacadas ou non lidas Show Last Day Mostrar novas do último día Show Last 7 Days Mostrar novas dos últimos 7 días Style sheet for news: Folla de estilo para as novas: Mark news as read: Marcar novas como lidas: on selecting. With timeout ao seleccionar. Agardando after switching to another news despois de cambiar a outras novas Mark displayed news as read when switching feeds Marcar novas como lidas ao alternar de canles Mark displayed news as read when closing tab Marcar novas como lidas ao pechar a lapela Mark displayed news as read on minimize Marcar novas como lidas ao minimizar Change behavior of action 'Next Unread News' Cambiar comportamento da acción 'Novas seguintes sen ler' starred news novas destacadas labeled news novas etiquetadas Automatically mark identical news as read Marcar automaticamente as novas idénticas como lidas Prevent accidental deletion of: Previr borrado accidental de: Enable cleanup on shutdown Habilitar limpeza ao pechar Maximum age of news in days to keep: Número máximo de días para manter as novas: Maximum number of news to keep: Número máximo de novas para conservar: Delete read news Eliminar novas lidas Never delete unread news Nunca eliminar as novas sen ler Never delete starred news Nunca eliminar as novas destacadas Never delete labeled news Nunca eliminar novas etiquetadas Clean up 'Deleted' Baleirar 'Eliminadas' Enable DB optimization (slower shutdown) Habilitar optimización da base de datos (pecharase máis lentamente) Reading Lendo Clean Up Limpeza New... Nova... Edit... Editar... Delete... Eliminar... Move up Subir Move down Baixar Show when inactive main window Mostrar cando a xanela principal estea inactiva Screen Pantalla Transparency Transparencia Show titles feeds Mostrar títulos das canles Show icon feed Mostrar icona da canle Show button 'Mark All News Read' Mostrar botón 'Marcar todas as novas como lidas' Show button 'Mark Read/Unread' Mostrar botón 'Marcar como lida/sen ler' Show button 'Open in External Browser' Mostrar botón 'Abrir nun navegador externo' Show button 'Delete News' Mostrar botón 'Eliminar novas' Play sound for incoming new news Reproducir un son para as novas entrantes Play Reproducir Display notification for incoming news Mostrar notificacións para novas entrantes Top Left à esquerda Top Right à dereita Bottom Left Inferior á esquerda Bottom Right Inferior á dereita Review Revisión Position Situación Show maximum of Mostrar un máximo de item on page notification ítem na páxina de notificacións Width list items Largo da listaxe pixels píxeles Close notification after Pechar notificacións despois Do not show notification in fullscreen mode Non mostrar notificacións no modo de pantalla completa Display Mostrar Action mouse on news opening: Acción ao abrir as novas: Single Click: Prema simple: Double Click: Prema dupla: Middle Click: Botón central: Only show selected feeds: Só mostrar as canles seleccionadas: Notification Notificación Sound Son Selection of feeds Selección de canles All Feeds Todas as canles Site Sitio User Usuario Password Contrasinal Delete Eliminar Delete All Eliminar todo Show Passwords Mostrar contrasinais: Version Versión Author Autor/a Contact Contacto Choose language: Escoller idioma: Type Tipo Font Fonte Feeds list font Fonte da listaxe de canles News list font Fonte da listaxe de novas News title font Fonte do título das novas News text font Fonte do texto das novas Notification font Fonte das notificacións Change... Cambiar... Reset Restablecer Feeds list color Cor da listaxe de canles Feeds list background Fondo da listaxe de canles News list color Cor da listaxe de novas News list background Fondo da listaxe de novas Focused news color Cor das novas sinaladas co rato Focused news background color Cor de fondo das novas sinaladas co rato Link color Cor da ligazón Title color Cor do título Date color Cor da data Author color Cor do/a autor/a News text color Cor do texto das novas News title background Fondo do título das novas News background Fondo das novas Feed with new news Canle con noticias novas Count of unread news in feeds tree Número de noticias sen ler na árbore de canles Disabled feed Canle desactivada Alternating row colors Alternas as cores nas filas Notification text color Cor do texto das notificacións Notification background color Cor de fondo das notificacións Auto load images in news view Cargar imaxes automaticamente na vista de novas Text color of new news Cor do texto das noticias novas Show feeds tree toggle Mostrar a opción de alternar a árbore de canles Clear new status when minimize to tray Reiniciar contador de elementos novos ao minimizar Set focus on the last opened news Establecer o enfoque nas últimas novas abertas Set focus at the top of news list Establecer o enfoque na parte superior da listaxe de novas Set focus on the unread news Establecer o enfoque nas novas sen ler Open the news Abrir as novas Default news filter: Filtro de novas predefinido: Action on feed opening: Acción ao abrir a canle: Show news description instead of loading web page Mostrar a descrición das novas no canto de cargar a páxina web Text color of unread news Cor do texto das novas sen ler Focused feed color Cor da canle sinalada co rato Focused feed background color Cor de fondo da canle sinalada co rato Standard Estándar Fixed Fixa Serif Serif Sans Serif Sans Serif Cursive Cursiva Fantasy Fantasía Default font size Tamaño de fonte predefinido Fixed font size Tamaño da fonte fixa Minimum font size Tamaño mínimo de fonte Minimum logical font size Mínimo tamaño lóxico da fonte Font families: Familia de fontes Font sizes: Tamaños das fontes: Fonts Fontes Fonts Browser Fontes do navegador Colors Cores Filter Filtro Action Acción Description Descrición Shortcut Atallo Shortcut: Atallo: Open File... Abrir ficheiro... Select Style Sheet File Seleccionar folla de estilo Open Directory... Abrir directorio... Add site to whitelist Sinalar sitio como confiable Site without 'http://' (ex. youtube.com) Sitio sen 'http://' (ex. youtube.com) QAbstractSpinBox &Step up &Paso adiante Step &down &Paso atrás &Select All &Seleccionar todo QDialogButtonBox Close Pechar Cancel Cancelar &Yes &Si &No &Non QFtp Not connected Sen conexión Host %1 not found Servidor %1 non atopado Connection refused to host %1 Conexión rexeitada desde o servidor %1 Connection timed out to host %1 Expirou o tempo para conectar ao servidor %1 Connected to host %1 Conectado ao servidor %1 Connection refused for data connection Conexión rexeitada para datos Unknown error Erro descoñecido Connecting to host failed: %1 Erro ao conectar ao servidor: %1 Login failed: %1 Erro ao acceder: %1 Listing directory failed: %1 Erro ao listar directorio: %1 Changing directory failed: %1 Erro ao crear directorio: %1 Downloading file failed: %1 Erro ao descargar ficheiro: %1 Uploading file failed: %1 Erro ao cargar ficheiro: %1 Removing file failed: %1 Erro ao eliminar ficheiro: %1 Creating directory failed: %1 Erro ao crear directorio: %1 Removing directory failed: %1 Erro ao eliminar directorio: %1 Connection closed Conexión pechada QLineEdit &Undo &Desfacer &Redo &Refacer Cu&t &Cortar &Copy &Copiar &Paste &Pegar Delete Eliminar Select All Seleccionar todo QMultiInputContext Select IM Seleccionar IM QObject Cannot start external program Non se pode iniciar o programa externo Cannot start external program! %1 Non se pode iniciar o programa externo! %1 Error Erro QTextControl &Undo &Desfacer &Redo &Refacer Cu&t &Cortar &Copy &Copiar &Paste &Pegar Delete Eliminar Select All Seleccionar todo Copy &Link Location Copiar &ligazón QWizard Cancel Cancelar < &Back < &Volver &Finish &Rematar &Next > &Seguinte > RSSDetectionWidget Untitled feed Canle sen título RequestFeed Server requires authentication! O servidor require autenticarse! Server replied: Not Found! Resposta do servidor: Non atopado! Redirect error! Erro de redireccionamento! Request timeout! Petición vencida! SQLiteDriver Error opening database Erro ao abrir a base de datos Error closing database Erro ao pechar a base de datos Unable to begin transaction Non foi posible comezar a transacción Unable to commit transaction Non foi posible enviar a transacción Unable to rollback transaction Non foi posible reverter a transacción SQLiteResult Unable to fetch row Non foi posible obter a fila No query Sen consultas Unable to execute statement Non foi posible executar a instrución Unable to execute multiple statements at a time Non foi posible executar múltiples instrucións a un tempo Unable to reset statement Non foi posible restablecer a instrución Unable to bind parameters Non foi posible asociar os parámetros Parameter count mismatch O número de parámetros non coincide SslErrorDialog SSL Certificate Error! Erro do certificado SSL! Only for this session Só para esta sesión UpdateAppDialog Check for Updates Comprobar actualizacións Checking for updates... A comprobar actualizacións... Loading history... A cargar historial... Don't remind about this version Non informar acerca desta versión &Install &Instalar You already have the latest version Xa tes a última versión A new version of QuiteRSS is available! Hai dispoñible unha nova versión de QuiteRSS! Click here to go to the download page Preme aquí para ir á páxina de descargas Your version is: A túa versión é: Current version is: A versión actual é: Error checking updates Erro ao comprobar actualizacións quiterss-0.18.3/lang/quiterss_he.ts000066400000000000000000005124711265173051100173210ustar00rootroot00000000000000 AboutDialog About Revision Version QuiteRSS is a open-source cross-platform RSS/Atom news reader Includes: Application directory: Resource directory: Data directory: Backup directory: Database file: Settings file: Log file: Authors History License Information AdBlockAddSubscriptionDialog Add Subscription Title: Address: Add new subscription to AdBlock: AdBlockCustomList Custom Rules AdBlockDialog AdBlock Configuration Enable AdBlock Search... Options AdBlock Use only essential part of EasyList (for performance reasons) Add Rule Remove Rule Add Subscription Remove Subscription Update Subscriptions Learn about writing rules... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock Show AdBlock &Settings Disable on %1 Disable only on this page Blocked Popup Windows %1 with (%2) No content blocked Blocked URL (AdBlock Rule) - click to edit rule AdBlockManager EasyList AdBlockSubscription Cannot load subscription! AdBlockTreeWidget Add Rule Remove Rule Add Custom Rule Please write your rule here: %1 (recently updated) %1 (Error: %2) AddFeedWizard Add Feed Create New Feed Use title of the feed as displayed name Server requires authentication: Username: Password: Feed URL or website address: Feeds All Feeds New Folder... Displayed name: Location: URL error! Duplicate feed! Can't find feed URL! Request failed! AddFolderDialog Add Folder Feeds All Feeds Name: Location: AuthenticationDialog Save password Authorization required Server: Message: Username: Password: CategoriesTreeWidget Unread Starred Deleted Labels Open in New Tab Clear 'Deleted' Mark Read CleanUpWizard Clean Up Choose Feeds All Feeds Clean Up Options Maximum age of news in days to keep: Maximum number of news to keep: Delete read news Never delete unread news Never delete starred news Never delete labeled news Clean up 'Deleted' Purge DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Information Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash Hide object Add '%1' to whitelist CustomizeToolbarDialog Customize Main Toolbar Customize Feeds Toolbar Customize News Toolbar Load images Separator Icon Text Text Beside Icon Text Under Icon Big Normal Small Style: Icon Size: Add Remove Move up Move down Default DownloadItem Remaining time unavailable Error: Cannot write to file! Error: few seconds seconds minutes hours Unknown size Unknown speed %2 - unknown size (%3) Remaining %1 - %2 of %3 (%4) Cancelled - %1 Delete file Do you want to also delete downloaded file? Open File Open Folder Copy Download Link Cancel Downloading Remove Cancelled Error Not found Sorry, the file %1 was not found! DownloadManager Clear File %1 (*.%2) All Files (*.*) Save As... Executable: Arguments: FeedPropertiesDialog Properties General Columns Authentication Status Title: Homepage: Feed URL: Load Title Load Favicon Select Icon... Select Icon Disable update Automatically update every seconds minutes hours Starred Load images Display in new tab on startup Show news' description instead of loading web page Automatically delete duplicate news Display Enable JavaScript Right-to-left layout Ascending Descending Sort by: Add Remove Move up Move down Default Server requires authentication: Username: Password: Description: Status: Created: Last update: News count: Good Long ago ;-) new unread Image files Select Image Load icon: can't open a file! FilterRulesDialog Filter Rules Feeds All Feeds Filter name: Match all news Match all conditions Match any condition Perform these actions: Please enter name for the filter. Please enter search condition for the news filter. FindFeed Find Name Find Link FindTextContent Find in News Find in Titles Find in Authors Find in Categories Find in Content Find in Links Find in Browser FtpDownloader Canceled! ItemAction Mark News as Read Add Star Delete Add Label Play a Sound Show News in Notifier Browse Play Add Action Delete Action Open File... ItemCondition Title Description Author Category State Link News New Read Starred Add Condition Delete Condition contains doesn't contains is isn't begins with ends with Regular expressions LabelDialog New Label Load icon... Default Select color... Name: Icon: Color text: Color background: Image files Select Image Load icon: can't open a file! MainApplication Saving data... MainWindow &AdBlock Hide Categories Show Categories Select OPML-File OPML-Files (*.%1 *.%2) Import canceled Import: can't open a file OPML-Files (*.%1) Export canceled Export: can't open a file Unread: %1 All: %1 (Browser) New News: %1 Unread News: %1 &Add Add New Feed &Feed... F&older... Add New Folder Open in New Tab &Delete... Delete Selected Feed &Import Feeds... Import Feeds from OPML File &Export Feeds... Export Feeds to OPML File E&xit Update Feed Update Current Feed Update All Update All Feeds Mark All Feeds Read Mark Read/Unread Mark Current News Read/Unread Mark All News Read Downloads Clean Up... News Filters... Filter News... Options... Open Options Dialog Filter Feeds Show All Show New Show Unread Show Starred Feeds Show Not Working Feeds Filter News Show Starred Show Not Starred Show Unread or Starred Show Last Day Show Last 7 Days About... Show 'About' Dialog Check for Updates... Report a Problem... Open News Open in Browser Open in External Browser Open News in External Browser Open News in New Tab Open in Background Tab Open News in Background Tab Star Mark News Star Delete Delete Selected News Delete All News Delete All News from List Restore Restore News Copy Link Restore last deleted news Mark Read Mark Feed Read Properties &File Count Unread News Count All News Last Update Reset browser zoom Print Web Page Preview Web Page Save page in database Save page in database instead of news description Confirm Delete Are you sure to delete selected elements? Menu Add Feed... &Create Backup... S&how Menu Bar Open News Description Copy News Link &View Fee&ds &News &Browser &Tools &Help Main Toolbar Customize Toolbar Main Toolbar... Customize Toolbar... Feeds Toolbar... News Toolbar... Lock Toolbar Hide Toolbar Layout Classic Newspaper Application Style System System2 Green Orange Purple Pink Gray Browser Position Top Bottom Right Left Show Window Previous Feed Next Feed Previous News Next News News Page Up News Page Down Next Unread News Previous Unread News Switch Focus to Next Panel Switch Focus to Next Panel (Tree Feeds, List News, Browser) Switch Focus to Previous Panel Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Show/Hide Tree Feeds Minimize to Tray Minimize Application to Tray Columns Show Indentation Search Feed Zoom Zoom In Zoom in in browser Zoom Out Zoom out in browser 100% Print... Print Preview... Page up (Browser) Page down (Browser) Save As... Save Page As... Show/Hide Feeds Toolbar News Toolbar Browser Toolbar Panel Categories Status Bar Full Screen Stay On Top Categories Label Show labels menu Close Tab Close Other Tabs Close All Tabs Switch to next tab Switch to previous tab Unread Starred Deleted Labels Decrease news list/increase browser Increase news list/decrease browser Find Open Homepage Feed Sort by Name Collapse All Folders Expand All Folders Next Folder Previous Folder Expand Folder Setting Page: Labels Share Sort By Ascending Descending Check for updates A new version of QuiteRSS... Loading... Web Page Save As HTML-Files (*.%1) Text files (*.%2) Save As: can't open a file Choose Directory Important Work Personal To Do Later Amusingly NetworkManager SSL Certificate Error! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Domain Name: </b> <b>Expiration Date: </b> <b>Error: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters Feeds Filter Name New... Edit... Delete... Move up Move down Run Filter Delete Filter Are you sure you want to delete the filter '%1'? NewsHeader Icon Feed Title Published Received Author Category Read Star Label Feed Title Link NewsItem Mark Read/Unread Delete News NewsTabWidget Loading... (%p%) Home Open Page in External Browser Open Link in External Browser Open Link Open in New Tab Save Link... Save Image... Copy Link Copy Go Back Go Forward Stop Reload Copy Image Copy Image Address Load Images Auto Load Images to News View No Load Images No Load Images to News View Close Tab Auto Load Images in News View Don't Load Images Don't Load Images in News View Comments Author: %1 audio video media Link to Mark Read/Unread Mark News Star Label Share Open News in External Browser Delete NotificationWidget Close Mark All News Read Previous Page Next Page Incoming News: %1 Page %1 of %2 OptionsDialog Options General System Tray Network Connections Browser Feeds Labels Notifications Passwords Language Fonts & Colors Keyboard Shortcuts Warning: key is already assigned to Show splash screen on startup Reopen last opened feeds on startup Open new tab next to active Hide feeds tree when opening tabs Show default rss-icon instead of favourite one Automatically collapse folders Show close button on tab Automatically check for updates Help improve QuiteRSS by sending usage information Store a DB in memory (requires program restart) Save DB stored in memory to file every minutes Run QuiteRSS at Windows startup Show system tray icon starting QuiteRSS minimizing QuiteRSS closing QuiteRSS Show static icon Change icon for incoming new news Show count of new news Show count of unread news Single click instead of double click for show window Empty working set on minimize to tray Move to the system tray when: Tray icon behavior: Direct connection to the Internet System proxy configuration (if available) Manual proxy configuration: Proxy server: Port: Username: Password: Request timeout: Number of requests: Number of retries: Options network requests when updating feeds (requires program restart): Use embedded browser Use external browser Default external browser Following external browser: Browse... Load images Enable JavaScript Enable plug-ins Open links in embedded browser in background Open links in external browser in background (experimental) Default zoom on pages: Browser selection: External browser: Content: User style sheet: Maximum pages in cache Store cache in: Maximum size of disk cache MB Use disk cache Allow local data to be set Keep local data only until quit application Block sites from setting any data Clear Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Use Click to Flash Add... Remove... Ask where to save each file before downloading Download location: History Privacy Click to Flash Downloads Automatically update the feeds on startup Automatically update the feeds every seconds hours Nothing to do Dec December Display format for date: time: Alternating row background colors Simplified representation of date and time Show All Show New Show Unread Show Starred Show Not Starred Show Unread or Starred Show Last Day Show Last 7 Days Style sheet for news: Mark news as read: on selecting. With timeout after switching to another news Mark displayed news as read when switching feeds Mark displayed news as read when closing tab Mark displayed news as read on minimize Change behavior of action 'Next Unread News' starred news labeled news Automatically mark identical news as read Prevent accidental deletion of: Enable cleanup on shutdown Maximum age of news in days to keep: Maximum number of news to keep: Delete read news Never delete unread news Never delete starred news Never delete labeled news Clean up 'Deleted' Enable DB optimization (slower shutdown) Reading Clean Up New... Edit... Delete... Move up Move down Show when inactive main window Screen Transparency Show titles feeds Show icon feed Show button 'Mark All News Read' Show button 'Mark Read/Unread' Show button 'Open in External Browser' Show button 'Delete News' Play sound for incoming new news Play Display notification for incoming news Top Left Top Right Bottom Left Bottom Right Review Position Show maximum of item on page notification Width list items pixels Close notification after Do not show notification in fullscreen mode Only show selected feeds: Notification Sound Selection of feeds All Feeds Site User Password Delete Delete All Show Passwords Version Author Contact Choose language: Type Font Feeds list font News list font News title font News text font Notification font Change... Reset Feeds list color Feeds list background News list color News list background Focused news color Focused news background color Link color Title color Date color Author color News text color News title background News background Feed with new news Count of unread news in feeds tree Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view Text color of new news Show feeds tree toggle Clear new status when minimize to tray Set focus on the last opened news Set focus at the top of news list Set focus on the unread news Open the news Default news filter: Action on feed opening: Show news description instead of loading web page Text color of unread news Focused feed color Focused feed background color Standard Fixed Serif Sans Serif Cursive Fantasy Default font size Fixed font size Minimum font size Minimum logical font size Font families: Font sizes: Fonts Fonts Browser Colors Filter Action Description Shortcut Shortcut: Open File... Select Style Sheet File Open Directory... Add site to whitelist Site without 'http://' (ex. youtube.com) QAbstractSpinBox &Step up Step &down &Select All QDialogButtonBox Close Cancel &Yes &No QFtp Not connected Host %1 not found Connection refused to host %1 Connection timed out to host %1 Connected to host %1 Connection refused for data connection Unknown error Connecting to host failed: %1 Login failed: %1 Listing directory failed: %1 Changing directory failed: %1 Downloading file failed: %1 Uploading file failed: %1 Removing file failed: %1 Creating directory failed: %1 Removing directory failed: %1 Connection closed QLineEdit &Undo &Redo Cu&t &Copy &Paste Delete Select All QMultiInputContext Select IM QObject Cannot start external program Cannot start external program! %1 Error QTextControl &Undo &Redo Cu&t &Copy &Paste Delete Select All Copy &Link Location QWizard Cancel < &Back &Finish &Next > RSSDetectionWidget Untitled feed RequestFeed Server requires authentication! Server replied: Not Found! Redirect error! Request timeout! SQLiteDriver Error opening database Error closing database Unable to begin transaction Unable to commit transaction Unable to rollback transaction SQLiteResult Unable to fetch row No query Unable to execute statement Unable to execute multiple statements at a time Unable to reset statement Unable to bind parameters Parameter count mismatch SslErrorDialog SSL Certificate Error! Only for this session UpdateAppDialog Check for Updates Checking for updates... Loading history... Don't remind about this version &Install You already have the latest version A new version of QuiteRSS is available! Click here to go to the download page Your version is: Current version is: Error checking updates quiterss-0.18.3/lang/quiterss_hi.ts000066400000000000000000006140511265173051100173220ustar00rootroot00000000000000 AboutDialog About विषय में Revision अवतरण Version संसà¥à¤•रण QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS à¤à¤• open-source cross-platform आरà¤à¤¸à¤à¤¸ / à¤à¤Ÿà¤® नà¥à¤¯à¥‚ज रीडर है Includes: शामिल है Application directory: à¤à¤ªà¥à¤²à¤¿à¤•ेशन डायरेकà¥à¤Ÿà¤°à¥€: Resource directory: संसाधन डायरेकà¥à¤Ÿà¤°à¥€: Data directory: डाटा डायरेकà¥à¤Ÿà¤°à¥€: Backup directory: बैकअप निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ा: Database file: डाटाबेस फ़ाइल: Settings file: सेटिंगà¥à¤¸ फ़ाइल: Log file: लॉग फ़ाइल: Authors लेखक History इतिहास License लाइसेंस Information जानकारी AdBlockAddSubscriptionDialog Add Subscription सदसà¥à¤¯à¤¤à¤¾ जोड़ें Title: शीरà¥à¤·à¤•: Address: पता: Add new subscription to AdBlock: AdBlock के लिठनई सदसà¥à¤¯à¤¤à¤¾ जोड़ें: AdBlockCustomList Custom Rules कसà¥à¤Ÿà¤® नियम AdBlockDialog AdBlock Configuration à¤à¤¡à¤¬à¥à¤²à¥‰à¤• कॉनà¥à¥žà¤¿à¤—रेशन Enable AdBlock à¤à¤¡à¤¬à¥à¤²à¥‰à¤• सकà¥à¤·à¤® करें Search... खोजें Options विकलà¥à¤ª AdBlock à¤à¤¡à¤¬à¥à¤²à¥‰à¤• Use only essential part of EasyList (for performance reasons) EasyList के ही आवशà¥à¤¯à¤• भाग का उपयोग करें (अचà¥à¤›à¥‡ पà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ के लिà¤) Add Rule नियम जोड़े Remove Rule नियम हटायें Add Subscription सदसà¥à¤¯à¤¤à¤¾ जोड़ें Remove Subscription सदसà¥à¤¯à¤¤à¤¾ निकालें Update Subscriptions सदसà¥à¤¯à¤¤à¤¾ का अदà¥à¤¯à¤¤à¤¨ करें Learn about writing rules... नियम बनाने के बारे में सीखें.... AdBlockIcon AdBlock lets you block unwanted content on web pages à¤à¤¡à¤¬à¥à¤²à¥‰à¤• आप वेब पनà¥à¤¨à¥‹à¤‚ पर अवांछित सामगà¥à¤°à¥€ को बà¥à¤²à¥‰à¤• करने देता है AdBlock à¤à¤¡à¤¬à¥à¤²à¥‰à¤• Show AdBlock &Settings à¤à¤¡à¤¬à¥à¤²à¥‰à¤• और सेटिंग दिखाà¤à¤‚ Disable on %1 % 1 पर अकà¥à¤·à¤® करें Disable only on this page इस पृषà¥à¤  पर केवल अकà¥à¤·à¤® करें Blocked Popup Windows पॉपअप विंडोज़ अवरà¥à¤¦à¥à¤§ करें %1 with (%2) %1 साथ (% 2) No content blocked कोई सामगà¥à¤°à¥€ अवरà¥à¤¦à¥à¤§ नहीं Blocked URL (AdBlock Rule) - click to edit rule अवरà¥à¤¦à¥à¤§ यूआरà¤à¤² (à¤à¤¡à¤¬à¥à¤²à¥‰à¤• नियम) - नियम संपादित करने के लिठकà¥à¤²à¤¿à¤• करें AdBlockManager EasyList आसान सूची AdBlockSubscription Cannot load subscription! सदसà¥à¤¯à¤¤à¤¾ सकà¥à¤°à¤¿à¤¯ नहीं कर सकता! AdBlockTreeWidget Add Rule नियम जोड़ें Remove Rule नियम निकालें Add Custom Rule पसंदीदा नियम जोड़ें Please write your rule here: यहाठअपने नियम यहाठलिखें: %1 (recently updated) % 1 (हाल ही में अदà¥à¤¯à¤¤à¤¨) %1 (Error: %2) % 1 (तà¥à¤°à¥à¤Ÿà¤¿:% 2) AddFeedWizard Add Feed फीड जोड़े Create New Feed नया फीड जोड़े Use title of the feed as displayed name पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ नाम के सà¥à¤¥à¤¾à¤¨ पर फीड का शीरà¥à¤·à¤• पà¥à¤°à¤¯à¥‹à¤— करे Server requires authentication: सरà¥à¤µà¤° को पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण की आवशà¥à¤¯à¤•ता है: Username: पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नाम: Password: पासवरà¥à¤¡: Feed URL or website address: फीड यूआरà¤à¤² या वेबसाइट का पता : Feeds फ़ीडà¥à¤¸ All Feeds सभी फ़ीड New Folder... नया फ़ोलà¥à¤¡à¤° ... Displayed name: पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ नाम : Location: सà¥à¤¥à¤¾à¤¨: URL error! यूआरà¤à¤² तà¥à¤°à¥à¤Ÿà¤¿ ! Duplicate feed! फीड की दूसरी पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ Can't find feed URL! फीड यूआरà¤à¤² उपलबà¥à¤§ नहीं ! Request failed! अनà¥à¤°à¥‹à¤§ विफल रहा है! AddFolderDialog Add Folder फ़ोलà¥à¤¡à¤° जोड़ें Feeds फीड All Feeds सभी फीड Name: नाम: Location: सà¥à¤¥à¤¾à¤¨: AuthenticationDialog Save password पासवरà¥à¤¡ सहेजें Authorization required पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण आवशà¥à¤¯à¤• Server: सरà¥à¤µà¤°: Message: संदेश: Username: पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नाम: Password: पासवरà¥à¤¡: CategoriesTreeWidget Unread अपठित Starred तारांकित Deleted नषà¥à¤Ÿ किया हà¥à¤† Labels चिपà¥à¤ªà¥€ Open in New Tab नठटैब में खोलें Clear 'Deleted' साफ़ करें 'नषà¥à¤Ÿ किया हà¥à¤†' Mark Read पढ़ा हà¥à¤† चिहà¥à¤¨à¤¿à¤¤ करें CleanUpWizard Clean Up साफ - सफाई Choose Feeds फीड चà¥à¤¨à¥‡à¤‚ All Feeds सभी फ़ीड Clean Up Options विकलà¥à¤ª को साफ करें Maximum age of news in days to keep: समाचार की अधिकतम आयॠMaximum number of news to keep: समाचार की अधिकतम संखà¥à¤¯à¤¾ Delete read news पढ़ें समाचार हटाà¤à¤‚ Never delete unread news अपठित समाचार को नषà¥à¤Ÿ नहीं करें Never delete starred news तारांकित समाचार को नषà¥à¤Ÿ नहीं करें Never delete labeled news सूचित समाचार नषà¥à¤Ÿ नहीं करें Clean up 'Deleted' साफ़ करें 'नषà¥à¤Ÿ किया हà¥à¤†' Purge DB मिटाà¤à¤ डीबी Totally remove records that had marked 'deleted' from DB. Ancient news could reappear 'हटाया गया' चिहà¥à¤¨à¤¿à¤¤ अभिलेखों को पूरी तरह से डीबी से हटा दें। पà¥à¤°à¤¾à¤šà¥€à¤¨ समाचार फिर से पà¥à¤°à¤•ट सकता है Information जानकारी Clean Up wizard deleted %1 news साफ सफ़ाई जादूगर से समाचार को नषà¥à¤Ÿ करें %1 ClickToFlash Object blocked by ClickToFlash ClickToFlash दà¥à¤µà¤¾à¤°à¤¾ अवरà¥à¤¦à¥à¤§ ऑबà¥à¤œà¥‡à¤•à¥à¤Ÿ Hide object छà¥à¤ªà¤¾à¤à¤‚ ऑबà¥à¤œà¥‡à¤•à¥à¤Ÿ Add '%1' to whitelist शà¥à¤µà¥‡à¤¤ सूची में जोड़ें %1 CustomizeToolbarDialog Customize Main Toolbar मà¥à¤–à¥à¤¯ उपकरण पटà¥à¤Ÿà¥€ अनà¥à¤•ूलित करें Customize Feeds Toolbar फीड उपकरण पटà¥à¤Ÿà¥€ अनà¥à¤•ूलित करें Customize News Toolbar समाचार उपकरण पटà¥à¤Ÿà¥€ अनà¥à¤•ूलित करें Load images छवियों को लोड करें Separator विभाजक Icon आइकन Text टेकà¥à¤¸à¥à¤Ÿ Text Beside Icon आइकन के बगल में टेकà¥à¤¸à¥à¤Ÿ Text Under Icon आइकन के नीचे टेकà¥à¤¸à¥à¤Ÿ Big बड़ा Normal सामानà¥à¤¯ Small छोटा Style: शैली: Icon Size: आइकन का आकार: Add जोड़ें Remove हटाà¤à¤ Move up ऊपर जाà¤à¤ Move down नीचे जाà¤à¤ Default डिफ़ॉलà¥à¤Ÿ DownloadItem Remaining time unavailable शेष समय अनà¥à¤ªà¤²à¤¬à¥à¤§ Error: Cannot write to file! तà¥à¤°à¥à¤Ÿà¤¿: फाइल नहीं लिख सकता! Error: तà¥à¤°à¥à¤Ÿà¤¿: few seconds कà¥à¤› सेकंड seconds सेकंड minutes मिनटों hours घंटे Unknown size अजà¥à¤žà¤¾à¤¤ आकार Unknown speed अजà¥à¤žà¤¾à¤¤ गति %2 - unknown size (%3) % 2 - अजà¥à¤žà¤¾à¤¤ आकार (3%) Remaining %1 - %2 of %3 (%4) शेष% 1 - 3% से% 2 (4%) Cancelled - %1 रदà¥à¤¦ किया गया -% 1 Delete file फ़ाइल हटाà¤à¤ Do you want to also delete downloaded file? कà¥à¤¯à¤¾ आप डाउनलोड की गई फ़ाइल को नषà¥à¤Ÿ करना चाहते हैं? Open File फ़ाइल खोलें Open Folder फ़ोलà¥à¤¡à¤° खोलें Copy Download Link डाउनलोड लिंक की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ Cancel Downloading डाउनलोडिंग रदà¥à¤¦ करें Remove को हटाà¤à¤ Cancelled रदà¥à¤¦ किया गया Error तà¥à¤°à¥à¤Ÿà¤¿ Not found नहीं मिला Sorry, the file %1 was not found! कà¥à¤·à¤®à¤¾ करें, फ़ाइल % 1 नहीं मिला! DownloadManager Clear साफ़ करें File %1 (*.%2) फ़ाइल% 1 (*।% 2) All Files (*.*) All Files (*.*) Save As... के रूप में सहेजें ... Executable: निषà¥à¤ªà¤¾à¤¦à¤¨ योगà¥à¤¯: Arguments: आरà¥à¤—à¥à¤®à¥‡à¤‚टà¥à¤¸: FeedPropertiesDialog Properties पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¤œ General सामानà¥à¤¯ Columns कॉलम Authentication पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण Status फीड की सà¥à¤¥à¤¿à¤¤à¤¿ Title: फीड का शीरà¥à¤·à¤• Homepage: होमपेज: Feed URL: फीड यूआरà¤à¤² : Load Title लोड शीरà¥à¤·à¤• Load Favicon लोड फ़ेविकॉन Select Icon... आइकन का चयन करें ... Select Icon आइकन का चयन करें Disable update अदà¥à¤¯à¤¤à¤¨ अकà¥à¤·à¤® करें Automatically update every सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से इस समयावधि में अदà¥à¤¯à¤¤à¤¨ करें seconds सेकंड minutes मिनटों hours घंटे Starred तारांकित Load images छवियों को पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ करें Display in new tab on startup सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…प पर नठटैब में पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करें Show news' description instead of loading web page वेब पेज लोड करने के बजाय समाचार का 'विवरण दिखाà¤à¤ Automatically delete duplicate news सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से डà¥à¤ªà¥à¤²à¥€à¤•ेट समाचार हटाना Display पà¥à¤°à¤¦à¤°à¥à¤¶à¤¿à¤¤ करें Reading Enable JavaScript जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ सकà¥à¤·à¤® करें Right-to-left layout दाà¤à¤-से-बाà¤à¤ लेआउट सकà¥à¤·à¤® करें Ascending आरोही Descending अवरोही Sort by: इसके अनà¥à¤¸à¤¾à¤° कà¥à¤°à¤®à¤¬à¤¦à¥à¤§ करें: Add जोड़ें Remove हटाà¤à¤ Move up ऊपर जाà¤à¤ Move down नीचे जाà¤à¤ Default डिफ़ॉलà¥à¤Ÿ Server requires authentication: सरà¥à¤µà¤° पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण की आवशà¥à¤¯à¤•ता है: Username: पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नाम: Password: पासवरà¥à¤¡: Feeds count: Description: विवरण: Status: सà¥à¤¥à¤¿à¤¤à¤¿: Created: फीड शामिल करने की तिथि : Last update: पिछला अदà¥à¤¯à¤¤à¤¨: News count: समाचार गणना: Good अचà¥à¤›à¤¾ Long ago ;-) बहà¥à¤¤ समय पहले;-) new नया unread अपठित Image files छवि फ़ाइलें Select Image चà¥à¤¨à¥‡à¤‚ छवि Load icon: can't open a file! लोड आइकन: फ़ाइल को खोल नहीं सकता है! FilterRulesDialog Filter Rules फ़िलà¥à¤Ÿà¤° नियम Feeds फीड All Feeds सभी फ़ीड Filter name: फ़िलà¥à¤Ÿà¤° नाम: Match all news सभी समाचार का मिलान करें Match all conditions सभी शरà¥à¤¤ का मिलान करें Match any condition किसी शरà¥à¤¤ का मिलान करें Perform these actions: इन कà¥à¤°à¤¿à¤¯à¤¾à¤“ं को पूरा करें: Please enter name for the filter. फिलà¥à¤Ÿà¤° के लिठनाम दरà¥à¤œ करें। Please enter search condition for the news filter. समाचार फिलà¥à¤Ÿà¤° के लिठखोज शरà¥à¤¤ दरà¥à¤œ करें। FindFeed Find Name नाम खोजें Find Link लिंक ढूà¤à¤¢à¥‡à¤‚ FindTextContent Find in News समाचार में खोजें Find in Titles शीरà¥à¤·à¤• में खोजें Find in Authors लेखकों में खोजें Find in Categories शà¥à¤°à¥‡à¤£à¤¿à¤¯à¥‹à¤‚ में खोजें Find in Descriptions Find in Links लिंक में खोजें Find in Browser बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में खोजें FtpDownloader Canceled! रदà¥à¤¦ कर दिया! ItemAction Mark News as Read समाचार को पढ़ें के रूप में मारà¥à¤• करें Add Star तारांकित करे Delete हटाà¤à¤ Add Label लेबल जोड़ें Play a Sound à¤à¤• धà¥à¤µà¤¨à¤¿ बजाà¤à¤ Show News in Notifier समाचार नोटिफ़ायर में दिखाà¤à¤‚ Browse बà¥à¤°à¤¾à¤‰à¤œà¤¼ करें Play चलायें Add Action कà¥à¤°à¤¿à¤¯à¤¾ जोड़ें Delete Action कà¥à¤°à¤¿à¤¯à¤¾ हटाà¤à¤ Open File... फ़ाइल खोलें ... ItemCondition Title शीरà¥à¤·à¤• Description विवरण Author लेखक Category शà¥à¤°à¥‡à¤£à¥€ State सà¥à¤¥à¤¿à¤¤à¤¿ Link लिंक News समाचार New नया Read पà¥à¤¾ हà¥à¤† Starred तारांकित Add Condition शरà¥à¤¤ जोड़ें Delete Condition शरà¥à¤¤ हटाà¤à¤ contains शामिल है doesn't contains नहीं शामिल हैं is है isn't नहीं है begins with साथ शà¥à¤°à¥‚ होता है ends with साथ समापà¥à¤¤ होता है Regular expressions रेगà¥à¤¯à¥à¤²à¤° à¤à¤•à¥à¤¸à¤ªà¥à¤°à¥‡à¤¶à¤‚स LabelDialog New Label नया लेबल Load icon... लोड आइकन ... Default डिफ़ॉलà¥à¤Ÿ Select color... रंग चà¥à¤¨à¥‡à¤‚ ... Name: नाम: Icon: आइकन: Color text: टेकà¥à¤¸à¥à¤Ÿ रंग: Color background: पृषà¥à¤ à¤­à¥‚मि रंग: Image files छवि फ़ाइलें Select Image चà¥à¤¨à¥‡à¤‚ छवि Load icon: can't open a file! लोड आइकन: फ़ाइल को खोल नहीं सकता है! MainApplication Saving data... डेटा सहेज रहा है ... MainWindow &AdBlock à¤à¤¡à¤¬à¥à¤²à¥‰à¤• Hide Categories शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤ छà¥à¤ªà¤¾à¤à¤‚ Show Categories शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤ दिखाà¤à¤ Select OPML-File चयन करें OPML फ़ाइल OPML-Files (*.%1 *.%2) OPML फ़ाइलें (*।% 1 *।% 2) Import canceled आयात रदà¥à¤¦ Import: can't open a file आयात: फ़ाइल नहीं खà¥à¤² सकती OPML-Files (*.%1) OPML फ़ाइलें (*।% 1) Export canceled निरà¥à¤¯à¤¾à¤¤ को रदà¥à¤¦ कर दिया Export: can't open a file निरà¥à¤¯à¤¾à¤¤: फ़ाइल नहीं खà¥à¤² सकती Unread: %1 अपठित:% 1 All: %1 सभी:% 1 (Browser) (बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°) New News: %1 नया समाचार:% 1 Unread News: %1 अपठित समाचार:% 1 &Add &जोड़ें Add New Feed नई फ़ीड जोड़ें &Feed... &फ़ीड F&older... फ़ो&लà¥à¤¡à¤° ... Add New Folder नया फ़ोलà¥à¤¡à¤° जोड़ें Open in New Tab नठटैब में खोलें &Delete... &हटाà¤à¤‚ ... Delete Selected Feed चयनित फ़ीड हटाà¤à¤‚ &Import Feeds... फ़ीडà¥à¤¸ &आयात करें ... Import Feeds from OPML File OPML फ़ाइल से फ़ीडà¥à¤¸ आयात करें &Export Feeds... फ़ीडà¥à¤¸ निरà¥à¤¯à¤¾à¤¤ करें ... Export Feeds to OPML File OPML फ़ाइल से फ़ीडà¥à¤¸ निरà¥à¤¯à¤¾à¤¤ करें E&xit &बाहर जाà¤à¤‚ Update Feed अदà¥à¤¯à¤¤à¤¨ फ़ीड Update Current Feed वरà¥à¤¤à¤®à¤¾à¤¨ फ़ीड अदà¥à¤¯à¤¤à¤¨ Update All सभी अदà¥à¤¯à¤¤à¤¨ करें Update All Feeds सभी फ़ीडà¥à¤¸ अदà¥à¤¯à¤¤à¤¨ करें Mark All Feeds Read सभी फ़ीडà¥à¤¸ पठित चिनà¥à¤¹à¤¿à¤¤ करें Mark Read/Unread पठित/अपठित चिनà¥à¤¹à¤¿à¤¤ करें Mark Current News Read/Unread वरà¥à¤¤à¤®à¤¾à¤¨ समाचार पठित/अपठित चिनà¥à¤¹à¤¿à¤¤ करें Mark All News Read सभी समाचार पठित चिनà¥à¤¹à¤¿à¤¤ करें Downloads डाउनलोड Clean Up... साफ - सफाई News Filters... समाचार फिलà¥à¤Ÿà¤° ... Filter News... समाचार फ़िलà¥à¤Ÿà¤° करें... Options... विकलà¥à¤ª Open Options Dialog खोलें विकलà¥à¤ª डायलॉग Filter Feeds फ़िलà¥à¤Ÿà¤° फ़ीडà¥à¤¸ Show All सब दिखाओ Show New दिखाà¤à¤ नया Show Unread दिखाà¤à¤ अपठित Show Starred Feeds तारांकित फ़ीडà¥à¤¸ दिखाà¤à¤ Show Not Working Feeds काम नहीं कर रहा फ़ीडà¥à¤¸ दिखाà¤à¤ Filter News फ़िलà¥à¤Ÿà¤° समाचार Show Starred तारांकित दिखाà¤à¤ Show Not Starred दिखाà¤à¤ जो तारांकित नहीं है Show Unread or Starred दिखाà¤à¤ अपठित या तारांकित Show Last Day दिखाà¤à¤ अंतिम दिन Show Last 7 Days पिछले 7 दिनों का दिखाà¤à¤ About... बारे में..... Show 'About' Dialog डायलॉग 'के बारे में' दिखाà¤à¤ Check for Updates... अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें.... Report a Problem... समसà¥à¤¯à¤¾ के बारे में बताà¤à¤‚ ... Open News खोलें समाचार Open in Browser बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में खोलें Open in External Browser बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में खोलें Open News in External Browser बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में समाचार खोलें Open News in New Tab नठटैब में समाचार खोलें Open in Background Tab पृषà¥à¤ à¤­à¥‚मि में टैब खोलें Open News in Background Tab पृषà¥à¤ à¤­à¥‚मि टैब में समाचार खोलें Star तारांकित करें Mark News Star तारांकित चिनà¥à¤¹à¤¿à¤¤ करें Delete हटाà¤à¤ Delete Selected News चयनित समाचार हटाà¤à¤‚ Delete All News पढ़ें समाचार हटाà¤à¤‚ Delete All News from List सूची से सभी समाचार हटाà¤à¤‚ Restore पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें Restore News समाचार पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें Copy Link लिंक पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ Restore last deleted news पिछले हटाठगठसमाचार पà¥à¤¨à¤°à¥à¤¸à¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें Mark Read पढ़ा हà¥à¤† चिहà¥à¤¨à¤¿à¤¤ करें Mark Feed Read फ़ीडà¥à¤¸ पठित चिनà¥à¤¹à¤¿à¤¤ करें Properties पà¥à¤°à¥‰à¤ªà¤°à¥à¤Ÿà¥€à¤œ &File &फ़ाइल Count Unread News अपठित समाचार गणना करें Count All News सभी समाचार गणना करें Last Update पिछले अदà¥à¤¯à¤¤à¤¨ Reset browser zoom रीसेट बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° जूम Print Web Page वेब पेज पà¥à¤°à¤¿à¤‚ट करें Preview Web Page वेब पेज पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•न करें Save page in database डेटाबेस में पृषà¥à¤  सहेजें Save page in database instead of news description बजाय समाचार विवरण के डेटाबेस में पृषà¥à¤  सहेजें Confirm Delete हटाने की पà¥à¤·à¥à¤Ÿà¤¿ करें Are you sure to delete selected elements? आप चयनित ततà¥à¤µà¥‹à¤‚ को हटाने के लिठसà¥à¤¨à¤¿à¤¶à¥à¤šà¤¿à¤¤ हैं? Menu मेनू Add Feed... फीड जोड़े &Create Backup... बैकअप बनाà¤à¤ S&how Menu Bar दिखाà¤à¤ मेनू बार Stop Update Feeds Open News Description खोलें समाचार विवरण Copy News Link समाचार लिंक की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ &View वà¥à¤¯à¥‚ Fee&ds फ़ीडà¥à¤¸ &News समाचार &Browser बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° &Tools टूलà¥à¤¸ &Help मदद Main Toolbar मà¥à¤–à¥à¤¯ उपकरण पटà¥à¤Ÿà¥€ Customize Toolbar उपकरण पटà¥à¤Ÿà¥€ अनà¥à¤•ूलित करें Main Toolbar... मà¥à¤–à¥à¤¯ उपकरण पटà¥à¤Ÿà¥€ Customize Toolbar... उपकरण पटà¥à¤Ÿà¥€ अनà¥à¤•ूलित करें Feeds Toolbar... फीड उपकरण पटà¥à¤Ÿà¥€ ... News Toolbar... समाचार उपकरण पटà¥à¤Ÿà¥€ Lock Toolbar लॉक उपकरण पटà¥à¤Ÿà¥€ Hide Toolbar छà¥à¤ªà¤¾à¤à¤‚ उपकरण पटà¥à¤Ÿà¥€ Layout लेआउट Classic कà¥à¤²à¤¾à¤¸à¤¿à¤• Newspaper समाचारपतà¥à¤° Application Style आवेदन शैली System सिसà¥à¤Ÿà¤® System2 सिसà¥à¤Ÿà¤®2 Green हरा Orange नारंगी Purple बैंगनी Pink गà¥à¤²à¤¾à¤¬à¥€ Gray धूसर Browser Position बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° सà¥à¤¥à¤¿à¤¤à¤¿ Top ऊपर Bottom नीचे Right दायें Left बाà¤à¤ Show Window विंडो दिखाà¤à¤ Previous Feed पिछला फ़ीड Next Feed अगला फीड Previous News पिछले समाचार Next News अगले समाचार News Page Up समाचार पृषà¥à¤  ऊपर News Page Down समाचार पृषà¥à¤  नीचे Next Unread News अगले अपठित समाचार Previous Unread News पिछले अपठित समाचार Switch Focus to Next Panel अगला पैनल में फोकस सà¥à¤µà¤¿à¤š करें Switch Focus to Next Panel (Tree Feeds, List News, Browser) अगला पैनल में फोकस सà¥à¤µà¤¿à¤š करें (टà¥à¤°à¥€ फ़ीड, सूची समाचार, बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°) Switch Focus to Previous Panel पिछले पैनल में फोकस सà¥à¤µà¤¿à¤š करें Switch Focus to Previous Panel (Tree Feeds, Browser, List News) पिछले पैनल में फोकस सà¥à¤µà¤¿à¤š करें (टà¥à¤°à¥€ फ़ीड, सूची समाचार, बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°) Show/Hide Tree Feeds दिखाà¤à¤/छà¥à¤ªà¤¾à¤à¤‚ टà¥à¤°à¥€ फ़ीडà¥à¤¸ Minimize to Tray टà¥à¤°à¥‡ पर ले जाये Minimize Application to Tray à¤à¤ªà¥à¤²à¤¿à¤•ेशन टà¥à¤°à¥‡ पर ले जाये Columns कॉलम Show Indentation इंडेंटेशन दिखाà¤à¤ Search Feed फ़ीड खोजे Zoom ज़ूम Zoom In ज़ूम इन Zoom in in browser बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में ज़ूम इन करें Zoom Out ज़ूम आउट Zoom out in browser बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में ज़ूम आउट करें 100% 100% Print... पà¥à¤°à¤¿à¤‚ट करें ... Print Preview... पà¥à¤°à¤¿à¤‚ट पूरà¥à¤µà¤¾à¤µà¤²à¥‹à¤•न ... Page up (Browser) पृषà¥à¤  के ऊपर जाठ(बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°) Page down (Browser) पृषà¥à¤  के नीचे जाठ(बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°) Save As... के रूप में सहेजें ... Save Page As... पृषà¥à¤  को इस रूप में सहेजें ... Show/Hide दिखाà¤à¤/छà¥à¤ªà¤¾à¤à¤‚ Feeds Toolbar फीड उपकरण पटà¥à¤Ÿà¥€ ... News Toolbar समाचार उपकरण पटà¥à¤Ÿà¥€ Browser Toolbar बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° उपकरण पटà¥à¤Ÿà¥€ Panel Categories पैनल शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤ Status Bar सà¥à¤¥à¤¿à¤¤à¤¿ पटà¥à¤Ÿà¥€ Full Screen पूरà¥à¤£ सà¥à¤•à¥à¤°à¥€à¤¨ Stay On Top शीरà¥à¤· पर रहना Categories शà¥à¤°à¥‡à¤£à¤¿à¤¯à¤¾à¤ Label चिपà¥à¤ªà¥€ Show labels menu दिखाà¤à¤ चिपà¥à¤ªà¥€ मेनू Close Tab टैब बंद करें Close Other Tabs अनà¥à¤¯ टैब बंद करें Close All Tabs सभी टैब को बंद करें Switch to next tab अगले टैब में सà¥à¤µà¤¿à¤š करे Switch to previous tab पिछले टैब में सà¥à¤µà¤¿à¤š करे Unread अपठित Starred तारांकित Deleted नषà¥à¤Ÿ किया हà¥à¤† Labels चिपà¥à¤ªà¥€à¤¯à¤¾à¤‚ Decrease news list/increase browser समाचार सूची घटाà¤à¤‚/ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° बà¥à¤¾à¤à¤ Increase news list/decrease browser समाचार सूची बà¥à¤¾à¤à¤/ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° घटाà¤à¤‚ Find खोजें Open Homepage Feed खोलें मà¥à¤–पृषà¥à¤  फ़ीड Sort by Name नाम दà¥à¤µà¤¾à¤°à¤¾ कà¥à¤°à¤®à¤¬à¤¦à¥à¤§ करें Collapse All Folders सभी फ़ोलà¥à¤¡à¤° को संकà¥à¤šà¤¿à¤¤ करें Expand All Folders सभी फ़ोलà¥à¤¡à¤°à¥‹à¤‚ का विसà¥à¤¤à¤¾à¤° करे Next Folder अगला फ़ोलà¥à¤¡à¤° Previous Folder पिछले फ़ोलà¥à¤¡à¤° Expand Folder फ़ोलà¥à¤¡à¤° का विसà¥à¤¤à¤¾à¤° करे Setting Page: Labels सेटिंग पृषà¥à¤ : लेबल Share साà¤à¤¾ करें Sort By इसके अनà¥à¤¸à¤¾à¤° कà¥à¤°à¤®à¤¬à¤¦à¥à¤§ करें: Ascending आरोही Descending अवरोही Check for updates अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें A new version of QuiteRSS... QuiteRSS का à¤à¤• नया संसà¥à¤•रण... Loading... लोड हो रहा ... Web Page वेब पृषà¥à¤  Save As के रूप में सहेजें HTML-Files (*.%1) à¤à¤šà¤Ÿà¥€à¤à¤®à¤à¤² फ़ाइलें (*।% 1) Text files (*.%2) टेकà¥à¤¸à¥à¤Ÿ फ़ाइलें (*।% 2) Save As: can't open a file के रूप में सहेजें: फ़ाइल को खोल नहीं सकता है! Choose Directory डायरेकà¥à¤Ÿà¥à¤°à¥€ चà¥à¤¨à¥‡à¤‚ Important महतà¥à¤¤à¥à¤µà¤ªà¥‚रà¥à¤£ Work काम Personal वà¥à¤¯à¤•à¥à¤¤à¤¿à¤—त To Do करने के लिठLater बाद में Amusingly मज़ाकिया NetworkManager SSL Certificate Error! à¤à¤¸à¤à¤¸à¤à¤² पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤° तà¥à¤°à¥à¤Ÿà¤¿! The "%1" server has the following errors in the SSL certificate: "% 1" सरà¥à¤µà¤° SSL पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤° में निमà¥à¤¨ तà¥à¤°à¥à¤Ÿà¤¿à¤¯à¤¾à¤‚ हैं: <b>Organization: </b> <b> संगठन: </ b> <b>Domain Name: </b> <b> डोमेन नाम: </ b> <b>Expiration Date: </b> <b> समापà¥à¤¤à¤¿ की तिथि: </ b> <b>Error: </b> <b> तà¥à¤°à¥à¤Ÿà¤¿: </ b> Would you like to make an exception for this certificate? आप इस पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤° के लिठà¤à¤• अपवाद बनाना चाहते हैं? NewsFiltersDialog News Filters समाचार फिलà¥à¤Ÿà¤° ... Feeds फ़ीडà¥à¤¸ Filter Name फ़िलà¥à¤Ÿà¤° नाम: New... नया... Edit... इडिट... Delete... हटाà¤à¤‚ ... Move up ऊपर जाà¤à¤ Move down नीचे जाà¤à¤ Run Filter फ़िलà¥à¤Ÿà¤° चलाà¤à¤‚ Delete Filter फ़िलà¥à¤Ÿà¤° हटाà¤à¤ Are you sure you want to delete the filter '%1'? कà¥à¤¯à¤¾ आप '% 1' फिलà¥à¤Ÿà¤° को हटाना चाहते हैं? NewsHeader Icon Feed आइकन फ़ीड Title शीरà¥à¤·à¤• Published पà¥à¤°à¤•ाशित Received पà¥à¤°à¤¾à¤ªà¥à¤¤ Author लेखक Category शà¥à¤°à¥‡à¤£à¥€ Read पà¥à¤¾ हà¥à¤† Star तारांकित Label चिपà¥à¤ªà¥€ Feed Title फ़ीड शीरà¥à¤·à¤• Link लिंक NewsItem Mark Read/Unread पठित/अपठित चिनà¥à¤¹à¤¿à¤¤ करें Delete News समाचार हटाà¤à¤‚ NewsTabWidget Loading... (%p%) लोड हो रहा ... (% P%) Home मà¥à¤–पृषà¥à¤  Open Page in External Browser बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में पृषà¥à¤  खोलें Open Link in External Browser बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में लिंक खोलें Open Link लिंक खोलें Open in New Tab नठटैब में खोलें Save Link... लिंक को इस रूप में सहेजें ... Save Image... छवि सहेजें Copy Link लिंक पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ Copy पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ Go Back वापस जाओ Go Forward आगे बढ़ो Stop रà¥à¤•ें Reload पà¥à¤¨à¤ƒ लोड करें Copy Image छवि की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाठCopy Image Address छवि पता की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाठLoad Images छवियों को पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ करें Auto Load Images to News View छवियाठसà¥à¤µà¤¤à¤ƒ लोड करे समाचार वà¥à¤¯à¥‚ में No Load Images छवियों को पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ नही करें No Load Images to News View छवियाठलोड नही करे समाचार वà¥à¤¯à¥‚ में Close Tab टैब बंद करें Auto Load Images in News View छवियाठसà¥à¤µà¤¤à¤ƒ लोड करे समाचार वà¥à¤¯à¥‚ में Don't Load Images छवियों को पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ नही करें Don't Load Images in News View छवियाठलोड नही करे समाचार वà¥à¤¯à¥‚ में Comments टिपà¥à¤ªà¤£à¤¿à¤¯à¤¾à¤ Author: %1 लेखक:% 1 audio ऑडियो video वीडियो media मीडिया Link to लिंक करे Mark Read/Unread पठित/अपठित चिनà¥à¤¹à¤¿à¤¤ करें Mark News Star तारांकित चिनà¥à¤¹à¤¿à¤¤ करें Label चिपà¥à¤ªà¥€ Share साà¤à¤¾ करें Open News in External Browser बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में समाचार खोलें Delete नषà¥à¤Ÿ करें NotificationWidget Close बंद करें Mark All News Read सभी समाचार पठित चिनà¥à¤¹à¤¿à¤¤ करें Previous Page पिछला पृषà¥à¤  Next Page अगला पृषà¥à¤  Incoming News: %1 आने वाले समाचार:% 1 Page %1 of %2 %2 का पृषà¥à¤  %1 OptionsDialog Options विकलà¥à¤ª General सामानà¥à¤¯ System Tray सिसà¥à¤Ÿà¤® टà¥à¤°à¥‡ Network Connections नेटवरà¥à¤• कनेकà¥à¤¶à¤¨ Browser बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° Feeds फीडà¥à¤¸ Labels चिपà¥à¤ªà¥€ Notifications सूचनाà¤à¤‚ Passwords पासवरà¥à¤¡: Language भाषा Fonts & Colors फ़ॉनà¥à¤Ÿà¥à¤¸ और रंग Keyboard Shortcuts कीबोरà¥à¤¡ शॉरà¥à¤Ÿà¤•ट Warning: key is already assigned to चेतावनी: कà¥à¤‚जी पहले किसी को सौंपा है Show splash screen on startup सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…प पर सà¥à¤ªà¥à¤²à¥ˆà¤¶ सà¥à¤•à¥à¤°à¥€à¤¨ दिखाà¤à¤ Reopen last opened feeds on startup सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…प पर पिछले खोले फीडà¥à¤¸ दिखाये Open new tab next to active सकà¥à¤°à¤¿à¤¯ टैब के अगले नया टैब खोलें Hide feeds tree when opening tabs टैब खोलते समय फीडà¥à¤¸ टà¥à¤°à¥€ छà¥à¤ªà¤¾à¤ Show default rss-icon instead of favourite one बजाय पसंदीदा आइकन के डिफ़ॉलà¥à¤Ÿ आरà¤à¤¸à¤à¤¸ आइकन दिखाà¤à¤ Automatically collapse folders सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से फ़ोलà¥à¤¡à¤°à¥‹à¤‚ को संकà¥à¤šà¤¿à¤¤ करें Show close button on tab टैब पर बंद बटन दिखाà¤à¤ Automatically check for updates सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से अदà¥à¤¯à¤¤à¤¨ करें Help improve QuiteRSS by sending usage information उपयोग की जानकारी भेजकर QuiteRSS सà¥à¤§à¤¾à¤° करने में मदद दे Store a DB in memory (requires program restart) DB को मेमोरी में संगà¥à¤°à¤¹à¥€à¤¤ करे ( पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® को पà¥à¤¨à¤ƒ आरंभ की आवशà¥à¤¯à¤•ता है) Save DB stored in memory to file every मेमोरी में संगà¥à¤°à¤¹à¥€à¤¤ DB को फाइल में सहेजें इस समयावधि में minutes मिनटों Run QuiteRSS at Windows startup विंडोज सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…प पर QuiteRSS चलाà¤à¤ Show system tray icon दिखाà¤à¤ सिसà¥à¤Ÿà¤® टà¥à¤°à¥‡ आइकन starting QuiteRSS QuiteRSS शà¥à¤°à¥‚ करे minimizing QuiteRSS QuiteRSS को नीचे लाà¤à¤ closing QuiteRSS QuiteRSS बंद करे Show static icon सà¥à¤¥à¤¿à¤° आइकन दिखाà¤à¤‚ Change icon for incoming new news आने वाली नई खबर के लिठचिहà¥à¤¨ बदलें Show count of new news नई खबरों की गिनती दिखाà¤à¤ Show count of unread news अपठित खबरों की गिनती दिखाà¤à¤ Single click instead of double click for show window शो विंडो पर डबल कà¥à¤²à¤¿à¤• करें बजाय कि सिंगल कà¥à¤²à¤¿à¤• Empty working set on minimize to tray टà¥à¤°à¥‡ के नीचे पहà¥à¤šà¤¨à¥‡ पर कारà¥à¤¯à¤°à¤¤ सेट को खाली करें Move to the system tray when: सिसà¥à¤Ÿà¤® टà¥à¤°à¥‡ में ले जाà¤à¤ तब जब: Tray icon behavior: टà¥à¤°à¥‡ आइकन वà¥à¤¯à¤µà¤¹à¤¾à¤°: Direct connection to the Internet इंटरनेट से पà¥à¤°à¤¤à¥à¤¯à¤•à¥à¤· कनेकà¥à¤¶à¤¨ System proxy configuration (if available) सिसà¥à¤Ÿà¤® पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ विनà¥à¤¯à¤¾à¤¸ (यदि उपलबà¥à¤§ हो) Manual proxy configuration: मैनà¥à¤¯à¥à¤…ल पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ विनà¥à¤¯à¤¾à¤¸: Proxy server: पà¥à¤°à¥‰à¤•à¥à¤¸à¥€ सरà¥à¤µà¤°: Port: पोरà¥à¤Ÿ: Username: पà¥à¤°à¤¯à¥‹à¤•à¥à¤¤à¤¾ नाम: Password: पासवरà¥à¤¡: Request timeout: समय ख़तà¥à¤® होने का अनà¥à¤°à¥‹à¤§: Number of requests: अनà¥à¤°à¥‹à¤§à¥‹à¤‚ की संखà¥à¤¯à¤¾: Number of retries: पà¥à¤¨à¤°à¥à¤ªà¥à¤°à¤¯à¤¾à¤¸ की संखà¥à¤¯à¤¾: Options network requests when updating feeds (requires program restart): विकलà¥à¤ª नेटवरà¥à¤• अनà¥à¤°à¥‹à¤§ फ़ीड को अपडेट करते समय (कारà¥à¤¯à¤•à¥à¤°à¤® को पà¥à¤¨à¤ƒ आरंभ की आवशà¥à¤¯à¤•ता है) : Use embedded browser à¤à¤®à¥à¤¬à¥‡à¤¡à¥‡à¤¡ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° का उपयोग करें Use external browser बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° का पà¥à¤°à¤¯à¥‹à¤— करें Default external browser डिफ़ॉलà¥à¤Ÿ बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° Following external browser: बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° इस पà¥à¤°à¤•ार है: Browse... बà¥à¤°à¤¾à¤‰à¤œà¤¼ करें ... Load images छवियों को पà¥à¤°à¤¸à¥à¤¤à¥à¤¤ करें Enable JavaScript जावासà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ सकà¥à¤·à¤® करें Enable plug-ins पà¥à¤²à¤—-इन सकà¥à¤·à¤® करें Open links in embedded browser in background पृषà¥à¤ à¤­à¥‚मि में à¤à¤®à¥à¤¬à¥‡à¤¡à¥‡à¤¡ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में लिंक खोलें Open links in external browser in background (experimental) लिंक को पृषà¥à¤ à¤­à¥‚मि में बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° में खोलें (पà¥à¤°à¤¾à¤¯à¥‹à¤—िक) Default zoom on pages: पनà¥à¤¨à¥‹à¤‚ पर डिफ़ॉलà¥à¤Ÿ ज़ूम: Browser selection: बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° चयन: External browser: बाहरी बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤°: Content: सामगà¥à¤°à¥€: User style sheet: उपयोगकरà¥à¤¤à¤¾ का सà¥à¤Ÿà¤¾à¤‡à¤² शीट: Maximum pages in cache कैचे में अधिकतम पृषà¥à¤  Store cache in: सà¥à¤Ÿà¥‹à¤° कैचे में: Maximum size of disk cache डिसà¥à¤• कैचे का अधिकतम आकार MB à¤à¤®à¤¬à¥€ Use disk cache उपयोग डिसà¥à¤• कैचे Allow local data to be set लोकल डेटा को सेट होने दें Keep local data only until quit application à¤à¤ªà¥à¤²à¤¿à¤•ेशन से बाहर निकलने तक ही सà¥à¤¥à¤¾à¤¨à¥€à¤¯ डेटा रखे Block sites from setting any data साइट को डेटा सेट करने से रोके Clear साफ़ करें Cookies: कà¥à¤•ीज़: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. फà¥à¤²à¥ˆà¤¶ सामगà¥à¤°à¥€ को ऑटो लोड होने से रोकने के लिठ"कà¥à¤²à¤¿à¤• टू फà¥à¤²à¥ˆà¤¶" पà¥à¤²à¤—इन पर कà¥à¤²à¤¿à¤• करें। आप हमेशा फà¥à¤²à¥ˆà¤¶ आइकन पर कà¥à¤²à¤¿à¤• करके इसे लोड कर सकते हैं। Use Click to Flash "कà¥à¤²à¤¿à¤• टू फà¥à¤²à¥ˆà¤¶" का उपयोग करें Add... जोड़ें ... Remove... हटाà¤à¤ Ask where to save each file before downloading डाउनलोड करने से पहले पà¥à¤°à¤¤à¥à¤¯à¥‡à¤• फ़ाइल को सहेजने का सà¥à¤¥à¤¾à¤¨ पूछें Download location: डाउनलोड सà¥à¤¥à¤¾à¤¨: History इतिहास Click to Flash "कà¥à¤²à¤¿à¤• टू फà¥à¤²à¥ˆà¤¶" Downloads डाउनलोड Automatically update the feeds on startup सà¥à¤µà¤¤à¤ƒ सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…प पर फ़ीड को अपडेट करें Automatically update the feeds every सà¥à¤µà¤šà¤¾à¤²à¤¿à¤¤ रूप से हर फ़ीड को अपडेट हर seconds सेकंड hours घंटे Nothing to do कà¥à¤› भी नहीं करना Dec दिसं December दिसंबर Display format for date: तिथि के लिठपà¥à¤°à¤¦à¤°à¥à¤¶à¤¨ सà¥à¤µà¤°à¥‚प: time: समय: Alternating row background colors बदल बदल के पंकà¥à¤¤à¤¿à¤¯à¥‹à¤‚ के पृषà¥à¤ à¤­à¥‚मि रंग Simplified representation of date and time तारीख और समय की सरलीकृत पà¥à¤°à¤¤à¤¿à¤¨à¤¿à¤§à¤¿à¤¤à¥à¤µ Show All सब दिखाओ Show New नई दिखाà¤à¤ Show Unread अपठित दिखाà¤à¤ Show Starred तारांकित दिखाà¤à¤ Show Not Starred दिखाà¤à¤ जो तारांकित नहीं है Show Unread or Starred दिखाà¤à¤ अपठित या तारांकित Show Last Day दिखाà¤à¤ अंतिम दिन Show Last 7 Days पिछले 7 दिनों दिखाà¤à¤ Style sheet for news: खबर के लिठसà¥à¤Ÿà¤¾à¤‡à¤² शीट: Mark news as read: समाचार पठित चिनà¥à¤¹à¤¿à¤¤ करें on selecting. With timeout चयन पर। समय खतà¥à¤® होने के साथ after switching to another news à¤à¤• अनà¥à¤¯ खबर पर जाने के बाद Mark displayed news as read when switching feeds Mark displayed news as read when closing tab Mark displayed news as read on minimize Change behavior of action 'Next Unread News' starred news तारांकित समाचार labeled news Automatically mark identical news as read Prevent accidental deletion of: Enable cleanup on shutdown Maximum age of news in days to keep: Maximum number of news to keep: Delete read news Never delete unread news Never delete starred news तारांकित समाचार को नषà¥à¤Ÿ नहीं करें Never delete labeled news Clean up 'Deleted' Enable DB optimization (slower shutdown) Reading Clean Up New... Edit... Delete... Move up Move down Show when inactive main window Screen Transparency Show titles feeds Show icon feed Show button 'Mark All News Read' Show button 'Mark Read/Unread' Show button 'Open in External Browser' Show button 'Delete News' Play sound for incoming new news Play Display notification for incoming news Top Left Top Right Bottom Left Bottom Right Review Position Show maximum of item on page notification Width list items pixels Close notification after Do not show notification in fullscreen mode Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Notification Sound Selection of feeds All Feeds Site User Password Delete Delete All Show Passwords Version Author Contact Choose language: Type Font Feeds list font News list font News title font News text font Notification font Change... Reset Feeds list color Feeds list background News list color News list background Focused news color Focused news background color Link color Title color Date color Author color News text color News title background News background Feed with new news Count of unread news in feeds tree Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view Text color of new news Show feeds tree toggle Clear new status when minimize to tray Set focus on the last opened news Set focus at the top of news list समाचार सूची के शीरà¥à¤· पर फोकस सेट करें Set focus on the unread news अपठित समाचार पर फोकस सेट करें Open the news समाचार खोलें Default news filter: डिफ़ॉलà¥à¤Ÿ समाचार फिलà¥à¤Ÿà¤°: Action on feed opening: फ़ीड खोलने पर कारà¥à¤°à¤µà¤¾à¤ˆ: Show news description instead of loading web page वेब पेज लोड करने के बजाय की खबर विवरण दिखाà¤à¤ Text color of unread news अपठित समाचार का टेकà¥à¤¸à¥à¤Ÿ रंग Focused feed color फोकसà¥à¤¡ फ़ीड रंग Focused feed background color फोकसà¥à¤¡ फ़ीड पृषà¥à¤ à¤­à¥‚मि रंग Standard मानक Fixed Fixed Serif Serif Sans Serif Sans Serif Cursive पà¥à¤°à¤µà¤¾à¤¹à¥€ Fantasy कलà¥à¤ªà¤¨à¤¾ Default font size डिफ़ॉलà¥à¤Ÿ फ़ॉनà¥à¤Ÿ आकार Fixed font size निशà¥à¤šà¤¿à¤¤ फ़ॉनà¥à¤Ÿ आकार Minimum font size नà¥à¤¯à¥‚नतम फ़ॉनà¥à¤Ÿ आकार Minimum logical font size नà¥à¤¯à¥‚नतम लॉजिकल फ़ॉनà¥à¤Ÿ आकार Font families: फ़ॉनà¥à¤Ÿ परिवार: Font sizes: फ़ॉनà¥à¤Ÿ आकार: Fonts फ़ॉनà¥à¤Ÿà¥à¤¸ Fonts Browser फ़ॉनà¥à¤Ÿà¥à¤¸ बà¥à¤°à¤¾à¤‰à¤œà¤¼à¤° Colors रंग Filter फ़िलà¥à¤Ÿà¤° Action कà¥à¤°à¤¿à¤¯à¤¾ Description विवरण Shortcut शॉरà¥à¤Ÿà¤•ट Shortcut: शॉरà¥à¤Ÿà¤•ट: Open File... फ़ाइल खोलें ... Select Style Sheet File सà¥à¤Ÿà¤¾à¤‡à¤² शीट फाइल का चयन करें Open Directory... डायरेकà¥à¤Ÿà¤°à¥€ खोलें... Add site to whitelist साइट को जोड़ें शà¥à¤µà¥‡à¤¤à¤¸à¥‚ची Site without 'http://' (ex. youtube.com) बिना साइट 'http://' (ex. youtube.com) QAbstractSpinBox &Step up ऊपर जाà¤à¤ Step &down नीचे जाà¤à¤ &Select All सभी चà¥à¤¨à¥‡à¤‚ QDialogButtonBox Close बंद करें Cancel रदà¥à¤¦ करना &Yes हाठ&No नहीं QFtp Not connected कनेकà¥à¤Ÿà¥‡à¤¡ नहीं Host %1 not found होसà¥à¤Ÿ नहीं मिला %1 Connection refused to host %1 होसà¥à¤Ÿ ने कनेकà¥à¤¶à¤¨ करने से इनकार कर दिया %1 Connection timed out to host %1 होसà¥à¤Ÿ से कनेकà¥à¤¶à¤¨ करने के का समय समापà¥à¤¤ %1 Connected to host %1 होसà¥à¤Ÿ से कनेकà¥à¤Ÿà¥‡à¤¡ %1 Connection refused for data connection डेटा कनेकà¥à¤¶à¤¨ के लिठमना कर दिया Unknown error अजà¥à¤žà¤¾à¤¤ तà¥à¤°à¥à¤Ÿà¤¿ Connecting to host failed: %1 होसà¥à¤Ÿ को कनेकà¥à¤Ÿ करना विफल रहा: % 1 Login failed: %1 लॉगिन विफल: % 1 Listing directory failed: %1 डायरेकà¥à¤Ÿà¤°à¥€ सूचीबदà¥à¤§ करना विफल: % 1 Changing directory failed: %1 डायरेकà¥à¤Ÿà¤°à¥€ बदलना विफल: % 1 Downloading file failed: %1 फ़ाइल डाउनलोडिंग विफल: % 1 Uploading file failed: %1 फ़ाइल अपलोड विफल: % 1 Removing file failed: %1 फ़ाइल हटाना विफल: % 1 Creating directory failed: %1 डायरेकà¥à¤Ÿà¤°à¥€ बनाना विफल: % 1 Removing directory failed: %1 डायरेकà¥à¤Ÿà¤°à¥€ हटाना विफल: % 1 Connection closed कनेकà¥à¤¶à¤¨ बंद QLineEdit &Undo पूरà¥à¤µà¤µà¤¤ करें &Redo फिर से करें Cu&t कट करें &Copy पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ &Paste चिपकाà¤à¤ Delete हटाà¤à¤ Select All सभी चà¥à¤¨à¥‡à¤‚ QMultiInputContext Select IM चयन करें आईà¤à¤® QObject Cannot start external program बाहरी पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® शà¥à¤°à¥‚ नहीं कर सकते Cannot start external program! %1 बाहरी पà¥à¤°à¥‹à¤—à¥à¤°à¤¾à¤® शà¥à¤°à¥‚ नहीं कर सकते! % 1 Error तà¥à¤°à¥à¤Ÿà¤¿ QTextControl &Undo पूरà¥à¤µà¤µà¤¤ करें &Redo फिर से करें Cu&t कट करें &Copy पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ &Paste चिपकाà¤à¤ Delete हटाà¤à¤ Select All सभी चà¥à¤¨à¥‡à¤‚ Copy &Link Location लिंक सà¥à¤¥à¤¾à¤¨ की पà¥à¤°à¤¤à¤¿à¤²à¤¿à¤ªà¤¿ बनाà¤à¤ QWizard Cancel रदà¥à¤¦ करना < &Back < पिछला &Finish अंत &Next > अगला> RSSDetectionWidget Untitled feed शीरà¥à¤·à¤•हीन फ़ीड RequestFeed Server requires authentication! सरà¥à¤µà¤° को पà¥à¤°à¤®à¤¾à¤£à¥€à¤•रण की आवशà¥à¤¯à¤•ता है! Server replied: Not Found! सरà¥à¤µà¤° पà¥à¤°à¤¤à¤¿à¤•à¥à¤°à¤¿à¤¯à¤¾: नहीं मिला! Redirect error! तà¥à¤°à¥à¤Ÿà¤¿ पà¥à¤¨à¤°à¥à¤¨à¤¿à¤°à¥à¤¦à¥‡à¤¶à¤¿à¤¤! Request timeout! अनà¥à¤°à¥‹à¤§ समय समापà¥à¤¤à¤¿! SQLiteDriver Error opening database डेटाबेस खोलने में तà¥à¤°à¥à¤Ÿà¤¿ Error closing database डेटाबेस बंद करने में तà¥à¤°à¥à¤Ÿà¤¿ Unable to begin transaction लेन-देन शà¥à¤°à¥‚ करने में असमरà¥à¤¥ Unable to commit transaction लेन-देन के लिठपà¥à¤°à¤¤à¤¿à¤¬à¤¦à¥à¤§ करने में असमरà¥à¤¥ Unable to rollback transaction लेन-देन रोलबैक करने में असमरà¥à¤¥ SQLiteResult Unable to fetch row पंकà¥à¤¤à¤¿ लाने में असमरà¥à¤¥ No query कोई कà¥à¤µà¥‡à¤°à¥€ नहीं Unable to execute statement कथन निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने में असमरà¥à¤¥ Unable to execute multiple statements at a time à¤à¤• समय में कई कथन निषà¥à¤ªà¤¾à¤¦à¤¿à¤¤ करने में असमरà¥à¤¥ Unable to reset statement कथन रीसेट करने में असमरà¥à¤¥ Unable to bind parameters पà¥à¤°à¤¾à¤šà¤²à¥‹à¤‚ को सवेरने में असमरà¥à¤¥ Parameter count mismatch पà¥à¤°à¤¾à¤šà¤² गणना बेमेल SslErrorDialog SSL Certificate Error! à¤à¤¸à¤à¤¸à¤à¤² पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤° तà¥à¤°à¥à¤Ÿà¤¿! Only for this session केवल इस सतà¥à¤° के लिठUpdateAppDialog Check for Updates अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š करें Checking for updates... अदà¥à¤¯à¤¤à¤¨ के लिठजाà¤à¤š हो रही है ... Loading history... लोड हो रहा है इतिहास ... Don't remind about this version इस संसà¥à¤•रण के बारे में याद मत दिलाओ &Install सà¥à¤¥à¤¾à¤ªà¤¿à¤¤ करें You already have the latest version आप पहले से ही नवीनतम संसà¥à¤•रण है A new version of QuiteRSS is available! QuiteRSS का à¤à¤• नया संसà¥à¤•रण उपलबà¥à¤§ है! Click here to go to the download page डाउनलोड पृषà¥à¤  पर जाने के लिठयहां कà¥à¤²à¤¿à¤• करें Your version is: आपका संसà¥à¤•रण है: Current version is: वरà¥à¤¤à¤®à¤¾à¤¨ संसà¥à¤•रण है: Error checking updates तà¥à¤°à¥à¤Ÿà¤¿ जाà¤à¤š अदà¥à¤¯à¤¤à¤¨ quiterss-0.18.3/lang/quiterss_hu.qph000066400000000000000000001266411265173051100175030ustar00rootroot00000000000000 Pause Szünet Next KövetkezÅ‘ Open Megnyitás Play Lejátszás Stop Leállítás Previous ElÅ‘zÅ‘ Volume HangerÅ‘ Playlist (show/hide) Lejátszási lista (megjelenítés/rejtés) Open File... Fájl megnyitása... Aspect ratio Oldalarány Scale mode Méretezési mód Default Alapértelmezett Stretch to window Ablakméretre nyújtás Mute Némítás Full screen Teljes képernyÅ‘ Media files (all types) Médiafájlok (összes típus) Video files Videófájlok Audio files Hangfájlok All files Az összes fájl &File &Fájl &Add... Hozzáadás... &Delete... Törlés... Delete selected feed Kijelölt hírcsatorna törlése Add new feed Új hírcsatorna felvétele &View Nézet &Tools Eszközök &Help Súgó &View &Nézet &Edit Szerkesztés E&xit Kilépés &Tools &Eszközök Fee&ds Hírcsatornák &News Hírek Fee&ds Hírcsatornák Options... Beállítások... Show window Ablak megjelenítése &Import feeds... Hírcsatornák importálása... Import feeds from OPML file Hírcsatornák importálása OPML fájlba Proxy enabled Proxy engedélyezve Select OPML-file OPML-fájl kiválasztása OPML-files (*.opml) OPML-fájlok (*.opml) Import canceled Importálás megszakítva Import: can't open a file Importálás: a fájlt nem lehet megnyitni Feeds Hírcsatornák Update Frissítés Update current feed Aktuális hírcsatorna frissítése Update all Összes frissítése Update all feeds Az összes hírcsatorna frissítése All: Összes: Unread: Olvasatlan: &ToolBar Eszköztár Show ToolBar Eszköztár megjelenítése ToolBar Eszköztár Password: Jelszó: Port: Port: Network Connections Hálózati kapcsolatok System proxy configuration (if available) Rendszer proxy konfiguráció (ha elérhetÅ‘) Apply Alkalmaz Update feeds... (%p%) Hírcsatornák frissítése... (%p%) Received Érkezett Title Cím Open options dialog A beállítások ablak megnyitása Are you sure to delete the feed '%1'? Valóban törli a(z) '%1' hírcsatornát? Username: Felhasználónév: Proxy server: Proxykiszolgáló: Date Dátum Delete feed Hírcsatorna törlése Options Opciók Add feed Hírcsatorna hozzáadása author KészítÅ‘ Read Olvasás Star Csillagozás Author KészítÅ‘ Show All Összes megjelenítése Show Unread Olvasatlan megjelenítése Filter SzűrÅ‘ Error loading to WebView Webnézet betöltési hiba Loading... (%p%) Betöltés... (%p%) Mark Read Megjelölés olvasottként Mark current news read Az aktuális hírek megjelölése olvasotként Mark all news Read Az összes hír megjelölése olvasottként About Névjegy Version Verzió The authors: KészítÅ‘k: &Close &Bezárás Feed Title: Hírcsatorna címe: Feed Title: Hírcsatorna címe: Feed Url: Hírcsatorna Url: Feed Title: Hírcsatorna címe: Mark all news Read A hírek megjelölése olvasottként &Load images Képek betöltése Open in Browser Megnyitás a böngészÅ‘ben Delete Törlés Open in Browser Megnyitás a böngészÅ‘ben Mark feed read A hírcsatorna megjelölése olvasottként Properties Tulajdonságok Properties feed Hírcsatorna tulajdonságok Author: KészítÅ‘: Title: Cím: Auto load images to news view A képek automatikus betöltése a hírek nézetbe Language Nyelv Automatically update the feeds on start-up A hírcsatornák automatikus frissítése indításkor Automatically update the feeds every A hírcsatornák automatikus frissítése minden General Ãltalános English (%1) Angol (%1) * - changes will take effect after restart * - a módosítások újraindítás után lépnek érvénybe Russian (%1) Orosz (%1) Choose language:* Válasszon nyelvet:* Show New Új megjelenítése Check for updates... Frissítések ellenÅ‘rzése... Unread: %1 Olvasatlan: %1 All: %1 Összes: %1 Checking for updates... Frissítések ellenÅ‘rzése... Check for updates Frissítések ellenÅ‘rzése You already have the latest version Jelenleg a legújabb verzióval rendelkezik A new version of QuiteRSS is available! Új QuiteRSS verzió érhetÅ‘ el! Click here to go to the download page Kattintson ide a letöltési oldalra ugráshoz Current version is: Aktuális verzió: Error checking updates Frissítés ellenÅ‘rzési hiba Fonts Betűtípusok Choose language: Válasszon nyelvet: Type Típus Font Betűtípus Feeds list font Hírcsatorna lista betűtípusa News list font Hírek lista betűtipusa News font Hírek betűtípusa News font Hírek betűtípusa Change... Módosítás... Reset Visszaállítás Load feed title Hírcsatorna cím betöltése Feed URL: Hírcsatorna URL: Homepage: Honlap: System tray Rendszertálca minutes percben starting QuiteRSS A QuiteRSS indításakor minimizing QuiteRSS A QuiteRSS minimalizálásakor closing QuiteRSS A QuiteRSS bezárásakor Single click instead of double click for show window Egy kattintás a dupla kattintás helyett az ablak megjelenítéséhez Empty working set on minimize to tray Munkakészlet ürítése a tálcára küldéskor Move to the system tray when: Ãthelyezés a tálcára a következÅ‘ esetben: No load images Ne töltse be a képeket No load images to news view Ne töltse be a képeket hírek nézetbe Load images Képek betöltése Style Stílus Icon Ikon Text Szöveg Text beside icon Ikon melletti szöveg Text under icon Ikon alatti szöveg Big Nagy Normal Normál Small Kicsi Mark current news read/unread Az aktuális hírek megjelölése olvasotként/olvasatlanként Mark Read/Unread Olvasott/olvasatlan Update feed Hírcsatorna frissítése Icon size Ikonméret Show amount of new news Új hírek számának megjelenítése Mark selected news as read after A kijelölt hírek megjelölése olvasottként seconds másodperc után Mark selected news as read after A kijelölt hírek megjelölése olvasottként Reading Olvasás New news: %1 Új hírek: %1 Show static icon Statikus ikon megjelenítése Change icon for incoming new news Ikon változtatása a beérkezÅ‘ híreknél Show the count of new news Új hírek számának megjelenítése Show the count of unread news Az olvasatlan hírek számának megjelenítése Tray icon behavior: Tálca ikon viselkedés: New news: %1 Új hírek: %1 Mark all feeds Read Az összes hírcsatorna megjelölése olvasottként Clear status new on minimize to tray Az új státusz törlése a tálcára küldéskor Published Közzétéve Browser BöngészÅ‘ Use the embedded browser Beágyazott böngészÅ‘ használata Show count of new news Az új hírek számának megjelenítése Show count of unread news Olvasatlan hírek számának megjelenítése Update done A frissítés kész Acknowledgements: Köszönetnyilvánítás: Export canceled Exportálás megszakítva Export: can't open a file Exportálás: a fájlt nem lehet megnyitni &Export feeds... Hírcsatornák exportálása... Export feeds to OPML file Hírcsatornák exportálása OPML fájlba Loading history... ElÅ‘zmények betöltése... News filters... Hír-szűrÅ‘k... Filter news... Hírek szűrése... Category Kategória Play sound for incoming new news Hangjelzés a bejövÅ‘ hírek esetén Enable JavaScript JavaScript engedélyezése Enable plug-ins BeépülÅ‘ modulok engedélyezése Notifications Értesítések Are you sure to delete the filter '%1'? Valóban törli a(z) '%1' szűrÅ‘t? Delete... Törlés... New... Új... Edit... Szerkesztés... Move up Feljebb Move down Lejjebb Delete filter SzűrÅ‘ törlése Name filter SzűrÅ‘ neve Location Hely Status Ãllapot New Új Add condition Feltétel hozzáadása Delete condition Feltétel törlése Description Leírás doesn't contains nem tartalmaz is van doesn't contains nem tartalmaz contains tartalmaz isn't nem begins with kezdÅ‘dik ends with végzÅ‘dik Add action Művelet hozzáadása Delete action Művelet törlése Add star Csillag hozzáadása Mark news as read Hírek megjelölése olvasottként Filter rules Szűrési szabályok Perform these actions: Műveletek végrehajtása: Move news Hírek áthelyezése Copy news Hírek másolása Copy news to Hírek másolása Move news to HÃrek áthelyezése Match all conditions Az összes feltételnek megfelelÅ‘ Match any condition Bármely feltételnek megfelelÅ‘ Mark news star Hírek megjelölése csillaggal Delete selected news Kijelölt hírek törlése Previous feed ElÅ‘zÅ‘ hírcsatorna Next feed KövetkezÅ‘ hírcsatorna Previous news Korábbi hírek Next news KövetkezÅ‘ hír Shortcut: Gyorsbillentyű: Keyboard shortcuts Billentyűparancsok hours órában Action Művelet Clear Törlés Show splash screen on startup IndítóképernyÅ‘ megjelenítése betöltéskor Show system tray icon Rendszertálca ikon megjelenítése Reopen last opened feeds on startup A utoljára megnyitott hírcsatornák megnyitása indításkor Show news' description instead of loading web page Hírleírások megjelenítése a weblap betöltése helyett Maximum number of news to keep: A megtartandó hírek maximális száma: Maximum age of news in days to keep: A megtartandó hírek maximális ideje napban: Delete read news Olvasott hírek törlése Never delete unread news Soha ne törölje az olvasatlan híreket Never delete starred news Soha ne törölje a csillagozott híreket Clean Up Törlés German (%1) Német (%1) Starred Csillagozott Style application Alkalmazás stílus System Rendszer Default Alapértelmezett French (%1) Francia (%1) Open in external browser Megnyitás egy külsÅ‘ böngészÅ‘ben Green Zöld Orange Narancs Purple Bíbor Pink Rózsaszín Gray Szürke &Undo Visszavonás &Redo Ismételt végrehajtás Cu&t Kivágás &Copy &Másolás &Paste Beillesztés Select All Az összes kijelölése Select IM IM kiválasztása Yes Igen Home FÅ‘oldal &Yes &Igen &No &Nem &Step up &Felfelé Step &down &Lefelé &Select All Az ö&sszes kijelölése Create new feed Új hírcsatorna létrehozása Displayed name: MegjelenítendÅ‘ név: Duplicate feed! IsmétlÅ‘dÅ‘ hírcsatorna! Can't find feed URL! Nincs hírcsatorna URL! Switch focus between panels Fókusz váltása a panelek között Switch focus between panels (tree feeds, list news, browser) Fókusz váltása a panelek között (hírek-fa, hírek lista, böngészÅ‘) Show/hide tree feeds Hírek-fa megjelenítése/elrejtés Open news Hírek megnyitása Position at top of list news A hírek lista tetején Position on last opened news Az utoljára megnyitott híreken Nothing to do Nincs művelet Opening feed: Hírcsatorna megnyitása: Contact Kapcsolat Hungarian (%1) Magyar (%1) Open in new tab Megnyitás új lapon A new version of QuiteRSS... Új QuiteRSS verzió... Browser position BöngészÅ‘ pozíció Top Fent Bottom Lent Right Jobbra Left Balra Left Balra Columns Oszlopok Count news unread Olvasatlan hírek száma Count news all Az összes hír száma Last updated Utoljára frissítve Display feed on startup Hírcsatorna megjelenítése indításnál Please enter name for the filter. Kérjük, adja meg a szűrÅ‘ nevét. Please enter search condition for the news filter. Kérjük, adjon meg keresési feltételeket a hír szűrÅ‘ számára. Filter news Hírek szűrÅ‘ Apply selected filter A kiválasztott szűrÅ‘ használata Close tab Lap bezárása Use following external browser: A következÅ‘ külsÅ‘ böngészÅ‘ használata: Use standard external browser Standard külsÅ‘ böngészÅ‘ használata Use embedded browser Beágyazott böngészÅ‘ használata Browse... Tallózás... Browser selection: BöngészÅ‘ választás: Content: Tartalom: Open news in new tab Hírek megnyitása új lapon Open in background tab Megnyitás egy háttérlapon Open news in background tab Hírek megnyitása egy háttérlapon Loading... Betöltés... Show maximum of Maximális megjelenítés Show splash screen on startup NyitóképernyÅ‘ megjelenítése indításkor Close notification after Bezárás az értesítést követÅ‘ Starred Csillagozott All Feeds Az összes hírcsatorna December December Display format for date and time in list of news: Dátum és idÅ‘ megjelenítési formátuma a hírek listájában: &Add Feed... &Hírcsatorna hozzáadása... Show Starred Feeds Csillagozott hírcsatornák megjelenítése Application Style Alkalmazás stílus Display feed in new tab on startup Hírcsatorna megjelenítése új lapon indításnál Created: Létrehozva: News count: Hírek száma: Long ago ;-) Régen ;-) Find Name Név keresése Find Link Hivatkozás keresése Show Unread or Star Olvasatlan vagy csillaggal jelölt megjelenítése Position on unread news Az olvasatlan hír pozíciója Mark displayed news as read when switching feeds A megjelenített hírek megjelölése olvasottként hírcsatorna váltáskor Mark displayed news as read when closing tab A megjelenített hírek megjelölése olvasottként a lap bezárásakor Mark displayed news as read on minimize A megjelenített hírek megjelölése olvasottként minimalizáláskor Only show selected feeds: Csak a kijelölt hírcsatornák megjelenítése: new új unread olvasatlan Search Feed Hírcsatorna keresése Store a DB in memory (requires program restart) Aadatbázis tárolása a memóriában (újraindítást igényel) Show Deleted A törölt megjelenítése Restore News Hírek visszaállítása Restore Visszaállítás Sort By Rendezés Sort by Title Rendezés cím szerint Open links in external browser in background (experimental) Hivatkozások megnyitása külsÅ‘ böngészÅ‘ben a háttérben (kísérleti) News panel font (Title, Author) Hírek panel betűtípus (Cím, SzerzÅ‘) Report a Problem... Hibajelentés... Main Toolbar FÅ‘ eszköztár Customize Toolbar Eszköztár testreszabása Hide Toolbar Eszköztár rejtése Print... Nyomtatás... Print Web page Weblap nyomtatása Print Preview... Nyomtatási kép... Preview Web page Weboldal elÅ‘nézet News Toolbar Hírek eszköztár Browser Toolbar BöngészÅ‘ eszköztár Web Page Weblap Zoom Nagyítás Zoom in in browser Nagyítás a böngészÅ‘ben Zoom out in browser Lekicsinyítés a böngészÅ‘ben 100% 100% Reset zoom in browser Nagyítás visszaállítása a böngészÅ‘ben Full Screen Teljes képernyÅ‘ Revision Felülvizsgálat History ElÅ‘zmény License Licenc New Folder... Új mappa... Add Folder Mappa hozzáadása Name: Név: Open Page in External Browser Lap megnyitása külsÅ‘ böngészÅ‘ben Open Link in External Browser Link megnyitása külsÅ‘ böngészÅ‘ben Delete Folder Mappa törlése Add New Folder Új mappa hozzáadása Stay On Top Mindig felül Show Not Starred A nem csillagozott megjelenítése Open News in External Browser Hírek megnyitása külsÅ‘ böngészÅ‘ben Your version is: Az Ön verziója: Current version is: Aktuális verzió: QuiteRSS is a open-source cross-platform RSS/Atom news reader A QuiteRSS egy nyílt forrású kereszt-platformos RSS/Atom hírolvasó Unread: %1 Olvasatlan: %1 All: %1 Összes: %1 &Feed... Hírcsatorna... F&older... Mappa... Add Label Címke hozzáadása New Label Új címke Important Fontos Work Munka Personal Személyes To Do Végrehajtás Later KésÅ‘bb Amusingly Viccesen Load icon... Ikon betöltése... Select color... Szín kiválasztása... Color text: Szövegszín: Color background: Háttérszín: Select Image Kép kiválasztása Image files (*.jpg; *.jpeg; *.png; *.bmp) Képfájlok (*.jpg; *.jpeg; *.png; *.bmp) Load icon: can't open a file Ikon betöltése: a fájl nem nyitható meg Label Címke Feed Hírcsatorna &Install &Telepítés Don't remind about this version Ne emlékeztessen errÅ‘l a verzióról Deleted Törölt Starred Csillagozott Copy Image Kép másolása Copy Image Address A kép címének másolása Open links in embedded browser in background Hivatkozások megnyitása beágyazott böngészÅ‘ben a háttérben after switching to another news másik hírre váltás után on selecting. With timeout kijelölésnél. Késleltetéssel Labels Címkék Never delete labeled news Soha ne törölje a megjelölt híreket Close Bezárás Hide Categories Kategóriák rejtése Show Categories Kategóriák megjelenítése Feeds Toolbar Hírcsatorna eszköztár Categories Kategóriák Switch to previous tab Váltás az elÅ‘zÅ‘ lapra Switch to next tab Váltás a következÅ‘ lapra State Ãllapot Show Passwords Jelszavak mentése User Felhasználó Site Oldal Server: Kiszolgáló: Server requires authentication: Kiszolgáló hitelesítés szükséges: Request timeout! Kérelem idÅ‘túllépése! Message: Üzenet: Save password Jelszó mentése Authorization required Engedélyezés szükséges Save As... Mentés másként... Save Page As... Oldal mentése mint... Decrease news list/increase browser Hírek lista csökkentése/böngészÅ‘ növelése Increase news list/decrease browser Hírek lista növelése/böngészÅ‘ csökkentése Restore last deleted news Az utoljára törölt hírek visszaállítása Next Unread News KövetkezÅ‘ olvasatlan hírek Previous Unread News ElÅ‘zÅ‘ olvasatlan hírek Switch Focus to Next Panel Fókuszváltás a következÅ‘ panelra Switch Focus to Next Panel (Tree Feeds, List News, Browser) Fókuszváltás a következÅ‘ panelra (Hírcsatorna-fa, Hírek lista, BöngészÅ‘) Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Fókuszváltás az elÅ‘zÅ‘ panelra (Hírcsatorna-fa, Hírek lista, BöngészÅ‘) Switch Focus to Previous Panel Fókuszváltás az elÅ‘zÅ‘ panelra HTML-File (*.html) HTML-fájl (*.html) Save As: can't open a file Mentés másként: nem lehet megnyitni egy fájlt HTML-Files (*.html) HTML-fájlok (*.html) quiterss-0.18.3/lang/quiterss_hu.ts000066400000000000000000005550441265173051100173440ustar00rootroot00000000000000 AboutDialog About Névjegy Revision Felülvizsgálat Version Verzió QuiteRSS is a open-source cross-platform RSS/Atom news reader A QuiteRSS egy nyílt forrású kereszt-platformos RSS/Atom hírolvasó Includes: Tartalmazza: Application directory: Alkalmazás könyvtár: Resource directory: ErÅ‘forrás könyvtár: Data directory: Adatkönyvtár: Backup directory: Mentési könyvtár: Database file: Adatbázis-fájl: Settings file: Beállítások fájl: Log file: Naplófájl: Authors KészítÅ‘k History ElÅ‘zmény License Licenc Information Információk AdBlockAddSubscriptionDialog Add Subscription ElÅ‘fizetés hozzáadása Title: Cím: Address: Cím: Add new subscription to AdBlock: Új elÅ‘fizetés hozzáadása az AdBlock-hoz: AdBlockCustomList Custom Rules Egyéni szabályok AdBlockDialog AdBlock Configuration AdBlock konfiguráció Enable AdBlock AdBlock engedélyezése Search... Keresés... Options Opciók AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Csak az Egyszerű lista fontosabb részének használata (a megfelelÅ‘ teljesítmény érdekében) Add Rule Szabály hozzáadása Remove Rule Szabály eltávolítása Add Subscription ElÅ‘fizetés hozzáadása Remove Subscription ElÅ‘fizetés eltávolítása Update Subscriptions ElÅ‘fizetések frissítése Learn about writing rules... Tudjon meg többet az írási szabályokról... AdBlockIcon AdBlock lets you block unwanted content on web pages Az AdBlock lehetÅ‘vé teszi a nem kívánt weboldal tartalmak blokkolását AdBlock AdBlock Show AdBlock &Settings AdBlock beállítások megjelenítése Disable on %1 Letiltás itt: %1 Disable only on this page Letiltás csak ezen a lapon Blocked Popup Windows Blokkolt felugró ablakok %1 with (%2) %1 a következÅ‘vel: (%2) No content blocked Nincs blokkolt tartalom Blocked URL (AdBlock Rule) - click to edit rule Blokkolt URL (AdBlock szabály) - kattintson a szabály szerkesztéséhez AdBlockManager EasyList Egyszerű lista AdBlockSubscription Cannot load subscription! Nem lehet betölteni az elÅ‘fizetést! AdBlockTreeWidget Add Rule Szabály hozzáadása Remove Rule Szabály eltávolítása Add Custom Rule Egyéni szabály hozzáadása Please write your rule here: Kérjük, írja meg a szabályt itt: %1 (recently updated) %1 (nemrég frissített) %1 (Error: %2) %1 (Hiba: %2) AddFeedWizard Add Feed Hírcsatorna hozzáadása Create New Feed Új hírcsatorna létrehozása Use title of the feed as displayed name Használja a hírcsatorna címét megjelenítendÅ‘ névként Server requires authentication: Kiszolgáló hitelesítés szükséges: Username: Felhasználónév: Password: Jelszó: Feed URL or website address: Hírcsatorna URL vagy weboldal cím: Feeds Hírcsatornák All Feeds Az összes hírcsatorna New Folder... Új mappa... Displayed name: MegjelenítendÅ‘ név: Location: Hely: URL error! URL hiba! Duplicate feed! IsmétlÅ‘dÅ‘ hírcsatorna! Can't find feed URL! Nincs hírcsatorna URL! Request failed! A kérelem sikertelen! AddFolderDialog Add Folder Mappa hozzáadása Feeds Hírcsatornák All Feeds Az összes hírcsatorna Name: Név: Location: Hely: AuthenticationDialog Save password Jelszó mentése Authorization required Engedélyezés szükséges Server: Kiszolgáló: Message: Üzenet: Username: Felhasználónév: Password: Jelszó: CategoriesTreeWidget Unread Olvasatlan Starred Csillagozott Deleted Törölt Labels Címkék Open in New Tab Megnyitás új lapon Clear 'Deleted' 'Törölt' törlése Mark Read Megjelölés olvasottként CleanUpWizard Clean Up Tisztítás Choose Feeds Hírcsatornák kiválasztása All Feeds Az összes hírcsatorna Clean Up Options Tisztítási opciók Maximum age of news in days to keep: A megtartandó hírek maximális ideje napban: Maximum number of news to keep: A megtartandó hírek maximális száma: Delete read news Olvasott hírek törlése Never delete unread news Soha ne törölje az olvasatlan híreket Never delete starred news Soha ne törölje a csillagozott híreket Never delete labeled news Soha ne törölje a megjelölt híreket Clean up 'Deleted' A 'Törölt' eltávolítása Purge DB Adatbázis törlése Totally remove records that had marked 'deleted' from DB. Ancient news could reappear A 'törölt'-ként megjelölt bejegyzések eltávolítása az adatbázisból.⎠A régi hírek ismét megjelenhetnek Information Információk Clean Up wizard deleted %1 news A tisztítás varázsló °1 hírt törölt ClickToFlash Object blocked by ClickToFlash Objektum blokkolva a ClickToFlash által Hide object Objektum elrejtése Add '%1' to whitelist '%1' hozzáadása a fehérlistához CustomizeToolbarDialog Customize Main Toolbar FÅ‘ eszköztár testreszabása Customize Feeds Toolbar Hírcsatornák eszköztár testreszabása Customize News Toolbar Hírek eszköztár testreszabása Load images Képek betöltése Separator Elválasztó Icon Ikon Text Szöveg Text Beside Icon Szöveg az ikon mellett Text Under Icon Szöveg az ikon alatt Big Nagy Normal Normál Small Kicsi Style: Stílus: Icon Size: Ikon mérete: Add Hozzáadás Remove Eltávolítás Move up Feljebb Move down Lejjebb Default Alapértelmezett DownloadItem Remaining time unavailable A hátralévÅ‘ idÅ‘ nem érhetÅ‘ el Error: Cannot write to file! Hiba: A fájl nem írható! Error: Hiba: few seconds pár másodperc seconds másodperc minutes perc hours óra Unknown size Ismeretlen méret Unknown speed Ismeretlen sebesség %2 - unknown size (%3) %2 - ismeretlen méret (%3) Remaining %1 - %2 of %3 (%4) Fennmaradó %1 - %2 - %3 (%4) Cancelled - %1 Törölve - %1 Delete file Fájl törlése Do you want to also delete downloaded file? Szeretné törölni a letöltött fájlt is? Open File Fájl megnyitása Open Folder Mappa megnyitása Copy Download Link Letöltési link másolása Cancel Downloading Letöltés megszakítása Remove Eltávolítás Cancelled Megszakítva Error Hiba Not found Nem található Sorry, the file %1 was not found! Sajnáljuk, a(z) ⎠%1 fájl ⎠nem található! DownloadManager Clear Törlés File %1 (*.%2) %1 fájl (*.%2) All Files (*.*) Minden fájl (*.*) Save As... Mentés másként ... Executable: Végrehajtható: Arguments: Argumentumok: FeedPropertiesDialog Properties Tulajdonságok General Ãltalános Columns Oszlopok Authentication Hitelesítés Status Ãllapot Title: Cím: Homepage: Honlap: Feed URL: Hírcsatorna Url:: Load Title Cím betöltése Load Favicon Weblapikon betöltése Select Icon... Ikon kiválasztása... Select Icon Ikon kiválasztása Disable update Frissítés letiltása Automatically update every Automatikus frissítés minden seconds másodperc minutes perc hours óra Starred Csillagozott Load images Képek betöltése Display in new tab on startup Megjelenítés új lapon indításkor Show news' description instead of loading web page Hírleírások megjelenítése a weblap betöltése helyett Automatically delete duplicate news Az ismétlÅ‘dÅ‘ hírek automatikus törlése Display KijelzÅ‘ Reading Olvasás Enable JavaScript JavaScript engedélyezése Right-to-left layout Jobbról-balra elrendezés Ascending NövekvÅ‘ Descending CsökkenÅ‘ Sort by: Rendezés: Add Hozzáadás Remove Eltávolítás Move up Feljebb Move down Lejjebb Default Alapértelmezett Server requires authentication: Kiszolgáló hitelesítés szükséges: Username: Felhasználónév: Password: Jelszó: Feeds count: Hírcsatornák száma: Description: Leírás: Status: Ãllapot: Created: Létrehozva: Last update: Utolsó frissítés: News count: Hírek száma: Good Jó Long ago ;-) Régen ;-) new új unread olvasatlan Image files Képfájlok Select Image Kép kiválasztása Load icon: can't open a file! Ikon betöltése: a fájl nem nyitható meg! FilterRulesDialog Filter Rules Szűrési szabályok Feeds Hírcsatornák All Feeds Az összes hírcsatorna Filter name: SzűrÅ‘ neve: Match all news Az összes hírnek megfelelÅ‘ Match all conditions Az összes feltételnek megfelelÅ‘ Match any condition Bármely feltételnek megfelelÅ‘ Perform these actions: Műveletek végrehajtása: Please enter name for the filter. Kérjük, adja meg a szűrÅ‘ nevét. Please enter search condition for the news filter. Kérjük, adjon meg keresési feltételeket a hír szűrÅ‘ számára. FindFeed Find Name Név keresése Find Link Hivatkozás keresése FindTextContent Find in News Keresés a hírekben Find in Titles Keresés a címekben Find in Authors Keresés a szerzÅ‘kben Find in Categories Keresés a kategóriákban Find in Descriptions Keresés a leírásokban Find in Links Keresés a hivatkozásokban Find in Browser Keresés a böngészÅ‘ben FtpDownloader Canceled! Megszakítva ItemAction Mark News as Read Hírek megjelölése olvasottként Add Star Csillag hozzáadása Delete Törlés Add Label Címke hozzáadása Play a Sound Hang lejátszása Show News in Notifier Hírek megjelenítése az értesítÅ‘ben Browse Tallózás... Play Lejátszás Add Action Művelet hozzáadása Delete Action Művelet törlése Open File... Fájl megnyitása... ItemCondition Title Cím Description Leírás Author KészítÅ‘ Category Kategória State Ãllapot Link Link News Hírek New Új Read Olvasás Starred Csillagozott Add Condition Feltétel hozzáadása Delete Condition Feltétel törlése contains tartalmaz doesn't contains nem tartalmaz is van isn't nem begins with kezdÅ‘dik ends with végzÅ‘dik Regular expressions Reguláris kifejezések LabelDialog New Label Új címke Load icon... Ikon betöltése... Default Alapértelmezett Select color... Szín kiválasztása... Name: Név: Icon: Ikon: Color text: Szövegszín: Color background: Háttérszín: Image files Képfájlok Select Image Kép kiválasztása Load icon: can't open a file! Ikon betöltése: a fájl nem nyitható meg! MainApplication Saving data... Adat mentése... MainWindow &AdBlock &AdBlock Hide Categories Kategóriák rejtése Show Categories Kategóriák megjelenítése Select OPML-File OPML-fájl kiválasztása OPML-Files (*.%1 *.%2) OPML-fájlok (*.%1 *.%2) Import canceled Importálás megszakítva Import: can't open a file Importálás: a fájlt nem lehet megnyitni OPML-Files (*.%1) OPML-fájlok (*.%1) Export canceled Exportálás megszakítva Export: can't open a file Exportálás: a fájlt nem lehet megnyitni Unread: %1 Olvasatlan: %1 All: %1 Összes: %1 (Browser) (BöngészÅ‘) New News: %1 Új hírek: %1 Unread News: %1 Olvasatlan hírek: %1 &Add Hozzáadás Add New Feed Új hírcsatorna hozzáadása &Feed... Hírcsatorna... F&older... Mappa... Add New Folder Új mappa hozzáadása Open in New Tab Megnyitás új lapon &Delete... Törlés... Delete Selected Feed A kijelölt hírcsatorna törlése &Import Feeds... &Hírcsatornák importálása... Import Feeds from OPML File Hírcsatornák importálása OPML fájlból &Export Feeds... &Hírcsatornák exportálása... Export Feeds to OPML File Hírcsatornák exportálása OPML fájlba E&xit Kilépés Update Feed Hírcsatorna frissítése Update Current Feed Az aktuális hírcsatorna frissítése Update All Az összes frissítése Update All Feeds Az összes hírcsatorna frissítése Mark All Feeds Read Az összes hírcsatorna megjelölése olvasottként Mark Read/Unread Olvasott/olvasatlan Mark Current News Read/Unread Az aktuális hírek megjelölése olvasotként/olvasatlanként Mark All News Read Az összes hír megjelölése olvasottként Downloads Letöltések Clean Up... Tisztítás... News Filters... Hír-szűrÅ‘k... Filter News... Hírek szűrése... Options... Beállítások... Open Options Dialog A beállítások párbeszédpanel megnyitása Filter Feeds Hírcsatorna szűrÅ‘ Show All Összes megjelenítése Show New Új megjelenítése Show Unread Olvasatlan megjelenítése Show Starred Feeds A csillaggal jelölt hírcsatornák megjelenítése Show Not Working Feeds Nem működÅ‘ hírcsatornák megjelenítése Filter News Hírek szűrÅ‘ Show Starred Csillagozott megjelenítése Show Not Starred Nem csillagozott megjelenítése Show Unread or Starred Olvasatlan vagy csillagozott megjelenítése Show Last Day Utolsó nap megjelenítése Show Last 7 Days Utolsó 7 nap megjelenítése About... Névjegy... Show 'About' Dialog A 'Névjegy' párbeszédpanel megjelenítése Check for Updates... Frissítések ellenÅ‘rzése... Report a Problem... Hibajelentés... Open News Hírek mgnyitása Open in Browser Megnyitás a böngészÅ‘ben Open in External Browser Megnyitás egy külsÅ‘ böngészÅ‘ben Open News in External Browser Hírek megnyitása külsÅ‘ böngészÅ‘ben Open News in New Tab Hírek megnyitása új lapon Open in Background Tab Megnyitása a háttérlapon Open News in Background Tab Hírek megnyitása a háttérlapon Star Csillagozás Mark News Star Hírek megjelölése csillaggal Delete Törlés Delete Selected News A kijelölt hírek törlése Delete All News Az összes hír törlése Delete All News from List Az összes hír törlése a listáról Restore Visszaállítás Restore News Hírek visszaállítása Copy Link Hivatkozás másolása Restore last deleted news Az utoljára törölt hírek visszaállítása Mark Read Megjelölés olvasottként Mark Feed Read Hírcsatorna megjelölése olvasottként Properties Tulajdonságok &File &Fájl Count Unread News Olvasatlan hírek száma Count All News Összes hír száma Last Update Utolsó frissítés Reset browser zoom BöngészÅ‘ nagyítás visszaállítása Print Web Page Weboldal nyomtatása Preview Web Page Weboldal elÅ‘nézete Save page in database Oldal mentése az adatbázisban Save page in database instead of news description Oldal mentése az adatbázisba a hírek leírás helyett Confirm Delete Törlés megerÅ‘sítése Are you sure to delete selected elements? Biztos benne, hogy törli a kiválasztott elemeket? Menu Menü Add Feed... Hírcsatorna hozzáadása... &Create Backup... Mentés létrehozása... S&how Menu Bar Menüsor megjelenítése Stop Update Feeds Hírcsatorna frissítés leállítása Open News Description Hírleírások megnyitása Copy News Link Hírek hivatkozás másolása &View Nézet Fee&ds Hírcsatornák &News Hírek &Browser BöngészÅ‘ &Tools Eszközök &Help Súgó Main Toolbar FÅ‘ eszköztár Customize Toolbar Eszköztár testreszabása Main Toolbar... FÅ‘ eszköztár... Customize Toolbar... Eszköztár testreszabása... Feeds Toolbar... Hírcsatornák eszköztár... News Toolbar... Hírek eszköztár Lock Toolbar Eszköztár zárolása Hide Toolbar Eszköztár rejtése Layout Elrendezés Classic Klasszikus Newspaper Hírlap Application Style Alkalmazás stílus System Rendszer System2 System2 Green Zöld Orange Narancs Purple Bíbor Pink Rózsaszín Gray Szürke Browser Position BöngészÅ‘ pozíció Top Fent Bottom Lent Right Jobbra Left Balra Show Window Ablak megjelenítése Previous Feed ElÅ‘zÅ‘ hírcsatorna Next Feed KövetkezÅ‘ hírcsatorna Previous News ElÅ‘zÅ‘ hír Next News KövetkezÅ‘ hír News Page Up Hírek lap fel News Page Down Hírek lap le Next Unread News KövetkezÅ‘ olvasatlan hír Previous Unread News ElÅ‘zÅ‘ olvasatlan hír Switch Focus to Next Panel Fókuszváltás a következÅ‘ panelra Switch Focus to Next Panel (Tree Feeds, List News, Browser) Fókuszváltás a következÅ‘ panelra (Hírcsatorna-fa, Hírek lista, BöngészÅ‘) Switch Focus to Previous Panel Fókuszváltás az elÅ‘zÅ‘ panelra Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Fókuszváltás az elÅ‘zÅ‘ panelra (Hírcsatorna-fa, Hírek lista, BöngészÅ‘) Show/Hide Tree Feeds Hírcsatornák fa megjelenítése/rejtése Minimize to Tray Lekicsinyítés a tálcára Minimize Application to Tray Alkalmazás minimalizálása a tálcára Columns Oszlopok Show Indentation Behúzás megjelenítése Search Feed Hírcsatorna keresése Zoom Nagyítás Zoom In Nagyítás + Zoom in in browser Nagyítás a böngészÅ‘ben Zoom Out Nagyítás - Zoom out in browser Lekicsinyítés a böngészÅ‘ben 100% 100% Print... Nyomtatás... Print Preview... Nyomtatási kép... Page up (Browser) Lapozás felfelé (BöngészÅ‘) Page down (Browser) Lapozás lefelé (BöngészÅ‘) Save As... Mentés másként... Save Page As... Oldal mentése mint... Show/Hide Megjelenítés/Elrejtés Feeds Toolbar Hírcsatorna eszköztár News Toolbar Hírek eszköztár Browser Toolbar BöngészÅ‘ eszköztár Panel Categories Panel-kategóriák Status Bar Ãllapotsor Full Screen Teljes képernyÅ‘ Stay On Top Mindig felül Categories Kategóriák Label Címke Show labels menu Címke menü megjelenítése Close Tab Lap bezárása Close Other Tabs Egyéb lapok bezárása Close All Tabs Az összes lap bezárása Switch to next tab Váltás a következÅ‘ lapra Switch to previous tab Váltás az elÅ‘zÅ‘ lapra Unread Olvasatlan Starred Csillagozott Deleted Törölt Labels Címkék Decrease news list/increase browser Hírek lista csökkentése/böngészÅ‘ növelése Increase news list/decrease browser Hírek lista növelése/böngészÅ‘ csökkentése Find Keresés Open Homepage Feed Honlap hírcsatorna megnyitása Sort by Name Rendezés Név szerint Collapse All Folders Az összes mappa összezárása Expand All Folders Az összes mappa kibontása Next Folder KövetkezÅ‘ mappa Previous Folder ElÅ‘zÅ‘ mappa Expand Folder Mappa kibontása Setting Page: Labels Beállítás lap: Címkék Share Megosztás Sort By Rendezés Ascending NövekvÅ‘ Descending CsökkenÅ‘ Check for updates Frissítések ellenÅ‘rzése A new version of QuiteRSS... Új QuiteRSS verzió... Loading... Betöltés... Web Page Weblap Save As Mentés másként HTML-Files (*.%1) HTML-fájlok (*.%1) Text files (*.%2) Szövegfájlok (*.%2) Save As: can't open a file Mentés másként: nem lehet megnyitni egy fájlt Choose Directory Válasszon könyvtárat Important Fontos Work Munka Personal Személyes To Do Végrehajtás Later KésÅ‘bb Amusingly Viccesen NetworkManager SSL Certificate Error! SSL tanúsítvány hiba! The "%1" server has the following errors in the SSL certificate: A(z) "%1" kiszolgáló a következÅ‘ hibákat tartalmazza az SSL tanúsítványban: <b>Organization: </b> <b>Szervezet: </b> <b>Domain Name: </b> <b>Tartománynév: </b> <b>Expiration Date: </b> <b>Lejárat dátuma: </b> <b>Error: </b> <b>Hiba: </b> Would you like to make an exception for this certificate? Szeretne kivételt tenni ezzel a tanúsítvánnyal? NewsFiltersDialog News Filters Hír-szűrÅ‘k Feeds Hírcsatornák Filter Name SzűrÅ‘ neve New... Új... Edit... Szerkesztés... Delete... Törlés... Move up Feljebb Move down Lejjebb Run Filter SzűrÅ‘ futtatása Delete Filter SzűrÅ‘ törlése Are you sure you want to delete the filter '%1'? Biztos benne, hogy törli a '%1' szűrÅ‘t? NewsHeader Icon Feed Hírcsatorna ikon Title Cím Published Közzétéve Received Érkezett Author KészítÅ‘ Category Kategória Read Olvasás Star Csillagozás Label Címke Feed Title Hírcsatorna címe Link Hivatkozás NewsItem Mark Read/Unread Olvasott/olvasatlan Delete News Hírek törlése NewsTabWidget Loading... (%p%) Betöltés... (%p%) Home FÅ‘oldal Open Page in External Browser Lap megnyitása külsÅ‘ böngészÅ‘ben Open Link in External Browser Link megnyitása külsÅ‘ böngészÅ‘ben Open Link Link megnyitása Open in New Tab Megnyitás új lapon Save Link... Hivatkozás mentése... Save Image... Kép mentése... Copy Link Hivatkozás másolása Copy Másolás Go Back Ugrás vissza Go Forward Ugrás elÅ‘re Stop Leállítás Reload Újratöltés Copy Image Kép másolása Copy Image Address A kép címének másolása Load Images Képek betöltése Auto Load Images to News View Képek automatikus betöltése a hírek nézetben No Load Images Ne töltse be a képeket No Load Images to News View Ne töltse be a képeket hírek nézetben Close Tab Fül bezárása Auto Load Images in News View Képek automatikus betöltése a hírek nézetbe Don't Load Images Ne töltse be a képeket Don't Load Images in News View Ne töltse be a képeket hírek nézetben Comments Megjegyzések Author: %1 KészítÅ‘: %1 audio audió video videó media média Link to Hivatkozás a következÅ‘höz: Mark Read/Unread Megjelölés olvasottként/olvasatlanként Mark News Star Hírek megjelölése csillaggal Label Címke Share Megosztás Open News in External Browser Hírek megnyitása külsÅ‘ böngészÅ‘ben Delete Törlés NotificationWidget Close Bezárás Mark All News Read Az összes hír megjelölése olvasottként Previous Page ElÅ‘zÅ‘ oldal Next Page KövetkezÅ‘ oldal Incoming News: %1 BejövÅ‘ hírek: %1 Page %1 of %2 %1 - %2 oldal OptionsDialog Options Opciók General Ãltalános System Tray Rendszertálca Network Connections Hálózati kapcsolatok Browser BöngészÅ‘ Feeds Hírcsatornák Labels Címkék Notifications Értesítések Passwords Jelszavak Language Nyelv Fonts & Colors Betűtípusok és színek Keyboard Shortcuts Billentyűparancsok Warning: key is already assigned to Figyelem: a billentyű már hozzá van rendelve: Show splash screen on startup IndítóképernyÅ‘ megjelenítése betöltéskor Reopen last opened feeds on startup A utoljára megnyitott hírcsatornák megnyitása indításkor Open new tab next to active Új lap megnyitása az aktív mellett Hide feeds tree when opening tabs Hírcsatornák-fa elrejtése a lapok megnyitásakor Show default rss-icon instead of favourite one Alapértelmezett rss-ikon megjelenítése az egyik kedvenc helyett Automatically collapse folders A mappák automatikus összezárása Show close button on tab Bezárás gomb megjelenítése a fülön Automatically check for updates A frissítések automatikus ellenÅ‘rzése Help improve QuiteRSS by sending usage information Segítsen az QuiteRSS fejlesztésében a használati információk küldésével Store a DB in memory (requires program restart) Adatbázis tárolása a memóriában (újraindítást igényel) Save DB stored in memory to file every A memóriában tárolt DB mentése a fájlba minden minutes percben Run QuiteRSS at Windows startup A QuiteRSS futtatása a Windows indításakor Show system tray icon Rendszertálca ikon megjelenítése starting QuiteRSS A QuiteRSS indításakor minimizing QuiteRSS A QuiteRSS minimalizálásakor closing QuiteRSS A QuiteRSS bezárásakor Show static icon Statikus ikon megjelenítése Change icon for incoming new news Ikon változtatása a beérkezÅ‘ híreknél Show count of new news Az új hírek számának megjelenítése Show count of unread news Olvasatlan hírek számának megjelenítése Single click instead of double click for show window Egy kattintás a dupla kattintás helyett az ablak megjelenítéséhez Empty working set on minimize to tray Munkakészlet ürítése a tálcára küldéskor Move to the system tray when: Ãthelyezés a tálcára a következÅ‘ esetben: Tray icon behavior: Tálca ikon viselkedés: Direct connection to the Internet Közvetlen kapcsolódás az internethez System proxy configuration (if available) Rendszer proxy konfiguráció (ha elérhetÅ‘) Manual proxy configuration: Kézi proxy beállítás: Proxy server: Proxykiszolgáló: Port: Port: Username: Felhasználónév: Password: Jelszó: Request timeout: Kérelem idÅ‘túllépése: Number of requests: Kérelmek száma: Number of retries: Próbálkozások száma: Options network requests when updating feeds (requires program restart): Hálózati opciók szükségesek a hírcsatornák frissítésekor (program újraindítás szükséges) Use embedded browser Beágyazott böngészÅ‘ használata Use external browser KülsÅ‘ böngészÅ‘ használata Default external browser Alapértelmezett külsÅ‘ böngészÅ‘ Following external browser: KövetkezÅ‘ külsÅ‘ böngészÅ‘: Browse... Tallózás... Load images Képek betöltése Enable JavaScript JavaScript engedélyezése Enable plug-ins BeépülÅ‘ modulok engedélyezése Open links in embedded browser in background Hivatkozások megnyitása beágyazott böngészÅ‘ben a háttérben Open links in external browser in background (experimental) Hivatkozások megnyitása külsÅ‘ böngészÅ‘ben a háttérben (kísérleti) Default zoom on pages: Alapértelmezett nagyítás a lapon: Browser selection: BöngészÅ‘ választás: External browser: KülsÅ‘ böngészÅ‘: Content: Tartalom: User style sheet: Felhasználó stíluslap: Maximum pages in cache Maximális lapok a gyorsítótárban Store cache in: Tároló gyorsítótár: Maximum size of disk cache A lemez gyorsítótár maximális mérete MB MB Use disk cache Lemez gyorsítótár használata Allow local data to be set Helyi adat beállítások engedélyezése Keep local data only until quit application A helyi adatok megÅ‘rzése csak addig, amíg az alkalmazás kilép Block sites from setting any data Oldalak blokkolása bármilyen adat beállításból Clear Törlés Cookies: Cookie-k Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. A Click To Flash egy beépülÅ‘ modul, amely blokkolja a Flash tartalmak automatikus betöltését a lapon. Azok maniuális betöltéséhez, kattintson a Flash lejátszása ikonra. Use Click to Flash A Click to Flash használata Add... Hozzáadás... Remove... Eltávolítás... Ask where to save each file before downloading Kérdezzen rá a fájlok mentési helyére letöltés elÅ‘tt Download location: Letöltési hely: History ElÅ‘zmények Click to Flash Click to Flash Downloads Letöltések Automatically update the feeds on startup A hírcsatornák automatikusan frissítése indításkor Automatically update the feeds every A hírcsatornák automatikus frissítése minden seconds másodperc után hours órában Nothing to do Nincs művelet Dec Dec December December Display format for date: A dátum megjelenítési formátuma: time: idÅ‘: Alternating row background colors Váltakozó sor háttérszínek Simplified representation of date and time Egyszerűsített dátum és idÅ‘pont ábrázolás Show All Összes megjelenítése Show New Új megjelenítése Show Unread Olvasatlan megjelenítése Show Starred Csillagozott megjelenítése Show Not Starred Nem csillagozott megjelenítése Show Unread or Starred Olvasatlan vagy csillagozott megjelenítése Show Last Day Utolsó nap megjelenítése Show Last 7 Days Utolsó 7 nap megjelenítése Style sheet for news: Hírek stíluslap: Mark news as read: Hírek megjelölése olvasottként: on selecting. With timeout kijelölésnél. Késleltetéssel after switching to another news másik hírre váltás után Mark displayed news as read when switching feeds A megjelenített hírek megjelölése olvasottként hírcsatorna váltáskor Mark displayed news as read when closing tab A megjelenített hírek megjelölése olvasottként a lap bezárásakor Mark displayed news as read on minimize A megjelenített hírek megjelölése olvasottként minimalizáláskor Change behavior of action 'Next Unread News' A "KövetkezÅ‘ olvasatlan hírek" művelet viselkedésének módosítása starred news csillagozott hír labeled news címkézett hír Automatically mark identical news as read Azonos hírek automatikus megjelölése olvasottként Prevent accidental deletion of: Véletlen törlés megakadályozása: Enable cleanup on shutdown Tisztítás engedélyezése leállításnál Maximum age of news in days to keep: A megtartandó hírek maximális ideje napban: Maximum number of news to keep: A megtartandó hírek maximális száma: Delete read news Olvasott hírek törlése Never delete unread news Soha ne törölje az olvasatlan híreket Never delete starred news Soha ne törölje a csillagozott híreket Never delete labeled news Soha ne törölje a megjelölt híreket Clean up 'Deleted' A 'Törölt' eltávolítása Enable DB optimization (slower shutdown) DB optimalizálás engedélyezése (lassabb leállítás) Reading Olvasás Clean Up Törlés New... Új... Edit... Szerkesztés... Delete... Törlés... Move up Feljebb Move down Lejjebb Show when inactive main window Megjelenítés, ha a fÅ‘ablak inaktív Screen KépernyÅ‘ Transparency Ãtlátszóság Show titles feeds Hírcsatorna címek megjelenítése Show icon feed Hírcsatorna ikon megjelenítése Show button 'Mark All News Read' 'Összes hír megjelölése olvasottként' gomb megjelenítése Show button 'Mark Read/Unread' 'Megjelölés olvasottként/olvasatlanként' gomb megjelenítése Show button 'Open in External Browser' 'Megnyitás külsÅ‘ böngészÅ‘ben' gomb megjelenítése Show button 'Delete News' 'Hírek törlése' gomb megjelenítése Play sound for incoming new news Hangjelzés a bejövÅ‘ hírek esetén Play Lejátszás Display notification for incoming news Értesítés megjelenítése a bejövÅ‘ hírekrÅ‘l Top Left Balra fent Top Right Jobbra fent Bottom Left Balra lent Bottom Right Jobbra lent Review Ãttekintés Position Pozíció Show maximum of Maximális megjelenítés item on page notification elem az értesítési oldalon Width list items Listaelemek szélessége pixels képpont Close notification after Bezárás az értesítést követÅ‘ Do not show notification in fullscreen mode Ne jelenjen meg értesítés a teljes képernyÅ‘s módban Display KijelzÅ‘ Action mouse on news opening: Egérművelet a hírek megnyitásánál: Single Click: Egy kattintás: Double Click: Dupla kattintás: Middle Click: KözépsÅ‘ kattintás: Only show selected feeds: Csak a kijelölt hírcsatornák megjelenítése: Notification Értesítés Sound Hang Selection of feeds Hírcsatornák kiválasztása All Feeds Az összes hírcsatorna Site Oldal User Felhasználó Password Jelszó Delete Törlés Delete All Az összes törlése Show Passwords Jelszavak megjelenítése Version Verzió Author KészítÅ‘ Contact Kapcsolat Choose language: Válasszon nyelvet: Type Típus Font Betűtípus Feeds list font Hírcsatorna lista betűtípusa News list font Hírek lista betűtipusa News title font Hírek címsorának betűtípusa News text font Hírek szövegének betűtípusa Notification font Értesítések betűtípusa Change... Módosítás... Reset Visszaállítás Feeds list color Hírcsatorna lista színe Feeds list background Hírcsatorna lista háttere News list color Hírek lista színe News list background Hírek lista háttere Focused news color Fókuszban lévÅ‘ hírek színe Focused news background color Fókuszban lévÅ‘ hírek háttérszíne Link color Hivatkozás színe Title color Felirat színe Date color Dátum színe Author color KészítÅ‘ színe News text color Hírek szövegének színe News title background Hírek címének háttére News background Hírek háttér Feed with new news Hírcsatorna új hírekkel Count of unread news in feeds tree Olvasatlan hírek száma a hírcsatornák fában Disabled feed Letiltott hírcsatorna Alternating row colors Váltakozó sorszínek Notification text color Értesítés szöveg színe Notification background color Értesítés háttérszíne Auto load images in news view Képek automatikus betöltése a hírek nézetbe Text color of new news Új hírek szövegszíne Show feeds tree toggle Hírcsatornák-fa kapcsoló megjelenítése Clear new status when minimize to tray Az új státusz törlése a tálcára küldéskor Set focus on the last opened news Fókusz ráállítása az utoljára megnyitott hírekre Set focus at the top of news list Fókusz ráállítása a hírek lista tetejére Set focus on the unread news Fókusz ráállítása az olvasatlan hírekre Open the news Hírek megnyitása Default news filter: Alapértelmezett hírek szűrÅ‘: Action on feed opening: Művelet hírcsatorna megnyitásakor: Show news description instead of loading web page Hírleírások megjelenítése a weblap betöltése helyett Text color of unread news Olvasatlan hírek szövegszíne Focused feed color Fókuszban lévÅ‘ hírcsatorna színe Focused feed background color Fókuszban lévÅ‘ hírcsatorna háttérszíne Standard Standard Fixed Rögzített Serif Serif Sans Serif Sans Serif Cursive Kurzív Fantasy Fantasy Default font size Alapértelmezett betűméret Fixed font size Rögzített betűméret Minimum font size Legkisebb betűméret Minimum logical font size Legkisebb logikai betűméret Font families: Betűcsaládok: Font sizes: Betűméretek: Fonts Betűtípusok Fonts Browser Betűtípus böngészÅ‘ Colors Színek Filter SzűrÅ‘ Action Művelet Description Leírás Shortcut Gyorsbillentyű Shortcut: Gyorsbillentyű: Open File... Fájl megnyitása... Select Style Sheet File Stíluslap-fájl kiválasztása Open Directory... Könyvtár megnyitása... Add site to whitelist Oldal hozzáadása a fehérlistához Site without 'http://' (ex. youtube.com) Oldal 'http://' (ex. youtube.com) nélkül QAbstractSpinBox &Step up &Felfelé Step &down &Lefelé &Select All Az ö&sszes kijelölése QDialogButtonBox Close Bezárás Cancel Mégse &Yes &Igen &No &Nem QFtp Not connected Nincs csatlakozva Host %1 not found A %1 hoszt nem található Connection refused to host %1 Elutasított hoszt kapcsolat: %1 Connection timed out to host %1 Hoszt kapcsolat túllépés: %1 Connected to host %1 Csatlakozva a %1 hoszthoz Connection refused for data connection Adatkapcsolat csatlakozás elutasítva Unknown error Ismeretlen hiba Connecting to host failed: %1 Sikertelen hoszt csatlakozás:⎠%1 Login failed: %1 Sikertelen bejelentkezés:⎠%1 Listing directory failed: %1 Sikertelen könyvtár listázás:⎠%1 Changing directory failed: %1 Sikertelen könyvtár váltás:⎠%1 Downloading file failed: %1 Sikertelen fájl letöltés:⎠%1 Uploading file failed: %1 Sikertelen fájlfeltöltés:⎠%1 Removing file failed: %1 Sikertelen fájl eltávolítás:⎠%1 Creating directory failed: %1 Sikertelen könyvtár létrehozás:⎠%1 Removing directory failed: %1 Sikertelen könyvtár eltávolítás:⎠%1 Connection closed Kapcsolat lezárva QLineEdit &Undo Visszavonás &Redo Ismételt végrehajtás Cu&t Kivágás &Copy &Másolás &Paste Beillesztés Delete Törlés Select All Az összes kijelölése QMultiInputContext Select IM IM kiválasztása QObject Cannot start external program Nem indítható el a külsÅ‘ program Cannot start external program! %1 Nem indítható el a külsÅ‘ program! %1 Error Hiba QTextControl &Undo Visszavonás &Redo Ismételt végrehajtás Cu&t Kivágás &Copy Másolás &Paste Beillesztés Delete Törlés Select All Az összes kijelölése Copy &Link Location Hivatkozási hely másolása QWizard Cancel Mégse < &Back < &Vissza &Finish &Befejezés &Next > &KövetkezÅ‘ > RSSDetectionWidget Untitled feed Névtelen hírcsatorna RequestFeed Server requires authentication! Kiszolgáló hitelesítés szükséges! Server replied: Not Found! Kiszolgáló válaszolt: Nem található! Redirect error! Ãtirányítási hiba! Request timeout! Kérelem idÅ‘túllépése! SQLiteDriver Error opening database Adatbázis megnyitási hiba Error closing database Adatbázis bezárási hiba Unable to begin transaction A tranzakció nem indítható Unable to commit transaction A tranzakció nem véglegesíthetÅ‘ Unable to rollback transaction A tranzakció nem vonható vissza SQLiteResult Unable to fetch row Nem lehet beolvasni a sort No query Nincs lekérdezés Unable to execute statement Nem hajtható végre az utasítás Unable to execute multiple statements at a time Nem hajtható végre több utasítás egyszerre Unable to reset statement Nem lehet visszaállítani az adatot Unable to bind parameters Nem lehet átvinni a paramétereket Parameter count mismatch Paraméter szám eltérés SslErrorDialog SSL Certificate Error! SSL tanúsítvány hiba! Only for this session Csak erre a munkamenetre UpdateAppDialog Check for Updates Frissítések ellenÅ‘rzése Checking for updates... Frissítések ellenÅ‘rzése... Loading history... ElÅ‘zmények betöltése... Don't remind about this version Ne emlékeztessen errÅ‘l a verzióról &Install &Telepítés You already have the latest version Jelenleg a legújabb verzióval rendelkezik A new version of QuiteRSS is available! Új QuiteRSS verzió érhetÅ‘ el! Click here to go to the download page Kattintson ide a letöltési oldalra ugráshoz Your version is: Az Ön verziója: Current version is: Aktuális verzió: Error checking updates Frissítés ellenÅ‘rzési hiba quiterss-0.18.3/lang/quiterss_it.ts000066400000000000000000005521511265173051100173400ustar00rootroot00000000000000 AboutDialog About Informazioni Revision Revisione Version Versione QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS è un lettore di notizie RSS/Atom, open-source e multipiattaforma Includes: Include: Application directory: Cartella dell'applicazione: Resource directory: Cartella della risorsa: Data directory: Cartella dei dati: Backup directory: Cartella di backup: Database file: File del database: Settings file: File delle impostazioni: Log file: File del registro: Authors Autori History Cronologia License Licenza Information Informazioni AdBlockAddSubscriptionDialog Add Subscription Aggiungi sottoscrizione Title: Titolo: Address: Indirizzo: Add new subscription to AdBlock: Aggiungi una nuova sottoscrizione ad AdBlock: AdBlockCustomList Custom Rules Regole personalizzate AdBlockDialog AdBlock Configuration Configurazione di AdBlock Enable AdBlock Attiva AdBlock Search... Cerca... Options Opzioni AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Usa solo la parte essenziale di EasyList (per ragioni di prestazioni) Add Rule Aggiungi regola Remove Rule Rimuovi regola Add Subscription Aggiungi sottoscrizione Remove Subscription Rimuovi sottoscrizione Update Subscriptions Aggiorna sottoscrizioni Learn about writing rules... Impara come scrivere le regole... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock ti permette di bloccare il contenuto non desiderato nelle pagine web AdBlock AdBlock Show AdBlock &Settings Mostra le &impostazioni di AdBlock Disable on %1 Disattiva su %1 Disable only on this page Disattiva solo su questa pagina Blocked Popup Windows Finestre a comparsa bloccate %1 with (%2) %1 con (%2) No content blocked Nessun contenuto bloccato Blocked URL (AdBlock Rule) - click to edit rule URL bloccato (regola di AdBlock) - fai clic per modificare la regola AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Impossibile caricare la sottoscrizione! AdBlockTreeWidget Add Rule Aggiungi regola Remove Rule Rimuovi regola Add Custom Rule Aggiungi regola personalizzata Please write your rule here: Per favore scrivi qui la regola: %1 (recently updated) %1 (aggiornate recentemente) %1 (Error: %2) %1 (Errore: %2) AddFeedWizard Add Feed Aggiungi fonte Create New Feed Crea nuova fonte Use title of the feed as displayed name Usa il titolo della fonte come nome visualizzato Server requires authentication: Il server richiede l'autenticazione: Username: Nome utente: Password: Password: Feed URL or website address: URL della fonte o indirizzo web: Feeds Fonti All Feeds Tutte le fonti New Folder... Nuova cartella... Displayed name: Nome visualizzato: Location: Posizione: URL error! Errore URL! Duplicate feed! Fonte duplicata! Can't find feed URL! Impossibile trovare l'URL della fonte! Request failed! Richiesta non riuscita! AddFolderDialog Add Folder Aggiungi cartella Feeds Fonti All Feeds Tutte le fonti Name: Nome: Location: Posizione: AuthenticationDialog Save password Salva password Authorization required Autorizzazione necessaria Server: Server: Message: Messaggio: Username: Nome utente: Password: Password: CategoriesTreeWidget Unread Non lette Starred Preferite Deleted Eliminate Labels Etichette Open in New Tab Apri in una nuova scheda Clear 'Deleted' Pulisci 'Eliminate' Mark Read Segna come letto CleanUpWizard Clean Up Pulizia Choose Feeds Scegli fonti All Feeds Tutte le fonti Clean Up Options Opzioni di pulizia Maximum age of news in days to keep: Numero massimo di giorni per cui tenere le notizie: Maximum number of news to keep: Numero massimo di notizie da tenere: Delete read news Elimina notizie lette Never delete unread news Non eliminare le notizie non lette Never delete starred news Non eliminare le notizie preferite Never delete labeled news Non eliminare le notizie etichettate Clean up 'Deleted' Pulizia 'Eliminate' Purge DB Pulisci database Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Rimuove totalmente dal database le voci che sono state segnate come 'eliminate'. Le notizie vecchie potrebbero riapparire. Information Informazioni Clean Up wizard deleted %1 news La procedura guidata di pulizia ha cancellato %1 notizie. ClickToFlash Object blocked by ClickToFlash Oggetto bloccato da ClickToFlash Hide object Nascondi oggetto Add '%1' to whitelist Aggiungi '%1' alla lista bianca CustomizeToolbarDialog Customize Main Toolbar Personalizza la barra principale Customize Feeds Toolbar Personalizza la barra delle fonti Customize News Toolbar Personalizza la barra delle notizie Load images Carica le immagini Separator Separatore Icon Icona Text Testo Text Beside Icon Testo accanto all'icona Text Under Icon Testo sotto l'icona Big Grande Normal Normale Small Piccolo Style: Stile: Icon Size: Dimensione icona Add Aggiungi Remove Rimuovi Move up Sposta su Move down Sposta giù Default Predefinito DownloadItem Remaining time unavailable Tempo rimanente non disponibile Error: Cannot write to file! Errore: impossibile scrivere il file! Error: Errore: few seconds pochi secondi seconds secondi minutes minuti hours ore Unknown size Dimensione sconosciuta Unknown speed Velocità sconosciuta %2 - unknown size (%3) %2 - dimensione sconosciuta (%3) Remaining %1 - %2 of %3 (%4) Rimanente %1 - %2 di %3 (%4) Cancelled - %1 Annullato - %1 Delete file Elimina file Do you want to also delete downloaded file? Vuoi eliminare anche il file scaricato? Open File Apri file Open Folder Apri cartella Copy Download Link Copia collegamento download Cancel Downloading Annulla download Remove Rimuovi Cancelled Annullato Error Errore Not found Non trovato Sorry, the file %1 was not found! Spiacente, il file %1 non è stato trovato! DownloadManager Clear Pulisci File %1 (*.%2) File %1 (*.%2) All Files (*.*) Tutti i file (*.*) Save As... Salva come... Executable: Eseguibile: Arguments: Argomenti: FeedPropertiesDialog Properties Proprietà General Generale Columns Colonne Authentication Autenticazione Status Stato Title: Titolo: Homepage: Sito: Feed URL: URL della fonte: Load Title Carica titolo Load Favicon Carica favicon Select Icon... Seleziona icona... Select Icon Seleziona icona Disable update Disattiva aggiornamento Automatically update every Aggiorna automaticamente ogni seconds secondi minutes minuti hours ore Starred Preferite Load images Carica immagini Display in new tab on startup Visualizza in una nuova scheda all'avvio Show news' description instead of loading web page Mostra la descrizione della notizia invece di caricare la pagina web Automatically delete duplicate news Elimina automaticamente le notizie doppie Display Visualizzazione Reading Lettura Enable JavaScript Attiva JavaScript Right-to-left layout Disposizione da destra a sinistra Ascending Crescente Descending Decrescente Sort by: Ordina per: Add Aggiungi Remove Rimuovi Move up Sposta su Move down Sposta giù Default Predefinito Server requires authentication: Il server richiede l'autenticazione: Username: Nome utente: Password: Password: Feeds count: Numero delle fonti: Description: Descrizione: Status: Stato: Created: Creata: Last update: Ultimo aggiornamento: News count: Numero di notizie: Good Buono Long ago ;-) Molto tempo fa ;-) new nuove unread non lette Image files File immagine Select Image Seleziona immagine Load icon: can't open a file! Carica icona: impossibile aprire un file! FilterRulesDialog Filter Rules Regole filtro Feeds Fonti All Feeds Tutte le fonti Filter name: Nome filtro: Match all news Trova tutte le notizie Match all conditions Trova tutte le condizioni Match any condition Trova ogni condizione Perform these actions: Esegui queste azioni: Please enter name for the filter. Inserisci il nome per il filtro. Please enter search condition for the news filter. Inserisci la condizione di ricerca per il filtro. FindFeed Find Name Trova nome Find Link Trova collegamento FindTextContent Find in News Trova tra le notizie Find in Titles Trova nei titoli Find in Authors Trova tra gli autori Find in Categories Trova tra le categorie Find in Descriptions Trova tra le descrizioni Find in Links Trova nei collegamenti Find in Browser Trova nel browser FtpDownloader Canceled! Annullato! ItemAction Mark News as Read Segna notizie come lette Add Star Aggiungi stella Delete Elimina Add Label Aggiungi etichetta Play a Sound Riproduci un suono Show News in Notifier Mostra le notizie nelle notifiche Browse Sfoglia Play Riproduci Add Action Aggiungi azione Delete Action Elimina azione Open File... Apri file... ItemCondition Title Titolo Description Descrizione Author Autore Category Categoria State Stato Link Collegamento News Notizie New Nuova Read Letto Starred Preferite Add Condition Aggiungi condizione Delete Condition Elimina condizione contains contiene doesn't contains non contiene is è isn't non è begins with inizia con ends with termina con Regular expressions Espressioni regolari LabelDialog New Label Nuova etichetta Load icon... Carica icona... Default Predefinito Select color... Seleziona colore... Name: Nome: Icon: Icona: Color text: Colore testo: Color background: Colore sfondo: Image files File immagine Select Image Seleziona immagine Load icon: can't open a file! Carica icona: impossibile aprire un file! MainApplication Saving data... Salvataggio dei dati... MainWindow &AdBlock &AdBlock Hide Categories Nascondi categorie Show Categories Mostra categorie Select OPML-File Seleziona un file OPML OPML-Files (*.%1 *.%2) File OPML (*.%1 *.%2) Import canceled Importazione annullata Import: can't open a file Importazione: impossibile aprire il file OPML-Files (*.%1) File OPML (*.%1) Export canceled Esportazione annullata Export: can't open a file Esportazione: impossibile aprire il file Unread: %1 Non lette: %1 All: %1 Tutto: %1 (Browser) (Browser) New News: %1 Nuove notizie: %1 Unread News: %1 Notizie non lette: %1 &Add &Aggiungi Add New Feed Aggiungi una nuova fonte &Feed... &Fonte... F&older... C&artella... Add New Folder Aggiungi nuova cartella Open in New Tab Apri in una nuova scheda &Delete... &Elimina... Delete Selected Feed Elimina la fonte selezionata &Import Feeds... &Importa fonti... Import Feeds from OPML File Importa fonti da un file OPML &Export Feeds... &Esporta fonti... Export Feeds to OPML File Esporta le fonti in un file OPML E&xit E&sci Update Feed Aggiorna fonte Update Current Feed Aggiorna la fonte attuale Update All Aggiorna tutto Update All Feeds Aggiorna tutte le fonti Mark All Feeds Read Segna tutte le fonti come lette Mark Read/Unread Segna come letta/non letta Mark Current News Read/Unread Segna la fonte attuale come letta/non letta Mark All News Read Segna tutte le notizie come lette Downloads Download Clean Up... Pulizia... News Filters... Filtri notizie... Filter News... Filtra notizie... Options... Opzioni... Open Options Dialog Apre la finestra delle opzioni Filter Feeds Filtro fonti Show All Mostra tutto Show New Mostra nuove Show Unread Mostra non lette Show Starred Feeds Mostra le fonti preferite Show Not Working Feeds Mostra fonti non funzionanti Filter News Filtro notizie Show Starred Mostra preferite Show Not Starred Mostra non preferite Show Unread or Starred Mostra non lette o preferite Show Last Day Mostra ultimo giorno Show Last 7 Days Mostra ultimi 7 giorni About... Informazioni su... Show 'About' Dialog Mostra finestra Informazioni Check for Updates... Cerca aggiornamenti... Report a Problem... Segnala un problema... Open News Apri notizie Open in Browser Apri nel browser Open in External Browser Apri in un browser esterno Open News in External Browser Apri notizie nel browser esterno Open News in New Tab Apri in una nuova scheda Open in Background Tab Apri in una scheda in secondo piano Open News in Background Tab Apre le notizie in una scheda in secondo piano Star Stella Mark News Star Segna la notizia come preferita Delete Elimina Delete Selected News Elimina notizie selezionate Delete All News Elimina tutte le notizie Delete All News from List Elimina tutte le notizie dalla lista Restore Ripristina Restore News Ripristina notizia Copy Link Copia collegamento Restore last deleted news Ripristina l'ultima notizia eliminata Mark Read Segna come letta Mark Feed Read Segna fonte come letta Properties Proprietà &File &File Count Unread News Numero delle notizie non lette Count All News Numero di tutte le notizie Last Update Ultimo aggiornamento Reset browser zoom Ripristina l'ingrandimento nel browser Print Web Page Stampa pagina web Preview Web Page Anteprima pagina web Save page in database Salva la pagina nel database Save page in database instead of news description Salva la pagina nel database invece della descrizione delle notizie Confirm Delete Conferma eliminazione Are you sure to delete selected elements? Vuoi eliminare gli elementi selezionati? Menu Menu Add Feed... Aggiungi fonte... &Create Backup... &Crea backup... S&how Menu Bar Mo&stra la barra dei menu Stop Update Feeds Interrompi l'aggiornamento delle fonti Open News Description Apri descrizione notizie Copy News Link Copia collegamento della notizia &View &Visualizza Fee&ds &Fonti &News &Notizie &Browser &Browser &Tools S&trumenti &Help &Aiuto Main Toolbar Barra principale Customize Toolbar Personalizza barra degli strumenti Main Toolbar... Barra principale... Customize Toolbar... Personalizza barra... Feeds Toolbar... Barra delle fonti... News Toolbar... Barra delle notizie... Lock Toolbar Blocca barra degli strumenti Hide Toolbar Nascondi barra degli strumenti Layout Disposizione Classic Classica Newspaper Giornale Application Style Stile applicazione System Sistema System2 Sistema2 Green Verde Orange Arancio Purple Viola Pink Rosa Gray Grigio Browser Position Posizione browser Top In alto Bottom In basso Right Destra Left Sinistra Show Window Mostra finestra Previous Feed Fonte precedente Next Feed Fonte successiva Previous News Notizia precedente Next News Notizia successiva News Page Up Pagina delle notizie su News Page Down Pagina delle notizie giù Next Unread News Notizia non letta successiva Previous Unread News Notizia non letta precedente Switch Focus to Next Panel Sposta la selezione al riquadro successivo Switch Focus to Next Panel (Tree Feeds, List News, Browser) Sposta la selezione al riquadro successivo (albero delle fonti, elenco notizie, browser) Switch Focus to Previous Panel Sposta la selezione al riquadro precedente Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Sposta la selezione al riquadro precedente (albero delle fonti, elenco notizie, browser) Show/Hide Tree Feeds Mostra/nascondi albero delle fonti Minimize to Tray Riduci nell'area di notifica Minimize Application to Tray Riduce l'applicazione nell'area di notifica Columns Colonne Show Indentation Mostra rientro Search Feed Cerca fonte Zoom Zoom Zoom In Ingrandisci Zoom in in browser Ingrandisci nel browser Zoom Out Rimpicciolisci Zoom out in browser Rimpicciolisci nel browser 100% 100% Print... Stampa... Print Preview... Anteprima di stampa... Page up (Browser) Pagina su (browser) Page down (Browser) Pagina giù (browser) Save As... Salva come... Save Page As... Salva pagina come... Show/Hide Mostra/nascondi Feeds Toolbar Barra delle fonti News Toolbar Barra delle notizie Browser Toolbar Barra del browser Panel Categories Pannello categorie Status Bar Barra di stato Full Screen Schermo intero Stay On Top In primo piano Categories Categorie Label Etichetta Show labels menu Mostra menu etichette Close Tab Chiudi scheda Close Other Tabs Chiudi le altre schede Close All Tabs Chiudi tutte le schede Switch to next tab Passa alla scheda successiva Switch to previous tab Passa alla scheda precedente Unread Non lette Starred Preferite Deleted Eliminate Labels Etichette Decrease news list/increase browser Diminuisci elenco notizie/aumenta browser Increase news list/decrease browser Aumenta elenco notizie/diminuisci browser Find Trova Open Homepage Feed Apri sito della fonte Sort by Name Ordina per nome Collapse All Folders Chiudi tutte le cartelle Expand All Folders Apri tutte le cartelle Next Folder Cartella successiva Previous Folder Cartella precedente Expand Folder Apri cartella Setting Page: Labels Pagina impostazioni: Etichette Share Condividi Sort By Ordina per Ascending Crescente Descending Decrescente Check for updates Cerca aggiornamenti A new version of QuiteRSS... Una nuova versione di QuiteRSS... Loading... Caricamento... Web Page Pagina web Save As Salva come HTML-Files (*.%1) File HTML (*.%1) Text files (*.%2) File di testo (*.%2) Save As: can't open a file Salva come: impossibile aprire il file Choose Directory Scegli una cartella Important Importante Work Lavoro Personal Personale To Do Da fare Later Più tardi Amusingly Divertente NetworkManager SSL Certificate Error! Errore del certificato SSL! The "%1" server has the following errors in the SSL certificate: Il server "%1" presenta i seguenti errori nel certificato SSL: <b>Organization: </b> <b>Organizzazione: </b> <b>Domain Name: </b> <b>Nome dominio: </b> <b>Expiration Date: </b> <b>Data di scadenza: </b> <b>Error: </b> <b>Errore: </b> Would you like to make an exception for this certificate? Vuoi fare un'eccezione per questo certificato? NewsFiltersDialog News Filters Filtri delle notizie Feeds Fonti Filter Name Nome del filtro New... Nuovo... Edit... Modifica... Delete... Elimina... Move up Sposta su Move down Sposta giù Run Filter Esegui filtro Delete Filter Elimina filtro Are you sure you want to delete the filter '%1'? Vuoi eliminare il filtro '%1'? NewsHeader Icon Feed Icona fonte Title Titolo Published Pubblicata Received Ricevuta Author Autore Category Categoria Read Letta Star Stella Label Etichetta Feed Title Titolo della fonte Link Collegamento NewsItem Mark Read/Unread Segna come letta/non letta Delete News Elimina notizie NewsTabWidget Loading... (%p%) Caricamento... (%p%) Home Sito Open Page in External Browser Apri pagina nel browser esterno Open Link in External Browser Apri collegamento nel browser esterno Open Link Apri collegamento Open in New Tab Apri in una nuova scheda Save Link... Salva collegamento... Save Image... Salva immagine... Copy Link Copia collegamento Copy Copia Go Back Precedente Go Forward Successivo Stop Ferma Reload Ricarica Copy Image Copia immagine Copy Image Address Copia indirizzo immagine Load Images Immagini attive Auto Load Images to News View Carica automaticamente le immagini nella vista notizie No Load Images Immagini non attive No Load Images to News View Non caricare le immagini nella vista notizie Close Tab Chiudi scheda Auto Load Images in News View Carica automaticamente le immagini nella vista notizie Don't Load Images Non caricare le immagini Don't Load Images in News View Non caricare le immagini nella vista notizie Comments Commenti Author: %1 Autore: %1 audio audio video video media media Link to Collegamento a Mark Read/Unread Segna come letto/non letto Mark News Star Segna la notizia con una stella Label Etichetta Share Condividi Open News in External Browser Apri le notizie nel browser esterno Delete Elimina NotificationWidget Close Chiudi Mark All News Read Segna tutte le notizie come lette Previous Page Pagina precedente Next Page Pagina successiva Incoming News: %1 Notizie in arrivo: %1 Page %1 of %2 Pagina %1 di %2 OptionsDialog Options Opzioni General Generali System Tray Area di notifica Network Connections Connessioni di rete Browser Browser Feeds Fonti Labels Etichette Notifications Notifiche Passwords Password Language Lingua Fonts & Colors Caratteri e colori Keyboard Shortcuts Scorciatoie da tastiera Warning: key is already assigned to Attenzione: il tasto è già assegnato a Show splash screen on startup Mostra schermata iniziale all'avvio Reopen last opened feeds on startup Riapri le ultime fonti aperte all'avvio Open new tab next to active Apri nuova scheda accanto a quella attiva Hide feeds tree when opening tabs Nascondi l'albero delle fonti all'apertura delle schede Show default rss-icon instead of favourite one Mostra l'icona RSS predefinita anziché quella preferita Automatically collapse folders Chiudi automaticamente le cartelle Show close button on tab Mostra il pulsante di chiusura sulla scheda Automatically check for updates Controlla automaticamente gli aggiornamenti Help improve QuiteRSS by sending usage information Aiuta a migliorare QuiteRSS inviando informazioni sull'utilizzo Store a DB in memory (requires program restart) Memorizza un database (necessario riavvio) Save DB stored in memory to file every Salva database memorizzato su file ogni minutes minuti Run QuiteRSS at Windows startup Esegui QuiteRSS all'avvio di Windows Show system tray icon Mostra icona nell'area di notifica starting QuiteRSS all'avvio di QuiteRSS minimizing QuiteRSS riducendo a icona QuiteRSS closing QuiteRSS alla chiusura di QuiteRSS Show static icon Mostra icona statica Change icon for incoming new news Cambia icona se ci sono notizie in arrivo Show count of new news Mostra il numero delle nuove notizie Show count of unread news Mostra il numero delle notizie non lette Single click instead of double click for show window Mostra la finestra con singolo clic (invece che doppio) Empty working set on minimize to tray Elimina le attività quando si riduce all'area di notifica Move to the system tray when: Sposta nell'area di notifica: Tray icon behavior: Comportamento dell'icona nell'area di notifica: Direct connection to the Internet Connessione diretta a Internet System proxy configuration (if available) Utilizza il proxy di sistema (se disponibile) Manual proxy configuration: Configurazione manuale del proxy: Proxy server: Server proxy: Port: Porta: Username: Nome utente: Password: Password: Request timeout: Scadenza della richiesta: Number of requests: Numero di richieste: Number of retries: Numero di tentativi: Options network requests when updating feeds (requires program restart): Opzioni richieste di rete durante l'aggiornamento delle fonti (necessario riavvio): Use embedded browser Usa il browser integrato Use external browser Usa il browser esterno Default external browser Browser esterno predefinito Following external browser: Browser esterno seguente: Browse... Cerca... Load images Carica immagini Enable JavaScript Abilita JavaScript Enable plug-ins Abilita i plug-in Open links in embedded browser in background Apri i collegamenti nel browser integrato in secondo piano Open links in external browser in background (experimental) Apri i collegamenti nel browser esterno in secondo piano (sperimentale) Default zoom on pages: Zoom predefinito nelle pagine: Browser selection: Selezione del browser: External browser: Browser esterno: Content: Contenuto: User style sheet: Foglio di stile definito dall'utente: Maximum pages in cache Numero massimo di pagine nella cache Store cache in: Conserva la cache in: Maximum size of disk cache Dimensione massima della cache su disco MB MB Use disk cache Usa cache su disco Allow local data to be set Consenti ai dati locali di essere impostati Keep local data only until quit application Conserva i dati locali solo fino alla chiusura dell'applicazione Block sites from setting any data Impedisci ai siti di impostare dati Clear Pulisci Cookies: Cookie: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash è un plugin che blocca il caricamento automatico dei contenuti Flash di una pagina. È sempre possibile caricarli manualmente facendo clic sull'icona Play. Use Click to Flash Usa Click To Flash Add... Aggiungi... Remove... Rimuovi... Ask where to save each file before downloading Chiedi dove salvare il file prima di scaricarlo Download location: Posizione dei download: History Cronologia Click to Flash Click To Flash Downloads Download Automatically update the feeds on startup Aggiorna automaticamente le fonti all'avvio Automatically update the feeds every Aggiorna automaticamente le fonti ogni seconds secondi hours ore Nothing to do Niente Dec Dic December Dicembre Display format for date: Formato di visualizzazione per la data: time: ora: Alternating row background colors Alterna i colori di sfondo delle righe Simplified representation of date and time Rappresentazione semplificata di data e ora Show All Mostra tutto Show New Mostra nuove Show Unread Mostra non lette Show Starred Mostra preferite Show Not Starred Mostra non preferite Show Unread or Starred Mostra non lette o preferite Show Last Day Mostra ultimo giorno Show Last 7 Days Mostra ultimi 7 giorni Style sheet for news: Foglio di stile per le notizie: Mark news as read: Segna notizie come lette: on selecting. With timeout se selezionate. Con timeout di after switching to another news dopo essere passato a un'altra notizia Mark displayed news as read when switching feeds Segna come lette le notizie visualizzate quando si cambia fonte Mark displayed news as read when closing tab Segna le notizie visualizzate come lette quando si chiude la scheda Mark displayed news as read on minimize Segna le notizie visualizzate come lette quando si riduce a icona Change behavior of action 'Next Unread News' Cambia il comportamento dell'azione 'Notizia non letta successiva' starred news notizie preferite labeled news notizie etichettate Automatically mark identical news as read Segna automaticamente le notizie identiche come già lette Prevent accidental deletion of: Impedisci l'eliminazione accidentale di: Enable cleanup on shutdown Abilita pulizia allo spegnimento Maximum age of news in days to keep: Numero massimo di giorni per cui tenere le notizie: Maximum number of news to keep: Numero massimo di notizie da tenere: Delete read news Elimina le notizie lette Never delete unread news Non eliminare le notizie non lette Never delete starred news Non eliminare le notizie preferite Never delete labeled news Non cancellare le notizie etichettate Clean up 'Deleted' Pulizia 'Eliminate' Enable DB optimization (slower shutdown) Attiva ottimizzazione del database (spegnimento più lento) Reading Lettura Clean Up Pulizia New... Nuovo... Edit... Modifica... Delete... Elimina... Move up Sposta su Move down Sposta giù Show when inactive main window Mostra quando la finestra principale non è attiva Screen Schermo Transparency Trasparenza Show titles feeds Mostra i titoli delle fonti Show icon feed Mostra l'icona della fonte Show button 'Mark All News Read' Mostra pulsante 'Segna tutte le notizie come lette' Show button 'Mark Read/Unread' Mostra pulsante 'Segna come letta/non letta' Show button 'Open in External Browser' Mostra pulsante 'Apri in un browser esterno' Show button 'Delete News' Mostra pulsante 'Elimina notizie' Play sound for incoming new news Riproduci suono per notizie in arrivo Play Riproduci Display notification for incoming news Mostra notifiche per notizie in arrivo Top Left In alto a sinistra Top Right In alto a destra Bottom Left In basso a sinistra Bottom Right In basso a destra Review Anteprima Position Posizione Show maximum of Mostra massimo item on page notification elemento nella notifica Width list items Larghezza degli elementi della lista pixels pixel Close notification after Chiudi notifiche dopo Do not show notification in fullscreen mode Non mostrare le notifiche durante la modalità a schermo intero Display Visualizzazione Action mouse on news opening: Azione del mouse all'apertura delle notizie: Single Click: Singolo clic: Double Click: Doppio clic: Middle Click: Clic centrale: Only show selected feeds: Mostra solo le fonti selezionate: Notification Notifica Sound Suono Selection of feeds Selezione delle fonti All Feeds Tutte le fonti Site Sito User Utente Password Password Delete Elimina Delete All Elimina tutto Show Passwords Mostra password Version Versione Author Autore Contact Contatto Choose language: Scegli una lingua: Type Tipo Font Carattere Feeds list font Carattere della lista delle fonti News list font Carattere dell'elenco notizie News title font Carattere del titolo delle notizie News text font Carattere del testo delle notizie Notification font Carattere delle notifiche Change... Modifica... Reset Ripristina Feeds list color Colore della lista delle fonti Feeds list background Sfondo della lista delle fonti News list color Colore della lista notizie News list background Sfondo della lista delle notizie Focused news color Colore delle notizie selezionate Focused news background color Colore di sfondo delle notizie selezionate Link color Colore del collegamento Title color Colore del titolo Date color Colore della data Author color Colore dell'autore News text color Colore del testo della notizia News title background Sfondo del titolo delle notizie News background Sfondo delle notizie Feed with new news Fonte con nuove notizie Count of unread news in feeds tree Conta le notizie non lette nell'albero delle fonti Disabled feed Fonte disattivata Alternating row colors Colori delle righe alternati Notification text color Colore del testo della notifica Notification background color Colore dello sfondo della notifica Auto load images in news view Carica automaticamente le immagini nella vista notizie Text color of new news Colore del testo nelle nuove notizie Show feeds tree toggle Mostra l'interruttore dell'albero delle fonti Clear new status when minimize to tray Togli "Nuovo" quando si minimizza nell'area di notifica Set focus on the last opened news Poni la selezione sull'ultima notizia aperta Set focus at the top of news list Poni la selezione all'inizio nell'elenco delle notizie Set focus on the unread news Poni la selezione sulle notizie non lette Open the news Apri le notizie Default news filter: Filtro delle notizie predefinito: Action on feed opening: Azione all'apertura delle fonte: Show news description instead of loading web page Mostra la descrizione della notizia invece di caricare la pagina web Text color of unread news Colore del testo delle notizie non lette Focused feed color Colore della fonte selezionata Focused feed background color Colore di sfondo della fonte selezionata Standard Standard Fixed Fissa Serif Serif Sans Serif Sans Serif Cursive Corsivo Fantasy Fantasy Default font size Dimensione carattere predefinita Fixed font size Dimensione carattere fissa Minimum font size Dimensione carattere minima Minimum logical font size Dimensione carattere logico minima Font families: Famiglie di caratteri: Font sizes: Dimensioni del carattere Fonts Caratteri Fonts Browser Carattere del browser Colors Colori Filter Filtro Action Azione Description Descrizione Shortcut Scorciatoia Shortcut: Scorciatoia: Open File... Apri file... Select Style Sheet File Seleziona il file del foglio di stile Open Directory... Apri cartella... Add site to whitelist Aggiungi sito alla lista bianca Site without 'http://' (ex. youtube.com) Sito senza 'http://' (es. youtube.com) QAbstractSpinBox &Step up &Aumenta Step &down &Diminuisci &Select All &Seleziona tutto QDialogButtonBox Close Chiudi Cancel Annulla &Yes &Sì &No &No QFtp Not connected Non connesso Host %1 not found Host %1 non trovato Connection refused to host %1 Connessione rifiutata dall'host %1 Connection timed out to host %1 Connessione scaduta per l'host %1 Connected to host %1 Connesso all'host %1 Connection refused for data connection Connessione rifiutata per la connessione dati Unknown error Errore sconosciuto Connecting to host failed: %1 Connessione all'host fallita: %1 Login failed: %1 Accesso fallito: %1 Listing directory failed: %1 Creazione elenco delle directory fallita: %1 Changing directory failed: %1 Cambio di directory fallito: %1 Downloading file failed: %1 Scaricamento del file fallito: %1 Uploading file failed: %1 Caricamento del file fallito: %1 Removing file failed: %1 Rimozione del file fallita: %1 Creating directory failed: %1 Creazione della directory fallita: %1 Removing directory failed: %1 Rimozione della directory fallita: %1 Connection closed Connessione chiusa QLineEdit &Undo Ann&ulla &Redo &Ripeti Cu&t &Taglia &Copy &Copia &Paste Inc&olla Delete Elimina Select All Seleziona tutto QMultiInputContext Select IM Seleziona il metodo di inserimento QObject Cannot start external program Impossibile avviare il programma esterno Cannot start external program! %1 Impossibile avviare il programma esterno! %1 Error Errore QTextControl &Undo Ann&ulla &Redo &Ripeti Cu&t &Taglia &Copy &Copia &Paste &Incolla Delete Elimina Select All Seleziona tutto Copy &Link Location Copia l'indirizzo del co&llegamento QWizard Cancel Annulla < &Back < &Indietro &Finish &Fine &Next > Ava&nti > RSSDetectionWidget Untitled feed Fonte senza titolo RequestFeed Server requires authentication! Il server richiede l'autenticazione! Server replied: Not Found! Risposta server: non trovata! Redirect error! Errore di reindirizzamento! Request timeout! Timeout della richiesta! SQLiteDriver Error opening database Errore all'apertura del database Error closing database Errore alla chiusura del database Unable to begin transaction Impossibile iniziare la transazione Unable to commit transaction Impossibile eseguire la transazione Unable to rollback transaction Impossibile annullare la transazione SQLiteResult Unable to fetch row Impossibile recuperare la riga No query Nessuna richiesta Unable to execute statement Impossibile eseguire la richiesta Unable to execute multiple statements at a time Impossibile eseguire contemporaneamente richieste multiple Unable to reset statement Impossibile annullare la richiesta Unable to bind parameters Impossibile associare i parametri Parameter count mismatch Mancata corrispondenza nel conteggio dei parametri SslErrorDialog SSL Certificate Error! Errore del certificato SSL! Only for this session Solo per questa sessione UpdateAppDialog Check for Updates Verifica degli aggiornamenti Checking for updates... Verifica degli aggiornamenti in corso... Loading history... Caricamento della cronologia delle versioni... Don't remind about this version Non ricordare questa versione &Install &Installa You already have the latest version Hai già l'ultima versione A new version of QuiteRSS is available! È disponibile una nuova versione di QuiteRSS! Click here to go to the download page Fai clic qui per andare alla pagina di download Your version is: La tua versione è: Current version is: La versione attuale è: Error checking updates Errore di verifica degli aggiornamenti quiterss-0.18.3/lang/quiterss_ja.ts000066400000000000000000005577521265173051100173320ustar00rootroot00000000000000 AboutDialog About QuiteRSS ã«ã¤ã„㦠Revision リビジョン Version ãƒãƒ¼ã‚¸ãƒ§ãƒ³ QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS ã¯ã‚ªãƒ¼ãƒ—ンソースã§ã‚¯ãƒ­ã‚¹ãƒ—ラットホーム㪠RSS/Atom ニュースリーダーã§ã™ Includes: Includes: Application directory: アプリケーションディレクトリ: Resource directory: リソースディレクトリ: Data directory: データディレクトリ: Backup directory: ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ディレクトリ: Database file: データベースファイル: Settings file: 設定ファイル: Log file: ログファイル: Authors 作者 History 履歴 License ライセンス Information 情報 AdBlockAddSubscriptionDialog Add Subscription 購読ã™ã‚‹ãƒ•ィルターã®è¿½åŠ  Title: タイトル: Address: アドレス: Add new subscription to AdBlock: AdBlock ã§æ–°è¦ã«è³¼èª­ã™ã‚‹ãƒ•ィルター: AdBlockCustomList Custom Rules カスタムルール AdBlockDialog AdBlock Configuration AdBlock ã®è¨­å®š Enable AdBlock AdBlock を有効ã«ã™ã‚‹ Search... 検索... Options オプション AdBlock AdBlock Use only essential part of EasyList (for performance reasons) EasyList ã®å¿…è¦æœ€å°é™ã®éƒ¨åˆ†ã®ã¿ä½¿ç”¨ã™ã‚‹ (性能上ã®ç†ç”±ã§) Add Rule ルールã®è¿½åŠ  Remove Rule ルールã®å‰Šé™¤ Add Subscription 購読フィルターã®è¿½åŠ  Remove Subscription 購読フィルターã®å‰Šé™¤ Update Subscriptions ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®æ›´æ–° Learn about writing rules... ãƒ«ãƒ¼ãƒ«ã®æ›¸ãæ–¹ã«ã¤ã„ã¦... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock ã¯ã‚¦ã‚§ãƒ–ページã®ä¸è¦ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„をブロックã—ã¾ã™ AdBlock AdBlock Show AdBlock &Settings AdBlock ã®è¨­å®šã‚’表示(&S) Disable on %1 %1 ã§ç„¡åй Disable only on this page ã“ã®ãƒšãƒ¼ã‚¸ã ã‘無効 Blocked Popup Windows ブロックã•れãŸãƒãƒƒãƒ—アップウィンドウ %1 with (%2) %1 (%2) No content blocked ブロックコンテンツ無㗠Blocked URL (AdBlock Rule) - click to edit rule ブロックã•れ㟠URL (AdBlock ルール) - クリックã§ãƒ«ãƒ¼ãƒ«ã‚’編集 AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! フィルターを読ã¿è¾¼ã‚ã¾ã›ã‚“! AdBlockTreeWidget Add Rule ルールã®è¿½åŠ  Remove Rule ルールã®å‰Šé™¤ Add Custom Rule カスタムルールã®è¿½åŠ  Please write your rule here: ルールを入力ã—ã¦ãã ã•ã„: %1 (recently updated) %1 (最終更新) %1 (Error: %2) %1 (エラー: %2) AddFeedWizard Add Feed フィードã®è¿½åŠ  Create New Feed æ–°ã—ã„フィードã®ä½œæˆ Use title of the feed as displayed name フィードã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’表示åã«ä½¿ç”¨ã™ã‚‹ Server requires authentication: サーãƒãƒ¼ã«èªè¨¼ãŒå¿…è¦: Username: ユーザーå: Password: パスワード: Feed URL or website address: フィード㮠URL ã¾ãŸã¯ã‚¦ã‚§ãƒ–サイトã®ã‚¢ãƒ‰ãƒ¬ã‚¹: Feeds フィード All Feeds 全フィード New Folder... æ–°ã—ã„フォルダー... Displayed name: 表示å: Location: 場所: URL error! URL エラーã§ã™! Duplicate feed! フィードãŒé‡è¤‡ã—ã¦ã„ã¾ã™! Can't find feed URL! URL ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“! Request failed! リクエストã¯å¤±æ•—ã—ã¾ã—ãŸ! AddFolderDialog Add Folder フォルダーã®è¿½åŠ  Feeds フィード All Feeds 全フィード Name: åå‰: Location: 場所: AuthenticationDialog Save password パスワードをä¿å­˜ã™ã‚‹ Authorization required èªè¨¼ãŒè¦æ±‚ã•れã¾ã—㟠Server: サーãƒãƒ¼: Message: メッセージ: Username: ユーザーå: Password: パスワード: CategoriesTreeWidget Unread 未読 Starred スター付ã Deleted 削除 Labels ラベル Open in New Tab æ–°ã—ã„タブã§é–‹ã Clear 'Deleted' '削除' ã«ãƒžãƒ¼ã‚¯ã•れãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’削除 Mark Read CleanUpWizard Clean Up クリーンアップ Choose Feeds フィードã®é¸æŠž All Feeds 全フィード Clean Up Options クリーンアップオプション Maximum age of news in days to keep: æœ€å¤§ãƒ‹ãƒ¥ãƒ¼ã‚¹ä¿æŒæ—¥æ•°: Maximum number of news to keep: æœ€å¤§ãƒ‹ãƒ¥ãƒ¼ã‚¹ä¿æŒä»¶æ•°: Delete read news 既読ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’削除ã™ã‚‹ Never delete unread news 未読ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã¯å‰Šé™¤ã—ãªã„ Never delete starred news スター付ãニュースã¯å‰Šé™¤ã—ãªã„ Never delete labeled news ラベル付ãニュースを削除ã—ãªã„ Clean up 'Deleted' '削除' ã«ãƒžãƒ¼ã‚¯ã•れãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’削除ã™ã‚‹ Purge DB DB をパージã™ã‚‹ Totally remove records that had marked 'deleted' from DB. Ancient news could reappear '削除' ã«ãƒžãƒ¼ã‚¯ã•れã¦ã„る全レコードを DB ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚ ã¨ã¦ã‚‚å¤ã„ニュースãŒå†ã³è¡¨ç¤ºã•れるã‹ã‚‚ã—れã¾ã›ã‚“ Information Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash ClickToFlash ã§ãƒ–ロックã•れãŸã‚ªãƒ–ジェクト Hide object オブジェクトを隠㙠Add '%1' to whitelist '%1' をホワイトリストã¸è¿½åŠ  CustomizeToolbarDialog Customize Main Toolbar メインツールãƒãƒ¼ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º Customize Feeds Toolbar フィードツールãƒãƒ¼ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º Customize News Toolbar ニューズツールãƒãƒ¼ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º Load images ç”»åƒã®èª­ã¿è¾¼ã¿ Separator セパレーター Icon アイコン Text 文字 Text Beside Icon æ–‡å­—ã®æ¨ªã«ã‚¢ã‚¤ã‚³ãƒ³ Text Under Icon 文字ã®ä¸‹ã«ã‚¢ã‚¤ã‚³ãƒ³ Big 大ãã„ Normal 普通 Small å°ã•ã„ Style: スタイル: Icon Size: アイコンサイズ: Add 追加 Remove 削除 Move up 上㸠Move down 下㸠Default デフォルト DownloadItem Remaining time unavailable æ®‹ã‚Šæ™‚é–“ä¸æ˜Ž Error: Cannot write to file! エラー: ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ãè¾¼ã‚ã¾ã›ã‚“! Error: エラー: few seconds æ•°ç§’ seconds ç§’ minutes 分 hours 時間 Unknown size 未知ã®ã‚µã‚¤ã‚º Unknown speed 未知ã®é€Ÿåº¦ %2 - unknown size (%3) %2 - 未知ã®ã‚µã‚¤ã‚º (%3) Remaining %1 - %2 of %3 (%4) 残り %1 - %2 / %3 (%4) Cancelled - %1 キャンセル - %1 Delete file ファイルを削除 Do you want to also delete downloaded file? Open File ファイルを開ã Open Folder フォルダーを開ã Copy Download Link ダウンロードリンクをコピー Cancel Downloading ダウンロードをキャンセル Remove 削除 Cancelled キャンセル Error エラー Not found ã¿ã¤ã‹ã‚Šã¾ã›ã‚“ Sorry, the file %1 was not found! 残念ãªãŒã‚‰ã€ãƒ•ァイル %1 ã¯è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ! DownloadManager Clear クリア File %1 (*.%2) ファイル %1 (*.%2) All Files (*.*) 全ファイル (*.*) Save As... åå‰ã‚’付ã‘ã¦ä¿å­˜... Executable: 実行ファイル: Arguments: 引数: FeedPropertiesDialog Properties プロパティ General 一般 Columns カラム Authentication èªè¨¼ Status 状態 Title: タイトル: Homepage: ホームページ: Feed URL: フィード URL: Load Title タイトルã®èª­ã¿è¾¼ã¿ Load Favicon ファビコンã®èª­ã¿è¾¼ã¿ Select Icon... アイコンã®é¸æŠž... Select Icon アイコンã®é¸æŠž Disable update æ›´æ–°ã—ãªã„ Automatically update every 自動更新間隔 seconds ç§’ minutes 分 hours 時間 Starred スター付ã Load images ç”»åƒã‚’読ã¿è¾¼ã‚€ Display in new tab on startup èµ·å‹•æ™‚ã«æ–°ã—ã„タブã§è¡¨ç¤ºã™ã‚‹ Show news' description instead of loading web page ウェブページã§ã¯ãªãニュースã®èª¬æ˜Žã‚’表示ã™ã‚‹ Automatically delete duplicate news é‡è¤‡ã™ã‚‹ãƒ‹ãƒ¥ãƒ¼ã‚¹ã¯å‰Šé™¤ã™ã‚‹ Display 表示 Reading Enable JavaScript JavaScript を有効ã«ã™ã‚‹ Right-to-left layout 峿¨ªæ›¸ã (å³ã‹ã‚‰å·¦ã«æ›¸ã横書ã) レイアウト Ascending 昇順 Descending é™é † Sort by: ä¸¦ã³æ›¿ãˆ: Add 追加 Remove 削除 Move up 上㸠Move down 下㸠Default デフォルト Server requires authentication: サーãƒãƒ¼ã«èªè¨¼ãŒå¿…è¦: Username: ユーザーå: Password: パスワード: Feeds count: Description: 説明: Status: 状態: Created: 作æˆ: Last update: 最終更新: News count: ニュース件数: Good 正常 Long ago ;-) ãšã£ã¨å‰ ;-) new æ–°ç€ unread 未読 Image files ç”»åƒãƒ•ァイル Select Image ç”»åƒã®é¸æŠž Load icon: can't open a file! アイコンã®èª­ã¿è¾¼ã¿: ファイルを開ã‘ã¾ã›ã‚“! FilterRulesDialog Filter Rules フィルタールール Feeds フィード All Feeds 全フィード Filter name: フィルターå: Match all news 全ニュースã«ä¸€è‡´ Match all conditions ã™ã¹ã¦ã«ä¸€è‡´ Match any condition ã©ã‚Œã‹ã«ä¸€è‡´ Perform these actions: 以下ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行: Please enter name for the filter. フィルターåを入力ã—ã¦ãã ã•ã„。 Please enter search condition for the news filter. æ–°ã—ã„ãƒ•ã‚£ãƒ«ã‚¿ãƒ¼ã®æ¤œç´¢æ¡ä»¶ã‚’入力ã—ã¦ãã ã•ã„。 FindFeed Find Name åå‰ã‚’検索 Find Link リンクを検索 FindTextContent Find in News ニュース内を検索 Find in Titles タイトルã‹ã‚‰æ¤œç´¢ Find in Authors 作者ã‹ã‚‰æ¤œç´¢ Find in Categories カテゴリã‹ã‚‰æ¤œç´¢ Find in Descriptions Find in Links Find in Browser ブラウザー内を検索 FtpDownloader Canceled! キャンセルã—ã¾ã—ãŸ! ItemAction Mark News as Read 既読ã«ã™ã‚‹ Add Star スターを付ã‘ã‚‹ Delete 削除ã™ã‚‹ Add Label ラベルを付ã‘ã‚‹ Play a Sound サウンドを鳴ら㙠Show News in Notifier 通知内ã§ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’表示ã™ã‚‹ Browse ファイルã®é¸æŠž Play å†ç”Ÿ Add Action アクションを追加 Delete Action アクションを削除 Open File... ファイルを開ã... ItemCondition Title タイトル Description 説明 Author 作者 Category カテゴリ State 状態 Link News New æ–°è¦ Read 既読 Starred スター付ã Add Condition æ¡ä»¶ã®è¿½åŠ  Delete Condition æ¡ä»¶ã®å‰Šé™¤ contains 次ã®èªžã‚’å«ã‚€ doesn't contains 次ã®èªžã‚’å«ã¾ãªã„ is 次ã®èªžã¨ç­‰ã—ã„ isn't 次ã®èªžã¨ç­‰ã—ããªã„ begins with 次ã®èªžã§å§‹ã¾ã‚‹ ends with 次ã®èªžã§çµ‚ã‚ã‚‹ Regular expressions æ­£è¦è¡¨ç¾ LabelDialog New Label æ–°ã—ã„ラベル Load icon... アイコンã®èª­ã¿è¾¼ã¿... Default デフォルト Select color... 色ã®é¸æŠž... Name: åå‰: Icon: アイコン: Color text: 文字色: Color background: 背景色: Image files ç”»åƒãƒ•ァイル Select Image ç”»åƒã®é¸æŠž Load icon: can't open a file! アイコンã®èª­ã¿è¾¼ã¿: ファイルを開ã‘ã¾ã›ã‚“! MainApplication Saving data... MainWindow &AdBlock AdBlock&(A) Hide Categories カテゴリを隠㙠Show Categories カテゴリを表示 Select OPML-File OPML ファイルã®é¸æŠž OPML-Files (*.%1 *.%2) OPML ファイル (*.%1 *.%2) Import canceled インãƒãƒ¼ãƒˆã‚’キャンセルã—ã¾ã—㟠Import: can't open a file インãƒãƒ¼ãƒˆ: ファイルを開ã‘ã¾ã›ã‚“ OPML-Files (*.%1) OPML ファイル (*.%1) Export canceled エクスãƒãƒ¼ãƒˆã‚’キャンセルã—ã¾ã—㟠Export: can't open a file エクスãƒãƒ¼ãƒˆ: ファイルを開ã‘ã¾ã›ã‚“ Unread: %1 未読: %1 All: %1 ã™ã¹ã¦: %1 (Browser) (ブラウザー) New News: %1 æ–°ç€ãƒ‹ãƒ¥ãƒ¼ã‚¹: %1 Unread News: %1 未読ニュース: %1 &Add 追加(&A) Add New Feed æ–°ã—ã„フィードを追加ã—ã¾ã™ &Feed... フィード(&F)... F&older... フォルダー(&O)... Add New Folder æ–°ã—ãフォルダーを追加ã—ã¾ã™ Open in New Tab æ–°ã—ã„タブã§é–‹ã &Delete... 削除(&D)... Delete Selected Feed é¸æŠžã—ãŸãƒ•ィードを削除ã—ã¾ã™ &Import Feeds... フィードã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ(&I)... Import Feeds from OPML File OPML ファイルã‹ã‚‰ãƒ•ィードをインãƒãƒ¼ãƒˆã—ã¾ã™ &Export Feeds... フィードã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ(&E)... Export Feeds to OPML File フィードを OPML ã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ã¾ã™ E&xit 終了(&X) Update Feed ãƒ•ã‚£ãƒ¼ãƒ‰ã®æ›´æ–° Update Current Feed ç¾åœ¨ã®ãƒ•ィードを更新ã—ã¾ã™ Update All ã™ã¹ã¦æ›´æ–° Update All Feeds ã™ã¹ã¦ã®ãƒ•ィードを更新ã—ã¾ã™ Mark All Feeds Read 全フィードを既読ã«ã™ã‚‹ Mark Read/Unread 既読/未読ã«ã—ã¾ã™ Mark Current News Read/Unread ç¾åœ¨ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’既読/未読ã«ã™ã‚‹ Mark All News Read 全ニュースを既読ã«ã™ã‚‹ Downloads ダウンロード Clean Up... クリーンアップ... News Filters... ニュースフィルター... Filter News... ニュースã®ãƒ•ィルター... Options... オプション... Open Options Dialog オプションダイアログを表示ã—ã¾ã™ Filter Feeds フィードをフィルター Show All ã™ã¹ã¦è¡¨ç¤º Show New æ–°ç€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’表示 Show Unread 未読を表示 Show Starred Feeds スター付ãフィードを表示 Show Not Working Feeds 動作ã—ã¦ã„ãªã„フィードを表示 Filter News ニュースをフィルター Show Starred スター付ãを表示 Show Not Starred スターãªã—を表示 Show Unread or Starred 未読ã¾ãŸã¯ã‚¹ã‚¿ãƒ¼ä»˜ãを表示 Show Last Day 最新日分を表示 Show Last 7 Days 最新㮠7 日分を表示 About... QuiteRSS ã«ã¤ã„ã¦... Show 'About' Dialog ã“ã®ã‚¢ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã®æƒ…報を表示ã—ã¾ã™ Check for Updates... 最新状態をãƒã‚§ãƒƒã‚¯... Report a Problem... å•題を報告... Open News ニュースを開ã Open in Browser ブラウザーã§é–‹ã Open in External Browser 外部ブラウザーã§é–‹ã Open News in External Browser ニュースを外部ブラウザーã§é–‹ã Open News in New Tab ニュースを新ã—ã„タブã§é–‹ãã¾ã™ Open in Background Tab 後ã‚ã«ã‚¿ãƒ–ã§é–‹ã Open News in Background Tab ニュースを後ã‚ã«ã‚¿ãƒ–ã§é–‹ãã¾ã™ Star スター Mark News Star ニュースã«ã‚¹ã‚¿ãƒ¼ã‚’付ã‘ã‚‹ Delete 削除 Delete Selected News é¸æŠžã—ãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’削除 Delete All News 全ニュースを削除 Delete All News from List リストã‹ã‚‰å…¨ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’削除ã—ã¾ã™ Restore 復元 Restore News ニュースを復元ã—ã¾ã™ Copy Link リンクをコピー Restore last deleted news 最後ã«å‰Šé™¤ã—ãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’復元 Mark Read 既読ã«ã™ã‚‹ Mark Feed Read フィードを既読ã«ã—ã¾ã™ Properties プロパティ &File ファイル(&F) Count Unread News 未読記事数 Count All News 全記事数 Last Update 最終更新 Reset browser zoom ブラウザーã®ã‚ºãƒ¼ãƒ ã‚’リセットã—ã¾ã™ Print Web Page ウェブページをå°åˆ·ã—ã¾ã™ Preview Web Page ウェブページã®å°åˆ·ãƒ—レビューを表示ã—ã¾ã™ Save page in database ページをデータベースã®ä¿å­˜ Save page in database instead of news description ニュースã®èª¬æ˜Žã§ã¯ãªãページをデータベースã«ä¿å­˜ã—ã¾ã™ Confirm Delete 削除ã®ç¢ºèª Are you sure to delete selected elements? é¸æŠžã—ãŸè¦ç´ ã‚’データベースã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹? Menu メニュー Add Feed... &Create Backup... ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ä½œæˆ(&C)... S&how Menu Bar メニューãƒãƒ¼ã‚’表示(&H) Stop Update Feeds Open News Description ニュースã®èª¬æ˜Žã‚’é–‹ãã¾ã™ Copy News Link ニュースã®ãƒªãƒ³ã‚¯ã‚’コピー &View 表示(&V) Fee&ds フィード(&D) &News ニュース(&N) &Browser ブラウザー(&B) &Tools ツール(&T) &Help ヘルプ(&H) Main Toolbar メインツールãƒãƒ¼ Customize Toolbar ツールãƒãƒ¼ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º Main Toolbar... メインツールãƒãƒ¼... Customize Toolbar... カスタムツールãƒãƒ¼... Feeds Toolbar... フィードツールãƒãƒ¼... News Toolbar... ニュースツールãƒãƒ¼... Lock Toolbar ツールãƒãƒ¼ã‚’ロック Hide Toolbar ツールãƒãƒ¼ã‚’éš ã™ Layout Classic Newspaper Application Style アプリケーションスタイル System システム System2 システム2 Green グリーン Orange オレンジ Purple パープル Pink ピンク Gray グレー Browser Position ブラウザーã®ä½ç½® Top 上 Bottom 下 Right å³ Left å·¦ Show Window ウィンドウを表示 Previous Feed å‰ã®ãƒ•ィード Next Feed 次ã®ãƒ•ィード Previous News å‰ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ Next News 次ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ News Page Up ニュースを 1 ページ上㸠News Page Down ニュースを 1 ページ下㸠Next Unread News æ¬¡ã®æœªèª­ãƒ‹ãƒ¥ãƒ¼ã‚¹ Previous Unread News å‰ã®æœªèª­ãƒ‹ãƒ¥ãƒ¼ã‚¹ Switch Focus to Next Panel 次ã®ãƒ‘ãƒãƒ«ã¸ãƒ•ォーカスを移㙠Switch Focus to Next Panel (Tree Feeds, List News, Browser) 次ã®ãƒ‘ãƒãƒ« (フィードツリーã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ãƒªã‚¹ãƒˆã€ãƒ–ラウザー) ã«ãƒ•ォーカスを移動ã—ã¾ã™ Switch Focus to Previous Panel å‰ã®ãƒ‘ãƒãƒ«ã¸ãƒ•ォーカスを移㙠Switch Focus to Previous Panel (Tree Feeds, Browser, List News) å‰ã®ãƒ‘ãƒãƒ« (フィードツリーã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ãƒªã‚¹ãƒˆã€ãƒ–ラウザー) ã«ãƒ•ォーカスを移動ã—ã¾ã™ Show/Hide Tree Feeds フィードツリーã®è¡¨ç¤º/éžè¡¨ç¤º Minimize to Tray ãƒˆãƒ¬ã‚¤ã«æœ€å°åŒ– Minimize Application to Tray ã‚¢ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ãƒˆãƒ¬ã‚¤ã«æœ€å°åŒ–ã—ã¾ã™ Columns カラム Show Indentation インデント表示 Search Feed ãƒ•ã‚£ãƒ¼ãƒ‰ã®æ¤œç´¢ Zoom ズーム Zoom In ズームイン Zoom in in browser ブラウザー内をズームインã—ã¾ã™ Zoom Out ズームアウト Zoom out in browser ブラウザー内をズームアウトã—ã¾ã™ 100% 100% Print... å°åˆ·... Print Preview... å°åˆ·ãƒ—レビュー... Page up (Browser) Page down (Browser) Save As... åå‰ã‚’付ã‘ã¦ä¿å­˜... Save Page As... åå‰ã‚’付ã‘ã¦ãƒšãƒ¼ã‚¸ã‚’ä¿å­˜... Show/Hide 表示/éžè¡¨ç¤º Feeds Toolbar フィードツールãƒãƒ¼ News Toolbar ニュースツールãƒãƒ¼ Browser Toolbar ブラウザーツールãƒãƒ¼ Panel Categories パãƒãƒ«ã‚«ãƒ†ã‚´ãƒª Status Bar ステータスãƒãƒ¼ Full Screen フルスクリーン Stay On Top å¸¸ã«æœ€å‰é¢ã«è¡¨ç¤º Categories カテゴリ Label ラベル Show labels menu ラベルメニューを表示 Close Tab タブを閉ã˜ã‚‹ Close Other Tabs ä»–ã®ã‚¿ãƒ–ã‚’é–‰ã˜ã‚‹ Close All Tabs 全タブを閉ã˜ã‚‹ Switch to next tab 次ã®ã‚¿ãƒ–ã«åˆ‡ã‚Šæ›¿ãˆ Switch to previous tab å‰ã®ã‚¿ãƒ–ã«åˆ‡ã‚Šæ›¿ãˆ Unread 未読 Starred スター付ã Deleted 削除 Labels ラベル Decrease news list/increase browser ニュースリストを狭ã/ブラウザーを広ã Increase news list/decrease browser ニュースリストを広ã/ブラウザーを狭ã Find 検索 Open Homepage Feed フィードã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã‚’é–‹ã Sort by Name Collapse All Folders 全フォルダーをãŸãŸã‚€ Expand All Folders 全フォルダーを展開ã™ã‚‹ Next Folder 次ã®ãƒ•ォルダー Previous Folder å‰ã®ãƒ•ォルダー Expand Folder フォルダーを展開 Setting Page: Labels 設定ページ: ラベル Share 共有 Sort By ä¸¦ã³æ›¿ãˆ Ascending 昇順 Descending é™é † Check for updates 最新状態をãƒã‚§ãƒƒã‚¯ A new version of QuiteRSS... QuiteRSS ã®æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³... Loading... 読ã¿è¾¼ã‚“ã§ã„ã¾ã™... Web Page ウェブページ Save As åå‰ã‚’付ã‘ã¦ä¿å­˜ HTML-Files (*.%1) HTML ファイル (*.%1) Text files (*.%2) テキストファイル (*.%2) Save As: can't open a file åå‰ã‚’付ã‘ã¦ä¿å­˜: ファイルを開ã‘ã¾ã›ã‚“ Choose Directory ディレクトリã®é¸æŠž Important é‡è¦ Work 仕事 Personal 個人 To Do To Do Later 後㧠Amusingly ãŠã‚‚ã—ã‚ã„ NetworkManager SSL Certificate Error! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Domain Name: </b> <b>Expiration Date: </b> <b>Error: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters æ–°ã—ã„フィルター Feeds フィード Filter Name フィルターå New... æ–°è¦... Edit... 編集... Delete... 削除... Move up 上㸠Move down 下㸠Run Filter フィルターを実行 Delete Filter フィルターã®å‰Šé™¤ Are you sure you want to delete the filter '%1'? フィルター '%1' を削除ã—ã¦ã‚ˆã‚ã—ã„ã§ã™ã‹? NewsHeader Icon Feed フィードアイコン Title タイトル Published é…ä¿¡ Received å—ä¿¡ Author 作者 Category カテゴリ Read 既読 Star スター Label ラベル Feed Title フィードタイトル Link リンク NewsItem Mark Read/Unread 既読/未読ã«ã—ã¾ã™ Delete News ニュースを削除 NewsTabWidget Loading... (%p%) 読ã¿è¾¼ã‚“ã§ã„ã¾ã™... (%p%) Home ホーム Open Page in External Browser ページを外部ブラウザーã§é–‹ã Open Link in External Browser リンクを外部ブラウザーã§é–‹ã Open Link リンクを開ã Open in New Tab æ–°ã—ã„タブã§é–‹ã Save Link... リンクをä¿å­˜... Save Image... ç”»åƒã‚’ä¿å­˜... Copy Link リンクをコピー Copy コピー Go Back 戻る Go Forward 進む Stop åœæ­¢ Reload å†èª­ã¿è¾¼ã¿ Copy Image ç”»åƒã‚’コピー Copy Image Address ç”»åƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’コピー Load Images ç”»åƒã‚’読ã¿è¾¼ã‚€ Auto Load Images to News View ニュース表示ã§ç”»åƒã‚’読ã¿è¾¼ã¿ã¾ã™ No Load Images 画層を読ã¿è¾¼ã¾ãªã„ No Load Images to News View ニュース表示ã§ã¯ç”»åƒã‚’読ã¿è¾¼ã¿ã¾ã›ã‚“ Close Tab タブを閉ã˜ã‚‹ Auto Load Images in News View ニュースビューã§ç”»åƒã‚’自動的ã«èª­ã¿è¾¼ã¿ã¾ã™ Don't Load Images ç”»åƒã‚’読ã¿è¾¼ã¾ãªã„ Don't Load Images in News View ニュースビューã§ç”»åƒã‚’読ã¿è¾¼ã¿ã¾ã›ã‚“ Comments コメント Author: %1 作者: %1 audio オーディオ video ビデオ media メディア Link to リンク先 Mark Read/Unread Mark News Star Label Share Open News in External Browser Delete NotificationWidget Close é–‰ã˜ã‚‹ Mark All News Read 全ニュースを既読ã«ã™ã‚‹ Previous Page å‰ã®ãƒšãƒ¼ã‚¸ Next Page 次ã®ãƒšãƒ¼ã‚¸ Incoming News: %1 ç€ä¿¡ãƒ‹ãƒ¥ãƒ¼ã‚¹: %1 Page %1 of %2 ページ %1 / %2 OptionsDialog Options オプション General 一般 System Tray システムトレイ Network Connections ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶š Browser ブラウザー Feeds フィード Labels ラベル Notifications 通知 Passwords パスワード Language 言語 Fonts & Colors フォントã¨é…色 Keyboard Shortcuts キーボードショートカット Warning: key is already assigned to 警告: キーã¯ã™ã§ã«æ¬¡ã®æ©Ÿèƒ½ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ Show splash screen on startup 起動時ã«ã‚¹ãƒ—ラッシュスクリーンを表示ã™ã‚‹ Reopen last opened feeds on startup èµ·å‹•æ™‚ã«æœ€å¾Œã«é–‹ã„ãŸãƒ•ィードを開ã Open new tab next to active æ–°ã—ã„タブをアクティブãªã‚¿ãƒ–ã®éš£ã«é–‹ã Hide feeds tree when opening tabs タブを開ã„ãŸæ™‚ã«ãƒ•ィードツリーを表示ã—ãªã„ Show default rss-icon instead of favourite one デフォルト㮠RSS アイコンã§ã¯ãªããŠæ°—ã«å…¥ã‚Šã®ã‚‚ã®ã‚’表示ã™ã‚‹ Automatically collapse folders 自動的ã«ãƒ•ォルダーをãŸãŸã‚€ Show close button on tab タブã«ã€Œé–‰ã˜ã‚‹ã€ãƒœã‚¿ãƒ³ã‚’表示ã™ã‚‹ Automatically check for updates è‡ªå‹•çš„ã«æœ€æ–°çŠ¶æ…‹ã‚’ãƒã‚§ãƒƒã‚¯ã™ã‚‹ Help improve QuiteRSS by sending usage information QuiteRSS ã®æ”¹å–„を支æ´ã™ã‚‹ãŸã‚利用情報をé€ä¿¡ã™ã‚‹ Store a DB in memory (requires program restart) DB ã‚’ãƒ¡ãƒ¢ãƒªã«æ ¼ç´ã™ã‚‹ (プログラムã®å†èµ·å‹•ãŒå¿…è¦) Save DB stored in memory to file every メモリ上㮠DB ã‚’ãƒ•ã‚¡ã‚¤ãƒ«ã«æ ¼ç´ã™ã‚‹é–“éš” minutes 分 Run QuiteRSS at Windows startup Windows 起動時㫠QuiteRSS ã‚’èµ·å‹•ã™ã‚‹ Show system tray icon システムトレイアイコンを表示ã™ã‚‹ starting QuiteRSS QuiteRSS ã‚’èµ·å‹•ã—ãŸæ™‚ minimizing QuiteRSS QuiteRSS を最å°åŒ–ã—ãŸæ™‚ closing QuiteRSS QuiteRSS ã‚’é–‰ã˜ãŸæ™‚ Show static icon 統計アイコンを表示ã™ã‚‹ Change icon for incoming new news ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®æ–°ç€æ™‚ã«ã‚¢ã‚¤ã‚³ãƒ³ã‚’変更ã™ã‚‹ Show count of new news æ–°ç€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®ä»¶æ•°ã‚’表示ã™ã‚‹ Show count of unread news 未読ニュースã®ä»¶æ•°ã‚’表示ã™ã‚‹ Single click instead of double click for show window ダブルクリックã§ã¯ãªãシングルクリックã§ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示ã™ã‚‹ Empty working set on minimize to tray ãƒˆãƒ¬ã‚¤ã«æœ€å°åŒ–時ã«ãƒ¯ãƒ¼ã‚­ãƒ³ã‚°ã‚»ãƒƒãƒˆã‚’空ã«ã™ã‚‹ Move to the system tray when: システムトレイã«ç§»å‹•ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°: Tray icon behavior: ãƒˆãƒ¬ã‚¤ã‚¢ã‚¤ã‚³ãƒ³ã®æŒ¯ã‚‹èˆžã„: Direct connection to the Internet インターãƒãƒƒãƒˆã«ç›´æŽ¥æŽ¥ç¶š System proxy configuration (if available) システムã®ãƒ—ロキシ設定 (有効ã§ã‚れã°ä½¿ã†) Manual proxy configuration: 手動ã§ãƒ—ロキシ設定: Proxy server: プロキシサーãƒãƒ¼: Port: ãƒãƒ¼ãƒˆ: Username: ユーザーå: Password: パスワード: Request timeout: リクエストタイムアウト: Number of requests: リクエスト数: Number of retries: リトライ数: Options network requests when updating feeds (requires program restart): フィード更新時ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚ªãƒ—ション (プログラムã®å†èµ·å‹•ãŒå¿…è¦): Use embedded browser 内蔵ブラウザーを使ㆠUse external browser 外部ブラウザーを使ㆠDefault external browser デフォルトã®å¤–部ブラウザー Following external browser: 外部ブラウザーを指定ã™ã‚‹: Browse... å‚ç…§... Load images ç”»åƒã®èª­ã¿è¾¼ã¿ Enable JavaScript JavaScript を有効ã«ã™ã‚‹ Enable plug-ins プラグインを有効ã«ã™ã‚‹ Open links in embedded browser in background リンクを内蔵ブラウザーã§å¾Œã‚ã§é–‹ã Open links in external browser in background (experimental) リンクを外部ブラウザーã§å¾Œã‚ã§é–‹ã (試験é‹ç”¨) Default zoom on pages: デフォルトã®ã‚ºãƒ¼ãƒ å€çއ: Browser selection: 使用ブラウザー: External browser: 外部ブラウザー: Content: コンテンツ: User style sheet: ユーザースタイルシート: Maximum pages in cache キャッシュã™ã‚‹æœ€å¤§ãƒšãƒ¼ã‚¸æ•° Store cache in: キャッシュã®ä¿å­˜å…ˆ: Maximum size of disk cache ãƒ‡ã‚£ã‚¹ã‚¯ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã®æœ€å¤§ã‚µã‚¤ã‚º MB MB Use disk cache ディスクキャッシュを使用ã™ã‚‹ Allow local data to be set ローカルデータã®ä¿å­˜ã‚’許å¯ã™ã‚‹ Keep local data only until quit application アプリケーションãŒçµ‚了ã™ã‚‹ã¾ã§ãƒ­ãƒ¼ã‚«ãƒ«ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã™ã‚‹ Block sites from setting any data サイトã‹ã‚‰ã®ã‚らゆるデータ設定をブロックã™ã‚‹ Clear クリア Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash ã¯ãƒšãƒ¼ã‚¸å†…ã® Flash コンテンツã®è‡ªå‹•読ã¿è¾¼ã¿ã‚’ブロックã™ã‚‹ãƒ—ラグインã§ã™ã€‚Flash å†ç”Ÿã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã™ã‚‹ã¨å†ç”Ÿã—ã¾ã™ã€‚ Use Click to Flash Click to Flash を使用ã™ã‚‹ Add... 追加... Remove... 削除... Ask where to save each file before downloading ファイルをダウンロードã™ã‚‹ãŸã³ã«å•ã„åˆã‚ã›ã‚‹ Download location: ダウンロード場所: History 履歴 Click to Flash Click to Flash Downloads ダウンロード Automatically update the feeds on startup 起動時ã«ãƒ•ィードを更新ã™ã‚‹ Automatically update the feeds every ãƒ•ã‚£ãƒ¼ãƒ‰ã‚’å®šæœŸçš„ã«æ›´æ–°ã™ã‚‹ - æ›´æ–°é–“éš” seconds ç§’ hours 時間 Nothing to do 何もã—ãªã„ Dec Dec December December Display format for date: 日付ã®è¡¨ç¤ºå½¢å¼: time: 時刻: Alternating row background colors 行ã®èƒŒæ™¯è‰²ã‚’交互ã«å¤‰ãˆã‚‹ Simplified representation of date and time 日付を時刻を簡易表示ã«ã™ã‚‹ Show All ã™ã¹ã¦è¡¨ç¤º Show New æ–°ç€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’表示 Show Unread 未読を表示 Show Starred スター付ãを表示 Show Not Starred スターãªã—を表示 Show Unread or Starred 未読ã¾ãŸã¯ã‚¹ã‚¿ãƒ¼ä»˜ãを表示 Show Last Day 最新日分を表示 Show Last 7 Days 最新㮠7 日分を表示 Style sheet for news: ニュース用スタイルシート: Mark news as read: 既読ã«ã™ã‚‹ãƒ‹ãƒ¥ãƒ¼ã‚¹: on selecting. With timeout é¸æŠžæ™‚ - タイムアウト after switching to another news ä»–ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã¸ã®ç§»å‹•時 Mark displayed news as read when switching feeds 表示ã—ãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‹ã‚‰ä»–ã®ãƒ•ィードã¸ç§»å‹•ã—ãŸæ™‚ã«æ—¢èª­ã«ã™ã‚‹ Mark displayed news as read when closing tab 表示ã—ãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’タブを閉ã˜ãŸæ™‚ã«æ—¢èª­ã«ã™ã‚‹ Mark displayed news as read on minimize 表示ã—ãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’最å°åŒ–ã—ãŸæ™‚ã«æ—¢èª­ã«ã™ã‚‹ Change behavior of action 'Next Unread News' 'æ¬¡ã®æœªèª­ãƒ‹ãƒ¥ãƒ¼ã‚¹' ã®æŒ¯ã‚‹èˆžã„を変更ã™ã‚‹ starred news スター付ãニュース labeled news ラベル付ãニュース Automatically mark identical news as read åŒä¸€ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã¯è‡ªå‹•çš„ã«æ—¢èª­ã«ã™ã‚‹ Prevent accidental deletion of: 誤削除ã®é˜²æ­¢: Enable cleanup on shutdown アプリケーションã®çµ‚了時ã«ã‚¯ãƒªãƒ¼ãƒ³ã‚¢ãƒƒãƒ—を行ㆠMaximum age of news in days to keep: æœ€å¤§ãƒ‹ãƒ¥ãƒ¼ã‚¹ä¿æŒæ—¥æ•°: Maximum number of news to keep: æœ€å¤§ãƒ‹ãƒ¥ãƒ¼ã‚¹ä¿æŒä»¶æ•°: Delete read news 既読ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’削除ã™ã‚‹ Never delete unread news 未読ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã¯å‰Šé™¤ã—ãªã„ Never delete starred news スター付ãニュースã¯å‰Šé™¤ã—ãªã„ Never delete labeled news ラベル付ãニュースを削除ã—ãªã„ Clean up 'Deleted' '削除' ã«ãƒžãƒ¼ã‚¯ã•れãŸãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’クリアã™ã‚‹ Enable DB optimization (slower shutdown) DB ã®æœ€é©åŒ–を有効ã«ã™ã‚‹ (çµ‚äº†æ™‚ã«æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™) Reading 読ã¿è¾¼ã¿ Clean Up クリーンアップ New... æ–°è¦... Edit... 編集... Delete... 削除... Move up 上㸠Move down 下㸠Show when inactive main window Screen Transparency Show titles feeds Show icon feed Show button 'Mark All News Read' Show button 'Mark Read/Unread' Show button 'Open in External Browser' Show button 'Delete News' Play sound for incoming new news ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®æ–°ç€æ™‚ã«ã‚µã‚¦ãƒ³ãƒ‰ã‚’鳴ら㙠Play å†ç”Ÿ Display notification for incoming news ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®æ–°ç€æ™‚ã«é€šçŸ¥ã™ã‚‹ Top Left 左上 Top Right å³ä¸Š Bottom Left 左下 Bottom Right å³ä¸‹ Review プレビュー Position ä½ç½® Show maximum of 通知ページã”ã¨ã®æœ€å¤§è¡¨ç¤ºæ•° item on page notification アイテム Width list items リストã®ã‚¢ã‚¤ãƒ†ãƒ ã®å¹… pixels ピクセル Close notification after 通知を閉ã˜ã‚‹ã¾ã§ã®æ™‚é–“ Do not show notification in fullscreen mode 全画é¢ãƒ¢ãƒ¼ãƒ‰æ™‚ã«é€šçŸ¥ã—ãªã„ Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: é¸æŠžã—ãŸãƒ•ィードã®ã¿è¡¨ç¤ºã™ã‚‹: Notification Sound Selection of feeds All Feeds 全フィード Site サイト User ユーザー Password パスワード Delete 削除 Delete All ã™ã¹ã¦å‰Šé™¤ Show Passwords パスワードを表示 Version ãƒãƒ¼ã‚¸ãƒ§ãƒ³ Author 作者 Contact 連絡先 Choose language: 言語ã®é¸æŠž: Type タイプ Font フォント Feeds list font フィードリストã®ãƒ•ォント News list font ニュースリストã®ãƒ•ォント News title font ニュースタイトルã®ãƒ•ォント News text font ニューステキストã®ãƒ•ォント Notification font 通知ã®ãƒ•ォント Change... 変更... Reset リセット Feeds list color フィードリストã®è‰² Feeds list background フィードリストã®èƒŒæ™¯è‰² News list color ニュースリストã®è‰² News list background ニュースリストã®èƒŒæ™¯è‰² Focused news color フォーカスã®ã‚るニュースã®è‰² Focused news background color フォーカスã®ã‚るニュースã®èƒŒæ™¯è‰² Link color リンクã®è‰² Title color タイトルã®è‰² Date color 日付ã®è‰² Author color 作者ã®è‰² News text color ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®æ–‡å­—色 News title background ニュースタイトルã®èƒŒæ™¯è‰² News background ニュースã®èƒŒæ™¯è‰² Feed with new news æ–°ç€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®ã‚るフィード Count of unread news in feeds tree ãƒ•ã‚£ãƒ¼ãƒ‰ãƒ„ãƒªãƒ¼ã®æœªèª­ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹æ•° Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view ニュースビューã§ã®ç”»åƒã®è‡ªå‹•読ã¿è¾¼ã¿ Text color of new news æ–°ç€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®æ–‡å­—色 Show feeds tree toggle フィードツリーã®è¡¨ç¤º/éžè¡¨ç¤ºã®åˆ‡ã‚Šæ›¿ãˆ Clear new status when minimize to tray ãƒˆãƒ¬ã‚¤ã«æœ€å°åŒ–ã—ãŸã¨ãステータスをクリアã™ã‚‹ Set focus on the last opened news Set focus at the top of news list Set focus on the unread news Open the news Default news filter: デフォルトã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ãƒ•ィルター: Action on feed opening: Show news description instead of loading web page ウェブページを読ã¿è¾¼ã‚€ã®ã§ã¯ãªãニュースã®èª¬æ˜Žã‚’表示ã™ã‚‹ Text color of unread news æœªèª­ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®æ–‡å­—色 Focused feed color フォーカスã®ã‚るフィードã®è‰² Focused feed background color フォーカスã®ã‚るフィードã®èƒŒæ™¯è‰² Standard 標準 Fixed 固定幅 Serif セリフ体 Sans Serif サンセリフ体 Cursive 筆記体 Fantasy ファンタジー Default font size デフォルトフォントã®ã‚µã‚¤ã‚º Fixed font size 固定幅フォントã®ã‚µã‚¤ã‚º Minimum font size 最å°ãƒ•ォントサイズ Minimum logical font size è«–ç†ãƒ•ã‚©ãƒ³ãƒˆã®æœ€å¤§ã‚µã‚¤ã‚º Font families: フォントファミリ: Font sizes: フォントサイズ: Fonts フォント Fonts Browser フォントブラウザー Colors é…色 Filter フィルター Action アクション Description 説明 Shortcut ショートカット Shortcut: ショートカット: Open File... ファイルを開ã... Select Style Sheet File スタイルシートファイルã®é¸æŠž Open Directory... ディレクトリを開ã... Add site to whitelist サイトをホワイトリストã¸è¿½åŠ  Site without 'http://' (ex. youtube.com) サイトåã« 'http://' ã¯ä»˜ã‘ãªã„ã§ãã ã•ã„ (例: youtube.com) QAbstractSpinBox &Step up ステップアップ(&S) Step &down ステップダウン(&D) &Select All ã™ã¹ã¦é¸æŠž(&S) QDialogButtonBox Close é–‰ã˜ã‚‹ Cancel キャンセル &Yes ã¯ã„(&Y) &No ã„ã„ãˆ(&N) QFtp Not connected 接続ã—ã¦ã„ã¾ã›ã‚“ Host %1 not found ホスト %1 ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—㟠Connection refused to host %1 ホスト %1 ã¸ã®æŽ¥ç¶šãŒæ‹’å¦ã•れã¾ã—㟠Connection timed out to host %1 ホスト %1 ã¸ã®æŽ¥ç¶šãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—㟠Connected to host %1 ホスト %1 ã«æŽ¥ç¶šã—ã¾ã—㟠Connection refused for data connection データコãƒã‚¯ã‚·ãƒ§ãƒ³ã®æŽ¥ç¶šãŒæ‹’å¦ã•れã¾ã—㟠Unknown error 未知ã®ã‚¨ãƒ©ãƒ¼ã§ã™ Connecting to host failed: %1 ホストã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Login failed: %1 ログインã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Listing directory failed: %1 ディレクトリã®ãƒªã‚¹ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Changing directory failed: %1 ディレクトリã®å¤‰æ›´ã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Downloading file failed: %1 ファイルã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Uploading file failed: %1 ファイルã®ã‚¢ãƒƒãƒ—ロードã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Removing file failed: %1 ファイルã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Creating directory failed: %1 ディレクトリã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Removing directory failed: %1 ディレクトリã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸ: %1 Connection closed 接続を閉ã˜ã¾ã—㟠QLineEdit &Undo å…ƒã«æˆ»ã™(&U) &Redo やり直ã™(&R) Cu&t 切りå–り(&T) &Copy コピー(&C) &Paste 貼り付ã‘(&P) Delete 削除 Select All ã™ã¹ã¦é¸æŠž QMultiInputContext Select IM IM ã®é¸æŠž QObject Cannot start external program 外部プログラムを起動ã§ãã¾ã›ã‚“ Cannot start external program! %1 外部プログラムを起動ã§ãã¾ã›ã‚“! %1 Error エラー QTextControl &Undo å…ƒã«æˆ»ã™(&U) &Redo やり直ã™(&R) Cu&t 切りå–り(&T) &Copy コピー(&C) &Paste 貼り付ã‘(&P) Delete 削除 Select All ã™ã¹ã¦é¸æŠž Copy &Link Location リンクã®å ´æ‰€ã‚’コピー(&L) QWizard Cancel キャンセル < &Back < å‰(&B) &Finish 完了(&F) &Next > 次(&N) > RSSDetectionWidget Untitled feed 無題ã®ãƒ•ィード RequestFeed Server requires authentication! サーãƒãƒ¼ãŒèªè¨¼ã‚’è¦æ±‚ã—ã¦ã„ã¾ã™! Server replied: Not Found! サーãƒãƒ¼ã®å¿œç­”: 見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ! Redirect error! リダイレクトエラーã§ã™! Request timeout! リクエストタイムアウトã§ã™! SQLiteDriver Error opening database データベースã®ã‚ªãƒ¼ãƒ—ンã§ã‚¨ãƒ©ãƒ¼ã§ã™ Error closing database データベースã®ã‚¯ãƒ­ãƒ¼ã‚ºã§ã‚¨ãƒ©ãƒ¼ã§ã™ Unable to begin transaction トランザクションã®é–‹å§‹ãŒã§ãã¾ã›ã‚“ Unable to commit transaction トランザクションã®ã‚³ãƒŸãƒƒãƒˆãŒã§ãã¾ã›ã‚“ Unable to rollback transaction トランザクションã®ãƒ­ãƒ¼ãƒ«ãƒãƒƒã‚¯ãŒã§ãã¾ã›ã‚“ SQLiteResult Unable to fetch row 行ã®ãƒ•ェッãƒãŒã§ãã¾ã›ã‚“ No query クエリãŒã‚りã¾ã›ã‚“ Unable to execute statement SQL 文を実行ã§ãã¾ã›ã‚“ Unable to execute multiple statements at a time 複数㮠SQL æ–‡ã®åŒæ™‚実行ãŒã§ãã¾ã›ã‚“ Unable to reset statement SQL æ–‡ã®ãƒªã‚»ãƒƒãƒˆãŒã§ãã¾ã›ã‚“ Unable to bind parameters パラメーターã®ãƒã‚¤ãƒ³ãƒ‰ãŒã§ãã¾ã›ã‚“ Parameter count mismatch パラメーター数ãŒä¸€è‡´ã—ã¾ã›ã‚“ SslErrorDialog SSL Certificate Error! Only for this session UpdateAppDialog Check for Updates 最新状態をãƒã‚§ãƒƒã‚¯ Checking for updates... 最新状態をãƒã‚§ãƒƒã‚¯ã—ã¦ã„ã¾ã™... Loading history... 履歴を読ã¿è¾¼ã‚“ã§ã„ã¾ã™... Don't remind about this version ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã‚¹ãƒ«ãƒ¼ã™ã‚‹ &Install インストール(&I) You already have the latest version 最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ãŠä½¿ã„ã§ã™ A new version of QuiteRSS is available! æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® QuiteRSS ãŒã‚りã¾ã™! Click here to go to the download page ã“ã“をクリックã™ã‚‹ã¨ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ãƒšãƒ¼ã‚¸ã‚’é–‹ãã¾ã™ Your version is: ã‚ãªãŸã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: Current version is: 最新ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³: Error checking updates 更新情報ã®ãƒã‚§ãƒƒã‚¯ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—㟠quiterss-0.18.3/lang/quiterss_ko.ts000066400000000000000000005501141265173051100173320ustar00rootroot00000000000000 AboutDialog About QuiteRSS ì •ë³´ Revision 리비전 Version 버전 QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRss는 오픈소스로 í¬ë¡œìФ í”Œëž«í¼ RSS/Atom 뉴스 리ë”입니다 Includes: Includes: Application directory: 애플리케ì´ì…˜ í´ë”: Resource directory: 리소스 í´ë”: Data directory: ë°ì´í„° í´ë”: Backup directory: 백업 í´ë”: Database file: ë°ì´í„°ë² ì´ìФ 파ì¼: Settings file: 설정 파ì¼: Log file: 로그 파ì¼: Authors ì œìž‘ìž History ì´ë ¥ License 저작권 Information ì •ë³´ AdBlockAddSubscriptionDialog Add Subscription êµ¬ë… ì¶”ê°€ Title: 제목: Address: 주소: Add new subscription to AdBlock: 새 êµ¬ë… ê´‘ê³  차단 추가: AdBlockCustomList Custom Rules ì‚¬ìš©ìž ì •ì˜ ê·œì¹™ AdBlockDialog AdBlock Configuration 광고차단 설정 Enable AdBlock 광고차단 사용 Search... 검색... Options 설정 AdBlock 광고차단 Use only essential part of EasyList (for performance reasons) EasyList는 ê¼­ 필요한 경우만 사용하세요(성능ìƒì˜ 문제) Add Rule 규칙 추가 Remove Rule 규칙 ì‚­ì œ Add Subscription êµ¬ë… ì¶”ê°€ Remove Subscription êµ¬ë… ì‚­ì œ Update Subscriptions êµ¬ë… ì—…ë°ì´íЏ Learn about writing rules... 규칙작성 설명... AdBlockIcon AdBlock lets you block unwanted content on web pages ê´‘ê³ ì°¨ë‹¨ì„ ì‚¬ìš©í•˜ë©´ 웹페ì´ì§€ì˜ 불필요한 컨í…츠를 차단할수 있습니다. AdBlock 광고차단 Show AdBlock &Settings 광고차단 설정보기 (&S) Disable on %1 %1 사용안함 Disable only on this page ì´ íŽ˜ì´ì§€ë§Œ 사용안함 Blocked Popup Windows íŒì—… 윈ë„ìš° 차단 %1 with (%2) %1 를 가진 (%2) No content blocked ì°¨ë‹¨ëœ ì»¨í…츠 ì—†ìŒ Blocked URL (AdBlock Rule) - click to edit rule 차단 ëœ URL (광고차단 규칙) - ê·œì¹™ì„ íŽ¸ì§‘í•©ë‹ˆë‹¤ AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! 구ë…ì„ ë¶ˆëŸ¬ì˜¬ìˆ˜ 없습니다! AdBlockTreeWidget Add Rule 규칙 추가 Remove Rule 규칙 ì‚­ì œ Add Custom Rule ì‚¬ìš©ìž ê·œì¹™ 추가 Please write your rule here: ì‚¬ìš©ìž ê·œì¹™ 작성: %1 (recently updated) %1 (최근 ì—…ë°ì´íЏ) %1 (Error: %2) %1 (ì—러:%2) AddFeedWizard Add Feed 피드 추가 Create New Feed 새 피드 만들기 Use title of the feed as displayed name 피드 ì œëª©ì„ í‘œì‹œ ì´ë¦„으로 사용합니다 Server requires authentication: 서버 ì¸ì¦ì´ í•„ìš”: Username: 사용ìžëª…: Password: 비밀번호: Feed URL or website address: 피드 주소 ë° ì›¹ì‚¬ì´íЏ 주소: Feeds 피드 All Feeds 모든 피드 New Folder... 새 í´ë”... Displayed name: 표시 ì´ë¦„ : Location: 위치: URL error! 주소 오류입니다! Duplicate feed! 피드 주소가 중복입니다! Can't find feed URL! 피드 주소를 ì°¾ì„수 없습니다! Request failed! 요청 실패! AddFolderDialog Add Folder í´ë” 추가 Feeds 피드 All Feeds 모든 피드 Name: ì´ë¦„: Location: 위치: AuthenticationDialog Save password 비밀번호 저장 Authorization required ì¸ì¦ì´ 요청ë˜ì—ˆìŠµë‹ˆë‹¤ Server: 서버: Message: 메세지: Username: 사용ìžëª…: Password: 비밀번호: CategoriesTreeWidget Unread ì½ì§€ ì•ŠìŒ Starred 별표가 있는 Deleted ì‚­ì œ Labels ë¼ë²¨ Open in New Tab 새 탭으로 열기 Clear 'Deleted' ì‚­ì œëœ í•­ëª© 정리 Mark Read ì½ìŒìœ¼ë¡œ 표시 CleanUpWizard Clean Up 뉴스 정리 Choose Feeds 피드 ì„ íƒ All Feeds 모든 피드 Clean Up Options 옵션 초기화 Maximum age of news in days to keep: 최대 뉴스 보유 기간: Maximum number of news to keep: 최대 뉴스 보유 건수: Delete read news ì½ì€ 뉴스를 ì‚­ì œ Never delete unread news ì½ì§€ ì•Šì€ ë‰´ìŠ¤ë¥¼ 삭제하시 않는다 Never delete starred news 별표 뉴스를 삭제하시 않는다 Never delete labeled news ë¼ë²¨ 뉴스는 삭제하지 않는다 Clean up 'Deleted' 삭제항목 정리 Purge DB DB 제거 Totally remove records that had marked 'deleted' from DB. Ancient news could reappear ë°ì´í„°ë² ì´ìФì—서 ì‚­ì œ í‘œì‹œëœ í•­ëª©ì„ ì œê±°í•©ë‹ˆë‹¤. ì´ì „ í•­ëª©ì´ í‘œì‹œë ìˆ˜ 있습니다. Information ì •ë³´ Clean Up wizard deleted %1 news 정리 마법사가 %1 ì˜ ë‰´ìŠ¤ë¥¼ 삭제했습니다. ClickToFlash Object blocked by ClickToFlash ClickToFlashì—서 차단 ëœ ê°œì²´ Hide object 개체 숨기기 Add '%1' to whitelist '%1'ì„ í—ˆìš©ëª©ë¡ì— 추가 CustomizeToolbarDialog Customize Main Toolbar ë„구 ëª¨ìŒ ìˆ˜ì • Customize Feeds Toolbar 피드 ë„êµ¬ëª¨ìŒ ìˆ˜ì • Customize News Toolbar 뉴스 ë„êµ¬ëª¨ìŒ ìˆ˜ì • Load images ì´ë¯¸ì§€ 표시 Separator 구분선 Icon ì•„ì´ì½˜ Text ê¸€ìž Text Beside Icon ì•„ì´ì½˜ ì˜†ì— ê¸€ìž Text Under Icon ì•„ì´ì½˜ ë°‘ì— ê¸€ìž Big í¬ê²Œ Normal 보통 Small 작게 Style: ë³´ì´ê¸°: Icon Size: ì•„ì´ì½˜ í¬ê¸°: Add 추가 Remove ì‚­ì œ Move up 위로 ì´ë™ Move down 아래로 ì´ë™ Default 기본값 DownloadItem Remaining time unavailable ë‚¨ì€ ì‹œê°„ Error: Cannot write to file! 오류 : 파ì¼ì„ 쓸 수 없습니다! Error: 오류 : few seconds 몇 ì´ˆ seconds ì´ˆ minutes ë¶„ hours 시 Unknown size í¬ê¸°ë¥¼ ì•Œìˆ˜ì—†ìŒ Unknown speed ì†ë„를 ì•Œìˆ˜ì—†ìŒ %2 - unknown size (%3) %2 - í¬ê¸°ë¥¼ ì•Œìˆ˜ì—†ìŒ (%3) Remaining %1 - %2 of %3 (%4) ë‚¨ìŒ %1 - %2/%3 (%4) Cancelled - %1 ì·¨ì†Œë¨ - %1 Delete file íŒŒì¼ ì‚­ì œ Do you want to also delete downloaded file? 다운로드 한 파ì¼ì„ 삭제하시겠습니까? Open File íŒŒì¼ ì—´ê¸° Open Folder í´ë” 열기 Copy Download Link 다운로드 ë§í¬ 복사 Cancel Downloading 다운로드 취소 Remove ì‚­ì œ Cancelled ì·¨ì†Œë¨ Error 오류 Not found ì°¾ì„수 ì—†ìŒ Sorry, the file %1 was not found! 죄송합니다 아래 파ì¼ì„ %1 ì°¾ì„수 없습니다! DownloadManager Clear 정리 File %1 (*.%2) íŒŒì¼ %1 (*.%2) All Files (*.*) 모든 íŒŒì¼ (*.*) Save As... 다른 ì´ë¦„으로 저장... Executable: 실행: Arguments: ì¸ìˆ˜: FeedPropertiesDialog Properties ì†ì„± General ì¼ë°˜ Columns 피드 ì—´ Authentication ì¸ì¦ Status ìƒíƒœ Title: 제목: Homepage: 홈페ì´ì§€: Feed URL: 피드 주소: Load Title 제목 불러오기 Load Favicon 파비콘 불러오기 Select Icon... ì•„ì´ì½˜ ì„ íƒ... Select Icon ì•„ì´ì½˜ ì„ íƒ Disable update ì—…ë°ì´íЏ 비활성화 Automatically update every ìžë™ìœ¼ë¡œ ì—…ë°ì´íЏ seconds ì´ˆ minutes ë¶„ hours 시 Starred 별표 추가 Load images ì´ë¯¸ì§€ 표시 Display in new tab on startup 시작시 새탭으로 표시 Show news' description instead of loading web page 웹페ì´ì§€ë¥¼ 불러오지 않고 뉴스 ì„¤ëª…ì„ í‘œì‹œ Automatically delete duplicate news 중복 뉴스 ìžë™ ì‚­ì œ Display ë””ìŠ¤í”Œë ˆì´ Reading ì½ê³  ìžˆìŒ Enable JavaScript JavaScript 사용 Right-to-left layout RTL ë ˆì´ì•„웃 Ascending 오름차순 Descending 내림차순 Sort by: ì •ë ¬ : Add 추가 Remove ì‚­ì œ Move up 위로 ì´ë™ Move down 아래로 ì´ë™ Default 기본값 Server requires authentication: 서버 ì¸ì¦ì´ í•„ìš”: Username: 사용ìžëª…: Password: 비밀번호: Feeds count: 피드 수: Description: 설명: Status: ìƒíƒœ: Created: 작성: Last update: 최종갱신: News count: 뉴스 건수: Good Good Long ago ;-) 예전 ;-) new 새 피드 unread ì½ì§€ ì•ŠìŒ Image files ì´ë¯¸ì§€ íŒŒì¼ Select Image ì´ë¯¸ì§€ ì„ íƒ Load icon: can't open a file! ì•„ì´ì½˜ 불러오기: 파ì¼ì„ 열수 없습니다! FilterRulesDialog Filter Rules í•„í„° 규칙 Feeds 피드 All Feeds 모든 피드 Filter name: í•„í„° ì´ë¦„: Match all news 모든 뉴스 Match all conditions 모든 ì¡°ê±´ê³¼ ì¼ì¹˜ Match any condition 조건중 ì¼ì¹˜ Perform these actions: 아래 ìž‘ì—…ì„ ì‹¤í–‰: Please enter name for the filter. í•„í„° ì´ë¦„ì„ ìž…ë ¥í•´ì£¼ì„¸ìš”. Please enter search condition for the news filter. 뉴스 í•„í„°ì˜ ê²€ìƒ‰ ì¡°ê±´ì„ ìž…ë ¥í•´ì£¼ì„¸ìš”. FindFeed Find Name ì´ë¦„ 검색 Find Link ë§í¬ 검색 FindTextContent Find in News 뉴스ì—서 검색 Find in Titles 제목ì—서 검색 Find in Authors 제작ìžì—서 검색 Find in Categories 분류ì—서 검색 Find in Descriptions 설명ì—서 검색 Find in Links ë§í¬ì—서 검색 Find in Browser 브ë¼ìš°ì €ì—서 검색 FtpDownloader Canceled! 취소ë¨! ItemAction Mark News as Read ì½ì€ìƒíƒœë¡œ 표시 Add Star 별표 추가 Delete ì‚­ì œ Add Label ë¼ë²¨ 추가 Play a Sound 소리 ìž¬ìƒ Show News in Notifier 뉴스 알림 보기 Browse 브ë¼ìš°ì € Play ìž¬ìƒ Add Action 작업 추가 Delete Action 작업 ì‚­ì œ Open File... íŒŒì¼ ì—´ê¸°... ItemCondition Title 제목 Description 설명 Author ìž‘ì„±ìž Category 분류 State ìƒíƒœ Link ë§í¬ News 뉴스 New ì‹ ê·œ Read ì½ìŒ Starred 별표 추가 Add Condition ì¡°ê±´ì„ ì¶”ê°€ Delete Condition ì¡°ê±´ì„ ì‚­ì œ contains ë‹¤ìŒ ë‹¨ì–´ í¬í•¨ doesn't contains ë‹¤ìŒ ë‹¨ì–´ë¥¼ 미í¬í•¨ is ë‹¤ìŒ ë¬¸ìž¥ê³¼ ë™ì¼ isn't ë‹¤ìŒ ë¬¸ìž¥ê³¼ ê°™ì´ ì•ŠìŒ begins with ë‹¤ìŒ ë‹¨ì–´ë¡œ 시작 ends with ë‹¤ìŒ ë‹¨ì–´ë¡œ ë Regular expressions ì •ê·œ í‘œí˜„ì‹ LabelDialog New Label 새 ë¼ë²¨ Load icon... ì•„ì´ì½˜ 불러오기... Default 기본 Select color... 색 ì„ íƒ... Name: ì´ë¦„: Icon: ì•„ì´ì½˜: Color text: 글꼴 색: Color background: 배경색: Image files ì´ë¯¸ì§€ íŒŒì¼ Select Image ì´ë¯¸ì§€ ì„ íƒ Load icon: can't open a file! ì•„ì´ì½˜ 불러오기: 파ì¼ì„ 열수 없습니다! MainApplication Saving data... ë°ì´í„° 저장 중... MainWindow &AdBlock 광고차단(&A) Hide Categories 분류 숨기기 Show Categories 분류 ë³´ì´ê¸° Select OPML-File OPML íŒŒì¼ ì„ íƒ OPML-Files (*.%1 *.%2) OPML íŒŒì¼ (*.%1 *.%2) Import canceled 불러오기를 취소했습니다 Import: can't open a file 불러오기: 파ì¼ì„ 열수없습니다 OPML-Files (*.%1) OPML íŒŒì¼ (*.%1) Export canceled 내보내기 취소했습니다 Export: can't open a file 내보내기: 파ì¼ì„ 열수없습니다 Unread: %1 ì½ì§€ì•ŠìŒ: %1 All: %1 모ë‘: %1 (Browser) (브ë¼ìš°ì €) New News: %1 새로운 뉴스: %1 Unread News: %1 ì½ì§€ ì•Šì€ ë‰´ìŠ¤: %1 &Add 추가(&A) Add New Feed 새 피드를 추가 &Feed... 피드(&F)... F&older... í´ë”(&O)... Add New Folder 새 í´ë” 추가 Open in New Tab 새 탭으로 열기 &Delete... ì‚­ì œ(&D)... Delete Selected Feed ì„ íƒëœ 피드 ì‚­ì œ &Import Feeds... 피드 불러오기(&I)... Import Feeds from OPML File OPML 파ì¼ë¡œ 피드를 불러옵니다 &Export Feeds... 피드 내보내기(&E)... Export Feeds to OPML File 피드를 OPML 파ì¼ë¡œ 내보냅니다 E&xit 종료(&X) Update Feed 피드 갱신 Update Current Feed 현재 피드 갱신 Update All ëª¨ë‘ ê°±ì‹  Update All Feeds 모든 피드 갱신 Mark All Feeds Read 모든 피드 ì½ìŒ Mark Read/Unread ì½ìŒ/ì½ì§€ ì•ŠìŒ í‘œì‹œ Mark Current News Read/Unread í˜„ìž¬ì˜ ë‰´ìŠ¤ ì½ìŒ/ì½ì§€ ì•ŠìŒ Mark All News Read 모든 뉴스 ì½ìŒ Downloads 다운로드 Clean Up... 뉴스 정리... News Filters... 뉴스 í•„í„°... Filter News... 뉴스 í•„í„°... Options... 설정... Open Options Dialog 설정창 열기 Filter Feeds 피드 í•„í„° Show All ëª¨ë‘ ë³´ê¸° Show New 새 뉴스 보기 Show Unread ì½ì§€ ì•ŠìŒ ë³´ê¸° Show Starred Feeds 별표 피드 표시 Show Not Working Feeds ìž‘ë™í•˜ì§€ 않는 피드 보기 Filter News 뉴스 í•„í„° Show Starred 별표 표시 Show Not Starred 미별표 표시 Show Unread or Starred ì½ì§€ì•ŠìŒ/별표 표시 Show Last Day 최근 하루 표시 Show Last 7 Days 최근 ì¼ì£¼ì¼ 표시 About... QuiteRSS ì •ë³´... Show 'About' Dialog QuiteRSS ì •ë³´ì°½ 보기 Check for Updates... ì—…ë°ì´íЏ 확ì¸... Report a Problem... 문제를 ë³´ê³ ... Open News 뉴스 열기 Open in Browser 브ë¼ìš°ì €ë¥¼ 열기 Open in External Browser 외부 브ë¼ìš°ì €ë¡œ 열기 Open News in External Browser 뉴스 외부 브ë¼ìš°ì €ë¡œ 열기 Open News in New Tab 뉴스를 새탭으로 열기 Open in Background Tab íƒ­ì„ ë°±ê·¸ë¼ìš´ë¡œ 열기 Open News in Background Tab 백그ë¼ìš´ë“œ 탭으로 뉴스를 열기 Star 별표 Mark News Star 뉴스 별표 Delete ì‚­ì œ Delete Selected News ì„ íƒ ë‰´ìŠ¤ ì‚­ì œ Delete All News 모든 뉴스 ì‚­ì œ Delete All News from List ë¦¬ìŠ¤íŠ¸ì˜ ëª¨ë“  뉴스 ì‚­ì œ Restore ë³µì› Restore News 뉴스 ë³µì› Copy Link ë§í¬ 복사 Restore last deleted news 마지막 ì‚­ì œ 뉴스 복구 Mark Read ì½ìŒìœ¼ë¡œ 표시 Mark Feed Read 피드를 ì½ìŒ Properties ì†ì„± &File 파ì¼(&F) Count Unread News ì½ì§€ ì•Šì€ ë‰´ìŠ¤ Count All News 모든 뉴스 Last Update Last Update Reset browser zoom 화면 확대/축소 초기화 Print Web Page 웹 페ì´ì§€ ì¸ì‡„ Preview Web Page 웹페ì´ì§€ 미리보기 Save page in database 페ì´ì§€ë¥¼ ë°ì´í„°ë² ì´ìŠ¤ì— ì €ìž¥ Save page in database instead of news description 뉴스설명 대신 페ì´ì§€ë¥¼ ë°ì´í„°ë² ì´ìŠ¤ì— ì €ìž¥ Confirm Delete ì‚­ì œ í™•ì¸ Are you sure to delete selected elements? ë‹¹ì‹ ì´ ì„ íƒí•œ í•­ëª©ì„ ì‚­ì œ 하시겠습니까? Menu 메뉴 Add Feed... 피드 추가... &Create Backup... 백업 만들기..(&C) S&how Menu Bar 메뉴바 보기(&H) Stop Update Feeds 피드 ê°±ì‹ ì„ ì¤‘ë‹¨ Open News Description 뉴스 ì„¤ëª…ì„ ì—½ë‹ˆë‹¤ Copy News Link 뉴스ë§í¬ 복사 &View 보기(&V) Fee&ds 피드(&D) &News 뉴스(&N) &Browser 브ë¼ìš°ì €(&B) &Tools ë„구(&T) &Help ë„움ë§(&H) Main Toolbar ë©”ì¸ ë„구ìƒìž Customize Toolbar ë„구 ëª¨ìŒ ìˆ˜ì • Main Toolbar... ë©”ì¸ ë„구모ìŒ... Customize Toolbar... ë„구 ëª¨ìŒ ìˆ˜ì •... Feeds Toolbar... 피드 ë„구모ìŒ... News Toolbar... 뉴스 ë„구모ìŒ... Lock Toolbar ë„êµ¬ëª¨ìŒ ìž ê¸ˆ Hide Toolbar ë„êµ¬ëª¨ìŒ ìˆ¨ê¸°ê¸° Layout ë ˆì´ì•„웃 Classic í´ëž˜ì‹ Newspaper 신문 Application Style 애플리케ì´ì…˜ ìŠ¤íƒ€ì¼ System 시스템 System2 시스템2 Green 그린 Orange 오렌지 Purple í¼í”Œ Pink í•‘í¬ Gray ê·¸ë ˆì´ Browser Position 브ë¼ìš°ì € 위치 Top 위 Bottom 아래 Right 오른쪽 Left 왼쪽 Show Window 윈ë„ìš° 표시 Previous Feed ì´ì „ 피드 Next Feed ë‹¤ìŒ í”¼ë“œ Previous News ì´ì „ 뉴스 Next News ë‹¤ìŒ ë‰´ìŠ¤ News Page Up 뉴스페ì´ì§€ 위로 News Page Down 뉴스페ì´ì§€ 아래로 Next Unread News ì½ì§€ ì•Šì€ ë‹¤ìŒ ë‰´ìŠ¤ Previous Unread News ì½ì§€ ì•Šì€ ì´ì „ 뉴스 Switch Focus to Next Panel ë‹¤ìŒ í‘œì‹œì°½ìœ¼ë¡œ ì´ë™ Switch Focus to Next Panel (Tree Feeds, List News, Browser) ë‹¤ìŒ í‘œì‹œì°½ìœ¼ë¡œ ì´ë™ (피드목ë¡, 뉴스목ë¡, 브ë¼ìš°ì €) Switch Focus to Previous Panel ì´ì „ 표시창으로 ì´ë™ Switch Focus to Previous Panel (Tree Feeds, Browser, List News) ì´ì „ 표시창으로 ì´ë™ (피드목ë¡, 브ë¼ìš°ì €, 뉴스목ë¡) Show/Hide Tree Feeds 피드 ëª©ë¡ í‘œì‹œ/숨기기 Minimize to Tray 트레ì´ë¡œ 최소화 Minimize Application to Tray 애플리케ì´ì…˜ 트레ì´ë¡œ 최소화 Columns 피드 열표시 Show Indentation 들여쓰기 표시 Search Feed 피트 검색 Zoom 확대/축소 Zoom In 확대 Zoom in in browser 브ë¼ìš°ì € ì•ˆì„ í™•ëŒ€í•©ë‹ˆë‹¤ Zoom Out 축소 Zoom out in browser 브ë¼ìš°ì € ì•ˆì„ ì¶•ì†Œí•©ë‹ˆë‹¤ 100% 100% Print... ì¸ì‡„... Print Preview... ì¸ì‡„ 미리보기... Page up (Browser) 페ì´ì§€ 위로(브ë¼ìš°ì €) Page down (Browser) 페ì´ì§€ 아래로(브ë¼ìš°ì €) Save As... 다른 ì´ë¦„으로 저장... Save Page As... 다른 ì´ë¦„으로 페ì´ì§€ 저장... Show/Hide 보기/숨기기 Feeds Toolbar 피드 ë„êµ¬ëª¨ìŒ News Toolbar 뉴스 ë„êµ¬ëª¨ìŒ Browser Toolbar 브ë¼ìš°ì € ë„êµ¬ëª¨ìŒ Panel Categories 분류 표시창 Status Bar ìƒíƒœë°” Full Screen 전체화면 Stay On Top í•­ìƒ ìœ„ì— í‘œì‹œ Categories 분류 Label ë¼ë²¨ Show labels menu ë¼ë²¨ 메뉴 보기 Close Tab 탭 닫기 Close Other Tabs 다른 탭 ëª¨ë‘ ë‹«ê¸° Close All Tabs 모든 탭 닫기 Switch to next tab ë‹¤ìŒ íƒ­ìœ¼ë¡œ ì´ë™ Switch to previous tab ì´ì „ 탭으로 ì´ë™ Unread ì½ì§€ ì•ŠìŒ Starred 별표가 있는 Deleted ì‚­ì œ Labels ë¼ë²¨ Decrease news list/increase browser 뉴스목ë¡ì„ ì¢ê²Œ/브ë¼ìš°ì €ë¥¼ 넑게 Increase news list/decrease browser 뉴스목ë¡ì„ 넑게/브ë¼ìš°ì €ë¥¼ ì¢ê²Œ Find 검색 Open Homepage Feed 피드 홈페ì´ì§€ 열기 Sort by Name ì´ë¦„으로 ì •ë ¬ Collapse All Folders 모든 í´ë” 닫기 Expand All Folders 모든 í´ë” 확장 Next Folder ë‹¤ìŒ í´ë” Previous Folder ì´ì „ í´ë” Expand Folder í´ë” 확장 Setting Page: Labels 페ì´ì§€ 설정: ë¼ë²¨ Share 공유 Sort By ì •ë ¬ Ascending 오름차순 Descending 내림차순 Check for updates ì—…ë°ì´íЏ í™•ì¸ A new version of QuiteRSS... 새로운 ë²„ì „ì˜ QuiteRssê°€ 있습니다... Loading... 불러오는중... Web Page 웹페ì´ì§€ Save As 다른 ì´ë¦„으로 저장 HTML-Files (*.%1) HTML íŒŒì¼ (*.%1) Text files (*.%2) í…스트 íŒŒì¼ (*.%2) Save As: can't open a file 다른 ì´ë¦„으로 저장: 파ì¼ì„ 열수 없습니다 Choose Directory í´ë” ì„ íƒ Important 중요 Work 업무 Personal ê°œì¸ To Do í• ì¼ Later 다ìŒì— Amusingly 재미있는것 NetworkManager SSL Certificate Error! SSL ì¸ì¦ì„œ 오류! The "%1" server has the following errors in the SSL certificate: "%1" ì„œë²„ì˜ SSL ì¸ì¦ì„œì— 다ìŒê°€ ê°™ì€ ì˜¤ë¥˜ê°€ 있습니다: <b>Organization: </b> <b>ì¡°ì§:</b> <b>Domain Name: </b> <b>ë„ë©”ì¸ ë„¤ìž„: </b> <b>Expiration Date: </b> <b>만료 ë‚ ì§œ: </b> <b>Error: </b> <b>오류: </b> Would you like to make an exception for this certificate? ì´ ì¸ì¦ì„œì— 대해 예외를 설정하시겠습니까? NewsFiltersDialog News Filters 뉴스 í•„í„° Feeds 피드 Filter Name í•„í„° ì´ë¦„ New... 새 í•„í„°... Edit... 편집... Delete... ì‚­ì œ... Move up 위로 ì´ë™ Move down 아래로 ì´ë™ Run Filter í•„í„° 실행 Delete Filter í•„í„° ì‚­ì œ Are you sure you want to delete the filter '%1'? í•„í„° '%1'를 삭제하시겠습니까? NewsHeader Icon Feed ì•„ì´ì½˜ Title 제목 Published ë°œí–‰ì¼ Received ìˆ˜ì‹ ì¼ Author ìž‘ì„±ìž Category 분류 Read ì½ìŒ Star 별표 Label ë¼ë²¨ Feed Title 피드 타ì´í‹€ Link ë§í¬ NewsItem Mark Read/Unread ì½ìŒ/ì½ì§€ ì•ŠìŒ Delete News 뉴스 ì‚­ì œ NewsTabWidget Loading... (%p%) 불러오는중... (%p%) Home 홈 Open Page in External Browser 외부 브ë¼ìš°ì €ë¡œ 페ì´ì§€ 열기 Open Link in External Browser 외부 브ë¼ìš°ì €ë¡œ ë§í¬ 열기 Open Link ë§í¬ 열기 Open in New Tab 새 탭으로 열기 Save Link... ë§í¬ 저장... Save Image... ì´ë¯¸ì§€ 저장... Copy Link ë§í¬ 복사 Copy 복사 Go Back 뒤로 Go Forward 앞으로 Stop ì •ì§€ Reload 새로 불러오기 Copy Image ì´ë¯¸ì§€ 저장 Copy Image Address ì´ë¯¸ì§€ 주소 저장 Load Images ì´ë¯¸ì§€ 표시 Auto Load Images to News View 뉴스 보기ì—서 ì´ë¯¸ì§€ë¥¼ ìžë™ìœ¼ë¡œ 불러들입니다 No Load Images ì´ë¯¸ì§€ 표시안함 No Load Images to News View 뉴스 보기ì—서 ì´ë¯¸ì§€ 표시안함 Close Tab 탭 닫기 Auto Load Images in News View 뉴스보기ì—서 ì´ë¯¸ì§€ë¥¼ ìžë™ìœ¼ë¡œ 표시 Don't Load Images ì´ë¯¸ì§€ë¥¼ 표시하지 ì•ŠìŒ Don't Load Images in News View 뉴스 보기ì—서 ì´ë¯¸ì§€ë¥¼ 표시안함 Comments Comments Author: %1 작성ìž: %1 audio 오디오 video 비디오 media 미디어 Link to ë§í¬ Mark Read/Unread ì½ìŒ/ì½ì§€ ì•ŠìŒ í‘œì‹œ Mark News Star 뉴스 별표 Label ë¼ë²¨ Share 공유 Open News in External Browser Open News in External Browser Delete ì‚­ì œ NotificationWidget Close 닫기 Mark All News Read 모든 뉴스 ì½ìŒ Previous Page ì´ì „ 페ì´ì§€ Next Page ë‹¤ìŒ íŽ˜ì´ì§€ Incoming News: %1 수신뉴스 : %1 Page %1 of %2 페ì´ì§€ %1 / %2 OptionsDialog Options 설정 General ì¼ë°˜ System Tray 시스템 íŠ¸ë ˆì´ Network Connections ë„¤íŠ¸ì›Œí¬ ì—°ê²° Browser 브ë¼ìš°ì € Feeds 피드 Labels ë¼ë²¨ Notifications 알림 Passwords 비밀번호 Language 언어 Fonts & Colors 글꼴 & 글색 Keyboard Shortcuts 키보드 단축키 Warning: key is already assigned to 경고 : 키가 ì´ë¯¸ ë‹¤ìŒ ê¸°ëŠ¥ì— í™œë‹¹ë˜ì–´ 있습니다 Show splash screen on startup 시작시 스프래쉬 스í¬ë¦° 표시 Reopen last opened feeds on startup 시작시 ë§ˆì§€ë§‰ì— ì—´ë ¸ë˜ í”¼ë“œ 열기 Open new tab next to active 새 탭으로 ì—´ê³  활성화 Hide feeds tree when opening tabs 탭으로 표시시 í”¼ë“œëª©ë¡ í‘œì‹œ 하지 ì•ŠìŒ Show default rss-icon instead of favourite one 피드 ëª©ë¡ ì•„ì´ì½˜ì„ 기본 RSSì•„ì´ì½˜ìœ¼ë¡œ 표시 Automatically collapse folders ìžë™ìœ¼ë¡œ í´ë” 접기 Show close button on tab 닫기 ë²„íŠ¼ì„ íƒ­ì— í‘œì‹œ Automatically check for updates ìžë™ ì—…ë°ì´íЏ 검사 Help improve QuiteRSS by sending usage information 사용 정보를 전송하여 QuiteRSSì„ ê°œì„ ì— ë„ì›€ì„ ì¤ë‹ˆë‹¤. Store a DB in memory (requires program restart) DB를 ë©”ëª¨ë¦¬ì— ë¶ˆëŸ¬ì˜´ (프로그램 재시작 í•„ìš”) Save DB stored in memory to file every 메모리를 ì¼ì •시간 마다 DB로 저장 minutes ë¶„ Run QuiteRSS at Windows startup 윈ë„ìš° 시작시 QuiteRss 실행 Show system tray icon 시스템 ì•„ì´ì½˜ 표시 starting QuiteRSS QuiteRss 시작시 minimizing QuiteRSS QuiteRss 최소화시 closing QuiteRSS QuiteRss ë‹«ì„때 Show static icon 기본 ì•„ì´ì½˜ 표시 Change icon for incoming new news 새 뉴스 수신시 ì•„ì´ì½˜ 변경 Show count of new news 새 뉴스 건수 표시 Show count of unread news ì½ì§€ ì•Šì€ ë‰´ìŠ¤ 건수를 표시 Single click instead of double click for show window í´ë¦­ê³¼ ë”블í´ë¦­ìœ¼ë¡œ 윈ë„ìš° ë³´ì´ê¸° Empty working set on minimize to tray 트레ì´ë¡œ 최소화시 작업집합 비우기 Move to the system tray when: 시스템 트레ì´ë¡œ 최소화: Tray icon behavior: íŠ¸ë ˆì´ ì•„ì´ì½˜ ë™ìž‘: Direct connection to the Internet ì¸í„°ë„·ì— ì§ì ‘ ì—°ê²° System proxy configuration (if available) 시스템 프ë¡ì‹œ 설정 (가능한 경우) Manual proxy configuration: 수ë™ìœ¼ë¡œ 프ë¡ì‹œ 설정: Proxy server: 프ë¡ì‹œ 서버: Port: í¬íЏ: Username: 사용ìžëª…: Password: 비밀번호: Request timeout: 대기시간 : Number of requests: 요청 수 : Number of retries: ìž¬ì‹œë„ ìˆ˜: Options network requests when updating feeds (requires program restart): 옵션 ë„¤íŠ¸ì›Œí¬ ìš”ì²­ 피드를 ì—…ë°ì´íЏ (프로그램 재시작 í•„ìš”) : Use embedded browser 내장 브ë¼ìš°ì € 사용 Use external browser 외부 브ë¼ìš°ì € 사용 Default external browser 기본 외부 브ë¼ìš°ì € Following external browser: 외부 브ë¼ìš°ì € ì„ íƒ: Browse... 브ë¼ìš°ì €... Load images ì´ë¯¸ì§€ 표시 Enable JavaScript javaScript 사용 Enable plug-ins í”ŒëŸ¬ê·¸ì¸ ì‚¬ìš© Open links in embedded browser in background ë§í¬ë¥¼ 내장브ë¼ìš°ì € 백그ë¼ìš´ë“œë¡œ 열기 Open links in external browser in background (experimental) ë§í¬ë¥¼ 외부 브ë¼ìš°ì € 백그ë¼ìš´ë“œë¡œ 열기 (실험기능) Default zoom on pages: 기본 페ì´ì§€ 확대 : Browser selection: 브ë¼ìš°ì € ì„ íƒ: External browser: 외부 브ë¼ìš°ì €: Content: 콘í…츠: User style sheet: ì‚¬ìš©ìž ìŠ¤íƒ€ì¼ ì‹œíŠ¸ : Maximum pages in cache 최대 ìºì‰¬ 페ì´ì§€ 수 Store cache in: ìºì‰¬ ëŒ€ìƒ : Maximum size of disk cache ë””ìŠ¤í¬ ìºì‰¬ 최대 용량 MB MB Use disk cache ë””ìŠ¤í¬ ìºì‰¬ 사용 Allow local data to be set 로컬ë°ì´í„° 설정 허용 Keep local data only until quit application ì‘용프로그램 종료전까지 로컬ë°ì´í„° 유지 Block sites from setting any data ë°ì´í„° 차단사ì´íЏ 설정 Clear 정리 Cookies: 쿠키: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash는 페ì´ì§€ì˜ 플래쉬 컨í…츠 ìžë™ ë¡œë”©ì„ ì°¨ë‹¨í•˜ëŠ” 플러그ì¸ìž…니다. 플래쉬 ìž¬ìƒ ì•„ì´ì½˜ì„ í´ë¦­í•˜ë©´ 재ìƒí•©ë‹ˆë‹¤. Use Click to Flash Click To Flash 사용 Add... 추가... Remove... ì‚­ì œ... Ask where to save each file before downloading 다운로드시 저장위치 묻기 Download location: 다운로드 경로 : History ì´ë ¥ Click to Flash Click to Flash Downloads 다운로드 Automatically update the feeds on startup 시작시 뉴스피드를 갱신 Automatically update the feeds every ìžë™ìœ¼ë¡œ 뉴스피드를 갱신함 - 갱신간격 seconds ì´ˆ hours 시 Nothing to do 뉴스를 ì—´ì§€ ì•ŠìŒ Dec Dec December December Display format for date: ë‚ ì§œ 표시 형ì‹: time: 시간: Alternating row background colors í–‰ ë°°ê²½ìƒ‰ìƒ ë²ˆê°ˆì•„ê°€ë©° 사용 Simplified representation of date and time 시간/날짜를 간소화 표시 Show All ëª¨ë‘ ë³´ê¸° Show New 새 뉴스 보기 Show Unread ì½ì§€ ì•ŠìŒ ë³´ê¸° Show Starred 별표 보기 Show Not Starred 미별표 보기 Show Unread or Starred ì½ì§€ì•ŠìŒ/별표 표시 Show Last Day 최근 하루 표시 Show Last 7 Days 최근 ì¼ì£¼ì¼ 표시 Style sheet for news: ë‰´ìŠ¤ì— ëŒ€í•œ ìŠ¤íƒ€ì¼ ì‹œíŠ¸: Mark news as read: 뉴스 ì½ìŒ 표시 : on selecting. With timeout ì„ íƒì‹œ - 타임아웃 after switching to another news 다른 뉴스로 ì´ë™ì‹œ Mark displayed news as read when switching feeds 목ë¡ì— í‘œì‹œëœ ë‰´ìŠ¤ë¥¼ 피드ì´ë™ì‹œ ëª¨ë‘ ì½ìŒìœ¼ë¡œ 표시 Mark displayed news as read when closing tab 목ë¡ì— í‘œì‹œëœ ë‰´ìŠ¤ë¥¼ íƒ­ì„ ë‹«ì•˜ì„때 ëª¨ë‘ ì½ìŒìœ¼ë¡œ 표시 Mark displayed news as read on minimize 목ë¡ì— í‘œì‹œëœ ë‰´ìŠ¤ë¥¼ 최소화시 ëª¨ë‘ ì½ìŒìœ¼ë¡œ 표시 Change behavior of action 'Next Unread News' ì½ì§€ì•ŠìŒ ë‹¤ìŒ ë‰´ìŠ¤ì˜ í–‰ë™ì„ 변경 starred news 별표 뉴스들 labeled news ë¼ë²¨ 뉴스들 Automatically mark identical news as read ë™ì¼ 뉴스 ìžë™ìœ¼ë¡œ ì½ìŒìœ¼ë¡œ 표시 Prevent accidental deletion of: 실수로 ì‚­ì œë˜ëŠ”ê²ƒì„ ë°©ì§€ : Enable cleanup on shutdown 정리 후 종료 Maximum age of news in days to keep: 최대 뉴스 보유 기간: Maximum number of news to keep: 최대 뉴스 보유 건수: Delete read news ì½ì€ 뉴스를 ì‚­ì œ Never delete unread news ì½ì§€ ì•Šì€ ë‰´ìŠ¤ë¥¼ 삭제하시 않는다 Never delete starred news 별표 뉴스를 삭제하시 않는다 Never delete labeled news ë¼ë²¨ 뉴스는 삭제하지 않는다 Clean up 'Deleted' 삭제항목 정리 Enable DB optimization (slower shutdown) ë°ì´í„° 최ì í™” 사용 (종료시 ëŠë¦¼) Reading ì½ìŒ 설정 Clean Up 뉴스 정리 New... ì‹ ê·œ... Edit... 편집... Delete... ì‚­ì œ... Move up 위로 ì´ë™ Move down 아래로 ì´ë™ Show when inactive main window 비활성 ë©”ì¸ì°½ 보기 Screen 스í¬ë¦° Transparency íˆ¬ëª…ë„ Show titles feeds 피드 제목들 보기 Show icon feed 피드 ì•„ì´ì½˜ 보기 Show button 'Mark All News Read' "모든 뉴스 ì½ìŒ 표시" 버튼 표시 Show button 'Mark Read/Unread' "ì½ìŒ/ì½ì§€ ì•ŠìŒ í‘œì‹œ" 버튼 보기 Show button 'Open in External Browser' "외부 브ë¼ìš°ì €ë¡œ 열기" 버튼 표시 Show button 'Delete News' "뉴스 ì‚­ì œ" 버튼 표시 Play sound for incoming new news 새 뉴스 수신시 소리 알림 Play ìž¬ìƒ Display notification for incoming news 뉴스 수신시 알람표시 Top Left 외쪽 ìƒë‹¨ Top Right 오른쪽 ìƒë‹¨ Bottom Left 왼쪽 하단 Bottom Right 오른쪽 하단 Review 리뷰 Position 위치 Show maximum of 알람 1페ì´ì§€ 마다 item on page notification í•­ëª©ì— íŽ˜ì´ì§€ 알람 Width list items ëª©ë¡ í•­ëª© ë„“ì´ pixels 픽셀 Close notification after ë‹¤ìŒ ì‹œê°„í›„ 알림 닫기 Do not show notification in fullscreen mode 전체화면 모드ì—서 알림 ë³´ì§€ ì•ŠìŒ Display ë””ìŠ¤í”Œë ˆì´ Action mouse on news opening: 뉴스를 열때 마우스 ë™ìž‘: Single Click: í´ë¦­: Double Click: ë”블 í´ë¦­: Middle Click: 휠 í´ë¦­: Only show selected feeds: ì„ íƒëœ 피드만 표시: Notification 알림 Sound 소리 Selection of feeds 피드 ì„ íƒ All Feeds 모든 피드 Site 사ì´íЏ User ì‚¬ìš©ìž Password 비밀번호 Delete ì‚­ì œ Delete All ëª¨ë‘ ì‚­ì œ Show Passwords 비밀번호 표시 Version 버전 Author ìž‘ì„±ìž Contact ì—°ë½ì²˜ Choose language: 언어 ì„ íƒ: Type 타입 Font í°íЏ Feeds list font í”¼ë“œëª©ë¡ í°íЏ News list font 뉴스 ëª©ë¡ í°íЏ News title font 뉴스 제목 글꼴 News text font 뉴스 ë‚´ìš© 글꼴 Notification font 알림 í°íЏ Change... 변경... Reset 초기화 Feeds list color 피드 ëª©ë¡ ìƒ‰ Feeds list background 피드 ëª©ë¡ ë°°ê²½ìƒ‰ News list color 뉴스 ëª©ë¡ ìƒ‰ News list background 뉴스 ëª©ë¡ ë°°ê²½ìƒ‰ Focused news color ì„ íƒ ë‰´ìŠ¤ 색 Focused news background color ì„ íƒ ë‰´ìŠ¤ 배경색 Link color ë§í¬ 색 Title color 제목 색 Date color ë‚ ì§œ 색 Author color ìž‘ì„±ìž ìƒ‰ News text color 뉴스 ë‚´ìš© 글ìžìƒ‰ News title background 뉴스 제목 배경색 News background 뉴스 배경색 Feed with new news 새 뉴스피드 Count of unread news in feeds tree 피드목ë¡ì— ì½ì§€ ì•Šì€ ë‰´ìŠ¤ 건수 표시 Disabled feed 피드 비활성화 Alternating row colors í–‰ 색ìƒì„ 번갈아가며 사용 Notification text color 알림 글ìžìƒ‰ Notification background color 알림 배경색 Auto load images in news view 뉴스 보기ì—서 ì´ë¯¸ì§€ë¥¼ ìžë™ìœ¼ë¡œ 표시 Text color of new news 새로운 뉴스 글ìžìƒ‰ Show feeds tree toggle 피드 ëª©ë¡ ë³´ê¸° 토글 Clear new status when minimize to tray 트레ì´ë¡œ 최소화시 ìƒíƒœë¥¼ í´ë¦¬ì–´ Set focus on the last opened news 마지막 ì—´ì—ˆë˜ ë‰´ìŠ¤ë¶€í„° 보기 Set focus at the top of news list 뉴스목ë¡ì— 맨위부터 보기 Set focus on the unread news ì½ì§€ì•Šì€ 뉴스부터 보기 Open the news 뉴스 열기 Default news filter: 기본 뉴스 í•„í„°: Action on feed opening: 피드 열때 í–‰ë™: Show news description instead of loading web page 웹페ì´ì§€ë¥¼ 불러오지 않고 뉴스 ì„¤ëª…ì„ í‘œì‹œ Text color of unread news ì½ì§€ì•Šì€ 뉴스 글ìžìƒ‰ Focused feed color 활성 피드 색 Focused feed background color 활성 피드 배경색 Standard Standard Fixed Fixed Serif Serif Sans Serif Sans Serif Cursive Cursive Fantasy Fantasy Default font size 기본 글꼴 í¬ê¸° Fixed font size 고정글꼴 í¬ê¸° Minimum font size 최소 글꼴 í¬ê¸° Minimum logical font size ë…¼ë¦¬ì  ìµœì†Œ 글꼴 í¬ê¸° Font families: í°íЏ 패밀리: Font sizes: í°íЏ í¬ê¸°: Fonts 글꼴 Fonts Browser 브ë¼ìš°ì € í°íЏ Colors 색깔 Filter í•„í„° Action 작업 Description 설명 Shortcut 바로가기 Shortcut: 바로가기: Open File... íŒŒì¼ ì—´ê¸°... Select Style Sheet File ìŠ¤íƒ€ì¼ ì‹œíŠ¸ íŒŒì¼ ì„ íƒ Open Directory... í´ë” 열기... Add site to whitelist í—ˆìš©ëª©ë¡ ì‚¬ì´íЏ 추가 Site without 'http://' (ex. youtube.com) 사ì´íЏ ì´ë¦„ì— 'http://'는 사용하지 마세요 (예 : youtube.com) QAbstractSpinBox &Step up ìŠ¤í… ì—…(&S) Step &down ìŠ¤í… ë‹¤ìš´(&D) &Select All ëª¨ë‘ ì„ íƒ(&S) QDialogButtonBox Close 닫기 Cancel 취소 &Yes 예(&Y) &No 아니요(&N) QFtp Not connected ì—°ê²°ì•ˆë¨ Host %1 not found 호스트 %1ì„ ì°¾ì„수 없습니다 Connection refused to host %1 호스트 ì—°ê²° ê±°ë¶€ %1 Connection timed out to host %1 호스트 타임아웃 %1 Connected to host %1 호스트 ì—°ê²° %1 Connection refused for data connection ë°ì´í„° ì—°ê²° ê±°ë¶€ Unknown error 알수없는 ì—러 Connecting to host failed: %1 호스트 ì—°ê²° 실패: %1 Login failed: %1 ë¡œê·¸ì¸ ì‹¤íŒ¨: %1 Listing directory failed: %1 í´ë” 불러오기 실패: %1 Changing directory failed: %1 디렉토리 변경 실패: %1 Downloading file failed: %1 íŒŒì¼ ë‹¤ìš´ë¡œë“œ 실패: %1 Uploading file failed: %1 íŒŒì¼ ì—…ë°ì´íЏ 실패: %1 Removing file failed: %1 파ì¼ì‚­ì œ 실패: %1 Creating directory failed: %1 í´ë” ìƒì„± 실패: %1 Removing directory failed: %1 í´ë” ì‚­ì œ 실패: %1 Connection closed ì—°ê²° ë‹«ìŒ QLineEdit &Undo 실행취소(&U) &Redo 다시실행(&R) Cu&t 잘ë¼ë‚´ê¸°(&T) &Copy 복사(&C) &Paste 붙여넣기(&P) Delete ì‚­ì œ Select All ëª¨ë‘ ì„ íƒ QMultiInputContext Select IM IM ì„ íƒ QObject Cannot start external program 외부 í”„ë¡œê·¸ëž¨ì„ ì‹œìž‘í• ìˆ˜ 없습니다 Cannot start external program! %1 외부 í”„ë¡œê·¸ëž¨ì„ ì‹œìž‘í• ìˆ˜ 없습니다! %1 Error 오류 QTextControl &Undo 실행취소(&U) &Redo 다시실행(&R) Cu&t 잘ë¼ë‚´ê¸°(&T) &Copy 복사(&C) &Paste 붙여넣기(&P) Delete ì‚­ì œ Select All ëª¨ë‘ ì„ íƒ Copy &Link Location ë§í¬ 위치 복사(&L) QWizard Cancel 취소 < &Back < ì´ì „ (&B) &Finish 완료(&F) &Next > 다ìŒ(&N) > RSSDetectionWidget Untitled feed 제목없는 피드 RequestFeed Server requires authentication! 서버ì—서 ì¸ì¦ì„ 요청하였습니다! Server replied: Not Found! 서버 ì‘답 ì—†ìŒ! Redirect error! 리디렉션 오류! Request timeout! 대기시간 초과! SQLiteDriver Error opening database ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 여는중 ì˜¤ë¥˜ë°œìƒ Error closing database ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 닫는중 ì˜¤ë¥˜ë°œìƒ Unable to begin transaction íŠ¸ëžœìž­ì…˜ì„ ì‹œìž‘í• ìˆ˜ 없습니다. Unable to commit transaction íŠ¸ëžœìž­ì…˜ì„ ì‹¤í–‰í• ìˆ˜ 없습니다. Unable to rollback transaction íŠ¸ëžœìž­ì…˜ì„ ë˜ëŒë¦¬ìˆ˜ 없습니다. SQLiteResult Unable to fetch row í–‰ì„ ë¶ˆëŸ¬ 올수 없습니다. No query 질ì˜ì–´ê°€ 없습니다 Unable to execute statement ìž‘ì—…ì„ ì‹¤í–‰í• ìˆ˜ 없습니다. Unable to execute multiple statements at a time í•œë²ˆì— ì—¬ëŸ¬ê°œ ìž‘ì—…ì„ ì‹¤í–‰ 할수 없습니다. Unable to reset statement ìž‘ì—…ì„ ìž¬ì„¤ì • 할수 없습니다. Unable to bind parameters 매개변수를 연결할수 없습니다. Parameter count mismatch ë§¤ê°œë³€ìˆ˜ì˜ ê°œìˆ˜ê°€ ì¼ì¹˜í•˜ì‹œì•Šìœ¼ SslErrorDialog SSL Certificate Error! SSL ì¸ì¦ì„œ 오류! Only for this session ì´ë²ˆ 세션만 UpdateAppDialog Check for Updates ì—…ë°ì´íЏ í™•ì¸ Checking for updates... ì—…ë°ì´íŠ¸ë¥¼ 확ì¸ì¤‘입니다... Loading history... ì´ë ¥ì„ 불러오고 있습니다... Don't remind about this version ì´ ë²„ì „ì€ ë¬´ì‹œ 합니다 &Install 설치(&I) You already have the latest version ì´ë¯¸ ìµœì‹ ë²„ì „ì„ ì‚¬ìš©ì¤‘ìž…ë‹ˆë‹¤ A new version of QuiteRSS is available! 새로운 ë²„ì „ì˜ QuiteRssê°€ 있습니다! Click here to go to the download page 여기를 í´ë¦­í•˜ì‹œë©´ 다운로드 페ì´ì§€ë¡œ ì´ë™í•©ë‹ˆë‹¤ Your version is: 현재버전 : Current version is: 최신버전: Error checking updates ì—…ë°ì´íЏ 확ì¸ì‹œ ì—러가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤ quiterss-0.18.3/lang/quiterss_lt.ts000066400000000000000000005522651265173051100173510ustar00rootroot00000000000000 AboutDialog About Apie Revision PeržiÅ«ra Version Versija QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS yra atviro kodo įvairiose OS naudojama RSS/Atom naujienų skaityklÄ— Includes: Naudojama: Application directory: Programos katalogas: Resource directory: IÅ¡teklių katalogas: Data directory: Duomenų katalogas: Backup directory: AtsarginÄ—s kopijos katalogas: Database file: Duomenų bazÄ—s failas: Settings file: Nuostatų failas: Log file: Žurnalo failas: Authors Autoriai History Istorija License Lincecija Information Informacija AdBlockAddSubscriptionDialog Add Subscription PridÄ—ti prenumeratÄ… Title: Pavadinimas: Address: Adresas: Add new subscription to AdBlock: PridÄ—ti naujÄ… AdBlock prenumeratÄ…: AdBlockCustomList Custom Rules PasirinktinÄ—s taisyklÄ—s AdBlockDialog AdBlock Configuration AdBlock konfigÅ«racija Enable AdBlock Ä®galinti AdBlock Search... IeÅ¡koti... Options Pasirinkimas AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Naudoti tik esminÄ™ EasyList dalį (naÅ¡umo tikslais) Add Rule PridÄ—ti taisyklÄ™ Remove Rule PaÅ¡alinti taisyklÄ™ Add Subscription PridÄ—ti prenumeratÄ… Remove Subscription PaÅ¡alinti prenumeratÄ… Update Subscriptions Atnaujinti prenumeratas Learn about writing rules... Sužinoti daugiau apie taisyklių raÅ¡ymÄ…... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock leidžia tinklalapiuose blokuoti nenorimÄ… matyti turinį AdBlock AdBlock Show AdBlock &Settings Rodyti AdBlock &nuostatas Disable on %1 IÅ¡jungti %1 Disable only on this page IÅ¡jungti tik Å¡iame puslapyje Blocked Popup Windows Užblokuoti iššokantys langai %1 with (%2) %1 su (%2) No content blocked NÄ—ra blokuoto turinio Blocked URL (AdBlock Rule) - click to edit rule Blokuojamas URL (AdBlock taisyklÄ—) - spustelÄ—kite, kad redaguoti taisyklÄ™ AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Nepavyko įkelti prenumeratos! AdBlockTreeWidget Add Rule PridÄ—ti taisyklÄ™ Remove Rule PaÅ¡alinti taisyklÄ™ Add Custom Rule PridÄ—ti pasirinktinÄ™ taisyklÄ™ Please write your rule here: PraÅ¡ome įraÅ¡yti savo taisyklÄ™ Äia: %1 (recently updated) %1 (neseniai atnaujinta) %1 (Error: %2) %1 (Klaida: %2) AddFeedWizard Add Feed PridÄ—ti Å¡altinį Create New Feed PridÄ—ti naujÄ… Å¡alitinį Use title of the feed as displayed name Naudoti Å¡altinio pavadinimÄ… Server requires authentication: Serveris reikalauja prisijungimo vardo: Username: Vartotojo vardas: Password: Slaptažodis: Feed URL or website address: Å altinio URL arba tinklalapio adresas: Feeds Å altiniai All Feeds Visi Å¡altiniai New Folder... Naujas aplankas... Displayed name: Rodomas pavadinimas: Location: Vieta: URL error! URL klaida! Duplicate feed! Pasikartojantis Å¡altinis! Can't find feed URL! Negaliu rasti Å¡altinio URL! Request failed! Užklausa nepavyko! AddFolderDialog Add Folder PridÄ—ti aplankÄ… Feeds Å altiniai All Feeds Visi Å¡altiniai Name: Vardas: Location: Vieta: AuthenticationDialog Save password IÅ¡saugoti slaptažodį Authorization required Privaloma autorizuotis Server: Serveris: Message: ŽinutÄ—: Username: Vartotojo vardas: Password: Slaptažodis: CategoriesTreeWidget Unread Neskaitytų Starred MÄ—gstamų Deleted IÅ¡trintų Labels EtiketÄ—s Open in New Tab Atidaryti naujÄ… aplankÄ… Clear 'Deleted' IÅ¡valyti "IÅ¡trinta" Mark Read PažymÄ—ti skaitytu CleanUpWizard Clean Up IÅ¡valyti Choose Feeds Pasirinkti Å¡altinius All Feeds Visi Å¡altiniai Clean Up Options IÅ¡valyti nustatymus Maximum age of news in days to keep: Maksimalus laikas kiek naujienos bus saugomos: Maximum number of news to keep: Maksimalus laikomų naujienų skaiÄius: Delete read news PaÅ¡alinti perskaitytas naujienas Never delete unread news Niekada nepaÅ¡alinti neperskaitytu naujienų Never delete starred news Niekada nepaÅ¡alinti mÄ—gstamų naujienų Never delete labeled news Niekada nepaÅ¡alinti pažymÄ—tų naujienų Clean up 'Deleted' IÅ¡valyti 'PaÅ¡alintas' Purge DB IÅ¡valyti DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear VisiÅ¡kai panaikinti įraÅ¡us su žyma "IÅ¡trinta" iÅ¡ DB. Gali pasirodyti senos naujienos Information Informacija Clean Up wizard deleted %1 news Valymo vedlys iÅ¡trynÄ— %1 naujienas ClickToFlash Object blocked by ClickToFlash Objektas blokuojamas ClickToFlash Hide object PaslÄ—pti objektÄ… Add '%1' to whitelist PridÄ—ti '%1' į BaltÄ… sÄ…rašą CustomizeToolbarDialog Customize Main Toolbar Redaguoti pagrindinÄ™ įrankių juostÄ… Customize Feeds Toolbar Redaguoti Å¡altinių įrankių juostÄ… Customize News Toolbar Redaguoti naujienų įrankių juostÄ… Load images Krauti paveikslÄ—lius Separator Skirtukas Icon Ikona Text Tekstas Text Beside Icon Tekstas Å¡alia ikonos Text Under Icon Tekstas po ikona Big Didelis Normal Normalus Small Mažas Style: Stilius: Icon Size: Ikonos dydis: Add PridÄ—ti Remove Nuimti Move up Perkelti aukÅ¡Äiau Move down Perkelti žemyn Default Numatytasis DownloadItem Remaining time unavailable LikÄ™s laikas nežinomas Error: Cannot write to file! Klaida: negaliu įraÅ¡yti bylos! Error: Klaida: few seconds kelios sekundÄ—s seconds sekundÄ—s minutes minutÄ—s hours valandos Unknown size Nežinomas dydis Unknown speed Nežinomas greitis %2 - unknown size (%3) %2 - nežinomas dydis (%3) Remaining %1 - %2 of %3 (%4) Liko %1 - %2 iÅ¡ %3 (%4) Cancelled - %1 AtÅ¡aukta - %1 Delete file IÅ¡trinti bylÄ… Do you want to also delete downloaded file? Ar norite taip pat iÅ¡trinti atsisiųstÄ… failÄ…? Open File Atidaryti bylÄ… Open Folder Atidaryti aplankÄ… Copy Download Link Kopijuoti siuntinio nuorodÄ… Cancel Downloading Nutraukti siuntimÄ… Remove PaÅ¡alinti Cancelled AtÅ¡aukta Error Klaida Not found Nerasta Sorry, the file %1 was not found! AtsipraÅ¡au, failas %1 nerastas! DownloadManager Clear IÅ¡valyti File %1 (*.%2) Byla %1 (*.%2) All Files (*.*) Visos bylos (*.*) Save As... IÅ¡saugoti kaip... Executable: Paleidimas: Arguments: Argumentai: FeedPropertiesDialog Properties SavybÄ—s General Pagrindinis Columns Stulpeliai Authentication Autorizacija Status PadÄ—tis Title: Pavadinimas: Homepage: Namų puslapis: Feed URL: Å altinio URL: Load Title Ä®kelti pavadinimÄ… Load Favicon Ä®kelti mÄ—gstamÄ… ikonÄ… Select Icon... Pasirinkti ikonÄ…... Select Icon Pasirinkti ikonÄ… Disable update IÅ¡jungti atnaujinimÄ… Automatically update every AutomatiÅ¡kai atnaujinti kiekvienÄ… seconds sekundÄ—s minutes minutÄ—s hours valandos Starred MÄ—gstamos Load images Krauti paveikslÄ—lius Display in new tab on startup Krovimo metu rodyti naujame aplanke Show news' description instead of loading web page Nekrauti viso puslapio, o rodyti tik naujienos aprašą Automatically delete duplicate news AutomatiÅ¡kai trinti pasikartojanÄias naujienas Display Rodyti Reading Enable JavaScript Ä®galinti JavaScript Right-to-left layout iÅ¡dÄ—stymas iÅ¡ deÅ¡inÄ—s į kairÄ™ Ascending DidÄ—jimo tvarka Descending Mažėjimo tvarka Sort by: Lygiuoti pagal: Add PridÄ—ti Remove PaÅ¡alinti Move up Perkelti aukÅ¡Äiau Move down Perkelti žemyn Default Numatytasis Server requires authentication: Serveris reikalauja prisijungimo: Username: Vartotojo vardas: Password: Slaptažodis: Feeds count: Kanalų skaiÄius Description: ApraÅ¡ymas: Status: Statusas: Created: Sukurtas: Last update: Paskutinis atnaujinimas: News count: Naujienų skaiÄius: Good Gerai Long ago ;-) Seniai, seniai ;-) new naujų unread neperskaitytų Image files PaveikslÄ—lių bylos Select Image Pasirinkti paveikslÄ—lį Load icon: can't open a file! Ä®kelti ikonÄ…: negaliu atidaryti bylos! FilterRulesDialog Filter Rules Filtruoti taisykles Feeds Å altiniai All Feeds Visi Å¡altiniai Filter name: Filtro pavadinimas: Match all news Taikoma visoms naujienoms Match all conditions Atitinka visas sÄ…lygas Match any condition Atitinka bet kuriÄ… salygÄ… Perform these actions: Atlikti Å¡iuos veiksmus: Please enter name for the filter. PraÅ¡au įvesti filtro pavadinimÄ…. Please enter search condition for the news filter. PraÅ¡au įvesti naujienų filtrų sÄ…lygÄ…. FindFeed Find Name Surasti pavadinimÄ… Find Link Surasti nuorodÄ… FindTextContent Find in News Surasti naujienose Find in Titles IeÅ¡koti pavadinimuose Find in Authors IeÅ¡koti tarp autorių Find in Categories IeÅ¡koti kategorijose Find in Descriptions Rasti apraÅ¡ymuose Find in Links Rasti nuorodose Find in Browser Surasti narÅ¡yklÄ—je FtpDownloader Canceled! AtÅ¡aukta! ItemAction Mark News as Read PažymÄ—ti kaip skaitytÄ… Add Star PažymÄ—ti kaip mÄ—gstamÄ… Delete IÅ¡trinti Add Label PridÄ—ti Å¡altinį Play a Sound Groti garsÄ… Show News in Notifier Rodyti naujienas praneÅ¡iklyje Browse NarÅ¡yti Play Groti Add Action PridÄ—ti veiksmÄ… Delete Action IÅ¡trinti veiksmÄ… Open File... Atidaryti bylÄ…... ItemCondition Title Pavadinimas Description ApraÅ¡ymas Author Autorius Category Kategorija State BÅ«sena Link Nuoroda News Naujienos New Naujas Read Skaityti Starred MÄ—gstamos Add Condition PridÄ—ti sÄ…lygÄ… Delete Condition IÅ¡trinti sÄ…lygÄ… contains sudaro doesn't contains nesudaro is yra isn't nÄ—ra begins with prasideda su ends with baigiasi Regular expressions ReguliarÅ«s iÅ¡sireiÅ¡kimai LabelDialog New Label Naujas Å¡altinis Load icon... Ä®kelti ikonÄ… Default Numatytasis Select color... Pasirinkti spalvÄ…... Name: Vardas: Icon: Ikona: Color text: Teksto spalva: Color background: Fono spalva: Image files PaveikslÄ—lių failai Select Image Pasirinkti paveikslÄ—lį Load icon: can't open a file! Pakrauti ikonÄ…: negaliu atidaryti bylos! MainApplication Saving data... Saugojami duomenys... MainWindow &AdBlock &AdBlock Hide Categories SlÄ—pti kategorijas Show Categories Rodyti kategorijas Select OPML-File Pasirinkti OMPL-bylÄ… OPML-Files (*.%1 *.%2) OPML-Rinkmena (*.%1 *.%2) Import canceled Importas atÅ¡auktas Import: can't open a file Importas: negaliu atidaryti bylos OPML-Files (*.%1) OPML-Rinkmena (*.%1) Export canceled Eksportas atÅ¡auktas Export: can't open a file Eksportas: negaliu atidaryti bylos Unread: %1 Neskaitytų: %1 All: %1 Viso: %1 (Browser) (NarÅ¡yklÄ—) New News: %1 Naujienos: %1 Unread News: %1 Neperskaitytos naujienos: %1 &Add &PridÄ—ti Add New Feed PridÄ—ti naujÄ… Å¡altinį &Feed... Å altinis... F&older... A&plankas... Add New Folder PridÄ—ti naujÄ… aplankÄ… Open in New Tab Atverti naujame skirtuke &Delete... &IÅ¡trinti... Delete Selected Feed IÅ¡trinti pasirinktÄ… Å¡altinį &Import Feeds... &Importuoti Å¡altinius... Import Feeds from OPML File Importuoti Å¡altinius iÅ¡ OPML bylos &Export Feeds... &Exportuoti Å¡altinius... Export Feeds to OPML File Eksportuoti Å¡altinius į OPML bylÄ… E&xit I&Å¡eiti Update Feed Atnaujinti Å¡altinį Update Current Feed Atnaujinti dabartinį Å¡altinį Update All Atnaujinti visus Update All Feeds Atnaujinti visus Å¡altinius Mark All Feeds Read PažymÄ—ti visus Å¡altinius skaitytais Mark Read/Unread PažymÄ—ti skaityta/neskaityta Mark Current News Read/Unread PažymÄ—ti dabartinį Å¡altinį skaitytu/neskaitytu Mark All News Read PažymÄ—ti visus Å¡altinius skaitytais Downloads Siuntiniai Clean Up... IÅ¡valyti... News Filters... Naujienų filtrai... Filter News... Filtruoti naujienas... Options... Parinktys... Open Options Dialog Atidaryti pasirinkimo langÄ… Filter Feeds Filtruoti Å¡altinius Show All Rodyti viskÄ… Show New Rodyti naujus Show Unread Rodyti neskaitytus Show Starred Feeds Atidaryti mÄ—giamus Å¡altinius Show Not Working Feeds Parodyti neaktyvius Å¡altinius Filter News Filtruoti naujienas Show Starred Rodyti mÄ—gstamas Show Not Starred Rodyti likusius Show Unread or Starred Rodyti neskaitytus arba mÄ—gstamus Show Last Day Rodyti paskutinÄ™ dienÄ… Show Last 7 Days Rodyti paskutines 7 dienas About... Apie... Show 'About' Dialog Rodyti 'Apie' langÄ… Check for Updates... Tinkrinti ar yra atnaujinimai... Report a Problem... PraneÅ¡ti apie problemÄ…... Open News Atverti naujienas Open in Browser Atidaryti narÅ¡yklÄ—je Open in External Browser Atidaryti iÅ¡orinÄ—je narÅ¡yklÄ—je Open News in External Browser Atidaryti naujienas iÅ¡orinÄ—je narÅ¡yklÄ—je Open News in New Tab Atidaryti naujienas kitame aplanke Open in Background Tab Atidaryti viduje aplanko Open News in Background Tab Atidaryti naujienas viduje aplanko Star MÄ—gstami Mark News Star PažymÄ—ti naujienÄ… mÄ—gstama Delete IÅ¡trinti Delete Selected News IÅ¡trinti pasirinktas naujienas Delete All News IÅ¡trinti visas naujienas Delete All News from List IÅ¡trinti visas naujienas iÅ¡ sÄ…raÅ¡o Restore Atstatyti Restore News Atstatyti naujienas Copy Link Kopijuoti nuorodÄ… Restore last deleted news Atkurti paskutines paÅ¡alintas naujienas Mark Read PažymÄ—ti skaitytu Mark Feed Read PažymÄ—ti Å¡altinį skaitytu Properties SavybÄ—s &File &Byla Count Unread News SkaiÄiuoti neskaitytas naujienas Count All News SkaiÄiuoti visas naujienas Last Update Paskutinis atnaujinimas Reset browser zoom AtÅ¡aukti priartinimÄ… narÅ¡yklÄ—je Print Web Page Spausdinti tinklapį Preview Web Page PeržiÅ«rÄ—ti tinklalapį Save page in database IÅ¡saugoti puslapį duomenų bazÄ—je Save page in database instead of news description IÅ¡saugoti puslapį duomenų bazÄ—je vietoj naujienų apraÅ¡ymo Confirm Delete Patvirtinti trynimÄ… Are you sure to delete selected elements? Ar tikrai norite iÅ¡trinti pažymÄ—tus elementus? Menu Meniu Add Feed... PridÄ—ti Å¡altinį... &Create Backup... &Sukurti atsarginÄ™ kopijÄ…... S&how Menu Bar R&odyti meniu juostÄ… Stop Update Feeds Baigti kanalų naujinimÄ… Open News Description Atidaryti naujienod apraÅ¡ymÄ… Copy News Link Kopijuoti naujienos nuorodÄ… &View &Rodinys Fee&ds Å altini&ai &News &Naujienos &Browser &NarÅ¡yklÄ— &Tools &Ä®rankiai &Help Pagalba Main Toolbar PagrindinÄ— Ä®rankių juosta Customize Toolbar Redaguoti Ä®rankių juostÄ… Main Toolbar... PagrindinÄ— įrankių juosta... Customize Toolbar... Redaguoti įrankių juostÄ…... Feeds Toolbar... Å altinių įrankių juosta... News Toolbar... Naujienų įrankių juosta... Lock Toolbar Užrakinti įrankių juostÄ… Hide Toolbar PaslÄ—pti Ä®rankių juostÄ… Layout IÅ¡dÄ—stymas Classic Klasikinis Newspaper LaikraÅ¡tinis Application Style Programos stilius System Sistema System2 Sistema2 Green Žalia Orange OranžinÄ— Purple VioletinÄ— Pink RožinÄ— Gray Pilka Browser Position NarÅ¡yklÄ—s vieta Top VirÅ¡us Bottom ApaÄia Right DeÅ¡inÄ— Left KairÄ— Show Window Rodyti langÄ… Previous Feed BuvÄ™s Å¡altinis Next Feed Kitas Å¡altinis Previous News Buvusi naujiena Next News Kita naujiena News Page Up Naujienos puslapiu aukÅ¡tyn News Page Down Naujienos puslapiu žemyn Next Unread News SekanÄios neskaitytos naujienos Previous Unread News AnkstesnÄ—s neskaitytos naujienos Switch Focus to Next Panel ŽiÅ«rÄ—ti kitÄ… skydelį Switch Focus to Next Panel (Tree Feeds, List News, Browser) ŽiÅ«rÄ—ti kitÄ… skydelį (Å altinių medis, Naujienų sÄ…raÅ¡as, NarÅ¡yklÄ—) Switch Focus to Previous Panel ŽiÅ«rÄ—ti kitÄ… skydelį Switch Focus to Previous Panel (Tree Feeds, Browser, List News) ŽiÅ«rÄ—ti buvusį skydelį (Å altinių medis, Naujienų sÄ…raÅ¡as, NarÅ¡yklÄ—) Show/Hide Tree Feeds Rodyti/SlÄ—pti Å¡altinių medį Minimize to Tray Mažinti į dÄ—klÄ… Minimize Application to Tray Mažinti programÄ… į dÄ—klÄ… Columns Stulpeliai Show Indentation Rodyti tarpÄ… Search Feed IeÅ¡koti Å¡altinio Zoom Priartinimas Zoom In Priartinti Zoom in in browser Priartinti narÅ¡kyklÄ—je Zoom Out Nutolinti Zoom out in browser Nutolinti narÅ¡yklÄ—je 100% 100% Print... Spausdinti... Print Preview... Spaudinio peržiÅ«ra Page up (Browser) Puslapiu aukÅ¡tyn (NarÅ¡yklÄ—je) Page down (Browser) Puslapiu žemyn (NarÅ¡yklÄ—je) Save As... IÅ¡saugoti kaip... Save Page As... IÅ¡saugoti puslapį kaip... Show/Hide Rodyti/SlÄ—pti Feeds Toolbar Å altinių įrankių juosta News Toolbar Naujienų Ä®rankių juosta Browser Toolbar NarÅ¡yklÄ—s Ä®rankių juosta Panel Categories Skydelio kategorijos Status Bar BÅ«senos juosta Full Screen Visas ekranas Stay On Top Ant kitų langų Categories Kategorijos Label EtiketÄ— Show labels menu Rodyti etikÄ—tÄ—s meniu Close Tab Uždaryti aplankÄ… Close Other Tabs Uždaryti kitus aplankus Close All Tabs Uždaryti visus aplankus Switch to next tab Pereiti į kitÄ… kortelÄ™ Switch to previous tab Pereiti prie buvusio aplanko Unread Neskaitytų Starred MÄ—gstami Deleted IÅ¡trinta Labels EtiketÄ—s Decrease news list/increase browser Sumažinti naujienų sÄ…rašą/padidinti narÅ¡yklÄ—s Increase news list/decrease browser Padidinti naujienų sÄ…rašą/sumažinti narÅ¡yklÄ—s Find IeÅ¡koti Open Homepage Feed Atidaryti pagrindinį Å¡altinio puslapį Sort by Name Rikiuoti pagal pavadinimÄ… Collapse All Folders Suskleisti visus aplankus Expand All Folders IÅ¡skleisti visus aplankus Next Folder Kitas aplankas Previous Folder BuvÄ™s aplankas Expand Folder IÅ¡skleisti aplankÄ… Setting Page: Labels Nustatymų puslapis: EtiketÄ—s Share Dalintis Sort By Lygiuoti pagal: Ascending DidÄ—jimo tvarka Descending Mažėjimo tvarka Check for updates Tikrinti ar yra atnaujinimų A new version of QuiteRSS... Nauja QuiteRSS versija... Loading... Kraunasi... Web Page Internetinis puslapis Save As Ä®raÅ¡yti kaip... HTML-Files (*.%1) HTML-Bylos (*.%1) Text files (*.%2) TekstinÄ—s bylos (*.%2) Save As: can't open a file IÅ¡saugoti kaip: negaliu atidaryti bylos Choose Directory Pasirinkite katalogÄ… Important Svarbus Work Darbas Personal Asmeniniai To Do Atlikti Later VÄ—liau Amusingly Ä®domiai NetworkManager SSL Certificate Error! SSL sertifikato klaida! The "%1" server has the following errors in the SSL certificate: "%1" serveris turi Å¡ias klaidas SSL sertifikate: <b>Organization: </b> <b>Organizacija: </b> <b>Domain Name: </b> <b>Domenas: </b> <b>Expiration Date: </b> <b>Galiojimo data: </b> <b>Error: </b> <b>Klaida: </b> Would you like to make an exception for this certificate? Ar norÄ—tumÄ—te padaryti iÅ¡imtį Å¡iam sertifikatui? NewsFiltersDialog News Filters Naujienų filtrai Feeds Å altiniai Filter Name Filtro pavadinimas New... Naujas... Edit... Redaguoti... Delete... IÅ¡trinti... Move up Perkelti aukÅ¡Äiau Move down Perkelti žemyn Run Filter Filtruoti Delete Filter IÅ¡trinti filtrÄ… Are you sure you want to delete the filter '%1'? Ar JÅ«s tikrai nori iÅ¡trinti filtrÄ… '%1'? NewsHeader Icon Feed Piktogramų Å¡altinis Title Pavadinimas Published IÅ¡leista Received Gauta Author Autorius Category Kategorija Read Skaityti Star MÄ—gstamas Label EtiketÄ— Feed Title Å altinio pavadinimas Link Nuoroda NewsItem Mark Read/Unread PažymÄ—ti skaityta/neskaityta Delete News IÅ¡trinti naujienas NewsTabWidget Loading... (%p%) Kraunasi... (%p%) Home Pagrindinis Open Page in External Browser Atidaryti aplankÄ… iÅ¡orinÄ—je narÅ¡yklÄ—je Open Link in External Browser Atidaryti nuorodÄ… iÅ¡orinÄ—je narÅ¡yklÄ—je Open Link Atidaryti nuorodÄ… Open in New Tab Atidaryti naujame aplanke Save Link... IÅ¡saugoti nuorodÄ…... Save Image... IÅ¡saugoti paveikslÄ—lį... Copy Link Kopijuoti nuorodÄ… Copy Kopijuoti Go Back Grįžti Go Forward Pirmyn Stop Stop Reload Perkrauti Copy Image Kopijuoti paveikslÄ—lį Copy Image Address Kopijuoti paveikslÄ—lio adresÄ… Load Images Ä®kelti paveikslÄ—lius Auto Load Images to News View AutomatiÅ¡kai įkelti paveikslÄ—lius naujienų rodinyje No Load Images Neįkelti paveikslÄ—lių No Load Images to News View Neįkelti paveikslÄ—lių naujienų rodinyje Close Tab Uždaryti aplankÄ… Auto Load Images in News View AutomatiÅ¡kai įkelti paveikslÄ—lius naujienų rodinyje Don't Load Images Neįkelti paveikslÄ—lių Don't Load Images in News View Neįkelti paveikslÄ—lių naujienų rodinyje Comments Komentarai: Author: %1 Autorius: %1 audio audio video video media medija Link to NuorodÄ… į Mark Read/Unread PažymÄ—ti skaitytu/neskaitytu Mark News Star PažymÄ—ti naujienÄ… mÄ—gstama Label EtiketÄ— Share Dalintis Open News in External Browser Atidaryti naujienas iÅ¡orinÄ—je narÅ¡yklÄ—je Delete IÅ¡trinti NotificationWidget Close Uždaryti Mark All News Read PažymÄ—ti visus Å¡altinius skaitytais Previous Page Ankstesnis puslapis Next Page Kitas puslapis Incoming News: %1 Naujienos: %1 Page %1 of %2 Puslapis %1 iÅ¡ %2 OptionsDialog Options Pasirinkimas General Pagrindinis System Tray Sistemos dÄ—klas Network Connections Prisijungimas prie tinklo Browser NarÅ¡yklÄ— Feeds Å altiniai Labels EtiketÄ—s Notifications PraneÅ¡imai Passwords Slaptažodžiai Language Kalba Fonts & Colors Å riftai ir spalvos Keyboard Shortcuts KlaviatÅ«ros spartieji klaviÅ¡ai Warning: key is already assigned to DÄ—mesio: raktas jau priskirtas Show splash screen on startup Kraunantis rodyti paveiksliukÄ… Reopen last opened feeds on startup Po užsikrovimo atidaryti paskutinius Å¡altinius Open new tab next to active Atidaryti naujÄ… aplankÄ… Å¡alia aktyvaus Hide feeds tree when opening tabs Atidarant aplankÄ… slÄ—pti Å¡altinių medį Show default rss-icon instead of favourite one Rodyti numatytÄ… rss-ikonÄ… vietoje mÄ—gstamos Automatically collapse folders AutomatiÅ¡kai suskleisti aplankus Show close button on tab Skirtuke rodyti uždarymo mygtukÄ… Automatically check for updates AutomatiÅ¡kai tikrinti ar yra naujinimų Help improve QuiteRSS by sending usage information PadÄ—kite mums pagerinti QuiteRSS, siunÄiant naudojimo informacijÄ… Store a DB in memory (requires program restart) IÅ¡saugoti DB atmintyje (reikÄ—s perkrauti programÄ…) Save DB stored in memory to file every IÅ¡saugoti duomenų bazÄ™ į rinkmenÄ… kas minutes minutes Run QuiteRSS at Windows startup Paleisti QuiteRSS kartu su Windows Show system tray icon Rodyti dÄ—kle ikonÄ… starting QuiteRSS QuiteRSS kraunasi minimizing QuiteRSS QuiteRSS susimažina closing QuiteRSS QuiteRSS užsidaro Show static icon Rodyti statiÅ¡kÄ… ikonÄ… Change icon for incoming new news Pakeisti įeinanÄių naujienų ikonÄ… Show count of new news Rodyti naujienų skaiÄių Show count of unread news Rodyti neperskaitytų naujienų skaiÄių Single click instead of double click for show window Vienas paspaudimas vietoje dviejų, norint parodyti langÄ… Empty working set on minimize to tray IÅ¡valyti darbinius nustatymus mažinant į dÄ—klÄ… Move to the system tray when: Perkelti į dÄ—klÄ… kai: Tray icon behavior: DÄ—klo ikonos elgesys: Direct connection to the Internet Tiesioginis prisijungimas prie Interneto System proxy configuration (if available) Sistemos proxy konfigÅ«racija (jeigu naudojama) Manual proxy configuration: RankinÄ— proxy konfigÅ«racija: Proxy server: Proxy serveris: Port: Prievadas: Username: Vartotojo vardas: Password: Slaptažodis: Request timeout: Užklausos laikas: Number of requests: PraÅ¡ymų skaiÄius: Number of retries: Pakartojimų skaiÄius: Options network requests when updating feeds (requires program restart): Tinklo kreipimusi nustatymai atnaujinant Å¡altinius (bÅ«tina perkrauti programÄ…): Use embedded browser Naudoti vidinÄ™ narÅ¡yklÄ™ Use external browser Naudoti iÅ¡orinÄ™ narÅ¡yklÄ™ Default external browser Numatyta iÅ¡orinÄ— narÅ¡yklÄ— Following external browser: Kita iÅ¡orinÄ— narÅ¡yklÄ—: Browse... NarÅ¡yti... Load images Krauti paveikslÄ—lius Enable JavaScript Ä®jungti JavaScript Enable plug-ins Ä®jungti papildinius Open links in embedded browser in background Atidaryti nuorodas vidinÄ—je narÅ¡yklÄ—je Open links in external browser in background (experimental) Atidaryti nuorodÄ… iÅ¡orinÄ—je narÅ¡yklÄ—je viduje (bandomoji versija) Default zoom on pages: Numatytasis nuotolis iki puslapio: Browser selection: NarÅ¡yklÄ—s pasirinkimas: External browser: IÅ¡orinÄ— narÅ¡yklÄ—: Content: Turinys: User style sheet: Vartotojo stilius: Maximum pages in cache Daugiausiai puslapių podÄ—lyje Store cache in: Saugoti podÄ—lį: Maximum size of disk cache Maksimalus podÄ—lio dydis diske MB MB Use disk cache Vartotojo disko podÄ—lis Allow local data to be set Leisti vietinių duomenų nustatymÄ… Keep local data only until quit application IÅ¡saugoti vietinius duomenis tik iki programos iÅ¡jungimo Block sites from setting any data Drausti puslapiams nustatyti duomenis Clear IÅ¡valyti Cookies: Kukiai: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. "Ä®jungti Flash" yra papildinys, kuris neleidžia Flash turiniui užsikrauti puslapyje. Visada galima paÄiam paleisti aplikacijÄ… paspaudus ant "Flash play" ikonos. Use Click to Flash Naudokite "Ä®jungti Flash" Add... PridÄ—ti... Remove... PaÅ¡alinti... Ask where to save each file before downloading Klausti kur iÅ¡saugoti bylÄ… prieÅ¡ atsiunÄiant Download location: Siuntinių vieta: History Istorija Click to Flash Ä®jungti Flash Downloads Siuntiniai Automatically update the feeds on startup Ä®sijungus automatiÅ¡kai atnaujinti Å¡altinius Automatically update the feeds every AutomatiÅ¡kai atnaujinti Å¡altinius kas seconds sekundÄ—s hours valandas Nothing to do Nedaryti nieko Dec Gruo December Gruodis Display format for date: Rodyti datos formatÄ…: time: laikas: Alternating row background colors Alternatyvios eiluÄių fono spalvos Simplified representation of date and time Supaprastinta data ir laikas Show All Rodyti viskÄ… Show New Rodyti naujus Show Unread Rodyti neskaitytus Show Starred Rodyti mÄ—gstamus Show Not Starred Rodyti likusius Show Unread or Starred Rodyti neskaitytus arba mÄ—gstamus Show Last Day Rodyti paskutinÄ™ dienÄ… Show Last 7 Days Rodyti paskutines 7 dienas Style sheet for news: Naujienų stiliai: Mark news as read: PažymÄ—ti naujienas skaitytomis: on selecting. With timeout pasirinkimo metu. Su pertrauka after switching to another news pasirinkus kitas naujienas Mark displayed news as read when switching feeds ŽymÄ—ti kaip perskaitytÄ… pereinant prie kito Å¡altinio Mark displayed news as read when closing tab ŽymÄ—ti perskaityta, kai uždaromas aplankas Mark displayed news as read on minimize ŽymÄ—ti kaip perskaitytÄ… kai sumažinama Change behavior of action 'Next Unread News' Pakeisti "Kitos neperskaitytos naujienos" funkcijas starred news mÄ—gstamos naujienos labeled news pažymÄ—tos naujienos Automatically mark identical news as read AutomatiÅ¡kai pažymÄ—ti identiÅ¡kÄ… naujienÄ… kaip skaitytÄ… Prevent accidental deletion of: Uždrausti netyÄinį iÅ¡trynimÄ…: Enable cleanup on shutdown Ä®galinti iÅ¡valymÄ… iÅ¡jungiant Maximum age of news in days to keep: Maksimalus laikas kiek naujienos bus saugomos: Maximum number of news to keep: Maksimalus laikomų naujienų skaiÄius: Delete read news IÅ¡trinti perskaitytas naujienas Never delete unread news Niekada neiÅ¡trinti neperskaitytų naujienų Never delete starred news Niekada neiÅ¡trinti mÄ—gstamų naujienų Never delete labeled news Niekada netrinti pažymÄ—tų naujienų Clean up 'Deleted' IÅ¡valyti 'PaÅ¡alintas' Enable DB optimization (slower shutdown) Aktyvuoti DB optimizacijÄ… (lÄ—tesnis programos iÅ¡jungimas) Reading Skaitymas Clean Up IÅ¡sivalyti New... Naujas... Edit... Redaguoti... Delete... IÅ¡trinti... Move up Perkelti aukÅ¡Äiau Move down Perkelti žemyn Show when inactive main window Rodyti kai neaktyvus pagrindinis langas Screen Ekranas Transparency Permatomumas Show titles feeds Rodyti Å¡altinių pavadinimus Show icon feed Rodyti naujienų kanalo piktogramÄ… Show button 'Mark All News Read' Rodyti mygtukÄ… 'PažymÄ—ti visus Å¡altinius skaitytais' Show button 'Mark Read/Unread' Rodyti mygtukÄ… 'PažymÄ—ti skaityta/neskaityta' Show button 'Open in External Browser' Rodyti mygtukÄ… 'Atidaryti iÅ¡orinÄ—je narÅ¡yklÄ—je' Show button 'Delete News' Rodyti mygtukÄ… 'IÅ¡trinti naujienas' Play sound for incoming new news Garsinis praneÅ¡imas gavus naujienÄ… Play Groti Display notification for incoming news Rodyti naujienų praneÅ¡imÄ… Top Left VirÅ¡utinis kairÄ—je Top Right VirÅ¡utinis deÅ¡inÄ—je Bottom Left Apatinis kairÄ—je Bottom Right Apatinis deÅ¡inÄ—je Review Apžvalga Position Pozicija Show maximum of Maksimaliai rodyti iÅ¡ item on page notification įrašų puslapyje praneÅ¡imas Width list items Plotis sÄ…raÅ¡o elementams pixels TaÅ¡kų Close notification after Uždaryti praneÅ¡imus po Do not show notification in fullscreen mode Nerodyti perspÄ—jimų ekrano režime Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Rodyti tik pasirinktus Å¡altinius: Notification PraneÅ¡imas Sound Garsas Selection of feeds Å altinių parinkimas All Feeds Visi Å¡altiniai Site Puslapis User Vartotojas Password Slaptažodis Delete PaÅ¡alinti Delete All PaÅ¡alinti viskÄ… Show Passwords Rodyti slaptažodžius Version Versija Author Autorius Contact Kontaktai Choose language: Pasirinkti kalbÄ…: Type Turinys Font Å riftas Feeds list font Å altinių sÄ…raÅ¡o Å¡riftas News list font Naujienų sÄ…raÅ¡o Å¡riftas News title font Naujienų pavadinimo Å¡riftas News text font Naujienų teksto Å¡riftas Notification font PraneÅ¡imų Å¡riftas Change... Keisti... Reset Perkrauti Feeds list color Å altinio sÄ…raÅ¡o spalva Feeds list background Å altinio sÄ…raÅ¡o fonas News list color Naujienų sÄ…raÅ¡o spalva News list background Naujienų saraÅ¡o fonas Focused news color Fokusuotos naujienų spalvos Focused news background color Fokusuotos naujienų fono spalvos Link color Nuorodos spalva Title color Pavadinimo spalva Date color Datos spalva Author color Autoriaus spalva News text color Naujienų teksto spalva News title background Naujienų pavadinimo fonas News background Naujienų fonas Feed with new news Å altinis su naujomis naujienomis Count of unread news in feeds tree Neperskaitytų naujienų Å¡altinių medyje skaiÄius Disabled feed IÅ¡jungtas Å¡altinis Alternating row colors Alternatyvios eiluÄių spalvos Notification text color PraneÅ¡imų teksto spalva Notification background color PraneÅ¡imų fono spalva Auto load images in news view AutomatiÅ¡kai įkelti paveikslÄ—lius naujienų rodinyje Text color of new news Naujų naujienų teksto spalva Show feeds tree toggle Rodyti Å¡altinių medžio jungtukÄ… Clear new status when minimize to tray IÅ¡valyti atnaujintÄ… statusÄ… kai mažinama į dÄ—klÄ… Set focus on the last opened news Nustatyti fokusavimÄ… į paskutinÄ™ atidarytÄ… naujienÄ… Set focus at the top of news list Nustatyti fokusavimÄ… į naujienų sÄ…raÅ¡o viršų Set focus on the unread news Nustatyti fokusavimÄ… į neperskaitytas naujienas Open the news Atidaryti naujienas Default news filter: Numatytasis naujienų filtras: Action on feed opening: Veiksmas atidarant Å¡altinį: Show news description instead of loading web page Neįkelti viso tinklalapio, o rodyti tik naujienos apraÅ¡ymÄ… Text color of unread news Neskaitytų naujienų teksto spalva Focused feed color Fokusuoto Å¡altinio spalva Focused feed background color Fokusuoto Å¡altinio fono spalva Standard Standartinis Fixed Fiksuotas Serif Serif Sans Serif Sans Serif Cursive Cursive Fantasy Fantasy Default font size Numatytas Å¡rifto dydis Fixed font size Fiksuotas Å¡rifto dydis Minimum font size Mažiausias galimas Å¡rifto dydis Minimum logical font size Mažiausias logiÅ¡kas Å¡rifto dydis Font families: Å riftų rūšys: Font sizes: Å riftų dydžiai: Fonts Å riftas Fonts Browser Å riftų narÅ¡yklÄ— Colors Spalvos Filter Filtras Action Veiksmas Description ApraÅ¡as Shortcut Nuoroda Shortcut: Nuoroda: Open File... Atidaryti bylÄ…... Select Style Sheet File Pasirinkti stiliaus bylÄ… Open Directory... Atidaryti katalogÄ…... Add site to whitelist PridÄ—ti svetainÄ™ į BaltÄ…jį sÄ…rašą Site without 'http://' (ex. youtube.com) SvetainÄ— be 'http://' (pvz. youtube.com) QAbstractSpinBox &Step up &Perkelti į viršų Step &down Perkelti į &apaÄiÄ… &Select All &Pasirinkti viskÄ… QDialogButtonBox Close Uždaryti Cancel AtÅ¡aukti &Yes &Taip &No %Ne QFtp Not connected NeprisijungÄ™s Host %1 not found Adresas %1 nerastas Connection refused to host %1 Nepavyko prisijungti prie %1 Connection timed out to host %1 IÅ¡seko prisijungimų prie %1 laikas Connected to host %1 Prisijungta prie %1 Connection refused for data connection Neįmanoma prisijungti duomenų perdavimui Unknown error Nežinoma klaida Connecting to host failed: %1 Nepavyko prisijungti prie adreso: %1 Login failed: %1 Prisijungimas nepavyko: %1 Listing directory failed: %1 Katalogo sÄ…raÅ¡o sudarymas nepavyko:⎠%1 Changing directory failed: %1 Nepavyko pakeisti katalogo: %1 Downloading file failed: %1 Nepavyko atsisiųsti bylos: %1 Uploading file failed: %1 Nepavyko iÅ¡siųsti bylos: %1 Removing file failed: %1 Nepavyko paÅ¡alinti bylos: %1 Creating directory failed: %1 Nepavyko sukurti katalogo: %1 Removing directory failed: %1 Nepavyko iÅ¡trinti katalogo: %1 Connection closed Prisijungimas baigtas QLineEdit &Undo &Grįžti &Redo &Atstatyti Cu&t IÅ¡pkirpt&i &Copy &Kopijuoti &Paste %Ä®kelti Delete IÅ¡trinti Select All Pasirinkti viskÄ… QMultiInputContext Select IM Pasirinkti IM QObject Cannot start external program Nepavyko paleisti iÅ¡orinÄ—s programos Cannot start external program! %1 Nepavyko paleisti iÅ¡orinÄ—s programos! %1 Error Klaida QTextControl &Undo %AtÅ¡aukti &Redo &Atstatyti Cu&t IÅ¡kirpt&i &Copy &Kopijuoti &Paste &Ä®kelti Delete IÅ¡trinti Select All Surinkti viskÄ… Copy &Link Location Kopijuoti &nuorodos adresÄ… QWizard Cancel AtÅ¡aukti < &Back < &Grįžti &Finish &Baigti &Next > &Kitas > RSSDetectionWidget Untitled feed Å altinis be pavadinimo RequestFeed Server requires authentication! Serveris reikalauja prisijungimo vardo! Server replied: Not Found! Serverio atsakymas: nerasta! Redirect error! Peradresavimo klaida! Request timeout! Užklausos laikas baigÄ—si! SQLiteDriver Error opening database Klaida atidarant duomenų bazÄ™ Error closing database Klaida uždarant duomenų bazÄ™ Unable to begin transaction Nepavyko pradÄ—ti operacijos Unable to commit transaction Nepavyko įvykdyti operacijos Unable to rollback transaction Nepavyko atmesti operacijos SQLiteResult Unable to fetch row Nepavyko gauti eilutÄ—s No query NÄ—ra užklausos Unable to execute statement Nepavyko įvykdyti instrukcijos Unable to execute multiple statements at a time Nepavyko įvykdyti kelių instrukcijų vienu metu Unable to reset statement Nepavyko atstatyti instrukcijos Unable to bind parameters Nepavyko susieti parametrų Parameter count mismatch Parametrų skaiÄius nesutampa SslErrorDialog SSL Certificate Error! SSL sertifikato klaida! Only for this session Tik Å¡iam prisijungimui UpdateAppDialog Check for Updates Tikrinti ar yra atnaujinimų Checking for updates... Tikrinama ar yra atnaujinimų... Loading history... Kraunama istorija... Don't remind about this version Nepriminti apie Å¡iÄ… versijÄ… &Install Ä®diegti You already have the latest version JÅ«s naudojate naujausiÄ… versijÄ… A new version of QuiteRSS is available! Yra nauja QuiteRSS versija! Click here to go to the download page Norint atsisiųsti, spausti Äia Your version is: JÅ«sų versija yra: Current version is: DabartinÄ— versija yra: Error checking updates Klaida tikrinant atnaujinimus quiterss-0.18.3/lang/quiterss_nl.ts000066400000000000000000005463031265173051100173370ustar00rootroot00000000000000 AboutDialog About Over Revision Revisie Version Versie QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS is een open source RSS/Atom lezer, tussen verschillende besturingssystemen Includes: Bevat: Application directory: QuiteRSS map: Resource directory: Resource map: Data directory: Gegevens map: Backup directory: Backup map: Database file: Database bestand: Settings file: Instellingen bestand: Log file: Log bestand: Authors Auteurs History Historie License Licentie Information Informatie AdBlockAddSubscriptionDialog Add Subscription Subscriptie toevoegen Title: Titel: Address: Adres: Add new subscription to AdBlock: Voeg een nieuwe subscriptie toe aan Adblock: AdBlockCustomList Custom Rules Personenlijke regels AdBlockDialog AdBlock Configuration Adblock instellingen Enable AdBlock Adblock inschakelen Search... Zoek... Options Opties AdBlock Adblock Use only essential part of EasyList (for performance reasons) Gebruik alleen het essentieel onderdeel van EasyList (vanwege de prestaties) Add Rule Voeg een regel toe Remove Rule Verwijder een regel Add Subscription Voeg subscriptie toe Remove Subscription Verwijder subscriptie Update Subscriptions Update subscriptie Learn about writing rules... Leer over het schrijven van regels... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock laat je ongewenste inhoud van webpagina's blokkeren AdBlock Adblock Show AdBlock &Settings Toon Adblock in&stellingen Disable on %1 Uitschakelen op %1 Disable only on this page Deze pagina alleen uitschakelen Blocked Popup Windows Geblokkeerde popup vensters %1 with (%2) %1 met (%2) No content blocked Geen inhoud geblokkeerd Blocked URL (AdBlock Rule) - click to edit rule Geblokkeerde URL (Adblock regel) - klik om regel te bewerken AdBlockManager EasyList Easylist AdBlockSubscription Cannot load subscription! Kan subscriptie niet laden! AdBlockTreeWidget Add Rule Voeg regel toe Remove Rule Verwijder regel Add Custom Rule Voeg eigen regel toe Please write your rule here: Schrijf je regels hier AUB: %1 (recently updated) %1 (recent upgedate) %1 (Error: %2) %1 (Fout: %2) AddFeedWizard Add Feed Feed toevoegen Create New Feed Maak nieuwe feed Use title of the feed as displayed name Gebruik titel van de feed als weergegeven naam Server requires authentication: Server vereist verificatie: Username: Gebruikersnaam: Password: Wachtwoord: Feed URL or website address: Feed URL of website adres: Feeds Feeds All Feeds Alle feeds New Folder... Nieuwe Map... Displayed name: Weergeven naam: Location: Locatie: URL error! URL fout! Duplicate feed! Duplicaat feed! Can't find feed URL! Kan feed URL niet vinden! Request failed! Aanvraag mislukt! AddFolderDialog Add Folder Map Toevoegen Feeds Feeds All Feeds Alle feeds Name: Naam: Location: Locatie: AuthenticationDialog Save password Opslaan wachtwoord Authorization required Verificatie vereist Server: Server: Message: Bericht: Username: Gebruikersnaam: Password: Wachtwoord: CategoriesTreeWidget Unread Ongelezen Starred Een ster Deleted Verwijderd Labels Labels Open in New Tab Open in Nieuwe Tabblad Clear 'Deleted' Opruimen 'Verwijderd" Mark Read Markeer Gelezen CleanUpWizard Clean Up Opruimen Choose Feeds Kies Feeds All Feeds Alle feeds Clean Up Options Opruimen van Opties Maximum age of news in days to keep: Aantal dagen dat je het nieuws wilt bewaren: Maximum number of news to keep: Maximum aantal nieuwsberichten dat je wilt bewaren: Delete read news Verwijder gelezen nieuws Never delete unread news Verwijder nooit ongelezen nieuws Never delete starred news Verwijder nooit starred nieuws Never delete labeled news Verwijder nooit labeled nieuws Clean up 'Deleted' Ruim 'Verwijderd' op Purge DB Opschonen DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Records die waren gemarkeerd als 'verwijderd' in DB helemaal verwijderen. Oud nieuws kan opnieuw verschijnen Information Informatie Clean Up wizard deleted %1 news Schoonmaak assistent verwijderde %1 nieuws ClickToFlash Object blocked by ClickToFlash Object geblokkeerd door ClickToFlash Hide object Verberg object Add '%1' to whitelist Voeg '%1' toe aan wittelijst CustomizeToolbarDialog Customize Main Toolbar Aanpassen Hoofdwerkbalk Customize Feeds Toolbar Aanpassen feeds Werkbalk Customize News Toolbar Aanpassen Nieuws Werkbalk Load images Laadt afbeeldingen Separator Scheidingsteken Icon Pictogram Text Tekst Text Beside Icon Tekst Naast Pictogram Text Under Icon Tekst Onder Pictogram Big Groot Normal Normaal Small Klein Style: Stijl: Icon Size: Pictogram Grootte: Add Toevoegen Remove Verwijder Move up Verplaats Omhoog Move down Verplaats Omlaag Default Standaard DownloadItem Remaining time unavailable Resterende tijd niet beschikbaar Error: Cannot write to file! Fout: Kan niet naar bestand schrijven! Error: Fout: few seconds paar seconden seconds Seconden minutes minuten hours uren Unknown size Onbekende grootte Unknown speed Onbekende snelheid %2 - unknown size (%3) %2 - onbekende grootte (%3) Remaining %1 - %2 of %3 (%4) Resterende %1 - %2 of %3 (%4) Cancelled - %1 Geannuleerd - %1 Delete file Verwijder bestand Do you want to also delete downloaded file? Wil je het gedownload bestand ook verwijderen? Open File Open Bestand... Open Folder Open Map Copy Download Link Kopieer Download link Cancel Downloading Annuleer download Remove Verwijder Cancelled Geannuleerd Error Fout Not found Niet gevonden Sorry, the file %1 was not found! Sorry het bestand %1 werd niet gevonden DownloadManager Clear Wis File %1 (*.%2) bestand %1 (*.%2) All Files (*.*) Alle bestanden (*.*) Save As... Opslaan Als... Executable: Uitvoerbaar: Arguments: Argumenten: FeedPropertiesDialog Properties Eigenschappen General Algemeen Columns Kolommen Authentication Verificatie Status Status Title: Titel: Homepage: Startpagina: Feed URL: Feed URL: Load Title Laad Titel Load Favicon Laad favoriete Pictogram Select Icon... Selekteer pictogram... Select Icon Kies Pictogram Disable update Zet update uit Automatically update every Update automatisch elke seconds Seconden minutes minuten hours uren Starred Een Ster Load images Laadt afbeeldingen Display in new tab on startup Toon bij starten in een nieuw tabblad Show news' description instead of loading web page Toon nieuws beschrijving in plaats van webpagina laden Automatically delete duplicate news Verwijder automatisch dubbel nieuws Display Toon Reading Lezen Enable JavaScript Javascript inschakelen Right-to-left layout Layout van rechts naar links Ascending Oplopend Descending Aflopend Sort by: Sorteer op: Add Toevoegen Remove Verwijder Move up Verplaats Omhoog Move down Verplaats Omlaag Default Standaard Server requires authentication: Server vereist verificatie: Username: Gebruikersnaam: Password: Wachtwoord: Feeds count: Telling van feeds: Description: Omschrijving: Status: Status: Created: Gemaakt: Last update: Laatste update: News count: Nieuws aantal: Good Goed Long ago ;-) Lang geleden ;-) new Nieuw unread ongelezen Image files Afbeeldingsbestanden Select Image Selekteer Afbeelding Load icon: can't open a file! Laad pictogram: kan geen bestand openen! FilterRulesDialog Filter Rules Filter Regels Feeds Feeds All Feeds Alle feeds Filter name: Filternaam: Match all news Overeenkomen met al het nieuws Match all conditions Overeenkomen met alle voorwaarden Match any condition Overeenkomen met elke voorwaarde Perform these actions: Deze actie uitvoeren: Please enter name for the filter. Voer AUB een naam in voor filter. Please enter search condition for the news filter. Vul een zoekcriteria in voor het nieuws filter. FindFeed Find Name Zoek Naam Find Link Zoek link FindTextContent Find in News Zoek in nieuws Find in Titles Zoek in titels Find in Authors Zoek auteurs Find in Categories Zoek in Catagorie Find in Descriptions Vind in omschrijving Find in Links Zoek in links Find in Browser Zoek in webbrowser FtpDownloader Canceled! Geannuleerd! ItemAction Mark News as Read Markeer Nieuws als Gelezen Add Star Ster toevoegen Delete Verwijder Add Label Label toevoegen Play a Sound Speel een geluid Show News in Notifier Toon nieuws in melder Browse Blader Play Speel Add Action Actie Toevoegen Delete Action Verwijder Actie Open File... Open Bestand ItemCondition Title Titel Description Omschrijving Author Auteur Category Groep State Status Link Koppeling News Nieuws New Nieuw Read Gelezen Starred Een Ster Add Condition Voeg Voorwaarde toe Delete Condition Verwijder voorwaarde contains bevat doesn't contains Bestaat niet is is isn't is niet begins with Begint met ends with Eindigd met Regular expressions Reguliere expressies LabelDialog New Label Nieuwe label Load icon... Laadt pictogram... Default Standaard Select color... Selecteer kleur... Name: Naam: Icon: Pictogram: Color text: Tekst kleur: Color background: Achtergrond kleur: Image files Afbeeldingsbestanden Select Image Selecteer Afbeelding Load icon: can't open a file! Laad pictogram: kan bestand niet openen! MainApplication Saving data... Gegevens opslaan.... MainWindow &AdBlock &Adblock Hide Categories Verberg Categorieën Show Categories Toon categorieën Select OPML-File Selecteer OPML-bestand OPML-Files (*.%1 *.%2) OPML-bestanden (*.%1 *.%2) Import canceled Import geannuleerd Import: can't open a file Import: kan bestand niet openen OPML-Files (*.%1) OPML-bestanden (*.%1) Export canceled Export geannuleerd Export: can't open a file Export: kan bestand niet openen Unread: %1 Ongelezen: %1 All: %1 Alles: %1 (Browser) (Browser) New News: %1 Nieuw Nieuws: %1 Unread News: %1 Ongelezen nieuws: %1 &Add &Toevoegen Add New Feed Voeg nieuw feed toe &Feed... &Feed... F&older... Ma&p... Add New Folder Voeg nieuw folder toe Open in New Tab Open in nieuw tabblad &Delete... &Verwijder... Delete Selected Feed Verwijder geselecteerde feed &Import Feeds... &Importeer feeds... Import Feeds from OPML File Importeer feeds van OPML bestand &Export Feeds... &Exporteer feeds... Export Feeds to OPML File Exporteer feeds naar OPML bestand E&xit E&inde Update Feed Update feed Update Current Feed Update huidige feed Update All Update alles Update All Feeds Update alle feeds Mark All Feeds Read Markeer alle feeds als gelezen Mark Read/Unread Markeer gelezen/ongelezen Mark Current News Read/Unread Markeer huidig nieuws als gelezen/ongelezen Mark All News Read Markeer alle nieuws als gelezen Downloads Downloads Clean Up... Opruimen... News Filters... Nieuws filters... Filter News... Filter nieuws... Options... Opties... Open Options Dialog Open opties dialoogvenster Filter Feeds Filter feeds Show All Toon alles Show New Toon nieuw Show Unread Toon ongelezen Show Starred Feeds Toon gesterde feeds Show Not Working Feeds Toon niet werkende feeds Filter News Filter nieuws Show Starred Toon met ster Show Not Starred Toon zonder ster Show Unread or Starred Toon ongelezen of met ster Show Last Day Toon laatste dag Show Last 7 Days Toon laatste 7 dagen About... Over... Show 'About' Dialog Toon 'Over' dialoogvenster Check for Updates... Controleer op updates... Report a Problem... Rapporteer een probleem... Open News Open nieuws Open in Browser Open in browser Open in External Browser Open in externe browser Open News in External Browser Open nieuws in externe browser Open News in New Tab Open nieuws in nieuw tabblad Open in Background Tab Open tabblad in de achtergrond Open News in Background Tab Open op achtergrond nieuws in tabblad Star Ster Mark News Star Markeer nieuws met ster Delete Verwijder Delete Selected News Verwijder geselecteerde nieuws Delete All News Verwijder alle nieuws Delete All News from List Verwijder alle nieuws van lijst Restore Herstel Restore News Hestel nieuws Copy Link Koppeling kopiëren Restore last deleted news Herstel laatst verwijderd nieuws Mark Read Markeer gelezen Mark Feed Read Markeer feed gelezen Properties Eigenschappen &File &Bestand Count Unread News Tel ongelezen nieuws Count All News Tel alle Nieuws Last Update Laatste update Reset browser zoom Herstel zoom in browser Print Web Page Web pagina Afdrukken Preview Web Page Voorbeeld van Webpagina Save page in database Sla pagina op in databank Save page in database instead of news description Pagina opslaan in DB in plaats van nieuws beschrijving Confirm Delete Bevestig verwijderen Are you sure to delete selected elements? Weet u zeker dat u de geselecteerde elementen wilt verwijderen? Menu Menu Add Feed... Feed toevoegen &Create Backup... &Backup maken... S&how Menu Bar T&oon menubalk Stop Update Feeds Stop bijwerken van feeds Open News Description Open omschrijving van Nieuws Copy News Link Kopieer koppeling Nieuws &View &Bekijk Fee&ds Fee&ds &News &Nieuws &Browser &Browser &Tools &Hulpmiddelen &Help &Help Main Toolbar Hoofdwerkbalk Customize Toolbar Aanpassen Werkbalk Main Toolbar... Hoofdwerkbalk... Customize Toolbar... Aanpassen Werkbalk... Feeds Toolbar... Feeds Werkbalk... News Toolbar... Nieuws werkbalk... Lock Toolbar Vergrendel Werkbalk Hide Toolbar Verberg Werkbalk Layout Opmaak Classic klassiek Newspaper Krant Application Style Programma Stijl System Systeem System2 Systeem2 Green Groen Orange Oranje Purple Paars Pink Rose Gray Grijs Browser Position Browser Positie Top Boven Bottom Onder Right Rechts Left Links Show Window Toon venster Previous Feed Vorige Feed Next Feed Volgende Feed Previous News Vorige Nieuws Next News Volgende Nieuws News Page Up Nieuws pagina omhoog News Page Down Nieuws pagina omlaag Next Unread News Volgende Ongelezen Nieuws Previous Unread News Vorige Ongelezen Nieuws Switch Focus to Next Panel Schakel focus op volgend venster Switch Focus to Next Panel (Tree Feeds, List News, Browser) Schakel focus op volgend venster (Tree Feeds, NieuwsLijst, Browser) Switch Focus to Previous Panel Schakel Focus op Vorig Venster Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Schakel Focus op Vorig Venster (Tree Feeds, NieuwsLijst, Browser) Show/Hide Tree Feeds Toon/Verberg Structuur Feeds Minimize to Tray Minimaliseer naar Systeemvak Minimize Application to Tray Minimaliseer QuiteRSS naar Systeemvak Columns Kolommen Show Indentation Toon Inspringing Search Feed Zoek Feed Zoom Zoom Zoom In Inzoomen Zoom in in browser Inzoomen in browser Zoom Out Uitzoomen Zoom out in browser Uitzoomen in browser 100% 100% Print... Afdrukken... Print Preview... Voorbeeld Afdrukken... Page up (Browser) Pagina verder (Browser) Page down (Browser) Pagina terug (Browser) Save As... Opslaan als... Save Page As... Pagina Opslaan Als... Show/Hide Toon/Verberg Feeds Toolbar Feeds Werkbalk News Toolbar Nieuws werkbalk Browser Toolbar Browser Werkbalk Panel Categories Paneel categorieën Status Bar Statusbalk Full Screen Volledig Scherm Stay On Top Bovenaan blijven Categories Categorieën Label Label Show labels menu Toon menu labels Close Tab Sluit Tabblad Close Other Tabs Sluit andere tabbladen Close All Tabs Sluit Alle Tabbladen Switch to next tab Naar het volgende tabblad Switch to previous tab Naar het vorige tabblad Unread Ongelezen Starred Met Ster Deleted Verwijderd Labels Labels Decrease news list/increase browser Verlaag nieuwslijst/verhoog browser Increase news list/decrease browser Verhoog nieuwslijst/verlaag browser Find Zoek Open Homepage Feed Open startpagina Feed Sort by Name Sorteer op naam Collapse All Folders Alle mappen samenvouwen Expand All Folders Open Alle Mappen Next Folder Volgende Map Previous Folder Vorige Map Expand Folder Open map Setting Page: Labels Pagina instellen: Labels Share Delen Sort By Sorteer op: Ascending Oplopend Descending Aflopend Check for updates Controleer op updates A new version of QuiteRSS... Een nieuwe versie van QuiteRRS... Loading... Laden... Web Page Web Pagina Save As Opslaan als HTML-Files (*.%1) HTML-Bestanden (*.%1) Text files (*.%2) Tekst bestanden (*.%2) Save As: can't open a file Opslaan als: kan een bestand niet openen Choose Directory Kies map Important Belangrijk Work Werk Personal Persoonlijk To Do Te Doen Later Later Amusingly Vermakelijk NetworkManager SSL Certificate Error! SSL Certificaat fout! The "%1" server has the following errors in the SSL certificate: De "%1" server heeft de volgende SSL certificaat fouten: <b>Organization: </b> <b>Organisatie:</b> <b>Domain Name: </b> <b>Domain Naam: </b> <b>Expiration Date: </b> <b>Vervaldatum: </b> <b>Error: </b> <b>Fout: </b> Would you like to make an exception for this certificate? Zou je graag een uitzondering maken voor dit certificaat? NewsFiltersDialog News Filters Nieuws Filters Feeds Feeds Filter Name Filternaam: New... Nieuw... Edit... Bewerk... Delete... Verwijder... Move up Verplaats Omhoog Move down Verplaats Omlaag Run Filter Start Filter Delete Filter Verwijder Filter Are you sure you want to delete the filter '%1'? Weet je zeker dat je het filter wilt verwijderen '%1'? NewsHeader Icon Feed Pictogram Feed Title Titel Published Uitgegeven Received Ontvangen Author Auteur Category Groep Read Gelezen Star Ster Label Label Feed Title Feed titel Link Koppeling NewsItem Mark Read/Unread Markeer Gelezen/Ongelezen Delete News Verwijder Nieuws NewsTabWidget Loading... (%p%) Laden... (%p%) Home Startpagina Open Page in External Browser Open pagina in External Browser Open Link in External Browser Open Link in External Browser Open Link Open link Open in New Tab Open in Nieuwe Tabblad Save Link... Link opslaan... Save Image... Afbeelding opslaan als... Copy Link Kopieer link Copy Kopieer Go Back Ga Terug Go Forward Ga Vooruit Stop Stop Reload Herlaad Copy Image Kopieer Afbeelding Copy Image Address Kopieer Afbeelding Adres Load Images Laadt afbeeldingen Auto Load Images to News View Toon Automatisch Afbeeldingen van het Nieuws No Load Images Laadt geen afbeeldingen No Load Images to News View Laat geen afbeeldingen zien van nieuws Close Tab Sluit Tabblad Auto Load Images in News View Toon Automatisch Afbeeldingen van het Nieuws Don't Load Images Afbeeldingen niet laden Don't Load Images in News View Laat geen afbeeldingen zien in nieuws Comments Commentaar Author: %1 Auteur: %1 audio Audio video Video media Media Link to Link met Mark Read/Unread Markeer Gelezen/Ongelezen Mark News Star Markeer Nieuws Ster Label Label Share Delen Open News in External Browser Open Nieuws in External Browser Delete Verwijder NotificationWidget Close Sluit Mark All News Read Markeer Alle Nieuws Als Gelezen Previous Page Vorige Nieuws Next Page Volgende pagina Incoming News: %1 Inkomend Nieuws: %1 Page %1 of %2 Pagina %1 van %2 OptionsDialog Options Opties General Algemeen System Tray Systeemvak Network Connections Netwerk Verbindingen Browser Browser Feeds Feeds Labels Labels Notifications Meldingen Passwords Wachtwoorden Language Taal Fonts & Colors Lettertypen & Kleuren Keyboard Shortcuts Sneltoetsen voor Toetsenbord Warning: key is already assigned to Waarschuwing: Toets is al toegewezen aan Show splash screen on startup Opstartscherm tonen bij het opstarten Reopen last opened feeds on startup Heropen laatste geopende feed bij het opstarten Open new tab next to active Open nieuwe tab naast de actieve Hide feeds tree when opening tabs Verberg feeds tree als je tabbladen opent Show default rss-icon instead of favourite one Toon standaard rss pictogram in plaats van je favoriete Automatically collapse folders Automatisch de mappen samenvouwen Show close button on tab Toon sluitknop op tabblad Automatically check for updates Automatisch controleren op updates Help improve QuiteRSS by sending usage information Help QuiteRSS verbeteren door opsturen van informatie over het gebruik Store a DB in memory (requires program restart) Sla een DB op in geheugen.(Vereist een herstart) Save DB stored in memory to file every Sla DB opgeslagen in geheugen op voor elk bestand minutes minuten Run QuiteRSS at Windows startup QuiteRSS laden tijdens opstarten Show system tray icon Toon systeemvak pictogram starting QuiteRSS Start QuiteRSS minimizing QuiteRSS minimaliseren QuiteRSS closing QuiteRSS Sluiten QuiteRSS Show static icon Toon statische pictogram Change icon for incoming new news Verander pictogram voor inkomende nieuw nieuws Show count of new news Toon telling van nieuw nieuws Show count of unread news Toon telling van ongelezen nieuws Single click instead of double click for show window Enkele klik in plaats van dubbele klik voor tonen van venster Empty working set on minimize to tray Leeg werkset om te minimaliseren naar systeemvak Move to the system tray when: Verplaats naar systeemvak wanneer: Tray icon behavior: Gedrag pictogram in het systeemvak: Direct connection to the Internet Directe verbinding met Internet System proxy configuration (if available) Systeem proxy instellingen (Indien beschikbaar) Manual proxy configuration: Handmatige proxy instellingen: Proxy server: Proxy server: Port: Poort: Username: Gebruikersnaam: Password: Wachtwoord: Request timeout: Aanvraag time-out: Number of requests: Nummer aanvraag: Number of retries: Aantal herhalingen: Options network requests when updating feeds (requires program restart): Opties netwerk aanvragen bij het updaten van feeds (vereist herstart programma): Use embedded browser Gebruik ingebouwde browser Use external browser Gebruik externe browser Default external browser Standaard externe browser Following external browser: De volgende externe browser: Browse... Blader... Load images Laadt afbeeldingen Enable JavaScript JavaScript Inschakelen Enable plug-ins Plugins Inschakelen Open links in embedded browser in background Open links in externe browser in de achtergrond Open links in external browser in background (experimental) Open links in externe browser in de achtergrond.(experimenteel) Default zoom on pages: Standaard zoom op pagina's Browser selection: Browser selectie: External browser: Externe browser: Content: Inhoud: User style sheet: Gebruikers stylesheet Maximum pages in cache Maximum pagina's in cache Store cache in: Cache opslaan in: Maximum size of disk cache Maximum grootte van schijf cache MB MB Use disk cache Gebruik schijf cache Allow local data to be set Toestaan dat lokale gegevens worden ingesteld Keep local data only until quit application Houd lokale gegevens alleen tot programma sluit Block sites from setting any data Blokkeer websites die gegevens willen instellen Clear Wis Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. ClickToFlash is een plugin die het automatisch laden van Flash-inhoud blokkeert bij pagina. U kunt altijd handmatig laden door te klikken op de pictogram Flash. Use Click to Flash Gebruik klik om te flashen Add... Toevoegen... Remove... Verwijder... Ask where to save each file before downloading Vraag waar je elk bestand moet opslaan voor je gaat downloaden Download location: Download locatie: History Historie Click to Flash Klik om te flashen Downloads Downloads Automatically update the feeds on startup Update de feed automatisch als je opstart Automatically update the feeds every Update de feed automatisch elke seconds Seconden hours uren Nothing to do Niets te doen Dec Dec December December Display format for date: Weergave-indeling voor datum: time: Tijd: Alternating row background colors Afwisselende rij achtergrondkleuren Simplified representation of date and time Vereenvoudigde weergave van datum en tijd Show All Toon alles Show New Toon Nieuw Show Unread Toon Ongelezen Show Starred Toon Ster Show Not Starred Toon geen ster Show Unread or Starred Toon ongelezen of Ster Show Last Day Toon laatste dag Show Last 7 Days Toon laatste 7 dagen Style sheet for news: Bladstijl voor nieuws: Mark news as read: Markeer Nieuws als Gelezen: on selecting. With timeout het selecteren met timeout after switching to another news na het overschakelen naar een ander nieuws Mark displayed news as read when switching feeds Markeer weergegeven nieuws als gelezen bij het overschakelen van feeds Mark displayed news as read when closing tab Markeer weergegeven nieuws als gelezen als tabblad wordt gesloten Mark displayed news as read on minimize Markeer weergegeven nieuws als gelezen wanneer het wordt geminimaliseerd Change behavior of action 'Next Unread News' Verander het gedrag van de actie 'Volgend ongelezen Nieuws' starred news nieuws met ster labeled news gelabeld nieuws Automatically mark identical news as read Markeer automatisch identiek nieuws als gelezen Prevent accidental deletion of: Voorkom het per ongeluk verwijderen van: Enable cleanup on shutdown Opschonen bij het afsluiten aanzetten Maximum age of news in days to keep: Aantal dagen dat je het nieuws wilt bewaren: Maximum number of news to keep: Maximum aantal nieuwsberichten dat je wilt bewaren: Delete read news Verwijder gelezen nieuws Never delete unread news Verwijder nooit ongelezen nieuws Never delete starred news Verwijder nooit starred nieuws Never delete labeled news Verwijder nooit gelabeld nieuws Clean up 'Deleted' Opruimen "Verwijderd" Enable DB optimization (slower shutdown) Schakel DB optimalisatie in (Sluit trager) Reading Lezen Clean Up Opschonen New... Nieuw... Edit... Bewerk... Delete... Verwijder... Move up Verplaats Omhoog Move down Verplaats Omlaag Show when inactive main window Toon wanneer hoofdvenster inactief is Screen Scherm Transparency Doorzichtigheid Show titles feeds Toon Sterren Feeds Show icon feed Toon icon feed Show button 'Mark All News Read' Toon knop 'Markeer alle nieuws als gelezen' Show button 'Mark Read/Unread' Toon knop Markeer Gelezen/Ongelezen' Show button 'Open in External Browser' Toon knop 'Open in Externe Browser' Show button 'Delete News' Toon knop 'Verwijder Nieuws' Play sound for incoming new news Speel een geluid af voor inkomende nieuw nieuws Play Speel Display notification for incoming news Weergave melding voor inkomende nieuws Top Left Linksboven Top Right Rechtsboven Bottom Left Linksonder Bottom Right Rechtsonder Review Beoordelen Position Positie Show maximum of Toon maximum van item on page notification Kennisgeving van items op pagina Width list items Breedte van Items Lijst pixels pixels Close notification after Na kennisgeving sluiten Do not show notification in fullscreen mode Toon geen melding bij volledig scherm Display Toon Action mouse on news opening: Actie van muis op nieuws opening: Single Click: Enkele klik: Double Click: Dubbele klik: Middle Click: Middelste klik: Only show selected feeds: Toon alleen geselecteerde feeds: Notification Meldingen Sound Geluid Selection of feeds Selectie van feeds All Feeds Alle feeds Site Website User Gebruiker Password Wachtwoord Delete Verwijder Delete All Verwijder Alles Show Passwords Toon wachtwoorden Version Versie Author Auteur Contact Kontakt Choose language: Kies taal: Type Soort Font Lettertype Feeds list font Lijst van feed lettertype News list font Lijst van Nieuws lettertype News title font Nieuws titel lettertype News text font Nieuws text lettertype Notification font Melding van lettertype Change... Verander... Reset Herstel Feeds list color Lijst van feed kleuren Feeds list background Lijst van feed achtergrond News list color Lijst van nieuws kleuren News list background Lijst van nieuws achtergrond Focused news color Gericht nieuws kleur Focused news background color Gericht nieuws achtergrond kleur Link color Link kleur Title color Titel kleur Date color Datum kleur Author color Auteur kleur News text color Kleur tekst van nieuws News title background Nieuws titel achtergrond News background Nieuws achtergrond Feed with new news Feed met nieuw nieuws Count of unread news in feeds tree Telling van ongelezen nieuws in feed structuur Disabled feed Feed uitzetten Alternating row colors Afwisselend rijkleuren Notification text color Melding van tekst kleur Notification background color Melding van achtergrondkleur Auto load images in news view Toon automatisch de afbeeldingen in het nieuws Text color of new news Tekstkleur van nieuw nieuws Show feeds tree toggle Toon feeds schakel structuur Clear new status when minimize to tray Wis de nieuwe status en minimaliseer naar systeemvak Set focus on the last opened news Stel focus in op laatst geopende nieuws Set focus at the top of news list Stel focus in op de top van de nieuwslijst Set focus on the unread news Stel focus in op ongelezen nieuws Open the news Open het nieuws Default news filter: Standaard nieuws filter: Action on feed opening: Aktie op feed opening: Show news description instead of loading web page Toon nieuws beschrijving in plaats van webpagina laden Text color of unread news Tekstkleur van ongelezen nieuws Focused feed color Gerichte feed kleur Focused feed background color Gerichte feed achtergrond kleur Standard Standaard Fixed Vast Serif Serif Sans Serif Sans Serif Cursive Cursief Fantasy Fantasie Default font size Standaard lettertype grootte Fixed font size Vast lettertype grootte Minimum font size Minimale lettertype grootte Minimum logical font size Minimale logische lettertype grootte Font families: Lettertype families: Font sizes: Lettertype grootte: Fonts Lettertypen Fonts Browser Lettertype Browser Colors Kleuren Filter Filter Action Actie Description Omschrijving Shortcut Sneltoets Shortcut: Sneltoets: Open File... Open Bestand... Select Style Sheet File Selekteer Stylesheet bestand Open Directory... Open Map... Add site to whitelist Voeg website toe aan wittelijst Site without 'http://' (ex. youtube.com) Website zonder 'http://' (ex. youtube.com) QAbstractSpinBox &Step up &Stap omhoog Step &down Stap &omlaag &Select All &Selecteer Alles QDialogButtonBox Close Sluit Cancel Annuleer &Yes &Ja &No &Nee QFtp Not connected Geen verbinding Host %1 not found Host %1 niet gevonden Connection refused to host %1 Verbinding met host geweigerd %1 Connection timed out to host %1 Verbinding onderbroken naar host %1 Connected to host %1 Verbinding met host %1 Connection refused for data connection Verbinding geweigerd voor gegevensverbinding Unknown error Onbekende fout Connecting to host failed: %1 Verbinding met host mislukt: %1 Login failed: %1 Aanmelden mislukt: %1 Listing directory failed: %1 Vermelding map mislukt: %1 Changing directory failed: %1 Veranderen van map mislukt: %1 Downloading file failed: %1 Downloaden bestand mislukt: %1 Uploading file failed: %1 Uploaden bestand mislukt: %1 Removing file failed: %1 Verwijderen bestand mislukt: %1 Creating directory failed: %1 Aanmaken map mislukt: %1 Removing directory failed: %1 Verwijderen map mislukt: %1 Connection closed Verbinding gesloten QLineEdit &Undo &Maak ongedaan &Redo &Herhaal Cu&t Kni&p &Copy &Kopieer &Paste &Plakken Delete Verwijder Select All Selecteer Alles QMultiInputContext Select IM Selecteer IM QObject Cannot start external program Kan externe programma niet starten Cannot start external program! %1 Kan externe programma niet starten! %1 Error Fout QTextControl &Undo &Maak ongedaan &Redo &Herhaal Cu&t Kni&p &Copy &Kopieer &Paste &Plakken Delete Verwijder Select All Selecteer Alles Copy &Link Location Kopieer &Link locatie QWizard Cancel Annuleer < &Back &Terug &Finish &Afronden &Next > &Volgende > RSSDetectionWidget Untitled feed Naamloze feed RequestFeed Server requires authentication! Server vereist verificatie! Server replied: Not Found! Server antwoorde: Niet gevonden! Redirect error! Fout doorsturen! Request timeout! Aanvraag mislukt! SQLiteDriver Error opening database Fout bij het openen databank Error closing database Fout bij het sluiten databank Unable to begin transaction Kan de transactie niet starten Unable to commit transaction Kan de transactie niet bevestigen Unable to rollback transaction Kan de transactie niet terugdraaien SQLiteResult Unable to fetch row Kan regel niet ophalen No query Geen vraag Unable to execute statement Kan de instructie niet uitvoeren Unable to execute multiple statements at a time Kan meerdere instructies niet tegelijk uitvoeren Unable to reset statement Kan de instructie niet resetten Unable to bind parameters Niet in staat om parameters te binden Parameter count mismatch Aantal parameters klopt niet SslErrorDialog SSL Certificate Error! SSL Certificaat fout! Only for this session Alleen voor deze sessie UpdateAppDialog Check for Updates Controleer op updates Checking for updates... Controleren op updates... Loading history... Laden geschiedenis... Don't remind about this version Niet meer herinneren aan deze versie &Install &Installeer You already have the latest version Je hebt al de laatste versie A new version of QuiteRSS is available! Een nieuwe versie van QuiteRRS is beschikbaar! Click here to go to the download page Klik hier om naar de download pagina te gaan Your version is: Uw versie is: Current version is: Huidige versie is: Error checking updates Fout bij controle op nieuwere versie quiterss-0.18.3/lang/quiterss_pl.ts000066400000000000000000005512301265173051100173340ustar00rootroot00000000000000 AboutDialog About O programie Revision Rewizja Version Wersja QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS jest miÄ™dzy-platformowym czytnikiem wiadomoÅ›ci RSS/Atom Includes: Zawiera: Application directory: Katalog aplikacji: Resource directory: Katalog zasobów: Data directory: Katalog danych: Backup directory: Katalog kopii zapasowej: Database file: Plik bazy danych: Settings file: Plik ustawieÅ„: Log file: Plik logów: Authors Autorzy History Historia License Licencja Information Informacje AdBlockAddSubscriptionDialog Add Subscription Dodaj subskrypcjÄ™ Title: TytuÅ‚: Address: Adres: Add new subscription to AdBlock: Dodaj nowÄ… subskrypcjÄ™ do AdBlock: AdBlockCustomList Custom Rules ReguÅ‚y użytkownika AdBlockDialog AdBlock Configuration Ustawienia AdBlock Enable AdBlock Włącz AdBlock Search... Szukaj... Options Opcje AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Używaj tylko istotnÄ… część EasyList (ze wzglÄ™du na wydajność) Add Rule Dodaj regułę Remove Rule UsuÅ„ regułę Add Subscription Dodaj SubskrypcjÄ™ Remove Subscription UsuÅ„ SubskrypcjÄ™ Update Subscriptions Uaktualnij Subskrypcje Learn about writing rules... Czytaj o pisaniu reguÅ‚... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock umożliwia blokowanie niechcianych treÅ›ci na stronach internetowych AdBlock AdBlock Show AdBlock &Settings Pokaż &Ustawienia AdBlock Disable on %1 Wyłącz na %1 Disable only on this page Wyłącz tylko na tej stronie Blocked Popup Windows Zablokowane wyskakujÄ…ce Popup-y %1 with (%2) %1 z (%2) No content blocked Treść nie zablokowana Blocked URL (AdBlock Rule) - click to edit rule Zablokowany URL (ReguÅ‚a AdBlock) - kliknij aby edytować regułę AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Nie można wczytać subskrypcji! AdBlockTreeWidget Add Rule Dodaj Regułę Remove Rule UsuÅ„ Regułę Add Custom Rule Dodaj Regułę Użytkownika Please write your rule here: Wpisz wÅ‚asnÄ… regułę tutaj: %1 (recently updated) %1 (ostatnio uaktualnione) %1 (Error: %2) %1 (Błąd: %2) AddFeedWizard Add Feed Dodaj kanaÅ‚ Create New Feed Utwórz nowy kanaÅ‚ Use title of the feed as displayed name Użyj tytuÅ‚u kanaÅ‚u jako wyÅ›wietlanej nazwy Server requires authentication: Serwer wymaga uwierzytelnienia: Username: Użytkownik: Password: HasÅ‚o: Feed URL or website address: URL kanaÅ‚u lub adres strony: Feeds KanaÅ‚y All Feeds Wszystkie kanaÅ‚y New Folder... Nowy folder... Displayed name: WyÅ›wietlana nazwa: Location: Lokalizacja: URL error! Błąd URL! Duplicate feed! Zduplikowany kanaÅ‚! Can't find feed URL! Nie można znaleźć adresu URL kanaÅ‚u! Request failed! Żądanie nie powiodÅ‚o siÄ™! AddFolderDialog Add Folder Dodaj folder Feeds KanaÅ‚y All Feeds Wszystkie KanaÅ‚y Name: Nazwa: Location: Lokalizacja: AuthenticationDialog Save password Zapisz hasÅ‚o Authorization required Wymagana autoryzacja Server: Serwer: Message: Wiadomość: Username: Użytkownik: Password: HasÅ‚o: CategoriesTreeWidget Unread Nieprzeczytane Starred Oznaczone gwiazdkÄ… Deleted UsuniÄ™te Labels Etykiety Open in New Tab Otwórz w nowej zakÅ‚adce Clear 'Deleted' Wyczyść 'UsuniÄ™te' Mark Read Oznacz jako przeczytane CleanUpWizard Clean Up UporzÄ…dkuj Choose Feeds Wybierz kanaÅ‚y All Feeds Wszystkie kanaÅ‚y Clean Up Options Opcje porzÄ…dkowania Maximum age of news in days to keep: Maksymalny wiek wiadomoÅ›ci w dniach do pozostawienia: Maximum number of news to keep: Maksymalna liczba wiadomoÅ›ci do pozostawienia: Delete read news UsuÅ„ przeczytane wiadomoÅ›ci Never delete unread news Nigdy nie usuwaj nieprzeczytanych wiadomoÅ›ci Never delete starred news Nigdy nie usuwaj wiadomoÅ›ci oznaczonych gwiazdkÄ… Never delete labeled news Nigdy nie usuwaj wiadomoÅ›ci oznaczonych etykietÄ… Clean up 'Deleted' UporzÄ…dkuj 'UsuniÄ™te' Purge DB Wyczyść BazÄ™ Danych Totally remove records that had marked 'deleted' from DB. Ancient news could reappear CaÅ‚kowicie usuÅ„ rekordy oznaczone jako 'usuniÄ™te' z DB. Starsze wiadomoÅ›ci mogÄ… pojawić siÄ™ ponownie Information Informacja Clean Up wizard deleted %1 news UporzÄ…dkuj: usuniÄ™to %1 wiadomoÅ›ci ClickToFlash Object blocked by ClickToFlash Obiekt zablokowany przez 'Kliknij na Flash' Hide object Ukryj obiekt Add '%1' to whitelist Dodaj '%1' do biaÅ‚ej listy CustomizeToolbarDialog Customize Main Toolbar Dostosuj główny pasek narzÄ™dzi Customize Feeds Toolbar Dostosuj pasek kanałów Customize News Toolbar Dostosuj pasek wiadomoÅ›ci Load images Wczytuj obrazy Separator Separator Icon Ikona Text Tekst Text Beside Icon Tekst obok ikony Text Under Icon Tekst pod ikonÄ… Big Duży Normal Normalny Small MaÅ‚y Style: Styl: Icon Size: Rozmiar Ikony: Add Dodaj Remove UsuÅ„ Move up PrzesuÅ„ w górÄ™ Move down PrzesuÅ„ w dół Default DomyÅ›lnie DownloadItem Remaining time unavailable PozostaÅ‚y czas nieznany Error: Cannot write to file! Błąd: Nie można zapisać pliku! Error: Błąd: few seconds kilka sekund seconds sekund minutes minut hours godzin Unknown size Nieznany rozmiar Unknown speed Nieznana prÄ™dkość %2 - unknown size (%3) %2 - nieznany rozmiar (%3) Remaining %1 - %2 of %3 (%4) PozostaÅ‚o %1 - %2 z %3 (%4) Cancelled - %1 Anulowano - %1 Delete file UsuÅ„ plik Do you want to also delete downloaded file? Czy chcesz także usunąć Å›ciÄ…gniÄ™ty plik? Open File Otwórz plik Open Folder Otwórz folder Copy Download Link Kopiuj link pobierania Cancel Downloading Anuluj pobieranie Remove UsuÅ„ Cancelled Anulowano Error Błąd Not found Nie znaleziono Sorry, the file %1 was not found! Przepraszamy, plik %1 nie zostaÅ‚ znaleziony! DownloadManager Clear Wyczyść File %1 (*.%2) Plik %1 (*.%2) All Files (*.*) Wszystkie pliki (*.*) Save As... Zapisz jako... Executable: Wykonywanie: Arguments: Argumenty: FeedPropertiesDialog Properties WÅ‚aÅ›ciwoÅ›ci General Ogólne Columns Kolumny Authentication Uwierzytelnianie Status Status Title: TytuÅ‚: Homepage: Strona główna: Feed URL: Adres URL kanaÅ‚u: Load Title Wczytaj tytuÅ‚ Load Favicon Wczytaj favikonÄ™ Select Icon... Wybierz ikonÄ™... Select Icon Wybierz ikonÄ™ Disable update Wyłącz aktualizacje Automatically update every Automatycznie uaktualniaj co seconds sekund minutes minut hours godzin Starred Ulubione Load images Wczytuj obrazy Display in new tab on startup WyÅ›wietl w nowej zakÅ‚adce przy starcie Show news' description instead of loading web page Pokaż opis wiadomoÅ›ci zamiast Å‚adować stronÄ™ www Automatically delete duplicate news Automatycznie usuwaj duplikaty wiadomoÅ›ci Display WyÅ›wietl Reading Czytanie Enable JavaScript Włącz JavaScript Right-to-left layout UkÅ‚ad od prawej do lewej Ascending RosnÄ…co Descending MalejÄ…co Sort by: Sortuj po: Add Dodaj Remove UsuÅ„ Move up PrzesuÅ„ w górÄ™ Move down PrzesuÅ„ w dół Default DomyÅ›lnie Server requires authentication: Serwer wymaga uwierzytelnienia: Username: Użytkownik: Password: HasÅ‚o: Feeds count: Liczba kanałów: Description: Opis: Status: Status: Created: Utworzony: Last update: Ostatnia aktualizacja: News count: Ilość wiadomoÅ›ci: Good Dobry Long ago ;-) Dawno temu ;-) new nowych unread nieprzeczytanych Image files Pliki graficzne Select Image Wybierz obraz Load icon: can't open a file! Wczytywanie ikony: nie można otworzyć pliku! FilterRulesDialog Filter Rules ReguÅ‚y filtrowania Feeds KanaÅ‚y All Feeds Wszystkie kanaÅ‚y Filter name: Nazwa filtra: Match all news Oznacz wszystkie wiadomoÅ›ci Match all conditions Dopasuj wszystkie warunki Match any condition Dowolny warunek Perform these actions: Wykonaj czynnoÅ›ci: Please enter name for the filter. ProszÄ™ wpisać nazwÄ™ filtra. Please enter search condition for the news filter. ProszÄ™ wpisać regułę wyszukiwania dla filtra wiadomoÅ›ci. FindFeed Find Name Znajdź nazwÄ™ Find Link Znajdź link FindTextContent Find in News Znajdź w WiadomoÅ›ciach Find in Titles Znajdź w TytuÅ‚ach Find in Authors Znajdź w Autorzy Find in Categories Znajdź w Kategoriach Find in Descriptions Znajdź w opisach Find in Links Znajdź w linkach Find in Browser Znajdź w przeglÄ…darce FtpDownloader Canceled! Anulowano! ItemAction Mark News as Read Oznacz wiadomość jako przeczytanÄ… Add Star Dodaj gwiazdkÄ™ Delete UsuÅ„ Add Label Dodaj etykietÄ™ Play a Sound Odtwórz dźwiÄ™k Show News in Notifier Pokaż wiadomoÅ›ci w powiadomieniu Browse PrzeglÄ…daj Play Odtwórz Add Action Dodaj akcjÄ™ Delete Action UsuÅ„ akcjÄ™ Open File... Otwórz plik... ItemCondition Title TytuÅ‚ Description Opis Author Autor Category Kategoria State Stan Link Link News WiadomoÅ›ci New Nowy Read Czytaj Starred Ulubione Add Condition Dodaj warunek Delete Condition UsuÅ„ warunek contains zawiera doesn't contains nie zawiera is równa siÄ™ isn't nie równa siÄ™ begins with zaczyna siÄ™ ends with koÅ„czy siÄ™ Regular expressions Wyrażenia regularne LabelDialog New Label Nowa etykieta Load icon... Wczytaj ikonÄ™... Default DomyÅ›lnie Select color... Wybierz kolor... Name: Nazwa: Icon: Ikona: Color text: Kolor tekstu: Color background: Kolor tÅ‚a: Image files Pliki graficzne Select Image Wybierz obraz Load icon: can't open a file! Wczytywanie ikony: nie można otworzyć pliku! MainApplication Saving data... Zapisywanie danych... MainWindow &AdBlock &AdBlock Hide Categories Ukryj kategorie Show Categories Pokaż kategorie Select OPML-File Wybierz Plik OPML OPML-Files (*.%1 *.%2) Pliki OPML (*.%1 *.%2) Import canceled Import anulowany Import: can't open a file Import: nie można otworzyć pliku OPML-Files (*.%1) Pliki OPML (*.%1) Export canceled Eksport anulowany Export: can't open a file Eksport: nie można otworzyć pliku Unread: %1 Nieprzeczytane: %1 All: %1 Wszystkie: %1 (Browser) (PrzeglÄ…darka) New News: %1 Nowe wiadomoÅ›ci: %1 Unread News: %1 Nieprzeczytane wiadomoÅ›ci: %1 &Add &Dodaj Add New Feed Dodaj nowy kanaÅ‚ &Feed... &KanaÅ‚... F&older... &Folder... Add New Folder Dodaj nowy folder Open in New Tab Otwórz w nowej zakÅ‚adce &Delete... &UsuÅ„... Delete Selected Feed UsuÅ„ zaznaczony kanaÅ‚ &Import Feeds... &Importuj KanaÅ‚y... Import Feeds from OPML File Importuj kanaÅ‚y z pliku OPML &Export Feeds... &Eksportuj kanaÅ‚y... Export Feeds to OPML File Eksportuj kanaÅ‚y do pliku OPML E&xit &WyjÅ›cie Update Feed Uaktualnij kanaÅ‚ Update Current Feed Aktualizuj aktualny kanaÅ‚ Update All Uaktualnij wszystko Update All Feeds Uaktualnij wszystkie kanaÅ‚y Mark All Feeds Read Oznacz wszystkie kanaÅ‚y jako przeczytane Mark Read/Unread Oznacz jako Przeczytane/Nieprzeczytane Mark Current News Read/Unread Oznacz wiadomość jako przeczytanÄ…/nieprzeczytanÄ… Mark All News Read Oznacz wszystkie wiadomoÅ›ci jako przeczytane Downloads Pobieranie Clean Up... UporzÄ…dkuj... News Filters... Filtry wiadomoÅ›ci... Filter News... Filtruj wiadomoÅ›ci... Options... Opcje... Open Options Dialog Otwórz okno Opcji Filter Feeds Filtr kanałów Show All Pokaż wszystko Show New Pokaż nowe Show Unread Pokaż nieprzeczytane Show Starred Feeds Pokaż kanaÅ‚y oznaczone gwiazdkÄ… Show Not Working Feeds Pokaż niedziaÅ‚ajÄ…ce kanaÅ‚y Filter News Filtr wiadomoÅ›ci Show Starred Pokaż oznaczone gwiazdkÄ… Show Not Starred Pokaż nieoznaczone gwiazdkÄ… Show Unread or Starred Pokaż nieprzeczytane lub oznaczone gwiazdkÄ… Show Last Day Pokaż ostatni dzieÅ„ Show Last 7 Days Pokaż ostatnie 7 dni About... O Nas... Show 'About' Dialog Pokaż okno 'O nas' Check for Updates... Sprawdź aktualizacje... Report a Problem... ZgÅ‚oÅ› problem... Open News Otwórz wiadomoÅ›ci Open in Browser Otwórz w przeglÄ…darce Open in External Browser Otwórz w zewnÄ™trznej przeglÄ…darce Open News in External Browser Otwórz wiadomość w zewnÄ™trznej przeglÄ…darce Open News in New Tab Otwórz wiadomość w nowej zakÅ‚adce Open in Background Tab Otwórz w zakÅ‚adce w tle Open News in Background Tab Otwórz wiadomość w zakÅ‚adce w tle Star Gwiazdka Mark News Star Oznacz wiadomość gwiazdkÄ… Delete UsuÅ„ Delete Selected News UsuÅ„ zaznaczone wiadomoÅ›ci Delete All News UsuÅ„ wszystkie wiadomoÅ›ci Delete All News from List UsuÅ„ wszystkie wiadomoÅ›ci z listy Restore Przywróć Restore News Przywróć wiadomoÅ›ci Copy Link Kopiuj link Restore last deleted news Przywróć ostatniÄ… usuniÄ™tÄ… wiadomość Mark Read Oznacz jako przeczytane Mark Feed Read Oznacz kanaÅ‚ jako przeczytany Properties WÅ‚aÅ›ciwoÅ›ci &File &Plik Count Unread News Policz nieprzeczytane wiadomoÅ›ci Count All News Policz wszystkie wiadomoÅ›ci Last Update Ostatnia Aktualizacja Reset browser zoom Zresetuj zoom przeglÄ…darki Print Web Page Drukuj stronÄ™ Preview Web Page PodglÄ…d strony Save page in database Zapisz stronÄ™ w bazie danych Save page in database instead of news description Zapisz stronÄ™ w bazie zamiast opisu Confirm Delete Potwierdź usuniÄ™cie Are you sure to delete selected elements? Czy na pewno usunąć wybrane elementy? Menu Menu Add Feed... Dodaj kanaÅ‚... &Create Backup... Wykonaj &KopiÄ™ zapasowÄ…... S&how Menu Bar Pokaż pasek menu Stop Update Feeds Zatrzymaj aktualizacjÄ™ kanałów Open News Description RozwiÅ„ opis wiadomoÅ›ci Copy News Link Kopiuj link wiadomoÅ›ci &View &Widok Fee&ds &KanaÅ‚y &News W&iadomoÅ›ci &Browser P&rzeglÄ…darka &Tools &NarzÄ™dzia &Help Po&moc Main Toolbar Pasek narzÄ™dzi Customize Toolbar Dostosuj pasek Main Toolbar... Pasek narzÄ™dzi... Customize Toolbar... Dostosuj pasek narzÄ™dzi... Feeds Toolbar... Pasek kanałów... News Toolbar... Pasek wiadomoÅ›ci... Lock Toolbar Zablokuj pasek narzÄ™dzi Hide Toolbar Ukryj pasek narzÄ™dzi Layout UkÅ‚ad Classic Klasyczny Newspaper Gazeta Application Style Styl aplikacji System System System2 System2 Green Zielony Orange PomaraÅ„czowy Purple Purpurowy Pink Różowy Gray Szary Browser Position Lokalizacja przeglÄ…darki Top Góra Bottom Dół Right Prawa Left Lewa Show Window Pokaż okno Previous Feed Poprzedni kanaÅ‚ Next Feed NastÄ™pny kanaÅ‚ Previous News Poprzednia wiadomość Next News NastÄ™pna wiadomość News Page Up WiadomoÅ›ci - strona wyżej News Page Down WiadomoÅ›ci - strona niżej Next Unread News NastÄ™pna nieprzeczytana wiadomość Previous Unread News Poprzednia nieprzeczytana wiadomość Switch Focus to Next Panel Przełącz do kolejnego panelu Switch Focus to Next Panel (Tree Feeds, List News, Browser) Przełącz do kolejnego panelu (Drzewo kanałów, Lista wiadomoÅ›ci, PrzeglÄ…darka) Switch Focus to Previous Panel Przełącz do poprzedniego panelu Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Przełącz do poprzedniego panelu (Drzewo kanałów, PrzeglÄ…darka, Lista wiadomoÅ›ci) Show/Hide Tree Feeds Pokaż/Ukryj drzewo kanałów Minimize to Tray Minimalizuj do zasobnika Minimize Application to Tray Minimalizuj aplikacjÄ™ do zasobnika Columns Kolumny Show Indentation Pokaż wciÄ™cia Search Feed Szukaj kanaÅ‚u Zoom Zoom Zoom In PowiÄ™ksz Zoom in in browser PowiÄ™ksz w przeglÄ…darce Zoom Out Zmniejsz Zoom out in browser Zmniejsz w przeglÄ…darce 100% 100% Print... Drukuj... Print Preview... PodglÄ…d wydruku... Page up (Browser) PrzewiÅ„ stronÄ™ w gorÄ™ (PrzeglÄ…darka) Page down (Browser) PrzewiÅ„ stronÄ™ w dół (PrzeglÄ…darka) Save As... Zapisz jako... Save Page As... Zapisz stronÄ™ jako... Show/Hide Pokaż/Ukryj Feeds Toolbar Pasek kanałów News Toolbar Pasek wiadomoÅ›ci Browser Toolbar Pasek przeglÄ…darki Panel Categories Panel kategorii Status Bar Pasek stanu Full Screen PeÅ‚ny ekran Stay On Top Zawsze na wierzchu Categories Kategorie Label Etykieta Show labels menu Pokaż menu etykiet Close Tab Zamknij zakÅ‚adkÄ™ Close Other Tabs Zamknij pozostaÅ‚e zakÅ‚adki Close All Tabs Zamknij wszystkie zakÅ‚adki Switch to next tab Przełącz do nastÄ™pnej zakÅ‚adki Switch to previous tab Przełącz do poprzedniej zakÅ‚adki Unread Nieprzeczytane Starred Oznaczone gwiazdkÄ… Deleted UsuniÄ™te Labels Etykiety Decrease news list/increase browser Zmniejsz listÄ™ wiadomoÅ›ci/powiÄ™ksz przeglÄ…darkÄ™ Increase news list/decrease browser PowiÄ™ksz listÄ™ wiadomoÅ›ci/zmniejsz przeglÄ…darkÄ™ Find Znajdź Open Homepage Feed Otwórz stronÄ™ kanaÅ‚u Sort by Name Sortuj po nazwie Collapse All Folders ZwiÅ„ wszystkie foldery Expand All Folders RozwiÅ„ wszystkie foldery Next Folder NastÄ™pny folder Previous Folder Poprzedni folder Expand Folder RozwiÅ„ folder Setting Page: Labels Strona ustawieÅ„: Etykiety Share UdostÄ™pnij Sort By Sortuj po: Ascending RosnÄ…co Descending MalejÄ…co Check for updates Sprawdź aktualizacje A new version of QuiteRSS... Nowa wersja QuiteRSS... Loading... Wczytywanie... Web Page Strona www Save As Zapisz jako HTML-Files (*.%1) Pliki HTML (*.%1) Text files (*.%2) Pliki tekstowe (*.%2) Save As: can't open a file Zapisz jako: nie można otworzyć pliku Choose Directory Wybierz katalog Important Ważne Work Praca Personal Osobiste To Do Do zrobienia Later Później Amusingly WesoÅ‚e NetworkManager SSL Certificate Error! Błąd certyfikatu SSL! The "%1" server has the following errors in the SSL certificate: Serwer "%1" posiada nastÄ™pujÄ…ce błędy w certyfikacie SSL: <b>Organization: </b> <b>Organizacja: </b> <b>Domain Name: </b> <b>Domena: </b> <b>Expiration Date: </b> <b>Data wygaÅ›niÄ™cia:</b> <b>Error: </b> <b>Błąd: </b> Would you like to make an exception for this certificate? Czy chcesz dodać wyjÄ…tek dla tego certyfikatu? NewsFiltersDialog News Filters Filtry wiadomoÅ›ci Feeds KanaÅ‚y Filter Name Nazwa Filtra New... Nowy... Edit... Edytuj... Delete... UsuÅ„... Move up PrzesuÅ„ w górÄ™ Move down PrzesuÅ„ w dół Run Filter Uruchom filtr Delete Filter UsuÅ„ filtr Are you sure you want to delete the filter '%1'? JesteÅ› pewny że chcesz usunąć filtr '%1'? NewsHeader Icon Feed Ikona kanaÅ‚u Title TytuÅ‚ Published Opublikowano Received Odebrano Author Autor Category Kategoria Read Czytaj Star Gwiazdka Label Etykieta Feed Title TytuÅ‚ KanaÅ‚u Link Link NewsItem Mark Read/Unread Oznacz jako Przeczytane/Nieprzeczytane Delete News UsuÅ„ wiadomoÅ›ci NewsTabWidget Loading... (%p%) Wczytywanie... (%p%) Home Oryginalna wiadomość Open Page in External Browser Otwórz stronÄ™ w zewnÄ™trznej przeglÄ…darce Open Link in External Browser Otwórz link w zewnÄ™trznej przeglÄ…darce Open Link Otwórz link Open in New Tab Otwórz w nowej zakÅ‚adce Save Link... Zapisz link... Save Image... Zapisz obrazek... Copy Link Kopiuj link Copy Kopiuj Go Back Cofnij Go Forward Naprzód Stop Stop Reload OdÅ›wież Copy Image Kopiuj obrazek Copy Image Address Kopiuj adres obrazka Load Images Wczytuj zdjÄ™cia Auto Load Images to News View Automatycznie wczytuj zdjÄ™cia do widoku wiadomoÅ›ci No Load Images Nie wczytuj zdjęć No Load Images to News View Nie wczytuj zdjęć do widoku wiadomoÅ›ci Close Tab Zamknij zakÅ‚adkÄ™ Auto Load Images in News View Auto Load Images to News View Don't Load Images Nie wczytuj obrazów Don't Load Images in News View Nie wczytuj obrazów w podglÄ…dzie wiadomoÅ›ci Comments Komentarze Author: %1 Autor: %1 audio audio video wideo media media Link to Link do Mark Read/Unread Oznacz jako Przeczytane/Nieprzeczytane Mark News Star Oznacz wiadomoÅ›ci gwiazdkÄ… Label Etykieta Share UdostÄ™pnij Open News in External Browser Otwórz wiadomość w zewnÄ™trznej przeglÄ…darce Delete UsuÅ„ NotificationWidget Close Zamknij Mark All News Read Oznacz wszystkie wiadomoÅ›ci jako przeczytane Previous Page Poprzednia Strona Next Page NastÄ™pna Strona Incoming News: %1 Odebrane WiadomoÅ›ci: %1 Page %1 of %2 Strona %1 z %2 OptionsDialog Options Opcje General Ogólne System Tray Pasek zadaÅ„ Network Connections Połączenia sieciowe Browser PrzeglÄ…darka Feeds KanaÅ‚y Labels Etykiety Notifications Powiadomienia Passwords HasÅ‚a Language JÄ™zyk Fonts & Colors Czcionki i kolory Keyboard Shortcuts Skróty klawiaturowe Warning: key is already assigned to Uwaga: przysick jest już przypisany do Show splash screen on startup Pokaż ekran powitalny podczas startu Reopen last opened feeds on startup Otwórz ostatnio otwarty kanaÅ‚ przy starcie Open new tab next to active Otwórz nowÄ… zakÅ‚adkÄ™ obok aktywnej Hide feeds tree when opening tabs Ukryj drzewo kanałów kiedy otwierasz zakÅ‚adki Show default rss-icon instead of favourite one Pokaż domyÅ›lne ikony rss zamiast ulubionych Automatically collapse folders Automatyczne zwijanie folderów Show close button on tab Pokaż przycisk zamykania na zakÅ‚adce Automatically check for updates Automatycznie sprawdzaj uaktualnienia Help improve QuiteRSS by sending usage information Pozwól ulepszyć QuiteRSS wysyÅ‚ajÄ…c informacje o użyciu Store a DB in memory (requires program restart) Przechowuj DB w pamiÄ™ci (wymaga restartu) Save DB stored in memory to file every Zapisz DB do pliku co minutes minut Run QuiteRSS at Windows startup Uruchom QuiteRSS podczas startu systemu Windows Show system tray icon Pokaż ikonÄ™ w zasobniku systemowym starting QuiteRSS uruchamiam QuiteRSS minimizing QuiteRSS minimalizujÄ™ QuiteRSS closing QuiteRSS zamykam QuiteRSS Show static icon Pokaż statycznÄ… ikonÄ™ Change icon for incoming new news ZmieÅ„ ikonÄ™ dla odebranych nowych wiadomoÅ›ci Show count of new news Pokaż liczbÄ™ nowych wiadomoÅ›ci Show count of unread news Pokaż liczbÄ™ nieprzeczytanych wiadomoÅ›ci Single click instead of double click for show window Pojedyncze klikniÄ™cie zamiast podwójnego aby pokazać okno Empty working set on minimize to tray Wyczyść obszar roboczy podczas minimalizacji do paska Move to the system tray when: PrzenieÅ› do zasobnika systemowego, gdy: Tray icon behavior: WyglÄ…d ikony w zasobniku: Direct connection to the Internet BezpoÅ›rednie połączenie z internetem System proxy configuration (if available) Systemowa konfiguracja proxy (jeÅ›li dostÄ™pna) Manual proxy configuration: RÄ™czne ustawienia proxy: Proxy server: Serwer proxy: Port: Port: Username: Użytkownik: Password: HasÅ‚o: Request timeout: MinÄ…Å‚ czas żądania: Number of requests: Ilość żądaÅ„: Number of retries: Ilość powtórzeÅ„: Options network requests when updating feeds (requires program restart): Opcje żądaÅ„ sieciowych podczas aktualizacji kanałów (wymaga restartu programu): Use embedded browser Użyj wbudowanej przeglÄ…darki Use external browser Używaj zewnÄ™trznej przeglÄ…darki Default external browser DomyÅ›lna zewnÄ™trzna przeglÄ…darka Following external browser: Inna zewnÄ™trzna przeglÄ…darka: Browse... PrzeglÄ…daj... Load images Wczytuj obrazy Enable JavaScript Włącz JavaScript Enable plug-ins Włącz pluginy Open links in embedded browser in background Otwórz linki we wbudowanej przeglÄ…darce w tle Open links in external browser in background (experimental) Otwórz linki w zewnÄ™trznej przeglÄ…darce w tle (funkcja eksperymentalna) Default zoom on pages: DomyÅ›lny zoom na stronach: Browser selection: Wybór przeglÄ…darki: External browser: ZewnÄ™trzna przeglÄ…darka: Content: Zawartość: User style sheet: Arkusz stylów użytkownika: Maximum pages in cache Maksymalna ilość stron w pamiÄ™ci podrÄ™cznej Store cache in: Przechowuj pamięć podrÄ™cznÄ… w: Maximum size of disk cache Maksymalny rozmiar pamiÄ™ci podrÄ™cznej na dysku MB MB Use disk cache Użyj pamiÄ™ci podrÄ™cznej dysku Allow local data to be set Pozwól na ustawienia danych lokalnych Keep local data only until quit application Przechowuj dane lokalne do zamkniÄ™cia aplikacji Block sites from setting any data Blokuj ustawienia ze stron Clear Wyczyść Cookies: Ciasteczka: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Kliknij na Flash to plugin który blokuje automatyczne Å‚adowanie zawartoÅ›ci Flash na stronie. Zawsze można zaÅ‚adować jÄ… rÄ™cznie, klikajÄ…c na ikonÄ™ włącz Flash. Use Click to Flash Użyj Kliknij na Flash Add... Dodaj... Remove... UsuÅ„... Ask where to save each file before downloading Pytaj, gdzie zapisać każdy plik przed pobraniem Download location: Lokalizacja pobrania: History Historia Click to Flash Kliknij na Flash Downloads Pobieranie Automatically update the feeds on startup Automatycznie aktualizuj kanaÅ‚y podczas startu Automatically update the feeds every Automatycznie uaktualniaj kanaÅ‚y co seconds sekund hours godziny Nothing to do Nic nie rób Dec Gru December GrudzieÅ„ Display format for date: Format wyÅ›wietlania daty: time: czas: Alternating row background colors Naprzemienne kolory tÅ‚a wierszy Simplified representation of date and time Uproszczona prezentacja daty i czasu Show All Pokaż wszystko Show New Pokaż nowe Show Unread Pokaż nieprzeczytane Show Starred Pokaż oznaczone gwiazdkÄ… Show Not Starred Pokaż nieoznaczone gwiazdkÄ… Show Unread or Starred Pokaż nieprzeczytane lub oznaczone gwiazdkÄ… Show Last Day Pokaż ostatni dzieÅ„ Show Last 7 Days Pokaż ostatnie 7 dni Style sheet for news: Arkusz stylów dla wiadomoÅ›ci: Mark news as read: Oznacz wiadomoÅ›ci jako przeczytane: on selecting. With timeout po wybraniu. Po czasie after switching to another news po przełączeniu do innej wiadomoÅ›ci Mark displayed news as read when switching feeds Oznacz wyÅ›wietlone wiadomoÅ›ci jako przeczytane podczas przełączania kanałów Mark displayed news as read when closing tab Oznacz wyÅ›wietlone wiadomoÅ›ci jako przeczytane podczas zamykania zakÅ‚adki Mark displayed news as read on minimize Oznacz wyÅ›wietlone wiadomoÅ›ci jako przeczytane po zminimalizowaniu Change behavior of action 'Next Unread News' ZmieÅ„ zachowanie 'NastÄ™pna nieprzeczytana wiadomość' starred news wiadomoÅ›ci oznaczonych gwiazdkÄ… labeled news wiadomoÅ›ci oznaczonych etykietÄ… Automatically mark identical news as read Automatycznie oznacz identyczne wiadomoÅ›ci jako przeczytane Prevent accidental deletion of: Zapobiegaj przypadkowemu usuniÄ™ciu: Enable cleanup on shutdown Włącz czyszczenie przy zamykaniu Maximum age of news in days to keep: Maksymalny wiek wiadomoÅ›ci w dniach do pozostawienia: Maximum number of news to keep: Maksymalna liczba wiadomoÅ›ci do pozostawienia: Delete read news UsuÅ„ przeczytane wiadomoÅ›ci Never delete unread news Nie usuwaj nieprzeczytanych wiadomoÅ›ci Never delete starred news Nigdy nie usuwaj wiadomoÅ›ci oznaczonych gwiazdkÄ… Never delete labeled news Nie usuwaj wiadomoÅ›ci oznaczonych etykietÄ… Clean up 'Deleted' UporzÄ…dkuj 'UsuniÄ™te' Enable DB optimization (slower shutdown) Włącz optymalizacjÄ™ bazy danych (wolniejsze zamykanie) Reading Czytanie Clean Up UporzÄ…dkuj New... Nowa... Edit... Edytuj... Delete... UsuÅ„... Move up PrzesuÅ„ w górÄ™ Move down PrzesuÅ„ w dół Show when inactive main window Pokaż gdy nieaktywne okno główne Screen Ekran Transparency Przezroczystość Show titles feeds Pokaż tytuÅ‚y kanałów Show icon feed Pokaż ikonÄ™ kanaÅ‚u Show button 'Mark All News Read' Pokaż przycisk 'Oznacz wiadomoÅ›ci jako przeczytane' Show button 'Mark Read/Unread' Pokaż przycisk 'Oznacz jako Przeczytane/Nieprzeczytane' Show button 'Open in External Browser' Pokaż przycisk 'Otwórz w zewnÄ™trznej przegladarce' Show button 'Delete News' Pokaż przycisk 'UsuÅ„ wiadomoÅ›ci' Play sound for incoming new news Odtwarzaj dźwiÄ™k dla nowych wiadomoÅ›ci Play Odtwórz Display notification for incoming news WyÅ›wietlaj powiadomienia o przychodzÄ…cych wiadomoÅ›ciach Top Left U góry po lewo Top Right U góry po prawo Bottom Left Na dole po lewo Bottom Right Na dole po prawo Review PodglÄ…d Position Lokalizacja Show maximum of Pokaż maksymalnie item on page notification przedmiotów na stronie Width list items Szerokość listy przedmiotów pixels pikseli Close notification after Zamknij powiadomienie po Do not show notification in fullscreen mode Nie pokazuj powiadomieÅ„ w trybie peÅ‚noekranowym Display WyÅ›wietl Action mouse on news opening: Akcja podczas otwierania wiadomoÅ›ci: Single Click: Pojedyncze klikniÄ™cie: Double Click: Podwójne klikniÄ™cie: Middle Click: Åšrodkowe klikniÄ™cie: Only show selected feeds: Pokaż tylko zaznaczone kanaÅ‚y: Notification Powiadomienie Sound DźwiÄ™k Selection of feeds Wybór kanałów All Feeds Wszystkie kanaÅ‚y Site Strona User Użytkownik Password HasÅ‚o Delete UsuÅ„ Delete All UsuÅ„ wszystko Show Passwords Pokaż hasÅ‚a Version Wersja Author Autor Contact Kontakt Choose language: Wybierz jÄ™zyk: Type Rodzaj Font Czcionka Feeds list font Czcionka listy kanałów News list font Czcionka listy wiadomoÅ›ci News title font Czcionka tytuÅ‚u wiadomoÅ›ci News text font Czcionka tekstu wiadomoÅ›ci Notification font Czcionka powiadomieÅ„ Change... ZmieÅ„... Reset Reset Feeds list color Kolor listy kanałów Feeds list background TÅ‚o listy kanałów News list color Kolor listy wiadomoÅ›ci News list background TÅ‚o listy wiadomoÅ›ci Focused news color Kolor aktywnej wiadomoÅ›ci Focused news background color TÅ‚o aktywnej wiadomoÅ›ci Link color Kolor linku Title color Kolor tytuÅ‚u Date color Kolor daty Author color Kolor autora News text color Kolor tekstu wiadomoÅ›ci News title background TÅ‚o tytuÅ‚u wiadomoÅ›ci News background TÅ‚o wiadomoÅ›ci Feed with new news KanaÅ‚y z nowymi wiadomoÅ›ciami Count of unread news in feeds tree Pokaż ilość nieprzeczytanych wiadomoÅ›ci w drzewie Disabled feed Nieaktywny kanaÅ‚ Alternating row colors Naprzemienne kolory wierszy Notification text color Kolor tekstu powiadomienia Notification background color TÅ‚o powiadomienia Auto load images in news view Automatycznie zaÅ‚aduj zdjÄ™cia w podglÄ…dzie wiadomoÅ›ci Text color of new news Kolor tekstu nowych wiadomoÅ›ci Show feeds tree toggle Pokaż drzewo kanałów Clear new status when minimize to tray Wyczyść nowy status kiedy minimalizujÄ™ do paska Set focus on the last opened news Ustaw na ostatnio otwartej wiadomoÅ›ci Set focus at the top of news list Ustaw na górze listy wiadomoÅ›ci Set focus on the unread news Ustaw na nieprzeczytanej wiadomoÅ›ci Open the news Otwórz wiadomość Default news filter: DomyÅ›lny filtr wiadomoÅ›ci: Action on feed opening: Akcja podczas otwierania kanaÅ‚u: Show news description instead of loading web page Pokaż opis wiadomoÅ›ci zamiast Å‚adować stronÄ™ www Text color of unread news Kolor tekstu nieprzeczytanych wiadomoÅ›ci Focused feed color Kolor zaznaczonego kanaÅ‚u Focused feed background color TÅ‚o aktywnego kanaÅ‚u Standard Standardowa Fixed O staÅ‚ej szerokoÅ›ci Serif Szeryfowa Sans Serif Bezszeryfowa Cursive Kursywa Fantasy Fantasy Default font size DomyÅ›lny rozmiar czcionki Fixed font size Ustalony rozmiar czcionki Minimum font size Minimalny rozmiar czcionki Minimum logical font size Minimalny logiczny rozmiar czcionki Font families: Czcionki: Font sizes: Rozmiary czcionki: Fonts Czcionka Fonts Browser Czcionka przeglÄ…darki Colors Kolory Filter Filtr Action Akcja Description Opis Shortcut Skrót Shortcut: Skrót: Open File... Otwórz Plik... Select Style Sheet File Wybierz plik arkusza stylów Open Directory... Otwórz katalog... Add site to whitelist Dodaj stronÄ™ do biaÅ‚ej listy Site without 'http://' (ex. youtube.com) Strona bez 'http://' (np. youtube.pl) QAbstractSpinBox &Step up &W górÄ™ Step &down W &dół &Select All &Zaznacz wszystko QDialogButtonBox Close Zamknij Cancel Anuluj &Yes &Tak &No &Nie QFtp Not connected Nie połączony Host %1 not found Host %1 nie znaleziony Connection refused to host %1 Połączenie odrzucone z hostem %1 Connection timed out to host %1 MinÄ…Å‚ czas połączenia z hostem %1 Connected to host %1 Połączony z hostem %1 Connection refused for data connection Połączenie odrzucone dla połączenia danych Unknown error Nieznany błąd Connecting to host failed: %1 Połączenie z hostem nieudane: %1 Login failed: %1 Logowanie nie powiodÅ‚o siÄ™:⎠%1 Listing directory failed: %1 Listowanie katalogów nieudane:⎠%1 Changing directory failed: %1 Zmiana katalogu nieudana:⎠%1 Downloading file failed: %1 Pobieranie pliku nie powiodÅ‚o siÄ™:⎠%1 Uploading file failed: %1 WysyÅ‚anie pliku nieudane: %1 Removing file failed: %1 UsuniÄ™cie pliku nieudane:⎠%1 Creating directory failed: %1 Tworzenie katalogu nieudane:⎠%1 Removing directory failed: %1 UsuniÄ™cie katalogu nieudane:⎠%1 Connection closed Połączenie zakoÅ„czone QLineEdit &Undo &Cofnij &Redo &Ponów Cu&t Wytnij &Copy &Kopiuj &Paste &Wklej Delete UsuÅ„ Select All Zaznacz wszystko QMultiInputContext Select IM Zaznacz IM QObject Cannot start external program Nie można uruchomić zewnÄ™trznego programu Cannot start external program! %1 Nie można uruchomić zewnÄ™trznego programu! % 1 Error Błąd QTextControl &Undo &Cofnij &Redo &Ponów Cu&t Wytnij &Copy &Kopiuj &Paste &Wklej Delete UsuÅ„ Select All Zaznacz wszystko Copy &Link Location Skopiuj &odsyÅ‚acz QWizard Cancel Anuluj < &Back < &Wstecz &Finish &ZakoÅ„cz &Next > &Dalej > RSSDetectionWidget Untitled feed KanaÅ‚ bez tytuÅ‚u RequestFeed Server requires authentication! Serwer wymaga uwierzytelniania! Server replied: Not Found! Odpowiedź serwera: Nie znaleziono! Redirect error! Błąd przekierowania! Request timeout! MinÄ…Å‚ czas żądania! SQLiteDriver Error opening database Błąd otwierania bazy danych Error closing database Błąd zamykania bazy danych Unable to begin transaction Nie można rozpocząć transakcji Unable to commit transaction Nie można zatwierdzić transakcji Unable to rollback transaction Nie można wycofać transakcji SQLiteResult Unable to fetch row Nie można pobrać wiersza No query Brak zapytania Unable to execute statement Nie można wykonać wyrażenia Unable to execute multiple statements at a time Nie można wykonać wielu wyrażeÅ„ naraz Unable to reset statement Nie można zresetować wyrażenia Unable to bind parameters Nie można powiÄ…zać parametrów Parameter count mismatch NiewÅ‚aÅ›ciwa liczba parametrów SslErrorDialog SSL Certificate Error! Błąd certyfikatu SSL! Only for this session Tylko na czas tej sesji UpdateAppDialog Check for Updates Sprawdź aktualizacje Checking for updates... Sprawdzanie aktualizacji... Loading history... Wczytywanie historii... Don't remind about this version Nie przypominaj mi o tej wersji &Install &Instaluj You already have the latest version Używasz najnowszej wersji A new version of QuiteRSS is available! Nowa wersja QuiteRSS jest dostÄ™pna! Click here to go to the download page Kliknij tutaj aby przejść do strony pobierania Your version is: Twoja wersja to: Current version is: Najnowsza wersja to: Error checking updates Błąd sprawdzania aktualizacji quiterss-0.18.3/lang/quiterss_pt_BR.ts000066400000000000000000005520211265173051100177260ustar00rootroot00000000000000 AboutDialog About Sobre Revision Revisão Version Versão QuiteRSS is a open-source cross-platform RSS/Atom news reader O QuiteRSS é um software de código aberto multi-plataforma leitor de notícias RSS/Atom Includes: Inclui: Application directory: Pasta da aplicação: Resource directory: Pasta de recursos: Data directory: Pasta de dados: Backup directory: Diretório de backup: Database file: Arquivo da base de dados: Settings file: Arquivo de configurações: Log file: Arquivo de log: Authors Autores History Histórico License Licença Information Informações AdBlockAddSubscriptionDialog Add Subscription Adicionar Assinatura Title: Título: Address: Endereço: Add new subscription to AdBlock: Adicionar nova assinatura ao AdBlock: AdBlockCustomList Custom Rules Regras Personalizadas AdBlockDialog AdBlock Configuration Configurações do AdBlock Enable AdBlock Ativar o AdBlock Search... Pesquisar... Options Opções AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Usar só a parte essencial da Lista Fácil (por razões de desempenho) Add Rule Adicionar Regra Remove Rule Remover Regra Add Subscription Adicionar Assinatura Remove Subscription Remover Assinatura Update Subscriptions Atualizar as Assinaturas Learn about writing rules... Aprender a gravar regras... AdBlockIcon AdBlock lets you block unwanted content on web pages O AdBlock deixa bloquear o conteúdo indesejado em páginas da web AdBlock AdBlock Show AdBlock &Settings Mostrar as &Opções do AdBlock Disable on %1 Desativar no %1 Disable only on this page Desativar só nesta página Blocked Popup Windows Janelas Popup Bloqueadas %1 with (%2) %1 com (%2) No content blocked Nenhum conteúdo bloqueado Blocked URL (AdBlock Rule) - click to edit rule URL Bloqueada (Regra do AdBlock) - clique para editar a regra AdBlockManager EasyList Lista Fácil AdBlockSubscription Cannot load subscription! Não é possível carregar a assinatura! AdBlockTreeWidget Add Rule Adicionar Regra Remove Rule Remover Regra Add Custom Rule Adicionar Regra Personalizada Please write your rule here: Por favor, grave sua regra aqui: %1 (recently updated) %1 (recentemente atualizado) %1 (Error: %2) %1 (Erro: %2) AddFeedWizard Add Feed Adicionar Feed Create New Feed Criar Novo Feed Use title of the feed as displayed name Usar o título do feed como nome de exibição Server requires authentication: O servidor requer autenticação: Username: Usuário: Password: Senha: Feed URL or website address: URL do Feed ou endereço do site: Feeds Feeds All Feeds Todos os Feeds New Folder... Nova Pasta... Displayed name: Nome a exibir: Location: Localização: URL error! Erro na URL! Duplicate feed! Feed duplicado! Can't find feed URL! Não é possível encontrar a URL do feed! Request failed! Falha ao solicitar! AddFolderDialog Add Folder Adicionar Pasta Feeds Feeds All Feeds Todos os Feeds Name: Nome: Location: Localização: AuthenticationDialog Save password Salvar a senha Authorization required Autorização necessária Server: Servidor: Message: Mensagem: Username: Usuário: Password: Senha: CategoriesTreeWidget Unread Não Lida Starred Favoritas Deleted Apagado Labels Etiquetas Open in New Tab Abrir em Nova Aba Clear 'Deleted' Limpar 'Excluídos' Mark Read Marcar como Lido CleanUpWizard Clean Up Limpar Choose Feeds Escolher os Feeds All Feeds Todos os Feeds Clean Up Options Limpar Opções Maximum age of news in days to keep: Idade máx. de notícias em dias, a manter: Maximum number of news to keep: Número máximo de notícias a manter: Delete read news Apagar as notícias lidas Never delete unread news Nunca apagar as notícias não lidas Never delete starred news Não apagar as notícias favoritas Never delete labeled news Nunca apagar as notícias etiquetadas Clean up 'Deleted' Limpar 'Excluídos' Purge DB Limpar o Banco de Dados Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Remover totalmente do Banco de Dados registros que haviam sido marcados como 'apagados'. Notícias antigas podem reaparecer Information Informações Clean Up wizard deleted %1 news O Assistente de Limpeza deletou %1 notícias ClickToFlash Object blocked by ClickToFlash Objeto bloqueado por ClickToFlash Hide object Ocultar o objeto Add '%1' to whitelist Adicionar '%1' à lista branca CustomizeToolbarDialog Customize Main Toolbar Personalizar a Barra de Ferramentas Principal Customize Feeds Toolbar Personalizar a Barra de Ferramentas de Feeds Customize News Toolbar Personalizar a Barra de Ferramentas de Notícias Load images Carregar as imagens Separator Separador Icon Ãcone Text Texto Text Beside Icon Texto ao Lado do Ãcone Text Under Icon Texto Sob o Ãcone Big Grande Normal Normal Small Pequeno Style: Estilo: Icon Size: Tamanho do Ãcone: Add Adicionar Remove Remover Move up Mover acima Move down Mover abaixo Default Padrão DownloadItem Remaining time unavailable Tempo restante indisponível Error: Cannot write to file! Erro: Não é possível gravar no arquivo! Error: Erro: few seconds alguns segundos seconds segundos minutes minutos hours horas Unknown size Tamanho desconhecido Unknown speed Velocidade desconhecida %2 - unknown size (%3) %2 - tamanho desconhecido (%3) Remaining %1 - %2 of %3 (%4) Restando %1 - %2 de %3 (%4) Cancelled - %1 Cancelado - %1 Delete file Apagar arquivo Do you want to also delete downloaded file? Deseja apagar o arquivo baixado também? Open File Abrir Arquivo Open Folder Abrir Pasta Copy Download Link Copiar o Link do Download Cancel Downloading Cancelar o Download Remove Remover Cancelled Cancelado Error Erro Not found Não encontrado Sorry, the file %1 was not found! Desculpe, o arquivo %1 não foi encontrado! DownloadManager Clear Limpar File %1 (*.%2) Arquivo %1 (*.%2) All Files (*.*) Todos os Arquivos (*.*) Save As... Salvar Como... Executable: Executável: Arguments: Argumentos: FeedPropertiesDialog Properties Propriedades General Geral Columns Colunas Authentication Autenticação Status Status Title: Título: Homepage: Página Inicial: Feed URL: URL do Feed: Load Title Carregar o Título Load Favicon Carregar o Favicon Select Icon... Selecionar o Ãcone... Select Icon Selecionar o Ãcone Disable update Desativar a atualização Automatically update every Auto-atualizar a cada seconds segundos minutes minutos hours horas Starred Favoritos Load images Carregar as imagens Display in new tab on startup Exibir em uma nova aba na inicialização Show news' description instead of loading web page Mostrar a descrição das notícias, em vez de carregar a página da web Automatically delete duplicate news Auto-apagar as notícias duplicadas Display Exibir Reading Leitura Enable JavaScript Habilitar JavaScript Right-to-left layout Layout da direita para a esquerda Ascending Crescente Descending Decrescente Sort by: Organizar por: Add Adicionar Remove Remover Move up Mover acima Move down Mover abaixo Default Padrão Server requires authentication: O servidor requer autenticação: Username: Usuário: Password: Senha: Feeds count: Contagem de Feeds: Description: Descrição: Status: Status: Created: Criado em: Last update: Última atualização: News count: Contagem de notícias: Good Bom Long ago ;-) Há muito tempo ;-) new novo unread não lida Image files Arquivos de imagem Select Image Selecionar a Imagem Load icon: can't open a file! Carregar o ícone: o arquivo não pôde ser aberto! FilterRulesDialog Filter Rules Filtrar Regras Feeds Feeds All Feeds Todos os Feeds Filter name: Filtrar por nome: Match all news Combinar todas as notícias Match all conditions Combinar todas as condições Match any condition Combinar qualquer condição Perform these actions: Executar estas ações: Please enter name for the filter. Por favor, digite o nome para o filtro. Please enter search condition for the news filter. Por favor, digite a condição de pesquisa para o filtro de notícias. FindFeed Find Name Buscar por Nome Find Link Buscar por Link FindTextContent Find in News Buscar em Notícias Find in Titles Buscar em Títulos Find in Authors Buscar em Autores Find in Categories Buscar em Categorias Find in Descriptions Buscar em Descrição Find in Links Procurar em Links Find in Browser Buscar no Navegador FtpDownloader Canceled! Cancelado! ItemAction Mark News as Read Marcar as Notícias como Lidas Add Star Adicionar aos Favoritos Delete Apagar Add Label Adicionar Etiqueta Play a Sound Reproduzir um Som Show News in Notifier Mostrar as Notícias no Notificador Browse Navegar Play Reproduzir Add Action Adicionar Ação Delete Action Apagar Ação Open File... Abrir Arquivo... ItemCondition Title Título Description Descrição Author Autor Category Categoria State Estado Link Link News Notícias New Novo Read Ler Starred Favoritos Add Condition Adicionar Condição Delete Condition Apagar Condição contains contém doesn't contains não contém is é isn't não é begins with inicia com ends with termina com Regular expressions Expressões regulares LabelDialog New Label Nova Etiqueta Load icon... Carregar o ícone... Default Padrão Select color... Selecionar a cor... Name: Nome: Icon: Ãcone: Color text: Cor do texto: Color background: Cor do fundo: Image files Arquivos de imagem Select Image Selecionar a Imagem Load icon: can't open a file! Carregar o ícone: o arquivo não pôde ser aberto! MainApplication Saving data... Salvando os dados... MainWindow &AdBlock &AdBlock Hide Categories Ocultar as Categorias Show Categories Mostrar as Categorias Select OPML-File Selecionar o Arquivo OPML OPML-Files (*.%1 *.%2) Arquivos OPML (*.%1 *.%2) Import canceled Importação cancelada Import: can't open a file Importação: não é possível abrir um arquivo OPML-Files (*.%1) Arquivos OPML (*.%1) Export canceled Exportação cancelada Export: can't open a file Exportação: o arquivo não pôde ser aberto Unread: %1 Não Lidos: %1 All: %1 Tudo: %1 (Browser) (Navegador) New News: %1 Novas Notícias: %1 Unread News: %1 Notícias Não Lidas: %1 &Add &Adicionar Add New Feed Adicionar Novo Feed &Feed... &Feed... F&older... P&asta... Add New Folder Adicionar Nova Pasta Open in New Tab Abrir em Nova Aba &Delete... &Apagar... Delete Selected Feed Apagar o Feed Selecionado &Import Feeds... &Importar os Feeds... Import Feeds from OPML File Importar os Feeds do Arquivo OPML &Export Feeds... &Exportar os Feeds... Export Feeds to OPML File Exportar os Feeds para o Arquivo OPML E&xit &Sair Update Feed Atualizar o Feed Update Current Feed Atualizar o Feed Atual Update All Atualizar Tudo Update All Feeds Atualizar Todos os Feeds Mark All Feeds Read Marcar Todos os Feeds como Lidos Mark Read/Unread Marcar Como Lido/Não Lido Mark Current News Read/Unread Marcar a Notícia Atual como Lida/Não Lida Mark All News Read Marcar Todas as Notícias como Lidas Downloads Downloads Clean Up... Limpar... News Filters... Filtros de Notícias... Filter News... Filtrar as Notícias... Options... Opções... Open Options Dialog Abrir a Janela Opções Filter Feeds Filtrar os Feeds Show All Mostrar Tudo Show New Mostrar os Novos Show Unread Mostrar os Não Lidos Show Starred Feeds Mostrar os Feeds Favoritos Show Not Working Feeds Exibir os Feeds Sem Funcionamento Filter News Filtrar as Notícias Show Starred Mostrar os Favoritos Show Not Starred Mostrar os Não Favoritos Show Unread or Starred Exibir os Não Lidos ou Favoritos Show Last Day Mostrar no Dia Anterior Show Last 7 Days Mostrar nos Últimos 7 Dias About... Sobre... Show 'About' Dialog Mostrar a Janela 'Sobre' Check for Updates... Verificar as atualizações ... Report a Problem... Comunicar um Problema... Open News Abrir as Notícias Open in Browser Abrir no Navegador Open in External Browser Abrir no Navegador Externo Open News in External Browser Abrir as Notícias em um Navegador Externo Open News in New Tab Abrir as Notícias em uma Nova Aba Open in Background Tab Abrir em uma Aba de Plano de Fundo Open News in Background Tab Abrir as Notícias em uma Aba de Plano de Fundo Star Favorito Mark News Star Marcar as Notícia como Favoritas Delete Apagar Delete Selected News Apagar as Notícias Selecionadas Delete All News Apagar Todas as Notícias Delete All News from List Apagar Todas as Notícias da Lista Restore Restaurar Restore News Restaurar as Notícias Copy Link Copiar o Link Restore last deleted news Restaurar as últimas notícias apagadas Mark Read Marcar como Lido Mark Feed Read Marcar Feed como Lido Properties Propriedades &File &Arquivo Count Unread News Contar Notícias Não Lidas Count All News Contar Todas as Notícias Last Update Última Atualização Reset browser zoom Restaurar zoom no navegador Print Web Page Imprimir Página da Web Preview Web Page Visualizar Página Web Save page in database Salvar a página na base de dados Save page in database instead of news description Salvar a página na base de dados, em vez da descrição das notícias Confirm Delete Confirme a Exclusão Are you sure to delete selected elements? Tem certeza que deseja apagar os elementos selecionados? Menu Menu Add Feed... Adicionar Feed... &Create Backup... &Criar Backup... S&how Menu Bar E&xibir a Barra de Menus Stop Update Feeds Parar atualização de Feeds Open News Description Abrir Descrição de Notícias Copy News Link Copiar Link da Notícia &View &Exibir Fee&ds Fee&ds &News &Notícias &Browser Na&vegador &Tools &Ferramentas &Help A&juda Main Toolbar Barra de Ferramentas Principal Customize Toolbar Personalizar a Barra de Ferramentas Main Toolbar... Barra de Ferramentas Principal... Customize Toolbar... Personalizar a Barra de Ferramentas... Feeds Toolbar... Barra de Ferramentas de Feeds... News Toolbar... Barra de Ferramentas de Notícias... Lock Toolbar Bloquear a Barra de Ferramentas Hide Toolbar Ocultar a Barra de Ferramentas Layout Layout Classic Clássico Newspaper Jornal Application Style Estilo do QuiteRSS System Sistema System2 Sistema 2 Green Verde Orange Laranja Purple Roxo Pink Rosa Gray Cinza Browser Position Posição do Navegador Top No Topo Bottom Abaixo Right À Direita Left À Esquerda Show Window Mostrar a Janela Previous Feed Feed Anterior Next Feed Próximo Feed Previous News Notícias Anteriores Next News Próximas Notícias News Page Up Notícias Página Acima News Page Down Notícias Página Abaixo Next Unread News Próxima Notícia Não Lida Previous Unread News Notícia Não Lida Anterior Switch Focus to Next Panel Mudar o Foco para o Painel Seguinte Switch Focus to Next Panel (Tree Feeds, List News, Browser) Mudar o Foco para o Painel Seguinte (Ãrvore de Feeds, Lista de Notícias, Navegador) Switch Focus to Previous Panel Mudar o Foco para o Painel Anterior Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Mudar o Foco para o Painel Anterior (Ãrvore de Feeds, Lista de Notícias, Navegador) Show/Hide Tree Feeds Mostrar/Ocultar a Ãrvore de Feeds Minimize to Tray Minimizar para Bandeja do Sistema Minimize Application to Tray Minimizar a Aplicação para Bandeja do Sistema Columns Colunas Show Indentation Mostrar o Recuo Search Feed Procurar Feed Zoom Zoom Zoom In Ampliar Zoom in in browser Ampliar no Navegador Zoom Out Reduzir Zoom out in browser Reduzir no Navegador 100% 100% Print... Imprimir... Print Preview... Visualizar a Impressão... Page up (Browser) Página acima (Navegador) Page down (Browser) Página abaixo (Navegador) Save As... Salvar Como... Save Page As... Salvar a Página Como... Show/Hide Mostrar/Ocultar Feeds Toolbar Barra de Ferramentas de Feeds News Toolbar Barra de Ferramentas de Notícias Browser Toolbar Barra de Ferramentas do Navegador Panel Categories Painel das Categorias Status Bar Barra de Status Full Screen Tela Cheia Stay On Top Manter no Topo Categories Categorias Label Etiqueta Show labels menu Exibir o menu das etiquetas Close Tab Fechar a Aba Close Other Tabs Fechar as Outras Abas Close All Tabs Fechar Todas as Abas Switch to next tab Alternar para a próxima aba Switch to previous tab Alternar para aba anterior Unread Não lido Starred Favoritas Deleted Apagado Labels Etiquetas Decrease news list/increase browser Diminuir a lista de notícias/aumentar navegador Increase news list/decrease browser Aumentar a lista de notícias/diminuir navegador Find Buscar Open Homepage Feed Abrir a Página do Feed Sort by Name Classificar por Nome Collapse All Folders Recolher Todas as Pastas Expand All Folders Expandir Todas as Pastas Next Folder Próxima Pasta Previous Folder Pasta Anterior Expand Folder Expandir a Pasta Setting Page: Labels Página de Configurações: Etiquetas Share Compartilhar Sort By Organizar Por Ascending Crescente Descending Decrescente Check for updates Verificar as Atualizações A new version of QuiteRSS... Uma nova versão do QuiteRSS... Loading... Carregando... Web Page Página Web Save As Salvar Como HTML-Files (*.%1) Arquivos HTML (*.%1) Text files (*.%2) Arquivos de texto (*.%2) Save As: can't open a file Salvar Como: o arquivo não pôde ser aberto Choose Directory Selecionar Diretório Important Importante Work Trabalho Personal Pessoal To Do A Fazer Later Mais Tarde Amusingly Diversão NetworkManager SSL Certificate Error! Erro do Certificado SSL The "%1" server has the following errors in the SSL certificate: O servidor "%1" tem os seguintes erros no certificado SSL: <b>Organization: </b> <b>Organização: </b> <b>Domain Name: </b> <b>Nome do Domínio: </b> <b>Expiration Date: </b> <b>Vencimento: </b> <b>Error: </b> <b>Erro: </b> Would you like to make an exception for this certificate? Deseja abrir uma exceção a este certificado? NewsFiltersDialog News Filters Filtros de Notícias Feeds Feeds Filter Name Nome do Filtro New... Novo... Edit... Editar... Delete... Apagar... Move up Mover acima Move down Mover abaixo Run Filter Executar o Filtro Delete Filter Apagar o Filtro Are you sure you want to delete the filter '%1'? Tem certeza que deseja apagar o filtro '%1'? NewsHeader Icon Feed Ãcone do Feed Title Título Published Publicado em Received Recebido em Author Autor Category Categoria Read Leitura Star Favorito Label Etiqueta Feed Title Título do Feed Link Link NewsItem Mark Read/Unread Marcar como Lido/Não Lido Delete News Apagar as Notícias NewsTabWidget Loading... (%p%) Carregando... (%p%) Home Início Open Page in External Browser Abrir a Página em um Navegador Externo Open Link in External Browser Abrir o Link em um Navegador Externo Open Link Abrir o Link Open in New Tab Abrir em uma Nova Aba Save Link... Salvar o Link... Save Image... Salvar a Imagem Copy Link Copiar o Link Copy Copiar Go Back Voltar Go Forward Avançar Stop Parar Reload Recarregar Copy Image Copiar a Imagem Copy Image Address Copiar o Endereço da Imagem Load Images Carregar as Imagens Auto Load Images to News View Carregar as Imagens Automaticamente ao Exibir as Notícias No Load Images Não Carregar as Imagens No Load Images to News View Não Carregar as Imagens ao Exibir as Notícias Close Tab Fechar a Aba Auto Load Images in News View Carregar Imagens Automaticamente na Visualização da Notícia Don't Load Images Não Carregar Imagens Don't Load Images in News View Não Carregar Imagens na Visualização da Notícia Comments Comentários Author: %1 Autor: %1 audio áudio video vídeo media mídia Link to Link para Mark Read/Unread Marcar como Lido/Não Lido Mark News Star Marcar como Notícia Favorita Label Etiqueta Share Compartilhar Open News in External Browser Abrir Notícias no Navegador Externo Delete Apagar NotificationWidget Close Fechar Mark All News Read Marcar Todas as Notícias como Lidas Previous Page Página Anterior Next Page Próxima Página Incoming News: %1 Notícias de Entrada: %1 Page %1 of %2 Página %1 de %2 OptionsDialog Options Opções General Geral System Tray Bandeja do Sistema Network Connections Conexões de Rede Browser Navegador Feeds Feeds Labels Etiquetas Notifications Notificações Passwords Senhas Language Idioma Fonts & Colors Fontes e Cores Keyboard Shortcuts Atalhos de Teclado Warning: key is already assigned to Aviso: a chave já está atribuída a Show splash screen on startup Mostrar a tela inicial ao iniciar Reopen last opened feeds on startup Reabrir os últimos feeds abertos ao inicializar Open new tab next to active Abrir a nova aba próxima da ativa Hide feeds tree when opening tabs Ocultar a árvore de feeds ao abrir as abas Show default rss-icon instead of favourite one Mostrar o ícone padrão de RSS, em vez do ícone favorito do website Automatically collapse folders Recolher automaticamente as pastas Show close button on tab Exibir o botão fechar na aba Automatically check for updates Verificar automaticamente as atualizações Help improve QuiteRSS by sending usage information Ajude a melhorar o QuiteRSS, enviando as informações de uso Store a DB in memory (requires program restart) Armazenar um Banco de Dados na memória (requer reinicialização do programa) Save DB stored in memory to file every Salvar o BD armazenado na memória p/ o arquivo a cada minutes minutos Run QuiteRSS at Windows startup Executar o QuiteRSS na inicialização do Windows Show system tray icon Mostrar o ícone na bandeja do sistema starting QuiteRSS Iniciar o QuiteRSS minimizing QuiteRSS Minimizar o QuiteRSS closing QuiteRSS Fechar o QuiteRSS Show static icon Mostrar o ícone estático Change icon for incoming new news Mudar o ícone ao entrar novas notícias Show count of new news Mostrar a contagem de novas notícias Show count of unread news Mostrar a contagem de notícias não lidas Single click instead of double click for show window Único clique em vez de duplo clique para mostrar a janela Empty working set on minimize to tray Esvaziar o conjunto de trabalho ao minimizar para bandeja Move to the system tray when: Mover para a bandeja do sistema quando: Tray icon behavior: Comportamento do ícone da bandeja: Direct connection to the Internet Conexão direta com a internet System proxy configuration (if available) Configuração proxy do sistema (se disponível) Manual proxy configuration: Configuração manual do proxy: Proxy server: Servidor proxy: Port: Porta: Username: Usuário: Password: Senha: Request timeout: Intervalo para solicitação: Number of requests: Número de solicitações: Number of retries: Número de tentativas: Options network requests when updating feeds (requires program restart): Opções de solicitações de rede ao atualizar os feeds (requer reiniciar o programa): Use embedded browser Usar o navegador embutido Use external browser Usar um navegador externo Default external browser Navegador externo padrão Following external browser: Usar o seguinte navegador externo: Browse... Procurar... Load images Carregar as imagens Enable JavaScript Ativar o JavaScript Enable plug-ins Ativar os plug-ins Open links in embedded browser in background Abrir os links no navegador embutido no plano de fundo Open links in external browser in background (experimental) Abrir os links em um navegador externo em segundo plano (experimental) Default zoom on pages: Zoom padrão nas páginas: Browser selection: Selecionar o navegador: External browser: Navegador externo: Content: Conteúdo: User style sheet: Folha de estilo do usuário: Maximum pages in cache Máximo de páginas no cache Store cache in: Armazenar o cache em: Maximum size of disk cache Tamanho máximo do cache de disco MB MB Use disk cache Usar o cache de disco Allow local data to be set Permitir que os dados locais sejam definidos Keep local data only until quit application Manter os dados locais somente até sair do aplicativo Block sites from setting any data Bloquear os sites de fixar quaisquer dados Clear Limpar Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. O Click To Flash é um plugin que bloqueia o carregamento automático de conteúdo em Flash na página. Você sempre pode carregá-lo manualmente clicando no ícone de reprodução Flash. Use Click to Flash Usar o Click to Flash Add... Adicionar Remove... Remover... Ask where to save each file before downloading Perguntar o local para salvar cada arquivo antes de baixar Download location: Localização do download: History Histórico Click to Flash Click to Flash Downloads Downloads Automatically update the feeds on startup Atualizar automaticamente os feeds ao iniciar Automatically update the feeds every Auto-atualizar todos os feeds a cada seconds segundos hours horas Nothing to do Não fazer nada Dec Dez December Dezembro Display format for date: Formato de exibição para data: time: hora: Alternating row background colors Alternar as cores de fundo das linhas Simplified representation of date and time Representação simplificada de data e hora Show All Mostrar Tudo Show New Mostrar as Novas Show Unread Mostrar as Não Lidas Show Starred Mostrar as Favoritas Show Not Starred Mostrar as Não Favoritas Show Unread or Starred Mostrar as Não Lidas ou Favoritas Show Last Day Mostrar no Dia Anterior Show Last 7 Days Mostrar nos Últimos 7 Dias Style sheet for news: Folha de estilo para notícias: Mark news as read: Marcar as notícias como lidas: on selecting. With timeout Ao selecionar. Com intervalo de after switching to another news Após mudar para outra notícia Mark displayed news as read when switching feeds Marcar como lidas as notícias exibidas, ao mudar de Feed Mark displayed news as read when closing tab Marcar como lidas as notícias exibidas, ao fechar a aba Mark displayed news as read on minimize Marcar como lidas as notícias exibidas, ao minimizar Change behavior of action 'Next Unread News' Mudar o comportamento da ação 'Próximas Notícias Não Lidas' starred news Notícias favoritas labeled news Notícias etiquetadas Automatically mark identical news as read Marcar automaticamente as notícias idênticas como lidas Prevent accidental deletion of: Prevenir a exclusão acidental de: Enable cleanup on shutdown Ativar a limpeza ao desligar Maximum age of news in days to keep: Idade máxima em dias a manter notícias: Maximum number of news to keep: Número máximo de notícias a manter: Delete read news Apagar as notícias lidas Never delete unread news Nunca apagar as notícias não lidas Never delete starred news Nunca apagar as notícias favoritas Never delete labeled news Nunca apagar as notícias etiquetadas Clean up 'Deleted' Limpar 'Apagados' Enable DB optimization (slower shutdown) Ativar a otimização Banco de Dados (desligamento mais lento) Reading Leitura Clean Up Limpeza New... Nova... Edit... Editar... Delete... Apagar... Move up Mover acima Move down Mover abaixo Show when inactive main window Exibir quando a janela principal está inativa Screen Tela Transparency Transparência Show titles feeds Exibir títulos dos feeds Show icon feed Exibir o ícone do feed Show button 'Mark All News Read' Exibir o botão 'Marcar Todas Notícias Como Lidas' Show button 'Mark Read/Unread' Exibir o botão 'Marcar Como Lido(a)/Não Lido(a)' Show button 'Open in External Browser' Exibir o botão 'Abrir no Navegador Externo' Show button 'Delete News' Exibir o botão 'Apagar Notícias' Play sound for incoming new news Reproduzir um som para as novas notícias Play Reproduzir Display notification for incoming news Exibir a notificação para novas notícias Top Left No Topo à Esquerda Top Right No Topo à Direita Bottom Left Embaixo à Esquerda Bottom Right Embaixo à Direita Review Revisão Position Posição Show maximum of Mostrar o máximo de item on page notification itens na página de notificação Width list items Largura da lista de itens pixels pixels. Close notification after Fechar a notificação após Do not show notification in fullscreen mode Não mostrar a notificação no modo de tela cheia Display Exibir Action mouse on news opening: Ação do mouse ao abrir os feeds: Single Click: Único Clique: Double Click: Duplo Clique: Middle Click: Clique Com o Botão Central: Only show selected feeds: Mostrar apenas os feeds selecionados: Notification Notificação Sound Som Selection of feeds Seleção dos feeds All Feeds Todos os Feeds Site Site User Usuário Password Senha Delete Apagar Delete All Apagar Tudo Show Passwords Mostrar Senhas Version Versão Author Autor Contact Contato Choose language: Escolher o idioma: Type Tipo Font Fonte Feeds list font Fonte da lista de feeds News list font Fonte da lista de notícias News title font Fonte do título das notícias News text font Fonte do texto das notícias Notification font Fonte da notificação Change... Alterar... Reset Redefinir Feeds list color Cor da lista de Feeds Feeds list background Fundo da lista de Feeds News list color Cor da lista de notícias News list background Fundo da lista de notícias Focused news color Cor da notícia focada Focused news background color Cor de fundo da notícia focada Link color Cor do Link Title color Cor do Título Date color Cor da data Author color Cor do autor News text color Cor do texto das notícias News title background Fundo do título da notícia News background Fundo da notícia Feed with new news Feed com novas notícias Count of unread news in feeds tree Contar notícias não lidas na árvore de feeds Disabled feed Feed inválido Alternating row colors Alternar cores de linha Notification text color Cor do texto da notificação Notification background color Cor de fundo da notificação Auto load images in news view Carregar imagens automaticamente na notícia vizualizada Text color of new news Cor do texto das novas notícias Show feeds tree toggle Exibir árvore de feeds alternados Clear new status when minimize to tray Limpar status novo ao minimizar para bandeja Set focus on the last opened news Definir o foco na última notícia aberta Set focus at the top of news list Definir foco na parte superior da lista de notícias Set focus on the unread news Definir o foco nas notícias não lidas Open the news Abrir Notícia Default news filter: Filtro de notícias padrão: Action on feed opening: Ação ao abrir feed: Show news description instead of loading web page Mostrar descrição de notícias, ao invés de carregar a página da web Text color of unread news Cor do texto das notícias não lidas Focused feed color Cor do feed focado Focused feed background color Cor de fundo do feed focado Standard Padrão Fixed Fixo Serif Serif Sans Serif Sans Serif Cursive Cursive Fantasy Fantasia Default font size Tamanho padrão da fonte Fixed font size Tamanho fixo da fonte Minimum font size Tamanho mínimo da fonte Minimum logical font size Tamanho mínimo da fonte lógica Font families: Famílias de fontes: Font sizes: Tamanhos de fontes: Fonts Fontes Fonts Browser Fontes do Navegador Colors Cores Filter Filtrar Action Ação Description Descrição Shortcut Atalho Shortcut: Atalho: Open File... Abrir Arquivo... Select Style Sheet File Selecionar o Arquivo da Folha de Estilo Open Directory... Abrir Pasta... Add site to whitelist Adicionar um site à lista branca Site without 'http://' (ex. youtube.com) Site sem 'http://' (ex. youtube.com) QAbstractSpinBox &Step up &Etapa Acima Step &down Etapa &Abaixo &Select All &Selecionar Tudo QDialogButtonBox Close Fechar Cancel Cancelar &Yes &Sim &No &Não QFtp Not connected Não conectado Host %1 not found Host %1 não encontrado Connection refused to host %1 Conexão recusada para o host %1 Connection timed out to host %1 A conexão expirou para o host %1 Connected to host %1 Conectado ao host %1 Connection refused for data connection Conexão recusada para conexão de dados Unknown error Erro desconhecido Connecting to host failed: %1 Falha ao conectar ao host: %1 Login failed: %1 Falha de login: %1 Listing directory failed: %1 Falha ao listar a pasta: %1 Changing directory failed: %1 Falha ao mudar a pasta: %1 Downloading file failed: %1 Falha ao baixar o arquivo: %1 Uploading file failed: %1 Falha ao enviar o arquivo: %1 Removing file failed: %1 Falha ao remover o arquivo: %1 Creating directory failed: %1 Falha ao criar a pasta: %1 Removing directory failed: %1 Falha ao remover a pasta: %1 Connection closed Conexão fechada QLineEdit &Undo &Desfazer &Redo &Refazer Cu&t Recor&tar &Copy &Copiar &Paste &Colar Delete Apagar Select All Selecionar Tudo QMultiInputContext Select IM Selecionar IM QObject Cannot start external program Não é possível iniciar o programa externo Cannot start external program! %1 Não é possível iniciar o programa externo! %1 Error Erro QTextControl &Undo &Desfazer &Redo &Refazer Cu&t Recor&tar &Copy &Copiar &Paste &Colar Delete Apagar Select All Selecionar Tudo Copy &Link Location Copiar o Endereço do &Link QWizard Cancel Cancelar < &Back < &Voltar &Finish &Concluir &Next > &Avançar > RSSDetectionWidget Untitled feed Feed sem título RequestFeed Server requires authentication! O servidor requer autenticação! Server replied: Not Found! Resposta do servidor: Não Encontrado! Redirect error! Erro ao redirecionar! Request timeout! Intervalo solicitado! SQLiteDriver Error opening database Erro ao abrir banco de dados Error closing database Erro ao fechar banco de dados Unable to begin transaction Não é possível iniciar a transação Unable to commit transaction Não é possível confirmar a transação Unable to rollback transaction Não é possível reverter a transação SQLiteResult Unable to fetch row Não é possível obter a linha No query Nenhuma consulta Unable to execute statement Não é possível executar a instrução Unable to execute multiple statements at a time Não é possível executar várias instruções ao mesmo tempo Unable to reset statement Não é possível redefinir a instrução Unable to bind parameters Não é possível vincular os parâmetros Parameter count mismatch Incompatibilidade na contagem do parâmetro SslErrorDialog SSL Certificate Error! Erro do Certificado SSL! Only for this session Somente para esta sessão UpdateAppDialog Check for Updates Verificar as Atualizações Checking for updates... Verificando as atualizações... Loading history... Carregando o histórico... Don't remind about this version Não lembrar sobre esta versão &Install &Instalar You already have the latest version Você já possui a versão mais recente! A new version of QuiteRSS is available! Uma nova versão do QuiteRSS está disponível! Click here to go to the download page Clique aqui para ir à página de download Your version is: Sua versão é: Current version is: A versão atual é: Error checking updates Erro ao verificar as atualizações quiterss-0.18.3/lang/quiterss_pt_PT.ts000066400000000000000000005505371265173051100177600ustar00rootroot00000000000000 AboutDialog About Sobre Revision Revisão Version Versão QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS é um visualizador de notícias multi-plataforma e de código livre Includes: Inclusões: Application directory: Diretório da aplicação: Resource directory: Diretório do recurso: Data directory: Diretório de dados: Backup directory: Diretório de backup: Database file: Ficheiro da base de dados: Settings file: Ficheiro de definições: Log file: Ficheiro de registo: Authors Autores History Histórico License Licença Information Informações AdBlockAddSubscriptionDialog Add Subscription Adicionar subscrição Title: Título: Address: Endereço: Add new subscription to AdBlock: Adicionar nova subscrição AdBlock: AdBlockCustomList Custom Rules Regras personalizadas AdBlockDialog AdBlock Configuration Configuração AdBlock Enable AdBlock Ativar AdBlock Search... Procura... Options Opções AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Utilizar apenas a principal lista EasyList (para melhor desempenho) Add Rule Adicionar regra Remove Rule Remover regra Add Subscription Adicionar subscrição Remove Subscription Remover subscrição Update Subscriptions Atualizar subscrições Learn about writing rules... Mais informações sobre regras... AdBlockIcon AdBlock lets you block unwanted content on web pages O AdBlock bloqueia algum conteúdo intrusivo das páginas web AdBlock AdBlock Show AdBlock &Settings Mo&strar definições AdBlock Disable on %1 Desativar em %1 Disable only on this page Desativar nesta página Blocked Popup Windows Janelas emergentes bloqueadas %1 with (%2) %1 com (%2) No content blocked Nenhum conteúdo bloqueado Blocked URL (AdBlock Rule) - click to edit rule URL bloqueado (Regra AdBlock) - clique para editar AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Subscrição não adicionada! AdBlockTreeWidget Add Rule Adicionar regra Remove Rule Remover regra Add Custom Rule Adicionar regra personalizada Please write your rule here: Adicione a sua regra aqui: %1 (recently updated) %1 (atualizada recentemente) %1 (Error: %2) %1 (Erro: %2) AddFeedWizard Add Feed Adicionar fonte Create New Feed Criar fonte Use title of the feed as displayed name Utilizar título da fonte como nome Server requires authentication: Servidor requer autenticação: Username: Utilizador: Password: Palavra-passe: Feed URL or website address: URL ou endereço web da fonte: Feeds Fontes All Feeds Todas as fontes New Folder... Nova pasta... Displayed name: Nome exibido: Location: Localização: URL error! Erro de URL! Duplicate feed! Fonte duplicada! Can't find feed URL! URL não encontrado! Request failed! Erro de pedido! AddFolderDialog Add Folder Adicionar pasta Feeds Fontes All Feeds Todas as fontes Name: Nome: Location: Localização: AuthenticationDialog Save password Guardar palavra-passe Authorization required Requer autenticação Server: Servidor: Message: Mensagem: Username: Utilizador: Password: Palavra-passe: CategoriesTreeWidget Unread Não lida Starred Com estrela Deleted Eliminada Labels Classificações Open in New Tab Abrir em novo separador Clear 'Deleted' Limpar eliminada Mark Read Marcar como lida CleanUpWizard Clean Up Limpeza Choose Feeds Escolha as fontes All Feeds Todas as fontes Clean Up Options Opções de limpeza Maximum age of news in days to keep: Guardar notícias durante este número de dias: Maximum number of news to keep: Número máximo de notícias a guardar: Delete read news Eliminar notícias lidas Never delete unread news Nunca eliminar notícias não lidas Never delete starred news Nunca eliminar notícias com estrela Never delete labeled news Não eliminar notícias classificadas Clean up 'Deleted' Limpar eliminadas Purge DB Remover BD Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Remover da base de dados os registos marcados como lidos. As notícias antigas poderão reaparecer. Information Informações Clean Up wizard deleted %1 news O assistente de limpeza eliminou %1 notícias ClickToFlash Object blocked by ClickToFlash Objeto bloqueado por ClickToFlash Hide object Ocutar objeto Add '%1' to whitelist Adicionar %1 à lista de permissões CustomizeToolbarDialog Customize Main Toolbar Personalizar barra principal Customize Feeds Toolbar Personalizar barra de fontes Customize News Toolbar Personalizar barra de notícias Load images Carregar imagens Separator Separador Icon Ãcone Text Texto Text Beside Icon Texto ao lado dos ícones Text Under Icon Texto por baixo dos ícones Big Grande Normal Normal Small Pequeno Style: Estilo: Icon Size: Tamanho dos ícones: Add Adicionar Remove Remover Move up Mover para cima Move down Mover para baixo Default Pré-definido DownloadItem Remaining time unavailable Tempo restante desconhecido Error: Cannot write to file! Não foi possível escrever no ficheiro! Error: Erro: few seconds alguns segundos seconds segundos minutes minutos hours horas Unknown size Tamanho desconhecido Unknown speed Velocidade desconhecida %2 - unknown size (%3) %2 - tamanho desconhecido (%3) Remaining %1 - %2 of %3 (%4) Restam %1 - %2 de %3 (%4) Cancelled - %1 Cancelado - %1 Delete file Eliminar ficheiro Do you want to also delete downloaded file? Gostaria de eliminar o ficheiro transferido? Open File Abrir ficheiro Open Folder Abrir pasta Copy Download Link Copiar ligação da transferência Cancel Downloading Cancelar transferência Remove Remover Cancelled Cancelado Error Erro Not found Não encontrado Sorry, the file %1 was not found! Desculpe mas o ficheiro %1 não existe! DownloadManager Clear Limpar File %1 (*.%2) Ficheiro %1 (*.%2) All Files (*.*) Todos os ficheiros (*.*) Save As... Guardar como... Executable: Executável: Arguments: Argumentos: FeedPropertiesDialog Properties Propriedades General Geral Columns Colunas Authentication Autenticação Status Estado Title: Título: Homepage: Pagina web: Feed URL: URL da fonte: Load Title Carregar título Load Favicon Carregar favicon Select Icon... Selecione o ícone... Select Icon Selecione o ícone Disable update Desativar atualização Automatically update every Atualização automática a cada seconds segundos minutes minutos hours horas Starred Com estrela Load images Carregar imagens Display in new tab on startup Mostrar em novo separador ao iniciar Show news' description instead of loading web page Mostrar descrição da fonte em vez de carregar a página Automatically delete duplicate news Eliminar automaticamente notícias duplicadas Display Exibição Reading Leitura Enable JavaScript Ativar JavaScript Right-to-left layout Esquema da direita para a esquerda Ascending Crescente Descending Decrescente Sort by: Ordenar: Add Adicionar Remove Remover Move up Mover para cima Move down Mover para baixo Default Pré-definido Server requires authentication: Servidor requer autenticação: Username: Utilizador: Password: Palavra-passe: Feeds count: Número de fontes: Description: Descrição: Status: Estado: Created: Criada: Last update: Última atualização: News count: Número de notícias: Good Bom Long ago ;-) Há muito tempo new nova unread não lida Image files Imagens Select Image Escolha a imagem Load icon: can't open a file! Não foi possível abrir o ficheiro! FilterRulesDialog Filter Rules Regras de filtro Feeds Fontes All Feeds Todas as fontes Filter name: Nome do filtro: Match all news Todas as notícias Match all conditions Todas as condições Match any condition Alguma condição Perform these actions: Executar estas ações: Please enter name for the filter. Introduza o nome do filtro. Please enter search condition for the news filter. Introduza as condições de procura do filtro. FindFeed Find Name Localizar nome Find Link Localizar ligação FindTextContent Find in News Localizar nas notícias Find in Titles Localizar nos títulos Find in Authors Localizar nos autores Find in Categories Localizar nas categorias Find in Descriptions Localizar na descrição Find in Links Localizar nas ligações Find in Browser Localizar no navegador FtpDownloader Canceled! Cancelado! ItemAction Mark News as Read Marcar como lidas Add Star Adicionar estrela Delete Eliminar Add Label Adicionar classificação Play a Sound Reproduzir um som Show News in Notifier Mostrar noticias no notificador Browse Navegar Play Reproduzir Add Action Adicionar ação Delete Action Eliminar ação Open File... Abrir ficheiro... ItemCondition Title Título Description Descrição Author Autor Category Categoria State Estado Link Ligação News Notícias New Nova Read Lidas Starred Com estrela Add Condition Adicionar condição Delete Condition Eliminar condição contains contém doesn't contains não contém is é isn't não é begins with inicia com ends with termina com Regular expressions Expressões regulares LabelDialog New Label Nova classificaçao Load icon... Carregar ícone... Default Pré-definido Select color... Escolha a cor... Name: Nome: Icon: Ãcone: Color text: Cor do texto: Color background: Cor de fundo: Image files Imagens Select Image Selecionar imagem Load icon: can't open a file! Não foi possível abrir o ficheiro! MainApplication Saving data... Gravação de dados... MainWindow &AdBlock &AdBlock Hide Categories Ocultar categorias Show Categories Mostrar categorias Select OPML-File Selecione o ficheiro OPML OPML-Files (*.%1 *.%2) Ficheiros OPML (*.%1 *.%2) Import canceled Importação cancelada Import: can't open a file Não foi possível abrir o ficheiro OPML-Files (*.%1) Ficheiros OPML (*.%1) Export canceled Exportação cancelada Export: can't open a file Não foi possível abrir o ficheiro Unread: %1 Não lidas: %1 All: %1 Tudo: %1 (Browser) (Navegador) New News: %1 Novas notícias: %1 Unread News: %1 Notícias não lidas: %1 &Add &Adicionar Add New Feed Adicionar fonte &Feed... &Fonte... F&older... &Pasta... Add New Folder Adicionar nova pasta Open in New Tab Abrir em novo separador &Delete... &Eliminar... Delete Selected Feed Eliminar fonte selecionada &Import Feeds... &Importar fontes... Import Feeds from OPML File Importar fontes de um ficheiro OPML &Export Feeds... &Exportar fontes... Export Feeds to OPML File Exportar fontes para um ficheiro OPML E&xit &Sair Update Feed Atualizar fonte Update Current Feed Atualizar fonte atual Update All Atualizar tudo Update All Feeds Atualizar todas as fontes Mark All Feeds Read Marcar todas as fontes como lidas Mark Read/Unread Marcar como lida/não lida Mark Current News Read/Unread Marcar notícias como lidas/não lidas Mark All News Read Marcar todas as notícias como lidas Downloads Transferências Clean Up... Limpeza... News Filters... Filtro de notícias... Filter News... Filtrar notícias... Options... Opções... Open Options Dialog Abrir janela de opções Filter Feeds Filtrar fontes Show All Mostrar tudo Show New Mostrar novas Show Unread Mostrar não lidas Show Starred Feeds Mostrar fontes com estrela Show Not Working Feeds Mostrar fontes não funcionais Filter News Filtrar notícias Show Starred Mostrar com estrela Show Not Starred Mostrar sem estrela Show Unread or Starred Mostrar não lidas ou com estrela Show Last Day Mostrar último dia Show Last 7 Days Mostrar últimos 7 dias About... Sobre... Show 'About' Dialog Mostrar janela "Sobre" Check for Updates... Procurar atualizações... Report a Problem... Reportar um erro... Open News Abrir notícias Open in Browser Abrir no navegador Open in External Browser Abrir no navegador externo Open News in External Browser Abrir notícias no navegador externo Open News in New Tab Abrir notícias em novo separador Open in Background Tab Abrir em segundo plano Open News in Background Tab Abrir notícias em segundo plano Star Estrela Mark News Star Marcar notícias com estrela Delete Eliminar Delete Selected News Eliminar notícias selecionadas Delete All News Eliminar todas as notícias Delete All News from List Eliminar todas as notícias da lista Restore Restaurar Restore News Restaurar notícias Copy Link Copiar ligação Restore last deleted news Recuperar últimas notícias eliminadas Mark Read Marcar como lida Mark Feed Read Marcar fonte como lida Properties Propriedades &File &Ficheiro Count Unread News Contar mensagens não lidas Count All News Contar todas as notícias Last Update Última atualização Reset browser zoom Restaurar ampliação no navegador Print Web Page Imprimir página web Preview Web Page Pré-visualizar página web Save page in database Guardar página na base de dados Save page in database instead of news description Guardar página na base de dados em vez da descrição Confirm Delete Confirmação de eliminação Are you sure to delete selected elements? Tem a certeza que quer eliminar os itens selecionados? Menu Menu Add Feed... Adicionar fonte... &Create Backup... &Criar backup... S&how Menu Bar Mostrar barra de me&nu Stop Update Feeds Parar atualização de fontes Open News Description Abrir descrição das notícias Copy News Link Copiar ligação das notícias &View &Ver Fee&ds F&ontes &News &Notícias &Browser Nav&egador &Tools Ferramen&tas &Help A&juda Main Toolbar Barra principal Customize Toolbar Personalizar barra de ferramentas Main Toolbar... Barra principal... Customize Toolbar... Personalizar barra de ferramentas... Feeds Toolbar... Barra de fontes... News Toolbar... Barra de notícias... Lock Toolbar Bloquear barra de ferramentas Hide Toolbar Ocultar barra de ferramentas Layout Esquema Classic Clássico Newspaper Imprensa Application Style Estilo da aplicação System Sistema System2 Sistema 2 Green Verde Orange Laranja Purple Púrpura Pink Rosa Gray Cinza Browser Position Posição do navegador Top Cima Bottom Baixo Right Direita Left Esquerda Show Window Mostrar janela Previous Feed Fonte anterior Next Feed Próxima fonte Previous News Notícia anterior Next News Próxima notícia News Page Up Notícias - 1 página acima News Page Down Notícias - 1 página abaixo Next Unread News Próxima notícia não lida Previous Unread News Notícia anterior não lida Switch Focus to Next Panel Trocar foco para o próximo painel Switch Focus to Next Panel (Tree Feeds, List News, Browser) Trocar foco para o próximo painel (árvore, lista, navegador) Switch Focus to Previous Panel Trocar foco para o painel anterior Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Trocar foco para o painel anterior (árvore, lista, navegador) Show/Hide Tree Feeds Mostrar/ocultar árvore de fontes Minimize to Tray Minimizar para a bandeja Minimize Application to Tray Minimizar aplicação para a bandeja Columns Colunas Show Indentation Mostrar avanço Search Feed Procurar fonte Zoom Ampliação Zoom In Ampliar Zoom in in browser Ampliar no navegador Zoom Out Reduzir Zoom out in browser Reduzir no navegador 100% 100% Print... Imprimir... Print Preview... Pré-visualização... Page up (Browser) Página acima (navegador) Page down (Browser) Página abaixo (navegador) Save As... Guardar como... Save Page As... Guardar página como... Show/Hide Mostrar/ocultar Feeds Toolbar Barra de fontes News Toolbar Barra de notícias Browser Toolbar Barra do navegador Panel Categories Painel de categorias Status Bar Barra de estado Full Screen Ecrã completo Stay On Top Manter na frente Categories Categorias Label Classificação Show labels menu Mostrar menu de classificações Close Tab Fechar separador Close Other Tabs Fechar os outros separadores Close All Tabs Fechar todos os separadores Switch to next tab Trocar para o próximo separador Switch to previous tab Trocar para o separador anterior Unread Não lida Starred Com estrela Deleted Eliminada Labels Classificações Decrease news list/increase browser Diminuir lista de notícias/aumentar navegador Increase news list/decrease browser Aumentar lista de notícias/diminuir navegador Find Localizar Open Homepage Feed Abrir página web da fonte Sort by Name Ordenar por nome Collapse All Folders Recolher todas as pastas Expand All Folders Expandir todas as pastas Next Folder Próxima pasta Previous Folder Pasta anterior Expand Folder Expandir pasta Setting Page: Labels Definições: Classificações Share Partilhar Sort By Ordenar Ascending Crescente Descending Decrescente Check for updates Procurar atualizações A new version of QuiteRSS... Uma nova versão do QuiteRSS... Loading... Carregamento... Web Page Página web Save As Guardar como HTML-Files (*.%1) Ficheiros HTML (*.%1) Text files (*.%2) Ficheiros de texto (*.%2) Save As: can't open a file Não foi possível abrir o ficheiro Choose Directory Escolher diretório Important Importante Work Profissional Personal Pessoal To Do Compromissos Later Mais tarde Amusingly Lazer NetworkManager SSL Certificate Error! Erro de certificado SSL! The "%1" server has the following errors in the SSL certificate: O servidor "%1" apresenta os seguintes erros no certificado SSL: <b>Organization: </b> <b>Organização: </b> <b>Domain Name: </b> <b>Nome do domínio: </b> <b>Expiration Date: </b> <b>Válido até: </b> <b>Error: </b> <b>Erro: </b> Would you like to make an exception for this certificate? Gostaria de criar uma exceção para este certificado? NewsFiltersDialog News Filters Filtros de notícias Feeds Fontes Filter Name Nome do filtro New... Novo... Edit... Editar... Delete... Eliminar... Move up Mover para cima Move down Mover para baixo Run Filter Executar filtro Delete Filter Eliminar filtro Are you sure you want to delete the filter '%1'? Tem a certeza que quer eliminar o filtro %1? NewsHeader Icon Feed Ãcone Title Título Published Publicada Received Recebida Author Autor Category Categoria Read Lida Star Estrela Label Classificação Feed Title Título da fonte Link Ligação NewsItem Mark Read/Unread Marcar como lida/não lida Delete News Eliminar notícias NewsTabWidget Loading... (%p%) Carregamento...(%p%) Home Página Open Page in External Browser Abrir página no navegador externo Open Link in External Browser Abrir ligação no navegador externo Open Link Abrir ligação Open in New Tab Abrir em novo separador Save Link... Guardar ligação... Save Image... Guardar imagem... Copy Link Copiar ligação Copy Copiar Go Back Recuar Go Forward Avançar Stop Parar Reload Recarregar Copy Image Copiar imagem Copy Image Address Copiar endereço da imagem Load Images Carregar imagens Auto Load Images to News View Carregar imagens na vista de notícias No Load Images Não carregar imagens No Load Images to News View Não carregar imagens na vista de notícias Close Tab Fechar separador Auto Load Images in News View Carregar imagens na vista de notícias Don't Load Images Não carregar imagens Don't Load Images in News View Não carregar imagens na vista de notícias Comments Comentários Author: %1 Autor: %1 audio áudio video vídeo media multimédia Link to Atalho para Mark Read/Unread Marcar como lida/não lida Mark News Star Marcar notícias com estrela Label Etiqueta Share Partilhar Open News in External Browser Abrir notícias no navegador externo Delete Eliminar NotificationWidget Close Fechar Mark All News Read Marcar todas as notícias como lidas Previous Page Página anterior Next Page Próxima página Incoming News: %1 Notícias recebidas: %1 Page %1 of %2 Página %1 de %2 OptionsDialog Options Opções General Geral System Tray Bandeja do sistema Network Connections Ligações de rede Browser Navegador Feeds Fontes Labels Classificações Notifications Notificações Passwords Palavras-passe Language Idioma Fonts & Colors Tipo de letra e cores Keyboard Shortcuts Teclas de atalho Warning: key is already assigned to A chave já está atribuída a Show splash screen on startup Mostrar ecrã inicial Reopen last opened feeds on startup Mostrar últimas fontes abertas ao iniciar Open new tab next to active Abrir novo separador junto ao ativo Hide feeds tree when opening tabs Ocultar árvore de fontes ao abrir separadores Show default rss-icon instead of favourite one Mostrar ícone rss pré-definido em vez do favorito Automatically collapse folders Recolher pastas automaticamente Show close button on tab Mostrar botão para fechar separadores Automatically check for updates Procurar atualizações automaticamente Help improve QuiteRSS by sending usage information Ajudar a melhorar o QuiteRSS enviando informações de utilização Store a DB in memory (requires program restart) Guardar base de dados em memória (tem que reiniciar) Save DB stored in memory to file every Guardar base de dados para um ficheiro a cada minutes minutos Run QuiteRSS at Windows startup Iniciar QuiteRSS ao arrancar o Windows Show system tray icon Mostrar ícone na bandeja starting QuiteRSS iniciar o QuiteRSS minimizing QuiteRSS minimizar o QuiteRSS closing QuiteRSS fechar o QuiteRSS Show static icon Mostrar ícone estático Change icon for incoming new news Mudar ícone para novas notícias recebidas Show count of new news Mostrar número de novas notícias Show count of unread news Mostrar número de notícias não lidas Single click instead of double click for show window Mostrar janela com um clique em vez de dois Empty working set on minimize to tray Limpar espaço de trabalho ao minimizar para a bandeja Move to the system tray when: Mover para a bandeja ao: Tray icon behavior: Comportamento do ícone da bandeja: Direct connection to the Internet Ligação direta à Internet System proxy configuration (if available) Proxy do sistema (se disponível) Manual proxy configuration: Configuração manual de proxy: Proxy server: Servidor proxy: Port: Porta: Username: Utilizador: Password: Palavra-passe: Request timeout: Tempo limite do pedido: Number of requests: Número de pedidos: Number of retries: Número de repetições: Options network requests when updating feeds (requires program restart): Pedidos de opções de rede ao atualizar fontes (tem que reiniciar a aplicação): Use embedded browser Utilizar navegador interno Use external browser Utilizar navegador externo Default external browser Navegador externo pré-definido Following external browser: Especificar o navegador externo: Browse... Procurar... Load images Carregar imagens Enable JavaScript Ativar JavaScript Enable plug-ins Ativar extras Open links in embedded browser in background Abrir ligações no navegador interno (em segundo plano) Open links in external browser in background (experimental) Abrir ligações no navegador externo (em segundo plano) Default zoom on pages: Tamanho pré-definido nas páginas: Browser selection: Seleção de navegador: External browser: Navegador externo: Content: Conteúdo: User style sheet: Folha de estilo: Maximum pages in cache Máximo de páginas em cache Store cache in: Guardar cache em: Maximum size of disk cache Tamanho máximo de cache MB MB Use disk cache Utilizar cache Allow local data to be set Pemitir gravação de dados locais Keep local data only until quit application Manter apenas durante a sessão atual Block sites from setting any data Não permitir que os sítios guardem dados Clear Limpar Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. O Click to Flash é um extra que bloqueia o carregamento automático do conteúdo flash. Pode carregar o conteúdo clicando no ícone. Use Click to Flash Utilizar Click to Flash Add... Adicionar... Remove... Remover... Ask where to save each file before downloading Solicitar local para guardar antes de transferir Download location: Local de transferências: History Histórico Click to Flash Click to Flash Downloads Transferências Automatically update the feeds on startup Atualização automática de fontes ao iniciar Automatically update the feeds every Atualização automática de fontes a cada seconds segundos hours horas Nothing to do Nada fazer Dec dez December dezembro Display format for date: Formato da data: time: hora: Alternating row background colors Linhas com cor de fundo alternada Simplified representation of date and time Representação simplificada de data e hora Show All Mostrar tudo Show New Mostrar novas Show Unread Mostrar não lidas Show Starred Mostrar com estrela Show Not Starred Mostrar sem estrela Show Unread or Starred Mostrar não lidas ou com estrela Show Last Day Mostrar último dia Show Last 7 Days Mostrar últimos 7 dias Style sheet for news: Folha de estilo para notícias: Mark news as read: Marcar notícias como lidas: on selecting. With timeout ao selecionar e limitar a after switching to another news ao trocar para outras notícias Mark displayed news as read when switching feeds Marcar notícias como lidas ao trocar de fonte Mark displayed news as read when closing tab Marcar notícias como lidas ao fechar o separador Mark displayed news as read on minimize Marcar notícias como lidas ao minimizar Change behavior of action 'Next Unread News' Mudar comportamento da ação "Próximas mensagens não lidas" starred news notícias com estrela labeled news notícias classificadas Automatically mark identical news as read Marcar automaticamente como lidas as notícias similares Prevent accidental deletion of: Impedir eliminação de: Enable cleanup on shutdown Ativar limpeza ao encerrar Maximum age of news in days to keep: Guardar notícias durante este número de dias: Maximum number of news to keep: Número máximo de notícias a guardar: Delete read news Eliminar notícias lidas Never delete unread news Nunca eliminar notícias não lidas Never delete starred news Nunca eliminar notícias com estrela Never delete labeled news Não eliminar notícias classificadas Clean up 'Deleted' Limpar eliminadas Enable DB optimization (slower shutdown) Ativar otimização da BD (encerramento mais lento) Reading Leitura Clean Up Limpeza New... Nova... Edit... Editar... Delete... Eliminar... Move up Mover para cima Move down Mover para baixo Show when inactive main window Mostrar se a janela principal estiver inativa Screen Ecrã Transparency Transparência Show titles feeds Mostrar título das fontes Show icon feed Mostrar ícone das fontes Show button 'Mark All News Read' Mostrar botão "Marcar todas as notícias como lidas" Show button 'Mark Read/Unread' Mostrar botão "Marcar como lida/não lida" Show button 'Open in External Browser' Mostrar botão "Abrir no navegador externo" Show button 'Delete News' Mostrar botão "Eliminar notícias" Play sound for incoming new news Reproduzir som ao receber notícias Play Reproduzir Display notification for incoming news Mostrar notificação para novas notícias recebidas Top Left Em cima à esquerda Top Right Em cima à direita Bottom Left Em baixo à esquerda Bottom Right Em baixo à direita Review Pré-visualizar Position Posição Show maximum of Mostrar um máximo de item on page notification item na notificação Width list items Largura dos itens da lista pixels pixeis Close notification after Fechar notificação após Do not show notification in fullscreen mode Não mostrar notificações se em ecrã completo Display Exibição Action mouse on news opening: Ação do rato ao abrir as notícias: Single Click: Um clique: Double Click: Dois cliques: Middle Click: Botão central: Only show selected feeds: Mostrar apenas fontes selecionadas: Notification Notificação Sound Som Selection of feeds Seleção de fontes All Feeds Todas as fontes Site Sítio User Utilizador Password Palavra-passe Delete Eliminar Delete All Eliminar tudo Show Passwords Mostrar palavras-passe Version Versão Author Autor Contact Contacto Choose language: Escolha o idioma: Type Tipo Font Tipo de letra Feeds list font Tipo de letra da lista de fontes News list font Tipo de letra da lista de notícias News title font Tipo de letra do título das notícias News text font Tipo de letra do texto da notícias Notification font Tipo de letra da notificação Change... Mudar... Reset Redefinir Feeds list color Cor da lista de fontes Feeds list background Cor de fundo da lista de fontes News list color Cor da lista de notícias News list background Cor de fundo da lista de notícias Focused news color Cor das notícias focadas Focused news background color Cor de fundo das notícias focadas Link color Cor das ligações Title color Cor do título Date color Cor da data Author color Cor do autor News text color Cor do texto das notícias News title background Cor de fundo do título de notícias News background Cor de fundo das notícias Feed with new news Fonte com novas notícias Count of unread news in feeds tree Número de mensagens não lidas na árvore de fontes Disabled feed Fonte desativada Alternating row colors Linhas com cores alternadas Notification text color Cor do texto da notificação Notification background color Cor de fundo da notificação Auto load images in news view Carregar imagens na vista de notícias Text color of new news Cor do texto das novas notícias Show feeds tree toggle Mostrar comutador da árvore de notícias Clear new status when minimize to tray Remover estado de nova ao minimizar para a bandeja Set focus on the last opened news Definir foco na última notícia aberta Set focus at the top of news list Definir foco no topo da lista de notícias Set focus on the unread news Definir foco nas notícias não lidas Open the news Abrir notícias Default news filter: Filtro de notícias padrão: Action on feed opening: Ação ao abrir fonte: Show news description instead of loading web page Mostrar descrição das notícias em vez de carregar a página Text color of unread news Cor do texto das notícias não lidas Focused feed color Cor das fontes focadas Focused feed background color Cor de fundo das fontes focadas Standard Padrão Fixed Fixa Serif Serifa Sans Serif Sem serifa Cursive Cursiva Fantasy Fantasia Default font size Tamanho do tipo de letra Fixed font size Tamanho do tipo de letra fixa Minimum font size Tamanho mínimo do tipo de letra Minimum logical font size Tamanho mínimo do tipo de letra lógica Font families: Família: Font sizes: Tamanho: Fonts Tipo de letra Fonts Browser Tipo de letra do navegador Colors Cores Filter Filtro Action Ação Description Descrição Shortcut Atalho Shortcut: Atalho: Open File... Abrir ficheiro... Select Style Sheet File Selecione o ficheiro da folha de estilo Open Directory... Abrir diretório... Add site to whitelist Adicionar sítio à lista de permissões Site without 'http://' (ex. youtube.com) Sítio sem http://: (ex. youtube.com) QAbstractSpinBox &Step up &Subir Step &down &Descer &Select All &Selecionar tudo QDialogButtonBox Close Fechar Cancel Cancelar &Yes &Sim &No &Não QFtp Not connected Sem ligação Host %1 not found Servidor %1 não encontrado Connection refused to host %1 Ligação ao servidor %1 recusada Connection timed out to host %1 Ligação ao servidor %1 expirada Connected to host %1 Ligado ao servidor %1 Connection refused for data connection Ligação recusada para troca de dados Unknown error Erro desconhecido Connecting to host failed: %1 Falha ao estabelecer ligação a: %1 Login failed: %1 Falha ao iniciar sessão: %1 Listing directory failed: %1 Falha ao listar diretório: %1 Changing directory failed: %1 Falha ao alterar diretório: %1 Downloading file failed: %1 Falha ao transferir ficheiro: %1 Uploading file failed: %1 Falha ao enviar ficheiro: %1 Removing file failed: %1 Falha ao remover ficheiro: %1 Creating directory failed: %1 Falha ao criar diretório: %1 Removing directory failed: %1 Falha ao remover diretório: %1 Connection closed Ligação fechada QLineEdit &Undo An&ular &Redo &Refazer Cu&t Cor&tar &Copy &Copiar &Paste C&olar Delete Eliminar Select All Selecionar tudo QMultiInputContext Select IM Escolha o MI QObject Cannot start external program Não foi possível abrir o programa externo Cannot start external program! %1 Não foi possível abrir o programa externo! %1 Error Erro QTextControl &Undo An&ular &Redo &Refazer Cu&t Cor&tar &Copy &Copiar &Paste C&olar Delete Eliminar Select All Selecionar tudo Copy &Link Location Copiar &localização da ligação QWizard Cancel Cancelar < &Back < &Recuar &Finish &Terminar &Next > Ava&nçar > RSSDetectionWidget Untitled feed Fonte sem título RequestFeed Server requires authentication! O servidor requer autenticação! Server replied: Not Found! O servidor devolveu: Não encontrado! Redirect error! Erro de redirecionamento! Request timeout! O pedido expirou! SQLiteDriver Error opening database Erro ao abrir base de dados Error closing database Erro ao fechar base de dados Unable to begin transaction Não foi possível iniciar a transação Unable to commit transaction Não foi possível submeter a transação Unable to rollback transaction Não foi possível reverter a transação SQLiteResult Unable to fetch row Não foi possível obter a linha No query Sem consulta Unable to execute statement Não foi possível executar a instrução Unable to execute multiple statements at a time Não é possível executar várias instruções de uma vez só Unable to reset statement Não foi possível reiniciar a instrução Unable to bind parameters Não foi possível associar os parâmetros Parameter count mismatch Número de parâmetros não coincidente SslErrorDialog SSL Certificate Error! Erro de certificado SSL! Only for this session Apenas para esta sessão UpdateAppDialog Check for Updates Procurar atualizações Checking for updates... Procura de atualizações... Loading history... Carregamento de histórico... Don't remind about this version Não lembrar sobre esta versão &Install &Instalar You already have the latest version A versão instalada é a mais recente A new version of QuiteRSS is available! Está disponível uma atualização do QuiteRSS! Click here to go to the download page Clique aqui para aceder à página web Your version is: A versão instalada: Current version is: A versão atual: Error checking updates Erro ao procurar atualizações quiterss-0.18.3/lang/quiterss_ro_RO.ts000066400000000000000000005504631265173051100177500ustar00rootroot00000000000000 AboutDialog About Despre Revision Revizie Version Versiune QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS este un program sursă-deschisă, multi-platformă, cititor RSS/Atom news Includes: Include: Application directory: Folder aplicaÅ£ie: Resource directory: Folder resurse: Data directory: Folder date: Backup directory: Folder copie de rezervă: Database file: FiÅŸier bază de date: Settings file: FiÅŸier setări: Log file: FiÅŸier jurnal: Authors Autori History Istoric License Licenţă Information InformaÅ£ie AdBlockAddSubscriptionDialog Add Subscription Adaugă subscripÅ£ie Title: Titlu: Address: Adresă: Add new subscription to AdBlock: Adaugă subscripÅ£ie nouă la AdBlock: AdBlockCustomList Custom Rules Reguli personalizate AdBlockDialog AdBlock Configuration ConfiguraÅ£ie AdBlock Enable AdBlock Activare AdBlock Search... Căutare... Options OpÅ£iuni AdBlock AdBlock Use only essential part of EasyList (for performance reasons) FoloseÅŸte doar o parte esenÅ£ială a EasyList (din motive de performanţă) Add Rule Adaugă regulă Remove Rule ÃŽnlătură regulă Add Subscription Adaugă subscripÅ£ie Remove Subscription ÃŽnlătură subscripÅ£ie Update Subscriptions Actualizează subscripÅ£ie Learn about writing rules... AflaÅ£i mai multe despre scrierea regulilor... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock vă permite să blocaÅ£i conÅ£inutul nedorit de pe paginile web AdBlock AdBlock Show AdBlock &Settings Arată &setările AdBlock Disable on %1 Dezactivează pe %1 Disable only on this page Dezactivează pe această pagină Blocked Popup Windows Ferestre popup blocate %1 with (%2) %1 cu (%2) No content blocked Fără conÅ£inut blocat Blocked URL (AdBlock Rule) - click to edit rule URL blocat (Regulă AdBlock) - clic pentru editare regulă AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Nu se poate încărca subscripÅ£ie! AdBlockTreeWidget Add Rule Adaugă regulă Remove Rule ÃŽnlătură regulă Add Custom Rule Adaugă regulă personalizată Please write your rule here: ScrieÅ£i regula dvs. aici: %1 (recently updated) %1 (recent actualizat) %1 (Error: %2) %1 (Eroare: %2) AddFeedWizard Add Feed Adaugă flux Create New Feed Crează flux nou Use title of the feed as displayed name FoloseÅŸte titlul fluxului ca nume afiÅŸat Server requires authentication: Server-ul necesită autentificare: Username: Nume utilizator: Password: Parolă: Feed URL or website address: URL flux sau adresă site web: Feeds Fluxuri All Feeds Toate fluxurile New Folder... Folder nou... Displayed name: Nume afiÅŸat: Location: LocaÅ£ie: URL error! Eroare URL! Duplicate feed! Flux duplicat! Can't find feed URL! Nu s-a găsit URL flux! Request failed! Cerere nereuÅŸită! AddFolderDialog Add Folder Adaugă folder Feeds Fluxuri All Feeds Toate fluxurile Name: Nume: Location: LocaÅ£ie: AuthenticationDialog Save password Salvează parolă Authorization required Necesită autorizare Server: Server: Message: Mesaj: Username: Nume utilizator: Password: Parolă: CategoriesTreeWidget Unread Necitit Starred Cu stea Deleted Åžters Labels Etichete Open in New Tab Deschide în tab nou Clear 'Deleted' Golire 'Åžterse' Mark Read Marchează ca citită CleanUpWizard Clean Up Pune în ordine Choose Feeds Alegere fluxuri All Feeds Toate fluxurile Clean Up Options OpÅ£iuni punere în ordine Maximum age of news in days to keep: Vîrstă maximă, în zile, a noutăţilor de păstrat: Maximum number of news to keep: Nr. maxim de noutăţi de păstrat: Delete read news Åžterge noutăţile citite Never delete unread news Nu ÅŸterge niciodată noutăţile citite Never delete starred news Nu ÅŸterge niciodată noutăţile cu stea Never delete labeled news Nu ÅŸterge niciodată noutăţile cu etichetă Clean up 'Deleted' Pune în ordine 'Åžterse' Purge DB Curăţare BD Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Elimină complet înregistrările care au fost marcate ca 'È™terse' din BD. Åžtiri vechi ar putea reapărea Information InformaÅ£ie Clean Up wizard deleted %1 news Punerea în ordine a ÅŸters %1 noutăţi ClickToFlash Object blocked by ClickToFlash Obiect blocat de ClickToFlash Hide object Ascunde obiect Add '%1' to whitelist Adaugă '%1' la listă albă CustomizeToolbarDialog Customize Main Toolbar Personalizare bară intrumente principală Customize Feeds Toolbar Personalizare bară intrumente fluxuri Customize News Toolbar Personalizare bară intrumente noutăţi Load images ÃŽncărcare imagini Separator Separator Icon Icon Text Text Text Beside Icon Text lîngă icon Text Under Icon Text sub icon Big Mare Normal Normal Small Mic Style: Stil: Icon Size: Mărime icon: Add Adaugă Remove ÃŽnlătură Move up Mutare în sus Move down Mutare în jos Default IniÅ£ial DownloadItem Remaining time unavailable Timp rămas indisponibil Error: Cannot write to file! Eroare: Nu se poate scrie fiÅŸierul! Error: Eroare: few seconds cîteva secunde seconds secunde minutes minute hours ore Unknown size Mărime necunoscută Unknown speed Viteză necunoscută %2 - unknown size (%3) %2 - mărime necunoscută (%3) Remaining %1 - %2 of %3 (%4) Rămas %1 - %2 of %3 (%4) Cancelled - %1 Anulat - %1 Delete file Åžterge fiÅŸier Do you want to also delete downloaded file? DoriÅ£i să ÅŸtergeÅ£i, de asemenea,ÅŸi fiÅŸierul descărcat? Open File Deschide fiÅŸier Open Folder Deschide folder Copy Download Link Copiază legătură desacărcare Cancel Downloading Anulare descărcare Remove ÃŽnlătură Cancelled Anulat Error Eroare Not found Negăsit Sorry, the file %1 was not found! Scuze, fiÅŸierul %1 nu a fost găsit! DownloadManager Clear Golire File %1 (*.%2) FiÅŸier %1 (*.%2) All Files (*.*) Tote fiÅŸierele (*.*) Save As... Salvează ca... Executable: Executabil: Arguments: Argumente: FeedPropertiesDialog Properties Proprietăţi General General Columns Coloane Authentication Autentificare Status Stare Title: Titlu: Homepage: Pagina de start: Feed URL: URL flux: Load Title ÃŽncărcare titlu Load Favicon ÃŽncărcare icon favorit Select Icon... Selectare icon... Select Icon Selectare icon Disable update Dezactivare actualizări Automatically update every Verificare atomată actualizări la fiecare seconds secunde minutes minute hours ore Starred Cu stea Load images ÃŽncărcare imagini Display in new tab on startup AfiÅŸare în tab nou la pornire Show news' description instead of loading web page Arată descriere noutăţi în loc de încărcarea paginii web Automatically delete duplicate news Åžterge automat noutăţile duplicat Display AfiÅŸaj Reading Citire Enable JavaScript Activare JavaScript Right-to-left layout Aspect de la dreapta la stînga Ascending Crescător Descending Descrescător Sort by: Sortare: Add Adaugă Remove ÃŽnlătură Move up Mutare în sus Move down Mutare în jos Default IniÅ£ial Server requires authentication: Server-ul necesită autentificare: Username: Nume utilizator: Password: Parolă: Feeds count: Nr. fluxuri: Description: Descriere: Status: Statut: Created: Creat: Last update: Ultima actualizare: News count: Nr. noutăţi: Good Bun Long ago ;-) Demult ;-) new nou unread necitit Image files FiÅŸiere imagini Select Image Selectare imagine Load icon: can't open a file! ÃŽncărcare icon: Nu se poate deschide fiÅŸierul! FilterRulesDialog Filter Rules Reguli filtru Feeds Fluxuri All Feeds Toate fluxurile Filter name: Nume filtru: Match all news Potrivire toate noutăţile Match all conditions Potrivire toate condiÅ£iile Match any condition Potrivire orice condiÅ£ii Perform these actions: Execută aceste acÅ£iuni: Please enter name for the filter. IntroduceÅ£i numele filtrului. Please enter search condition for the news filter. IntroduceÅ£i condiÅ£iile filtrului de căutare pentru noutăţi. FindFeed Find Name Căutare nume Find Link Căutare legătură FindTextContent Find in News Caută în noutăţi Find in Titles Caută în titluri Find in Authors Caută în autori Find in Categories Caută în categorii Find in Descriptions Caută în descrieri Find in Links Căutare în legături Find in Browser Caută în browser FtpDownloader Canceled! Anulat! ItemAction Mark News as Read Marchează noutatea ca citită Add Star Adaugă stea Delete Åžterge Add Label Adaugă etichetă Play a Sound Redă un sunet Show News in Notifier Arată noutăţi în notificator Browse Răsfoire Play Redare Add Action Adaugă acÅ£iune Delete Action Åžterge acÅ£iune Open File... Deschide fiÅŸier... ItemCondition Title Titlu Description Descriere Author Autor Category Categorie State Stare Link Legătură News Noutăţi New Nou Read Citit Starred Cu stea Add Condition Adaugă condiÅ£ie Delete Condition Åžterge condiÅ£ie contains conÅ£ine doesn't contains nu conÅ£ine is este isn't nu este begins with începe cu ends with se termină cu Regular expressions Expresii regulate LabelDialog New Label Etichetă nouă Load icon... ÃŽncărcare icon... Default IniÅ£ial Select color... Selectare culoare... Name: Nume: Icon: Icon: Color text: Culoare text: Color background: Culoare fundal: Image files FiÅŸiere imagini Select Image Selectare imagine Load icon: can't open a file! ÃŽncărcare icon: Nu se poate deschide fiÅŸierul! MainApplication Saving data... Salvare date... MainWindow &AdBlock &AdBlock Hide Categories Ascunde categorii Show Categories Arată categorii Select OPML-File Selectare fiÅŸier OPML OPML-Files (*.%1 *.%2) FiÅŸiere OPML (*.%1 *.%2) Import canceled Import anulat Import: can't open a file Import: Nu se poate deschide fiÅŸierul! OPML-Files (*.%1) FiÅŸiere OPML (*.%1) Export canceled Export anulat Export: can't open a file Export: Nu se poate deschide fiÅŸierul! Unread: %1 Necitite: %1 All: %1 Toate: %1 (Browser) (Browser) New News: %1 Noutăţi noi: %1 Unread News: %1 Noutăţi necitite: %1 &Add &Adaugă Add New Feed Adaugă flux nou &Feed... &Flux... F&older... F&older... Add New Folder Adaugă folder nou Open in New Tab Deschide în tab nou &Delete... &Åžterge... Delete Selected Feed Åžterge fluxurile selectate &Import Feeds... &Import fluxuri... Import Feeds from OPML File Import fluxuri din fiÅŸier OPML &Export Feeds... &Export fluxuri... Export Feeds to OPML File Export fluxuri în fiÅŸier OPML E&xit IeÅŸire Update Feed Actualizează flux Update Current Feed Actualizează flux curent Update All Actualizează toate Update All Feeds Actualizează toate fluxurile Mark All Feeds Read Marchează toate fluxurile ca citite Mark Read/Unread Marcare Citit/Necitit Mark Current News Read/Unread Marchează noutatea curentă ca citită/necitită Mark All News Read Marchează toate noutăţile ca citite Downloads Descărcări Clean Up... Pune în ordine... News Filters... Filtru noutăţi... Filter News... Filtrare noutăţi... Options... OpÅ£iuni... Open Options Dialog Deschide dialog OpÅ£iuni Filter Feeds Filtrare fluxuri Show All Arată toate Show New Arată noutăţi Show Unread Arată necitite Show Starred Feeds Arată fluxuri cu stea Show Not Working Feeds Arată fluxuri care nu funcÅ£ionează Filter News Filtrare noutăţi Show Starred Arată pe cele cu stea Show Not Starred Arată pe cele fără stea Show Unread or Starred Arată pe cele necitite sau cu stea Show Last Day Arată din ultima zi Show Last 7 Days Arată din ultimele 7 zile About... Despre... Show 'About' Dialog Arată dialog 'Despre' Check for Updates... Verificare actualizări... Report a Problem... RaportaÅ£i o problemă... Open News Deschide noutăţi Open in Browser Deschide în browser Open in External Browser Deschide în browser extern Open News in External Browser Deschide noutate în browser extern Open News in New Tab Deschide noutăţile în tab nou Open in Background Tab Deschide în tab în fundal Open News in Background Tab Deschide noutăţi în tab în fundal Star Stea Mark News Star Marchează noutăţile cu stea Delete Åžterge Delete Selected News Åžterge noutăţile selectate Delete All News Åžterge toate noutăţile Delete All News from List Åžterge toate noutăţile din listă Restore Restaurare Restore News Restaurare noutăţi Copy Link Copiază legătură Restore last deleted news Restaurare ultimele noutăţi ÅŸterse Mark Read Marchează ca citită Mark Feed Read Marchează fluxul ca citit Properties Proprietăţi &File &FiÅŸier Count Unread News Numără noutăţile necitite Count All News Numără toate noutăţile Last Update Ultima actualizare Reset browser zoom Resetare zoom browser Print Web Page Imprimare pagină web Preview Web Page Previzualizare pagină web Save page in database Salvează pagina în baza de date Save page in database instead of news description Salvează pagina în baza de date în loc de de descriere ÅŸtiri Confirm Delete Confirmare ÅŸtergere Are you sure to delete selected elements? Sigur doriÅ£i ÅŸtergerea elementelor selectate'? Menu Meniu Add Feed... Adaugă flux... &Create Backup... &Crează copie de rezervă... S&how Menu Bar Arată bara de meniu Stop Update Feeds Stop actualizare fluxuri Open News Description Deschidere descriere noutăţi Copy News Link Copiază legătură noutăţi &View &Vizualizare Fee&ds Fluxuri &News &Noutăţi &Browser &Browser &Tools Unel&te &Help &Ajutor Main Toolbar Bară intrumente principală Customize Toolbar Personalizare bară intrumente Main Toolbar... Bară intrumente principală... Customize Toolbar... Personalizare bară intrumente... Feeds Toolbar... Bară intrumente fluxuri... News Toolbar... Bară intrumente noutăţi... Lock Toolbar Blocare bară intrumente Hide Toolbar Ascunde bară intrumente Layout Aranjament Classic Clasic Newspaper Ziar Application Style Stil aplicaÅ£ie System Sistem System2 Sistem2 Green Verde Orange Portocaliu Purple Purpuriu Pink Roz Gray Gri Browser Position PoziÅ£ie browser Top Sus Bottom Jos Right Dreapta Left Stînga Show Window Arată fereastră Previous Feed Fluxul anterior Next Feed Fluxul următor Previous News Noutăţi anterioare Next News Noutăţi următoare News Page Up Pagină în sus noutăţi News Page Down Pagină în jos noutăţi Next Unread News Următoarele noutăţi necitite Previous Unread News Noutăţi necitite anterioare Switch Focus to Next Panel Comutare focalizare la următorul panou Switch Focus to Next Panel (Tree Feeds, List News, Browser) Comutare focalizare la următorul panou (Arbore fluxuri, liste noutăţi, browser) Switch Focus to Previous Panel Comutare focalizare la panoul anterior Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Comutare focalizare la panoul anterior (Arbore fluxuri, liste noutăţi, browser) Show/Hide Tree Feeds Arată / Ascunde arbore fluxuri Minimize to Tray Minimizare în bară Minimize Application to Tray Minimizare aplicaÅ£ie în bară Columns Coloane Show Indentation Arată indentare Search Feed Căutare fluxuri Zoom Zoom Zoom In Mărire Zoom in in browser Mărire în browser Zoom Out MicÅŸorare Zoom out in browser MicÅŸorare în browser 100% 100% Print... Imprimare... Print Preview... Previzualizare imprimare... Page up (Browser) Pagină în sus (Browser) Page down (Browser) Pagină în jos (Browser) Save As... Salvează ca... Save Page As... Salvează pagină ca... Show/Hide Arată / Ascunde Feeds Toolbar Bară intrumente fluxuri News Toolbar Bară intrumente noutăţi Browser Toolbar Bară intrumente browser Panel Categories Panou categorii Status Bar Bară de stare Full Screen Tot ecranul Stay On Top Stă deasupra Categories Categorii Label Etichetă Show labels menu Arată etichete meniu Close Tab ÃŽnchide tab Close Other Tabs ÃŽnchide celelalte tab-uri Close All Tabs ÃŽnchide toate tab-urile Switch to next tab Comutare la următorul tab Switch to previous tab Comutare la tab anterior Unread Necitit Starred Cu stea Deleted Åžters Labels Etichete Decrease news list/increase browser MicÅŸorare listă noutăţi/mărire browser Increase news list/decrease browser Mărire listă noutăţi/micÅŸorare browser Find Căutare Open Homepage Feed Deschide flux pagină de start Sort by Name Sortează după nume Collapse All Folders Restrînge toate folderele Expand All Folders Extinde toate folderele Next Folder Folderul următor Previous Folder Folderul anterior Expand Folder Extinde folder Setting Page: Labels Setare pagină: Etichete Share Distribuie Sort By Sortare după Ascending Crescător Descending Descrescător Check for updates Verificare actualizări A new version of QuiteRSS... O nouă versiune a QuiteRSS... Loading... ÃŽncărcare... Web Page Pagină web Save As Salvează ca HTML-Files (*.%1) FiÅŸiere HTML (*.%1) Text files (*.%2) FiÅŸiere text (*.%2) Save As: can't open a file Salvare ca: Nu se poate deschide fiÅŸierul! Choose Directory AlegeÅ£i folderul Important Important Work Lucru Personal Personal To Do De făcut Later Mai tîrziu Amusingly Amuzant NetworkManager SSL Certificate Error! Eroare certificat SSL! The "%1" server has the following errors in the SSL certificate: Serverul "%1" are următoarele erori în certificatul SSL: <b>Organization: </b> <b>OrganizaÅ£ie: </b> <b>Domain Name: </b> <b>Nume domeniu: </b> <b>Expiration Date: </b> <b>Data expirării: </b> <b>Error: </b> <b>Eroare: </b> Would you like to make an exception for this certificate? DoriÅ£i să faceÅ£i o excepÅ£ie pentru acest certificat? NewsFiltersDialog News Filters Filtru noutăţi Feeds Fluxuri Filter Name Nume filtru New... Nou... Edit... Editare... Delete... Åžterge... Move up Mutare în sus Move down Mutare în jos Run Filter Rulează filtru Delete Filter Åžterge filtru Are you sure you want to delete the filter '%1'? Sigur doriÅ£i ÅŸteregerea filtrului '%1'? NewsHeader Icon Feed Icon flux Title Titlu Published Publicat Received RecepÅ£ionat Author Autor Category Categorie Read Citit Star Stea Label Etichetă Feed Title Titlu flux Link Legătură NewsItem Mark Read/Unread marcare Citit/Necitit Delete News Åžterge noutăţi NewsTabWidget Loading... (%p%) ÃŽncărcare... (%p%) Home Acasă Open Page in External Browser Deschide pagină în browser extern Open Link in External Browser Deschide legătură în browser extern Open Link Deschide legătură Open in New Tab Deschide în tab nou Save Link... Salvează legătură... Save Image... Salvează imagine... Copy Link Copiază legătură Copy Copiază Go Back ÃŽnapoi Go Forward ÃŽnainte Stop Stop Reload Reîncarcă Copy Image Copiază imagine Copy Image Address Copiază adresă imagine Load Images ÃŽncărcare imagini Auto Load Images to News View Auto încărcare imagini pentru vizualizare noutăţi No Load Images Nu încarcă imagini No Load Images to News View Nu încarcă imagini pentru vizualizare noutăţi Close Tab ÃŽnchide tab Auto Load Images in News View Auto încărcare imagini în vizualizare noutăţi Don't Load Images Nu încarcă imagini Don't Load Images in News View Nu încarcă imagini în vizualizare noutăţi Comments Comentarii Author: %1 Autor: %1 audio audio video video media media Link to Legătură către Mark Read/Unread Marcare Citit/Necitit Mark News Star Marchează noutăţile cu stea Label Etichetă Share Distribuie Open News in External Browser Deschide noutate în browser extern Delete Åžterge NotificationWidget Close ÃŽnchidere Mark All News Read Marchează toate noutăţile citite Previous Page Pagina anterioară Next Page Pagina următoare Incoming News: %1 Sosire noutăţi: %1 Page %1 of %2 Pagina %1 din %2 OptionsDialog Options OpÅ£iuni General General System Tray Bară sistem Network Connections Conexiuni reÅ£ea Browser Browser Feeds Fluxuri Labels Etichete Notifications Notificări Passwords Parole Language Limbă Fonts & Colors Fonturi & Culori Keyboard Shortcuts Scurtături taste Warning: key is already assigned to AtenÅ£ionare: tasta este deja atribuită către Show splash screen on startup Arată imagine la pornire Reopen last opened feeds on startup Redeschide ultimele fluxuri deschise la pornire Open new tab next to active Deschide tab nou lîngă cel activ Hide feeds tree when opening tabs Ascunde arbore fluxuri la deschidere tab-uri Show default rss-icon instead of favourite one Arată icon-rss iniÅ£ial în loc de cel favorit Automatically collapse folders Restrînge automat foldere Show close button on tab Arată buton închidere în tab Automatically check for updates Verificare actualizări atomată Help improve QuiteRSS by sending usage information AjutaÅ£i la îmbunătăţirea QuiteRSS prin trimiterea de informaÅ£ii de utilizare Store a DB in memory (requires program restart) Stochează o BD în memorie (necesită repornire program) Save DB stored in memory to file every Salvează BD stocată în memorie în fiÅŸier la fiecare minutes minute Run QuiteRSS at Windows startup Pornire QuiteRSS la încărcare Windows Show system tray icon Arată icon sistem în bară starting QuiteRSS pornire QuiteRSS minimizing QuiteRSS minimizare QuiteRSS closing QuiteRSS închidere QuiteRSS Show static icon Arată icon static Change icon for incoming new news Schimbă icon pentru sosire noutăţi noi Show count of new news Arată nr. de noutăţi noi Show count of unread news Arată nr. de noutăţi necitite Single click instead of double click for show window Clic singular în loc de dublu-clic pentru a arăta fereastra Empty working set on minimize to tray Golire set de lucru la minimizare în bară Move to the system tray when: Mutare în bară la: Tray icon behavior: Comportament icon din bară: Direct connection to the Internet Conexiune directă la internet System proxy configuration (if available) ConfiguraÅ£ie proxy sistem (dacă este disponibilă) Manual proxy configuration: ConfiguraÅ£ie proxy manuală: Proxy server: Server proxy: Port: Port: Username: Nume utilizator: Password: Parolă: Request timeout: Expirare cerere: Number of requests: Număr de cereri: Number of retries: Număr de reîncercări: Options network requests when updating feeds (requires program restart): OpÅ£iuni cerere reÅ£ea la actualizare fluxuri (necesită restart program): Use embedded browser FoloseÅŸte browser încorporat Use external browser FoloseÅŸte browser extern Default external browser FoloseÅŸte browser implicit Following external browser: Urmărire browser extern: Browse... Răsfoire... Load images ÃŽncărcare imagini Enable JavaScript Activare JavaScript Enable plug-ins Activare plug-in-uri Open links in embedded browser in background Deschide legături în browser încorporat în fundal Open links in external browser in background (experimental) Deschide legături în browser extern în fundal (experimental) Default zoom on pages: Zoom iniÅ£ial la pagini: Browser selection: Selectare browser: External browser: Browser extern: Content: ConÅ£inut: User style sheet: Stil foaie utilizator: Maximum pages in cache Pagini maxim în cache Store cache in: Stocare cache în: Maximum size of disk cache Mărime maximă cache a discului MB MB Use disk cache Folosire cache disc Allow local data to be set Permite trimitere date locale Keep local data only until quit application Păstrare date locale doar pînă la închiderea aplicaÅ£iei Block sites from setting any data Blocare site-uri pentru trimitere orice date Clear Golire Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash este un plugin care blochează încărcarea automată a conÅ£inutului Flash în pagină. PuteÈ›i întotdeauna încărca manual, făcînd clic pe pictograma redare Flash. Use Click to Flash Folosire Click to Flash Add... Adaugă... Remove... ÃŽnlătură... Ask where to save each file before downloading ÃŽntreabă unde salvează fiecare fiÅŸier înainte de descărcare Download location: LocaÅ£ie descărcare: History Istoric Click to Flash Click to Flash Downloads Descărcări Automatically update the feeds on startup Actualizare atomată fluxuri la pornire Automatically update the feeds every Actualizare atomată fluxuri la fiecare seconds secunde hours ore Nothing to do Nimic de făcut Dec Dec December Decembrie Display format for date: Format afiÅŸare dată: time: timp: Alternating row background colors Culoare alternativă rînd fundal Simplified representation of date and time Reprezentare simplificată a datei ÅŸi timpului Show All Arată toate Show New Arată noutăţi Show Unread Arată necitite Show Starred Arată pe cele cu stea Show Not Starred Arată pe cele fără stea Show Unread or Starred Arată pe cele necitite sau cu stea Show Last Day Arată din ultima zi Show Last 7 Days Arată din ultimele 7 zile Style sheet for news: Foaie de stil pentru ÅŸtiri: Mark news as read: Marchează noutăţile ca citită: on selecting. With timeout la selectare. Cu întîrziere after switching to another news după comutarea la altă noutate Mark displayed news as read when switching feeds Marcare noutăţi afiÅŸate ca citite la comutare fluxuri Mark displayed news as read when closing tab Marcare noutăţi afiÅŸate ca citite la închidere tab Mark displayed news as read on minimize Marcare noutăţi afiÅŸate ca citite la minimizare Change behavior of action 'Next Unread News' Schimbă comportamentul acÅ£iunii 'Următoarele noutăţi necitite' starred news noutăţi cu stea labeled news noutăţi cu etichetă Automatically mark identical news as read Marcare automată ca citite a noutăţilor identice Prevent accidental deletion of: Previne ÅŸtergerea accidentală a: Enable cleanup on shutdown Activare punere în ordine la închidere Maximum age of news in days to keep: Vîrstă maximă a noutăţilor de păstrat: Maximum number of news to keep: Nr. maxim de fluxuri de păstrat: Delete read news Åžterge noutăţile citite Never delete unread news Nu ÅŸterge niciodată noutăţile citite Never delete starred news Nu ÅŸterge niciodată noutăţile cu stea Never delete labeled news Nu ÅŸterge niciodată noutăţile cu etichetă Clean up 'Deleted' Pune în ordine 'Åžterse' Enable DB optimization (slower shutdown) Activare optimizare BD (închidere lentă) Reading Citire Clean Up Pune în ordine New... Nou... Edit... Editare... Delete... Åžterge... Move up Mutare în sus Move down Mutare în jos Show when inactive main window Arată cînd este inactivă fereastra principală Screen Ecran Transparency Transparenţă Show titles feeds Arată titluri fluxuri Show icon feed Arată icon flux Show button 'Mark All News Read' Arată butonul "Marchează toate noutăţile ca citite" Show button 'Mark Read/Unread' Arată butonul "Marcare Citit/Necitit" Show button 'Open in External Browser' Arată butonul "Deschide în browser extern" Show button 'Delete News' Arată butonul "Åžterge noutăţi" Play sound for incoming new news Redă sunet la sosire noutăţi noi Play Redare Display notification for incoming news AfiÅŸare notificare pentru sosire noutăţi Top Left Stînga-sus Top Right Dreapta-sus Bottom Left Stînga-jos Bottom Right Dreapta-jos Review Revizuire Position PoziÅ£ie Show maximum of Arată maxim item on page notification element pe pagina notificărilor Width list items Lăţime listă elemente pixels pixeli Close notification after ÃŽnchide notificare după Do not show notification in fullscreen mode Nu arată notificăr în mod tot ecranul Display AfiÅŸaj Action mouse on news opening: AcÅ£iune la deschidere noutăţi: Single Click: Clic simplu: Double Click: Dublu clic: Middle Click: Clic mijloc: Only show selected feeds: AfiÅŸare doar fluxuri selectate: Notification Notificări Sound Sunet Selection of feeds SelecÅ£ia fluxurilor All Feeds Toate fluxurile Site Site User Utilizator Password Parolă Delete Åžterge Delete All Åžterge toate Show Passwords Arată parole Version Versiune Author Autor Contact Contact Choose language: Selectare limbă: Type Tip Font Font Feeds list font Font listă fluxuri News list font Font listă noutăţi News title font Font titlu noutăţi News text font Font text noutăţi Notification font Font notificări Change... Schimbă... Reset Reset Feeds list color Culoare listă fluxuri Feeds list background Fundal listă fluxuri News list color Culoare listă noutăţi News list background Fundal listă noutăţi Focused news color Culoare noutate focalizată Focused news background color Culoare fundal noutate focalizată Link color Culoare legătură Title color Culoare titlu Date color Culoare dată Author color Culoare autor News text color Culoare text noutăţi News title background Fundal titlu noutăţi News background Fundal noutăţi Feed with new news Flux cu noutăţi noi Count of unread news in feeds tree Nr. noutăţi necitite în arbore fluxuri Disabled feed Dezactivează flux Alternating row colors Culoare alternativă la rînduri Notification text color Culoare text notificări Notification background color Culoare fundal notificări Auto load images in news view Auto încărcare imagini în vizualizare noutăţi Text color of new news Culoarea textului noutăţilor Show feeds tree toggle Arată comutator arbore fluxuri Clear new status when minimize to tray Åžtergere statut nou la minimizare în bară Set focus on the last opened news Setare focalizare la ultimele noutăţi deschise Set focus at the top of news list Setare focalizare în partea de sus la ultimele noutăţi deschise Set focus on the unread news Setare focalizare la noutăţi necitite Open the news Deschide noutăţi Default news filter: Filtru noutăţi iniÅ£ial: Action on feed opening: Ac'iune la deschidere noutăţi: Show news description instead of loading web page Arată descriere noutăţi în loc de încărcarea paginii web Text color of unread news Culoarea textului noutăţilor necitite Focused feed color Culoare flux focalizat Focused feed background color Culoare fundal flux focalizat Standard Standard Fixed Fix Serif Serif Sans Serif Sans Serif Cursive Cursiv Fantasy Fantezie Default font size Mărime font iniÅ£ială Fixed font size Mărime font fixă Minimum font size Mărime minimă font Minimum logical font size Mărime minim logică a font-ului Font families: Familii font: Font sizes: Mărimi font: Fonts Font-uri Fonts Browser Font-uri browser Colors Culori Filter Filtru Action AcÅ£iune Description Descriere Shortcut Scurtătură Shortcut: Scurtătură: Open File... Deschide fiÅŸier... Select Style Sheet File Selectare fiÅŸier stil foaie Open Directory... Deschide folder... Add site to whitelist Adaugă site la lista albă Site without 'http://' (ex. youtube.com) Site fără 'http://' (ex. youtube.com) QAbstractSpinBox &Step up Mărire Step &down MicÅŸorare &Select All &Selectare tot QDialogButtonBox Close ÃŽnchidere Cancel Anulare &Yes &Da &No &Nu QFtp Not connected Neconectat Host %1 not found Gazda %1 negăsită Connection refused to host %1 Conexiune refuzată către gazda %1 Connection timed out to host %1 Conexiune expirată către gazda %1 Connected to host %1 Conectat la gazda %1 Connection refused for data connection Conexiune refuzată pentru conectare date Unknown error Eroare necunoscută Connecting to host failed: %1 Conexiune nereuÅŸită către gazda: %1 Login failed: %1 Autentificare nereuÅŸită: %1 Listing directory failed: %1 Listare foldere nereuÅŸită: %1 Changing directory failed: %1 Schimbare folder nereuÅŸită: %1 Downloading file failed: %1 Descărcare fiÅŸier nereuÅŸită: %1 Uploading file failed: %1 ÃŽncărcare fiÅŸier nereuÅŸită: %1 Removing file failed: %1 Åžtergere fiÅŸier nereuÅŸită: %1 Creating directory failed: %1 Creare folder nereuÅŸită: %1 Removing directory failed: %1 Åžtergere folder nereuÅŸită: %1 Connection closed Conexiune închisă QLineEdit &Undo An&ulează &Redo &Reface Cu&t &Taie &Copy &Copiază &Paste Li&pire Delete Åžterge Select All Selectare tot QMultiInputContext Select IM Selectare IM QObject Cannot start external program Nu se poate porni programul extern Cannot start external program! %1 Nu se poate porni programul extern! %1 Error Eroare QTextControl &Undo An&ulează &Redo &Reface Cu&t &Taie &Copy &Copiază &Paste Li&pire Delete Åžterge Select All Selectare tot Copy &Link Location Copiază locaÅ£ie &legătură QWizard Cancel Anulare < &Back < ÃŽnapoi &Finish &Finalizează &Next > ÃŽ&nainte > RSSDetectionWidget Untitled feed Flux fără nume RequestFeed Server requires authentication! Server-ul necesită autentificare! Server replied: Not Found! Răspuns server: Nu s-a găsit! Redirect error! Eroare redirectare! Request timeout! Expirare cerere! SQLiteDriver Error opening database Eroare la deschiderea bazei de date Error closing database Eroare la închiderea bazei de date Unable to begin transaction Imposibil de a începe tranzacÅ£ia Unable to commit transaction Imposibil de a face tranzacÅ£ia Unable to rollback transaction Imposibil de a da înapoi tranzacÅ£ia SQLiteResult Unable to fetch row Imposibil de a aduce rînd No query Nici o interogare Unable to execute statement Imposibil de a executa enunÅ£ul Unable to execute multiple statements at a time Imposibil de a executa enunÅ£uri multiple deodată Unable to reset statement Imposibil de a reseta enunÅ£ul Unable to bind parameters Imposibil de a uni parametrii Parameter count mismatch Nepotrivire număr de parametri SslErrorDialog SSL Certificate Error! Eroare certificat SSL! Only for this session Doar pentru această sesiune UpdateAppDialog Check for Updates Verificare actualizări Checking for updates... Verificare actualizări... Loading history... ÃŽncărcare istoric... Don't remind about this version Nu aminti despre acestă versiune &Install &Instalare You already have the latest version Deja aveÅ£i ultima versiune A new version of QuiteRSS is available! O nouă versiune a QuiteRSS este disponibilă! Click here to go to the download page FaceÅ£i clic aici pentru a merge la pagina de descărcare Your version is: Versiunea dvs. este: Current version is: Versiunea curentă este: Error checking updates Eroare la verificarea actualizărilor quiterss-0.18.3/lang/quiterss_ru.qph000066400000000000000000002500771265173051100175160ustar00rootroot00000000000000 Pause Пауза Next Следущий файл Open Открыть Play ВоÑпроизвеÑти Stop ОÑтановить Previous Предыдущий файл Volume ГромкоÑть Playlist (show/hide) Показать/ÑпрÑтать плейлиÑÑ‚ Open File... Открыть файл... Aspect ratio Пропорции Scale mode Режим маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Default По умолчанию Stretch to window РаÑÑ‚Ñнуть до размера окна Mute Отключить звук Full screen Во веÑÑŒ Ñкран Media files (all types) Медиа файлы (вÑе типы) Video files Видео файлы Audio files Ðудио файлы All files Ð’Ñе файлы &File &Файл &Add... &Добавить... &Delete... &Удалить... Delete selected feed Удалить ленту Add new feed Добавить новую ленту &View Отображение &Tools ÐаÑтройки &Help Сп&равка &View &Вид &Edit &Правка E&xit Ð’&ыход &Tools &ИнÑтрументы Fee&ds &ÐовоÑтные ленты &News ÐовоÑ&ти Fee&ds ÐовоÑтные &ленты Options... ÐаÑтройки... Show window Показать окно &Import feeds... &Импортировать ленты... Import feeds from OPML file Импортировать ленты из OPML-файла Proxy enabled ПрокÑи включен Select OPML-file Выберите OPML-файл OPML-files (*.opml) OPML-файлы (*.opml) Import canceled Отмена Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Import: can't open a file Импортирование: не может открыть файл Feeds Ленты Update Обновить Update current feed Обновить выбранную ленту Update all Обновить вÑе Update all feeds Обновить вÑе ленты All: Ð’Ñего: Unread: Ðепрочитанных: &ToolBar &Панель инÑтрументов Show ToolBar Показать панель инÑтрументов ToolBar Панель инÑтрументов Password: Пароль: Port: Порт: Network Connections Сетевые Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ System proxy configuration (if available) СиÑтемные наÑтройки прокÑи (еÑли имеютÑÑ) Apply Применить Update feeds... (%p%) Обновление лент... (%p%) Received Получено Title Заголовок Open options dialog Открыть окно наÑтроек Are you sure to delete the feed '%1'? Ð’Ñ‹ дейÑтвительно хотите удалить ленту "%1"? Username: Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: Proxy server: ПрокÑи-Ñервер: Date Дата Delete feed Удаление ленты Options ÐаÑтройки Add feed Добавление ленты author Ðвтор Read Прочитано Star Звёздочка Author Ðвтор Show All Показать вÑе Show Unread Показать непрочитанные Filter Фильтр Error loading to WebView Ошибка загрузки WebView Loading... (%p%) Загрузка... (%p%) Mark Read Отметить прочитанной Mark current news read Отметить текущую новоÑть прочитанной Mark all news Read Отметить вÑе новоÑти прочитанными About О программе Version ВерÑÐ¸Ñ The authors: Ðвторы: &Close &Закрыть Feed Title: Ðазвание новоÑтной ленты: Feed Title: Ðазвание ленты: Feed Url: ÐÐ´Ñ€ÐµÑ Ð»ÐµÐ½Ñ‚Ñ‹: Feed Title: Заголовок ленты: Mark all news Read Отметить вÑе прочитанными &Load images &Загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Open in Browser Открыть в браузере Delete Удалить Open in Browser Открыть в браузере Mark feed read Отметить ленту прочитанной Properties СвойÑтва Properties feed СвойÑтва ленты Author: Ðвтор: Title: Заголовок: Auto load images to news view ÐвтоматичеÑÐºÐ°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° изображений Language Язык Automatically update the feeds on start-up ÐвтоматичеÑкое обновление лент при запуÑке Automatically update the feeds every ÐвтоматичеÑкое обновление лент каждые General Общие English (%1) ÐнглийÑкий (%1) * - changes will take effect after restart * - Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑтупÑÑ‚ в Ñилу поÑле перезапуÑка Russian (%1) РуÑÑкий (%1) Choose language:* Выберите Ñзык:* Show New Показать новые Check for updates... Проверить наличие обновлений... Unread: %1 Ðепрочитанных: %1 All: %1 Ð’Ñего: %1 Checking for updates... Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹... Check for updates Проверить наличие обновлений You already have the latest version У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑть поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ A new version of QuiteRSS is available! ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ QuiteRSS! Click here to go to the download page Ðажмите здеÑÑŒ, чтобы перейти на Ñтраницу загрузки Current version is: Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ: Error checking updates Ошибка при проверке обновлений Fonts Шрифты Choose language: Выберите Ñзык: Type Тип Font Шрифт Feeds list font Шрифт ÑпиÑка лент News list font Шрифт ÑпиÑка новоÑтей News font Шрифт новоÑти News font Шрифт новоÑти Change... Изменить... Reset Ð¡Ð±Ñ€Ð¾Ñ Load feed title Загрузить заголовок ленты Feed URL: URL ленты: Homepage: ДомашнÑÑ Ñтраница: System tray СиÑтемный трей minutes минуты starting QuiteRSS при запуÑке QuiteRSS minimizing QuiteRSS при минимизации QuiteRSS closing QuiteRSS при закрытии QuiteRSS Single click instead of double click for show window Один клик вмеÑто двойного клика Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð° Empty working set on minimize to tray ОÑвобождение памÑти при минимизации в трей Move to the system tray when: Помещать в Ñиcтемный трей: No load images Ðе загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ No load images to news view Ðе загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Load images Загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Style Стиль Icon Иконка Text ТекÑÑ‚ Text beside icon ТекÑÑ‚ Ñ€Ñдом Ñ Ð¸ÐºÐ¾Ð½ÐºÐ¾Ð¹ Text under icon ТекÑÑ‚ под иконкой Big Большой Normal Ðормальный Small Маленький Mark current news read/unread Отметить текущую новоÑть прочитанной/непрочитанной Mark Read/Unread Отметить прочитанной/непрочитанной Update feed Обновить ленту Icon size Размер иконки Show amount of new news Показывать количеÑтво новых новоÑтей Mark selected news as read after Отметить выделенную новоÑть как прочитанную поÑле seconds Ñекунд Mark selected news as read after Пометить выделенную новоÑть прочитанной поÑле Reading Чтение New news: %1 Ðовых новоÑтей: %1 Show static icon Показывать ÑтатичеÑкую иконку Change icon for incoming new news ИзменÑть иконку при входÑщих новых новоÑÑ‚ÑÑ… Show the count of new news Показывать количеÑтво новых новоÑтей Show the count of unread news Показывать количеÑтво непрочитанных новоÑтей Tray icon behavior: Поведение иконки в трее: New news: %1 Ðовых новоÑтей: %1 Mark all feeds Read Отметить вÑе ленты прочитанными Clear status new on minimize to tray ОчиÑтить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð¾Ð²Ñ‹Ðµ при минимизации в трей Published Опубликовано Browser Браузер Use the embedded browser ИÑпользовать внутренний браузер Show count of new news Показывать количеÑтво новых новоÑтей Show count of unread news Показывать количеÑтво непрочитанных новоÑтей Update done Обновление завершено Acknowledgements: БлагодарноÑти: Export canceled Отмена ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Export: can't open a file ЭкÑпортирование: не может открыть файл &Export feeds... &ЭкÑпортировать ленты... Export feeds to OPML file ЭкÑпортировать ленты из OPML-файла Loading history... Загрузка иÑтории... News filters... Фильтры новоÑтей... Filter news... Фильтр новоÑтей... Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Play sound for incoming new news ВоÑпроизводить звук при входÑщих новых новоÑÑ‚ÑÑ… Enable JavaScript Включить JavaScript Enable plug-ins Включить плагины Notifications Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Are you sure to delete the filter '%1'? Ð’Ñ‹ дейÑтвительно хотите удалить фильтр '%1'? Delete... Удалить... New... Создать... Edit... Изменить... Move up Вверх Move down Вниз Delete filter Удалить фильтр Name filter Ð˜Ð¼Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° Location РаÑположение Status СоÑтоÑние New Ðовое Add condition Добавить уÑловие Delete condition Удалить уÑловие Description ОпиÑание doesn't contains не Ñодержит is Ñовпадает Ñ doesn't contains не Ñодержит contains Ñодержит isn't не Ñовпадает Ñ begins with начинаетÑÑ Ñ ends with заканчиваетÑÑ Ð½Ð° Add action Добавить дейÑтвие Delete action Удалить дейÑтвие Add star Отметить звёздочкой Mark news as read Отметить как прочитанной Filter rules Правила фильтрации Perform these actions: Выполнить Ñледующие дейÑтвиÑ: Move news ПеремеÑтить новоÑть Copy news Копировать новоÑть Copy news to Копировать новоÑть в Move news to ПеремеÑтить новоÑть в Match all conditions СоответÑтвует вÑем уÑловиÑм Match any condition СоответÑтвует любому уÑловию Mark news star Отметить новоÑть звёздочкой Delete selected news Удалить выбранные новоÑти Previous feed ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð»ÐµÐ½Ñ‚Ð° Next feed Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð»ÐµÐ½Ñ‚Ð° Previous news ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть Next news Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть Shortcut: Сочетание клавиш: Keyboard shortcuts ГорÑчие клавиши hours чаÑÑ‹ Action ДейÑтвие Clear ОчиÑтить Show splash screen on startup Показывать заÑтавку при запуÑке Show system tray icon Показывать иконку в ÑиÑтемном трее Reopen last opened feeds on startup Повторно открывать поÑледнюю открытую ленту при запуÑке Show news' description instead of loading web page Показывать опиÑание новоÑти вмеÑто загрузки веб-Ñтраницы Maximum number of news to keep: МакÑимальное количеÑтво ÑохранÑемых новоÑтей: Maximum age of news in days to keep: МакÑимальный возраÑÑ‚ ÑохранÑемых новоÑтей в днÑÑ…: Delete read news УдалÑть прочитанные новоÑти Never delete unread news Ðикогда не удалÑть непрочитанные новоÑти Never delete starred news Ðикогда не удалÑть новоÑти отмеченные звёздочкой Clean Up ОчиÑтка German (%1) Ðемецкий (%1) Starred Отмечена звёздочкой Style application Стиль Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ System СиÑтемный Default По умолчанию French (%1) ФранцузÑкий (%1) Open in external browser Открыть во внешнем браузере Green Зелёный Orange Оранжевый Purple Фиолетовый Pink Розовый Gray Серый &Undo &Отменить дейÑтвие &Redo &Повторить дейÑтвие Cu&t &Вырезать &Copy &Копировать &Paste Ð’&Ñтавить Select All Выделить вÑÑ‘ Select IM Выбор режима ввода Yes &Да Home Домой &Yes &Да &No &Ðет &Step up Шаг вв&ерх Step &down Шаг вн&из &Select All &Выделить вÑÑ‘ Create new feed Создание новой ленты Displayed name: Отображаемое имÑ: Duplicate feed! Дубликат ленты! Can't find feed URL! Ðе удалоÑÑŒ найти URL ленты! Switch focus between panels Переключение фокуÑа между панелÑми Switch focus between panels (tree feeds, list news, browser) Переключение фокуÑа между панелÑми (дерево лент, ÑпиÑок новоÑтей, браузер) Show/hide tree feeds Показать/Ñкрыть дерево лент Open news Открывать новоÑть Position at top of list news Позиционировать на начало ÑпиÑка новоÑтей Position on last opened news Позиционировать на поÑледней открытой новоÑти Nothing to do Ðичего не делать Opening feed: Открытие ленты: Contact Контакт Hungarian (%1) ВенгерÑкий (%1) Open in new tab Открыть в новой вкладке A new version of QuiteRSS... ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ QuiteRSS... Browser position ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð° Top Вверху Bottom Внизу Right Справа Left Ñлева Left Слева Columns Колонки Count news unread КоличеÑтво непрочитанных новоÑтей Count news all КоличеÑтво вÑех новоÑтей Last updated ПоÑледнее обновление Display feed on startup Показывать ленту при запуÑке Please enter name for the filter. ПожалуйÑта, введите название фильтра. Please enter search condition for the news filter. Введите уÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð¸Ñка Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñтного фильтра. Filter news Фильтр новоÑтей Apply selected filter Применить выбранный фильтр Close tab Закрыть вкладку Use following external browser: ИÑпользовать Ñледующий внешний браузер: Use standard external browser ИÑпользовать Ñтандартный внешний браузер Use embedded browser ИÑпользовать вÑтроенный браузер Browse... Обзор... Browser selection: Выбор браузера: Content: Содержимое: Open news in new tab Открыть новоÑть в новой вкладке Open in background tab Открыть в фоновой вкладке Open news in background tab Открыть новоÑть в фоновой вкладке Loading... Загрузка... Show maximum of Показывать макÑимум Show splash screen on startup Показывать заÑтавку при запуÑке Close notification after Закрывать уведомление поÑле Starred Ð˜Ð·Ð±Ñ€Ð°Ð½Ð½Ð°Ñ All Feeds Ð’Ñе ленты December Декабрь Display format for date and time in list of news: Формат Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹ и времени в ÑпиÑке новоÑтей: &Add Feed... &Добавить ленту... Show Starred Feeds Показать избранные ленты Application Style Стиль Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Display feed in new tab on startup Показывать ленту в новой вкладке при запуÑке Created: Создана: News count: КоличеÑтво новоÑтей: Long ago ;-) Давным-давно ;-) Find Name Ðайти Ð¸Ð¼Ñ Find Link Ðайти ÑÑылку Show Unread or Star Показать непрочитанные и Ñо звёздочкой Position on unread news Позиционировать на непрочитанной новоÑти Mark displayed news as read when switching feeds Отметить отображаемые новоÑти как прочитанные при переключении ленты Mark displayed news as read when closing tab Отметить отображаемые новоÑти как прочитанные при закрытии вкладки Mark displayed news as read on minimize Отметить отображаемые новоÑти как прочитанные при минимизации Only show selected feeds: Показывать новоÑти только выбранных лент: new новых unread непрочитанных Search Feed ПоиÑк ленты Store a DB in memory (requires program restart) Хранить БД в памÑти (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк программы) Show Deleted Показать удалённые Restore News ВоÑÑтановить новоÑть Restore ВоÑÑтановить Sort By Сортировать по Sort by Title Сортировать по заголовку Open links in external browser in background (experimental) Открывать ÑÑылки во внешнем браузере в фоновом режиме (ÑкÑпериментально) News panel font (Title, Author) Шрифт панели новоÑтей (Заголовок, Ðвтор) Report a Problem... Сообщить о проблеме... Main Toolbar Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ Customize Toolbar ÐаÑтройка панели инÑтрументов Hide Toolbar Скрыть панель инÑтрументов Print... Печать... Print Web page Печать веб-Ñтраницы Print Preview... Предварительный проÑмотр... Preview Web page Предварительный проÑмотр веб-Ñтраницы News Toolbar Панель ÑпиÑка новоÑтей Browser Toolbar Панель браузера Web Page Веб-Ñтраница Zoom МаÑштаб Zoom in in browser Увеличение маÑштаба в браузере Zoom out in browser Уменьшение маÑштаба в браузере 100% 100% Reset zoom in browser Ð¡Ð±Ñ€Ð¾Ñ Ð¼Ð°Ñштаба в браузере Full Screen Во веÑÑŒ Ñкран Revision Ð ÐµÐ²Ð¸Ð·Ð¸Ñ History ИÑÑ‚Ð¾Ñ€Ð¸Ñ License Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ New Folder... ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°... Add Folder Добавление папки Name: ИмÑ: Open Page in External Browser Открыть Ñтраницу во внешнем браузере Open Link in External Browser Открыть ÑÑылку во внешнем браузере Delete Folder Удалить папку Add New Folder Добавить новую папку Stay On Top Поверх вÑех окон Show Not Starred Показать без звёздочки Open News in External Browser Открыть новоÑть во внешнем браузере Your version is: Ваша верÑиÑ: Current version is: Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ: QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS - кроÑÑ-Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼ÐµÐ½Ð½Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð»ÐºÐ° RSS/Atom новоÑтей Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом Unread: %1 Ðепрочитанных: %1 All: %1 Ð’Ñего: %1 &Feed... &Ленту... F&older... &Папку... Add Label Добавить метку New Label ÐÐ¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° Important Важно Work Работа Personal Личное To Do Сделать Later Позже Amusingly Забавно Load icon... Загрузить иконку... Select color... Выбрать цвет... Color text: Цвет текÑта: Color background: Цвет фона: Select Image Выберите изображение Image files (*.jpg; *.jpeg; *.png; *.bmp) Файлы изображений (*.jpg *.jpeg *.png *.bmp) Load icon: can't open a file Загрузка иконки: не может открыть файл Label Метка Feed Лента &Install &УÑтановить Don't remind about this version Ðе напоминать об Ñтой верÑии Deleted Удаленные Starred Избранные Copy Image Копировать изображение Copy Image Address Скопировать Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Open links in embedded browser in background Открывать ÑÑылки в вÑтроенном браузере в фоновом режиме after switching to another news поÑле Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð° другую новоÑть on selecting. With timeout при выборе. С задержкой Labels Метки Never delete labeled news Ðикогда не удалÑть новоÑти Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ Close Закрыть Hide Categories Скрыть категории Show Categories Показать категории Feeds Toolbar Панель лент Categories Категории Switch to previous tab Перейти к предыдущей вкладке Switch to next tab Перейти к Ñледующей вкладке State СоÑтоÑние Show Passwords Показать пароли User Пользователь Site Сайт Server: Сервер: Server requires authentication: Сервер требует авторизации: Request timeout! Таймаут запроÑа! Message: Сообщение: Save password Запомнить пароль Authorization required ТребуетÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Save As... Сохранить как... Save Page As... Сохранить Ñтраницу как... Decrease news list/increase browser Уменьшение ÑпиÑка новоÑтей/увеличение браузера Increase news list/decrease browser Увеличение ÑпиÑка новоÑтей/уменьшение браузера Restore last deleted news ВоÑÑтановление поÑледней удалёной новоÑти Next Unread News Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть Previous Unread News ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть Switch Focus to Next Panel Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñледующую панель Switch Focus to Next Panel (Tree Feeds, List News, Browser) Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñледующую панель (дерево лент, ÑпиÑок новоÑтей, браузер) Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° предыдущую панель (дерево лент, ÑпиÑок новоÑтей, браузер) Switch Focus to Previous Panel Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° предыдущую панель HTML-File (*.html) HTML-файл (*.html) Save As: can't open a file Сохранить как: не может открыть файл HTML-Files (*.html) HTML-файлы (*.html) Customize Main Toolbar ÐаÑтройка главной панели Customize Feeds Toolbar ÐаÑтройка панели лент Customize News Toolbar ÐаÑтройка панели ÑпиÑка новоÑтей Remove Удалить Hide feeds tree when opening tabs Скрывать дерево лент при открытии вкладки External browser: Внешний браузер: Alternating row background colors Чередование цвета фона Ñтрок Show default rss-icon instead of favourite one ИÑпользовать Ñтандартную иконку Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚ вмеÑто уникальной Show Last Day Показать за поÑледний день Open News Открыть новоÑть Show default rss-icon instead of favourite one ИÑпользовать Ñтандартную иконку Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚ вмеÑто уникальной (favicon) Unread Ðепрочитанные Share ПоделитьÑÑ News title font Шрифт заголовка новоÑти News text font Шрифт текÑта новоÑти Minimum font size of browser Минимальный размер шрифта браузера Minimum logical font size of browser Минимальный логичеÑкий размер шрифта браузера Authentication ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Request failed! Ðе удалоÑÑŒ выполнить запроÑ! Fee&ds &Ленты Filter Feeds Фильтр лент Redirect error! Ошибка переадреÑации! Hide object Скрыть объект Add '%1' to whitelist Добавить '%1' в белый ÑпиÑок Object blocked by ClickToFlash Объект заблокирован ClickToFlash Find in News Ðайти в новоÑÑ‚ÑÑ… Find Title Ðайти заголовок Find Authors Ðайти автора Find Category Ðайти категорию Find in Content Ðайти в Ñодержании Icon Feed Иконка ленты Title Feed Заголовок ленты Link СÑылка Warning: key is already assigned to Предупреждение: клавиша уже назначена на Automatically collapse folders ÐвтоматичеÑки Ñворачивать папки Automatically check for updates ÐвтоматичеÑки проверÑть наличие обновлений User style sheet: ПользовательÑÐºÐ°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñтилей: Maximum pages in cache МакÑимум Ñтраниц в кÑше Store cache in: Хранить кÑш в: Maximum size of disk cache МакÑимальный размер диÑкового кÑша MB МБ Use disk cache ИÑпользовать диÑковый кÑш Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash - плагин, блокирующий автоматичеÑкую загрузку Flash Ñодержимого. Ð’Ñ‹ вÑегда можете проÑмотреть заблокированное Ñодержимое, кликнув по значку 'Play'. Use Click to Flash ИÑпользовать Click to Flash Click to Flash Click to Flash Simplified representation of date and time Упрощенное предÑтавление даты и времени Change behavior of action 'Next Unread News' Изменить поведение дейÑÑ‚Ð²Ð¸Ñ 'Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть' Not delete starred news Ðе удалÑть новоÑти отмеченные звёздочкой Not delete labeled news Ðе удалÑть новоÑти Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ Select Style Sheet File Выберите файл таблицы Ñтилей Open Directory... Открыть каталог... Add site to whitelist Добавить Ñайт в белый ÑпиÑок Site without 'http://' (ex. youtube.com) Сайт без 'http://' (например, youtube.com) Lock Toolbar Закрепить панель инÑтрументов Copy Link News Копировать Ð°Ð´Ñ€ÐµÑ ÑÑылки новоÑти Close Other Tabs Закрыть другие вкладки Close All Tabs Закрыть вÑе вкладки Open Homepage Feed Открыть домашнюю Ñтраницу ленты Sorted by Name ОтÑортировать по имени Collapse All Folders Свернуть вÑе папки Expand All Folders Развернуть вÑе папки Save Image... Сохранить изображение... Cannot start external program Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить внешнюю программу Remaining time unavailable ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтно Error: Ошибка: Done - %1 Готово - %1 few seconds неÑколько Ñекунд Unknown size ÐеизвеÑтный размер Unknown speed ÐеизвеÑÑ‚Ð½Ð°Ñ ÑкороÑть %2 - unknown size (%3) %2 - неизвеÑтный размер (%3) Remaining %1 - %2 of %3 (%4) ОÑталоÑÑŒ %1 - %2 из %3 (%4) Cancelled - %1 Отменено - %1 Delete file Удалить файл Do you want to also delete downloaded file? Ð’Ñ‹ хотите удалить Ñкачаный файл? Open File Открыть файл Open Folder Открыть папку Copy Download Link Скопировать Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Cancel downloading Отменить загрузку Cancelled Отменено Error Ошибка Not found Ðе найдено Sorry, the file %1 was not found! Извините, файл %1 не найден! File %1 (*.%2) Файл %1 (*.%2) All Files (*.*) Ð’Ñе файлы (*.*) Executable: Ðктивные: Arguments: Ðргументы: Ascending ВозраÑтанию Descending Убыванию Sort by: Сортировать по: Fonts & Colors Шрифты и цвета Run QuiteRSS at Windows startup ЗапуÑкать QuiteRSS вмеÑте Ñ Windows Ask where to save each file before downloading Запрашивать меÑто Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла перед загрузкой Download location: РаÑположение загружаемых файлов: Downloads Загрузки Top Left Вверху Ñлева Top Right Вверху Ñправа Bottom Left Внизу Ñлева Bottom Right Внизу Ñправа Review ПроÑмотр Position ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Feeds list color Цвет ÑпиÑка лент Feeds list background Фон ÑпиÑка лент News list color Цвет ÑпиÑка новоÑтей News list background Фон ÑпиÑка новоÑтей Focused news color Цвет текÑта новоÑти под курÑором Focused news background color Цвет фона новоÑти под курÑором Link color Цвет ÑÑылки Title color Цвет заголовка Date color Цвет даты Author color Цвет имени автора News title background Фон заголовка новоÑти News background Фон новоÑти Colors Цвета Prevent accidental deletion of: Предотвращать Ñлучайное удаление: labeled news новоÑтей Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ starred news новоÑтей отмеченых звёздочкой Expand Folder Развернуть папку Next Folder Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Previous Folder ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Automatically update every ÐвтоматичеÑкое обновление каждые Clean Up... ОчиÑтка... Not connected Соединение не уÑтановлено Host %1 not found Узел %1 не найден Connection refused to host %1 Ð’ Ñоединении Ñ ÑƒÐ·Ð»Ð¾Ð¼ %1 отказано Connection timed out to host %1 Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° Ñоединение Ñ ÑƒÐ·Ð»Ð¾Ð¼ %1 иÑтекло Connected to host %1 УÑтановлено Ñоединение Ñ ÑƒÐ·Ð»Ð¾Ð¼ %1 Connection refused for data connection Отказ в Ñоединении Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ данных Unknown error ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Connecting to host failed: %1 Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ ÑƒÐ·Ð»Ð¾Ð¼: %1 Login failed: %1 Ðе удалоÑÑŒ авторизоватьÑÑ: %1 Listing directory failed: %1 Ðе удалоÑÑŒ прочитать каталог: %1 Changing directory failed: %1 Ðе удалоÑÑŒ Ñменить каталог: %1 Downloading file failed: %1 Ðе удалоÑÑŒ загрузить файл: %1 Uploading file failed: %1 Ðе удалоÑÑŒ отгрузить файл: %1 Removing file failed: %1 Ðе удалоÑÑŒ удалить файл: %1 Creating directory failed: %1 Ðе удалоÑÑŒ Ñоздать каталог: %1 Removing directory failed: %1 Ðе удалоÑÑŒ удалить каталог: %1 Connection closed Соединение закрыто Clear 'Deleted' ОчиÑтить 'Удалённые' Clean up 'Deleted' Очищать 'Удалённые' Choose Feeds Выберите ленты Clean Up Options Опции очиÑтки Purge DB Очищать БД Totally remove records that had marked 'deleted' from DB. Ancient news could reappear ПолноÑтью удалÑет запиÑи, которые отмечены как "удаленные" из БД. Возможно, удалённые новоÑти загрузÑÑ‚ÑÑ Ñнова Canceled! Отменен! Image files Файлы изображений Load Favicon Загрузить favicon Load Title Загрузить заголовок Select Icon Выбор иконки Select Icon... Выбрать иконку... Allow local data to be set Разрешить Ñохранение локальных данных Block sites from setting any data Ðе разрешать Ñайтам ÑохранÑть локальные данные Cookies: Файлы Ñookies: Count of news unread in feeds tree КоличеÑтво непрочитанных новоÑтей в дереве лент Enable cleanup on shutdown Включить очиÑтку при завершении Keep local data only until quit application СохранÑть локальные данные только до Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ Main news filter: ОÑновной фильтр новоÑтей: Open new tab next to active Открывать новую вкладку Ñ€Ñдом Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹ Show feeds tree toggle at edge of window Показывать переключатель дерева лент Privacy КонфиденциальноÑть Do not show notification in fullscreen mode Ðе показывать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² полноÑкранном режиме Good Хорошо Comments Комментарии SQLite driver not loaded! Драйвер SQLite не загружен! News Page Up) Страница новоÑтей вверх News Page Down) Страница новоÑтей вниз Timeout request: Таймаут запроÑа: Number request: КоличеÑтво запроÑов: Number repeats: КоличеÑтво повторов: Standard Стандартный Fixed ФикÑированный Serif С заÑечками Sans Serif Без заÑечек Cursive КурÑив Fantasy Моноширинный Fixed font size ФикÑированный размер шрифта Minimum font size Минимальный размер шрифта Minimum logical font size Минимальный логичеÑкий размер шрифта Font families: СемейÑтва шрифтов: Font sizes: Размеры шрифтов: Fonts Browser Шрифты браузера OPML-Files (*.%1) OPML-файлы (*.%1) OPML-Files (*.%1 *.%2) OPML-файлы (*.%1 *.%2) Show Not Working Feeds Показать не рабочие ленты Show labels menu Показать меню меток Setting Page: Labels Страница наÑтроек: метки HTML-Files (*.%1) HTML-файлы (*.%1) Save DB stored in memory to file every СохранÑть БД из памÑти в файл каждые Default zoom on pages: МаÑштабирование Ñтраницы по умолчанию: News text color Цвет текÑта новоÑти Text color of new news Цвет текÑта новых новоÑтей в ÑпиÑке Disable update Отключить обновление Play a Sound ВоÑпроизвеÑти звук Show News in Notifier Показать новоÑть в уведомлении Browse Обзор Hide tab bar if only have one tab open Скрыть панель вкладок, еÑли открыта только одна вкладка Text color of unread news Цвет текÑта непрочитанных новоÑтей в ÑпиÑке Focused feed color Цвет текÑта ленты под курÑором Focused feed background color Цвет фона ленты под курÑором Untitled feed Лента без имени Delete News Удалить новоÑть Attention! Need to save data. Save? Внимание! Ðеобходимо Ñохранить данные. Сохранить? Previous Page ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница Next Page Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница Show close button on tab Показать кнопку Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð° вкладке item on page notification Ñлементов на Ñтранице ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Width list items Ширина ÑпиÑка Ñлементов Information Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Application directory: Каталог приложениÑ: Resource directory: Каталог реÑурÑов: Data directory: Каталог данных: Database file: Файл базы данных: Settings file: Файл наÑтроек: Log file: Файл журнала: Add Subscription Добавить подпиÑку Address: ÐдреÑ: Add new subscription to AdBlock: Добавить новую подпиÑку в AdBlock: Custom Rules ПользовательÑкие правила AdBlock Configuration ÐаÑтройки AdBlock Enable AdBlock Включить AdBlock Search... ПоиÑк... Use only essential part of EasyList (for performance reasons) ИÑпользуйте только необходимые чаÑти EasyList (из Ñоображений производительноÑти) Add Rule Добавить правило Remove Rule Удалить правило Add Subscription Добавить подпиÑку Remove Subscription Удалить подпиÑку Update Subscriptions Обновить подпиÑки Learn about writing rules... Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ напиÑании правил... EasyList EasyList Cannot load subscription! Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ подпиÑку! %1 (Error: %2) %1 (Ошибка: %2) Cannot load subscription! Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ подпиÑку! Add Custom Rule Добавить пользовательÑкое правило Please write your rule here: ПожалуйÑта, напишите Ñвоё правило здеÑÑŒ: %1 (recently updated) %1 (недавно обновлено) AdBlock lets you block unwanted content on web pages AdBlock позволÑет блокировать нежелательное Ñодержимое веб-Ñтраниц Show AdBlock &Settings ÐаÑтройки AdBlock Disable on %1 Отключить на %1 Disable on %1 Отключить на %1 Disable only on this page Отключить только на Ñтой Ñтранице Blocked Popup Windows Заблокированные вÑплывающие окна %1 with (%2) %1 из (%2) No content blocked Ðет заблокированных Ñлементов Blocked URL (AdBlock Rule) - click to edit rule СпиÑок заблокированного. Кликните, чтобы редактировать правило Saving data... Сохранение данных... S&how Menu Bar Показ&ывать меню Find in Authors Ðайти в авторах Find in Categories Ðайти в категориÑÑ… Disabled feed Отключенные ленты Alternating row colors Цвет чередующихÑÑ Ñтрок Action on feed opening: ДейÑтвие на открытие ленты: Set focus on the last opened news УÑтановить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° поÑледней открытой новоÑти Clean Up wizard deleted %1 news МаÑтер очиÑтки удалил %1 новоÑтей Page up (Browser) Страница вверх (Браузер) Page down (Browser) Страница вниз (Браузер) Screen Экран Show when inactive main window Показывать при неактивноÑти главного окна Transparency ПрозрачноÑть Show titles feeds Показывать заголовки лент Show icon feed Показывать иконку ленты Show button 'Mark Read/Unread' Показывать кнопку 'Отметить прочитанной/непрочитанной' Show button 'Open in External Browser' Показывать кнопку 'Открыть во внешнем браузере' Show button 'Mark All News Read' Показывать кнопку 'Отметить вÑе новоÑти прочитанными' Show button 'Delete News' Показывать кнопку 'Удалить новоÑть' Sound Звук Selection of feeds Выбор лент Notification text color Цвет текÑта ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Notification background color Цвет фона ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ SSL Certificate Error! Ошибка Ñертификата SSL! The page you are trying to access has the following errors in the SSL certificate: Страница, которую вы пытаетеÑÑŒ проÑмотреть, имеет Ñледующие ошибки в Ñертификате SSL: <b>Organization: </b> <b>ОрганизациÑ: </b> <b>Domain Name: </b> <b>Ð˜Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°: </b> Would you like to continue to the server? Хотели бы вы продолжить работать Ñ Ñервером? quiterss-0.18.3/lang/quiterss_ru.ts000066400000000000000000006055251265173051100173560ustar00rootroot00000000000000 AboutDialog About О программе Revision Ð ÐµÐ²Ð¸Ð·Ð¸Ñ Version ВерÑÐ¸Ñ QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS - кроÑÑ-Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼ÐµÐ½Ð½Ð°Ñ Ñ‡Ð¸Ñ‚Ð°Ð»ÐºÐ° RSS/Atom новоÑтей Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом Includes: Включает: Application directory: Каталог приложениÑ: Resource directory: Каталог реÑурÑов: Data directory: Каталог данных: Backup directory: Каталог резервированиÑ: Database file: Файл базы данных: Settings file: Файл наÑтроек: Log file: Файл журнала: Authors Ðвторы History ИÑÑ‚Ð¾Ñ€Ð¸Ñ License Ð›Ð¸Ñ†ÐµÐ½Ð·Ð¸Ñ Information Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ AdBlockAddSubscriptionDialog Add Subscription Добавить подпиÑку Title: Заголовок: Address: ÐдреÑ: Add new subscription to AdBlock: Добавить новую подпиÑку в AdBlock: AdBlockCustomList Custom Rules ПользовательÑкие правила AdBlockDialog AdBlock Configuration ÐаÑтройки AdBlock Enable AdBlock Включить AdBlock Search... ПоиÑк... Options ÐаÑтройки AdBlock AdBlock Use only essential part of EasyList (for performance reasons) ИÑпользуйте только необходимые чаÑти EasyList (из Ñоображений производительноÑти) Add Rule Добавить правило Remove Rule Удалить правило Add Subscription Добавить подпиÑку Remove Subscription Удалить подпиÑку Update Subscriptions Обновить подпиÑки Learn about writing rules... Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ напиÑании правил... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock позволÑет блокировать нежелательное Ñодержимое веб-Ñтраниц AdBlock AdBlock Show AdBlock &Settings ÐаÑтройки AdBlock Disable on %1 Отключить на %1 Disable only on this page Отключить только на Ñтой Ñтранице Blocked Popup Windows Заблокированные вÑплывающие окна %1 with (%2) %1 из (%2) No content blocked Ðет заблокированных Ñлементов Blocked URL (AdBlock Rule) - click to edit rule СпиÑок заблокированного. Кликните, чтобы редактировать правило AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Ðе удаетÑÑ Ð·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ подпиÑку! AdBlockTreeWidget Add Rule Добавить правило Remove Rule Удалить правило Add Custom Rule Добавить пользовательÑкое правило Please write your rule here: ПожалуйÑта, напишите Ñвоё правило здеÑÑŒ: %1 (recently updated) %1 (недавно обновлено) %1 (Error: %2) %1 (Ошибка: %2) AddFeedWizard Add Feed Добавление ленты Create New Feed Создание новой ленты Use title of the feed as displayed name ИÑпользовать название ленты, как отображаемое Ð¸Ð¼Ñ Server requires authentication: Сервер требует авторизации: Username: Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: Password: Пароль: Feed URL or website address: URL ленты или Ð°Ð´Ñ€ÐµÑ Ð²ÐµÐ±-Ñайта: Feeds Ленты All Feeds Ð’Ñе ленты New Folder... ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°... Displayed name: Отображаемое имÑ: Location: РаÑположение: URL error! Ошибка URL! Duplicate feed! Дубликат ленты! Can't find feed URL! Ðе удалоÑÑŒ найти URL ленты! Request failed! Ðе удалоÑÑŒ выполнить запроÑ! AddFolderDialog Add Folder Добавление папки Feeds Ленты All Feeds Ð’Ñе ленты Name: ИмÑ: Location: РаÑположение: AuthenticationDialog Save password Запомнить пароль Authorization required ТребуетÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Server: Сервер: Message: Сообщение: Username: Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: Password: Пароль: CategoriesTreeWidget Unread Ðепрочитанные Starred Избранные Deleted Удаленные Labels Метки Open in New Tab Открыть в новой вкладке Clear 'Deleted' ОчиÑтить 'Удалённые' Mark Read Отметить прочитанной CleanUpWizard Clean Up ОчиÑтка Choose Feeds Выберите ленты All Feeds Ð’Ñе ленты Clean Up Options Опции очиÑтки Maximum age of news in days to keep: МакÑимальный возраÑÑ‚ ÑохранÑемых новоÑтей в днÑÑ…: Maximum number of news to keep: МакÑимальное количеÑтво ÑохранÑемых новоÑтей: Delete read news УдалÑть прочитанные новоÑти Never delete unread news Ðикогда не удалÑть непрочитанные новоÑти Never delete starred news Ðикогда не удалÑть новоÑти отмеченные звёздочкой Never delete labeled news Ðикогда не удалÑть новоÑти Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ Clean up 'Deleted' Очищать 'Удалённые' Purge DB Очищать БД Totally remove records that had marked 'deleted' from DB. Ancient news could reappear ПолноÑтью удалÑет запиÑи, которые отмечены как "удаленные" из БД. Возможно, удалённые новоÑти загрузÑÑ‚ÑÑ Ñнова Information Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Clean Up wizard deleted %1 news МаÑтер очиÑтки удалил %1 новоÑтей ClickToFlash Object blocked by ClickToFlash Объект заблокирован ClickToFlash Hide object Скрыть объект Add '%1' to whitelist Добавить '%1' в белый ÑпиÑок CustomizeToolbarDialog Customize Main Toolbar ÐаÑтройка главной панели Customize Feeds Toolbar ÐаÑтройка панели лент Customize News Toolbar ÐаÑтройка панели ÑпиÑка новоÑтей Load images Загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Separator Разделитель Icon Иконка Text ТекÑÑ‚ Text Beside Icon ТекÑÑ‚ Ñ€Ñдом Ñ Ð¸ÐºÐ¾Ð½ÐºÐ¾Ð¹ Text Under Icon ТекÑÑ‚ под иконкой Big Большой Normal Ðормальный Small Маленький Style: Стиль: Icon Size: Размер иконки: Add Добавить Remove Удалить Move up Вверх Move down Вниз Default По умолчанию DownloadItem Remaining time unavailable ОÑтавшееÑÑ Ð²Ñ€ÐµÐ¼Ñ Ð½ÐµÐ¸Ð·Ð²ÐµÑтно Error: Cannot write to file! Ошибка! Ðевозможно выполнить запиÑÑŒ в файл! Error: Ошибка: few seconds неÑколько Ñекунд seconds Ñекунд minutes минуты hours чаÑÑ‹ Unknown size ÐеизвеÑтный размер Unknown speed ÐеизвеÑÑ‚Ð½Ð°Ñ ÑкороÑть %2 - unknown size (%3) %2 - неизвеÑтный размер (%3) Remaining %1 - %2 of %3 (%4) ОÑталоÑÑŒ %1 - %2 из %3 (%4) Cancelled - %1 Отменено - %1 Delete file Удалить файл Do you want to also delete downloaded file? Ð’Ñ‹ дейÑтвительно хотите удалить загруженный файл? Open File Открыть файл Open Folder Открыть папку Copy Download Link Скопировать Ð°Ð´Ñ€ÐµÑ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ Cancel Downloading Отменить загрузку Remove Удалить Cancelled Отменено Error Ошибка Not found Ðе найдено Sorry, the file %1 was not found! Извините, файл %1 не найден! DownloadManager Clear ОчиÑтить File %1 (*.%2) Файл %1 (*.%2) All Files (*.*) Ð’Ñе файлы (*.*) Save As... Сохранить как... Executable: Ðктивные: Arguments: Ðргументы: FeedPropertiesDialog Properties СвойÑтва General Общие Columns Колонки Authentication ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Status СоÑтоÑние Title: Заголовок: Homepage: ДомашнÑÑ Ñтраница: Feed URL: URL ленты: Load Title Загрузить заголовок Load Favicon Загрузить favicon Select Icon... Выбрать иконку... Select Icon Выбор иконки Disable update Отключить обновление Automatically update every ÐвтоматичеÑкое обновление каждые seconds Ñекунд minutes минуты hours чаÑÑ‹ Starred Ð˜Ð·Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Load images Загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Display in new tab on startup Показывать в новой вкладке при запуÑке Show news' description instead of loading web page Показывать опиÑание новоÑти вмеÑто загрузки веб-Ñтраницы Automatically delete duplicate news ÐвтоматичеÑкое удаление дубликатов новоÑтей Display Отображение Reading Чтение Enable JavaScript Включить JavaScript Right-to-left layout Макет Ñправа-налево Ascending ВозраÑтанию Descending Убыванию Sort by: Сортировать по: Add Добавить Remove Удалить Move up Вверх Move down Вниз Default По умолчанию Server requires authentication: Сервер требует авторизации: Username: Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: Password: Пароль: Feeds count: КоличеÑтво лент: Description: ОпиÑание: Status: СоÑтоÑние: Created: Создана: Last update: ПоÑледнее обновление: News count: КоличеÑтво новоÑтей: Good Хорошо Long ago ;-) Давным-давно ;-) new новых unread непрочитанных Image files Файлы изображений Select Image Выберите изображение Load icon: can't open a file! Загрузка иконки: не может открыть файл! FilterRulesDialog Filter Rules Правила фильтрации Feeds Ленты All Feeds Ð’Ñе ленты Filter name: Ð˜Ð¼Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°: Match all news СоответÑтвует вÑем новоÑÑ‚Ñм Match all conditions СоответÑтвует вÑем уÑловиÑм Match any condition СоответÑтвует любому уÑловию Perform these actions: Выполнить Ñледующие дейÑтвиÑ: Please enter name for the filter. ПожалуйÑта, введите название фильтра. Please enter search condition for the news filter. Введите уÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð¸Ñка Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñтного фильтра. FindFeed Find Name Ðайти Ð¸Ð¼Ñ Find Link Ðайти ÑÑылку FindTextContent Find in News Ðайти в новоÑÑ‚ÑÑ… Find in Titles Ðайти в заголовках Find in Authors Ðайти в авторах Find in Categories Ðайти в категориÑÑ… Find in Descriptions Ðайти в опиÑании Find in Links Ðайти в ÑÑылках Find in Browser Ðайти в браузере FtpDownloader Canceled! Отменен! ItemAction Mark News as Read Отметить как прочитанной Add Star Отметить звёздочкой Delete Удалить Add Label Добавить метку Play a Sound ВоÑпроизвеÑти звук Show News in Notifier Показать новоÑть в уведомлении Browse Обзор Play ВоÑпроизвеÑти Add Action Добавить дейÑтвие Delete Action Удалить дейÑтвие Open File... Открыть файл... ItemCondition Title Заголовок Description ОпиÑание Author Ðвтор Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ State СоÑтоÑние Link СÑылка News ÐовоÑти New Ðовое Read Прочитано Starred Отмечена звёздочкой Add Condition Добавить уÑловие Delete Condition Удалить уÑловие contains Ñодержит doesn't contains не Ñодержит is Ñовпадает Ñ isn't не Ñовпадает Ñ begins with начинаетÑÑ Ñ ends with заканчиваетÑÑ Ð½Ð° Regular expressions РегулÑрные Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ LabelDialog New Label ÐÐ¾Ð²Ð°Ñ Ð¼ÐµÑ‚ÐºÐ° Load icon... Загрузить иконку... Default По умолчанию Select color... Выбрать цвет... Name: ИмÑ: Icon: Иконка: Color text: Цвет текÑта: Color background: Цвет фона: Image files Файлы изображений Select Image Выберите изображение Load icon: can't open a file! Загрузка иконки: не может открыть файл! MainApplication Saving data... Сохранение данных... MainWindow &AdBlock &AdBlock Hide Categories Скрыть категории Show Categories Показать категории Select OPML-File Выберите OPML-файл OPML-Files (*.%1 *.%2) OPML-файлы (*.%1 *.%2) Import canceled Отмена Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Import: can't open a file Импортирование: не может открыть файл OPML-Files (*.%1) OPML-файлы (*.%1) Export canceled Отмена ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Export: can't open a file ЭкÑпортирование: не может открыть файл Unread: %1 Ðепрочитанных: %1 All: %1 Ð’Ñего: %1 (Browser) (Браузер) New News: %1 Ðовых новоÑтей: %1 Unread News: %1 Ðепрочитанных новоÑтей: %1 &Add &Добавить Add New Feed Добавить новую ленту &Feed... &Ленту... F&older... &Папку... Add New Folder Добавить новую папку Open in New Tab Открыть в новой вкладке &Delete... &Удалить... Delete Selected Feed Удалить ленту &Import Feeds... &Импортировать ленты... Import Feeds from OPML File Импортировать ленты из OPML-файла &Export Feeds... &ЭкÑпортировать ленты... Export Feeds to OPML File ЭкÑпортировать ленты из OPML-файла E&xit Ð’&ыход Update Feed Обновить ленту Update Current Feed Обновить выбранную ленту Update All Обновить вÑе Update All Feeds Обновить вÑе ленты Mark All Feeds Read Отметить вÑе ленты прочитанными Mark Read/Unread Отметить прочитанной/непрочитанной Mark Current News Read/Unread Отметить текущую новоÑть прочитанной/непрочитанной Mark All News Read Отметить вÑе новоÑти прочитанными Downloads Загрузки Clean Up... ОчиÑтка... News Filters... Фильтры новоÑтей... Filter News... Фильтр новоÑтей... Options... ÐаÑтройки... Open Options Dialog Открыть окно наÑтроек Filter Feeds Фильтр лент Show All Показать вÑе Show New Показать новые Show Unread Показать непрочитанные Show Starred Feeds Показать избранные ленты Show Not Working Feeds Показать не рабочие ленты Filter News Фильтр новоÑтей Show Starred Показать Ñо звёздочкой Show Not Starred Показать без звёздочки Show Unread or Starred Показать непрочитанные и Ñо звёздочкой Show Last Day Показать за поÑледний день Show Last 7 Days Показать за поÑледние 7 дней About... О программе... Show 'About' Dialog Показать диалог 'О программе' Check for Updates... Проверить наличие обновлений... Report a Problem... Сообщить о проблеме... Open News Открыть новоÑть Open in Browser Открыть в браузере Open in External Browser Открыть во внешнем браузере Open News in External Browser Открыть новоÑть во внешнем браузере Open News in New Tab Открыть новоÑть в новой вкладке Open in Background Tab Открыть в фоновой вкладке Open News in Background Tab Открыть новоÑть в фоновой вкладке Star Звёздочка Mark News Star Отметить новоÑть звёздочкой Delete Удалить Delete Selected News Удалить выбранные новоÑти Delete All News Удалить вÑе новоÑти Delete All News from List Удалить вÑе новоÑти из ÑпиÑка Restore ВоÑÑтановить Restore News ВоÑÑтановить новоÑть Copy Link Копировать Ð°Ð´Ñ€ÐµÑ ÑÑылки Restore last deleted news ВоÑÑтановление поÑледней удалёной новоÑти Mark Read Отметить прочитанной Mark Feed Read Отметить ленту прочитанной Properties СвойÑтва &File &Файл Count Unread News КоличеÑтво непрочитанных новоÑтей Count All News КоличеÑтво вÑех новоÑтей Last Update ПоÑледнее обновление Reset browser zoom Ð¡Ð±Ñ€Ð¾Ñ Ð¼Ð°Ñштаба в браузере Print Web Page Печать веб-Ñтраницы Preview Web Page Предварительный проÑмотр веб-Ñтраницы Save page in database Сохранить Ñтраницу в базе данных Save page in database instead of news description Сохранить Ñтраницу в базе данных вмеÑто опиÑÐ°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ñти Confirm Delete Подтверждение ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Are you sure to delete selected elements? Ð’Ñ‹ уверены, что хотите удалить выбранные Ñлементы? Menu Меню Add Feed... Добавить ленту... &Create Backup... &Создать резервную копию... S&how Menu Bar Показ&ывать меню Stop Update Feeds ОÑтановить обновление лент Open News Description Открыть опиÑание новоÑти Copy News Link Copy News Link &View &Вид Fee&ds &Ленты &News ÐовоÑ&ти &Browser &Браузер &Tools &ИнÑтрументы &Help Сп&равка Main Toolbar Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ Customize Toolbar ÐаÑтройка панели инÑтрументов Main Toolbar... Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ... Customize Toolbar... ÐаÑтройка панели инÑтрументов... Feeds Toolbar... Панель лент... News Toolbar... Панель ÑпиÑка новоÑтей... Lock Toolbar Закрепить панель инÑтрументов Hide Toolbar Скрыть панель инÑтрументов Layout Макет Classic КлаÑÑик Newspaper Газета Application Style Стиль Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ System СиÑтемный System2 СиÑтемный 2 Green Зелёный Orange Оранжевый Purple Фиолетовый Pink Розовый Gray Серый Browser Position ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð° Top Вверху Bottom Внизу Right Справа Left Слева Show Window Показать окно Previous Feed ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð»ÐµÐ½Ñ‚Ð° Next Feed Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð»ÐµÐ½Ñ‚Ð° Previous News ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть Next News Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть News Page Up Страница новоÑтей вверх News Page Down Страница новоÑтей вниз Next Unread News Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть Previous Unread News ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть Switch Focus to Next Panel Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñледующую панель Switch Focus to Next Panel (Tree Feeds, List News, Browser) Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñледующую панель (дерево лент, ÑпиÑок новоÑтей, браузер) Switch Focus to Previous Panel Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° предыдущую панель Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Переключить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° предыдущую панель (дерево лент, ÑпиÑок новоÑтей, браузер) Show/Hide Tree Feeds Показать/Ñкрыть дерево лент Minimize to Tray Минимизировать в трей Minimize Application to Tray Свернуть приложение в трей Columns Колонки Show Indentation Отображать отÑтуп Search Feed ПоиÑк ленты Zoom МаÑштаб Zoom In Увеличить Zoom in in browser Увеличение маÑштаба в браузере Zoom Out Уменьшить Zoom out in browser Уменьшение маÑштаба в браузере 100% 100% Print... Печать... Print Preview... Предварительный проÑмотр... Page up (Browser) Страница вверх (Браузер) Page down (Browser) Страница вниз (Браузер) Save As... Сохранить как... Save Page As... Сохранить Ñтраницу как... Show/Hide Показать/Ñкрыть Feeds Toolbar Панель лент News Toolbar Панель ÑпиÑка новоÑтей Browser Toolbar Панель браузера Panel Categories Панель категорий Status Bar Строка ÑоÑтоÑÐ½Ð¸Ñ Full Screen Во веÑÑŒ Ñкран Stay On Top Поверх вÑех окон Categories Категории Label Метка Show labels menu Показать меню меток Close Tab Закрыть вкладку Close Other Tabs Закрыть другие вкладки Close All Tabs Закрыть вÑе вкладки Switch to next tab Перейти к Ñледующей вкладке Switch to previous tab Перейти к предыдущей вкладке Unread Ðепрочитанные Starred Избранные Deleted Удаленные Labels Метки Decrease news list/increase browser Уменьшение ÑпиÑка новоÑтей/увеличение браузера Increase news list/decrease browser Увеличение ÑпиÑка новоÑтей/уменьшение браузера Find Ðайти Open Homepage Feed Открыть домашнюю Ñтраницу ленты Sort by Name ОтÑортировать по имени Collapse All Folders Свернуть вÑе папки Expand All Folders Развернуть вÑе папки Next Folder Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Previous Folder ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° Expand Folder Развернуть папку Setting Page: Labels Страница наÑтроек: метки Share ПоделитьÑÑ Sort By Сортировать по Ascending ВозраÑтанию Descending Убыванию Check for updates Проверить наличие обновлений A new version of QuiteRSS... ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ QuiteRSS... Loading... Загрузка... Web Page Веб-Ñтраница Save As Сохранить как HTML-Files (*.%1) HTML-файлы (*.%1) Text files (*.%2) ТекÑтовые файлы (*.%2) Save As: can't open a file Сохранить как: не может открыть файл Choose Directory Выберите каталог Important Важно Work Работа Personal Личное To Do Сделать Later Позже Amusingly Забавно NetworkManager SSL Certificate Error! Ошибка Ñертификата SSL! The "%1" server has the following errors in the SSL certificate: Сервер "%1" имеет Ñледующие ошибки в Ñертификате SSL: <b>Organization: </b> <b>ОрганизациÑ: </b> <b>Domain Name: </b> <b>Ð˜Ð¼Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°: </b> <b>Expiration Date: </b> <b>ИÑтекает: </b> <b>Error: </b> <b>Ошибка: </b> Would you like to make an exception for this certificate? Сделать иÑключение Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ Ñертификата? NewsFiltersDialog News Filters Фильтры новоÑтей Feeds Ленты Filter Name Ð˜Ð¼Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° New... Создать... Edit... Изменить... Delete... Удалить... Move up Вверх Move down Вниз Run Filter ЗапуÑтить Delete Filter Удалить фильтр Are you sure you want to delete the filter '%1'? Ð’Ñ‹ уверены, что хотите удалить фильтр '%1'? NewsHeader Icon Feed Иконка ленты Title Заголовок Published Опубликовано Received Получено Author Ðвтор Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Read Прочитано Star Звёздочка Label Метка Feed Title Заголовок ленты Link СÑылка NewsItem Mark Read/Unread Отметить прочитанной/непрочитанной Delete News Удалить новоÑть NewsTabWidget Loading... (%p%) Загрузка... (%p%) Home Домой Open Page in External Browser Открыть Ñтраницу во внешнем браузере Open Link in External Browser Открыть ÑÑылку во внешнем браузере Open Link Открыть ÑÑылку Open in New Tab Открыть в новой вкладке Save Link... Сохранить по ÑÑылке как... Save Image... Сохранить изображение... Copy Link Копировать Ð°Ð´Ñ€ÐµÑ ÑÑылки Copy Копировать Go Back Ðазад Go Forward Вперёд Stop ОÑтановить Reload Обновить Copy Image Копировать изображение Copy Image Address Скопировать Ð°Ð´Ñ€ÐµÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Load Images Загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Auto Load Images to News View ÐвтоматичеÑÐºÐ°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° изображений No Load Images Ðе загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ No Load Images to News View Ðе загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Close Tab Закрыть вкладку Auto Load Images in News View ÐвтоматичеÑÐºÐ°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° изображений Don't Load Images Ðе загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Don't Load Images in News View Ðе загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Comments Комментарии Author: %1 Ðвтор: %1 audio аудио video видео media медиа Link to СÑылка на Mark Read/Unread Отметить прочитанной/непрочитанной Mark News Star Отметить новоÑть звёздочкой Label Метка Share ПоделитьÑÑ Open News in External Browser Открыть новоÑть во внешнем браузере Delete Удалить NotificationWidget Close Закрыть Mark All News Read Отметить вÑе новоÑти прочитанными Previous Page ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница Next Page Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница Incoming News: %1 ВходÑщие новоÑти: %1 Page %1 of %2 Страница %1 из %2 OptionsDialog Options ÐаÑтройки General Общие System Tray СиÑтемный трей Network Connections Сетевые Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Browser Браузер Feeds Ленты Labels Метки Notifications Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Passwords Пароли Language Язык Fonts & Colors Шрифты и цвета Keyboard Shortcuts ГорÑчие клавиши Warning: key is already assigned to Предупреждение: клавиша уже назначена на Show splash screen on startup Показывать заÑтавку при запуÑке Reopen last opened feeds on startup Повторно открывать поÑледнюю открытую ленту при запуÑке Open new tab next to active Открывать новую вкладку Ñ€Ñдом Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ð¹ Hide feeds tree when opening tabs Скрывать дерево лент при открытии вкладки Show default rss-icon instead of favourite one ИÑпользовать Ñтандартную иконку Ð´Ð»Ñ Ð»ÐµÐ½Ñ‚ вмеÑто уникальной (favicon) Automatically collapse folders ÐвтоматичеÑки Ñворачивать папки Show close button on tab Показать кнопку Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð½Ð° вкладке Automatically check for updates ÐвтоматичеÑки проверÑть наличие обновлений Help improve QuiteRSS by sending usage information ОтправлÑть данные об иÑпользованных возможноÑÑ‚ÑÑ…, чтобы помочь улучшить QuiteRSS Store a DB in memory (requires program restart) Хранить БД в памÑти (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк программы) Save DB stored in memory to file every СохранÑть БД из памÑти в файл каждые minutes минуты Run QuiteRSS at Windows startup ЗапуÑкать QuiteRSS вмеÑте Ñ Windows Show system tray icon Показывать иконку в ÑиÑтемном трее starting QuiteRSS при запуÑке QuiteRSS minimizing QuiteRSS при минимизации QuiteRSS closing QuiteRSS при закрытии QuiteRSS Show static icon Показывать ÑтатичеÑкую иконку Change icon for incoming new news ИзменÑть иконку при входÑщих новых новоÑÑ‚ÑÑ… Show count of new news Показывать количеÑтво новых новоÑтей Show count of unread news Показывать количеÑтво непрочитанных новоÑтей Single click instead of double click for show window Один клик вмеÑто двойного клика Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÐºÐ½Ð° Empty working set on minimize to tray ОÑвобождение памÑти при минимизации в трей Move to the system tray when: Помещать в Ñиcтемный трей: Tray icon behavior: Поведение иконки в трее: Direct connection to the Internet Ðе иÑпользовать прокÑи System proxy configuration (if available) СиÑтемные наÑтройки прокÑи (еÑли имеютÑÑ) Manual proxy configuration: Ð ÑƒÑ‡Ð½Ð°Ñ Ð½Ð°Ñтройка прокÑи: Proxy server: ПрокÑи-Ñервер: Port: Порт: Username: Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ: Password: Пароль: Request timeout: Таймаут запроÑа: Number of requests: КоличеÑтво запроÑов: Number of retries: КоличеÑтво повторов: Options network requests when updating feeds (requires program restart): Параметры Ñетевых запроÑов при обновлении лент (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк программы): Use embedded browser ИÑпользовать вÑтроенный браузер Use external browser ИÑпользовать внешний браузер Default external browser Внешний браузер по умолчанию Following external browser: Следующий внешний браузер: Browse... Обзор... Load images Загружать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Enable JavaScript Включить JavaScript Enable plug-ins Включить плагины Open links in embedded browser in background Открывать ÑÑылки в вÑтроенном браузере в фоновом режиме Open links in external browser in background (experimental) Открывать ÑÑылки во внешнем браузере в фоновом режиме (ÑкÑпериментально) Default zoom on pages: МаÑштабирование Ñтраницы по умолчанию: Browser selection: Выбор браузера: External browser: Внешний браузер: Content: Содержимое: User style sheet: ПользовательÑÐºÐ°Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ð° Ñтилей: Maximum pages in cache МакÑимум Ñтраниц в кÑше Store cache in: Хранить кÑш в: Maximum size of disk cache МакÑимальный размер диÑкового кÑша MB МБ Use disk cache ИÑпользовать диÑковый кÑш Allow local data to be set Разрешить Ñохранение локальных данных Keep local data only until quit application СохранÑть локальные данные только до Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹ Block sites from setting any data Ðе разрешать Ñайтам ÑохранÑть локальные данные Clear ОчиÑтить Cookies: Файлы Ñookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash - плагин, блокирующий автоматичеÑкую загрузку Flash Ñодержимого. Ð’Ñ‹ вÑегда можете проÑмотреть заблокированное Ñодержимое, кликнув по значку 'Play'. Use Click to Flash ИÑпользовать Click to Flash Add... Добавить... Remove... Удалить... Ask where to save each file before downloading Запрашивать меÑто Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ файла перед загрузкой Download location: РаÑположение загружаемых файлов: History ИÑÑ‚Ð¾Ñ€Ð¸Ñ Click to Flash Click to Flash Downloads Загрузки Automatically update the feeds on startup ÐвтоматичеÑкое обновление лент при запуÑке Automatically update the feeds every ÐвтоматичеÑкое обновление лент каждые seconds Ñекунд hours чаÑÑ‹ Nothing to do Ðичего не делать Dec Дек December Декабрь Display format for date: Формат Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð°Ñ‚Ñ‹: time: времени: Alternating row background colors Чередование цвета фона Ñтрок Simplified representation of date and time Упрощенное предÑтавление даты и времени Show All Показать вÑе Show New Показать новые Show Unread Показать непрочитанные Show Starred Показать Ñо звёздочкой Show Not Starred Показать без звёздочки Show Unread or Starred Показать непрочитанные и Ñо звёздочкой Show Last Day Показать за поÑледний день Show Last 7 Days Показать за поÑледние 7 дней Style sheet for news: Таблица Ñтилей Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ñти: Mark news as read: Отметить как прочитанной: on selecting. With timeout при выборе. С задержкой after switching to another news поÑле Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð° другую новоÑть Mark displayed news as read when switching feeds Отметить отображаемые новоÑти как прочитанные при переключении ленты Mark displayed news as read when closing tab Отметить отображаемые новоÑти как прочитанные при закрытии вкладки Mark displayed news as read on minimize Отметить отображаемые новоÑти как прочитанные при минимизации Change behavior of action 'Next Unread News' Изменить поведение дейÑÑ‚Ð²Ð¸Ñ 'Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ð°Ñ Ð½Ð¾Ð²Ð¾Ñть' starred news новоÑтей отмеченых звёздочкой labeled news новоÑтей Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ Automatically mark identical news as read ÐвтоматичеÑки отметить одинаковые новоÑти как прочитанные Prevent accidental deletion of: Предотвращать Ñлучайное удаление: Enable cleanup on shutdown Включить очиÑтку при завершении Maximum age of news in days to keep: МакÑимальный возраÑÑ‚ ÑохранÑемых новоÑтей в днÑÑ…: Maximum number of news to keep: МакÑимальное количеÑтво ÑохранÑемых новоÑтей: Delete read news УдалÑть прочитанные новоÑти Never delete unread news Ðикогда не удалÑть непрочитанные новоÑти Never delete starred news Ðикогда не удалÑть новоÑти отмеченные звёздочкой Never delete labeled news Ðикогда не удалÑть новоÑти Ñ Ð¼ÐµÑ‚ÐºÐ°Ð¼Ð¸ Clean up 'Deleted' Очищать 'Удалённые' Enable DB optimization (slower shutdown) Включить оптимизацию БД (медленнее завершение) Reading Чтение Clean Up ОчиÑтка New... Создать... Edit... Изменить... Delete... Удалить... Move up Вверх Move down Вниз Show when inactive main window Показывать при неактивноÑти главного окна Screen Экран Transparency ПрозрачноÑть Show titles feeds Показывать заголовки лент Show icon feed Показывать иконку ленты Show button 'Mark All News Read' Показывать кнопку 'Отметить вÑе новоÑти прочитанными' Show button 'Mark Read/Unread' Показывать кнопку 'Отметить прочитанной/непрочитанной' Show button 'Open in External Browser' Показывать кнопку 'Открыть во внешнем браузере' Show button 'Delete News' Показывать кнопку 'Удалить новоÑть' Play sound for incoming new news ВоÑпроизводить звук при входÑщих новых новоÑÑ‚ÑÑ… Play ВоÑпроизвеÑти Display notification for incoming news Показывать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾ входÑщих новоÑÑ‚ÑÑ… Top Left Вверху Ñлева Top Right Вверху Ñправа Bottom Left Внизу Ñлева Bottom Right Внизу Ñправа Review ПроÑмотр Position ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Show maximum of Показывать макÑимум item on page notification Ñлементов на Ñтранице ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Width list items Ширина ÑпиÑка Ñлементов pixels пикÑелей Close notification after Закрывать уведомление поÑле Do not show notification in fullscreen mode Ðе показывать ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð² полноÑкранном режиме Display Отображение Action mouse on news opening: ДейÑтвие мышкой на открытие новоÑти: Single Click: Одиночный щелчок: Double Click: Двойной щелчок: Middle Click: СреднÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ°: Only show selected feeds: Показывать новоÑти только выбранных лент: Notification Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Sound Звук Selection of feeds Выбор лент All Feeds Ð’Ñе ленты Site Сайт User Пользователь Password Пароль Delete Удалить Delete All Удалить вÑе Show Passwords Показать пароли Version ВерÑÐ¸Ñ Author Ðвтор Contact Контакт Choose language: Выберите Ñзык: Type Тип Font Шрифт Feeds list font Шрифт ÑпиÑка лент News list font Шрифт ÑпиÑка новоÑтей News title font Шрифт заголовка новоÑти News text font Шрифт текÑта новоÑти Notification font Шрифт ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Change... Изменить... Reset Ð¡Ð±Ñ€Ð¾Ñ Feeds list color Цвет ÑпиÑка лент Feeds list background Фон ÑпиÑка лент News list color Цвет ÑпиÑка новоÑтей News list background Фон ÑпиÑка новоÑтей Focused news color Цвет текÑта новоÑти под курÑором Focused news background color Цвет фона новоÑти под курÑором Link color Цвет ÑÑылки Title color Цвет заголовка Date color Цвет даты Author color Цвет имени автора News text color Цвет текÑта новоÑти News title background Фон заголовка новоÑти News background Фон новоÑти Feed with new news Ленты Ñ Ð½Ð¾Ð²Ñ‹Ð¼Ð¸ новоÑÑ‚Ñми Count of unread news in feeds tree КоличеÑтво непрочитанных новоÑтей в дереве лент Disabled feed Отключенные ленты Alternating row colors Цвет чередующихÑÑ Ñтрок Notification text color Цвет текÑта ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Notification background color Цвет фона ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Auto load images in news view ÐвтоматичеÑÐºÐ°Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° изображений Text color of new news Цвет текÑта новых новоÑтей в ÑпиÑке Show feeds tree toggle Показывать переключатель дерева лент Clear new status when minimize to tray ОчиÑтить ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð¾Ð²Ñ‹Ðµ при минимизации в трей Set focus on the last opened news УÑтановить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° поÑледней открытой новоÑти Set focus at the top of news list УÑтановить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° начало ÑпиÑка новоÑтей Set focus on the unread news УÑтановить Ñ„Ð¾ÐºÑƒÑ Ð½Ð° непрочитанной новоÑти Open the news Открыть новоÑть Default news filter: Фильтр новоÑтей по умолчанию: Action on feed opening: ДейÑтвие на открытие ленты: Show news description instead of loading web page Показывать опиÑание новоÑти вмеÑто загрузки веб-Ñтраницы Text color of unread news Цвет текÑта непрочитанных новоÑтей в ÑпиÑке Focused feed color Цвет текÑта ленты под курÑором Focused feed background color Цвет фона ленты под курÑором Standard Стандартный Fixed ФикÑированный Serif С заÑечками Sans Serif Без заÑечек Cursive КурÑив Fantasy Моноширинный Default font size Размер шрифта по умолчанию Fixed font size ФикÑированный размер шрифта Minimum font size Минимальный размер шрифта Minimum logical font size Минимальный логичеÑкий размер шрифта Font families: СемейÑтва шрифтов: Font sizes: Размеры шрифтов: Fonts Шрифты Fonts Browser Шрифты браузера Colors Цвета Filter Фильтр Action ДейÑтвие Description ОпиÑание Shortcut Сочетание клавиш Shortcut: Сочетание клавиш: Open File... Открыть файл... Select Style Sheet File Выберите файл таблицы Ñтилей Open Directory... Открыть каталог... Add site to whitelist Добавить Ñайт в белый ÑпиÑок Site without 'http://' (ex. youtube.com) Сайт без 'http://' (например, youtube.com) QAbstractSpinBox &Step up Шаг вв&ерх Step &down Шаг вн&из &Select All &Выделить вÑÑ‘ QDialogButtonBox Close Закрыть Cancel Отмена &Yes &Да &No &Ðет QFtp Not connected Соединение не уÑтановлено Host %1 not found Узел %1 не найден Connection refused to host %1 Ð’ Ñоединении Ñ ÑƒÐ·Ð»Ð¾Ð¼ %1 отказано Connection timed out to host %1 Ð’Ñ€ÐµÐ¼Ñ Ð½Ð° Ñоединение Ñ ÑƒÐ·Ð»Ð¾Ð¼ %1 иÑтекло Connected to host %1 УÑтановлено Ñоединение Ñ ÑƒÐ·Ð»Ð¾Ð¼ %1 Connection refused for data connection Отказ в Ñоединении Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ данных Unknown error ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° Connecting to host failed: %1 Ðе удалоÑÑŒ ÑоединитьÑÑ Ñ ÑƒÐ·Ð»Ð¾Ð¼: %1 Login failed: %1 Ðе удалоÑÑŒ авторизоватьÑÑ: %1 Listing directory failed: %1 Ðе удалоÑÑŒ прочитать каталог: %1 Changing directory failed: %1 Ðе удалоÑÑŒ Ñменить каталог: %1 Downloading file failed: %1 Ðе удалоÑÑŒ загрузить файл: %1 Uploading file failed: %1 Ðе удалоÑÑŒ отгрузить файл: %1 Removing file failed: %1 Ðе удалоÑÑŒ удалить файл: %1 Creating directory failed: %1 Ðе удалоÑÑŒ Ñоздать каталог: %1 Removing directory failed: %1 Ðе удалоÑÑŒ удалить каталог: %1 Connection closed Соединение закрыто QLineEdit &Undo &Отменить дейÑтвие &Redo &Повторить дейÑтвие Cu&t &Вырезать &Copy &Копировать &Paste Ð’&Ñтавить Delete Удалить Select All Выделить вÑÑ‘ QMultiInputContext Select IM Выбор режима ввода QObject Cannot start external program Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить внешнюю программу Cannot start external program! %1 Ðе удаётÑÑ Ð·Ð°Ð¿ÑƒÑтить внешнюю программу! %1 Error Ошибка QTextControl &Undo &Отменить дейÑтвие &Redo &Повторить дейÑтвие Cu&t &Вырезать &Copy &Копировать &Paste Ð’&Ñтавить Delete Удалить Select All Выделить вÑÑ‘ Copy &Link Location Скопировать &Ð°Ð´Ñ€ÐµÑ ÑÑылки QWizard Cancel Отмена < &Back < &Ðазад &Finish &Завершить &Next > &Далее > RSSDetectionWidget Untitled feed Лента без имени RequestFeed Server requires authentication! Сервер требует авторизации! Server replied: Not Found! Сервер ответил: Ðе найдено! Redirect error! Ошибка переадреÑации! Request timeout! Таймаут запроÑа! SQLiteDriver Error opening database Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных Error closing database Ошибка Ð·Ð°ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð±Ð°Ð·Ñ‹ данных Unable to begin transaction Ðевозможно начать транзакцию Unable to commit transaction Ðевозможно выполнить транзакцию Unable to rollback transaction Ðевозможно отменить транзакцию SQLiteResult Unable to fetch row Ðевозможно получить Ñтроку No query Ðет запроÑа Unable to execute statement Ðевозможно выполнить Ð·Ð°Ð¿Ñ€Ð¾Ñ Unable to execute multiple statements at a time Ðевозможно выполнить неÑколько инÑтрукций за один раз Unable to reset statement Ðевозможно ÑброÑить утверждение Unable to bind parameters Ðевозможно ÑопоÑтавить параметры Parameter count mismatch КоличеÑтво параметров не Ñовпадает SslErrorDialog SSL Certificate Error! Ошибка Ñертификата SSL! Only for this session Только Ð´Ð»Ñ Ñтой ÑеÑÑии UpdateAppDialog Check for Updates Проверить наличие обновлений Checking for updates... Проверка Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¹... Loading history... Загрузка иÑтории... Don't remind about this version Ðе напоминать об Ñтой верÑии &Install &УÑтановить You already have the latest version У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑть поÑледнÑÑ Ð²ÐµÑ€ÑÐ¸Ñ A new version of QuiteRSS is available! ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ QuiteRSS! Click here to go to the download page Ðажмите здеÑÑŒ, чтобы перейти на Ñтраницу загрузки Your version is: Ваша верÑиÑ: Current version is: Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ: Error checking updates Ошибка при проверке обновлений quiterss-0.18.3/lang/quiterss_sk.ts000066400000000000000000005527341265173051100173500ustar00rootroot00000000000000 AboutDialog About O programe Revision Revízia Version Verzia QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS je open-source multi-platformná RSS/Atom ÄítaÄka Includes: Obsahuje: Application directory: PrieÄinok programu: Resource directory: PrieÄinok zdrojov: Data directory: PrieÄinok dát: Backup directory: PrieÄinok zálohy: Database file: Súbor databázy: Settings file: Súbor nastavení: Log file: Súbor záznamu: Authors Autori History História License Licencia Information Informácie AdBlockAddSubscriptionDialog Add Subscription PridaÅ¥ filter Title: Názov: Address: Adresa: Add new subscription to AdBlock: PridaÅ¥ nový filter do AdBlocku: AdBlockCustomList Custom Rules Vlastné pravidlá AdBlockDialog AdBlock Configuration Nastavenie AdBlock-u Enable AdBlock PovoliÅ¥ AdBlock Search... NájsÅ¥... Options Možnosti AdBlock AdBlock Use only essential part of EasyList (for performance reasons) PoužiÅ¥ len základnú ÄasÅ¥ EasyList-u (z výkonnostných dôvodov) Add Rule PridaÅ¥ pravidlo Remove Rule OdstrániÅ¥ pravidlo Add Subscription PridaÅ¥ filter Remove Subscription OdstrániÅ¥ filter Update Subscriptions AktualizovaÅ¥ filtre Learn about writing rules... ÄŽalÅ¡ie informácie o písaní pravidiel... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock umožňuje blokovaÅ¥ nežiadúci obsah na webových stránkach AdBlock AdBlock Show AdBlock &Settings ZobraziÅ¥ na&stavenia AdBlock-u Disable on %1 ZakázaÅ¥ na %1 Disable only on this page ZakázaÅ¥ len na tejto stránke Blocked Popup Windows Blokované vyskakovacie okná %1 with (%2) %1 s (%2) No content blocked Žiadny blokovaný obsah Blocked URL (AdBlock Rule) - click to edit rule Blokovaná URL adresa (pravidlo AdBlock-u) - kliknite pre upravenie pravidla AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Nepodarilo sa naÄítaÅ¥ filter! AdBlockTreeWidget Add Rule PridaÅ¥ pravidlo Remove Rule OdstrániÅ¥ pravidlo Add Custom Rule PridaÅ¥ vlastné pravidlo Please write your rule here: Sem napíšte vaÅ¡e pravidlo: %1 (recently updated) %1 (nedávno aktualizované) %1 (Error: %2) %1 (Chyba: %2) AddFeedWizard Add Feed PridaÅ¥ kanál Create New Feed VytvoriÅ¥ nový kanál Use title of the feed as displayed name PoužiÅ¥ názov kanálu ako zobrazovaný názov Server requires authentication: Server vyžaduje prihlásenie: Username: Meno používateľa: Password: Heslo: Feed URL or website address: URL kanálu alebo adresa webstránky: Feeds Kanály All Feeds VÅ¡etky kanály New Folder... Nový prieÄinok... Displayed name: Zobrazovaný názov: Location: Umiestnenie: URL error! Chybná URL! Duplicate feed! Duplicitný kanál! Can't find feed URL! Nepodarilo sa nájsÅ¥ URL kanálu! Request failed! Požiadavka zlyhala! AddFolderDialog Add Folder PridaÅ¥ prieÄinok Feeds Kanály All Feeds VÅ¡etky kanály Name: Názov: Location: Umiestnenie: AuthenticationDialog Save password Uložit heslo Authorization required Je vyžadovaná autorizácia Server: Server: Message: Správa: Username: Meno používateľa: Password: Heslo: CategoriesTreeWidget Unread NepreÄítané Starred OznaÄené hviezdiÄkou Deleted Vymazané Labels Å títky Open in New Tab OtvoriÅ¥ na novej karte Clear 'Deleted' VyÄistiÅ¥ 'Vymazané' Mark Read OznaÄiÅ¥ ako preÄítané CleanUpWizard Clean Up Upratovanie Choose Feeds Vyberte kanály All Feeds VÅ¡etky kanály Clean Up Options Možnosti upratovania Maximum age of news in days to keep: Maximálny vek uchovávaných noviniek v dňoch: Maximum number of news to keep: Maximálny poÄet uchovávaných noviniek: Delete read news VymazaÅ¥ preÄítané novinky Never delete unread news Nikdy nemazaÅ¥ nepreÄítané novinky Never delete starred news Nikdy nemazaÅ¥ novinky oznaÄené hviezdiÄkou Never delete labeled news Nikdy nemazaÅ¥ novinky oznaÄené Å¡títkom Clean up 'Deleted' VyÄistiÅ¥ 'Vymazané' Purge DB VyÄistiÅ¥ DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Úplne odstrániÅ¥ záznamy oznaÄené 'Vymazané' z DB. Staré správy sa môžu znova objaviÅ¥ Information Informácie Clean Up wizard deleted %1 news Sprievodca Äistením vymazal %1 noviniek ClickToFlash Object blocked by ClickToFlash Objekt zablokovaný funkciou Click to Flash Hide object SkryÅ¥ objekt Add '%1' to whitelist PridaÅ¥ '%1' do whitelistu CustomizeToolbarDialog Customize Main Toolbar UpraviÅ¥ hlavný panel nástrojov Customize Feeds Toolbar UpraviÅ¥ panel nástrojov kanálov Customize News Toolbar UpraviÅ¥ panel nástrojov noviniek Load images NaÄítaÅ¥ obrázky Separator OddeľovaÄ Icon Ikona Text Text Text Beside Icon Text vedľa ikonky Text Under Icon Text pod ikonkou Big Veľká Normal Normálna Small Malá Style: Å týl: Icon Size: VeľkosÅ¥ ikoniek: Add PridaÅ¥ Remove OdstrániÅ¥ Move up Vyššie Move down Nižšie Default Východzie DownloadItem Remaining time unavailable Zostávajúci Äas nedostupný Error: Cannot write to file! Chyba: Nepodarilo sa zapísaÅ¥ do súboru! Error: Chyba: few seconds pár sekúnd seconds sekúnd minutes minú hours hodín Unknown size Neznámá veľkosÅ¥ Unknown speed Neznáma rýchlosÅ¥ %2 - unknown size (%3) %2 - neznáma veľkosÅ¥ (%3) Remaining %1 - %2 of %3 (%4) Zostáva %1 - %2 z %3 (%4) Cancelled - %1 ZruÅ¡ené - %1 Delete file VymazaÅ¥ súbor Do you want to also delete downloaded file? Chcete tiež vymazaÅ¥ stiahnutý súbor? Open File OtvoriÅ¥ súbor Open Folder OtvoriÅ¥ prieÄinok Copy Download Link KopírovaÅ¥ adresu sÅ¥ahovania Cancel Downloading ZruÅ¡iÅ¥ sÅ¥ahovanie Remove OdstrániÅ¥ Cancelled ZruÅ¡ené Error Chyba Not found Nenájdené Sorry, the file %1 was not found! PrepáÄte, súbor ⎠%1 ⎠nebol nájdený! DownloadManager Clear VyÄistiÅ¥ File %1 (*.%2) Súbor %1 (*.%2) All Files (*.*) VÅ¡etky súbory (*.*) Save As... UložiÅ¥ ako... Executable: Spustiteľný súbor: Arguments: Parametre: FeedPropertiesDialog Properties Vlastnosti General VÅ¡eobecné Columns Stĺpce Authentication Autentifikácia Status Stav Title: Názov: Homepage: Web: Feed URL: URL kanálu: Load Title NaÄítaÅ¥ názov Load Favicon NaÄítaÅ¥ ikonku Select Icon... VybraÅ¥ ikonku... Select Icon VybraÅ¥ ikonku Disable update ZakázaÅ¥ aktualizáciu Automatically update every Automaticky aktualizovaÅ¥ každých seconds sekúnd minutes minút hours hodín Starred OznaÄené hviezdiÄkou Load images NaÄítaÅ¥ obrázky Display in new tab on startup Po spustení zobraziÅ¥ na novej karte Show news' description instead of loading web page ZobrazovaÅ¥ popis novinky namiesto naÄítania webstránky Automatically delete duplicate news Automaticky odstraňovaÅ¥ duplicitné novinky Display Zobrazenie Reading Čítanie Enable JavaScript PovoliÅ¥ JavaScript Right-to-left layout Rozvrhnutie sprava doľava. Ascending Vzostupne Descending Zostupne Sort by: RadiÅ¥ podľa: Add PridaÅ¥ Remove OdstrániÅ¥ Move up Vyššie Move down Nižšie Default Východzie Server requires authentication: Server vyžaduje prihlásenie: Username: Meno používateľa: Password: Heslo: Feeds count: PoÄet kanálov: Description: Popis: Status: Stav Created: Vytvorené: Last update: Posledná aktualizácia: News count: PoÄet noviniek: Good Dobrý Long ago ;-) Kedysi dávno ;-) new nové unread nepreÄítané Image files Súbory obrázkov Select Image VybraÅ¥ obrázok Load icon: can't open a file! NaÄítanie ikonky: súbor sa nepodarilo otvoriÅ¥! FilterRulesDialog Filter Rules Pravidlá filtru Feeds Kanály All Feeds VÅ¡etky kanály Filter name: Názov filtru: Match all news Zodpovedá vÅ¡etkým novinkám Match all conditions Zodpovedá vÅ¡etkým podmienkam Match any condition Nezodpovedá žiadnej podmienke Perform these actions: VykonaÅ¥ tieto Äinnosti: Please enter name for the filter. Prosím zadajte názov filtra. Please enter search condition for the news filter. Prosím zadajte podmienku filtra. FindFeed Find Name NájsÅ¥ názov Find Link NájsÅ¥ odkaz FindTextContent Find in News NájsÅ¥ v novinkách Find in Titles NájsÅ¥ v názvoch Find in Authors NájsÅ¥ v autoroch Find in Categories NájsÅ¥ v kategóriách Find in Descriptions NájsÅ¥ v popisoch Find in Links NájsÅ¥ v odkazoch Find in Browser Vyhľadávanie v prehliadaÄi FtpDownloader Canceled! ZruÅ¡ené! ItemAction Mark News as Read OznaÄiÅ¥ novinky za preÄítané Add Star OznaÄiÅ¥ hviezdiÄkou Delete VymazaÅ¥ Add Label PridaÅ¥ Å¡títok Play a Sound PrehraÅ¥ zvuk Show News in Notifier ZobraziÅ¥ novinky v upozorňovaÄi Browse PrehliadaÅ¥ Play PrehraÅ¥ Add Action PridaÅ¥ ÄinnosÅ¥ Delete Action VymazaÅ¥ ÄinnosÅ¥ Open File... OtvoriÅ¥ súbor... ItemCondition Title Názov Description Popis Author Autor Category Kategórie State Stav Link Odkaz News Novinky New Nová Read PreÄítané Starred OznaÄené hviezdiÄkou Add Condition PridaÅ¥ podmienku Delete Condition VymazaÅ¥ podmienku contains obsahuje doesn't contains neobsahuje is je isn't nie je begins with zaÄína na ends with konÄí na Regular expressions Regulárne výrazy LabelDialog New Label Nový Å¡títok Load icon... NaÄítaÅ¥ ikonku... Default Východzie Select color... VybraÅ¥ farbu... Name: Názov: Icon: Ikona: Color text: Farba textu: Color background: Farba pozadia: Image files Súbory obrázkov Select Image VybraÅ¥ obrázok Load icon: can't open a file! NaÄítanie ikonky: súbor sa nepodarilo otvoriÅ¥! MainApplication Saving data... Ukladajú sa dáta... MainWindow &AdBlock &AdBlock Hide Categories SkryÅ¥ kategórie Show Categories ZobraziÅ¥ kategórie Select OPML-File Vyberte OPML súbor OPML-Files (*.%1 *.%2) Súbory OPML (*.%1 *.%2) Import canceled Import zruÅ¡ený Import: can't open a file Import: nepodarilo sa otvoriÅ¥ súbor OPML-Files (*.%1) Súbory OPML (*.%1) Export canceled Export zruÅ¡ený Export: can't open a file Export: nepodarilo sa otvoriÅ¥ súbor Unread: %1 NepreÄítané: %1 All: %1 Celkom: %1 (Browser) (PrehliadaÄ) New News: %1 Nové novinky: %1 Unread News: %1 NepreÄítané novinky: %1 &Add Prid&aÅ¥ Add New Feed PridaÅ¥ nový kanál &Feed... &Kanál... F&older... PrieÄin&ok... Add New Folder PridaÅ¥ nový prieÄinok Open in New Tab OtvoriÅ¥ na novej karte &Delete... &VymazaÅ¥... Delete Selected Feed VymazaÅ¥ vybratý kanál &Import Feeds... &ImportovaÅ¥ kanály... Import Feeds from OPML File ImportovaÅ¥ kanály z OPML súboru &Export Feeds... &ExportovaÅ¥ kanály... Export Feeds to OPML File ExportovaÅ¥ kanály do OPML súboru E&xit U&konÄit Update Feed AktualizovaÅ¥ kanál Update Current Feed AktualizovaÅ¥ vybraný kanál Update All AktualizovaÅ¥ vÅ¡etko Update All Feeds AktualizovaÅ¥ vÅ¡etky kanály Mark All Feeds Read OznaÄiÅ¥ vÅ¡etky kanály ako preÄítané Mark Read/Unread OznaÄiÅ¥ ako preÄítané/nepreÄítané Mark Current News Read/Unread OznaÄiÅ¥ aktuálnu novinku ako preÄítanú/nepreÄítanú Mark All News Read OznaÄiÅ¥ vÅ¡etky novinky ako preÄítané Downloads SÅ¥ahovania Clean Up... UprataÅ¥... News Filters... Filtre noviniek... Filter News... FiltrovaÅ¥ novinky... Options... Možnosti... Open Options Dialog OtvoriÅ¥ dialógové okno s nastaveniami Filter Feeds FiltrovaÅ¥ kanály Show All ZobraziÅ¥ vÅ¡etko Show New ZobraziÅ¥ nové Show Unread ZobraziÅ¥ nepreÄítané Show Starred Feeds ZobraziÅ¥ kanály oznaÄené hviezdiÄkou Show Not Working Feeds ZobraziÅ¥ nefunkÄné kanály Filter News FiltrovaÅ¥ novinky Show Starred ZobraziÅ¥ oznaÄené hviezdiÄkou Show Not Starred ZobraziÅ¥ neoznaÄené hviezdiÄkou Show Unread or Starred ZobraziÅ¥ nepreÄítané alebo oznaÄené hviezdiÄkou Show Last Day ZobraziÅ¥ za posledný deň Show Last 7 Days ZobraziÅ¥ za posledných 7 dní About... O programe... Show 'About' Dialog ZobraziÅ¥ dialógové okno "O programe" Check for Updates... SkontrolovaÅ¥ aktualizácie... Report a Problem... Nahlásit problém... Open News OtvoriÅ¥ novinky Open in Browser OtvoriÅ¥ v prehliadaÄi Open in External Browser OtvoriÅ¥ v externom prehliadaÄi Open News in External Browser OtvoriÅ¥ novinku v externom prehliadaÄi Open News in New Tab OtvoriÅ¥ novinku na novej karte Open in Background Tab OtvoriÅ¥ na novej karte na pozadí Open News in Background Tab OtvoriÅ¥ novinku na novej karte v pozadí Star OznaÄiÅ¥ hviezdiÄkou Mark News Star OznaÄiÅ¥ novinku hviezdiÄkou Delete VymazaÅ¥ Delete Selected News VymazaÅ¥ vybraté novinky Delete All News VymazaÅ¥ vÅ¡etky novinky Delete All News from List VymazaÅ¥ vÅ¡etky novinky zo zoznamu Restore ObnoviÅ¥ Restore News ObnoviÅ¥ novinky Copy Link KopírovaÅ¥ odkaz Restore last deleted news ObnoviÅ¥ naposledy vymazanú novinku Mark Read OznaÄiÅ¥ ako preÄítané Mark Feed Read OznaÄiÅ¥ kanál ako preÄítaný Properties Vlastnosti &File &Súbor Count Unread News PoÄet nepreÄítaných noviniek Count All News PoÄet vÅ¡etkých noviniek Last Update Posledná aktualizácia Reset browser zoom ZresetovaÅ¥ priblíženie v prehliadaÄi Print Web Page TlaÄiÅ¥ webstránku Preview Web Page Náhľad webstránky Save page in database UložiÅ¥ stránku v databáze Save page in database instead of news description UložiÅ¥ v databáze stránku namiesto popisu novinky Confirm Delete PotvrdiÅ¥ vymazanie Are you sure to delete selected elements? Ste si istý, že chcete vymazaÅ¥ vybrané prvky? Menu Menu Add Feed... PridaÅ¥ kanál... &Create Backup... &VytvoriÅ¥ zálohu... S&how Menu Bar ZobraziÅ¥ &hlavný panel menu Stop Update Feeds ZastaviÅ¥ aktualizovanie kanálov Open News Description OtvoriÅ¥ popis novinky Copy News Link KopírovaÅ¥ odkaz novinky &View &ZobraziÅ¥ Fee&ds Kanál&y &News &Novinky &Browser &PrehliadaÄ &Tools &Nástroje &Help &Nápoveda Main Toolbar Hlavný panel nástrojov Customize Toolbar UpraviÅ¥ panel nástrojov Main Toolbar... Hlavný panel nástrojov... Customize Toolbar... UpraviÅ¥ panel nástrojov... Feeds Toolbar... Panel nástrojov kanálov... News Toolbar... Panel nástrojov noviniek... Lock Toolbar Zamknúť panel nástrojov Hide Toolbar SkryÅ¥ panel nástrojov Layout Rozvrhnutie Classic Klasické Newspaper Noviny Application Style Vzhľad programu System Systém System2 Systém 2 Green Zelený Orange Oranžový Purple Fialový Pink Ružový Gray Å edý Browser Position Umiestnenie prehliadaÄa Top Hore Bottom Dole Right Vpravo Left Vľavo Show Window Zobrazit okno Previous Feed Predchádzajúci kanál Next Feed ÄŽalší kanál Previous News Predchádzajúca novinka Next News ÄŽalÅ¡ia novinka News Page Up Posunúť stránku správ vyššie News Page Down Posunúť stránku správ nižšie Next Unread News Nasledujúca nepreÄítaná novinka Previous Unread News Predchádzajúca nepreÄítaná novinka Switch Focus to Next Panel Prepnúť na nasledujúci panel Switch Focus to Next Panel (Tree Feeds, List News, Browser) Prepnúť na nasledujúci panel (Zoznam kanálov, Zoznam noviniek, PrehliadaÄ) Switch Focus to Previous Panel Prepnúť na predchádzajúci panel Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Prepnúť na predchádzajúci panel (Zoznam kanálov, Zoznam noviniek, PrehliadaÄ) Show/Hide Tree Feeds ZobraziÅ¥/skryÅ¥ strom kanálov Minimize to Tray MinimalizovaÅ¥ do tray liÅ¡ty Minimize Application to Tray MinimalizovaÅ¥ program do tray liÅ¡ty Columns Stĺpce Show Indentation ZobraziÅ¥ odsadenie Search Feed NájsÅ¥ kanál Zoom Priblíženie Zoom In PriblížiÅ¥ Zoom in in browser PriblížiÅ¥ v prehliadaÄi Zoom Out OddialiÅ¥ Zoom out in browser OddialiÅ¥ v prehliadaÄi 100% 100% Print... TlaÄiÅ¥... Print Preview... Ukážka pred tlaÄou... Page up (Browser) Posunúť stránku vyššie (prehliadaÄ) Page down (Browser) Posunúť stránku nižšie (prehliadaÄ) Save As... UložiÅ¥ ako... Save Page As... UložiÅ¥ stránku ako... Show/Hide Panely Feeds Toolbar Panel nástrojov kanálov News Toolbar Panel nástrojov noviniek Browser Toolbar Panel nástrojov prehliadaÄa Panel Categories Panel kategórií Status Bar Stavový riadok Full Screen Celá obrazovka Stay On Top Vždy navrchu Categories Kategórie Label Å títok Show labels menu ZobraziÅ¥ menu Å¡títkov Close Tab ZatvoriÅ¥ kartu Close Other Tabs ZatvoriÅ¥ ostatné karty Close All Tabs ZatvoriÅ¥ vÅ¡etky karty Switch to next tab Prepnúť na nasledujúcu kartu Switch to previous tab Prepnúť na predchádzajúcu kartu Unread NepreÄítané Starred OznaÄené hviezdiÄkou Deleted Vymazané Labels Å títky Decrease news list/increase browser ZmenÅ¡iÅ¥ zoznam noviniek/zväÄÅ¡iÅ¥ prehliadaÄ Increase news list/decrease browser ZväÄÅ¡iÅ¥ zoznam noviniek/zmenÅ¡iÅ¥ prehliadaÄ Find NájsÅ¥ Open Homepage Feed OtvoriÅ¥ domovskou stránku kanála Sort by Name ZoradiÅ¥ podľa názvu Collapse All Folders ZbaliÅ¥ vÅ¡etky prieÄinky Expand All Folders RozbaliÅ¥ vÅ¡etky prieÄinky Next Folder ÄŽalší prieÄinok Previous Folder Predchádzajúci prieÄinok Expand Folder RozbaliÅ¥ prieÄinok Setting Page: Labels Stránka nastavení: Å títky Share ZdieľaÅ¥ Sort By RadiÅ¥ podľa Ascending Vzostupne Descending Zostupne Check for updates Kontrola aktualizácií A new version of QuiteRSS... Nová verzia QuiteRSS... Loading... NaÄítava sa... Web Page Webstránka Save As UložiÅ¥ ako HTML-Files (*.%1) HTML súbory (*.%1) Text files (*.%2) Textové súbory (*.%2) Save As: can't open a file UložiÅ¥ ako: nepodarilo sa otvoriÅ¥ súbor Choose Directory VybraÅ¥ prieÄinok Important Dôležité Work Pracovné Personal Osobné To Do Úlohy Later Neskôr Amusingly Zábava NetworkManager SSL Certificate Error! Chyba SSL certifikátu! The "%1" server has the following errors in the SSL certificate: Server "%1", na ktorý sa pokúšate pristúpiÅ¥ má nasledujúce chyby v SSL certifikáte: <b>Organization: </b> <b>Organizácia: </b> <b>Domain Name: </b> <b>Názov domény: </b> <b>Expiration Date: </b> <b>Dátum vyprÅ¡ania: </b> <b>Error: </b> <b>Chyba: </b> Would you like to make an exception for this certificate? Chcete udeliÅ¥ výnimku tomuto certifikátu? NewsFiltersDialog News Filters Filtre noviniek Feeds Kanály Filter Name FiltrovaÅ¥ názov New... Nový... Edit... UpraviÅ¥... Delete... VymazaÅ¥... Move up Vyššie Move down Nižšie Run Filter SpustiÅ¥ filter Delete Filter VymazaÅ¥ filter Are you sure you want to delete the filter '%1'? Ste si istý, že chcete vymazaÅ¥ filter '%1'? NewsHeader Icon Feed Ikona kanálu Title Názov Published Zverejnené Received Prijaté Author Autor Category Kategória Read PreÄítané Star HviezdiÄka Label Å títok Feed Title Názov kanálu Link Odkaz NewsItem Mark Read/Unread OznaÄiÅ¥ za preÄítané/nepreÄítané Delete News VymazaÅ¥ novinky NewsTabWidget Loading... (%p%) NaÄítava sa... (%p%) Home Domov Open Page in External Browser OtvoriÅ¥ stránku v externom prehliadaÄi Open Link in External Browser OtvoriÅ¥ stránku v externom prehliadaÄi Open Link OtvoriÅ¥ odkaz Open in New Tab OtvoriÅ¥ na novej karte Save Link... UložiÅ¥ odkaz... Save Image... UložiÅ¥ obrázok... Copy Link KopírovaÅ¥ odkaz Copy KopírovaÅ¥ Go Back VrátiÅ¥ sa späť Go Forward ÃsÅ¥ vpred Stop ZastaviÅ¥ Reload Znovu naÄítaÅ¥ Copy Image KopírovaÅ¥ obrázok Copy Image Address KopírovaÅ¥ adresu obrázka Load Images NaÄítavaÅ¥ obrázky Auto Load Images to News View Automaticky naÄítaÅ¥ obrázky do zobrazenia noviniek No Load Images NenaÄítavaÅ¥ obrázky No Load Images to News View NenaÄítaÅ¥ obrázky do zobrazenia noviniek Close Tab ZatvoriÅ¥ kartu Auto Load Images in News View Automaticky naÄítaÅ¥ obrázky v novinkách Don't Load Images NenaÄítaÅ¥ obrázky Don't Load Images in News View NenaÄítavaÅ¥ obrázky v novinkách Comments Komentáre Author: %1 Autor: %1 audio audio video video media multimédiá Link to Odkaz na Mark Read/Unread OznaÄiÅ¥ ako preÄítané/nepreÄítané Mark News Star OznaÄiÅ¥ novinku hviezdiÄkou Label Å títok Share ZdieľaÅ¥ Open News in External Browser OtvoriÅ¥ novinku v externom prehliadaÄi Delete VymazaÅ¥ NotificationWidget Close ZatvoriÅ¥ Mark All News Read OznaÄiÅ¥ vÅ¡etky novinky ako preÄítané Previous Page Predchádzajúca strana Next Page ÄŽalÅ¡ia strana Incoming News: %1 Prichádzajúce novinky: %1 Page %1 of %2 Stránka %1 z %2 OptionsDialog Options Možnosti General VÅ¡eobecné System Tray Tray liÅ¡ta Network Connections SieÅ¥ové pripojenia Browser PrehliadaÄ Feeds Kanály Labels Å títky Notifications Oznámenia Passwords Heslá Language Jazyk Fonts & Colors Písma & farby Keyboard Shortcuts Klávesové skratky Warning: key is already assigned to Varovanie: kÄ¾ÃºÄ už je pridelený k Show splash screen on startup ZobrazovaÅ¥ Å¡tartovaciu obrazovku pri spúšťaní Reopen last opened feeds on startup Po spustení znovu otvoriÅ¥ posledné kanály Open new tab next to active OtvoriÅ¥ novú kartu vedľa aktuálnej Hide feeds tree when opening tabs SkryÅ¥ strom kanálov pri otváraní kariet Show default rss-icon instead of favourite one ZobraziÅ¥ východziu RSS ikonku namiesto obľúbenej Automatically collapse folders Automaticky zatváraÅ¥ prieÄinky Show close button on tab ZobraziÅ¥ zatváracie tlaÄítko na karte Automatically check for updates Automaticky kontrolovaÅ¥ dostupnosÅ¥ aktualizácií Help improve QuiteRSS by sending usage information Pomôžte vylepÅ¡iÅ¥ QuiteRSS zaslaním informácií o používaní Store a DB in memory (requires program restart) UkladaÅ¥ databázu do pamäte (vyžaduje reÅ¡tart programu) Save DB stored in memory to file every Vždy uložiÅ¥ DB z pamäti do súboru minutes minút Run QuiteRSS at Windows startup SpustiÅ¥ QuiteRSS pri spustení Windowsu Show system tray icon ZobrazovaÅ¥ tray ikonu starting QuiteRSS spustení QuiteRSS minimizing QuiteRSS minimalizovaní QuiteRSS closing QuiteRSS zatvorení QuiteRSS Show static icon ZobraziÅ¥ statickú ikonku Change icon for incoming new news ZmeniÅ¥ ikonku pri stiahnutí nových noviniek Show count of new news ZobraziÅ¥ poÄet novo prijatých noviniek Show count of unread news ZobraziÅ¥ poÄet nepreÄítaných noviniek Single click instead of double click for show window Jedno kliknutie namiesto dvoch pre zobrazenie okna Empty working set on minimize to tray VyprázdniÅ¥ pracovnú sadu pri minimalizovaní do tray liÅ¡ty Move to the system tray when: MinimalizovaÅ¥ do tray liÅ¡ty pri: Tray icon behavior: Správanie tray ikony Direct connection to the Internet Priame pripojenie k internetu System proxy configuration (if available) Systémové nastavenie proxy (ak je dostupné) Manual proxy configuration: Vlastne nastavenie proxy: Proxy server: Proxy server: Port: Port: Username: Meno používateľa: Password: Heslo: Request timeout: VyprÅ¡anie požiadavky: Number of requests: PoÄet požiadavok: Number of retries: PoÄet pokusov: Options network requests when updating feeds (requires program restart): Možnosti sieÅ¥ových požiadaviek pri aktualizovaní kanálov (vyžaduje reÅ¡tart programu): Use embedded browser PoužiÅ¥ zabudovaný prehliadaÄ Use external browser PoužiÅ¥ externý prehliadaÄ Default external browser PoužiÅ¥ východzí externý prehliadaÄ Following external browser: Nasledujúci externý prehliadaÄ: Browse... PrehľadávaÅ¥ Load images NaÄítaÅ¥ obrázky Enable JavaScript PovoliÅ¥ JavaScript Enable plug-ins PovoliÅ¥ zásuvné moduly Open links in embedded browser in background OtváraÅ¥ odkazy v integrovanom prehliadaÄi otváraÅ¥ na pozadí Open links in external browser in background (experimental) OtváraÅ¥ odkazy v externom prehliadaÄi otváraÅ¥ na pozadí (experimentálne) Default zoom on pages: Východzie priblíženie na stránkach: Browser selection: Výber prehliadaÄa: External browser: Externý prehliadaÄ: Content: Obsah: User style sheet: Vlastné Å¡týly: Maximum pages in cache Maximálny poÄet stránok v keÅ¡i Store cache in: UkladaÅ¥ keÅ¡ do: Maximum size of disk cache Maximálna veľkosÅ¥ keÅ¡e MB MB Use disk cache PoužiÅ¥ keÅ¡ Allow local data to be set PovoliÅ¥ nastavenie lokálnych dát Keep local data only until quit application UchovaÅ¥ lokálne dáta len do ukonÄenia programu Block sites from setting any data BlokovaÅ¥ stránkam nastavovaÅ¥ akékoľvek dáta Clear VyÄistiÅ¥ Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash je plugin, ktorý blokuje automatické naÄítavanie Flash obsahu stránky. Zablokovaný obsah môžte ruÄne spustiÅ¥ kliknutím na ikonku prehraÅ¥ Flash. Use Click to Flash PoužiÅ¥ plugin Click to Flash Add... PridaÅ¥... Remove... OdstrániÅ¥... Ask where to save each file before downloading Pred stiahnutím sa vždy opýtaÅ¥ na umiestnenie uloženia Download location: Miesto pre ukladanie: History História Click to Flash Click to Flash Downloads SÅ¥ahovania Automatically update the feeds on startup Automaticky aktualizovaÅ¥ kanály po spustení Automatically update the feeds every Automaticky aktualizovaÅ¥ kanály každých seconds sekúnd hours hodín Nothing to do NerobiÅ¥ niÄ Dec Dec December December Display format for date: Formát zobrazenia dátumu: time: Äasu: Alternating row background colors StriedaÅ¥ farby pozadia riadkov Simplified representation of date and time ZjednoduÅ¡ená reprezentácia dátumu a Äasu Show All ZobraziÅ¥ vÅ¡etko Show New ZobraziÅ¥ nové Show Unread ZobraziÅ¥ nepreÄítané Show Starred ZobraziÅ¥ oznaÄené hviezdiÄkou Show Not Starred ZobraziÅ¥ neoznaÄené hviezdiÄkou Show Unread or Starred ZobraziÅ¥ nepreÄítané alebo oznaÄené hviezdiÄkou Show Last Day ZobraziÅ¥ za posledný deň Show Last 7 Days ZobraziÅ¥ za posledných 7 dní Style sheet for news: Style sheet pre noviny: Mark news as read: OznaÄiÅ¥ novinku ako preÄítanú: on selecting. With timeout pri výbere s omeÅ¡kaním after switching to another news po prechode na inú novinku Mark displayed news as read when switching feeds OznaÄiÅ¥ novinky ako preÄítané pri zmene kanálu Mark displayed news as read when closing tab OznaÄiÅ¥ novinky ako preÄítané pri zatvorení karty Mark displayed news as read on minimize OznaÄiÅ¥ novinky ako preÄítané pri minimalizácii okna Change behavior of action 'Next Unread News' ZmeniÅ¥ správanie Äinnosti 'ÄŽalÅ¡ie nepreÄítané novinky' starred news novinkách oznaÄených hviezdiÄkou labeled news novinkách oznaÄených Å¡títkom Automatically mark identical news as read Automaticky oznaÄiÅ¥ rovnaké novinky ako preÄítané Prevent accidental deletion of: ZamedziÅ¥ náhodné odstránenie pri Enable cleanup on shutdown PovoliÅ¥ upratovanie pri vypínaní Maximum age of news in days to keep: Maximálny vek uchovávaných noviniek v dňoch: Maximum number of news to keep: Maximálny poÄet uchovávaných noviniek: Delete read news VymazaÅ¥ preÄítané novinky Never delete unread news Nikdy nevymazaÅ¥ nepreÄítané novinky Never delete starred news Nikdy nevymazaÅ¥ novinky oznaÄené hviezdiÄkou Never delete labeled news Nikdy nevymazaÅ¥ novinky oznaÄené Å¡títkom Clean up 'Deleted' VyÄistiÅ¥ 'Vymazané' Enable DB optimization (slower shutdown) PovoliÅ¥ optimalizáciu DB (pomalÅ¡ie vypínanie) Reading Čítanie Clean Up Upratovanie New... Nový... Edit... UpraviÅ¥... Delete... VymazaÅ¥... Move up Vyššie Move down Nižšie Show when inactive main window ZobraziÅ¥ keÄ je hlavné okno neaktívne Screen Obrazovka Transparency PriesvitnosÅ¥ Show titles feeds ZobraziÅ¥ názvy kanálov Show icon feed ZobraziÅ¥ ikonu kanála Show button 'Mark All News Read' ZobraziÅ¥ tlaÄítko "OznaÄiÅ¥ vÅ¡etky novinky ako preÄítané" Show button 'Mark Read/Unread' ZobraziÅ¥ tlaÄítko "OznaÄiÅ¥ ako preÄítané/nepreÄítané" Show button 'Open in External Browser' ZobraziÅ¥ tlaÄítko "OtvoriÅ¥ v externom prehliadaÄi" Show button 'Delete News' ZobraziÅ¥ tlaÄítko "VymazaÅ¥ novinky" Play sound for incoming new news PrehraÅ¥ zvuk pri prijatí novinky Play PrehraÅ¥ Display notification for incoming news ZobraziÅ¥ oznámenie pre novo prichádzajúce novinky Top Left Vľavo hore Top Right Vpravo hore Bottom Left Vľavo dole Bottom Right Vpravo dole Review Náhľad Position Umiestnenie Show maximum of ZobraziÅ¥ maximálne item on page notification Položky na strane oznámení Width list items Šírka zoznamu položiek pixels pixelov Close notification after ZatvoriÅ¥ oznámenie po Do not show notification in fullscreen mode NezobrazovaÅ¥ oznámenia v režime celej obrazovky Display Zobrazenie Action mouse on news opening: ÄŒinnosÅ¥ myÅ¡i pri otváraní novinky: Single Click: Jeden klik: Double Click: Dvojklik: Middle Click: Klik stredným tlaÄítkom: Only show selected feeds: ZobrazovaÅ¥ iba pre vybrané kanály: Notification Oznámenie Sound Zvuk Selection of feeds Výber kanálov All Feeds VÅ¡etky kanály Site Stránka User Používateľ Password Heslo Delete VymazaÅ¥ Delete All VymazaÅ¥ vÅ¡etky Show Passwords ZobraziÅ¥ heslá Version Verzia Author Autor Contact Kontakt Choose language: Výber jazyka: Type Typ Font Písmo Feeds list font Písmo zoznamu kanálov News list font Písmo zoznamu noviniek News title font Písmo titulku novinky News text font Písmo textu noviniek Notification font Písmo oznámení Change... ZmeniÅ¥... Reset Východzie Feeds list color Farba zoznamu kanálov Feeds list background Farba pozadia zoznamu kanálov News list color Farba zoznamu noviniek News list background Farba pozadia zoznamu noviniek Focused news color Farba oznaÄenej novinky Focused news background color Farba pozadia oznaÄenej novinky Link color Farba odkazu Title color Farba titulku Date color Farba dátumu Author color Farba autora News text color Farba písma noviniek News title background Farba pozadia titulku News background Farba pozadia noviniek Feed with new news Kanál s novou novinkou Count of unread news in feeds tree PoÄet nepreÄítaných noviniek v zozname kanálov Disabled feed Nepovolený kanál Alternating row colors Striedajúca farba pozadia riadkov Notification text color Farba textu oznámenia Notification background color Farba pozadia oznámenia Auto load images in news view Automaticky naÄítaÅ¥ obrázky v novinkách Text color of new news Farba textu nových noviniek Show feeds tree toggle ZobraziÅ¥ prepínanie stromu kanálov Clear new status when minimize to tray VynulovaÅ¥ poÄet nových noviniek pri minimalizovaní do tray liÅ¡ty Set focus on the last opened news VybraÅ¥ poslednú otvorenú novinku Set focus at the top of news list VybraÅ¥ prvú novinku v zozname Set focus on the unread news VybraÅ¥ prvú nepreÄítanú novinku Open the news OtvoriÅ¥ novinku Default news filter: Východzí filter noviniek: Action on feed opening: ÄŒinnosÅ¥ pri otvorení kanálu: Show news description instead of loading web page ZobrazovaÅ¥ popis novinky namiesto naÄítania webstránky Text color of unread news Farba textu nepreÄítaných noviniek Focused feed color Farba vybratého kanála Focused feed background color Farba pozadia vybratého kanála Standard Å tandardné Fixed Neproporciálne Serif Serif Sans Serif Sans Serif Cursive Kurzíva Fantasy Fantasy Default font size Východzia veľkosÅ¥ písma Fixed font size Pevná veľkosÅ¥ písma Minimum font size Minimálna veľkosÅ¥ písma Minimum logical font size Minimálna logická veľkosÅ¥ písma Font families: Písmo: Font sizes: VeľkosÅ¥ písma: Fonts Písma Fonts Browser Písma v prehliadaÄi Colors Farby Filter Filter Action ÄŒinnosÅ¥ Description Popis Shortcut Skratka Shortcut: Skratka: Open File... OtvoriÅ¥ súbor... Select Style Sheet File VybraÅ¥ súbor so Å¡týlmi Open Directory... OtvoriÅ¥ prieÄinok... Add site to whitelist PridaÅ¥ stránku do whitelistu Site without 'http://' (ex. youtube.com) Stránka bez 'http://' (napr. youtube.com) QAbstractSpinBox &Step up &ZvýšiÅ¥ hodnotu Step &down ZnížiÅ¥ ho&dnotu &Select All &VybraÅ¥ vÅ¡etko QDialogButtonBox Close ZatvoriÅ¥ Cancel ZruÅ¡iÅ¥ &Yes Ãn&o &No &Nie QFtp Not connected Nepripojené Host %1 not found Hostiteľ %1 nenájdený Connection refused to host %1 Spojenie odmietnuté hostiteľom %1 Connection timed out to host %1 VyprÅ¡al Äasový limit pripojenia k hostiteľovi %1 Connected to host %1 Pripojené k hostiteľovi %1 Connection refused for data connection Spojenie odmietnuté dátovým pripojením Unknown error Neznáma chyba Connecting to host failed: %1 Pripojenie k hostiteľovi zlyhalo: %1 Login failed: %1 Prihlásenie zlyhalo: %1 Listing directory failed: %1 Výpis prieÄinka zlyhal: %1 Changing directory failed: %1 Zmena prieÄinka zlyhala: %1 Downloading file failed: %1 Stiahnutie súboru zlyhalo: %1 Uploading file failed: %1 Odovzdanie súboru zlyhalo: %1 Removing file failed: %1 Vymazanie súboru zlyhalo: %1 Creating directory failed: %1 Vytvorenie prieÄinka zlyhalo: %1 Removing directory failed: %1 Vymazanie prieÄinka zlyhalo: %1 Connection closed Spojenie ukonÄené QLineEdit &Undo &VrátiÅ¥ &Redo &OpakovaÅ¥ Cu&t Vys&trihnúť &Copy &KopírovaÅ¥ &Paste &VložiÅ¥ Delete VymazaÅ¥ Select All VybraÅ¥ vÅ¡etko QMultiInputContext Select IM VybraÅ¥ IM QObject Cannot start external program Nepodarilo sa spustiÅ¥ externý program Cannot start external program! %1 Nepodarilo sa spustiÅ¥ externÅ¥ program! %1 Error Chyba QTextControl &Undo &VrátiÅ¥ &Redo &OpakovaÅ¥ Cu&t Vys&trihnúť &Copy &KopírovaÅ¥ &Paste &VložiÅ¥ Delete VymazaÅ¥ Select All VybraÅ¥ vÅ¡etko Copy &Link Location KopírovaÅ¥ odkaz &umiestnenia QWizard Cancel ZruÅ¡iÅ¥ < &Back < &Späť &Finish &DokonÄit &Next > ÄŽ&alej > RSSDetectionWidget Untitled feed Nepomenovaný kanál RequestFeed Server requires authentication! Server vyžaduje autentifikáciu! Server replied: Not Found! OdpoveÄ servera: Nenájdené! Redirect error! Chyba presmerovania! Request timeout! ÄŒasový limit požiadavky vyprÅ¡al! SQLiteDriver Error opening database Chyba pri otváraní databáze. Error closing database Chyba pri zatváraní databáze. Unable to begin transaction Nie je možné zaÄaÅ¥ transakciu Unable to commit transaction Nie je možné odovzdaÅ¥ transakciu Unable to rollback transaction Nie je možné odvolaÅ¥ transakciu SQLiteResult Unable to fetch row Nie je možné získaÅ¥ riadok No query Žiadny dotaz Unable to execute statement Nie je možné spustiÅ¥ príkaz Unable to execute multiple statements at a time Nie je možné spustiÅ¥ viacero príkazov naraz. Unable to reset statement Nie je možné zresetovaÅ¥ príkaz Unable to bind parameters Nie je možné spojiÅ¥ parametre Parameter count mismatch Chybný poÄet parametrov SslErrorDialog SSL Certificate Error! Chyba SSL certifikátu! Only for this session Len pre túto reláciu UpdateAppDialog Check for Updates Kontrola aktualizácií Checking for updates... SkontrolovaÅ¥ aktualizácie... Loading history... NaÄítava sa história... Don't remind about this version NepripomínaÅ¥ mi túto verziu &Install &InÅ¡talovaÅ¥ You already have the latest version Už máte najnovÅ¡iu verziu A new version of QuiteRSS is available! Je dostupná nová verzia QuiteRSS! Click here to go to the download page Kliknite sem pre prechod na stránku na stiahnutie Your version is: VaÅ¡a verzia je: Current version is: NajnovÅ¡ia verzia je: Error checking updates Chyba pri kontrole aktualizácií quiterss-0.18.3/lang/quiterss_sr.ts000066400000000000000000005724161265173051100173560ustar00rootroot00000000000000 AboutDialog About О програму Revision Ревизија Version Издање QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS је читач веÑти отвореног извора Includes: Укључи: Application directory: ФаÑцикла програма: Resource directory: фаÑцикла реÑурÑа: Data directory: ФаÑцикла података: Backup directory: ФаÑцикла копије: Database file: Датоека података: Settings file: Датотека подешавања: Log file: Датотека журнала: Authors Ðутори History ИÑторијат License Лиценца Information Информација AdBlockAddSubscriptionDialog Add Subscription Додај ÑƒÐ¿Ð¸Ñ Title: ÐаÑлов: Address: ÐдреÑа: Add new subscription to AdBlock: Додај нов ÑƒÐ¿Ð¸Ñ AdBlock: AdBlockCustomList Custom Rules Прилагођена правила AdBlockDialog AdBlock Configuration Подешавање AdBlock Enable AdBlock Омогући AdBlock Search... Тражи... Options Опције AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Употребљава Ñамо најбитније делове од EasyList (због перформанÑе) Add Rule Додај правило Remove Rule Уклони правило Add Subscription Додај ÑƒÐ¿Ð¸Ñ Remove Subscription Уклони ÑƒÐ¿Ð¸Ñ Update Subscriptions Ðжурирај упиÑе Learn about writing rules... Како да Ñе пишу правила... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock блокира нежељени Ñадржај Ñа интернет лиÑтова AdBlock AdBlock Show AdBlock &Settings Покажи поÑтавке AdBlock-а Disable on %1 УгаÑи за %1 Disable only on this page УгаÑи Ñамо за овај лиÑÑ‚ Blocked Popup Windows Блокирани попап прозори %1 with (%2) %1 Ñа (%2) No content blocked Ðишта блокирано Blocked URL (AdBlock Rule) - click to edit rule Блокиран УРЛ (AdBlock правило) - кликнути овде за уред AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Ðе може да Ñе учита ÑƒÐ¿Ð¸Ñ AdBlockTreeWidget Add Rule Додај правило Remove Rule Уклони правило Add Custom Rule Додај прилагођено правило Please write your rule here: Ðапишите ваше правило овде: %1 (recently updated) %1 (недавно ажурирано) %1 (Error: %2) %1 (Грешка: %2) AddFeedWizard Add Feed Додај канал Create New Feed Креирај нов канал Use title of the feed as displayed name ÐаÑлов канала као име показивања Server requires authentication: Сервер захтева аутентификацију: Username: КориÑник: Password: Лозинка: Feed URL or website address: УРЛ канала или адреÑа Ñајта: Feeds Канали All Feeds Сви канали New Folder... Ðова фаÑцикла... Displayed name: Приказано име: Location: Смештај: URL error! Грешка УРЛ-а! Duplicate feed! Дупли канал! Can't find feed URL! Ðе могу да нађем УРЛ канала! Request failed! Захтев није уÑпео! AddFolderDialog Add Folder Додај фаÑциклу Feeds Канали All Feeds Сви канали Name: Ðазив: Location: Смештај: AuthenticationDialog Save password Сачувај лозинку Authorization required Ðуторизација потребна Server: Сервер: Message: Порука: Username: КориÑник: Password: Лозинка: CategoriesTreeWidget Unread Ðепрочитано Starred Са звездом Deleted ИзбриÑано Labels Етикете Open in New Tab Отвори у новом језичку Clear 'Deleted' ОчиÑти 'ИзбриÑано' Mark Read Означи прочитано CleanUpWizard Clean Up Чишћење Choose Feeds Одабрати канале All Feeds Сви канали Clean Up Options Опције чишћења Maximum age of news in days to keep: Мак ÑтароÑÑ‚ веÑти за чување: Maximum number of news to keep: Мак број веÑти за чување: Delete read news Обриши читане веÑти Never delete unread news Ðикада не бриши нечитане веÑти Never delete starred news Ðикада не бриши веÑти Ñа звездицом Never delete labeled news Ðикада не бриши веÑти Ñа етикетом Clean up 'Deleted' ОчиÑти 'ИзбриÑано' Purge DB ОчиÑти базу Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Потпуно уклони запиÑе који Ñу обележени као "ИзбриÑан" из базе. Старе веÑти могу да Ñе поново појаве Information Информација Clean Up wizard deleted %1 news ÐÑиÑтент бриÑања је обриÑао %1 веÑти ClickToFlash Object blocked by ClickToFlash ClickToFlash блокирао објекат Hide object Сакриј објекат Add '%1' to whitelist Додај '%1' у ÑпиÑку дозвољена CustomizeToolbarDialog Customize Main Toolbar Прилагоди главну линију алата Customize Feeds Toolbar Прилагоди траку канала Customize News Toolbar Прилагоди траку веÑти Load images Учитај Ñлике Separator Раздвајач Icon Икона Text ТекÑÑ‚ Text Beside Icon ТекÑÑ‚ поред иконе Text Under Icon ТекÑÑ‚ иÑпод иконе Big Велико Normal Ðормално Small Мало Style: Стил: Icon Size: Величина икона: Add Додај Remove Уклони Move up Помери горе Move down Помери доле Default Подразумевано DownloadItem Remaining time unavailable ПреоÑтало време није доÑтупно Error: Cannot write to file! Грешка: Ðе могу да упишем у датотеку! Error: Грешка: few seconds неке Ñекунде seconds Ñекунди minutes минута hours Ñати Unknown size Ðепозната велична Unknown speed Ðепозната брзина %2 - unknown size (%3) %2 - непозната величина (%3) Remaining %1 - %2 of %3 (%4) ПреоÑтало %1 - %2 of %3 (%4) Cancelled - %1 Поништено - %1 Delete file ОбриÑати датотеку Do you want to also delete downloaded file? Да ли да Ñе избришу и преузете датотеке? Open File Отвори датотеку Open Folder Отвори фаÑциклу Copy Download Link Копирај везу за преузимање Cancel Downloading Прекини преузимање Remove Уклони Cancelled Поништено Error Грешка Not found ÐиÑам пронашао Sorry, the file %1 was not found! ÐажалоÑÑ‚, датотека %1 није нађена! DownloadManager Clear Изпразни File %1 (*.%2) Датотека %1 (*.%2) All Files (*.*) Све (*.*) Save As... Сачувај као... Executable: Извршно: Arguments: Ðргументи: FeedPropertiesDialog Properties ПоÑтавке General Опште Columns Колоне Authentication Ðутентификација Status Стање Title: ÐаÑлов: Homepage: Домаћа Ñтраница: Feed URL: УРЛ канала: Load Title Ð£Ð½Ð¾Ñ Ð½Ð°Ñлова Load Favicon Ð£Ð½Ð¾Ñ Ð¸ÐºÐ¾Ð½Ðµ Select Icon... Изабери икону... Select Icon Изабери икону Disable update Онемогући ажурирање Automatically update every Ðуто ажурирај Ñвака seconds Ñекунди minutes минута hours Ñати Starred Са звездом Load images Учитај Ñлике Display in new tab on startup Ðа покретање прикажи у новом језичку Show news' description instead of loading web page Прикажи Ð¾Ð¿Ð¸Ñ Ð²ÐµÑти у меÑто учитавање Ñтранице Automatically delete duplicate news ÐутоматÑко обриши дупле веÑти Display Приказ Reading Читање Enable JavaScript Упали JavaScript Right-to-left layout Модел деÑно-на-лево Ascending РаÑтући Descending Опадајући Sort by: Поређај по: Add Додај Remove Уклони Move up Помери нагоре Move down Помери надоле Default Подразумевано Server requires authentication: Сервер захтева аутентификацију: Username: КориÑник: Password: Лозинка: Feeds count: бр. канала: Description: ОпиÑ: Status: Стање: Created: Креирано: Last update: Ðжурирано: News count: Број веÑти: Good Добро Long ago ;-) Одавно ;-) new ново unread нечитано Image files Слике Select Image Одабери Ñлику Load icon: can't open a file! Учитавање иконе: отварање немогуће! FilterRulesDialog Filter Rules Правила филтера Feeds Канали All Feeds Сви канали Filter name: Име филтера: Match all news Спари Ñве веÑти Match all conditions Спари Ñве уÑлове Match any condition Спари било који уÑлов Perform these actions: Уради ове радње: Please enter name for the filter. Унети име за филтер. Please enter search condition for the news filter. Унети уÑлов претраге за нови филтер. FindFeed Find Name Ðаћи име Find Link Ðаћи линк FindTextContent Find in News Ðаћи у веÑти Find in Titles Ðаћи у наÑлов Find in Authors Ðаћи у ауторе Find in Categories Ðаћи у категорији Find in Descriptions Ðаћи у опиÑе Find in Links Ðаћи у линкове Find in Browser Ðаћи у прегледнику FtpDownloader Canceled! Поништено! ItemAction Mark News as Read Означи веÑÑ‚ прочитану Add Star Додај звезду Delete Обриши Add Label Додај етикету Play a Sound ПуÑти звук Show News in Notifier Покажи веÑти у обавеÑтач Browse Претражи Play ПуÑти Add Action Додај радњу Delete Action Обриши радњу Open File... Отвори датотеку... ItemCondition Title ÐаÑлов Description ÐžÐ¿Ð¸Ñ Author Ðутор Category Категорија State Стање Link Веза News ВеÑти New Ðово Read Читањо Starred Са звездом Add Condition Додај уÑлов Delete Condition Обриши уÑлов contains Ñадржи doesn't contains не Ñадржи is јеÑте isn't није begins with почиње Ñа ends with Ñе завршава Ñа Regular expressions Регуларни изрази LabelDialog New Label Ðова етикета Load icon... Учитај икону... Default Подразумевано Select color... Одабери боју... Name: Ðазив: Icon: Икона: Color text: Боја текÑта: Color background: Боја позадине: Image files Слике Select Image Одабери Ñлику Load icon: can't open a file! Учитавање иконе: немогуће отварање! MainApplication Saving data... Сачувавање података... MainWindow &AdBlock AdBlock Hide Categories Сакриј категорије Show Categories Прикажи категорије Select OPML-File Изаберите OPML датотеку OPML-Files (*.%1 *.%2) OPML-датотеке (*.%1 *.%2) Import canceled Увоз поништен Import: can't open a file Увоз: не могу да отворим датотеку OPML-Files (*.%1) OPML-датотеке (*.%1) Export canceled Извоз поништен Export: can't open a file Извоз: не могу да отворим датотеку Unread: %1 Ðечитано: %1 All: %1 Све: %1 (Browser) (Прегледач) New News: %1 Ðове веÑти: %1 Unread News: %1 Ðечитане веÑти: %1 &Add Додај Add New Feed Додај нови канал &Feed... Канал... F&older... ФаÑцикла... Add New Folder Додај нову афÑциклу Open in New Tab Отвори у новом језичку &Delete... Обриши... Delete Selected Feed Обриши изабран канал &Import Feeds... Увези канале... Import Feeds from OPML File Увези канале из OPML датотеке &Export Feeds... Извези канале... Export Feeds to OPML File Извези канале у OPML датотеку E&xit Излаз Update Feed Ðжурирај канал Update Current Feed Ðжурирај тренутни канал Update All Ðжурирај Ñве Update All Feeds Ðжурирај Ñве канале Mark All Feeds Read Означи Ñве прочитаним Mark Read/Unread Означи Прочитаним/непрочитаним Mark Current News Read/Unread Означи тренутне веÑти Прочитаним/непрочитаним Mark All News Read Означи Ñве веÑти прочитане Downloads Преузимања Clean Up... Чишћење... News Filters... Филтери веÑти... Filter News... Филтрирај веÑти... Options... Опције... Open Options Dialog Отвори опције Filter Feeds Филтрирај канале Show All Прикажи Ñве Show New Прикажи нове Show Unread Прикажи непрочитане Show Starred Feeds Прикажи канале Ñа звездицом Show Not Working Feeds Прикажи канале које не раде Filter News Филтрирај веÑти Show Starred Прикажи Ñа звездицом Show Not Starred Прикажи без звездице Show Unread or Starred Прикажи непрочитано или Ñа звеудицом Show Last Day Прикажи поÑледњи дан Show Last 7 Days Прикажи поÑледње Ñедмице About... О... Show 'About' Dialog Прикажи дијалог „О...“ Check for Updates... Провери ажурирања... Report a Problem... Пријави проблем... Open News Отвори веÑти Open in Browser Отвори у прегледнику Open in External Browser Отвори у Ñпољном прегледнику Open News in External Browser Отвори веÑти у Ñпољном прегледачу Open News in New Tab Отвори веÑти у новом језичку Open in Background Tab Отвори у позадинÑки језичак Open News in Background Tab Отвори веÑти у позадинÑки језичак Star Звезда Mark News Star ПоÑтави звезду веÑти Delete Обриши Delete Selected News Обриши изабране веÑти Delete All News Обриши Ñве веÑти Delete All News from List Обриши Ñве веÑти Ñа лиÑте Restore Врати Restore News Врати веÑти Copy Link Копирај везу Restore last deleted news Врати поÑледње избриÑане веÑти Mark Read Означи прочитано Mark Feed Read Маркирај канал читан Properties ПоÑтавке &File Датотека Count Unread News Број нечитане веÑти Count All News Број Ñвих веÑти Last Update Ðжурирано Reset browser zoom РеÑетуј зум прегледачу Print Web Page Штампај лиÑÑ‚ Preview Web Page Преглед лиÑта Save page in database Сачувај лиÑÑ‚ у базу Save page in database instead of news description Сачувај лиÑÑ‚ у базу у меÑто Ð¾Ð¿Ð¸Ñ Ð²ÐµÑти Confirm Delete Потврда бриÑања Are you sure to delete selected elements? Сигурно обриÑати одабране елементе? Menu Мени Add Feed... Додај канал... &Create Backup... Креирај копију... S&how Menu Bar Покажи траку менија Stop Update Feeds ЗауÑтави ажурирање Open News Description Отвори Ð¾Ð¿Ð¸Ñ Ð²ÐµÑти Copy News Link Копирај везу веÑти &View Приказ Fee&ds Канали &News ВеÑти &Browser Претражи &Tools Ðлатке &Help Помоћ Main Toolbar Ðлатна трака Customize Toolbar Прилагоди траку Main Toolbar... Главна трака... Customize Toolbar... Прилагоди траку... Feeds Toolbar... Трака канала... News Toolbar... Трака ВеÑти... Lock Toolbar Блокирај траку Hide Toolbar Сакриј траку алатки Layout Изглед Classic КлаÑичан Newspaper Ðовине Application Style Стил проргама System СиÑтем System2 System2 Green Зелена Orange ÐаранџаÑти Purple Пурпурни Pink Розе Gray Сиво Browser Position Смештај претраживача Top Врх Bottom Дно Right ДеÑно Left Лево Show Window Прикажи прозор Previous Feed Претходни канал Next Feed Следећи канал Previous News Претходна веÑÑ‚ Next News Следећа веÑÑ‚ News Page Up Страница веÑти горе News Page Down Страница веÑти доле Next Unread News Следећа непрочитана веÑÑ‚ Previous Unread News Претходна непрочитана веÑÑ‚ Switch Focus to Next Panel Пребаци Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñледеће окно Switch Focus to Next Panel (Tree Feeds, List News, Browser) Пребаци Ñ„Ð¾ÐºÑƒÑ Ð½Ð° Ñледеће окно (дрво, лиÑта, претраживач) Switch Focus to Previous Panel Пребаци Ñ„Ð¾ÐºÑƒÑ Ð½Ð° претходно окно Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Пребаци Ñ„Ð¾ÐºÑƒÑ Ð½Ð° претходно окно (дрво, лиÑта, претраживач) Show/Hide Tree Feeds Покажи/Ñакриј дрво канала Minimize to Tray Умањи у треју Minimize Application to Tray Умањи програм у треју Columns Колоне Show Indentation Покажи увлачење Search Feed Тражи канал Zoom Зум Zoom In Повечај Zoom in in browser Повечај у прегледнику Zoom Out Умањи Zoom out in browser Умањи у прегледнику 100% 100% Print... Штампај... Print Preview... Преглед штампања... Page up (Browser) Горе (прегледач) Page down (Browser) Доле (прегледач) Save As... Сачувај као... Save Page As... Сачувај Ñтраницу као... Show/Hide Покажи/Сакри Feeds Toolbar Трака канала News Toolbar Трака ВеÑти Browser Toolbar Трака претраживача Panel Categories Окно категорије Status Bar СтатуÑна трака Full Screen Цео екран Stay On Top Држи на врху Categories Категорије Label Етикета Show labels menu Прикажи називе за мени Close Tab Затвори језичак Close Other Tabs Затвори друге језичке Close All Tabs Затвори Ñве језичке Switch to next tab Пребаци на Ñлед. језичак Switch to previous tab Пребаци на прет. језичак Unread Ðепрочитано Starred Са звездом Deleted ИзбриÑано Labels Етикета Decrease news list/increase browser Умањи лиÑту веÑти/повећај претраживач Increase news list/decrease browser Повечај лиÑту веÑти/умањи претраживач Find Ðађи Open Homepage Feed Отвори Ñтраницу канала Sort by Name Среди по Имену Collapse All Folders Умањи Ñве фаÑцикле Expand All Folders Отвори Ñве фаÑцикле Next Folder Следећа фаÑцикла Previous Folder Претходна фаÑцикла Expand Folder Прошири фаÑциклу Setting Page: Labels Подешавање Ñтране: ÐаÑлове Share Дељење Sort By Поређај по Ascending РаÑтуће Descending Опадајуће Check for updates Провери ажурирања A new version of QuiteRSS... Ðовија верзија програма... Loading... Учитавање... Web Page Веб лиÑÑ‚ Save As Сачувај као HTML-Files (*.%1) HTML-датотеке (*.%1) Text files (*.%2) ТекÑтуалне датотеке (*.%2) Save As: can't open a file Сачувај као: не могу да отворим датотеку Choose Directory Одабери фаÑциклу Important Важно Work ПоÑао Personal Лично To Do Задатак Later КаÑније Amusingly Занимљиво NetworkManager SSL Certificate Error! Грешка ССЛ цертификата The "%1" server has the following errors in the SSL certificate: Сервер "%1" има ове грешке у SSL цертификату: <b>Organization: </b> <b>Организација: </b> <b>Domain Name: </b> <b>Име домена: </b> <b>Expiration Date: </b> <b>ИÑтицање датума: </b> <b>Error: </b> <b>Грешка: </b> Would you like to make an exception for this certificate? Да урадите изузетак за овај цертификат? NewsFiltersDialog News Filters Филтери веÑти Feeds Канали Filter Name Име филтра New... Ðов... Edit... Уреди... Delete... Обриши... Move up Помери горе Move down Помери доле Run Filter Покрени филтер Delete Filter ОбриÑати филтер Are you sure you want to delete the filter '%1'? Сигурно обриÑати филтер „%1“? NewsHeader Icon Feed Иконица канала Title ÐаÑлов Published Објављено Received Примљено Author Ðутор Category Категорија Read Читање Star Звезда Label Етикета Feed Title ÐаÑлов канала Link Веза NewsItem Mark Read/Unread Означи Прочитаним/непрочитаним Delete News Обриши веÑти NewsTabWidget Loading... (%p%) Учитавање... (%p%) Home Домаћа Open Page in External Browser Отвори Ñтрану у Ñпољном прегледачу Open Link in External Browser Отвори везу у Ñпољном прегледачу Open Link Отвори везу Open in New Tab Отвори у новом језичку Save Link... Сачувај везу... Save Image... Сачувај Ñлику... Copy Link Копирај везу Copy Копирај Go Back Ðазад Go Forward Ðапред Stop Стани Reload Учитај поново Copy Image Копирај Ñлику Copy Image Address Копирај адреÑу Ñлике Load Images Учитај Ñлике Auto Load Images to News View Ðуто учитај Ñлике у изглед веÑти No Load Images Ðе учитај Ñлике No Load Images to News View Ðе учитај Ñлике у изглед веÑти Close Tab Затвори језичак Auto Load Images in News View Ðуто учитај Ñлике у изглед веÑти Don't Load Images Ðе учитај Ñлике Don't Load Images in News View Ðе учитај Ñлике у изглед веÑти Comments Коментари Author: %1 Ðутор: %1 audio аудио video видео media медиј Link to Веза ка Mark Read/Unread ПоÑтави Читано/Ðечитано Mark News Star ПоÑтави звезду веÑти Label Етикета Share Дељење Open News in External Browser Отвори веÑти у Ñпољном прегледачу Delete Обриши NotificationWidget Close Затвори Mark All News Read Означи Ñве веÑти прочитане Previous Page Претходни лиÑÑ‚ Next Page Следећи лиÑÑ‚ Incoming News: %1 Долазне веÑти: %1 Page %1 of %2 Страница %1 од %2 OptionsDialog Options Опције General Опште System Tray СиÑтемÑка каÑета Network Connections Везе Ñа мрежом Browser Прегледач Feeds Канали Labels Етикете Notifications Обавештења Passwords Лозинке Language Језик Fonts & Colors Фонтови и боје Keyboard Shortcuts Пречице Warning: key is already assigned to Пажња: типак је већ подешен за Show splash screen on startup Уводни екран при покретању Reopen last opened feeds on startup Поново отвори поÑледњи канали на покретање Open new tab next to active Отвори нов језичак поред активног Hide feeds tree when opening tabs Сакриј дрво канала на отварање језичка Show default rss-icon instead of favourite one Покажи РСС икону у меÑту омиљену Automatically collapse folders Ðуто умањи фаÑцикле Show close button on tab Прикажи дугме затварања језичка Automatically check for updates Ðуто провери ажурирања Help improve QuiteRSS by sending usage information Помогни да Ñе побољша QuiteRSS тако што шаљете инфо о употреби Store a DB in memory (requires program restart) Сачувај базу у меморији (потребно реÑтарт програма) Save DB stored in memory to file every Дачувај базу из меморије Ñвака minutes минута Run QuiteRSS at Windows startup Покрени QuiteRSS Ñа ÑиÑтемом Show system tray icon Прикажи ÑиÑтемÑку икону starting QuiteRSS покретање QuiteRSS-а minimizing QuiteRSS умањивање QuiteRSS-а closing QuiteRSS затварање QuiteRSS-а Show static icon Прикажи Ñтатичну икону Change icon for incoming new news Промени икону за улазне веÑти Show count of new news Прикажи број нових веÑти Show count of unread news Прикажи број непрочитане веÑти Single click instead of double click for show window Један клик у меÑто двоклика за приказ прозора Empty working set on minimize to tray ИÑпразни Ñкуп рада на минимизирање Move to the system tray when: Пребаци у ÑиÑтем када: Tray icon behavior: Понашање иконице: Direct connection to the Internet Директна веза Ñа Интернетом System proxy configuration (if available) Подешавање прокÑија (ако доÑтупно) Manual proxy configuration: Ручно подешавање прокÑија: Proxy server: ПрокÑи Ñервер: Port: Порт: Username: КориÑник: Password: Лозинка: Request timeout: Захтеву је иÑтекло време: Number of requests: Број тражења: Number of retries: Број понављања: Options network requests when updating feeds (requires program restart): Опције тражења мреже на ажурирање канала (поновно покретање потребно): Use embedded browser КориÑти унутрашњи претраживач Use external browser КориÑти Ñпољашњи претраживач Default external browser Подразумевани Ñпољашни претраживач Following external browser: Овај екÑтерни претраживач: Browse... Претражи... Load images Учитај Ñлике Enable JavaScript Укључи ЈаваСкрипт Enable plug-ins Укључи прикључке Open links in embedded browser in background Отвори везе у позадини у унутрашњем претраживачу Open links in external browser in background (experimental) Отворивезе у Ñпољном прегледнику у позадини (пробно) Default zoom on pages: Зум на Ñтранице: Browser selection: Одабирање претраживача: External browser: Спољашњи претраживач: Content: Садржај: User style sheet: КориÑнички Ñтил: Maximum pages in cache ÐœÐ°ÐºÑ Ð»Ð¸Ñта у кешу Store cache in: Сачувај кеш у: Maximum size of disk cache ÐœÐ°ÐºÑ Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð° кеша диÑка MB МБ Use disk cache КориÑти кеш диÑка Allow local data to be set Дозволите да Ñе подеÑе локални подаци Keep local data only until quit application Задржи локалне податке код Ñе не затвори програм Block sites from setting any data Блокирај Ñајтове да поÑтаве податке Clear Обриши Cookies: Колачи: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash је додатак који блокира учитавање Flash Ñадржаја. Можете ручно да га учитате кликувши на Плеј иконицу у Флеш. Use Click to Flash Употреби Click to Flash Add... Додај... Remove... Уклони... Ask where to save each file before downloading Пре преузимања Ñваке датотеке, питај где да Ñе Ñачува Download location: МеÑто преузете датотеке: History ИÑторијат Click to Flash Click to Flash Downloads Преузимања Automatically update the feeds on startup Ðуто ажурирај канале на покретање Automatically update the feeds every Ðуто ажурирај канале Ñвака seconds Ñекунди hours Ñати Nothing to do Ðема шта да Ñе уради Dec Дец December Децембар Display format for date: Прикажи формат датума: time: време: Alternating row background colors Ðаизменична боја реда Simplified representation of date and time Мањи изглед датума и времена Show All Прикажи Ñве Show New Прикажи нове Show Unread Прикажи непрочитане Show Starred Прикажи Ñа звездицом Show Not Starred Прикажи без звездице Show Unread or Starred Прикажи непрочитано или Ñа звеудицом Show Last Day Прикажи поÑледњи дан Show Last 7 Days Прикажи поÑледње Ñедмице Style sheet for news: Изглед веÑти: Mark news as read: Означи веÑÑ‚ прочитану: on selecting. With timeout на одабирање. Чекањем after switching to another news поÑле прелаза на другу веÑÑ‚ Mark displayed news as read when switching feeds Маркирај показане веÑти као читане на прелаз канала Mark displayed news as read when closing tab Маркирај показане веÑти као читане на затварање језичка Mark displayed news as read on minimize Маркирај показане веÑти као читане на минимизирање Change behavior of action 'Next Unread News' Промени рад 'Даља нечитана веÑÑ‚' starred news веÑти Ñа звездицом labeled news веÑти Ñа етикетом Automatically mark identical news as read Ðуто поÑтави иÑте веÑти као прочитане Prevent accidental deletion of: ОнеÑпоÑоби Ñлучајно бриÑање од: Enable cleanup on shutdown Упали чишћење на гашење Maximum age of news in days to keep: Мак ÑтароÑÑ‚ веÑти за чување: Maximum number of news to keep: Мак број веÑти за чување: Delete read news Обриши читане веÑти Never delete unread news Ðикада не бриши нечитане веÑти Never delete starred news Ðикада не бриши веÑти Ñа звездицом Never delete labeled news Ðикада не бриши веÑти Ñа етикетом Clean up 'Deleted' ОчиÑти 'ИзбриÑано' Enable DB optimization (slower shutdown) Упали оптимизацију базе (Ñпорије затварање) Reading Читање Clean Up Чишћење New... Ðов... Edit... Уреди... Delete... Обриши... Move up Помери горе Move down Помери надоле Show when inactive main window Прикажи када је главни прозор неактиван Screen Екран Transparency ПровидноÑÑ‚ Show titles feeds Прикажи наÑлове канале Show icon feed Покажи икону канале Show button 'Mark All News Read' Прикажи дугме 'Означи Ñве веÑти прочитане' Show button 'Mark Read/Unread' Прикажи дугме 'Означи Прочитаним/непрочитаним' Show button 'Open in External Browser' Прикажи дугме 'Отвори у Ñпољном прегледнику' Show button 'Delete News' Прикажи дугме 'Обриши веÑти' Play sound for incoming new news Пушта звук за долазеће нове веÑти Play ПуÑти Display notification for incoming news Покажи обавештење за долазне веÑти Top Left Горе лево Top Right Горе деÑно Bottom Left Дно лево Bottom Right Дно деÑно Review Прегледај Position Смештај Show maximum of Прикажи Ð¼Ð°ÐºÑ Ð¾Ð´ item on page notification Ñтавки по Ñтраници обавештења Width list items Ширина лиÑте Ñтавке pixels пикÑела Close notification after Затвори обавештење поÑле Do not show notification in fullscreen mode Ðе приказуј нотофикације у пуном екрану Display Приказ Action mouse on news opening: Ðкција миша на отварање веÑти: Single Click: Један клик: Double Click: Дво клик: Middle Click: Средњи клик: Only show selected feeds: Прикажи Ñамо одабране канале: Notification Обавештење Sound Звук Selection of feeds Одвојени канали All Feeds Сви канали Site Сајт User КориÑник Password Лозинка Delete Избриши Delete All Обриши Ñве Show Passwords Прикажи лозинке Version Издање Author Ðутор Contact Контакт Choose language: Изаберите језик: Type Ð’Ñ€Ñта Font фонт Feeds list font Фонт ÑпиÑка канала News list font Фонт ÑпиÑка веÑти News title font Фонт назива веÑти News text font Фонт текÑта веÑти Notification font Фонт обавештења Change... Измени... Reset РеÑетуј Feeds list color Боја ÑпиÑка канала Feeds list background Позадина ÑпиÑка канала News list color Боја ÑпиÑка веÑти News list background Позадина ÑпиÑка веÑти Focused news color Боја фокиÑираних веÑти Focused news background color Позадина фокуÑираних веÑти Link color Боја везе Title color Боја наÑлова Date color Боја датума Author color Боја аутора News text color Боја текÑта веÑти News title background Позадина наÑлова веÑти News background ПОзадина веÑти Feed with new news Канали Ñа новим веÑтима Count of unread news in feeds tree Број нечитане веÑти у дрву канала Disabled feed Онемогућен канал Alternating row colors Ðаизменична боја колона Notification text color Боја текÑта отификације Notification background color Боја позадине обавештења Auto load images in news view Ðуто учитај Ñлике у изглед веÑти Text color of new news Боја текÑта за нове веÑти Show feeds tree toggle Покажи пребацивање дрва канала Clear new status when minimize to tray ОчиÑти Ñтање „ново“ на умањивање Set focus on the last opened news Ð¤Ð¾ÐºÑƒÑ Ð½Ð° поÑледњу отворену веÑÑ‚ Set focus at the top of news list Ð¤Ð¾ÐºÑƒÑ Ð½Ð° врх лиÑте веÑти Set focus on the unread news Ð¤Ð¾ÐºÑƒÑ Ð½Ð° нечитану веÑÑ‚ Open the news Отвори веÑÑ‚ Default news filter: Подразумевани филтер веÑти: Action on feed opening: Ðкција на отварање канала Show news description instead of loading web page Прикажи Ð¾Ð¿Ð¸Ñ Ð²ÐµÑти у меÑто учитавање Ñтранице Text color of unread news Боја текÑта за непрочитане веÑти Focused feed color Боја фокуÑираних веÑти Focused feed background color Позадина фокуÑираних веÑти Standard Стандардно Fixed ФикÑно Serif Serif Sans Serif Sans Serif Cursive Cursive Fantasy Fantasy Default font size Подразумевана величина Ñлова Fixed font size ФикÑна величина Ñлова Minimum font size Минимална величина Ñлова Minimum logical font size Минимална логична величина фонта Font families: Фамилије фонта: Font sizes: Величина фонта: Fonts Фонтови Fonts Browser Претраживач фонта Colors Боје Filter Филтер Action Радња Description ÐžÐ¿Ð¸Ñ Shortcut Пречица Shortcut: Пречица: Open File... Отвори датотеку... Select Style Sheet File Одабери Ñтил Open Directory... Отвори фаÑциклу... Add site to whitelist Додај Ñајт на белу лиÑту Site without 'http://' (ex. youtube.com) Сајт без 'http://' (нпр. youtube.com) QAbstractSpinBox &Step up Корак горе Step &down Корак доле &Select All Изабери Ñве QDialogButtonBox Close Затвори Cancel Откажи &Yes Да &No Ðе QFtp Not connected Ðије повезан Host %1 not found ХоÑÑ‚ %1 није нађен Connection refused to host %1 Одбијена веза на %1 Connection timed out to host %1 Предуга веза на %1 Connected to host %1 Привезано на %1 Connection refused for data connection Одбијена веза за везу Ñа податцима Unknown error Ðепозната грешка Connecting to host failed: %1 ÐеуÑпешна веза: %1 Login failed: %1 ÐеуÑпешно пријављивање: %1 Listing directory failed: %1 Погрешно лиÑтање фаÑцикле: %1 Changing directory failed: %1 Погрешна промена фаÑцикле: %1 Downloading file failed: %1 Погрешно преузимање датотеке: %1 Uploading file failed: %1 Погрешно Ñлање датотеке: %1 Removing file failed: %1 Погрешно уклањање датотеке: %1 Creating directory failed: %1 Погрешна креација фаÑцикле: %1 Removing directory failed: %1 Погрешно уклањање фаÑцикле: %1 Connection closed Веза затворена QLineEdit &Undo Опозови &Redo Понови Cu&t ИÑеци &Copy Копирај &Paste Ðалепи Delete Обриши Select All Изабери Ñве QMultiInputContext Select IM Изаберите ИМ QObject Cannot start external program Ðе могу да извршим Ñпољни програм Cannot start external program! %1 Ðе могу да извршим Ñпољни програм! %1 Error Грешка QTextControl &Undo Опозови &Redo Понови Cu&t ИÑеци &Copy Копирај &Paste Ðалепи Delete Избриши Select All Изабери Ñве Copy &Link Location Копирај локацију везе QWizard Cancel Откажи < &Back < Ðазад &Finish Заврши &Next > Даље > RSSDetectionWidget Untitled feed ВеÑти без наÑлова RequestFeed Server requires authentication! Сервер захтева аутентификацију! Server replied: Not Found! Одговор Ñервера: није нађено! Redirect error! Грешка уÑмеравања! Request timeout! Захтеву је иÑтекло време! SQLiteDriver Error opening database Грешка отварања базе Error closing database Грешка затварања базе Unable to begin transaction Ðе могу да почнем транзакцију Unable to commit transaction Ðе могу да поÑтавим транзакцију Unable to rollback transaction Ðе могу да вратим транзакцију SQLiteResult Unable to fetch row Ðе могу да донеÑем ред No query У упиту Unable to execute statement Ðе може да Ñе покрене изјава Unable to execute multiple statements at a time Ðе може да Ñе покрену више изјаве у иÑто време Unable to reset statement Ðе може да Ñе риÑетује изјава Unable to bind parameters Ðе може да Ñе повежу параметри Parameter count mismatch ÐеуÑклађеноÑÑ‚ бриоја параметра SslErrorDialog SSL Certificate Error! Грешка ССЛ цертификата! Only for this session Само за ову ÑеÑију UpdateAppDialog Check for Updates Провери ажурирања Checking for updates... Провера ажурирања... Loading history... Учитавам хронологију... Don't remind about this version Ðе обавеÑти за ову верзију &Install ИнÑталирај You already have the latest version Већ имате поÑледњу верзију A new version of QuiteRSS is available! Ðова верзија QuiteRSS-а је доÑтупна! Click here to go to the download page Кликните овде да одете до Ñтранице преузимања Your version is: Ваша верзија је: Current version is: Тренутна верзија је: Error checking updates Грешка провере ажурирања quiterss-0.18.3/lang/quiterss_sv.ts000066400000000000000000005446771265173051100173720ustar00rootroot00000000000000 AboutDialog About Om Revision Revision Version Version QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS är en plattformsoberoende RSS/Atom flödesläsare Includes: Inkluderar: Application directory: Programmapp: Resource directory: Resursmapp: Data directory: Datamapp: Backup directory: Backup-mapp: Database file: Databasfil: Settings file: Inställningsfil: Log file: Loggfil: Authors Upphovsmän History Historik License Licens Information Information AdBlockAddSubscriptionDialog Add Subscription Lägg till prenumeration Title: Rubrik: Address: Adress: Add new subscription to AdBlock: Lägg till ny prenumeration till AdBlock: AdBlockCustomList Custom Rules Anpassade regler AdBlockDialog AdBlock Configuration AdBlock-inställningar Enable AdBlock Aktivera AdBlock Search... Sök... Options Alternativ AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Använd endast grundläggande delar av EasyList (av prestandaskäl) Add Rule Lägg till regel Remove Rule Ta bort regel Add Subscription Lägg till prenumeration Remove Subscription Ta bort prenumeration Update Subscriptions Uppdatera prenumerationer Learn about writing rules... Hur man skriver regler... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock lÃ¥ter dig blockera oönskat innehÃ¥ll pÃ¥ webbsidor AdBlock AdBlock Show AdBlock &Settings Visa AdBlock-&inställningar Disable on %1 Inaktivera pÃ¥ %1 Disable only on this page Inaktivera endast pÃ¥ denna sida Blocked Popup Windows Blockerade popup-fönster %1 with (%2) %1 med (%2) No content blocked Inget innehÃ¥ll blockerat Blocked URL (AdBlock Rule) - click to edit rule Blockerad URL (AdBlock-regel) - Klicka för att redigera regel AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Kan inte läsa in prenumerationen! AdBlockTreeWidget Add Rule Lägg till regel Remove Rule Ta bort regel Add Custom Rule Lägg till anpassad regel Please write your rule here: Skriv din regel här: %1 (recently updated) %1 (uppdaterat) %1 (Error: %2) %1 (Fel: %2) AddFeedWizard Add Feed Lägg till flöde Create New Feed Skapa nytt flöde Use title of the feed as displayed name Använd flödets rubrik som visningsnamn Server requires authentication: Servern kräver autentisering: Username: Användarnamn: Password: Lösenord: Feed URL or website address: Flödets URL eller webbadress: Feeds Flöden All Feeds Alla flöden New Folder... Ny mapp... Displayed name: Visningsnamn: Location: Plats: URL error! URL-fel! Duplicate feed! Klona flöde! Can't find feed URL! Kan inte hitta flödets URL! Request failed! FörfrÃ¥gan misslyckades! AddFolderDialog Add Folder Lägg till mapp Feeds Flöden All Feeds Alla flöden Name: Namn: Location: Plats: AuthenticationDialog Save password Spara lösenord Authorization required Autentisering krävs Server: Server: Message: Meddelande: Username: Användarnamn: Password: Lösenord: CategoriesTreeWidget Unread Oläst Starred Stjärnmärkt Deleted Borttaget Labels Etiketter Open in New Tab Öppna i ny flik Clear 'Deleted' Rensa 'Borttaget' Mark Read Markera som läst CleanUpWizard Clean Up Rensa Choose Feeds Välj flöden All Feeds Alla flöden Clean Up Options Rensningsalternativ Maximum age of news in days to keep: Max antal dagar att spara nyheter: Maximum number of news to keep: Max antal nyheter som sparas: Delete read news Ta bort lästa nyheter Never delete unread news Ta aldrig bort lästa nyheter Never delete starred news Ta aldrig bort stjärnmärkta nyheter Never delete labeled news Ta aldrig bort etiketterade nyheter Clean up 'Deleted' Rensa 'Borttaget' Purge DB Rensa DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Ta bort poster som är märkta 'borttaget', frÃ¥n databasen Gamla nyheter kan Ã¥teruppstÃ¥ Information Information Clean Up wizard deleted %1 news Upprensningsguiden tog bort %1 nyheter ClickToFlash Object blocked by ClickToFlash Objektet blockerat av ClickToFlash Hide object Dölj objektet Add '%1' to whitelist Lägg till '%1' i vitlistan CustomizeToolbarDialog Customize Main Toolbar Anpassa verktygsraden Customize Feeds Toolbar Anpassa flödesfältets verktyg Customize News Toolbar Anpassa nyhetsfältets verktyg Load images Läs in bilder Separator Separator Icon Ikon Text Text Text Beside Icon Text bredvid ikon Text Under Icon Text under ikon Big Stor Normal Normal Small Liten Style: Stil: Icon Size: Ikonstorlek: Add Lägg till Remove Ta bort Move up Flytta upp Move down Flytta ner Default Standard DownloadItem Remaining time unavailable Ã…terstÃ¥ende tid ej tillgänglig Error: Cannot write to file! Fel: Kan inte skriva till filen Error: Fel: few seconds nÃ¥gra sekunder seconds sekunder minutes minuter hours timma(r) Unknown size Okänd storlek Unknown speed Okänd hastighet %2 - unknown size (%3) %2 - okänd storlek (%3) Remaining %1 - %2 of %3 (%4) Ã…terstÃ¥r %1 - %2 av %3 (%4) Cancelled - %1 Avbrutet - %1 Delete file Ta bort fil Do you want to also delete downloaded file? Vill du ta bort den nedladdade filen ocksÃ¥? Open File Öppna fil Open Folder Öppna mapp Copy Download Link Kopiera nedladdningslänk Cancel Downloading Avbryt nedladdningen Remove Ta bort Cancelled Avbruten Error Fel Not found Hittades ej Sorry, the file %1 was not found! Filen %1 kunde inte hittas! DownloadManager Clear Rensa File %1 (*.%2) Fil %1 (*.%2) All Files (*.*) Alla filer (*.*) Save As... Spara som... Executable: Körbar fil: Arguments: Argument: FeedPropertiesDialog Properties Egenskaper General Allmänt Columns Kolumner Authentication Autentisering Status Status Title: Rubrik: Homepage: Hemsida: Feed URL: Flödets URL: Load Title Läs in rubrik Load Favicon Läs in favikon Select Icon... Välj ikon... Select Icon Vald ikon Disable update Inaktivera uppdatering Automatically update every Uppdatera automatiskt varje seconds sekunder minutes minuter hours timma(r) Starred Stjärnmärkt Load images Läs in bilder Display in new tab on startup Visa i ny flik vid uppstart Show news' description instead of loading web page Visa nyhetsbeskrivning istället för att läsa in webbsidan Automatically delete duplicate news Ta bort nyhetsdubbletter automatiskt Display Visa Reading Läsning Enable JavaScript Aktivera JavaScript Right-to-left layout Höger-till-vänster-layout Ascending Stigande Descending Fallande Sort by: Sortera efter: Add Lägg tillLägg till Remove Ta bort Move up Flytta upp Move down Flytta ner Default Standard Server requires authentication: Servern kräver autentisering: Username: Användarnamn: Password: Lösenord: Feeds count: Antal flöden: Description: Beskrivning: Status: Status: Created: Skapad: Last update: Senast uppdaterad: News count: Antal nyheter: Good Bra Long ago ;-) Länge sedan ;-) new ny unread oläst Image files Bildfiler Select Image Välj bild Load icon: can't open a file! Ikoninläsning: Kan inte öppna en fil! FilterRulesDialog Filter Rules Filtreringsregler Feeds Flöden All Feeds Alla flöden Filter name: Filternamn: Match all news Matcha alla nyheter Match all conditions Matcha alla villkor Match any condition Matcha nÃ¥got villkor Perform these actions: Utför dessa Ã¥tgärder: Please enter name for the filter. Ange ett namn för filtret. Please enter search condition for the news filter. Ange sökvillkor för nyhetsfiltret. FindFeed Find Name Sök namn Find Link Sök länk FindTextContent Find in News Sök i Nyheter Find in Titles Sök bland titlar Find in Authors Sök bland författare Find in Categories Sök i kategorier Find in Descriptions Sök i beskrivningar Find in Links Sök bland länkar Find in Browser Öppna i webbläsare FtpDownloader Canceled! Avbruten! ItemAction Mark News as Read Markera som läst Add Star Lägg till stjärna Delete Ta bort Add Label Lägg till etikett Play a Sound Spela upp ett ljud Show News in Notifier Visa nyheter i meddelande Browse Bläddra Play Spela Add Action Lägg till Ã¥tgärd Delete Action Ta bort Ã¥tgärd Open File... Öppna file... ItemCondition Title Rubrik Description Beskrivning Author Författare Category Kategori State Status Link Länk News Nyheter New Ny Read Läst Starred Stjärnmärkt Add Condition Lägg till villkor Delete Condition Ta bort villkor contains innehÃ¥ller doesn't contains inte innehÃ¥ller is är isn't inte är begins with börjar med ends with slutar med Regular expressions Regular expressions LabelDialog New Label Ny etikett Load icon... Läs in ikon... Default Standard Select color... Välj färg... Name: Namn: Icon: Ikon: Color text: Textfärg: Color background: Bakgrundsfärg: Image files Bildfiler Select Image Välj bild Load icon: can't open a file! Ikoninläsning: Kan inte öppna en fil! MainApplication Saving data... Sparar data... MainWindow &AdBlock &AdBlock Hide Categories Dölj kategorier Show Categories Visa kategorier Select OPML-File Välj OPML-fil OPML-Files (*.%1 *.%2) OPML-filer (*.%1 *.%2) Import canceled Import avbruten Import: can't open a file Import: En fil kan inte öppnas OPML-Files (*.%1) OPML-filer (*.%1) Export canceled Export avbruten Export: can't open a file Export: En fil kan inte öppnas Unread: %1 Oläst: %1 All: %1 Alla: %1 (Browser) (Webbläsare) New News: %1 Nya nyheter: %1 Unread News: %1 Olästa nyheter: %1 &Add &Lägg till Add New Feed Lägg till nytt flöde &Feed... &Flöde... F&older... &Mapp... Add New Folder Lägg till ny mapp Open in New Tab Öppna i ny flik &Delete... &Ta bort... Delete Selected Feed Ta bort markerat flöde &Import Feeds... &Importera flöden... Import Feeds from OPML File Importera flöden frÃ¥n OPML-fil &Export Feeds... &Exportera flöden... Export Feeds to OPML File Exportera flöden till OPML-fil E&xit A&vsluta Update Feed Uppdatera flöde Update Current Feed Uppdatera aktuellt flöde Update All Uppdatera alla Update All Feeds Uppdatera alla flöden Mark All Feeds Read Markera alla flöden som lästa Mark Read/Unread Markera som läst/oläst Mark Current News Read/Unread Markera aktuella nyheter som lästa/olästa Mark All News Read Markera alla nyheter som lästa Downloads Nedladdningar Clean Up... Rensa... News Filters... Nyhetsfilter... Filter News... Filtrera nyheter... Options... Alternativ... Open Options Dialog Öppna inställningar Filter Feeds Filtrera flöden Show All Visa alla Show New Visa nya Show Unread Visa olästa Show Starred Feeds Visa stjärnmärkta flöden Show Not Working Feeds Visa icke fungerande flöden Filter News Filtrera nyheter Show Starred Visa stjärnmärkta Show Not Starred Visa icke stjärnmärkta Show Unread or Starred Visa olästa eller stjärnmärkta Show Last Day Visa senaste dygnet Show Last 7 Days Visa senaste 7 dygnen About... Om... Show 'About' Dialog Visa 'Om' Check for Updates... Sök efter updateringar... Report a Problem... Rapportera ett problem Open News Öppna nyheter Open in Browser Öppna i webbläsare Open in External Browser Öppna i extern webbläsare Open News in External Browser Öppna nyhet i extern webbläsare Open News in New Tab Öppna nyhet i ny flik Open in Background Tab Öppna i bakgrundsflik Open News in Background Tab Öppna nyheter i bakgrundsflik Star Stjärnmärk Mark News Star Stjärnmärk nyhet Delete Ta bort Delete Selected News Ta bort markerade nyheter Delete All News Ta bort alla nyheter Delete All News from List Ta bort alla nyheter frÃ¥n listan Restore Ã…terställ Restore News Ã…terställ nyheter Copy Link Kopiera länk Restore last deleted news Ã…terställ senast borttagna nyheter Mark Read Markera som läst Mark Feed Read Markera flödet som läst Properties Egenskaper &File &Arkiv Count Unread News Antal olästa nyheter Count All News Antal nyheter Last Update Senast uppdaterad Reset browser zoom Ã…terställ zoom-nivÃ¥n i webbläsaren Print Web Page Skriv ut webbsida Preview Web Page Förhandsgranska webbsida Save page in database Spara sidan i databas Save page in database instead of news description Spara sidan i databas istället för nyhetsbeskrivning Confirm Delete Bekräfta borttagning Are you sure to delete selected elements? Vill du verkligen ta bort markerade objekt? Menu Meny Add Feed... Lägg till flöde... &Create Backup... &Skapa säkerhetskopia... S&how Menu Bar Visa &menyfält Stop Update Feeds Stoppa flödesuppdatering Open News Description Öppna nyhetsbeskrivning Copy News Link Kopiera nyhetslänk &View &Visa Fee&ds &Flöden &News &Nyheter &Browser &Webbläsare &Tools V&erktyg &Help &Hjälp Main Toolbar Verktygsrad Customize Toolbar Anpassa verktygsrad Main Toolbar... Verktygsfält... Customize Toolbar... Anpassa verktygsfältet... Feeds Toolbar... Flödesfältets verktyg... News Toolbar... Nyhetsfältets verktyg... Lock Toolbar LÃ¥s verktygsfält Hide Toolbar Dölj verktygsrad Layout Utseende Classic Klassisk Newspaper Dagstidning Application Style Programstil System System System2 System2 Green Grön Orange Orange Purple Purpur Pink Rosa Gray GrÃ¥ Browser Position Webbläsarposition Top Överst Bottom Underst Right Höger Left Vänster Show Window Visa fönster Previous Feed FöregÃ¥ende flöde Next Feed Nästa flöde Previous News FöregÃ¥ende nyhet Next News Nästa nyhet News Page Up Nyhetssida upp News Page Down Nyhetssida ner Next Unread News Nästa olästa nyhet Previous Unread News FöregÃ¥ende olästa nyhet Switch Focus to Next Panel Växla fokus till nästa panel Switch Focus to Next Panel (Tree Feeds, List News, Browser) Växla fokus till nästa panel (Flödesvy, Nyhetslista, Webbläsare) Switch Focus to Previous Panel Växla fokus till föregÃ¥ende panel Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Växla fokus till föregÃ¥ende panel (Flödesvy, Nyhetslista, Webbläsare) Show/Hide Tree Feeds Visa/Dölj flödeslista Minimize to Tray Minimera till meddelandefältet Minimize Application to Tray Minimera programmet till meddelandefältet Columns Kolumner Show Indentation Visa indrag Search Feed Sök flöde Zoom Zoom Zoom In Zooma in Zoom in in browser Zooma in i webbläsare Zoom Out Zooma ut Zoom out in browser Zooma ut i webbläsare 100% 100% Print... Skriv ut... Print Preview... Förhandsgranskning... Page up (Browser) Sida upp (webbläsare) Page down (Browser) Sida ner (webbläsare) Save As... Spara som... Save Page As... Spara sidan som... Show/Hide Visa/Dölj Feeds Toolbar Flödesverktyg News Toolbar Nyhetsverktyg Browser Toolbar Webbläsarverktyg Panel Categories Panelkategorier Status Bar Statusfält Full Screen Helskärmsläge Stay On Top Alltid överst Categories Kategorier Label Etikett Show labels menu Visa etikettmeny Close Tab Stäng flik Close Other Tabs Stäng andra flikar Close All Tabs Stäng alla flikar Switch to next tab Växla till nästa flik Switch to previous tab Växla till föregÃ¥ende flik Unread Oläst Starred Stjärnmärkt Deleted Borttaget Labels Etiketter Decrease news list/increase browser Minska nyhetslista/Utöka webbläsare Increase news list/decrease browser Utöka nyhetslista/Minska webbläsare Find Sök Open Homepage Feed Öppna flödets hemsida Sort by Name Sortera efter namn Collapse All Folders Fäll ihop alla mappar Expand All Folders Expandera alla mappar Next Folder Nästa mapp Previous Folder FöregÃ¥ende mapp Expand Folder Expandera mappen Setting Page: Labels Inställningar: Etiketter Share Dela Sort By Sortera efter Ascending Stigande Descending Fallande Check for updates Sök efter uppdateringar A new version of QuiteRSS... En ny version av QuiteRSS... Loading... Läser in... Web Page Webbsida Save As Spara som HTML-Files (*.%1) HTML-filer (*.%1) Text files (*.%2) Textfiler (*.%2) Save As: can't open a file 'Spara som', kan inte öppna en fil Choose Directory Välj mapp Important Viktigt Work Arbete Personal Personligt To Do Att göra Later Senare Amusingly Roande NetworkManager SSL Certificate Error! SSL-certifikatfel! The "%1" server has the following errors in the SSL certificate: Servern "%1" har följande fel i SSL-certifikatet: <b>Organization: </b> <b>Organisation: </b> <b>Domain Name: </b> <b>Domännamn: </b> <b>Expiration Date: </b> <b>Upphör att gälla: <b>Error: </b> <b>Fel: </b> Would you like to make an exception for this certificate? Vill du göra undantag för detta certifikat? NewsFiltersDialog News Filters Nyhetsfilter Feeds Flöden Filter Name Filternamn New... Nytt... Edit... Redigera... Delete... Ta bort... Move up Flytta upp Move down Flytta ner Run Filter Starta filter Delete Filter Ta bort filter Are you sure you want to delete the filter '%1'? Vill du verkligen ta bort filtret '%1'? NewsHeader Icon Feed Flödesikon Title Rubrik Published Publicerad Received Mottagen Author Författare Category Kategori Read Läst Star Stjärna Label Etikett Feed Title Flödesrubrik Link Länk NewsItem Mark Read/Unread Markera som läst/oläst Delete News Ta bort nyheter NewsTabWidget Loading... (%p%) Läser in... (%p%) Home Hem Open Page in External Browser Öppna sidan i extern webbläsare Open Link in External Browser Öppna länk i extern webbläsare Open Link Öppna länk Open in New Tab Öppna i ny flik Save Link... Spara länk... Save Image... Spara bild... Copy Link Kopiera länk Copy Kopiera Go Back GÃ¥ tillbaka Go Forward GÃ¥ framÃ¥t Stop Stopp Reload Läs in igen Copy Image Kopiera bild Copy Image Address Kopiera bildadress Load Images Läs in bilder Auto Load Images to News View Läs automatiskt in bilder i nyhetsvyn No Load Images Läs inte in bilder No Load Images to News View Läs inte in bilder i nyhetsvyn Close Tab Stäng flik Auto Load Images in News View Läs in bilder i nyhetsvyn automatiskt Don't Load Images Läs inte in bilder Don't Load Images in News View Läs inte in bilder i nyhetsvyn Comments Kommentarer Author: %1 Författare: %1 audio audio video video media media Link to Länk till Mark Read/Unread Markera som läst/oläst Mark News Star Stjärnmärk nyheter Label Etikett Share Dela Open News in External Browser Öppna nyheter i extern webbläsare Delete Ta bort NotificationWidget Close Stäng Mark All News Read Markera alla nyheter som lästa Previous Page FöregÃ¥ende sida Next Page Nästa sida Incoming News: %1 Inkommande nyheter: %1 Page %1 of %2 Sidan %1 av %2 OptionsDialog Options Alternativ General Allmänt System Tray Meddelandefältet Network Connections Nätverksanslutning Browser Webbläsare Feeds Flöden Labels Etiketter Notifications Meddelanden Passwords Lösenord Language SprÃ¥k Fonts & Colors Tecken & färger Keyboard Shortcuts Tangentbordsgenvägar Warning: key is already assigned to Varning! Snabbtangenten används redan av Show splash screen on startup Visa välkomstskärm vid programstart Reopen last opened feeds on startup Öppna senast öppnade flöden vid programstart Open new tab next to active Öppna ny flik närmast aktiv Hide feeds tree when opening tabs Dölj flödesträdet när flikar öppnas Show default rss-icon instead of favourite one Visa standard rss-ikon istället för favikon Automatically collapse folders Fäll ihop mappar automatiskt Show close button on tab Visa stängknapp pÃ¥ flik Automatically check for updates Sök automatiskt efter uppdateringar Help improve QuiteRSS by sending usage information Hjälp till att förbättra QuiteRSS genom att skicka användningsinformation Store a DB in memory (requires program restart) Lagra databas i minnet (kräver omstart av programmet) Save DB stored in memory to file every Spara databas till fil varje minutes minuter Run QuiteRSS at Windows startup Starta QuiteRSS automatiskt vid systemstart Show system tray icon Visa ikon i meddelandefältet starting QuiteRSS QuiteRSS startas minimizing QuiteRSS QuiteRSS minimeras closing QuiteRSS QuiteRSS stängs Show static icon Visa statisk ikon Change icon for incoming new news Ändra ikon vid nya inkommande nyheter Show count of new news Visa antal nya nyheter Show count of unread news Visa antal olästa nyheter Single click instead of double click for show window Öppna programfönstret med enkelklick Empty working set on minimize to tray Töm arbetsminnet vid minimering till meddelandefältet Move to the system tray when: Minimera till meddelandefältet när: Tray icon behavior: Ikonbeteende: Direct connection to the Internet Direktanslutning till Internet System proxy configuration (if available) Använd systemets proxy-inställningar (om tillgängligt) Manual proxy configuration: Manuell proxyinställning: Proxy server: Proxyserver: Port: Port: Username: Användarnamn: Password: Lösenord: Request timeout: Timeout! Number of requests: Antal förfrÃ¥gningar: Number of retries: Antal repetitioner: Options network requests when updating feeds (requires program restart): NätverksförfrÃ¥gningar när flöden uppdateras (kräver omstart av QuiteRSS): Use embedded browser Använd intern webbläsare Use external browser Använd extern webbläsare Default external browser Extern standardwebbläsare Following external browser: Följande extern webbläsare: Browse... Bläddra... Load images Läs in bilder Enable JavaScript Aktivera JavaScript Enable plug-ins Aktivera insticksprogram Open links in embedded browser in background Öppnar länkar i inbäddad webbläsare, i bakgrunden Open links in external browser in background (experimental) Öppna länkar i extern webbläsare, i bakgrunden (experimentell). Default zoom on pages: Standard-zoom pÃ¥ sidor: Browser selection: Webbläsarval: External browser: Extern webbläsare: Content: InnehÃ¥ll: User style sheet: Stilmall: Maximum pages in cache Max antal sidor i cache Store cache in: Lagra cache i: Maximum size of disk cache Maxstorlek för disk-cache MB MB Use disk cache Använd disk-cache Allow local data to be set TillÃ¥t lokal data Keep local data only until quit application BehÃ¥ll lokal data tills programmet avslutas Block sites from setting any data Förhindra lokal data Clear Rensa Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash är ett insticksprogram som blockerar automatisk inläsning av Flash-innehÃ¥ll. Du kan alltid läsa in det manuellt, genom att klicka pÃ¥ Flash-ikonen Use Click to Flash Använd Click To Flash Add... Lägg till... Remove... Ta bort... Ask where to save each file before downloading FrÃ¥ga var filer skall sparas vid nedladdning Download location: Nedladdningsmapp: History Historik Click to Flash Click To Flash Downloads Nedladdningar Automatically update the feeds on startup Uppdatera flöden automatiskt vid programstart Automatically update the feeds every Uppdatera flöden automatiskt efter seconds sekunder hours timma(r) Nothing to do Gör ingenting Dec Dec December Dec Display format for date: Datumformat: time: tid: Alternating row background colors Växlande bakgrundsfärg pÃ¥ rader Simplified representation of date and time Förenklad visning av datum och tid Show All Visa alla Show New Visa nya Show Unread Visa olästa Show Starred Visa stjärnmärkta Show Not Starred Visa icke stjärnmärkta Show Unread or Starred Visa olästa eller stjärnmärkta Show Last Day Visa sensate dagen Show Last 7 Days Visa 7 senaste dagarna Style sheet for news: Formatmall för nyheter Mark news as read: Markera nyhet som läst: on selecting. With timeout Vid läsning. Med tidsfördröjning. after switching to another news Vid byte till nästa nyhet Mark displayed news as read when switching feeds Markera nyheter som lästa vid byte till annat flöde Mark displayed news as read when closing tab Markera nyheter som lästa vid flikstängning Mark displayed news as read on minimize Markera nyheter som lästa vid minimering Change behavior of action 'Next Unread News' Ändra beteende för Ã¥tgärden 'Nästa olästa nyhet' starred news Stjärnmärkta nyheter labeled news Etiketterade nyheter Automatically mark identical news as read Märk automatiskt identiska nyheter som lästa Prevent accidental deletion of: Förhindra oavsiktlig borttagning av: Enable cleanup on shutdown Aktivera rensning vid avslut Maximum age of news in days to keep: Max antal dagar att spara nyheter: Maximum number of news to keep: Max antal nyheter som sparas: Delete read news Ta bort lästa nyheter Never delete unread news Ta aldrig bort olästa nyheter Never delete starred news Ta aldrig bort stjärnmärkta nyheter Never delete labeled news Ta aldrig bort etiketterade nyheter Clean up 'Deleted' Rensa 'Borttaget' Enable DB optimization (slower shutdown) Aktivera databasoptimering (lÃ¥ngsammare avslut) Reading Läsning Clean Up Rensning New... Nytt... Edit... Redigera... Delete... Ta bort... Move up Flytta upp Move down Flytta ner Show when inactive main window Visa vid inaktivt huvudfönster Screen Skärm Transparency Transparens Show titles feeds Visa flödesrubrik Show icon feed Visa flödesikon Show button 'Mark All News Read' Visa 'Markera alla nyheter som lästa' Show button 'Mark Read/Unread' Visa 'Markera som läst/oläst' Show button 'Open in External Browser' Visa 'Öppna i extern webbläsare' Show button 'Delete News' Visa 'Ta bort nyheter' Play sound for incoming new news Spela upp ljud vid nya inkommande nyheter Play Spela Display notification for incoming news Visa meddelande för inkommande nyheter Top Left Överst till vänster Top Right Överst till höger Bottom Left Nederst till vänster Bottom Right Nederst till höger Review Utvärdera Position Position Show maximum of Visa maximalt item on page notification objekt i sidmeddelande Width list items Objektlistans bredd pixels pixel Close notification after Stäng meddelanden efter Do not show notification in fullscreen mode Visa inte meddelanden i helskärmsläge Display Visa Action mouse on news opening: MusÃ¥tgärd vid nyhetsöppning: Single Click: Enkelklick: Double Click: Dubbelklick: Middle Click: Mittenklick: Only show selected feeds: Visa endast markerade flöden: Notification Meddelande Sound Ljud Selection of feeds Flödeslista All Feeds Alla flöden Site Sida User Användare Password Lösenord Delete Ta bort Delete All Ta bort alla Show Passwords Visa lösenord Version Version Author Översättare Contact Kontakt Choose language: Välj sprÃ¥k: Type Typ Font Teckensnitt Feeds list font Flödeslista News list font Nyhetslista News title font Teckensnitt för nyhetsrubrik News text font Teckensnitt för nyhetstext Notification font Teckensnitt för meddelanden Change... Ändra... Reset Ã…terställ Feeds list color Färg i flödeslistan Feeds list background Flödeslistans bakgrund News list color Färg i nyhetslistan News list background Nyhetslistans bakgrund Focused news color Färg för fokuserad nyhet Focused news background color Bakgrund för fokuserad nyhet Link color Länkfärg Title color Rubrikfärg Date color Datumfärg Author color Författarfärg News text color Textfärg för nyheter News title background Rubrikbakgrund News background Nyhetsbakgrund Feed with new news Flöden med nya nyheter Count of unread news in feeds tree Antal olästa nyheter i flödeslistan Disabled feed Inaktivera flöde Alternating row colors Växlande radfärger Notification text color Textfärg för meddelanden Notification background color Bakgrundsfärg för meddelanden Auto load images in news view Läs in bilder automatiskt i nyhetsvyn Text color of new news Textfärg för nyheter Show feeds tree toggle Visa flödesträdsväxlare Clear new status when minimize to tray Nollställ 'nya' vid minimering till meddelandefältet Set focus on the last opened news Fokusera senast öppnade nyhet Set focus at the top of news list Fokusera första objektet i nyhetslistan Set focus on the unread news Fokusera olästa nyheter Open the news Öppna nyheter Default news filter: Primärt nyhetsfilter: Action on feed opening: Ã…tgärd vid öppning av flöde: Show news description instead of loading web page Visa nyhetsbeskrivning istället för att läsa in webbsidan Text color of unread news Textfärg för olästa nyheter Focused feed color Färg för flödet i fokus Focused feed background color Bakgrundsfärg för flödet i fokus Standard Standard Fixed LÃ¥st Serif Serif Sans Serif Sans Serif Cursive Kursiv Fantasy Fantasy Default font size Standard teckenstorlek Fixed font size LÃ¥st teckenstorlek Minimum font size Minstateckenstorlek Minimum logical font size Minsta logiska teckenstorlek Font families: Teckensnittsgrupper: Font sizes: Teckenstorlekar: Fonts Teckensnitt Fonts Browser Teckenhanterare Colors Färger Filter Filter Action Ã…tgärd Description Beskrivning Shortcut Genväg Shortcut: Genväg: Open File... Öppna fil... Select Style Sheet File Välj stilmall Open Directory... Öppna mÃ¥lmapp... Add site to whitelist Lägg till sida i vitlista Site without 'http://' (ex. youtube.com) Sidadress utan 'http://' (ex. youtube.com) QAbstractSpinBox &Step up &Upp ett steg Step &down &Ner ett steg &Select All &Markera alla QDialogButtonBox Close Stäng Cancel Avbryt &Yes &Ja &No &Nej QFtp Not connected Ej ansluten Host %1 not found %1 kan inte hittas Connection refused to host %1 Anslutning nekad till %1 Connection timed out to host %1 Anslutningen överskred tidsgränsen %1 Connected to host %1 Ansluten till %1 Connection refused for data connection Anslutning nekad Unknown error Okänt fel Connecting to host failed: %1 Kunde inte ansluta: %1 Login failed: %1 Kunde inte logga in: %1 Listing directory failed: %1 Kunde inte läsa in mappar: %1 Changing directory failed: %1 Kunde inte byta mapp: %1 Downloading file failed: %1 Kunde inte ladda ner: %1 Uploading file failed: %1 Kunde inte ladda upp: %1 Removing file failed: %1 Kunde inte ta bort filen: %1 Creating directory failed: %1 Kunde inta skapa mappen: %1 Removing directory failed: %1 Kunde inte ta bort mappen: %1 Connection closed Anslutningen stängd QLineEdit &Undo &Ã…ngra &Redo &Upprepa Cu&t K&lipp ut &Copy &Kopiera &Paste Klistra &in Delete Ta bort Select All Markera alla QMultiInputContext Select IM Välj IM QObject Cannot start external program Kan inte starta externt program Cannot start external program! %1 Kan inte starta externt program! %1 Error Fel QTextControl &Undo &Ã…ngra &Redo &Upprepa Cu&t K&lipp ut &Copy &Kopiera &Paste Klistra &in Delete Ta bort Select All Markera alla Copy &Link Location K&opiera länk QWizard Cancel Avbryt < &Back < &Tillbaka &Finish &Slutför &Next > &Nästa > RSSDetectionWidget Untitled feed Namnlöst flöde RequestFeed Server requires authentication! Servern kräver autentisering! Server replied: Not Found! Servern svarade: Kan inte hittas! Redirect error! Omdirigeringsfel! Request timeout! FörfrÃ¥gnings-timeout! SQLiteDriver Error opening database Kan inte öppna databas Error closing database Kan inte stänga databas Unable to begin transaction Kan inte pÃ¥börja transaktion Unable to commit transaction Kan inte utföra transaktionen Unable to rollback transaction Kan inte rulla tillbaka transaktionen SQLiteResult Unable to fetch row Kan inte hämta rad No query Ingen frÃ¥ga Unable to execute statement Kan inte utföra uppgiften Unable to execute multiple statements at a time Kan inte utföra flera uppgifter samtidigt Unable to reset statement Kan inte Ã¥terställa Ã¥tgärden Unable to bind parameters Kan inte binda parametrar Parameter count mismatch Antalet parametrar stämmer inte SslErrorDialog SSL Certificate Error! SSL-certifikatfel! Only for this session Endast för den här sessionen UpdateAppDialog Check for Updates Sök efter uppdateringar Checking for updates... Söker efter uppdateringar... Loading history... Läser in historik... Don't remind about this version Hoppa över denna version &Install &Installera You already have the latest version Du har redan senaste versionen A new version of QuiteRSS is available! En ny version av QuiteRSS finns tillgänglig! Click here to go to the download page Klicka här för att komma till nedladdningssidan Your version is: Din version är: Current version is: Aktuell version: Error checking updates Fel vid uppdateringskontroll quiterss-0.18.3/lang/quiterss_tg_TJ.ts000066400000000000000000006013661265173051100177360ustar00rootroot00000000000000 AboutDialog About Оиди замима Revision Ð ÐµÐ²Ð¸Ð·Ð¸Ñ Version Ðашр QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS замимаи кроÑÑ-платформавии хондани RSS/Atom таÑмаи хабарҳо бо коди кушод Includes: Дарбар мегирад: Application directory: Суроғаи замима: Resource directory: Суроғаи манбаъ: Data directory: Суроғаи маълумот: Backup directory: Суроғаи захиравӣ: Database file: Суроғаи БМ: Settings file: Файли танзимот: Log file: Файли қайдҳо Authors Муаллифон History Таърих License ЛитÑÐµÐ½Ð·Ð¸Ñ Information Маълумот AdBlockAddSubscriptionDialog Add Subscription Иловаи обуна Title: Сарлавҳа: Address: Суроға: Add new subscription to AdBlock: Иловаи обунаи нав ба AdBlock: AdBlockCustomList Custom Rules Қоида шахÑÓ£ AdBlockDialog AdBlock Configuration Танзимоти AdBlock Enable AdBlock Фаъол гардонидани AdBlock Search... ҶуÑтуҷӯ... Options Танзимот AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Танҳо қиÑмҳои талабшударо аз EasyList иÑтифода баред (барои зудкории хуб) Add Rule Иловаи қоида Remove Rule Хориҷи қоида Add Subscription Иловаи обуна Remove Subscription Хориҷи обуна Update Subscriptions Ðзнавкунии обунаҳо Learn about writing rules... Хондан ниÑбати навиштани қоидаҳо... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock имкониÑти маҳдудкунии мӯҳтавои нохондаро дар Ñаҳифаҳо фароҳам меоварад AdBlock AdBlock Show AdBlock &Settings Ðишондоди &танзимоти AdBlock Disable on %1 Хомӯш дар %1 Disable only on this page Хомӯш танҳо дар Ñаҳифаи зерин Blocked Popup Windows Маҳдудкунии равзанаҳои нохонда %1 with (%2) %1 бо (%2) No content blocked Маҳдуд накардани мӯҳтаво Blocked URL (AdBlock Rule) - click to edit rule URL-ҳои маҳдудшуда(Қоидаҳои Adblock) - барои таҳрири қоида пахш кунед AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Обуна бор нашуд! AdBlockTreeWidget Add Rule Иловаи қоида Remove Rule Хориҷи қоида Add Custom Rule Иловаи қоидаи шахÑи Please write your rule here: Қоидаи худро дар инҷо навиÑед: %1 (recently updated) %1 (азнавшуда) %1 (Error: %2) %1 (Хатогӣ: %2) AddFeedWizard Add Feed Иловаи таÑма Create New Feed Эъҷоди таÑмаи нав Use title of the feed as displayed name ИÑтифодаи Ñарлавҳаи таÑма ҳамчун номи нишондода мешуда Server requires authentication: Сервер авторизатÑиÑро талаб мекунад: Username: Ðоми иÑтифодабаранда: Password: Парол: Feed URL or website address: URL-и таÑма Ñ‘ Ñуроғаи веб-Ñомона Feeds ТаÑмаҳо All Feeds Ҳамаи таÑмаҳо New Folder... Папкаи нав... Displayed name: Ðоми намоиш мешуда: Location: Мавқеъ: URL error! Хатогии URL! Duplicate feed! Такрори таÑма! Can't find feed URL! URL-и таÑма дарёфт нашуд! Request failed! ДархоÑÑ‚ иҷро нагардид! AddFolderDialog Add Folder Иловаи папка Feeds ТаÑмаҳо All Feeds Ҳамаи таÑмаҳо Name: Ðом: Location: Мавкеъ: AuthenticationDialog Save password Сабти парол Authorization required ÐвторизатÑÐ¸Ñ Ñ‚Ð°Ð»Ð°Ð± мешавад Server: Сервер: Message: Хабар: Username: Ðоми иÑтифодабаранда: Password: Парол: CategoriesTreeWidget Unread Ðахонда Starred Қайдшуда Deleted Хориҷшуда Labels Ðишонаҳо Open in New Tab Кушодан дар варақаи нав Clear 'Deleted' Тоза кардани 'Хориҷшуда' Mark Read Қайд ҳамчун хондашуда CleanUpWizard Clean Up Тоза кардан Choose Feeds ТаÑмаҳоро интихоб кунед All Feeds Ҳамаи таÑмаҳо Clean Up Options Тоза кардани танзимот Maximum age of news in days to keep: Синни мунтаҳои хабарҳои Ñабт мешуда дар рӯз: Maximum number of news to keep: Миқдори мунтаҳои хабарҳои Ñабт мешуда: Delete read news Хориҷи хабари хондашуда Never delete unread news Ҳеҷ гоҳ хориҷ накардани хабарҳои хонданашуда Never delete starred news Ҳеҷ гоҳ хориҷ накардани хабарҳои бо Ñиторача қайдшуда Never delete labeled news Ҳеҷ гоҳ хориҷ накардани хабарҳои нишонашуда Clean up 'Deleted' Тоза кардани 'Хориҷшуда' Purge DB Тоза кардани ММ Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Ба пуррагӣ хориҷ кардани ҳиÑоботҳое, ки ҳамҷун хориҷшуда дар ММ қайд шудаанд. Хабарҳои кӯҳнашуда боз пайдо шуда метавониÑтанд Information Маълумот Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash Обект аз тарафи ClickToFlash муҳоÑира шуд Hide object Пинҳони обект Add '%1' to whitelist Илова кардани '%1' ба рӯйхати Ñафед CustomizeToolbarDialog Customize Main Toolbar Танзими панели аÑоÑÓ£ Customize Feeds Toolbar Танзими панели таÑмаҳо Customize News Toolbar Танзими панели хабарҳо Load images Гирифтори таÑвирҳо Separator ТақÑимкунанда Icon ТаÑвир Text Матн Text Beside Icon Матн назди таÑвир Text Under Icon Матн дар поёни таÑвир Big Бузург Normal Муқаррарӣ Small Хурд Style: УÑлуб: Icon Size: Хаҷми таÑвир: Add Илова Remove Хориҷ Move up Ба боло Move down Ба поён Default Пешфарз DownloadItem Remaining time unavailable Вақти боқимонда номаълум аÑÑ‚ Error: Cannot write to file! Хатогӣ: Сабт ба файл имконнопазир аÑÑ‚ Error: Хатогӣ: few seconds Ñкчанд ÑÐ¾Ð½Ð¸Ñ seconds ÑÐ¾Ð½Ð¸Ñ minutes дақиқа hours Ñоат Unknown size Ҳаҷми номуайÑн Unknown speed Суръати номуайÑн %2 - unknown size (%3) %2 - ҳаҷми номуайÑн (%3) Remaining %1 - %2 of %3 (%4) Боқи монд %1 - %2 аз %3 (%4) Cancelled - %1 Рафъ шуд - %1 Delete file Хориҷи файл Do you want to also delete downloaded file? Open File Кушодани файл Open Folder Кушодани папка Copy Download Link ÐуÑхабардории Ñуроғаи гирифтор Cancel Downloading Рафъи гирифтор Remove Хориҷ Cancelled Рафъ шуда Error Хатогӣ Not found Дарёфт нагардид Sorry, the file %1 was not found! Мебахшед, файли %1 дарёфт нагардид! DownloadManager Clear Тоза кардан File %1 (*.%2) Файл %1 (*.%2) All Files (*.*) Ҳамаи файлҳо (*.*) Save As... Сабт ҳамчун... Executable: Фаъол: Arguments: Далелҳо: FeedPropertiesDialog Properties ХоÑиÑтҳо General Умимӣ Columns Сутунҳо Authentication ÐвторизатÑÐ¸Ñ Status Ҳолат Title: Сарлавҳа: Homepage: Саҳифаи аÑоÑÓ£: Feed URL: URL-и таÑма: Load Title Гирифтори Ñарлавҳа Load Favicon Гирифтори таÑвир Select Icon... Интихоби таÑвир... Select Icon ТаÑвирро интихоб кунед Disable update Бекоркунии азнавкуни Automatically update every Ðвтоматӣ азнавкунӣ ҳар seconds ÑÐ¾Ð½Ð¸Ñ minutes дақиқа hours Соат Starred Интихобшуда Load images Гирифтори таÑвирҳо Display in new tab on startup Ðишондод дар Ñаҳифаи нав ҳангоми оғоз Show news' description instead of loading web page Ðишондоди тавÑифи хабар бар замми боркунии веб-Ñаҳифа Automatically delete duplicate news Ба таври автоматӣ хориҷ кардани хабарҳои такрорӣ Display Ðамоиш Reading Enable JavaScript ВаÑли JavaScript Right-to-left layout Ðз роÑÑ‚ ба чап Ascending Ðфзоиш Descending Камшавӣ Sort by: Яккачин аз рӯи: Add Илова Remove Хориҷ Move up Ба боло Move down Ба поён Default Пешфарз Server requires authentication: Сервер авторизатÑиÑро талаб мекунад: Username: Ðоми иÑтифодабаранда: Password: Парол: Feeds count: Description: ТавÑиф: Status: Ҳолат: Created: Эъҷод шудааÑÑ‚: Last update: Охирон тағйирдиҳӣ: News count: Миқдори хабарҳо: Good Хуб Long ago ;-) Ким-кай ;-) new нав unread нахонда Image files Файлҳои таÑвир Select Image ТаÑвирро интихоб кунед Load icon: can't open a file! Гирифтори таÑвир: файл кушода нашуд! FilterRulesDialog Filter Rules Қоидаҳои филтронӣ Feeds ТаÑмаҳо All Feeds Ҳамаи таÑмаҳо Filter name: Ðоми филтр: Match all news Ба ҳамаи хабарҳо мувофиқ Match all conditions Ба ҳама шартҳо мувофиқ Match any condition Ба Ñгон шарт мувофиқ Perform these actions: Ðмалҳои зеринро иҷро кард: Please enter name for the filter. Марҳамат номи филтрро дохил кунед. Please enter search condition for the news filter. Шартҳои филтрро барои ҷуÑтуҷӯи хабарҳо дохил кунед. FindFeed Find Name ҶуÑтуҷӯи ном Find Link ҶуÑтуҷӯи линк FindTextContent Find in News ҶуÑтуҷӯ дар хабарҳо Find in Titles ҶуÑтуҷӯ дар Ñарлавҳаҳо Find in Authors ҶуÑтуҷӯ дар муаллиффон Find in Categories ҶуÑтуҷӯ дар зумраҳо Find in Descriptions Find in Links Пайдо дар Пайвандҳо Find in Browser ҶуÑтуҷӯ дар браузер FtpDownloader Canceled! Рафъ шуд! ItemAction Mark News as Read Қайд ҳамчун хондашуда Add Star Қайд бо Ñиторача Delete Хориҷ Add Label Иловаи нишон Play a Sound Пахши Ñадо Show News in Notifier Ðишондоди хабарҳо дар огоҳӣ Browse Чашмандоз Play Пахш Add Action Иловаи амал Delete Action Хориҷи амал Open File... Кушодани файл... ItemCondition Title Сарлавҳа Description ТавÑиф Author Муаллиф Category Зумра State Ҳолат Link Линк News Хабарҳо New Ðав Read Хондашуда Starred Бо Ñиторача қайд шудааÑÑ‚ Add Condition Иловаи шарт Delete Condition Хориҷи шарт contains мӯҳтаво doesn't contains мӯҳтаво надорад is мувофиқ бо isn't номувофиқ бо begins with Ñар мешавад бо ends with итмом мешавад бо Regular expressions Ифодаҳои регулÑÑ€Ó£ LabelDialog New Label Ðишони нав Load icon... Гирифтори таÑвир... Default Пешфарз Select color... Интихоби ранг... Name: Ðом: Icon: ТаÑвир: Color text: Ранги матн: Color background: Ранги фон: Image files Файли таÑвир Select Image Интихоби таÑвир Load icon: can't open a file! Гирифтори таÑвир: файл кушода нашуд! MainApplication Saving data... Сабти маълумот... MainWindow &AdBlock &AdBlock Hide Categories Пинҳони зумраҳо Show Categories Ðишондоди зумраҳо Select OPML-File OPML-Файлро интихоб кунед OPML-Files (*.%1 *.%2) OPML-Файлҳо (*.%1 *.%2) Import canceled Рафъи воридот Import: can't open a file Воридот: файл кушода нашуд OPML-Files (*.%1) OPML-Файлҳо (*.%1) Export canceled Рафъи Ñодирот Export: can't open a file Содирот: файл кушода нашуд Unread: %1 Ðахонда: %1 All: %1 Ҳамагӣ: %1 (Browser) (Браузер) New News: %1 Хабарҳои нав: %1 Unread News: %1 Хабарҳои нахонда: %1 &Add &Илова Add New Feed Иловаи таÑмаи нав &Feed... &ТаÑма... F&older... &Папка... Add New Folder Иловаи папкаи нав Open in New Tab Кушодан дар варақаи нав &Delete... &Хориҷ... Delete Selected Feed Хориҷи таÑмаи интихобшуда &Import Feeds... &Воридоти таÑмаҳо... Import Feeds from OPML File Воридоти таÑмаҳо аз OPML файл &Export Feeds... &Содироти таÑмаҳо... Export Feeds to OPML File Содироти таÑмаҳо аз OPML файл E&xit &Баромад Update Feed Ðзнавкунии таÑма Update Current Feed Ðзнавкунии таÑмаи ҷорӣ Update All Ðзнавкунии ҳама Update All Feeds Ðзнавкунии ҳамаи таÑмаҳо Mark All Feeds Read Қайди ҳамаи таÑмаҳо ҳамчун хондашуда Mark Read/Unread Қайд ҳамчун хондашуда/хонданашуда Mark Current News Read/Unread Қайди хабари ҷорӣ ҳамчун хондашуда/хонданашуда Mark All News Read Қайди ҳамаи хабарҳо ҳамчун хондашуда Downloads Гирифторҳо Clean Up... Тоза кардан... News Filters... Филтри хабарҳо... Filter News... Филтри хабарҳо... Options... Танзимот... Open Options Dialog Кушодани равзанаи танзимот Filter Feeds Филтри таÑмаҳо Show All Ðишондоди ҳама Show New Ðишондоди нав Show Unread Ðишондоди нахонда Show Starred Feeds Ðишондоди таÑмаҳои интихобшуда Show Not Working Feeds Ðишондоди таÑмаҳои бекор Filter News Филтри хабарҳо Show Starred Ðишондоди бо Ñиторача қайд шуда Show Not Starred Ðишондоди қайд нашуда Show Unread or Starred Ðишондоди нахонда Ñ‘ бо Ñиторача Show Last Day Ðишондод барои рӯзи гузашта Show Last 7 Days Ðишондод барои 7 рӯзи гузашта About... Оиди замима... Show 'About' Dialog Ðишондоди равзанаи 'Оиди замима' Check for Updates... Тафтиши навовариҳо... Report a Problem... ҲиÑобот оиди хатогиҳо... Open News Кушодани хабар Open in Browser Кушодан дар браузер Open in External Browser Кушодан дар браузери берунӣ Open News in External Browser Кушодани хабар дар браузери беруна Open News in New Tab Кушодани хабар дар варақаи нав Open in Background Tab Кушодан дар варақаи фонӣ Open News in Background Tab Кушодани хабар дар варақаи фонӣ Star Ситорача Mark News Star Қайди хабар бо Ñиторача Delete Хориҷ Delete Selected News Хориҷи хабари интихобшуда Delete All News Хориҷи ҳамаи хабарҳо Delete All News from List Хориҷи ҳамаи хабарҳо аз рӯйхат Restore Барқароркунӣ Restore News Барқароркунии хабар Copy Link ÐуÑхабардории Ñуроғаи линк Restore last deleted news Барқароркунии охирон хабари хориҷшуда Mark Read Қайд ҳамчун хондашуда Mark Feed Read Қайди таÑма ҳамчун хондашуда Properties ХоÑиÑтҳо &File &Файл Count Unread News Миқдори хабарҳои нахонда Count All News Миқдори ҳамаи хабарҳо Last Update Охирон азнавкунӣ Reset browser zoom Партофтани Ð¼Ð¸Ò›Ñ‘Ñ Ð´Ð°Ñ€ браузер Print Web Page Чопи веб-Ñаҳифа Preview Web Page Ðз назар гузаронии веб-Ñаҳифа Save page in database Сабти Ñаҳифа дар ММ Save page in database instead of news description Сабти Ñаҳифа да ММ бар замми тавÑифи хабарҳо Confirm Delete ТаÑдиқи хориҷкунӣ Are you sure to delete selected elements? Шумо дар воқеъ мехоҳед Ñлементҳои интихоб шударо хориҷ кунед? Menu Меню Add Feed... Иловаи таÑма &Create Backup... Захиракунӣ S&how Menu Bar Ð&ишондоди Ñатри меню Stop Update Feeds Open News Description Кушодани тавÑифи хабар Copy News Link ÐуÑхабардории Ñуроғаи линки хабар &View &Ðамуд Fee&ds ТаÑ&маҳо &News &Хабарҳо &Browser &Браузер &Tools &ÐÑбобҳо &Help &Кӯмак Main Toolbar Панели аÑоÑÓ£ Customize Toolbar Танзими панели аÑбобҳо Main Toolbar... Панели аÑоÑÓ£... Customize Toolbar... Танзими панели аÑбобҳо... Feeds Toolbar... Панели таÑмаҳо... News Toolbar... Панели хабарҳо... Lock Toolbar МуÑтаҳкам кардани панели аÑбобҳо Hide Toolbar Пинҳони панели аÑбобҳо Layout Тарҳбанди Classic КлаÑÑик Newspaper Рӯзнома Application Style УÑлуби замима System СиÑтемавӣ System2 СиÑтемавӣ 2 Green Сабз Orange Ðоранҷӣ Purple Бунафш Pink Гулдор Gray ХокиÑтарӣ Browser Position Мавқеъи браузер Top Дар боло Bottom Дар поён Right Ðз роÑÑ‚ Left Ðз чап Show Window Ðишондоди равзана Previous Feed ТаÑмаи пешгузашта Next Feed ТаÑмаи оÑнда Previous News Хабари пешгузашта Next News Хабари оÑнда News Page Up Саҳифаи ахборот боло News Page Down Саҳифаи ахборот поён Next Unread News Хабари оÑндаи нахонда Previous Unread News Хабари пешгузаштаи нахонда Switch Focus to Next Panel Гузариш ба панели оÑнда Switch Focus to Next Panel (Tree Feeds, List News, Browser) Гузариш ба панели оÑнда (Дарахти таÑмахо, рӯйхати хабарҳо, браузер) Switch Focus to Previous Panel Гузариш ба панели пешгузашта Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Гузариш ба панели пешгузашта (Дарахти таÑмахо, рӯйхати хабарҳо, браузер) Show/Hide Tree Feeds Ðишондод/Пинҳони дарахти таÑмаҳо Minimize to Tray МинимизатÑÐ¸Ñ Ð±Ð° трей Minimize Application to Tray МинимизатÑиÑи замима ба трей Columns Сутунҳо Show Indentation Ðишондоди фоÑила Search Feed ҶуÑтуҷӯи таÑма Zoom ÐœÐ¸Ò›Ñ‘Ñ Zoom In Калонкунӣ Zoom in in browser Калонкунии Ð¼Ð¸Ò›Ñ‘Ñ Ð´Ð°Ñ€ браузер Zoom Out Хурдкунӣ Zoom out in browser Хурдкунии Ð¼Ð¸Ò›Ñ‘Ñ Ð´Ð°Ñ€ браузер 100% 100% Print... Чоп... Print Preview... Ðз назар гузаронии пеш аз чоп... Page up (Browser) Саҳифа боло (Браузер) Page down (Browser) Саҳифа поён (Браузер) Save As... Сабт ҳамчун... Save Page As... Сабти Ñаҳифа ҳамчун... Show/Hide Ðишондод/Пинҳон Feeds Toolbar Панели таÑмаҳо News Toolbar Панели рӯйхати ахборот Browser Toolbar Панели браузер Panel Categories Панели зумраҳо Status Bar Сатри ҳолат Full Screen Ба тамоми Ñкран Stay On Top Ðз болои ҳамаи равзанаҳо Categories Зумраҳо Label Ðишона Show labels menu Ðишондоди менюи нишонҳо Close Tab Пӯшидани варақа Close Other Tabs Пӯшидани дигар варақаҳо Close All Tabs Пӯшидани ҳамаи варақаҳо Switch to next tab Гузариш ба Ñаҳифаи оÑнда Switch to previous tab Гузариш ба Ñаҳифаи пешгузашта Unread Ðахонда Starred Қайдшуда Deleted Хориҷшуда Labels Ðишонаҳо Decrease news list/increase browser Хурдкунии рӯйхати ахборот/калон кардани браузер Increase news list/decrease browser Калонкунии рӯйхати ахборот/хурд кардани браузер Find ҶуÑтуҷӯ Open Homepage Feed Кушодани Ñомонаи таÑма Sort by Name Яккачин аз рӯи ном Collapse All Folders Печонидани ҳамаи папкаҳо Expand All Folders Паҳни ҳамаи папкаҳо Next Folder Папкаи оÑнда Previous Folder Папкаи пешгузашта Expand Folder Паҳни папка Setting Page: Labels Саҳифаи танзимот: нишонҳо Share Ба ҳам дидан Sort By Яккачин аз рӯи Ascending Ðфзоиш Descending Камшавӣ Check for updates Тафтиши навовариҳо A new version of QuiteRSS... Ðашри нави QuiteRSS... Loading... Гирифтор... Web Page Веб-Ñаҳифа Save As Сабт ҳамчун HTML-Files (*.%1) HTML-файлҳо (*.%1) Text files (*.%2) Файлҳои матнӣ (*.%2) Save As: can't open a file Сабт ҳамчун: файл кушода нашуд Choose Directory Интихоби каталог Important Муҳим Work Кор Personal ШахÑÓ£ To Do БоÑд кард Later Баъдтар Amusingly Шавқовар NetworkManager SSL Certificate Error! Хатогии Сертификати SSL! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <B> Созмони: </ b> <b>Domain Name: </b> <B> Ðоми Домен: </ b> <b>Expiration Date: </b> <b>Муҳлати Тамомшави: </b> <b>Error: </b> <B> Хато: </ b> Would you like to make an exception for this certificate? Оё шумо мехоҳед ин Ñертификатро иÑтиÑно кунед? NewsFiltersDialog News Filters Филтри хабарҳо Feeds ТаÑмаҳо Filter Name Ðоми филтр New... Эъҷод... Edit... Таҳрир... Delete... Хориҷ... Move up Ба боло Move down Ба поён Run Filter Коркарди филтр Delete Filter Хориҷи филтр Are you sure you want to delete the filter '%1'? Шумо дар воқеъ мехоҳед филтри '%1'-ро хориҷ кунед? NewsHeader Icon Feed ТаÑвири таÑма Title Сарлавҳа Published Ðашр шудааÑÑ‚ Received Қабул шудааÑÑ‚ Author Муаллиф Category Зумра Read Хондашуда Star Ситорача Label Ðишон Feed Title Сарлавҳаи таÑма Link Линк NewsItem Mark Read/Unread Қайд ҳамчун хондашуда/хонданашуда Delete News Хориҷи хабарҳо NewsTabWidget Loading... (%p%) Гирифтор... (%p%) Home Саҳифаи аввал Open Page in External Browser Кушодани Ñаҳифа дар браузери беруна Open Link in External Browser Кушодани линк дар браузери беруна Open Link Кушодани линк Open in New Tab Кушодан дар варақаи нав Save Link... Сабт аз линк ҳамчун... Save Image... Сабти таÑвир... Copy Link ÐуÑхабардории Ñуроғаи линк Copy ÐуÑхагирӣ Go Back Ба қафо Go Forward Ба пеш Stop Манъ Reload Ðзнавкунӣ Copy Image ÐуÑхагирии таÑвир Copy Image Address ÐуÑхагирии Ñуроғаи таÑвир Load Images Гирифтори таÑвирҳо Auto Load Images to News View Боркунии автоматии таÑвирҳо No Load Images Бор накардани таÑвирҳо No Load Images to News View Бор накардани таÑвирҳо ба намоиши хабарҳо Close Tab Пӯшидани варақа Auto Load Images in News View Боркунии автоматии таÑвирҳо Don't Load Images Бор накардани таÑвирҳо Don't Load Images in News View Бор накардани таÑвирҳо Comments Шарҳҳо Author: %1 Муаллиф: %1 audio аудио video видео media медиа Link to Линк ба Mark Read/Unread Қайд ҳамчун хондашуда/хонданашуда Mark News Star Қайди хабар бо Ñиторача Label Ðишона Share Ба ҳам дидан Open News in External Browser Кушодани хабар дар браузери беруна Delete Хориҷ NotificationWidget Close Пӯшидан Mark All News Read Қайди ҳамаи хабарҳо ҳамчун хондашуда Previous Page Саҳифаи гузашта Next Page Саҳифаи оÑнда Incoming News: %1 Хабарҳои воридшуда: %1 Page %1 of %2 Саҳифаи %1 аз %2 OptionsDialog Options Танзимот General Умимӣ System Tray Трейи ÑиÑтемавӣ Network Connections ПайваÑтаҳои шабакавӣ Browser Браузер Feeds ТаÑмаҳо Labels Ðишонаҳо Notifications Огоҳиҳо Passwords Паролҳо Language Забон Fonts & Colors Ҳуруф ва рангҳо Keyboard Shortcuts МухтаÑарҳои тугмавӣ Warning: key is already assigned to Таваҷҷӯҳ: тугма муайÑн шудааÑÑ‚ ба Show splash screen on startup Ðишондоди лавҳа ҳангоми оғоз Reopen last opened feeds on startup Такроран кушодани охирон таÑма ҳангоми даъвати барнома Open new tab next to active Кушодани варақаи нав ҳамчун фаъол Hide feeds tree when opening tabs Пинҳони дарахти таÑмаҳо ҳангоми кушодани Ñаҳифаи нав Show default rss-icon instead of favourite one Ðишондоди таÑвири муқаррарӣ барои таÑмаҳо Automatically collapse folders Ðвтоматӣ печонидани папкаҳо Show close button on tab Ðишондоди тугмаи пӯшидашавӣ дар замима Automatically check for updates Ðвтоматӣ тафтиши навовариҳо Help improve QuiteRSS by sending usage information Кӯмак барои беҳтар намудани QuiteRSS бо ирÑоли омори иÑтифодабарӣ Store a DB in memory (requires program restart) Ðигоҳдошти ММ дар хотира (азнавкушодани барнома лозим аÑÑ‚) Save DB stored in memory to file every Сабти ММ аз хотира ба файл ҳар minutes дақиқа Run QuiteRSS at Windows startup Оғози QuiteRSS дар ибтидои кори Windows Show system tray icon Ðишондоди таÑвир дар трейи ÑиÑтемавӣ starting QuiteRSS ҳангоми даъвати QuiteRSS minimizing QuiteRSS ҳангоми минимизатÑиÑи QuiteRSS closing QuiteRSS ҳангоми пӯшидани QuiteRSS Show static icon Ðишондоди таÑвири Ñтатикӣ Change icon for incoming new news Тағйири таÑвир ҳангоми қабули хабарҳои нав Show count of new news Ðишондоди миқдори хабарҳои нав Show count of unread news Ðишондоди миқдори хабарҳои хонданашуда Single click instead of double click for show window Пахши Ñккарата барои нишондоди равзана Empty working set on minimize to tray Холикунии хотира ҳангоми минимизатÑÐ¸Ñ Ð±Ð° трей Move to the system tray when: Ҷойкунӣ дар трейи ÑиÑтемавӣ: Tray icon behavior: Рафтори таÑвир дар трей: Direct connection to the Internet ПайваÑтшавӣ бе прокÑи System proxy configuration (if available) Танзимоти ÑиÑтемавии прокÑи (ҳангоми даÑÑ‚Ñ€Ð°Ñ Ð±ÑƒÐ´Ð°Ð½) Manual proxy configuration: Танзими даÑтии прокÑи: Proxy server: ПрокÑи-Ñервер: Port: Порт: Username: Ðоми иÑтифодабаранда: Password: Парол: Request timeout: Таймаути дархоÑÑ‚: Number of requests: Миқдори дархоÑтҳо: Number of retries: Миқдори такрор: Options network requests when updating feeds (requires program restart): Танзимоти дархоÑтҳои шабақавӣ ҳангоми азнавкунии таÑмаҳо (азнавкушоии барнома зарур аÑÑ‚): Use embedded browser ИÑтифодаи браузери дохилӣ Use external browser ИÑтифодаи браузери берунӣ Default external browser Браузери пешфарзи берунӣ Following external browser: Браузери берунии оÑнда: Browse... Чашмандоз... Load images Гирифтори таÑвирҳо Enable JavaScript ВаÑли JavaScript Enable plug-ins ВаÑли плагинҳо Open links in embedded browser in background Кушодани линкҳо дар браузери дохилӣ Open links in external browser in background (experimental) Кушодани линкҳо дар браузери беруна (дар озмоиш) Default zoom on pages: Ҳаҷми пешфарзи Ñаҳифаҳо: Browser selection: Интихоби браузер: External browser: Браузери берунӣ: Content: Мӯҳтаво: User style sheet: Ҷадвали уÑлубҳои иÑтифодабаранда: Maximum pages in cache Мунтаҳои Ñахифаҳо дар кÑш Store cache in: Ðигоҳдошт дар кÑш: Maximum size of disk cache Мунтаҳои ҳаҷми диÑк барои кÑш MB МБ Use disk cache ИÑтифодаи кÑши диÑк Allow local data to be set Иҷозати танзими маълумоти локалӣ Keep local data only until quit application Ðигоҳдошти маълумоти локалӣ то баромад аз замима Block sites from setting any data МуҳоÑираи Ñомонаҳо аз шинонидани дилхоҳ маълумот Clear Тоза кардан Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash - плагин барои муҳоÑираи автоматӣ гирифтори Flash мӯҳтавои Ñаҳифа мебошад. Шумо метавонед мӯҳтавои муҳоÑирашударо по пахш дар тугмаи Play азназар гузаронед. Use Click to Flash ИÑтифодаи Click to Flash Add... Илова... Remove... Хориҷ... Ask where to save each file before downloading ПурÑиши мавқеъи Ñабти ҳар файл пеш аз гирифтор Download location: Мавқеъи гирифтор: History Таърих Click to Flash Click to Flash Downloads Гирифторҳо Automatically update the feeds on startup Ðвтоматӣ азнавкунии таÑмаҳо ҳангоми оғоз Automatically update the feeds every Ðвтоматӣ азнавкунии таÑмаҳо ҳар seconds ÑÐ¾Ð½Ð¸Ñ hours Ñоат Nothing to do Ҳеҷ кор накардан Dec Дек December Декабр Display format for date: Ðишондоди намуди Ñана: time: вақт: Alternating row background colors Пайдарпайии ранги фони Ñатрҳо Simplified representation of date and time Пешниҳоди Ñоддаи Ñана ва вақт Show All Ðишондоди ҳама Show New Ðишондоди нав Show Unread Ðишондоди нахонда Show Starred Ðишондоди бо Ñиторача қайд шуда Show Not Starred Ðишондоди қайд нашуда Show Unread or Starred Ðишондоди нахонда Ñ‘ қайдшуда Show Last Day Ðишондод барои рӯзи гузашта Show Last 7 Days Ðишондод барои 7 рӯзи гузашта Style sheet for news: Интихоби уÑлуби ҷадвал барои ахборот: Mark news as read: Қайд ҳамчун хондашуда: on selecting. With timeout ҳангоми интихоб. Бо боздоштан ба after switching to another news баъди гузариш ба хабари дигар Mark displayed news as read when switching feeds Қайди хабарҳои интихобшуда ҳамчун хондашуда ҳангоми ивази таÑмаҳо Mark displayed news as read when closing tab Қайди хабарҳои нишондодашуда ҳамчун хондашуда ҳангоми пӯшидани Ñаҳифа Mark displayed news as read on minimize Қайди хабарҳои нишондодашуда ҳамчун хондашуда ҳангоми минимизатÑÐ¸Ñ Change behavior of action 'Next Unread News' Тағйири рафтори амали 'Хабари нахондаи оÑнда' starred news хабарҳои бо Ñиторача қайд шуда labeled news хабарҳои нишона шуда Automatically mark identical news as read Ðвтоматӣ қайди хабарҳои Ñкхела ҳамчун хондашуда Prevent accidental deletion of: Пешгирии хориҷи таÑодуфи: Enable cleanup on shutdown Тоза кардан ҳангоми анҷоми кор Maximum age of news in days to keep: Синни мунтаҳои хабарҳои Ñабт мешуда дар рӯз: Maximum number of news to keep: Миқдори мунтаҳои хабарҳои Ñабт мешуда: Delete read news Хориҷи хабарҳои хондашуда Never delete unread news Ҳеҷ гоҳ хориҷ накардани хабарҳои хонданашуда Never delete starred news Ҳеҷ гоҳ хориҷ накардани хабарҳои бо Ñиторача қайд шуда Never delete labeled news Ҳеҷ гоҳ хориҷ накардани хабарҳои бо нишона қайд шуда Clean up 'Deleted' Тоза кардани 'Хориҷшуда' Enable DB optimization (slower shutdown) МуноÑиб кардани ММ (ÑуÑттар шудани анҷоми кор) Reading Хондан Clean Up Тоза кардан New... Эъҷод... Edit... Тағйирдиҳӣ... Delete... Хориҷ... Move up Ба боло Move down Ба поён Show when inactive main window Ðишон додан вақти равзанаи аÑоÑÓ£ ғайрифаъол аÑÑ‚ Screen Экран Transparency ШаффофиÑÑ‚ Show titles feeds Ðишон додани унвонҳои аÑрор Show icon feed Ðишон додани таÑвири таÑма Show button 'Mark All News Read' Ðишон додани тугмаи "Қайди ҳамаи хабарҳо ҳамчун хондашуда" Show button 'Mark Read/Unread' Ðишон додани тугмаи "Қайд ҳамчун хондашуда/хонданашуда" Show button 'Open in External Browser' Ðишон додани тугмаи "Кушодан дар браузери берунӣ" Show button 'Delete News' Ðишон додани тугмаи "Хориҷи хабарҳо" Play sound for incoming new news Садо ҳангоми қабули хабарҳои нав Play Пахш Display notification for incoming news Ðишондоди огоҳӣ ҳангоми воридшудани хабарҳо Top Left Дар боло аз чап Top Right Дар боло аз роÑÑ‚ Bottom Left Дар поён аз чап Bottom Right Дар поён аз роÑÑ‚ Review Ðз назар гузарондан Position Мавқеъ Show maximum of Ðишондоди мунтаҳо аз item on page notification ҷузъ дар Ñаҳифаи огоҳӣ Width list items ВаÑеъгии рӯйхати Ñлементҳо pixels пикÑел Close notification after Пӯшидани огоҳӣ Ð¿Ð°Ñ Ð°Ð· Do not show notification in fullscreen mode Ðишон надодани огоҳӣ дар реҷаи пурраи Ñкран Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Ðишондоди танҳо таÑмаҳои интихобшуда: Notification Огоҳи Sound Овоз Selection of feeds Интихоби аÑрор All Feeds Ҳамаи таÑмаҳо Site Сомона User ИÑтифодабаранда Password Парол Delete Хориҷ Delete All Хориҷи ҳама Show Passwords Ðишондоди паролҳо Version Ðашр Author Муаллиф Contact Ð¢Ð°Ð¼Ð¾Ñ Choose language: Забонро интихоб кунед: Type Ðамуд Font Ҳуруфҳо Feeds list font Ҳуруфи рӯйхати таÑмаҳо News list font Ҳуруфи рӯйхати хабарҳо News title font Ҳуруфи Ñарлавҳаи хабарҳо News text font Ҳуруфи матни хабарҳо Notification font Ҳуруфи огоҳӣ Change... Тағйирдиҳӣ... Reset Барқароркунӣ Feeds list color Ранги рӯйхати таÑмаҳо Feeds list background Ранги фони рӯйхати таÑмаҳо News list color Ранги рӯйхати хабарҳо News list background Ранги фони рӯйхати хабарҳо Focused news color Ранги матни хабар дар зери курÑор Focused news background color Ранги фони хабар дар зери курÑор Link color Ранги линк Title color Ранги Ñарлавҳа Date color Ранги Ñана Author color Ранги номи муаллиф News text color Ранги матни хабарҳо News title background Фони Ñарлавҳаи хабар News background Фони хабар Feed with new news ТаÑма бо хабарҳои нав Count of unread news in feeds tree Миқдори хабарҳои нахонда дар дарахти таÑмаҳо Disabled feed Хомӯшкунии таÑма Alternating row colors Ранги алтернативии Ñатр Notification text color Ранги матни огоҳӣ Notification background color Ранги паÑзаминаи огоҳинома Auto load images in news view Гирифтори автоматии таÑвирҳо Text color of new news Ранги матни хабарҳои нав Show feeds tree toggle Ðишондоди дарахти таÑмаҳо Clear new status when minimize to tray Тозакунии ҳолати нав ҳангоми минимизатÑÐ¸Ñ Ð±Ð° трей Set focus on the last opened news Гузариши нигоҳ ба охирон хабари кушодашуда Set focus at the top of news list Гузариши нигоҳ ба хабари болоии рӯйхат Set focus on the unread news Гузариши нигоҳ ба хабари нахонда Open the news Кушодани хабар Default news filter: Филтри пешфарзи хабарҳо: Action on feed opening: Ðмалҳо ҳангоми кушодани таÑма: Show news description instead of loading web page Ðишондоди тавÑифи хабар бар замми боркунии веб-Ñаҳифа Text color of unread news Ранги матни хабарҳои нахонда Focused feed color Ранги матни хабар дар зери курÑор Focused feed background color Ранги фони хабар дар зери курÑор Standard Стандартӣ Fixed Қайд шуда Serif Бо нишона Sans Serif Бе нишона Cursive КурÑив Fantasy МоноваÑеъ Default font size Ҳаҷми пешфарзи ҳуруф Fixed font size Ҳаҷми ҳуруф қайдшуда Minimum font size Ҳаҷми хурдтарини ҳуруф Minimum logical font size Ҳачми хурдтарини мантиқии ҳуруф Font families: Гурӯҳи ҳуруфҳои: Font sizes: Ҳаҷми ҳуруфҳо: Fonts Ҳуруфҳо Fonts Browser Ҳуруфҳои браузер Colors Рангҳо Filter Филтр Action Ðмал Description ТавÑиф Shortcut МухтаÑари тугмаҳо Shortcut: МухтаÑари тугмаҳо: Open File... Кушодани файл... Select Style Sheet File Интихоби файли ҷадвали уÑлубҳо Open Directory... Кушодани каталог... Add site to whitelist Иловаи Ñомона ба рӯйхати Ñафед Site without 'http://' (ex. youtube.com) Сомона бе 'http://' (миÑол, youtube.com) QAbstractSpinBox &Step up &Қадам боло Step &down Қадам &поён &Select All &Интихоби ҳама QDialogButtonBox Close Пӯшидан Cancel Рафъ &Yes &Ҳа &No &Ðе QFtp Not connected ПайваÑÑ‚ неÑÑ‚ Host %1 not found ХоÑти %1 дарёфт нагардид Connection refused to host %1 Ради пайваÑтшави ба хоÑÑ‚ %1 Connection timed out to host %1 Таймаути пайваÑтшавӣ ба хоÑти %1 Connected to host %1 ПайваÑтшавӣ ба хоÑти %1 Connection refused for data connection ПайваÑтшавӣ барои додугирифти маълумот рад шуд Unknown error Хатогии номуайÑн Connecting to host failed: %1 Хатогии пайваÑтшавӣ ба хоÑÑ‚: %1 Login failed: %1 Хатогии даромад ба ÑиÑтема: %1 Listing directory failed: %1 Хатогии номбаркунии папка: %1 Changing directory failed: %1 Хатогии муайÑн кардани папка: %1 Downloading file failed: %1 Хатогии гирифтори файл: %1 Uploading file failed: %1 Хатогии боркунии файл: %1 Removing file failed: %1 Хатогии хориҷи файл: %1 Creating directory failed: %1 Хатогии Ñъҷоди папка: %1 Removing directory failed: %1 Хатогии хориҷи папка: %1 Connection closed ПайваÑтагӣ пӯшида шуд QLineEdit &Undo &Баргард &Redo &Пешгард Cu&t &Буридан &Copy &ÐуÑхагирӣ &Paste &Гузоштан Delete Хориҷ Select All Интихоби ҳама QMultiInputContext Select IM Интихоби реҷаи дохилкунӣ QObject Cannot start external program Оғози барномаи берунӣ имконнопазир аÑÑ‚ Cannot start external program! %1 Оғози барномаи берунӣ имконнопазир аÑÑ‚! %1 Error Хатогӣ QTextControl &Undo &Баргард &Redo &Пешгард Cu&t &Буридан &Copy &ÐуÑхагирӣ &Paste &Гузориш Delete Хориҷ Select All Интихоби ҳама Copy &Link Location ÐуÑхабардории &Ñуроғаи линк QWizard Cancel Рафъ < &Back < Ба &қафо &Finish &Итмом &Next > Ба &пеш > RSSDetectionWidget Untitled feed ТаÑмаи беном RequestFeed Server requires authentication! Сервер авторизатÑиÑро талаб мекунад! Server replied: Not Found! Ҷавоби Ñервер: Ðфта нашуд! Redirect error! Хатогии переадреÑатÑиÑ! Request timeout! Таймаути дархоÑÑ‚! SQLiteDriver Error opening database Хатогии кушодани ММ Error closing database Хатогии пӯшидани ММ Unable to begin transaction ТранзакÑÐ¸Ñ Ð½Ð¾Ñ‚Ð°Ð¼Ð¾Ð¼ монд Unable to commit transaction ТаÑдиқи транзакÑÐ¸Ñ Ð¸Ð¼ÐºÐ¾Ð½ надорад Unable to rollback transaction Рафъи транзакÑÐ¸Ñ Ð¸Ð¼ÐºÐ¾Ð½ надорад SQLiteResult Unable to fetch row Интихоби Ñатр номумкин аÑÑ‚ No query ДархоÑÑ‚ вуҷуд надорад Unable to execute statement Иҷроиши ифода ғайри имкон аÑÑ‚ Unable to execute multiple statements at a time Иҷроиши Ñкчанд дархоÑтҳо ғайри имкон аÑÑ‚ Unable to reset statement Партофтани ифода ғайри имкон аÑÑ‚ Unable to bind parameters Ðлоқаманд кардани параметрҳо ғайри имкон аÑÑ‚ Parameter count mismatch Ðомувофиқ омадани миқдори параметрҳо SslErrorDialog SSL Certificate Error! Хатогии Сертификати SSL! Only for this session Танҳо барои ин ҷалаÑа UpdateAppDialog Check for Updates Тафтиши навовариҳо Checking for updates... Тафтиши навовариҳо... Loading history... Гирифтори таърих.. Don't remind about this version ХотирраÑон накардан оиди ин нашр &Install &Шинондан You already have the latest version Шумо нашри охиронро доред A new version of QuiteRSS is available! Ðашри нави QuiteRSS даÑÑ‚Ñ€Ð°Ñ Ð°ÑÑ‚! Click here to go to the download page Ин ҷо пахш кунед, то ба Ñаҳифаи гирифтор гузаред Your version is: Ðашри шумо: Current version is: Ðашри ҷорӣ: Error checking updates Хатогии тафтиши навовариҳо quiterss-0.18.3/lang/quiterss_th_TH.ts000066400000000000000000005124741265173051100177360ustar00rootroot00000000000000 AboutDialog About Revision Version QuiteRSS is a open-source cross-platform RSS/Atom news reader Includes: Application directory: Resource directory: Data directory: Backup directory: Database file: Settings file: Log file: Authors History License Information AdBlockAddSubscriptionDialog Add Subscription Title: Address: Add new subscription to AdBlock: AdBlockCustomList Custom Rules AdBlockDialog AdBlock Configuration Enable AdBlock Search... Options AdBlock Use only essential part of EasyList (for performance reasons) Add Rule Remove Rule Add Subscription Remove Subscription Update Subscriptions Learn about writing rules... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock Show AdBlock &Settings Disable on %1 Disable only on this page Blocked Popup Windows %1 with (%2) No content blocked Blocked URL (AdBlock Rule) - click to edit rule AdBlockManager EasyList AdBlockSubscription Cannot load subscription! AdBlockTreeWidget Add Rule Remove Rule Add Custom Rule Please write your rule here: %1 (recently updated) %1 (Error: %2) AddFeedWizard Add Feed Create New Feed Use title of the feed as displayed name Server requires authentication: Username: Password: Feed URL or website address: Feeds All Feeds New Folder... Displayed name: Location: URL error! Duplicate feed! Can't find feed URL! Request failed! AddFolderDialog Add Folder Feeds All Feeds Name: Location: AuthenticationDialog Save password Authorization required Server: Message: Username: Password: CategoriesTreeWidget Unread Starred Deleted Labels Open in New Tab Clear 'Deleted' Mark Read CleanUpWizard Clean Up Choose Feeds All Feeds Clean Up Options Maximum age of news in days to keep: Maximum number of news to keep: Delete read news Never delete unread news Never delete starred news Never delete labeled news Clean up 'Deleted' Purge DB Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Information Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash Hide object Add '%1' to whitelist CustomizeToolbarDialog Customize Main Toolbar Customize Feeds Toolbar Customize News Toolbar Load images Separator Icon Text Text Beside Icon Text Under Icon Big Normal Small Style: Icon Size: Add Remove Move up Move down Default DownloadItem Remaining time unavailable Error: Cannot write to file! Error: few seconds seconds minutes hours Unknown size Unknown speed %2 - unknown size (%3) Remaining %1 - %2 of %3 (%4) Cancelled - %1 Delete file Do you want to also delete downloaded file? Open File Open Folder Copy Download Link Cancel Downloading Remove Cancelled Error Not found Sorry, the file %1 was not found! DownloadManager Clear File %1 (*.%2) All Files (*.*) Save As... Executable: Arguments: FeedPropertiesDialog Properties General Columns Authentication Status Title: Homepage: Feed URL: Load Title Load Favicon Select Icon... Select Icon Disable update Automatically update every seconds minutes hours Starred Load images Display in new tab on startup Show news' description instead of loading web page Automatically delete duplicate news Display Enable JavaScript Right-to-left layout Ascending Descending Sort by: Add Remove Move up Move down Default Server requires authentication: Username: Password: Description: Status: Created: Last update: News count: Good Long ago ;-) new unread Image files Select Image Load icon: can't open a file! FilterRulesDialog Filter Rules Feeds All Feeds Filter name: Match all news Match all conditions Match any condition Perform these actions: Please enter name for the filter. Please enter search condition for the news filter. FindFeed Find Name Find Link FindTextContent Find in News Find in Titles Find in Authors Find in Categories Find in Content Find in Links Find in Browser FtpDownloader Canceled! ItemAction Mark News as Read Add Star Delete Add Label Play a Sound Show News in Notifier Browse Play Add Action Delete Action Open File... ItemCondition Title Description Author Category State Link News New Read Starred Add Condition Delete Condition contains doesn't contains is isn't begins with ends with Regular expressions LabelDialog New Label Load icon... Default Select color... Name: Icon: Color text: Color background: Image files Select Image Load icon: can't open a file! MainApplication Saving data... MainWindow &AdBlock Hide Categories Show Categories Select OPML-File OPML-Files (*.%1 *.%2) Import canceled Import: can't open a file OPML-Files (*.%1) Export canceled Export: can't open a file Unread: %1 All: %1 (Browser) New News: %1 Unread News: %1 &Add Add New Feed &Feed... F&older... Add New Folder Open in New Tab &Delete... Delete Selected Feed &Import Feeds... Import Feeds from OPML File &Export Feeds... Export Feeds to OPML File E&xit Update Feed Update Current Feed Update All Update All Feeds Mark All Feeds Read Mark Read/Unread Mark Current News Read/Unread Mark All News Read Downloads Clean Up... News Filters... Filter News... Options... Open Options Dialog Filter Feeds Show All Show New Show Unread Show Starred Feeds Show Not Working Feeds Filter News Show Starred Show Not Starred Show Unread or Starred Show Last Day Show Last 7 Days About... Show 'About' Dialog Check for Updates... Report a Problem... Open News Open in Browser Open in External Browser Open News in External Browser Open News in New Tab Open in Background Tab Open News in Background Tab Star Mark News Star Delete Delete Selected News Delete All News Delete All News from List Restore Restore News Copy Link Restore last deleted news Mark Read Mark Feed Read Properties &File Count Unread News Count All News Last Update Reset browser zoom Print Web Page Preview Web Page Save page in database Save page in database instead of news description Confirm Delete Are you sure to delete selected elements? Menu Add Feed... &Create Backup... S&how Menu Bar Open News Description Copy News Link &View Fee&ds &News &Browser &Tools &Help Main Toolbar Customize Toolbar Main Toolbar... Customize Toolbar... Feeds Toolbar... News Toolbar... Lock Toolbar Hide Toolbar Layout Classic Newspaper Application Style System System2 Green Orange Purple Pink Gray Browser Position Top Bottom Right Left Show Window Previous Feed Next Feed Previous News Next News News Page Up News Page Down Next Unread News Previous Unread News Switch Focus to Next Panel Switch Focus to Next Panel (Tree Feeds, List News, Browser) Switch Focus to Previous Panel Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Show/Hide Tree Feeds Minimize to Tray Minimize Application to Tray Columns Show Indentation Search Feed Zoom Zoom In Zoom in in browser Zoom Out Zoom out in browser 100% Print... Print Preview... Page up (Browser) Page down (Browser) Save As... Save Page As... Show/Hide Feeds Toolbar News Toolbar Browser Toolbar Panel Categories Status Bar Full Screen Stay On Top Categories Label Show labels menu Close Tab Close Other Tabs Close All Tabs Switch to next tab Switch to previous tab Unread Starred Deleted Labels Decrease news list/increase browser Increase news list/decrease browser Find Open Homepage Feed Sort by Name Collapse All Folders Expand All Folders Next Folder Previous Folder Expand Folder Setting Page: Labels Share Sort By Ascending Descending Check for updates A new version of QuiteRSS... Loading... Web Page Save As HTML-Files (*.%1) Text files (*.%2) Save As: can't open a file Choose Directory Important Work Personal To Do Later Amusingly NetworkManager SSL Certificate Error! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Domain Name: </b> <b>Expiration Date: </b> <b>Error: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters Feeds Filter Name New... Edit... Delete... Move up Move down Run Filter Delete Filter Are you sure you want to delete the filter '%1'? NewsHeader Icon Feed Title Published Received Author Category Read Star Label Feed Title Link NewsItem Mark Read/Unread Delete News NewsTabWidget Loading... (%p%) Home Open Page in External Browser Open Link in External Browser Open Link Open in New Tab Save Link... Save Image... Copy Link Copy Go Back Go Forward Stop Reload Copy Image Copy Image Address Load Images Auto Load Images to News View No Load Images No Load Images to News View Close Tab Auto Load Images in News View Don't Load Images Don't Load Images in News View Comments Author: %1 audio video media Link to Mark Read/Unread Mark News Star Label Share Open News in External Browser Delete NotificationWidget Close Mark All News Read Previous Page Next Page Incoming News: %1 Page %1 of %2 OptionsDialog Options General System Tray Network Connections Browser Feeds Labels Notifications Passwords Language Fonts & Colors Keyboard Shortcuts Warning: key is already assigned to Show splash screen on startup Reopen last opened feeds on startup Open new tab next to active Hide feeds tree when opening tabs Show default rss-icon instead of favourite one Automatically collapse folders Show close button on tab Automatically check for updates Help improve QuiteRSS by sending usage information Store a DB in memory (requires program restart) Save DB stored in memory to file every minutes Run QuiteRSS at Windows startup Show system tray icon starting QuiteRSS minimizing QuiteRSS closing QuiteRSS Show static icon Change icon for incoming new news Show count of new news Show count of unread news Single click instead of double click for show window Empty working set on minimize to tray Move to the system tray when: Tray icon behavior: Direct connection to the Internet System proxy configuration (if available) Manual proxy configuration: Proxy server: Port: Username: Password: Request timeout: Number of requests: Number of retries: Options network requests when updating feeds (requires program restart): Use embedded browser Use external browser Default external browser Following external browser: Browse... Load images Enable JavaScript Enable plug-ins Open links in embedded browser in background Open links in external browser in background (experimental) Default zoom on pages: Browser selection: External browser: Content: User style sheet: Maximum pages in cache Store cache in: Maximum size of disk cache MB Use disk cache Allow local data to be set Keep local data only until quit application Block sites from setting any data Clear Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Use Click to Flash Add... Remove... Ask where to save each file before downloading Download location: History Privacy Click to Flash Downloads Automatically update the feeds on startup Automatically update the feeds every seconds hours Nothing to do Dec December Display format for date: time: Alternating row background colors Simplified representation of date and time Show All Show New Show Unread Show Starred Show Not Starred Show Unread or Starred Show Last Day Show Last 7 Days Style sheet for news: Mark news as read: on selecting. With timeout after switching to another news Mark displayed news as read when switching feeds Mark displayed news as read when closing tab Mark displayed news as read on minimize Change behavior of action 'Next Unread News' starred news labeled news Automatically mark identical news as read Prevent accidental deletion of: Enable cleanup on shutdown Maximum age of news in days to keep: Maximum number of news to keep: Delete read news Never delete unread news Never delete starred news Never delete labeled news Clean up 'Deleted' Enable DB optimization (slower shutdown) Reading Clean Up New... Edit... Delete... Move up Move down Show when inactive main window Screen Transparency Show titles feeds Show icon feed Show button 'Mark All News Read' Show button 'Mark Read/Unread' Show button 'Open in External Browser' Show button 'Delete News' Play sound for incoming new news Play Display notification for incoming news Top Left Top Right Bottom Left Bottom Right Review Position Show maximum of item on page notification Width list items pixels Close notification after Do not show notification in fullscreen mode Only show selected feeds: Notification Sound Selection of feeds All Feeds Site User Password Delete Delete All Show Passwords Version Author Contact Choose language: Type Font Feeds list font News list font News title font News text font Notification font Change... Reset Feeds list color Feeds list background News list color News list background Focused news color Focused news background color Link color Title color Date color Author color News text color News title background News background Feed with new news Count of unread news in feeds tree Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view Text color of new news Show feeds tree toggle Clear new status when minimize to tray Set focus on the last opened news Set focus at the top of news list Set focus on the unread news Open the news Default news filter: Action on feed opening: Show news description instead of loading web page Text color of unread news Focused feed color Focused feed background color Standard Fixed Serif Sans Serif Cursive Fantasy Default font size Fixed font size Minimum font size Minimum logical font size Font families: Font sizes: Fonts Fonts Browser Colors Filter Action Description Shortcut Shortcut: Open File... Select Style Sheet File Open Directory... Add site to whitelist Site without 'http://' (ex. youtube.com) QAbstractSpinBox &Step up Step &down &Select All QDialogButtonBox Close Cancel &Yes &No QFtp Not connected Host %1 not found Connection refused to host %1 Connection timed out to host %1 Connected to host %1 Connection refused for data connection Unknown error Connecting to host failed: %1 Login failed: %1 Listing directory failed: %1 Changing directory failed: %1 Downloading file failed: %1 Uploading file failed: %1 Removing file failed: %1 Creating directory failed: %1 Removing directory failed: %1 Connection closed QLineEdit &Undo &Redo Cu&t &Copy &Paste Delete Select All QMultiInputContext Select IM QObject Cannot start external program Cannot start external program! %1 Error QTextControl &Undo &Redo Cu&t &Copy &Paste Delete Select All Copy &Link Location QWizard Cancel < &Back &Finish &Next > RSSDetectionWidget Untitled feed RequestFeed Server requires authentication! Server replied: Not Found! Redirect error! Request timeout! SQLiteDriver Error opening database Error closing database Unable to begin transaction Unable to commit transaction Unable to rollback transaction SQLiteResult Unable to fetch row No query Unable to execute statement Unable to execute multiple statements at a time Unable to reset statement Unable to bind parameters Parameter count mismatch SslErrorDialog SSL Certificate Error! Only for this session UpdateAppDialog Check for Updates Checking for updates... Loading history... Don't remind about this version &Install You already have the latest version A new version of QuiteRSS is available! Click here to go to the download page Your version is: Current version is: Error checking updates quiterss-0.18.3/lang/quiterss_tr.ts000066400000000000000000005430441265173051100173520ustar00rootroot00000000000000 AboutDialog About Hakkında Revision Gözden Geçir Version Sürüm QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS , açık uçlu çapraz iÅŸletim sistemli RSS/Atom haber okuyucusudur. Includes: İçerik: Application directory: Uygulama dizini: Resource directory: Kaynak dizini: Data directory: Veri dizini: Backup directory: Yedek dizini: Database file: Veritabanı dosyası: Settings file: Ayarlar dosyası: Log file: Kayıt dosyası: Authors Yazarlar History GeçmiÅŸ License Lisans Information Bilgi AdBlockAddSubscriptionDialog Add Subscription Abonelik Ekle Title: BaÅŸlık : Address: Adres: Add new subscription to AdBlock: AdBlock'a yeni abonelik ekle: AdBlockCustomList Custom Rules Özel Kurallar AdBlockDialog AdBlock Configuration AdBlock Yapılandırması Enable AdBlock AdBlock'u EtkinleÅŸtir Search... Ara... Options Seçenekler AdBlock AdBlock Use only essential part of EasyList (for performance reasons) Add Rule Kural Ekle Remove Rule Kural Sil Add Subscription Abonelik Ekle Remove Subscription Abonelik Sil Update Subscriptions Abonelikleri Güncelle Learn about writing rules... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock AdBlock Show AdBlock &Settings Disable on %1 Disable only on this page Blocked Popup Windows %1 with (%2) No content blocked Blocked URL (AdBlock Rule) - click to edit rule AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Abonelik yüklenemedi! AdBlockTreeWidget Add Rule Kural Ekle Remove Rule Kural Sil Add Custom Rule Özel Kural Ekle Please write your rule here: %1 (recently updated) %1 (Error: %2) AddFeedWizard Add Feed Kaynak Ekle Create New Feed Yeni Kaynak Ekle Use title of the feed as displayed name Kaynak ismini baÅŸlık olarak kullan Server requires authentication: Sunucu yetkilendirilmesi: Username: Kullanıcı adı: Password: Åžifre: Feed URL or website address: Kaynak URL veya Website adresi : Feeds Kaynaklar All Feeds Tüm Kaynaklar New Folder... Yeni Klasör... Displayed name: Görüntülenen adı : Location: YerleÅŸim: URL error! URL hatası ! Duplicate feed! EklenmiÅŸ kaynak! Can't find feed URL! URL kaynağı bulunamadı ! Request failed! İzin alma baÅŸarısız! AddFolderDialog Add Folder Klasör Ekle Feeds Kaynaklar All Feeds Tüm Kaynaklar Name: İsim: Location: YerleÅŸim: AuthenticationDialog Save password Åžifreyi kaydet Authorization required Yetki istendi Server: Sunucu: Message: Mesaj: Username: Kullanıcı adı: Password: Åžifre: CategoriesTreeWidget Unread Okunmamış Starred Favori olarak eklenmiÅŸ Deleted SilinmiÅŸ Labels Etiketler Open in New Tab Yeni sekmede aç Clear 'Deleted' 'SilinmiÅŸler' i temizle Mark Read CleanUpWizard Clean Up Temzilik yap Choose Feeds Kaynakları seç All Feeds Tüm Kaynaklar Clean Up Options Seçenekleri temizle Maximum age of news in days to keep: Korunacak haberlerin azami gün sayısı: Maximum number of news to keep: Saklanacak maksimum haber sayısı: Delete read news Okunan haberi sil Never delete unread news Okunmamış haberleri asla silme Never delete starred news Favorilere eklenmiÅŸ haberi asla silme Never delete labeled news EtiketlenmiÅŸ haberleri asla silme Clean up 'Deleted' 'SilinmiÅŸler'i temizle Purge DB Veritabanını temizle Totally remove records that had marked 'deleted' from DB. Ancient news could reappear 'SilinmiÅŸler' olarak iÅŸaretlenmiÅŸ kayıtları veritabanından sil.Eski haberler tekrar görünebilir Information Bilgi Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash Nesne ClickToFlash taradından engellendi Hide object Nesneyi gizle Add '%1' to whitelist '%1' i aklanmışlar listesine ekle CustomizeToolbarDialog Customize Main Toolbar Ana Åžeriti Biçimlendir Customize Feeds Toolbar Kaynaklar Åžeritini Biçimlendir Customize News Toolbar Haberler Åžeritini Biçimlendir Load images Resimleri yükle Separator Ayırıcı Icon Simge Text Yazı Text Beside Icon Simgenin Yanındaki Yazı Text Under Icon Simgenin Altındaki Yazı Big Büyük Normal Normal Small Küçük Style: Tarz: Icon Size: Simge Boyutu: Add Ekle Remove Sil Move up Yukarı taşı Move down AÅŸağı taşı Default Varsayılan DownloadItem Remaining time unavailable Geriye kalan zamana ulaşımadı Error: Cannot write to file! Hata : Dosyaya yazma gerçekleÅŸmedi Error: Hata: few seconds Bir kaç saniye seconds saniye minutes dakika hours saat Unknown size Bilinmeyen boyut Unknown speed Bilinmeyen hız %2 - unknown size (%3) %2 - bilinmeyen boyut (%3) Remaining %1 - %2 of %3 (%4) Kalan %1 - %3 'de %2 (%4) Cancelled - %1 İptal Edildi - %1 Delete file Dosyayı Sil Do you want to also delete downloaded file? Open File Dosya aç Open Folder Klasörü Aç Copy Download Link İndirme Adresini Kopyala Cancel Downloading İndirme iptal ediliyor Remove Sil Cancelled İptal Edildi Error Hata Not found Bulunamadı Sorry, the file %1 was not found! Üzgünüz, ⎠%1 ⎠adlı dosya bulunamadı! DownloadManager Clear Temizle File %1 (*.%2) Dosya %1 (*.%2) All Files (*.*) Tüm Dosyalar (*.*) Save As... Farklı Kaydet... Executable: ProgramlaÅŸtırılabilir: Arguments: Argümanlar: FeedPropertiesDialog Properties Özellikler General Genel Columns Kolonlar Authentication Yetkilendirme Status Durum Title: BaÅŸlık : Homepage: Anasayfa: Feed URL: Kaynak URL: Load Title BaÅŸlık Yükle Load Favicon Favicon Yükle Select Icon... Simge Seç Select Icon Simge Seç Disable update Güncellemeyi devre dışı bırak Automatically update every Otomatik güncelleme sıklığı her: seconds saniye minutes dakika hours saat Starred Favorilere eklenen Load images Resimleri yükle Display in new tab on startup Bilgisayar açılınca yeni sekmede görüntüle Show news' description instead of loading web page Web sayfasını yüklemek yerine haber açıklamasını göster Automatically delete duplicate news Çift haberleri otomatik sil Display Görüntüle Reading Enable JavaScript JavaScript'i EtkinleÅŸtir Right-to-left layout Ascending Yükselen Descending Alçalan Sort by: Sıralama kriteri: Add Ekle Remove Sil Move up Yukarı taşı Move down AÅŸağı taşı Default Varsayılan Server requires authentication: Sunucu yetkilendirilmesi: Username: Kullanıcı adı: Password: Åžifre: Feeds count: Description: Tanımlar: Status: Durum: Created: OluÅŸturulan: Last update: Son güncelleme: News count: Haber sayısı: Good İyi Long ago ;-) Uzun zaman önce ;-) new yeni unread okunmamış Image files Resim dosyaları Select Image Resim seç Load icon: can't open a file! Simge yükleme:Dosya açılamadı FilterRulesDialog Filter Rules Süzgeç Kuralları Feeds Kaynaklar All Feeds Tüm Kaynaklar Filter name: Süzgeç ismi: Match all news EÅŸleÅŸen tüm haberler Match all conditions Tüm uyan koÅŸullar Match any condition Herhangi uygun bir koÅŸul Perform these actions: Bu eylemleri gerçekleÅŸtir: Please enter name for the filter. Lütfen süzgeç için bir isim yazın. Please enter search condition for the news filter. Lütfen haberleri süzmek için bir arama koÅŸulu yazınız. FindFeed Find Name İsim Arama Find Link Link arama FindTextContent Find in News Haberler içinde bul Find in Titles BaÅŸlıklarda Bul Find in Authors Yazarlarda Bul Find in Categories Kategorilerde Bul Find in Descriptions Find in Links BaÄŸlantılarda Bul Find in Browser Browser içinde ara FtpDownloader Canceled! İptal Edildi! ItemAction Mark News as Read Haberleri okundu olarak iÅŸaretle Add Star Favorilere ekle Delete Sil Add Label Etiket Ekle Play a Sound Sesi Oynat Show News in Notifier Browse Göz at Play Oynat Add Action Eylem ekle Delete Action Eylem sil Open File... Dosya aç... ItemCondition Title BaÅŸlık Description Tanım Author Yazar Category Kategori State Durum Link BaÄŸlantı News New Yeni Read Oku Starred Favoriler Add Condition KoÅŸul ekle Delete Condition KoÅŸul sil contains içerir doesn't contains içermez is ÅŸu olmalıdır isn't ÅŸu olmamalıdır begins with ile baÅŸlamalı ends with ile bitmeli Regular expressions Düzenli ifadeler LabelDialog New Label Yeni Etiket Load icon... Simge yükle... Default Varsayılan Select color... Renk Seç... Name: İsim: Icon: Simge: Color text: Yazı rengi: Color background: Arkaplan rengi: Image files Resim Dosyaları Select Image Resim Seç Load icon: can't open a file! Simge Yükleme:Dosya Açılamadı! MainApplication Saving data... Kaydediliyor... MainWindow &AdBlock &AdBlock Hide Categories Kategorileri Gizle Show Categories Kategorileri Göster Select OPML-File OPML-tipi dosya seç OPML-Files (*.%1 *.%2) OPML-Dosyaları (*.%1 *.%2) Import canceled İçeri aktarım iptal edildi Import: can't open a file İçeri Aktarım:Dosya açılamadı OPML-Files (*.%1) OPML-Dosyaları (*.%1) Export canceled Dışarı aktarım iptal edildi Export: can't open a file Dışarı aktarım:Dosya açılamadı Unread: %1 Okunmamış: %1 All: %1 Tümü: %1 (Browser) (Tarayıcı) New News: %1 Yeni Haber: %1 Unread News: %1 Okunmamış Haber: %1 &Add &Ekle Add New Feed Yeni Haber Kaynağı Ekle &Feed... &Kaynak... F&older... &Klasör Add New Folder Yeni Klasör Ekle Open in New Tab Yeni sekmede aç &Delete... &Sil Delete Selected Feed Seçilen Kaynağı Sil &Import Feeds... İçeri Kaynak Aktar Import Feeds from OPML File OMPL tipi dosyadan kaynakları içeri aktar &Export Feeds... &Kaynakları dışarı aktar Export Feeds to OPML File Kaynakları OPML tipi dosyaya aktar E&xit Çıkış Update Feed Kaynak güncelle Update Current Feed Mevcut kaynağı güncelle Update All Tümünü güncelle Update All Feeds Tüm kaynakları güncelle Mark All Feeds Read Haberleri okundu olarak iÅŸaretle Mark Read/Unread Okundu/Okunmadı olarak iÅŸaretle Mark Current News Read/Unread Mevcut haberi okundu/okunmadı olarak iÅŸaretle Mark All News Read Tüm haberleri okundu olarak iÅŸaretle Downloads İndirmeler Clean Up... Temizlik yap... News Filters... Haber süzgeçleri Filter News... Haberi süz.. Options... Seçenekler Open Options Dialog Seçenekler diyaloÄŸunu aç Filter Feeds Kaynağı Süz Show All Hepsini Göster Show New Yenileri göster Show Unread Okunmamışları göster Show Starred Feeds Favorilere eklenmiÅŸ kaynakları göster Show Not Working Feeds Filter News Haberleri Süz Show Starred Favorilere EklenmiÅŸleri Göster Show Not Starred Favorilere eklenmemiÅŸleri göster Show Unread or Starred Favorilere eklenmiÅŸ/eklenmemiÅŸleri göster Show Last Day Dünü Göster Show Last 7 Days Son 7 Günü Göster About... Hakkında Show 'About' Dialog 'Hakkında' diyaloÄŸunu göster Check for Updates... Güncellemeleri kontrol et Report a Problem... Sorun bildir Open News Haberleri Aç Open in Browser Tarayıcıda aç Open in External Browser Dış Tarayıcıda Aç Open News in External Browser Dış Tarayıcıda Haberleri Aç Open News in New Tab Yeni sekmede aç Open in Background Tab Arkaplandaki sekmede aç Open News in Background Tab Arkaplandaki sekmede haberleri aç Star Favori Mark News Star Haberleri favorilerilere ekle Delete Sil Delete Selected News Seçilen Haberleri Sil Delete All News Tüm Haberleri Sil Delete All News from List Listeden Tüm Haberleri Sil Restore Geri Dönüştür Restore News Haberleri Geri Dönüştür Copy Link Linki kopyala Restore last deleted news Son silinen haberi geri dönüştür Mark Read Okundu/Okunmadı olarak iÅŸaretle Mark Feed Read Kaynağı Okundu Olarak İşaretle Properties Özellikler &File &Dosya Count Unread News Count All News Last Update Son Güncelleme Reset browser zoom Tarayıcı büyütecini sıfırla Print Web Page Web Sayfasını Yazdır Preview Web Page Web Sayfasını Önizle Save page in database Sayfayı veritabanında kaydet Save page in database instead of news description Confirm Delete Silmeyi Onayla Are you sure to delete selected elements? Menu Menü Add Feed... &Create Backup... S&how Menu Bar Menüyü Gö&ster Stop Update Feeds Open News Description Copy News Link Haber BaÄŸlantısını Kopyala &View &Görüntüle Fee&ds &Kaynaklar &News &Haberler &Browser Tarayıcı &Tools &Araçlar &Help &Yardım Main Toolbar Ana Åžerit Customize Toolbar Åžeriti Düzenle Main Toolbar... Ana Åžerit... Customize Toolbar... Åžeriti Biçimlendir... Feeds Toolbar... Kaynak Åžeriti... News Toolbar... Haber Åžeriti... Lock Toolbar Åžeriti kitle Hide Toolbar Åžeriti Gizle Layout Classic Klasik Newspaper Gazete Application Style Uygulamanın Tarzı System Sistem System2 Sistem2 Green YeÅŸil Orange Turuncu Purple Mor Pink Pembe Gray Gri Browser Position Tarayıcı konumu Top Üst Bottom Alt Right SaÄŸ Left Sol Show Window Pencereyi göster Previous Feed Önceki kaynak Next Feed Sonraki kaynak Previous News Önceki kaynak Next News Sonraki kaynak News Page Up News Page Down Next Unread News Sonraki Okunmamış Haberler Previous Unread News Önceki Okunmamış Haberler Switch Focus to Next Panel Sonraki Panele Odak GeçiÅŸ Switch Focus to Next Panel (Tree Feeds, List News, Browser) Sonraki Panele Odak GeçiÅŸ (Kaynaklar AÄŸacı,Haberler Listesi,Tarayıcı) Switch Focus to Previous Panel Önceki Panele Odak GeçiÅŸ Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Önceki Panele Odak GeçiÅŸ (Kaynaklar AÄŸacı,Haberler Listesi,Tarayıcı) Show/Hide Tree Feeds Kaynak aÄŸacını göster/gizle Minimize to Tray Tepsiye küçült Minimize Application to Tray Uygulamayı tepsiye küçült Columns Kolonlar Show Indentation Paragrafbaşını Göster Search Feed Kaynak ara Zoom Büyüteç Zoom In YakınlaÅŸ Zoom in in browser Tarayıcıda yakınlaÅŸ Zoom Out UzaklaÅŸ Zoom out in browser Tarayıcıda uzaklaÅŸ 100% %100 Print... Yazdır... Print Preview... Önizlemeyi Yazdır... Page up (Browser) Page down (Browser) Save As... Farklı Kaydet... Save Page As... Sayfayı Farklı Kaydet... Show/Hide Göster/Gizle Feeds Toolbar Kaynak Åžeriti News Toolbar Haber Åžeriti Browser Toolbar Tarayıcı Åžeriti Panel Categories Panel Kategorileri Status Bar Full Screen Tam Ekran Stay On Top Her zaman üstte Categories Kategoriler Label Etiket Show labels menu Close Tab Sekmeyi kapat Close Other Tabs DiÄŸer sekmeleri kapat Close All Tabs Tüm sekmeleri kapat Switch to next tab DiÄŸer sekmeye geç Switch to previous tab Önceki sekmeye geç Unread Okunmamış Starred Favoriler Deleted SilinmiÅŸ Labels Etiketler Decrease news list/increase browser Haber listesini azalt/tarayıcıyı artır Increase news list/decrease browser Haber listesini artır/Tarayıcıyı azalt Find Bul Open Homepage Feed Anasayfa Kaynaklarını Aç Sort by Name Collapse All Folders Tüm klasörleri kapat Expand All Folders Tüm klasörleri aç Next Folder Sonraki klasör Previous Folder Önceki klasör Expand Folder Klasörü geniÅŸlet Setting Page: Labels Share PaylaÅŸ Sort By Sıralama kriteri Ascending Yükselen Descending Alçalan Check for updates Güncellemeleri kontrol et A new version of QuiteRSS... QuiteRSS'nin yeni sürümü Loading... Yükleniyor Web Page Web Sayfası Save As Farklı Kaydet HTML-Files (*.%1) HTML-Dosyaları (*.%1) Text files (*.%2) Metin dosyaları (*.%2) Save As: can't open a file Farklı Kaydet:Dosya açılamadı Choose Directory Dizin Seç Important Önemli Work İş Personal KiÅŸisel To Do Yapılacak Later Sonra Amusingly Keyif verici NetworkManager SSL Certificate Error! SSL Sertifika Hatası! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Organizasyon:</b> <b>Domain Name: </b> <b>Alan Adı: </b> <b>Expiration Date: </b> <b>Error: </b> <b>Hata: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters Haber süzgeçleri Feeds Kaynaklar Filter Name Süzgeç Adı New... Yeni... Edit... Düzenle... Delete... Sil... Move up Yukarı taşı Move down AÅŸağı taşı Run Filter Süzgeci Çalıştır Delete Filter Süzgeci sil Are you sure you want to delete the filter '%1'? NewsHeader Icon Feed Kaynak Simgesi Title BaÅŸlık Published Tarih Received Alınan Author Yazar Category Kategori Read Oku Star Favori Label Etiket Feed Title Kaynak BaÅŸlığı Link Adres NewsItem Mark Read/Unread Okundu/Okunmadı olarak iÅŸaretle Delete News Haberi Sil NewsTabWidget Loading... (%p%) (%p%) yükleniyor... Home Ev Open Page in External Browser Dış Tarayıcıda Sayfayı Aç Open Link in External Browser Dış Tarayıcıda Linki Aç Open Link Linki aç Open in New Tab Yeni sekmede aç Save Link... Linki kaydet... Save Image... Resmi kaydet... Copy Link Linki kopyala Copy Kopyala Go Back Geri git Go Forward İleri git Stop Dur Reload Yeniden yükle Copy Image Resmi Kopyala Copy Image Address Resim Adreslerini Kopyala Load Images Resimleri yükle Auto Load Images to News View No Load Images No Load Images to News View Close Tab Sekmeyi kapat Auto Load Images in News View Don't Load Images Don't Load Images in News View Comments Yorumlar Author: %1 Yazar: %1 audio ses video video media medya Link to BaÄŸla Mark Read/Unread Okundu/Okunmadı olarak iÅŸaretle Mark News Star Haberi Favorilere Ekle Label Etiket Share PaylaÅŸ Open News in External Browser Delete Sil NotificationWidget Close Kapat Mark All News Read Tüm haberleri okundu olarak iÅŸaretle Previous Page Önceki Sayfa Next Page Sonraki Sayfa Incoming News: %1 Gelen Haberler : %1 Page %1 of %2 Sayfa %1 of %2 OptionsDialog Options Seçenekler General Genel System Tray Simge durumunda küçültme Network Connections AÄŸ baÄŸlantıları Browser Tarayıcı Feeds Kaynaklar Labels Etiketler Notifications Uyarılar Passwords Åžifreler Language Dil Fonts & Colors Yazı tipi & Renkler Keyboard Shortcuts Klavye kısayolları Warning: key is already assigned to Uyarı: Anahtar zaten ÅŸuraya atınmış Show splash screen on startup BaÅŸlarken açılış ekranını göster Reopen last opened feeds on startup Açılışta en son açık kaynakları tekrar aç Open new tab next to active Yakındaki aktiviteyi yeni sekmede aç Hide feeds tree when opening tabs Sekme açılınca kaynaklar aÄŸacını gizle Show default rss-icon instead of favourite one Favorilerden birinin yerine varsayılan rss-simgesini göster Automatically collapse folders Klasörleri otomatik daralt Show close button on tab Automatically check for updates Güncellemeleri otomatik kontrol et Help improve QuiteRSS by sending usage information Store a DB in memory (requires program restart) Ram'deki bilgiyi veritabanına kaydet ( programın yeniden baÅŸlamasını gerektirir ) Save DB stored in memory to file every minutes dakika Run QuiteRSS at Windows startup Windows açılışında QuiteRSS'yi çalıştır Show system tray icon Simge durumunda küçültülmüş simgeyi göster starting QuiteRSS QuiteRSS baÅŸlıyor minimizing QuiteRSS QuiteRSS simge durumuna küçült closing QuiteRSS QuiteRSS Show static icon Sabit simge olarak göster Change icon for incoming new news Gelen yeni haberler için simfeyi deÄŸiÅŸtir Show count of new news Yeni haberlerin sayısını göster Show count of unread news Okunmamış haberlerin sayısını göster Single click instead of double click for show window Ana pencereyi göstermek için çift tıklamak yerine tek tıklama Empty working set on minimize to tray BoÅŸ vaktinde simge durumunda küçült Move to the system tray when: Åžu vakitte simge durumuna küçült: Tray icon behavior: Bildirim simgesi davranışları: Direct connection to the Internet İnternete direk baÄŸlı System proxy configuration (if available) Sistem proxy ayarları ( eÄŸer mevcutsa) Manual proxy configuration: El ile proxy (vekil sunucu) yapılandırması: Proxy server: Proxy ( Vekil ) sunucu: Port: BaÄŸlantı noktası: Username: Kullanıcı adı: Password: Åžifre: Request timeout: Number of requests: Number of retries: Options network requests when updating feeds (requires program restart): Kaynak güncellendiÄŸindeki internet isteÄŸi seçenekleri ( Programı yeniden baÅŸlatmak gerekiyor) Use embedded browser Gömülü tarayıcıyı kullan Use external browser Dış Tarayıcıyı Kullan Default external browser Varsayılan dış tarayıcı Following external browser: Sıradaki dış tarayıcı: Browse... Göz at... Load images Resimleri yükle Enable JavaScript JavaSciript aktif Enable plug-ins Eklentiler aktif Open links in embedded browser in background Arka planda gömülü tarayıcıda linkleri aç Open links in external browser in background (experimental) Dış tarayıcıda arkaplanda linkleri aç (Henüz deney halinde) Default zoom on pages: Browser selection: Tarayıcı seçimi: External browser: Dış Tarayıcı: Content: İçerik: User style sheet: Kullanıcı stil levhası: Maximum pages in cache Önbelleklerdeki azami sayfa sayısı: Store cache in: Önbellekte saklanacak: Maximum size of disk cache Disk önbelleÄŸindeki azami boyut MB MB Use disk cache Disk önbelleÄŸini kullan Allow local data to be set Ayarlanacak yerel verilere izin ver Keep local data only until quit application Uygulamadan çıkana kadar sadece yerel verileri koru Block sites from setting any data Herhangi bir ayar verisinden gelen siteleri engelle Clear Temizle Cookies: Çerezler: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Sayfadaki flash uygulamasının otoyüklemesi engellendi.Flash simgesine tıklayarak elle bu uygulamayı baÅŸlatabilirsiniz. Use Click to Flash ClicktoFlash'ı kullan Add... Ekle... Remove... Sil... Ask where to save each file before downloading İndirmeden önce her dosyanın nereye kaydedileceÄŸini sor Download location: İndirme yeri: History GeçmiÅŸ Click to Flash Flash'a tıkla Downloads İndirmeler Automatically update the feeds on startup BaÅŸlarken kaynakları otomatik güncelle Automatically update the feeds every Kaynakları otomatik güncelleme sıklığı her : seconds saniye hours saat Nothing to do Hiçbir ÅŸey yapma Dec Açıklama December Aralık Display format for date: Tarih için format görüntüle time: zaman Alternating row background colors Satır arkaplanlarına alternatif renkler Simplified representation of date and time Tarih ve zamanın basitleÅŸtirilmiÅŸ temsilisi Show All Tümünü Göster Show New Yenileri göster Show Unread Okunmamışları göster Show Starred Favorilere EklenmiÅŸleri Göster Show Not Starred Favorilere eklenmemiÅŸleri göster Show Unread or Starred Favorilere eklenmiÅŸ/eklenmemiÅŸleri göster Show Last Day Dünü Göster Show Last 7 Days Son 7 Günün Göster Style sheet for news: Mark news as read: Haberleri okundu olarak iÅŸaretle on selecting. With timeout seçilen.Zaman aşımı after switching to another news diÄŸer habere geçtikten sonra Mark displayed news as read when switching feeds BaÅŸka habere geçince görüntülendi olarak iÅŸaretle Mark displayed news as read when closing tab Ekranı kapatınca görüntülendi olarak iÅŸaretle Mark displayed news as read on minimize Ekranı küçültünce görüntülendi olarak iÅŸaretle Change behavior of action 'Next Unread News' 'Sonraki Okunmamış Haberleri' eyleminin davranışını deÄŸiÅŸtir starred news FavorilenmiÅŸ haberler labeled news EtiketlenmiÅŸ haberler Automatically mark identical news as read Aynı haberleri otomatik olarak okunmuÅŸ say Prevent accidental deletion of: Kazara silinmiÅŸlerden korunan: Enable cleanup on shutdown Kapatılırken temizlik yapmayı aktive et Maximum age of news in days to keep: Korunacak haberin azami gün sayısı: Maximum number of news to keep: Saklanacak maksimum haber sayısı: Delete read news Okunan haberi sil Never delete unread news Okunmamış haberleri asla silme Never delete starred news Favorilere eklenmiÅŸ haberi asla silme Never delete labeled news EtiketlenmiÅŸ haberleri asla silme Clean up 'Deleted' 'SilinmiÅŸler'i temizle Enable DB optimization (slower shutdown) Veritabanı optimizasyonu aktif et (YavaÅŸ kapanır) Reading Okunan Clean Up Temizlik yap New... Yeni... Edit... Düzenle... Delete... Sil... Move up Yukarı taşı Move down AÅŸağı taşı Show when inactive main window Screen Ekran Transparency Saydamlık Show titles feeds Kaynakların baÅŸlıklarını göster Show icon feed Kaynak simgesini göster Show button 'Mark All News Read' 'Tüm Haberleri Oku' butonunu göster Show button 'Mark Read/Unread' 'Okundu/Okunmadı' butonunu göster Show button 'Open in External Browser' Show button 'Delete News' 'Haberi Sil! butonunu göster Play sound for incoming new news Yeni haber gelirken ses çal Play Oynat Display notification for incoming news Gelen haberler için uyarı bildirimi göster Top Left Sol Üst Top Right SaÄŸ Üst Bottom Left Sol Alt Bottom Right SaÄŸ Alt Review Önizleme Position Konum Show maximum of Gösterilecek azami sayı item on page notification Width list items pixels pikseller Close notification after Uyarı ekranını 'dan sonra kapat Do not show notification in fullscreen mode Tam ekran yürütmelerde bildirim alma Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Yanlızca seçili kaynakları göster: Notification Bildirim Sound Ses Selection of feeds Seçilen kaynaklar All Feeds Tüm Kaynaklar Site Site User Kullanıcı Password Åžifre Delete Sil Delete All Tümünü Sil Show Passwords Åžifreleri Göster Version Versiyon Author Yazar Contact İletiÅŸim Choose language: Dil seçimi: Type Tip Font Yazı tipi Feeds list font Kaynaklar için yazı tipi listesi News list font Haberler için yazı tipi listesi News title font Haber baÅŸlığı yazı tipi News text font Haber yazısı yazı tipi Notification font Uyarılar için yazı tipi Change... DeÄŸiÅŸtir... Reset Varsayılan ayarlara geri dön Feeds list color Kaynaklar listesi rengi Feeds list background Kaynaklar listesi arkaplanı News list color Haber listesi rengi News list background Haber listesi arkaplanı Focused news color Odaklanılmış haber rengi Focused news background color Odaklanılmış haber arkaplanları rengi Link color BaÄŸlantı rengi Title color BaÅŸlık rengi Date color Tarih rengi Author color Yazar rengi News text color Haber metin rengi News title background Haber baÅŸlığı arkaplanı News background Haber arkaplanı Feed with new news Yeni haberlerle besle Count of unread news in feeds tree Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view Text color of new news Show feeds tree toggle Clear new status when minimize to tray Set focus on the last opened news Set focus at the top of news list Set focus on the unread news Open the news Haberleri aç Default news filter: Varsayılan haber süzgeci Action on feed opening: Show news description instead of loading web page Text color of unread news Focused feed color Focused feed background color Standard Standart Fixed DüzeltilmiÅŸ Serif Serif Sans Serif Sans Serif Cursive Cursive Fantasy Fantasy Default font size Varsayılan yazı boyutu Fixed font size DüzeltilmiÅŸ yazı boyutu Minimum font size Asgari yazı boyutu Minimum logical font size Asgari mantıklı yazı boyutu Font families: Yazı tipi aileleri: Font sizes: Yazı boyutu: Fonts Yazı tipleri Fonts Browser Yazı Tipi Tarayıcısı: Colors Renkler Filter Süzgeç Action Eylem Description Tanım Shortcut Kısayol Shortcut: Kısayol: Open File... Dosya aç... Select Style Sheet File Levha Dosyasının Tarzını Seç Open Directory... Rehberi Aç... Add site to whitelist Aklanmışlar listesine site ekle Site without 'http://' (ex. youtube.com) 'http://' öneksiz site ekle (Örn. youtube.com) QAbstractSpinBox &Step up &Yukarı taşı Step &down &AÅŸağı taşı &Select All &Tümünü seç QDialogButtonBox Close Kapat Cancel İptal &Yes &Evet &No &Hayır QFtp Not connected BaÄŸlanılmadı Host %1 not found Hostta %1 bulunamadı Connection refused to host %1 Host'a baÄŸlanma iptal edildi %1 Connection timed out to host %1 BaÄŸlantı zaman aşımına uÄŸradı %1 Connected to host %1 Hosta baÄŸlanıldı %1 Connection refused for data connection Veri baÄŸlantısı için baÄŸlantı iptal edildi Unknown error Bilinmeyen hata Connecting to host failed: %1 Hosta baÄŸlantı iptal edildi : %1 Login failed: %1 GiriÅŸ iptal edildi: %1 Listing directory failed: %1 Dizinleme listesi iptal edildi: %1 Changing directory failed: %1 Dizin deÄŸiÅŸimi iptal edildi: %1 Downloading file failed: %1 Dosya indirimi iptal edildi: %1 Uploading file failed: %1 Dosya yükleme iptal edildi: %1 Removing file failed: %1 Dosya silinmesi iptal edildi: %1 Creating directory failed: %1 Dizin oluÅŸumu iptal edildi: %1 Removing directory failed: %1 Dizin silimi iptal edildi: %1 Connection closed BaÄŸlantı kapatıldı QLineEdit &Undo &Geri al &Redo &Tekrar yap Cu&t &Kes &Copy &Kopyala &Paste &Yapıştır Delete Sil Select All Tümünü seç QMultiInputContext Select IM IM seç QObject Cannot start external program Dışsal program baÅŸlatılamıyor Cannot start external program! %1 Dışsal program baÅŸlatılamıyor! %1 Error Hata QTextControl &Undo &Geri al &Redo &Tekrar yap Cu&t &Kes &Copy &Kopyala &Paste &Yapıştır Delete Sil Select All Tümünü seç Copy &Link Location &Linki kopyala QWizard Cancel İptal < &Back < &Geri git &Finish &Bitir &Next > &İleri git > RSSDetectionWidget Untitled feed BaÅŸlıksız kaynak RequestFeed Server requires authentication! Server replied: Not Found! Redirect error! Yönlendirme hatası! Request timeout! SQLiteDriver Error opening database Veritabanı açılma hatası Error closing database Veritabanı kapanma hatası Unable to begin transaction Unable to commit transaction Unable to rollback transaction SQLiteResult Unable to fetch row No query Sorgusuz Unable to execute statement Unable to execute multiple statements at a time Unable to reset statement Unable to bind parameters Parameter count mismatch SslErrorDialog SSL Certificate Error! SSL Sertifika Hatası! Only for this session Sadece bu oturum için UpdateAppDialog Check for Updates Güncellemeleri kontrol et Checking for updates... Güncelleme Kontrol Ediliyor... Loading history... GeçmiÅŸ Yükleniyor... Don't remind about this version Bu sürümü yeniden hatırlatma &Install &Yükle You already have the latest version Zaten son sürüme sahipsiniz A new version of QuiteRSS is available! QuiteRSS'nin yeni sürümü mevcut! Click here to go to the download page İndirme sayfasına gitmek için buraya tıklayınız Your version is: Sürümünüz: Current version is: Mevcut sürümünüz: Error checking updates Güncellemeleri kontrol ederken hata oluÅŸtu quiterss-0.18.3/lang/quiterss_uk.ts000066400000000000000000006061441265173051100173450ustar00rootroot00000000000000 AboutDialog About Про програму Revision Збірка Version ВерÑÑ–Ñ QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS — кроÑплатформна програма з відкритим вихідним кодом, призначена Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ RSS/Atom новин Includes: МіÑтить: Application directory: Каталог програми: Resource directory: Каталог реÑурÑів: Data directory: Каталог даних: Backup directory: Каталог резервуваннÑ: Database file: Файл бази даних: Settings file: Файл налаштувань: Log file: Файл журналу: Authors Ðвтори History ІÑÑ‚Ð¾Ñ€Ñ–Ñ License Ð›Ñ–Ñ†ÐµÐ½Ð·Ñ–Ñ Information Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ AdBlockAddSubscriptionDialog Add Subscription Додати підпиÑку Title: Заголовок: Address: ÐдреÑа: Add new subscription to AdBlock: Додати нову підпиÑку в AdBlock: AdBlockCustomList Custom Rules КориÑтувацькі правила AdBlockDialog AdBlock Configuration ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ AdBlock Enable AdBlock Увімкнути AdBlock Search... Пошук... Options ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ AdBlock AdBlock Use only essential part of EasyList (for performance reasons) ВикориÑтовуйте лише необхідні чаÑтини EasyList (Ð´Ð»Ñ Ð¿Ñ–Ð´Ð²Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ‚Ð¸Ð²Ð½Ð¾Ñті) Add Rule Додати правило Remove Rule Вилучити правило Add Subscription Додати підпиÑку Remove Subscription Вилучити підпиÑку Update Subscriptions Оновити підпиÑки Learn about writing rules... Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ñ‰Ð¾Ð´Ð¾ ÑÑ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock дозволÑÑ” блокувати небажаний вміÑÑ‚ веб-Ñторінок AdBlock AdBlock Show AdBlock &Settings ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ AdBlock Disable on %1 Вимкнути на %1 Disable only on this page Заборонити лише на цій Ñторінці Blocked Popup Windows Заблоковані виринаючі вікна %1 with (%2) %1 з (%2) No content blocked ВідÑутні заблоковані елементи Blocked URL (AdBlock Rule) - click to edit rule СпиÑок заблокованого. ÐатиÑніть, щоб змінити правило AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! Ðе вдаєтьÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ підпиÑку! AdBlockTreeWidget Add Rule Додати правило Remove Rule Вилучити правило Add Custom Rule Додати кориÑтувацьке правило Please write your rule here: Будь лаÑка, напишіть ваше правило тут: %1 (recently updated) %1 (нещодавно оновлено) %1 (Error: %2) %1 (Помилка: %2) AddFeedWizard Add Feed Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ новин Create New Feed Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñƒ новин Use title of the feed as displayed name ВикориÑтовувати назву каналу, Ñк ім'Ñ Server requires authentication: Сервер потребує авторизації: Username: Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: Password: Пароль: Feed URL or website address: URL каналу або адреÑа веб-Ñайту: Feeds Канали новин All Feeds УÑÑ– канали New Folder... Ðова тека... Displayed name: Показуване ім'Ñ: Location: РозташуваннÑ: URL error! Помилка URL! Duplicate feed! Канал вже Ñ”! Can't find feed URL! Ðе вдалоÑÑŒ знайти URL каналу! Request failed! Запит зірвавÑÑ! AddFolderDialog Add Folder Ð”Ð¾Ð´Ð°Ð²Ð°Ð½Ð½Ñ Ñ‚ÐµÐºÐ¸ Feeds Канали новин All Feeds УÑÑ– канали Name: Ім'Ñ: Location: РозташуваннÑ: AuthenticationDialog Save password Запам'Ñтати пароль Authorization required Потрібна Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ñ–Ñ Server: Сервер: Message: ПовідомленнÑ: Username: Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: Password: Пароль: CategoriesTreeWidget Unread Ðепрочитані Starred Позначена зірочкою Deleted Вилучені Labels Мітки Open in New Tab Відкрити в новій вкладці Clear 'Deleted' ОчиÑтити 'Вилучені' Mark Read Позначити прочитаною CleanUpWizard Clean Up ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Choose Feeds Оберіть канали All Feeds УÑÑ– канали Clean Up Options Опції Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Maximum age of news in days to keep: МакÑимальний вік новин, що зберігатимутьÑÑ, днів: Maximum number of news to keep: МакÑимальна кількіÑть новин, що зберігатимутьÑÑ: Delete read news Вилучати прочитані новини Never delete unread news Ðіколи не вилучати непрочитані новини Never delete starred news Ðіколи не вилучати новини відмічені зірочкою Never delete labeled news Ðіколи не вилучати новини з мітками Clean up 'Deleted' Очищувати 'Вилучені' Purge DB Очищувати БД Totally remove records that had marked 'deleted' from DB. Ancient news could reappear ПовніÑтю видалÑÑ” з БД запиÑи, Ñкі відмічені Ñк 'видалені'.⎠Можливо, видалені новини завантажатьÑÑ Ð·Ð½Ð¾Ð²Ñƒ Information Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Clean Up wizard deleted %1 news МайÑтер Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ð² %1 новин ClickToFlash Object blocked by ClickToFlash Об'єкт заблокований ClickToFlash Hide object Приховати об'єкт Add '%1' to whitelist Додати '%1' до білого ÑпиÑку CustomizeToolbarDialog Customize Main Toolbar ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð³Ð¾Ð»Ð¾Ð²Ð½Ð¾Ñ— панелі Customize Feeds Toolbar ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– каналів новин Customize News Toolbar ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– ÑпиÑку новин Load images Завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Separator Роздільник Icon Іконка Text ТекÑÑ‚ Text Beside Icon ТекÑÑ‚ поруч з іконкою Text Under Icon ТекÑÑ‚ під іконкою Big Великий Normal Ðормальний Small Малий Style: Стиль: Icon Size: Розмір іконки: Add Додати Remove Вилучити Move up Угору Move down Униз Default Типово DownloadItem Remaining time unavailable Ðевідомо Ñкільки чаÑу залишилоÑÑŒ Error: Cannot write to file! Помилка! Ðеможливо виконати Ð·Ð°Ð¿Ð¸Ñ Ñƒ файл! Error: Помилка: few seconds декілька Ñекунд seconds Ñекунд minutes хвилин hours годин Unknown size Ðевідомий розмір Unknown speed Ðевідома швидкіÑть %2 - unknown size (%3) %2 - невідомий розмір (%3) Remaining %1 - %2 of %3 (%4) ЗалишилоÑÑŒ %1 - %2 з %3 (%4) Cancelled - %1 Відмінено - %1 Delete file Вилучити файл Do you want to also delete downloaded file? Ви дійÑно хочете вилучити завантажений файл? Open File Відкрити файл Open Folder Відкрити теку Copy Download Link Скопіювати адреÑу Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Cancel Downloading СкаÑувати Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Remove Вилучити Cancelled Відмінено Error Помилка Not found Ðе знайдено Sorry, the file %1 was not found! Файл ⎠%1 ⎠не знайдено! DownloadManager Clear ОчиÑтити File %1 (*.%2) Файл %1 (*.%2) All Files (*.*) УÑÑ– файли (*.*) Save As... Зберегти Ñк... Executable: Ðктивні: Arguments: Ðргументи: FeedPropertiesDialog Properties ВлаÑтивоÑті General Загальні Columns Колонки Authentication Ð†Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Status Стан Title: Заголовок: Homepage: Ð”Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñторінка: Feed URL: URL каналу: Load Title Завантажити заголовок Load Favicon Завантажити Favicon Select Icon... Оберіть іконку... Select Icon Вибір іконки Disable update Вимкнути Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Automatically update every Ðвтоматичне Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ñ– seconds Ñекунд minutes хвилин hours годин Starred Позначена зірочкою Load images Завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Display in new tab on startup Показувати в новій вкладці під Ñ‡Ð°Ñ Ð·Ð°Ð¿ÑƒÑку Show news' description instead of loading web page Показувати Ð¾Ð¿Ð¸Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ заміÑть Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ±-Ñторінки Automatically delete duplicate news Ðвтоматично вилучати дублікати новин Display Показ Reading Enable JavaScript Увімкнути JavaScript Right-to-left layout Макет Ñправа наліво Ascending ЗроÑтаннÑм Descending СпаданнÑм Sort by: Сортувати за: Add Додати Remove Вилучити Move up Угору Move down Униз Default Типово Server requires authentication: Сервер потребує авторизації: Username: Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: Password: Пароль: Feeds count: КількіÑть каналів: Description: ОпиÑ: Status: Стан: Created: Створена: Last update: ОÑтаннє оновленнÑ: News count: КількіÑть новин: Good Добре Long ago ;-) Дуже давно ;-) new нових unread непрочитаних Image files Файли зображень Select Image Оберіть Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Load icon: can't open a file! Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–ÐºÐ¾Ð½ÐºÐ¸: не вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл! FilterRulesDialog Filter Rules Правила фільтрації Feeds Канали новин All Feeds УÑÑ– канали Filter name: Ім'Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ð°: Match all news Відповідає уÑім новинам Match all conditions Відповідає уÑім умовам Match any condition Відповідає будь-Ñкій умові Perform these actions: Виконати такі дії: Please enter name for the filter. Будь лаÑка, уведіть назву фільтра. Please enter search condition for the news filter. Будь лаÑка, уведіть умови пошуку Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ фільтра. FindFeed Find Name Знайти ім'Ñ Find Link Знайти поÑÐ¸Ð»Ð°Ð½Ð½Ñ FindTextContent Find in News Знайти в новинах Find in Titles Знайти в заголовках Find in Authors Знайти в авторах Find in Categories Знайти в категоріÑÑ… Find in Descriptions Знайти в опиÑах Find in Links Знайти в поÑиланнÑÑ… Find in Browser Знайти у веб-переглÑдачі FtpDownloader Canceled! СкаÑовано! ItemAction Mark News as Read Позначити прочитаною Add Star Позначити зірочкою Delete Вилучити Add Label Додати мітку Play a Sound Відтворити звук Show News in Notifier Показати новину у Ñповіщенні Browse ОглÑд Play Відтворити Add Action Додати дію Delete Action Вилучити дію Open File... Відкрити файл... ItemCondition Title Заголовок Description ÐžÐ¿Ð¸Ñ Author Ðвтор Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ State Стан Link ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ News Ðовини New Ðове Read Прочитано Starred Позначена зірочкою Add Condition Додати умову Delete Condition Вилучити умову contains міÑтить doesn't contains не міÑтить is збігаєтьÑÑ Ð· isn't не збігаєтьÑÑ Ð· begins with починаєтьÑÑ Ð· ends with закінчуєтьÑÑ Ð½Ð° Regular expressions РегулÑрні вирази LabelDialog New Label Ðова мітка Load icon... Завантажити іконку... Default Типово Select color... Обрати колір... Name: Ім'Ñ: Icon: Іконка: Color text: Колір текÑту: Color background: Колір фону: Image files Файли зображень Select Image Обрати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Load icon: can't open a file! Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–ÐºÐ¾Ð½ÐºÐ¸: не вдаєтьÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ файл! MainApplication Saving data... Ð—Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ…... MainWindow &AdBlock AdBlock Hide Categories Приховати категорії Show Categories Показати категорії Select OPML-File Обрати OPML-файл OPML-Files (*.%1 *.%2) OPML-файли (*.%1 *.%2) Import canceled Ð†Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑкаÑовано Import: can't open a file ІмпортуваннÑ: неможливо відкрити файл OPML-Files (*.%1) OPML-файли (*.%1) Export canceled ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑкаÑовано Export: can't open a file ЕкÑпортуваннÑ: неможливо відкрити файл Unread: %1 Ðепрочитаних: %1 All: %1 УÑÑ–Ñ…: %1 (Browser) (Веб-переглÑдач) New News: %1 Ðових новин: %1 Unread News: %1 Ðепрочитаних новин: %1 &Add &Додати Add New Feed Додати новий канал новин &Feed... &Канал новин... F&older... &Теку... Add New Folder Додати нову теку Open in New Tab Відкрити в новій вкладці &Delete... Вилу&чити... Delete Selected Feed Вилучити канал новин &Import Feeds... &Імпортувати канали новин... Import Feeds from OPML File Імпортувати канали новин з OPML-файлу &Export Feeds... &ЕкÑпортувати канали новин... Export Feeds to OPML File ЕкÑпортувати канали новин в OPML-файл E&xit Ви&хід Update Feed Оновити канал Update Current Feed Оновити обраний канал Update All Оновити вÑе Update All Feeds Оновити вÑÑ– канали Mark All Feeds Read Позначити вÑÑ– канали прочитаними Mark Read/Unread Позначити прочитаною/непрочитаною Mark Current News Read/Unread Позначити поточну новину прочитаною/непрочитаною Mark All News Read Позначити вÑÑ– новини прочитаними Downloads Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Clean Up... ОчищеннÑ... News Filters... Фільтр новин... Filter News... Фільтр новин... Options... ÐалаштуваннÑ... Open Options Dialog Відкрити вікно налаштувань Filter Feeds Фільтр каналів новин Show All Показати вÑÑ– Show New Показати нові Show Unread Показати непрочитані Show Starred Feeds Показати канали позначені зірочкою Show Not Working Feeds Показати "мертві" канали Filter News Фільтр новин Show Starred Показати із зірочкою Show Not Starred Показати без зірочки Show Unread or Starred Показати непрочитані із зірочкою Show Last Day Показати за оÑтанній день Show Last 7 Days Показати за оÑтанні 7 днів About... Про програму... Show 'About' Dialog Показати діалог 'Про програму' Check for Updates... Перевірити наÑвніÑть оновлень... Report a Problem... Повідомити про проблему... Open News Відкрити новини Open in Browser Відкрити у веб-переглÑдачі Open in External Browser Відкрити у зовнішньому веб-переглÑдачі Open News in External Browser Відкрити новину в зовнішньому веб-переглÑдачі Open News in New Tab Відкрити новину в новій вкладці Open in Background Tab Відкрити у фоновій вкладці Open News in Background Tab Відкрити новину у фоновій вкладці Star Зірочка Mark News Star Позначити новину зіркою Delete Вилучити Delete Selected News Вилучити обрані новини Delete All News Вилучити вÑÑ– новини Delete All News from List Вилучити вÑÑ– новини у ÑпиÑку Restore Відновити Restore News Відновити новину Copy Link Копіювати адреÑу поÑÐ¸Ð»Ð°Ð½Ð½Ñ Restore last deleted news Відновити оÑтанню вилучену новину Mark Read Позначити прочитаною Mark Feed Read Позначити канал прочитаним Properties ВлаÑтивоÑті &File &Файл Count Unread News КількіÑть непрочитаних новин Count All News КількіÑть уÑÑ–Ñ… новин Last Update ОÑтаннє Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Reset browser zoom Скинути маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ñƒ веб-переглÑдачі Print Web Page Ð”Ñ€ÑƒÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð²ÐµÐ±-Ñторінки Preview Web Page Попередній оглÑд веб-Ñторінки Save page in database Зберегти Ñторінку в базі даних Save page in database instead of news description Зберегти Ñторінку в базі даних заміÑть опиÑу новини Confirm Delete ÐŸÑ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð²Ð¸Ð»ÑƒÑ‡ÐµÐ½Ð½Ñ Are you sure to delete selected elements? Ви впевнені, що бажаєте вилучити обрані елементи? Menu Меню Add Feed... Додати канал новин... &Create Backup... Створити резервну копію... S&how Menu Bar Показувати меню Stop Update Feeds Зупинити Ð¾Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² Open News Description Відкрити Ð¾Ð¿Ð¸Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ Copy News Link Копіювати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° новину &View &ВиглÑд Fee&ds &Канали новин &News &Ðовини &Browser &Веб-переглÑдач &Tools Ð&Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Help &Довідка Main Toolbar Головна панель Customize Toolbar ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– інÑтрументів Main Toolbar... Головна панель... Customize Toolbar... ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð°Ð½ÐµÐ»Ñ– інÑтрументів... Feeds Toolbar... Панель каналів новин... News Toolbar... Панель ÑпиÑку новин... Lock Toolbar Закріпити панель інÑтрументів Hide Toolbar Приховати панель інÑтрументів Layout Схема Classic КлаÑична Newspaper Газета Application Style Стиль програми System СиÑтемний System2 СиÑтемний 2 Green Зелений Orange Помаранчевий Purple Пурпурний Pink Рожевий Gray Сірий Browser Position ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Ð²ÐµÐ±-переглÑдача Top Зверху Bottom Знизу Right Праворуч Left Ліворуч Show Window Показати вікно Previous Feed Попередній канал Next Feed ÐаÑтупний канал Previous News ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð½Ð¾Ð²Ð¸Ð½Ð° Next News ÐаÑтупна новина News Page Up Сторінка новин вверх News Page Down Сторінка новин вниз Next Unread News ÐаÑтупна непрочитана новина Previous Unread News ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ð½ÐµÐ¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ð½Ð° новина Switch Focus to Next Panel Перемкнути Ñ„Ð¾ÐºÑƒÑ Ð½Ð° наÑтупну панель Switch Focus to Next Panel (Tree Feeds, List News, Browser) Перемкнути Ñ„Ð¾ÐºÑƒÑ Ð½Ð° наÑтупну панель (дерево каналів, ÑпиÑок новин, веб-переглÑдач) Switch Focus to Previous Panel Перемкнути Ñ„Ð¾ÐºÑƒÑ Ð½Ð° попередню панель Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Перемкнути Ñ„Ð¾ÐºÑƒÑ Ð½Ð° попередню панель (дерево каналів, ÑпиÑок новин, веб-переглÑдач) Show/Hide Tree Feeds Показати/приховати дерево каналів Minimize to Tray Мінімізувати до трею Minimize Application to Tray Згорнути програму до трею Columns Колонки Show Indentation Показувати відÑтуп Search Feed Пошук каналу Zoom МаÑштаб Zoom In Збільшити Zoom in in browser Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñштабу у веб-переглÑдачі Zoom Out Зменшити Zoom out in browser Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð¼Ð°Ñштабу у веб-переглÑдачі 100% 100% Print... Друк... Print Preview... Попередній переглÑд... Page up (Browser) Сторінка вгору (Веб-переглÑдач) Page down (Browser) Сторінка вниз (Веб-переглÑдач) Save As... Зберегти Ñк... Save Page As... Зберегти Ñторінку Ñк... Show/Hide Показати/приховати Feeds Toolbar Панель каналів новин News Toolbar Панель ÑпиÑку новин Browser Toolbar Панель веб-переглÑдача Panel Categories Панель категорій Status Bar РÑдок Ñтану Full Screen Ðа веÑÑŒ екран Stay On Top Поверх уÑÑ–Ñ… вікон Categories Категорії Label Мітка Show labels menu Показати меню міток Close Tab Закрити вкладку Close Other Tabs Закрити інші вкладки Close All Tabs Закрити вÑÑ– вкладки Switch to next tab Перейти до наÑтупної вкладки Switch to previous tab Перейти до попередньої вкладки Unread Ðе прочитано Starred Відмічена зірочкою Deleted Вилучені Labels Мітки Decrease news list/increase browser Ð—Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ ÑпиÑку новин/Ð·Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ Ð²ÐµÐ±-переглÑдача Increase news list/decrease browser Ð—Ð±Ñ–Ð»ÑŒÑˆÐµÐ½Ð½Ñ ÑпиÑку новин/Ð·Ð¼ÐµÐ½ÑˆÐµÐ½Ð½Ñ Ð²ÐµÐ±-переглÑдача Find Знайти Open Homepage Feed Відкрити домашню Ñторінку каналу Sort by Name Сортувати за ім'Ñм Collapse All Folders Згорнути вÑÑ– теки Expand All Folders Розгорнути вÑÑ– теки Next Folder ÐаÑтупна тека Previous Folder ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñ‚ÐµÐºÐ° Expand Folder Розгорнути теку Setting Page: Labels Сторінка налаштувань: Мітки Share ПоділитиÑÑ Sort By Сортувати за Ascending ЗроÑтаннÑм Descending СпаданнÑм Check for updates Перевірити наÑвніÑть оновлень A new version of QuiteRSS... Ðова верÑÑ–Ñ QuiteRSS... Loading... ЗавантаженнÑ... Web Page Веб-Ñторінка Save As Зберегти Ñк HTML-Files (*.%1) HTML-файли (*.%1) Text files (*.%2) ТекÑтові файли (*.%2) Save As: can't open a file Зберегти Ñк: неможливо відкрити файл Choose Directory Оберіть каталог Important Важливо Work Робота Personal ОÑобиÑте To Do Зробити Later Пізніше Amusingly Кумедне NetworkManager SSL Certificate Error! Помилка SSL Ñертифіката! The "%1" server has the following errors in the SSL certificate: Сервер "%1" має такі помилки в Ñертифікаті SSL: <b>Organization: </b> <b>ОрганізаціÑ: </b> <b>Domain Name: </b> <b>Доменне ім'Ñ: </b> <b>Expiration Date: </b> <b>Дата Ð·Ð°ÐºÑ–Ð½Ñ‡ÐµÐ½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñƒ: </b> <b>Error: </b> <b>Помилка: </b> Would you like to make an exception for this certificate? Бажаєте зробити винÑток Ð´Ð»Ñ Ñ†ÑŒÐ¾Ð³Ð¾ Ñертифіката? NewsFiltersDialog News Filters Фільтри новин Feeds Канали новин Filter Name Ім'Ñ Ñ„Ñ–Ð»ÑŒÑ‚Ñ€Ñƒ New... Створити... Edit... Редагувати... Delete... Вилучити... Move up Угору Move down Униз Run Filter ЗапуÑтити фільтр Delete Filter Вилучити фільтр Are you sure you want to delete the filter '%1'? Ви впевнені, що бажаєте вилучити фільтр '%1'? NewsHeader Icon Feed Іконка каналу Title Заголовок Published Опубліковано Received Отримано Author Ðвтор Category ÐšÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ñ–Ñ Read Прочитано Star Зірочка Label Мітка Feed Title Заголовок Ñтрічки Link ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ NewsItem Mark Read/Unread Позначити прочитаною/непрочитаною Delete News Вилучити новину NewsTabWidget Loading... (%p%) ЗавантаженнÑ... (%p%) Home Додому Open Page in External Browser Відкрити Ñторінку в зовнішньому веб-переглÑдачі Open Link in External Browser Відкрити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ зовнішньому веб-переглÑдачі Open Link Відкрити поÑÐ¸Ð»Ð°Ð½Ð½Ñ Open in New Tab Відкрити в новій вкладці Save Link... Зберегти поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñк... Save Image... Зберегти зображеннÑ... Copy Link Копіювати адреÑу поÑÐ¸Ð»Ð°Ð½Ð½Ñ Copy Копіювати Go Back Ðазад Go Forward Уперед Stop Зупинити Reload Оновити Copy Image Копіювати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Copy Image Address Копіювати адреÑу Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Load Images Завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Auto Load Images to News View Ðвтоматичне Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ No Load Images Ðе завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ No Load Images to News View Ðе завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñƒ ÑпиÑку новин Close Tab Закрити вкладку Auto Load Images in News View Ðвтоматичне Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ при переглÑді новин Don't Load Images Ðе завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Don't Load Images in News View Ðе завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ переглÑді новин Comments Коментарі Author: %1 Ðвтор: %1 audio аудіо video відео media медіа Link to ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° Mark Read/Unread Позначити прочитаною/непрочитаною Mark News Star Позначити новину зіркою Label Мітка Share ПоділитиÑÑ Open News in External Browser Відкрити новину в зовнішньому веб-переглÑдачі Delete Вилучити NotificationWidget Close Закрити Mark All News Read Позначити вÑÑ– новини прочитаними Previous Page ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка Next Page ÐаÑтупна Ñторінка Incoming News: %1 Вхідні новини: %1 Page %1 of %2 Сторінка %1 з %2 OptionsDialog Options ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ General Загальні System Tray Трей Network Connections Мережеві Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Browser Веб-переглÑдач Feeds Канали новин Labels Мітки Notifications Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Passwords Паролі Language Мова Fonts & Colors Шрифти Ñ– кольори Keyboard Shortcuts Комбінації клавіш Warning: key is already assigned to ПопередженнÑ: клавіша вже призначена на Show splash screen on startup Показати заÑтавку при запуÑку Reopen last opened feeds on startup Повторно відкрити оÑтанній відкритий канал при запуÑку Open new tab next to active Відкривати нову вкладку порÑд з активною Hide feeds tree when opening tabs Приховати дерево каналів при відкритті вкладки Show default rss-icon instead of favourite one Показувати Ñтандартну іконку Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ñ–Ð² заміÑть унікальної Automatically collapse folders Ðвтоматично згортати теки Show close button on tab Показувати кнопку Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð½Ð° вкладці Automatically check for updates Ðвтоматично перевірÑти наÑвніÑть оновлень Help improve QuiteRSS by sending usage information ÐадÑилати дані щодо викориÑтаннÑ, щоб допомогти покращити QuiteRSS Store a DB in memory (requires program restart) Зберігати БД у пам'Ñті (необхідний перезапуÑк програми) Save DB stored in memory to file every Зберігати БД із пам'Ñті у файл кожні minutes хвилин Run QuiteRSS at Windows startup ЗапуÑкати QuiteRSS при завантаженні Windows Show system tray icon Показувати іконку у треї starting QuiteRSS при завантаженні QuiteRSS minimizing QuiteRSS при мінімізації QuiteRSS closing QuiteRSS при закритті QuiteRSS Show static icon Показувати Ñтатичну іконку Change icon for incoming new news Змінювати іконку при надходженні нових новин Show count of new news Показувати кількіÑть нових новин Show count of unread news Показувати кількіÑть непрочитаних новин Single click instead of double click for show window Одине натиÑÐ½ÐµÐ½Ð½Ñ Ð·Ð°Ð¼Ñ–Ñть подвійного Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ñƒ вікна Empty working set on minimize to tray ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ð°Ð¼'Ñті при мінімізації у трей Move to the system tray when: ПоміÑтити до ÑиÑтемного трею: Tray icon behavior: Поведінка іконки у треї: Direct connection to the Internet Ðе викориÑтовувати прокÑÑ– System proxy configuration (if available) ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ– (Ñкщо Ñ”) Manual proxy configuration: Ручне Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¾ÐºÑÑ–: Proxy server: ПрокÑÑ–-Ñервер: Port: Порт: Username: Ім'Ñ ÐºÐ¾Ñ€Ð¸Ñтувача: Password: Пароль: Request timeout: Тайм-аут запиту: Number of requests: КількіÑть запитів: Number of retries: КількіÑть повторів: Options network requests when updating feeds (requires program restart): Параметри мережевих запитів при оновленні каналів (необхідний перезапуÑк програми): Use embedded browser ВикориÑтовувати вбудований веб-переглÑдач Use external browser ВикориÑтовувати зовнішній веб-переглÑдач Default external browser Типовий зовнішній веб-переглÑдач Following external browser: Такий зовнішній веб-переглÑдач: Browse... ОглÑд... Load images Завантажувати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Enable JavaScript Увімкнути JavaScript Enable plug-ins Увімкнути плаґіни Open links in embedded browser in background Відкривати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ вбудованому веб-переглÑдачі у фоновому режимі Open links in external browser in background (experimental) Відкривати поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ñƒ зовнішньому веб-переглÑдачі у фоновому режимі (екÑпериментально) Default zoom on pages: Типове маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ Ñторінки: Browser selection: Вибір веб-переглÑдача: External browser: Зовнішній веб-переглÑдач: Content: ЗміÑÑ‚: User style sheet: ВлаÑна Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ Ñтилів: Maximum pages in cache МакÑимум Ñторінок у кеші Store cache in: Зберігати кеш у: Maximum size of disk cache МакÑимальний розмір диÑкового кешу MB МБ Use disk cache ВикориÑтовувати диÑковий кеш Allow local data to be set Дозволити Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð»Ð¾ÐºÐ°Ð»ÑŒÐ½Ð¸Ñ… даних Keep local data only until quit application Зберігати локальні дані лише до Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸ Block sites from setting any data Заборонити Ñайтам зберігати локальні дані Clear ОчиÑтити Cookies: Файли Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash — плагін, Ñкий блокує автоматичне Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Flash компонентів. Ви завжди можете переглÑнути заблоковані компоненти, натиÑнувши на 'Play'. Use Click to Flash ВикориÑтовувати Click To Flash Add... Додати... Remove... Вилучити... Ask where to save each file before downloading Запитувати міÑце Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ файлу перед завантаженнÑм Download location: Ð Ð¾Ð·Ð¼Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð², Ñкі завантажуютьÑÑ: History ІÑÑ‚Ð¾Ñ€Ñ–Ñ Click to Flash Click to Flash Downloads Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Automatically update the feeds on startup Ðвтоматично оновлювати канали при запуÑку програми Automatically update the feeds every Ðвтоматично оновлювати канали кожні seconds Ñекунд hours годин Nothing to do Ðічого не робити Dec Гру December Грудень Display format for date: Формат дати: time: чаÑу: Alternating row background colors Ð§ÐµÑ€Ð³ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñƒ тла Ñ€Ñдків Simplified representation of date and time Спрощене показу дати Ñ– чаÑу Show All Показати вÑÑ– Show New Показати нові Show Unread Показати непрочитані Show Starred Показати з зірочкою Show Not Starred Показати не відмічені зірочкою Show Unread or Starred Показати непрочитані та відмічені зірочкою Show Last Day Показати за оÑтанній день Show Last 7 Days Показати за оÑтанні 7 днів Style sheet for news: Ð¢Ð°Ð±Ð»Ð¸Ñ†Ñ Ñтилів Ð´Ð»Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸: Mark news as read: Позначити прочитаною: on selecting. With timeout при виборі. Із затримкою after switching to another news піÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð½Ð° іншу новину Mark displayed news as read when switching feeds УÑÑ– новини показуютьÑÑ Ñк прочитані при перемиканні каналів Mark displayed news as read when closing tab УÑÑ– новини показуютьÑÑ Ñк прочитані при закритті вкладки Mark displayed news as read on minimize УÑÑ– новини показуютьÑÑ Ñк прочитані при мінімізації Change behavior of action 'Next Unread News' Змінити поведінку дії 'ÐаÑтупна непрочитана новина' starred news новин відмічених зірочкою labeled news новин з мітками Automatically mark identical news as read Ðвтоматично позначити однакові новини Ñк прочитані Prevent accidental deletion of: Попереджувати випадкове вилученнÑ: Enable cleanup on shutdown Увімкнути Ð¾Ñ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ завершенні Maximum age of news in days to keep: МакÑимальний вік новин, що зберігатимутьÑÑ, днів: Maximum number of news to keep: МакÑимальна кількіÑть новин, що зберігатимутьÑÑ: Delete read news Вилучати прочитані новини Never delete unread news Ðіколи не вилучати непрочитані новини Never delete starred news Ðіколи не вилучати новини відмічені зірочкою Never delete labeled news Ðіколи не вилучати новини з мітками Clean up 'Deleted' Очищувати 'Вилучені' Enable DB optimization (slower shutdown) Увімкнути оптимізацію БД (повільніше завершеннÑ) Reading Ð§Ð¸Ñ‚Ð°Ð½Ð½Ñ Clean Up ÐžÑ‡Ð¸Ñ‰ÐµÐ½Ð½Ñ New... Створити... Edit... Змінити... Delete... Вилучити... Move up Угору Move down Униз Show when inactive main window Показати при неактивноÑті головного вікна Screen Екран Transparency ПрозоріÑть Show titles feeds Показувати заголовки каналів Show icon feed Показувати іконку каналу Show button 'Mark All News Read' Показувати кнопку 'Позначити вÑÑ– новини прочитаними' Show button 'Mark Read/Unread' Показувати кнопку 'Позначити прочитаною/непрочитаною' Show button 'Open in External Browser' Показувати кнопку 'Відкрити в зовнішньому веб-переглÑдачі' Show button 'Delete News' Показувати кнопку 'Вилучити новину' Play sound for incoming new news Відтворювати звук при надходженні новин Play Відтворити Display notification for incoming news Показувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¸ надходженні новин Top Left Угорі ліворуч Top Right Угорі праворуч Bottom Left Унизу ліворуч Bottom Right Унизу праворуч Review ПереглÑд Position ÐŸÐ¾Ð·Ð¸Ñ†Ñ–Ñ Show maximum of Показувати макÑимум item on page notification елементів на Ñторінці ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Width list items Ширина ÑпиÑку елементів pixels пікÑелів Close notification after Закривати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ð¿Ñ–ÑÐ»Ñ Do not show notification in fullscreen mode Ðе показувати ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Ñƒ повноекранному режимі Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Показувати новини лише обраних каналів: Notification Ð¡Ð¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Sound Звук Selection of feeds Вибір каналів All Feeds УÑÑ– канали Site Сайт User КориÑтувач Password Пароль Delete Вилучити Delete All Вилучити вÑÑ– Show Passwords Показати паролі Version ВерÑÑ–Ñ Author Ðвтор Contact Контактна Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Choose language: Оберіть мову: Type Тип Font Шрифт Feeds list font Шрифт ÑпиÑку каналів News list font Шрифт ÑпиÑку новин News title font Шрифт заголовку новини News text font Шрифт текÑту новини Notification font Шрифт ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Change... Змінити... Reset Скинути Feeds list color Колір ÑпиÑку каналів Feeds list background Тло ÑпиÑку каналів News list color Колір ÑпиÑку новин News list background Тло ÑпиÑку новин Focused news color Колір текÑту новини під курÑором Focused news background color Колір тла новини під курÑором Link color Колір поÑÐ¸Ð»Ð°Ð½Ð½Ñ Title color Колір заголовку Date color Колір дати Author color Колір імені автора News text color Колір текÑту новини News title background Тло заголовку новини News background Тло новини Feed with new news Канали з новими новинами Count of unread news in feeds tree КількіÑть непрочитаних новин у дереві каналів Disabled feed Вимкнений канал Alternating row colors Ð§ÐµÑ€ÐµÐ´ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÑŒÐ¾Ñ€Ñ–Ð² Ñ€Ñдків Notification text color Колір текÑту ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Notification background color Колір тла ÑÐ¿Ð¾Ð²Ñ–Ñ‰ÐµÐ½Ð½Ñ Auto load images in news view Ðвтоматичне Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ при переглÑді новин Text color of new news Колір текÑту нових новин в ÑпиÑку Show feeds tree toggle Показувати перемикач дерева каналів Clear new status when minimize to tray ОчиÑтити ÑÑ‚Ð°Ñ‚ÑƒÑ Ð½Ð¾Ð²Ð¸Ñ… при мінімізації у трей Set focus on the last opened news УÑтановити Ñ„Ð¾ÐºÑƒÑ Ð½Ð° оÑтанній відкритій новині Set focus at the top of news list УÑтановити Ñ„Ð¾ÐºÑƒÑ Ð½Ð° початку ÑпиÑку новин Set focus on the unread news УÑтановити Ñ„Ð¾ÐºÑƒÑ Ð½Ð° непрочитаній новині Open the news Відкрити новину Default news filter: Типовий фільтр новин: Action on feed opening: Ð”Ñ–Ñ Ð¿Ñ€Ð¸ відкритті каналу: Show news description instead of loading web page Показати Ð¾Ð¿Ð¸Ñ Ð½Ð¾Ð²Ð¸Ð½Ð¸ заміÑть Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð²ÐµÐ±-Ñторінки Text color of unread news Колір текÑту непрочитаних новин в ÑпиÑку Focused feed color Колір текÑту Ñтрічки під курÑором Focused feed background color Колір Ñтрічки під курÑором Standard Стандартний Fixed ФікÑований Serif Із зарубками Sans Serif Без зарубок Cursive КурÑив Fantasy Моноширинний Default font size Типовий розмір шрифту Fixed font size ФікÑований розмір шрифту Minimum font size Мінімальний розмір шрифту Minimum logical font size Мінімальний логічний розмір шрифту Font families: СімейÑтво шрифтів: Font sizes: Розміри шрифтів: Fonts Шрифти Fonts Browser Шрифти веб-переглÑдача Colors Кольори Filter Фільтр Action Ð”Ñ–Ñ Description ÐžÐ¿Ð¸Ñ Shortcut Комбінації клавіш Shortcut: Комбінації клавіш: Open File... Відкрити файл... Select Style Sheet File Оберіть файл таблиці Ñтилів Open Directory... Відкрити каталог... Add site to whitelist Додати Ñайт у білий ÑпиÑок Site without 'http://' (ex. youtube.com) Сайт без 'http://' (наприклад, youtube.com) QAbstractSpinBox &Step up Крок угор&у Step &down Крок уни&з &Select All Виділити в&ÑÑ– QDialogButtonBox Close Закрити Cancel СкаÑувати &Yes &Так &No &ÐÑ– QFtp Not connected З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ðµ вÑтановлено Host %1 not found Вузол %1 не знайдено Connection refused to host %1 У з'єднанні з вузлом %1 відмовлено Connection timed out to host %1 Ð§Ð°Ñ Ð½Ð° з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· вузлом %1 вичерпано Connected to host %1 УÑтановлено з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ñ–Ð· вузлом %1 Connection refused for data connection Відмовлено у з'єднанні Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ñ– даних Unknown error Ðевідома помилка Connecting to host failed: %1 Ðе вдалоÑÑ Ð·'єднатиÑÑ Ð· вузлом :⎠%1 Login failed: %1 Ðе вдалоÑÑ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·ÑƒÐ²Ð°Ñ‚Ð¸ÑÑ:⎠%1 Listing directory failed: %1 Ðе вдалоÑÑ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñ‚Ð°Ñ‚Ð¸ каталог:⎠%1 Changing directory failed: %1 Ðе вдалоÑÑ Ð·Ð¼Ñ–Ð½Ð¸Ñ‚Ð¸ каталог:⎠%1 Downloading file failed: %1 Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл:⎠%1 Uploading file failed: %1 Ðе вдалоÑÑ Ð²Ð¸Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл:⎠%1 Removing file failed: %1 Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ файл:⎠%1 Creating directory failed: %1 Ðе вдалоÑÑ Ñтворити каталог:⎠%1 Removing directory failed: %1 Ðе вдалоÑÑ Ð²Ð¸Ð´Ð°Ð»Ð¸Ñ‚Ð¸ каталог:⎠%1 Connection closed З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð°ÐºÑ€Ð¸Ñ‚Ð¾ QLineEdit &Undo С&каÑувати дію &Redo П&овторити дію Cu&t Ð’&ирізати &Copy &Копіювати &Paste &Ð’Ñтавити Delete Вилучити Select All Виділити вÑе QMultiInputContext Select IM Обрати режим Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ QObject Cannot start external program Ðе вдаєтьÑÑ Ð·Ð°Ð¿ÑƒÑтити зовнішню програму Cannot start external program! %1 Ðе вдаєтьÑÑ Ð·Ð°Ð¿ÑƒÑтити зовнішню програму! %1 Error Помилка QTextControl &Undo С&каÑувати дію &Redo П&овторити дію Cu&t Ð’&ирізати &Copy &Копіювати &Paste &Ð’Ñтавити Delete Вилучити Select All Виділити вÑе Copy &Link Location Копіювати &адреÑу поÑÐ¸Ð»Ð°Ð½Ð½Ñ QWizard Cancel СкаÑувати < &Back < Ðа&зад &Finish Завер&шити &Next > Упере&д > RSSDetectionWidget Untitled feed Канал без імені RequestFeed Server requires authentication! Сервер потребує авторизації! Server replied: Not Found! Сервер відповів: Ðе знайдено! Redirect error! Помилка переадреÑації! Request timeout! Тайм-аут запиту! SQLiteDriver Error opening database Помилка Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð±Ð°Ð·Ð¸ даних Error closing database Помилка Ð·Ð°ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð±Ð°Ð·Ð¸ даних Unable to begin transaction Ðеможливо почати транзакцію Unable to commit transaction Ðеможливо виконати транзакцію Unable to rollback transaction Ðеможливо відмінити транзакцію SQLiteResult Unable to fetch row Ðеможливо отримати Ñ€Ñдок No query ВідÑутній запит Unable to execute statement Ðеможливо виконати запит Unable to execute multiple statements at a time Ðеможливо виконати декілька запитів за раз Unable to reset statement Ðеможливо Ñкинути запит Unable to bind parameters Ðеможливо ÑпівÑтавити параметри Parameter count mismatch КількіÑть параметрів не збігаєтьÑÑ SslErrorDialog SSL Certificate Error! Помилка SSL Ñертифіката! Only for this session Лише Ð´Ð»Ñ Ñ†Ñ–Ñ”Ñ— ÑеÑÑ–Ñ— UpdateAppDialog Check for Updates Перевірити наÑвніÑть оновлень Checking for updates... Перевірка наÑвноÑті оновлень... Loading history... Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–Ñторії... Don't remind about this version Ðе нагадувати про цю верÑÑ–ÑŽ &Install &УÑтановити You already have the latest version Ви викориÑтовуєте оÑтанню верÑÑ–ÑŽ A new version of QuiteRSS is available! ДоÑтупна нова верÑÑ–Ñ QuiteRSS! Click here to go to the download page ÐатиÑніть тут, щоб перейти на Ñторінку Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Your version is: Ваша верÑÑ–Ñ: Current version is: Поточна верÑÑ–Ñ: Error checking updates Помилка при перевірці оновлень quiterss-0.18.3/lang/quiterss_vi.ts000066400000000000000000005512001265173051100173340ustar00rootroot00000000000000 AboutDialog About Giá»›i thiệu Revision Trước đó Version Phiên bản QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS là má»™t chương trình mã nguồn-mở và Ä‘a-ná»n tảng để Ä‘á»c các tin tức dạng RSS/Atom Includes: Bao gồm: Application directory: Resource directory: Data directory: Backup directory: Database file: Settings file: Log file: Authors Tác giả History Các phiên bản trước License Bản quyá»n Information AdBlockAddSubscriptionDialog Add Subscription Title: Tiêu Ä‘á»: Address: Add new subscription to AdBlock: AdBlockCustomList Custom Rules AdBlockDialog AdBlock Configuration Enable AdBlock Search... Options Tùy chá»n AdBlock Use only essential part of EasyList (for performance reasons) Add Rule Remove Rule Add Subscription Remove Subscription Update Subscriptions Learn about writing rules... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock Show AdBlock &Settings Disable on %1 Disable only on this page Blocked Popup Windows %1 with (%2) No content blocked Blocked URL (AdBlock Rule) - click to edit rule AdBlockManager EasyList AdBlockSubscription Cannot load subscription! AdBlockTreeWidget Add Rule Remove Rule Add Custom Rule Please write your rule here: %1 (recently updated) %1 (Error: %2) AddFeedWizard Add Feed Thêm Feed Create New Feed Tạo Feed má»›i Use title of the feed as displayed name Sá»­ dụng tiêu đỠcá»§a Feed như là tên hiển thị Server requires authentication: Yêu cầu xác nhận từ server: Username: Tên ngưá»i dùng: Password: Mật khẩu: Feed URL or website address: ÄÆ°á»ng dẫn cá»§a Feed hoặc địa chỉ website: Feeds Feed All Feeds Tất cả Feed New Folder... Thư mục má»›i... Displayed name: Tên hiển thị: Location: Äịa Ä‘iểm: URL error! Lá»—i đưá»ng dẫn! Duplicate feed! Feed bị trùng! Can't find feed URL! Không tìm thấy đưá»ng dẫn cá»§a Feed! Request failed! Thất bại trong việc gá»­i yêu cầu AddFolderDialog Add Folder Thêm thư mục Feeds Feed All Feeds Tất cả Feed Name: Tên: Location: Äịa Ä‘iểm: AuthenticationDialog Save password Lưu mật khẩu Authorization required Äã yêu cầu xác nhận Server: Server: Message: Tin nhắn: Username: Tên ngưá»i dùng: Password: Mật khẩu: CategoriesTreeWidget Unread Chưa Ä‘á»c Starred ÄÆ°á»£c gắn sao Deleted Äã xóa Labels Nhãn Open in New Tab Mở trong tab má»›i Clear 'Deleted' Làm rá»—ng phần 'Äã Xóa' Mark Read CleanUpWizard Clean Up Dá»n dẹp Choose Feeds Chá»n feed All Feeds Tất cả feed Clean Up Options Tùy chá»n việc dá»n dẹp Maximum age of news in days to keep: Thá»i hạn tối Ä‘a để giữ phần tin tức lại: Maximum number of news to keep: Số lượng tối Ä‘a tin tức được giữ lại: Delete read news Xóa tin đã Ä‘á»c Never delete unread news Không bao giá» xóa tin đã Ä‘á»c Never delete starred news Không bao giá» xóa tin được gắn sao Never delete labeled news Không bao giá» xóa tin được gắn nhãn Clean up 'Deleted' Dá»n dẹp 'Äã Xóa' Purge DB Kiểm tra cÆ¡ sở dữ liệu Totally remove records that had marked 'deleted' from DB. Ancient news could reappear Loại bá» hoàn toàn các bản ghi dữ liệu được đánh dấu 'đã xóa' ra khá»i cÆ¡ sở dữ liệu. Các tin tức cÅ© có thể xuất hiện trở lại Information Clean Up wizard deleted %1 news ClickToFlash Object blocked by ClickToFlash Äối tượng bị khóa bởi ClickToFlash Hide object Ẩn đối tượng Add '%1' to whitelist Thêm '%1' vào danh sách cho phép CustomizeToolbarDialog Customize Main Toolbar Chỉnh sá»­a thanh công cụ chính Customize Feeds Toolbar Chỉnh sá»­a thanh công cụ feed Customize News Toolbar Chỉnh sá»­a thanh công cụ tin tức Load images Tải hình ảnh Separator Phân cách Icon Biểu tượng Text Văn bản Text Beside Icon Văn bản bên cạnh biểu tượng Text Under Icon Văn bản bên dưới biểu tượng Big Lá»›n Normal Bình thưá»ng Small Nhá» Style: Kiểu dáng: Icon Size: Kích thước biểu tượng: Add Thêm Remove Loại bá» Move up Di chuyển lên Move down Di chuyển xuống Default Mặc định DownloadItem Remaining time unavailable Thá»i gian còn lại hiện không sẵn có Error: Cannot write to file! Lá»—i: Không thể ghi dữ liệu vào tập tin! Error: Lá»—i: few seconds vài giây nữa seconds giây minutes phút hours giá» Unknown size Kích thước chưa rõ Unknown speed Tốc độ chưa rõ %2 - unknown size (%3) %2 - kích thước chưa rõ (%3) Remaining %1 - %2 of %3 (%4) Còn lại %1 - %2 cá»§a %3 (%4) Cancelled - %1 Äã há»§y bá» - %1 Delete file Xóa tập tin Do you want to also delete downloaded file? Open File Mở tập ti Open Folder Mở thư mục Copy Download Link Sao chép đưá»ng liên kết tải vá» Cancel Downloading Há»§y bá» việc tải vá» Remove Loại bá» Cancelled Äã há»§y bá» Error Lá»—i Not found Không tìm thấy Sorry, the file %1 was not found! Rất tiếc, tập tin %1 không được tìm thấy! DownloadManager Clear Làm rá»—ng File %1 (*.%2) Tập tin %1 (*.%2) All Files (*.*) Tất cả tập tin (*.*) Save As... Lưu dưới dạng... Executable: Thi hành... Arguments: Äối số: FeedPropertiesDialog Properties Thuá»™c tính General Tổng quan Columns Cá»™t Authentication Xác nhậ Status Trạng thái Title: Tiêu Ä‘á»: Homepage: Trang chá»§: Feed URL: Feed URL: Load Title Tải tiêu đỠLoad Favicon Tải Favicon Select Icon... Chá»n biểu tượng... Select Icon Chá»n biểu tượng Disable update Automatically update every Tá»± động cập nhật má»—i seconds giây minutes phút hours giá» Starred Äã gắn sao Load images Tải hình ảnh Display in new tab on startup Hiển thị trong tab má»›i khi khởi động Show news' description instead of loading web page Hiển thị mô tả vá» tin tức thay vì tải trang web Automatically delete duplicate news Tá»± động xóa các tin tức trùng nhau Display Reading Enable JavaScript Right-to-left layout Ascending Tăng dần Descending Giảm dần Sort by: Sắp xếp theo: Add Thêm Remove Loại bá» Move up Di chuyển lên Move down Di chuyển xuống Default Mặc định Server requires authentication: Yêu cầu xác nhận từ server: Username: Tên ngưá»i dùng: Password: Mật khẩu: Feeds count: Description: Mô tả Status: Trạng thái: Created: ÄÆ°á»£c tạo: Last update: Lần cập nhật cuối: News count: Số lượng tin: Good Tốt Long ago ;-) Xưa rồi nha diá»…m ;-) new má»›i unread chưa Ä‘á»c Image files Tập tin hình ảnh Select Image Chá»n hình ảnh Load icon: can't open a file! Tải biểu tượng: không thể mở tập tin! FilterRulesDialog Filter Rules Nguyên tắc lá»c Feeds Feed All Feeds Tất cả Feed Filter name: Tên bá»™ lá»c: Match all news Khá»›p vá»›i tất cả các tin Match all conditions Khá»›p vá»›i tất cả Ä‘iá»u kiện Match any condition Khá»›p vá»›i bất kỳ Ä‘iá»u kiện nào Perform these actions: Thể hiện những thao tác: Please enter name for the filter. Äiá»n vào tên cho bá»™ lá»c. Please enter search condition for the news filter. Äiá»n vào Ä‘iá»u kiện tìm kiếm đối vá»›i bá»™ lá»c tin. FindFeed Find Name Tìm tên Find Link Tìm liên kết FindTextContent Find in News Tìm kiếm trong tin tức Find in Titles Find in Authors Find in Categories Find in Descriptions Find in Links Find in Browser Tìm trong trình duyệt FtpDownloader Canceled! Äã há»§y bá»! ItemAction Mark News as Read Äánh dấu tin thành đã Ä‘á»c Add Star Thêm ngôi sao Delete Xóa Add Label Thêm nhãn Play a Sound Show News in Notifier Browse Play Add Action Thêm thao tác Delete Action Xóa thao tác Open File... Mở tập tin... ItemCondition Title Tiêu đỠDescription Mô tả Author Tác giả Category Phân loại State Trạng thái Link News New Má»›i Read Äá»c Starred Äã gắn sao Add Condition Thêm Ä‘iá»u kiện Delete Condition Xóa Ä‘iá»u kiện contains chứa doesn't contains không chứa is là isn't không là begins with bắt đầu vá»›i ends with tận cùng là Regular expressions LabelDialog New Label Nhãn má»›i Load icon... Tải biểu tượng... Default Mặc định Select color... Chá»n màu sắc... Name: Tên: Icon: Biểu tượng: Color text: Màu văn bản: Color background: Màu ná»n: Image files Tập tin hình ảnh Select Image Tải hình ảnh Load icon: can't open a file! Tải biểu tượng: không thể mở tập tin! MainApplication Saving data... MainWindow &AdBlock Hide Categories Ẩn phân loại Show Categories Hiển thị phân loại Select OPML-File Chá»n Tập tin-OPML OPML-Files (*.%1 *.%2) OPML-Files (*.%1 *.%2) Import canceled Há»§y bá» nhập dữ liệu Import: can't open a file Nhập dữ liệu: không thể mở tập tin OPML-Files (*.%1) OPML-Files (*.%1) Export canceled Há»§y bá» xuất dữ liệu Export: can't open a file Xuất dữ liệu: không thể mở tập tin Unread: %1 Chưa Ä‘á»c: %1 All: %1 Tất cả: %1 (Browser) New News: %1 Tin má»›i: %1 Unread News: %1 Tin chưa Ä‘á»c: %1 &Add Th&êm Add New Feed Thêm Feed má»›i &Feed... &Feed... F&older... T&hư mục... Add New Folder Thêm thư mục má»›i Open in New Tab &Delete... &Xóa... Delete Selected Feed Xóa những Feed đã chá»n &Import Feeds... &Nhập dữ liệu từ Feed... Import Feeds from OPML File Nhập dữ liệu Feed từ tập tin OPML &Export Feeds... &Xuất dữ liệu Feed... Export Feeds to OPML File Xuất dữ liệu từ Feed sang tập tin OPML E&xit T&hoát Update Feed Cập nhật Feed Update Current Feed Cập nhật Feed hiện tại Update All Cập nhật tất cả Update All Feeds Cập nhật tất cả Feed Mark All Feeds Read Äánh dấu tất cả các Feed thành đã Ä‘á»c Mark Read/Unread Äánh dấu đã Ä‘á»c/chưa Ä‘á»c Mark Current News Read/Unread Äánh dấu tin tức hiện tại đã Ä‘á»c/chưa Ä‘á»c Mark All News Read Äánh dấu tất cả các tin tức thành đã Ä‘á»c Downloads Tải vá» Clean Up... Dá»n dẹp... News Filters... Bá»™ lá»c tin tức... Filter News... Lá»c tin tức... Options... Tùy chá»n... Open Options Dialog Mở há»™p thoại tùy chá»n Filter Feeds Bá»™ lá»c feed Show All Hiển thị tất cả Show New Hiển thị má»›i Show Unread Hiển thị chưa Ä‘á»c Show Starred Feeds Hiển thị các Feed được gắn dấu sao Show Not Working Feeds Hiển thị các feed không hoạt động Filter News Bá»™ lá»c tin tức Show Starred Show Not Starred Show Unread or Starred Show Last Day Show Last 7 Days Hiển thị 7 ngày trước About... Dịch bởi PhanAnh... Show 'About' Dialog Hiển thị há»™p thoại 'Thông tin' Check for Updates... Kiểm tra cập nhật... Report a Problem... Báo cáo lá»—i... Open News Mở tin tức Open in Browser Mở trong Trình Duyệt Web Open in External Browser Mở trong má»™t trình duyệt web khác Open News in External Browser Mở tin tức ở trình duyệt bổ sung Open News in New Tab Mở tin tức trong má»™t tab má»›i Open in Background Tab Mở ở tab hiện tại Open News in Background Tab Mở tin tức ở tab hiện tại Star Ngôi sao Mark News Star Äánh dấu sao cho tin tức Delete Xóa Delete Selected News Xóa các tin tức đã chá»n Delete All News Xóa tất cả tin tức Delete All News from List Xóa tất cả tin tức trong danh sách Restore Khôi phục Restore News Khôi phục tin tức Copy Link Sao chép liên kết Restore last deleted news Khôi phục lại tin tức đã xóa trước đó Mark Read Äánh dấu đã Ä‘á»c Mark Feed Read Äánh dấu Feed đã Ä‘á»c Properties Thuá»™c tính &File &Tập tin Count Unread News Count All News Last Update Reset browser zoom Print Web Page Preview Web Page Save page in database Save page in database instead of news description Confirm Delete Are you sure to delete selected elements? Menu Add Feed... &Create Backup... S&how Menu Bar Stop Update Feeds Open News Description Copy News Link &View &Xem Fee&ds Fee&d &News &Tin tức &Browser Tr&ình duyệt &Tools Cô&ng cụ &Help &Trợ giúp Main Toolbar Công cụ chính Customize Toolbar Chỉnh sá»­a thanh công cụ Main Toolbar... Thanh công cụ chính... Customize Toolbar... Chỉnh sá»­a thanh công cụ... Feeds Toolbar... Thanh công cụ feed... News Toolbar... Thanh công cụ tin tức... Lock Toolbar Khóa thanh công cụ Hide Toolbar Ẩn thanh công cụ Layout Classic Newspaper Application Style Giao diện ứng dụng System Hệ thống System2 System2 Green Xanh lá Orange Vàng cam Purple Tím Pink Hồng Gray Xám Browser Position Vị trí trình duyệt Top Trên cùng Bottom Dưới cùng Right Bên phải Left Bên trái Show Window Hiển thị cá»­a sổ Previous Feed Feed trước đó Next Feed Feed tiếp theo Previous News Tin trước đó Next News Tin tiếp theo News Page Up Di chuyển trang tin lên trên News Page Down Di chuyển trang tin xuống dưới Next Unread News Tin chưa Ä‘á»c tiếp theo Previous Unread News Tin chưa Ä‘á»c trước đó Switch Focus to Next Panel Chuyển sang khung Ä‘iá»u khiển tiếp theo Switch Focus to Next Panel (Tree Feeds, List News, Browser) Chuyển sang khung Ä‘iá»u khiển tiếp theo (Cây feed, danh sách tin, trình duyệt) Switch Focus to Previous Panel Chuyển sang khung Ä‘iá»u khiển trước đó Switch Focus to Previous Panel (Tree Feeds, Browser, List News) Chuyển sang khung Ä‘iá»u khiển trước đó (cây feed, trình duyệt, danh sách tin) Show/Hide Tree Feeds Hiện/Ẩn Cây Quản Lý Feed Minimize to Tray Thu nhá» xuống khay hệ thống Minimize Application to Tray Thu nhỠứng dụng xuống khay hệ thống Columns Cá»™t Show Indentation Hiển thị định danh Search Feed Tìm kiếm feed Zoom Phóng Zoom In Phóng to Zoom in in browser Phóng to trong trình duyệt Zoom Out Phóng nhá» Zoom out in browser Phóng nhá» trong trình duyệt 100% 100% Print... In... Print Preview... Xem thá»­ bản in.. Page up (Browser) Page down (Browser) Save As... Lưu dưới dạng... Save Page As... Lưu trang dưới dạng... Show/Hide Hiện/Ẩn Feeds Toolbar Thanh công cụ Feed News Toolbar Thanh công cụ má»›i Browser Toolbar Thanh công cụ trình duyệt Panel Categories Phân loại khung Ä‘iá»u khiển Status Bar Full Screen Toàn màn hình Stay On Top Äặt ở trên cùng Categories Phân loại Label Nhãn Show labels menu Hiển thị phần nhãn tên cá»§a menu Close Tab Äóng lại tab Close Other Tabs Äóng lại các tab khác Close All Tabs Äóng lại tất cả các tab Switch to next tab Chuyển sang tab tiếp theo Switch to previous tab Chuyển vá» tab trước đó Unread Chưa Ä‘á»c Starred Deleted Äã xóa Labels Nhãn Decrease news list/increase browser Giảm danh sách tin tức/tăng trình duyệt Increase news list/decrease browser Tăng danh sách tin tức/giảm trình duyệt Find Tìm kiếm Open Homepage Feed Mở trang chá»§ feed Sort by Name Collapse All Folders Hiển thị xổ xuống tất cả thư mục Expand All Folders Mở rá»™ng tất cả thư mục Next Folder Thư mục tiếp theo Previous Folder Thư mục trước đó Expand Folder Mở rá»™ng thư mục Setting Page: Labels Trang thiết lập: Nhãn dữ liệu Share Chia sẻ Sort By Sắp xếp theo Ascending Tăng dần Descending Giảm dần Check for updates Kiểm tra cập nhật A new version of QuiteRSS... Má»™t phiên bản má»›i cá»§a QuiteRSS... Loading... Äang tải... Web Page Trang web Save As Lưu dưới dạng HTML-Files (*.%1) HTML-Files (*.%1) Text files (*.%2) Tập tin văn bản (*.%2) Save As: can't open a file Lưu dưới dạng: không thể mở được tập tin Choose Directory Important Quan trá»ng Work Công việc Personal Cá nhân To Do Cần làm Later Äể sau Amusingly Hài hước NetworkManager SSL Certificate Error! The "%1" server has the following errors in the SSL certificate: <b>Organization: </b> <b>Domain Name: </b> <b>Expiration Date: </b> <b>Error: </b> Would you like to make an exception for this certificate? NewsFiltersDialog News Filters Bá»™ lá»c tin tức Feeds Feed Filter Name New... Tạo Má»›i... Edit... Chỉnh sá»­a... Delete... Xóa... Move up Chuyển lên Move down Chuyển xuống Run Filter Lá»c dữ liệu Delete Filter Xóa bá»™ lá»c Are you sure you want to delete the filter '%1'? NewsHeader Icon Feed Biểu tượng Feed Title Tiêu đỠPublished Äã đăng Received Äã nhận Author Tác giả Category Phân loại Read Äá»c Star Ngôi sao Label Nhãn Feed Title Link Liên kết NewsItem Mark Read/Unread Äánh dấu đã Ä‘á»c/chưa Ä‘á»c Delete News NewsTabWidget Loading... (%p%) Äang tải... (%p%) Home Trang chá»§ Open Page in External Browser Hiển trị trang trong trình duyệt phụ trợ Open Link in External Browser Mở liên kết trong trình duyệt phụ trợ Open Link Mở liên kết Open in New Tab Mở trong má»™t tab má»›i Save Link... Lưu liên kết... Save Image... Lưu hình ảnh... Copy Link Sao chép liên kết Copy Sao chép Go Back Quay trở lại Go Forward Tiến vá» phía trước Stop Dừng lại Reload Tải lại Copy Image Sao chép hình ảnh Copy Image Address Sao chép địa chỉ hình ảnh Load Images Tải hình ảnh Auto Load Images to News View Tá»± động tải hình khi Ä‘ang xem tin tức No Load Images Không tải hình ảnh No Load Images to News View Close Tab Äóng lại tab Auto Load Images in News View Don't Load Images Don't Load Images in News View Comments Bình luậ Author: %1 Tác giả: %1 audio audio video video media media Link to Liên kết đến Mark Read/Unread Mark News Star Label Share Open News in External Browser Delete NotificationWidget Close Äóng lại Mark All News Read Äánh dấu tất cả các tin tức thành đã Ä‘á»c Previous Page Next Page Incoming News: %1 Các tin tức sắp tá»›i: %1 Page %1 of %2 Trang %1 cá»§a %2 OptionsDialog Options Tùy chá»n General Tổng quan System Tray Khay hệ thống Network Connections Kết nối mạng lưới Browser Trình duyệt Feeds Feed Labels Nhãn Notifications Thông báo Passwords Mật khẩu Language Ngôn ngữ Fonts & Colors Kiểu chữ & Màu sắc Keyboard Shortcuts Phím tắt Warning: key is already assigned to Cảnh báo: khóa Ä‘ang được gán cho Show splash screen on startup Hiển thị biểu tượng cá»§a chương trình khi khởi động Reopen last opened feeds on startup Mở lại feed cuối cùng được mở Open new tab next to active Mở tab má»›i ngay bên cạnh tab Ä‘ang mở Hide feeds tree when opening tabs Ẩn cây feed khi Ä‘ang mở các tab Show default rss-icon instead of favourite one Sá»­ dụng biểu tượng rss mặc định thay vì biểu tượng tá»± chá»n! Automatically collapse folders Tá»± động xổ xuống các thư mục Show close button on tab Automatically check for updates Tá»± động kiểm tra cập nhật phiên bản má»›i Help improve QuiteRSS by sending usage information Store a DB in memory (requires program restart) Lưu trữ má»™t hệ cÆ¡ sở dữ liệu trong bá»™ nhá»› (cần khởi động lại chương trình) Save DB stored in memory to file every Lưu cÆ¡ sở dữ liệu trong bá»™ nhá»› vào tập tin sau má»—i minutes phút Run QuiteRSS at Windows startup Chạy QuiteRSS khi Windows được khởi động Show system tray icon Hiển thị biểu tượng thu nhỠở khay hệ thống starting QuiteRSS Äang bắt đầu QuiteRSS minimizing QuiteRSS Ä‘ang thu nhá» QuiteRSS closing QuiteRSS Ä‘ang đóng lại QuiteRSS Show static icon Hiển thị biểu tượng tÄ©nh Change icon for incoming new news Thay đổi biểu tượng cho các tin sắp tá»›i Show count of new news Hiển thị số lượng các tin tức má»›i Show count of unread news Hiển thị số các tin tức chưa Ä‘á»c Single click instead of double click for show window Click má»™t lần chuá»™t thay vì hai để mở cá»­a sổ Empty working set on minimize to tray Làm rá»—ng thiết lập làm việc khi thu nhá» xuống khay hệ thống Move to the system tray when: Di chuyển xuống khay hệ thống khi: Tray icon behavior: Thao tác vá»›i biểu tượng ở khay hệ thống: Direct connection to the Internet Kết nối trá»±c tiếp đến internet System proxy configuration (if available) Chỉnh sá»­a thiết lập proxy trong hệ thống (nếu được) Manual proxy configuration: Chỉnh sá»­a proxy do ngưá»i dùng chá»n: Proxy server: Proxy server: Port: Cổng kết nối: Username: Tên ngưá»i dùng: Password: Mật khẩu: Request timeout: Number of requests: Number of retries: Options network requests when updating feeds (requires program restart): Tùy chá»n vá» yêu cầu mạng khi cập nhật các feed (yêu cầu khởi động lại chương trình để áp dụng): Use embedded browser Sá»­ dụng trình duyệt nhúng Use external browser Sá»­ dụng trình duyệt phụ trợ Default external browser Trình duyệt phụ trợ mặc định Following external browser: Trình duyệt phụ trợ sau đây: Browse... Duyệt tìm.. Load images Tải hình ảnh Enable JavaScript Bật JavaScript Enable plug-ins Cho phép tiện ích Open links in embedded browser in background Mở liên kết trong trình duyệt được nhúng vào cá»­a sổ ná»n Open links in external browser in background (experimental) Mở các liên kết bằng trình duyệt phục ở tab hiện tại (Ä‘ang ở chế độ thá»­ nghiệm) Default zoom on pages: Mặc định phóng to trên các trang: Browser selection: Chá»n trình duyệt: External browser: Trình duyệt phụ trợ: Content: Ná»™i dung: User style sheet: Sá»­ dụng bảng tin kiểu: Maximum pages in cache Số lượng trang tối Ä‘a trong bá»™ nhá»› đệm Store cache in: Lưu bá»™ nhá»› đệm ở: Maximum size of disk cache Kích thước tối Ä‘a cá»§a bá»™ nhá»› đệm trên đĩa MB MB Use disk cache Sá»­ dụng bá»™ nhá»› đệm cá»§a đĩa Allow local data to be set Cho phép dữ liệu hệ thống được lưu Keep local data only until quit application Chỉ giữ lại dữ liệu trên hệ thống cho đến khi đóng lại chương trình Block sites from setting any data Khóa các trang cố tình thiết lập dữ liệu lạ Clear Dá»n dẹp Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash là má»™t tiện ích chặn việc tá»± động tải lại ná»™i dung cá»§a các trang web có chứa Flash. Bạn có thể luôn luôn tá»± mình tải lại ná»™i dung bằng cách click vào biểu tượng phát ná»™i dung cá»§a Flash Use Click to Flash Sá»­ dụng Click to Flash Add... Thêm... Remove... Loại bá»... Ask where to save each file before downloading Há»i nÆ¡i lưu tập tin trước khi tải Download location: Äịa Ä‘iểm lưu phần tải vá»: History Lịch sá»­ Click to Flash Click to Flash Downloads Tải vá» Automatically update the feeds on startup Tá»± động cập nhật tin tức má»›i khi khởi động Automatically update the feeds every Tá»± động cập nhật feed má»—i seconds giây hours giá» Nothing to do Không làm gì cả Dec T12 December Tháng mưá»i hai Display format for date: Äịnh dạng hiển thị ngày tháng: time: thá»i gian: Alternating row background colors Thay thế dòng màu sắc ná»n Simplified representation of date and time Trình bày đơn giản hóa dạng ngày tháng và thá»i gian Show All Hiển thị tất cả Show New Hiển thị má»›i Show Unread Hiển thị chưa Ä‘á»c Show Starred Hiển thị đã gắn dấu sao Show Not Starred Hiển thị chưa gắn dấu sao Show Unread or Starred Hiển thị chưa Ä‘á»c hoặc đã gắn dấu sao Show Last Day Hiển thị ngày trước Show Last 7 Days Hiển thị 7 ngày trước Style sheet for news: Mark news as read: Äánh dấu tin đã Ä‘á»c: on selecting. With timeout được chá»n. Không kèm thá»i hạn after switching to another news sau khi chuyển sang tin khác Mark displayed news as read when switching feeds Äánh dấu các tin tức đã hiển thị khi Ä‘á»c khi chuyển đổi feed Mark displayed news as read when closing tab Äánh dấu các tin tức đã Ä‘á»c khi đóng lại tab Mark displayed news as read on minimize Äánh dấu các tin tức đã Ä‘á»c khi thu nhá» cá»­a sổ Change behavior of action 'Next Unread News' Thay đổi tác động cá»§a thao tác 'Tin chưa Ä‘á»c tiếp theo' starred news tin tức được gắn ngôi sao labeled news tin tức được gắn nhãn Automatically mark identical news as read Tá»± động đánh dấu các tin tức liên quan thành đã Ä‘á»c Prevent accidental deletion of: Ngăn cản việc vô tình xóa: Enable cleanup on shutdown Bật tùy chá»n dá»n dẹp khi thoát Maximum age of news in days to keep: Tuổi thá» tối Ä‘a cá»§a tin tức được giữ tính bằng ngày: Maximum number of news to keep: Số lượng tin tức tối Ä‘a được giữ: Delete read news Xóa tin đã Ä‘á»c Never delete unread news Không bao giá» xóa tin chưa Ä‘á»c Never delete starred news Không bao giá» xóa tin được đánh dấu sao Never delete labeled news Không bao giá» xóa tin được gắn nhãn Clean up 'Deleted' Dá»n dẹp 'Äã Xóa' Enable DB optimization (slower shutdown) Bật tính năng tùy chỉnh cÆ¡ sở dữ liệu (có thể chậm khi thoát chương trình) Reading Äang Ä‘á»c Clean Up Dá»n dẹp New... Má»›i... Edit... Chỉnh sá»­a... Delete... Xóa... Move up Di chuyển lên Move down Di chuyển xuống Show when inactive main window Screen Transparency Show titles feeds Show icon feed Show button 'Mark All News Read' Show button 'Mark Read/Unread' Show button 'Open in External Browser' Show button 'Delete News' Play sound for incoming new news Bật âm thanh thông báo tin tức má»›i Play Display notification for incoming news Hiển thị thông báo cho tin tức má»›i đến Top Left Tận cùng bên trái Top Right Tận cùng bên phải Bottom Left Dưới cùng bên trái Bottom Right Dưới cùng bên phải Review Xem thá»­ Position Vị trí Show maximum of Hiển thị tối Ä‘a cá»§a item on page notification Width list items pixels Ä‘iểm ảnh Close notification after Äóng lại thông báo sau khi Do not show notification in fullscreen mode Không hiển thị thông báo trong chế độ toàn màn hình Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: Chỉ hiển thị các feed được chá»n: Notification Sound Selection of feeds All Feeds Tất cả feed Site Trang User Ngưá»i dùng Password Mật khẩu Delete Xóa Delete All Xoát tất cả Show Passwords Hiển thị mật khẩu Version Phiên bản Author Tác giả Contact Liên lạc Choose language: Chá»n ngôn ngữ: Type Loại Font Kiểu chữ Feeds list font Kiểu chữ danh sách feed News list font Kiểu chữ danh sách tin tức News title font Kiểu chữ tiêu đỠtin tức News text font Kiểu chữ ná»™i dung tin tức Notification font Kiểu chữ thông báo Change... Thay đổi.. Reset Thiết đặt lại ban đầu Feeds list color Màu sắc danh sách feed Feeds list background Màu ná»n danh sách feed News list color Màu sắc danh sách tin tức News list background Màu ná»n danh sách tin tức Focused news color Màu tin tức được chú ý Focused news background color Màu ná»n tin tức được chú ý Link color Màu đưá»ng liên kết Title color Màu tiêu đỠDate color Màu ngày tháng Author color Màu tác giả News text color Màu sắc hiển thị cá»§a tin tức News title background Màu ná»n tiêu đỠtin tức News background Màu ná»n tin tức Feed with new news Feed vá»›i các tin má»›i Count of unread news in feeds tree Disabled feed Alternating row colors Notification text color Notification background color Auto load images in news view Text color of new news Show feeds tree toggle Clear new status when minimize to tray Set focus on the last opened news Set focus at the top of news list Set focus on the unread news Open the news Default news filter: Action on feed opening: Show news description instead of loading web page Text color of unread news Focused feed color Focused feed background color Standard Tiêu chuẩn Fixed Äã sá»­a Serif Kiểu chữ Serif Sans Serif Kiểu chữ Sans Serif Cursive Chữ thảo Fantasy Tưởng tượng Default font size Kích cỡ kiểu chữ mặc định Fixed font size Kích cỡ kiểu chữ đã chỉnh sá»­a Minimum font size Kích cỡ kiểu chữ nhá» nhất Minimum logical font size Kích cỡ kiểu chữ lô-gíc nhá» nhất Font families: Há» kiểu chữ: Font sizes: Kích thước kiểu chữ: Fonts Kiểu chữ Fonts Browser Kiểu chữ trên trình duyệt Colors Màu sắc Filter Bá»™ lá»c Action Thao tác Description Mô tả Shortcut Phím tắt Shortcut: Phím tắt: Open File... Mở tập tin... Select Style Sheet File Chá»n tập tin cấu trúc bảng tin Open Directory... Mở thư mục... Add site to whitelist Thêm trang vào danh sách an toàn Site without 'http://' (ex. youtube.com) Trang không có 'http://' (ví dụ youtube.com) QAbstractSpinBox &Step up &Dá»i lên Step &down Dá»i x&uống &Select All &Chá»n tất cả QDialogButtonBox Close Äóng lại Cancel Há»§y bá» &Yes &Äồng ý &No &Không đồng ý QFtp Not connected Vẫn chưa kết nối Host %1 not found Không tìm thấy host %1 Connection refused to host %1 Kết nối bị từ chối đến host %1 Connection timed out to host %1 Kết nối quá hạn thá»i gian đến host %1 Connected to host %1 Äã kết nối đến host %1 Connection refused for data connection Kết nối từ chối truyá»n tải dữ liệu Unknown error Lá»—i chưa rõ Connecting to host failed: %1 Thất bại khi Ä‘ang kết nối đến host; %1 Login failed: %1 Äăng nhập thất bại: %1 Listing directory failed: %1 Thất bại khi lập danh sách thư mục: %1 Changing directory failed: %1 Thất bại khi đổi thư mục: %1 Downloading file failed: %1 Thất bại khi tải tập tin: %1 Uploading file failed: %1 Thất bại khi tải lên tập tin: %1 Removing file failed: %1 Thất bại khi loại bá» tập tin: %1 Creating directory failed: %1 Thất bại khi tạo thư mục: %1 Removing directory failed: %1 Thất bại khi loại bá» thư mục: %1 Connection closed Äã đóng lại kết nối QLineEdit &Undo &Không thá»±c hiện &Redo &Làm lại Cu&t D&án &Copy &Sao chép &Paste &Dán Delete Xóa Select All Chá»n tất cả QMultiInputContext Select IM Chá»n IM QObject Cannot start external program Không thể khởi động chương trình bổ sung Cannot start external program! %1 Không thể khởi động chương trình bổ sung! %1 Error QTextControl &Undo &Không làm &Redo &Làm lại Cu&t &Cắt &Copy &Sao chép &Paste &Dán Delete Xóa Select All Chá»n tất cả Copy &Link Location Sao ch&ép địa Ä‘iểm đưá»ng liên kết QWizard Cancel Há»§y bá» < &Back < &Quay lại &Finish &Hoàn tất &Next > &Tiếp > RSSDetectionWidget Untitled feed RequestFeed Server requires authentication! Phía máy chá»§ yêu cầu cần có xác nhận! Server replied: Not Found! Phản hồi từ phía máy chá»§: Không tìm thấy! Redirect error! Gặp lá»—i khi chuyển tiếp! Request timeout! Yêu cầu đã hết hạn! SQLiteDriver Error opening database Error closing database Unable to begin transaction Unable to commit transaction Unable to rollback transaction SQLiteResult Unable to fetch row No query Unable to execute statement Unable to execute multiple statements at a time Unable to reset statement Unable to bind parameters Parameter count mismatch SslErrorDialog SSL Certificate Error! Only for this session UpdateAppDialog Check for Updates Kiểm tra cập nhật Checking for updates... Äang kiểm tra cho việc cập nhật... Loading history... Äang tải phần Lịch Sá»­ Äã Äá»c Don't remind about this version Không nhắc lại vá» phiên bản này &Install Cà&i Äặt You already have the latest version Phiên bản chương trình hiện tại là má»›i nhất A new version of QuiteRSS is available! Hiện đã phát hành má»™t phiên bản má»›i cá»§a chương trình! Click here to go to the download page Click vào đây để Ä‘i đến trang tải bản cập nhật Your version is: Phiên bản cá»§a bạn là: Current version is: Phiên bản hiện tại là: Error checking updates Lá»—i xảy ra khi tiến hành kiểm tra cập nhật quiterss-0.18.3/lang/quiterss_zh_CN.ts000066400000000000000000005412461265173051100177300ustar00rootroot00000000000000 AboutDialog About 关于 Revision 修订 Version 版本 QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS是一个开æºçš„跨平å°çš„RSS / Atom消æ¯é˜…读器 Includes: 包括: Application directory: 应用程åºç›®å½•: Resource directory: 资æºç›®å½•: Data directory: æ•°æ®ç›®å½•: Backup directory: 备份所在目录: Database file: æ•°æ®åº“文件: Settings file: 设置文件: Log file: 日志文件: Authors 作者 History åŽ†å² License 许å¯è¯ Information ä¿¡æ¯ AdBlockAddSubscriptionDialog Add Subscription 添加订阅 Title: 标题: Address: 网å€ï¼š Add new subscription to AdBlock: 添加新的订阅到AdBlock: AdBlockCustomList Custom Rules 自定义规则 AdBlockDialog AdBlock Configuration é…ç½®AdBlock Enable AdBlock å¯ç”¨AdBlock Search... æœç´¢... Options 选项 AdBlock AdBlock Use only essential part of EasyList (for performance reasons) 仅使用EasyList中的é‡è¦éƒ¨åˆ† (出于性能的原因) Add Rule 添加规则 Remove Rule 移除规则 Add Subscription 添加订阅 Remove Subscription 移除订阅 Update Subscriptions 更新订阅 Learn about writing rules... 了解如何写规则... AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock拦截网页上你ä¸å¸Œæœ›å‡ºçŽ°çš„å†…å®¹ AdBlock AdBlock Show AdBlock &Settings 显示AdBlock的设置(&S) Disable on %1 在 %1 上ç¦ç”¨ Disable only on this page 仅在本页ç¦ç”¨ Blocked Popup Windows æ‹¦æˆªå¼¹å‡ºçª—å£ %1 with (%2) %1 å’Œ (%2) No content blocked 没有内容被拦截 Blocked URL (AdBlock Rule) - click to edit rule 拦截 URL (AdBlock 规则) - 点击修改规则 AdBlockManager EasyList 简易列表 AdBlockSubscription Cannot load subscription! æ— æ³•åŠ è½½è®¢é˜…ï¼ AdBlockTreeWidget Add Rule 添加规则 Remove Rule 移除规则 Add Custom Rule 添加自定规则 Please write your rule here: 请在这里写你的规则: %1 (recently updated) %1 (最近更新) %1 (Error: %2) %1 (错误:%2) AddFeedWizard Add Feed 添加 Feed Create New Feed 创建新的 Feed Use title of the feed as displayed name 使用 feed 的标题作为显示åç§° Server requires authentication: æœåŠ¡å™¨è¦æ±‚身份验è¯: Username: 用户å: Password: 密ç : Feed URL or website address: Feed çš„URL或者网页地å€ï¼š Feeds Feeds All Feeds 所有 Feeds New Folder... 新建文件夹... Displayed name: 显示å称: Location: ä½ç½®: URL error! URL é”™è¯¯ï¼ Duplicate feed! Feed é‡å¤ï¼ Can't find feed URL! Feedçš„URLä¸å­˜åœ¨ï¼ Request failed! è¯·æ±‚å¤±è´¥ï¼ AddFolderDialog Add Folder 添加文件夹 Feeds Feeds All Feeds 所有 Feeds Name: åç§°: Location: ä½ç½®: AuthenticationDialog Save password ä¿å­˜å¯†ç  Authorization required 需è¦èº«ä»½è®¤è¯ Server: æœåС噍: Message: 消æ¯: Username: 用户å: Password: 密ç : CategoriesTreeWidget Unread 未读 Starred 标星 Deleted 删除的 Labels 标签 Open in New Tab 在新标签页中打开 Clear 'Deleted' 清空 '删除的' Mark Read 标记为 已读 CleanUpWizard Clean Up 清除 Choose Feeds 选择 Feeds All Feeds 所有 Feeds Clean Up Options 清除选项 Maximum age of news in days to keep: ä¿ç•™çš„æœ€å¤§å¤©æ•°: Maximum number of news to keep: ä¿ç•™çš„æœ€å¤§æ¶ˆæ¯æ•°: Delete read news åˆ é™¤å·²è¯»æ¶ˆæ¯ Never delete unread news ä¸è¦åˆ é™¤æœªè¯»æ¶ˆæ¯ Never delete starred news ä¸è¦åˆ é™¤æ ‡æ˜Ÿçš„æ¶ˆæ¯ Never delete labeled news ä¸è¦åˆ é™¤æœ‰æ ‡ç­¾çš„æ¶ˆæ¯ Clean up 'Deleted' 清ç†â€åˆ é™¤çš„“ Purge DB 清除数æ®åº“ Totally remove records that had marked 'deleted' from DB. Ancient news could reappear 从数æ®åº“完全删除标记为“已删除â€çš„记录。 过时新闻å¯èƒ½ä¼šå†æ¬¡å‡ºçް Information ä¿¡æ¯ Clean Up wizard deleted %1 news 清ç†å‘导删除 %1 ä¸ªæ¶ˆæ¯ ClickToFlash Object blocked by ClickToFlash 对象被ClickToFlash阻止 Hide object éšè—对象 Add '%1' to whitelist 添加 '%1' 到白åå• CustomizeToolbarDialog Customize Main Toolbar è‡ªå®šä¹‰ä¸»å·¥å…·æ  Customize Feeds Toolbar 自定义 Feeds å·¥å…·æ  Customize News Toolbar 自定义消æ¯å·¥å…·æ  Load images 载入图片 Separator 分隔符 Icon 图标 Text 文本 Text Beside Icon 文字在图标æ—è¾¹ Text Under Icon 文字在图标下方 Big 大 Normal 正常 Small å° Style: æ ·å¼: Icon Size: 图标大å°: Add 添加 Remove 移除 Move up 上移 Move down 下移 Default 默认 DownloadItem Remaining time unavailable 剩余时间无法使用 Error: Cannot write to file! 错误: æ— æ³•å†™å…¥æ–‡ä»¶ï¼ Error: 错误: few seconds 几秒钟 seconds ç§’ minutes 分钟 hours å°æ—¶ Unknown size 大尿œªçŸ¥ Unknown speed 速度未知 %2 - unknown size (%3) %2 - 大尿œªçŸ¥ (%3) Remaining %1 - %2 of %3 (%4) 剩余 %1 - %2 of %3 (%4) Cancelled - %1 å–æ¶ˆ - %1 Delete file 删除文件 Do you want to also delete downloaded file? 你想è¦åŒæ—¶åˆ é™¤ä¸‹è½½çš„æ–‡ä»¶å—? Open File 打开文件 Open Folder 打开文件夹 Copy Download Link å¤åˆ¶ä¸‹è½½é“¾æŽ¥ Cancel Downloading å–æ¶ˆä¸‹è½½ Remove 移除 Cancelled å–æ¶ˆ Error 错误 Not found 未找到 Sorry, the file %1 was not found! 很抱歉,该文件 %1 æ²¡æœ‰æ‰¾åˆ°ï¼ DownloadManager Clear 清除 File %1 (*.%2) 文件 %1 (*.%2) All Files (*.*) 所有文件 (*.*) Save As... å¦å­˜ä¸º... Executable: 坿‰§è¡Œæ–‡ä»¶: Arguments: 傿•°: FeedPropertiesDialog Properties 属性 General 常规 Columns 列 Authentication èº«ä»½éªŒè¯ Status çŠ¶æ€ Title: 标题: Homepage: 主页: Feed URL: Feedçš„URL: Load Title 载入标题 Load Favicon 载入网站图标 Select Icon... 选择图标... Select Icon 选择图标 Disable update ç¦ç”¨æ›´æ–° Automatically update every è‡ªåŠ¨æ›´æ–°æ¯ seconds ç§’ minutes 分钟 hours å°æ—¶ Starred 标星 Load images 载入图片 Display in new tab on startup å¯åŠ¨æ—¶ï¼Œåœ¨æ–°æ ‡ç­¾é¡µä¸­æ˜¾ç¤º Show news' description instead of loading web page 显示消æ¯çš„æè¿°ï¼Œè€Œä¸æ˜¯è½½å…¥ç½‘页 Automatically delete duplicate news 自动删除é‡å¤çš„æ¶ˆæ¯ Display 显示 Reading Enable JavaScript å¯ç”¨ JavaScript Right-to-left layout 从å³åˆ°å·¦çš„布局 Ascending å‡åº Descending é™åº Sort by: æŽ’åºæ–¹å¼: Add 添加 Remove 移除 Move up 上移 Move down 下移 Default 默认 Server requires authentication: æœåŠ¡å™¨è¦æ±‚身份验è¯: Username: 用户å: Password: 密ç : Feeds count: Feeds æ•°é‡ï¼š Description: æè¿°ï¼š Status: 状æ€ï¼š Created: 创建: Last update: 最近一次更新: News count: 消æ¯ç»Ÿè®¡ï¼š Good 良好 Long ago ;-) 很久以å‰;-) new æ–°çš„ unread 未读 Image files å›¾åƒæ–‡ä»¶ Select Image 选择图片 Load icon: can't open a file! 载入图标: ä¸èƒ½æ‰“开文件 FilterRulesDialog Filter Rules 筛选器规则 Feeds Feeds All Feeds 所有 Feeds Filter name: 筛选器å称: Match all news åŒ¹é…æ‰€æœ‰æ¶ˆæ¯ Match all conditions åŒ¹é…æ‰€æœ‰æ¡ä»¶ Match any condition 匹é…任何æ¡ä»¶ Perform these actions: 执行下列æ“作: Please enter name for the filter. 请为筛选器输入å称。 Please enter search condition for the news filter. 请为消æ¯ç­›é€‰å™¨è¾“å…¥æœç´¢æ¡ä»¶ã€‚ FindFeed Find Name 查找åç§° Find Link 查找链接 FindTextContent Find in News 在消æ¯ä¸­æŸ¥æ‰¾ Find in Titles 在标题中查找 Find in Authors 在作者中查找 Find in Categories 在分类中查找 Find in Descriptions 在æè¿°ä¸­æŸ¥æ‰¾ Find in Links 在链接中查找 Find in Browser 在æµè§ˆå™¨ä¸­æŸ¥æ‰¾ FtpDownloader Canceled! å–æ¶ˆ! ItemAction Mark News as Read 标记消æ¯ä¸ºå·²è¯» Add Star 加星 Delete 删除 Add Label 添加标签 Play a Sound 播放声音 Show News in Notifier åœ¨é€šçŸ¥ä¸­æ˜¾ç¤ºæ¶ˆæ¯ Browse æµè§ˆ Play 播放 Add Action 添加æ“作 Delete Action 删除æ“作 Open File... 打开文件... ItemCondition Title 标题 Description æè¿° Author 作者 Category 分类 State çŠ¶æ€ Link 链接 News æ¶ˆæ¯ New æ–°çš„ Read 已读 Starred 标星 Add Condition 添加æ¡ä»¶ Delete Condition 删除æ¡ä»¶ contains åŒ…å« doesn't contains ä¸åŒ…å« is 是 isn't 䏿˜¯ begins with 以...开始 ends with 以...结尾 Regular expressions æ­£åˆ™è¡¨è¾¾å¼ LabelDialog New Label 新标签 Load icon... 载入图标... Default 默认 Select color... 选择颜色... Name: åç§°: Icon: 图标: Color text: 文本颜色: Color background: 背景颜色: Image files å›¾åƒæ–‡ä»¶ Select Image 选择图片 Load icon: can't open a file! 载入图标: ä¸èƒ½æ‰“开文件 MainApplication Saving data... ä¿å­˜æ•°æ®... MainWindow &AdBlock &AdBlock Hide Categories éšè—分类 Show Categories 显示分类 Select OPML-File 选择 OPML-文件 OPML-Files (*.%1 *.%2) OPML-文件(*.%1 *.%2) Import canceled 坼入已喿¶ˆ Import: can't open a file 导入: ä¸èƒ½æ‰“开文件 OPML-Files (*.%1) OPML-文件 (*.%1) Export canceled å¯¼å‡ºå·²å–æ¶ˆ Export: can't open a file 导出: ä¸èƒ½æ‰“开文件 Unread: %1 未读: %1 All: %1 所有: %1 (Browser) (æµè§ˆå™¨) New News: %1 新的消æ¯: %1 Unread News: %1 未读的消æ¯: %1 &Add 添加(&A) Add New Feed 添加新的 Feed &Feed... Feeds(&F)... F&older... 文件夹(&o)... Add New Folder 添加新的文件夹 Open in New Tab 在新标签页中打开 &Delete... 删除(&D)... Delete Selected Feed 删除选中的 Feed &Import Feeds... 导入 Feeds(&I)... Import Feeds from OPML File 从OPML文件导入 Feeds &Export Feeds... 导出 Feeds(&E)... Export Feeds to OPML File 导出 Feeds 到OPML文件 E&xit 退出(&x) Update Feed æ›´æ–° Feed Update Current Feed æ›´æ–°å½“å‰ Feed Update All 全部更新 Update All Feeds 更新所有 Feeds Mark All Feeds Read 标记所有 Feeds 已读 Mark Read/Unread 标记 已读/未读 Mark Current News Read/Unread æ ‡è®°å½“å‰æ¶ˆæ¯ä¸ºå·²è¯»/未读 Mark All News Read 标记所有消æ¯ä¸ºå·²è¯» Downloads 下载 Clean Up... 清除... News Filters... 消æ¯ç­›é€‰å™¨... Filter News... 筛选消æ¯... Options... 选项​​... Open Options Dialog æ‰“å¼€é€‰é¡¹å¯¹è¯æ¡† Filter Feeds 筛选 Feeds Show All 全部显示 Show New 显示新的 Show Unread 显示未读的 Show Starred Feeds 显示标星的 Feeds Show Not Working Feeds 显示没有工作的 Feeds Filter News ç­›é€‰æ¶ˆæ¯ Show Starred 显示标星的 Show Not Starred 显示未标星的 Show Unread or Starred 显示未读的或者标星的 Show Last Day 显示最近一天 Show Last 7 Days 显示最近7天 About... 关于... Show 'About' Dialog 显示“关于â€å¯¹è¯æ¡† Check for Updates... 检查更新... Report a Problem... 报告问题... Open News æ‰“å¼€æ¶ˆæ¯ Open in Browser 在æµè§ˆå™¨ä¸­æ‰“å¼€ Open in External Browser 在外部æµè§ˆå™¨ä¸­æ‰“å¼€ Open News in External Browser 在外部æµè§ˆå™¨ä¸­æ‰“å¼€æ¶ˆæ¯ Open News in New Tab åœ¨æ–°æ ‡ç­¾é¡µä¸­æ‰“å¼€æ¶ˆæ¯ Open in Background Tab 在åŽå°æ ‡ç­¾é¡µä¸­æ‰“å¼€ Open News in Background Tab 在åŽå°æ ‡ç­¾é¡µä¸­æ‰“å¼€æ¶ˆæ¯ Star 加星 Mark News Star æ¶ˆæ¯æ ‡æ˜Ÿ Delete 删除 Delete Selected News åˆ é™¤é€‰ä¸­çš„æ¶ˆæ¯ Delete All News åˆ é™¤æ‰€æœ‰æ¶ˆæ¯ Delete All News from List ä»Žåˆ—è¡¨ä¸­åˆ é™¤æ‰€æœ‰æ¶ˆæ¯ Restore æ¢å¤ Restore News æ¢å¤æ¶ˆæ¯ Copy Link å¤åˆ¶é“¾æŽ¥ Restore last deleted news æ¢å¤æœ€è¿‘åˆ é™¤çš„æ¶ˆæ¯ Mark Read 标记为 已读 Mark Feed Read 标记 Feed 为已读 Properties 属性 &File 文件(&F) Count Unread News ç»Ÿè®¡æœªè¯»æ¶ˆæ¯ Count All News ç»Ÿè®¡æ‰€æœ‰æ¶ˆæ¯ Last Update 最近一次更新 Reset browser zoom é‡è®¾æµè§ˆå™¨ç¼©æ”¾ Print Web Page 打å°Web页 Preview Web Page 预览Web页 Save page in database ä¿å­˜é¡µé¢åˆ°æ•°æ®â€‹â€‹åº“ Save page in database instead of news description ä¿å­˜é¡µé¢åˆ°æ•°æ®â€‹â€‹åº“å–ä»£æ¶ˆæ¯æè¿° Confirm Delete 确认删除 Are you sure to delete selected elements? 您确定è¦åˆ é™¤é€‰å®šçš„元素? Menu èœå• Add Feed... 添加 Feed... &Create Backup... 创建备份(&C) S&how Menu Bar 显示èœå•æ (&h) Stop Update Feeds åœæ­¢æ›´æ–° Feeds Open News Description 打开新闻æè¿° Copy News Link å¤åˆ¶æ¶ˆæ¯é“¾æŽ¥ &View 查看(&V) Fee&ds Fee&ds &News 消æ¯(&N) &Browser æµè§ˆå™¨(&B) &Tools 工具(&T) &Help 帮助(&H) Main Toolbar ä¸»å·¥å…·æ  Customize Toolbar è‡ªå®šä¹‰å·¥å…·æ  Main Toolbar... 主工具æ ... Customize Toolbar... 自定义工具æ ... Feeds Toolbar... Feeds 工具æ ... News Toolbar... 消æ¯å·¥å…·æ ... Lock Toolbar é”å®šå·¥å…·æ  Hide Toolbar éšè—å·¥å…·æ  Layout 布局 Classic ç»å…¸ Newspaper 报纸 Application Style åº”ç”¨æ ·å¼ System 系统 System2 系统2 Green 绿色 Orange 橙色 Purple 紫色 Pink 粉红色 Gray ç°è‰² Browser Position æµè§ˆå™¨ä½ç½® Top 顶部 Bottom 底部 Right å³è¾¹ Left 左边 Show Window æ˜¾ç¤ºçª—å£ Previous Feed å‰ä¸€ä¸ª Feed Next Feed 下一个 Feed Previous News å‰é¢çš„æ¶ˆæ¯ Next News åŽé¢çš„æ¶ˆæ¯ News Page Up 消æ¯å‘上翻页 News Page Down 消æ¯å‘下翻页 Next Unread News åŽé¢æœªè¯»çš„æ¶ˆæ¯ Previous Unread News å‰é¢æœªè¯»çš„æ¶ˆæ¯ Switch Focus to Next Panel 焦点切æ¢åˆ°ä¸‹ä¸€ä¸ªé¢æ¿ Switch Focus to Next Panel (Tree Feeds, List News, Browser) 焦点切æ¢åˆ°ä¸‹ä¸€ä¸ªé¢æ¿ï¼ˆFeeds树,消æ¯åˆ—表,æµè§ˆå™¨ï¼‰ Switch Focus to Previous Panel 焦点切æ¢åˆ°å‰ä¸€ä¸ªé¢æ¿ Switch Focus to Previous Panel (Tree Feeds, Browser, List News) 焦点切æ¢åˆ°å‰ä¸€ä¸ªé¢æ¿ï¼ˆFeeds树,消æ¯åˆ—表,æµè§ˆå™¨ï¼‰ Show/Hide Tree Feeds 显示/éšè— Feedsæ ‘ Minimize to Tray 最å°åŒ–到托盘 Minimize Application to Tray 最å°åŒ–程åºåˆ°æ‰˜ç›˜ Columns 列 Show Indentation 显示缩进 Search Feed æœç´¢ Feed Zoom 缩放 Zoom In 放大 Zoom in in browser 在æµè§ˆå™¨ä¸­æ”¾å¤§ Zoom Out ç¼©å° Zoom out in browser 在æµè§ˆå™¨ä¸­ç¼©å° 100% 100% Print... 打å°... Print Preview... 打å°é¢„览... Page up (Browser) 上页 (æµè§ˆå™¨) Page down (Browser) 下页 (æµè§ˆå™¨) Save As... å¦å­˜ä¸º... Save Page As... 页é¢å¦å­˜ä¸º... Show/Hide 显示/éšè— Feeds Toolbar Feeds å·¥å…·æ  News Toolbar 消æ¯å·¥å…·æ  Browser Toolbar æµè§ˆå™¨å·¥å…·æ  Panel Categories 颿¿åˆ†ç±» Status Bar çŠ¶æ€æ  Full Screen å…¨å± Stay On Top ç•™åœ¨æœ€ä¸Šé¢ Categories 分类 Label 标签 Show labels menu 显示标签èœå• Close Tab 关闭标签页 Close Other Tabs 关闭其他标签页 Close All Tabs 关闭所有标签页 Switch to next tab 切æ¢åˆ°ä¸‹ä¸€ä¸ªæ ‡ç­¾é¡µ Switch to previous tab 切æ¢åˆ°å‰ä¸€ä¸ªæ ‡ç­¾é¡µ Unread 未读 Starred 标星 Deleted 删除的 Labels 标签 Decrease news list/increase browser å‡å°‘新闻列表/增加æµè§ˆå™¨ Increase news list/decrease browser 增加新闻列表/å‡å°‘æµè§ˆå™¨ Find 查找 Open Homepage Feed 打开Feed首页 Sort by Name 按åç§°æŽ’åº Collapse All Folders æŠ˜å æ‰€æœ‰æ–‡ä»¶å¤¹ Expand All Folders 展开所有文件夹 Next Folder 下一个文件夹 Previous Folder 上一个文件夹 Expand Folder 展开文件夹 Setting Page: Labels 设置页é¢: 标签 Share 分享 Sort By æŽ’åºæ–¹å¼: Ascending å‡åº Descending é™åº Check for updates 检查更新 A new version of QuiteRSS... 一个新版本的QuiteRSS ... Loading... 载入... Web Page 网页 Save As å¦å­˜ä¸º HTML-Files (*.%1) HTML-文件 (*.%1) Text files (*.%2) 文本文件 (*.%2) Save As: can't open a file å¦å­˜: ä¸èƒ½æ‰“开文件 Choose Directory 选择目录 Important é‡è¦ Work 工作 Personal 个人 To Do 计划 Later ä»¥åŽ Amusingly 有趣的 NetworkManager SSL Certificate Error! SSLè¯ä¹¦é”™è¯¯! The "%1" server has the following errors in the SSL certificate: æœåС噍 "%1" 在 SSL è¯ä¹¦ä¸­å‡ºçŽ°ä»¥ä¸‹é”™è¯¯ï¼š <b>Organization: </b> <b>组织: </b> <b>Domain Name: </b> <b>域å: </b> <b>Expiration Date: </b> <b>过期时间: </b> <b>Error: </b> <b>错误: </b> Would you like to make an exception for this certificate? 您想è¦ä¸ºæ­¤è¯ä¹¦è®¾ç½®ä¸€ä¸ªä¾‹å¤–å—? NewsFiltersDialog News Filters 消æ¯ç­›é€‰ Feeds Feeds Filter Name 筛选器åç§° New... 新建... Edit... 编辑... Delete... 删除... Move up 上移 Move down 下移 Run Filter è¿è¡Œç­›é€‰å™¨ Delete Filter 删除筛选器 Are you sure you want to delete the filter '%1'? 你确定è¦åˆ é™¤ç­›é€‰å™¨ '%1'? NewsHeader Icon Feed Feed 图标 Title 标题 Published å‘布 Received 收到 Author 作者 Category 分类 Read 已读 Star 加星 Label 标签 Feed Title Feed 标题 Link 链接 NewsItem Mark Read/Unread 标记 已读/未读 Delete News åˆ é™¤æ¶ˆæ¯ NewsTabWidget Loading... (%p%) 载入...(%p%) Home 主页 Open Page in External Browser 在外部æµè§ˆå™¨ä¸­æ‰“å¼€é¡µé¢ Open Link in External Browser 在外部æµè§ˆå™¨ä¸­æ‰“开链接 Open Link 打开链接 Open in New Tab 在新标签页中打开 Save Link... ä¿å­˜é“¾æŽ¥... Save Image... ä¿å­˜å›¾ç‰‡... Copy Link å¤åˆ¶é“¾æŽ¥ Copy å¤åˆ¶ Go Back 返回 Go Forward å‰è¿› Stop åœæ­¢ Reload 刷新 Copy Image å¤åˆ¶å›¾ç‰‡ Copy Image Address å¤åˆ¶å›¾ç‰‡åœ°å€ Load Images 载入图片 Auto Load Images to News View 自动载入图片到消æ¯é¢„览 No Load Images ä¸è½½å…¥å›¾ç‰‡ No Load Images to News View ä¸è½½å…¥å›¾ç‰‡åˆ°æ¶ˆæ¯è§†å›¾ Close Tab 关闭标签页 Auto Load Images in News View 在消æ¯è§†å›¾è‡ªåŠ¨åŠ è½½å›¾ç‰‡ Don't Load Images ä¸è¦è½½å…¥å›¾ç‰‡ Don't Load Images in News View ä¸è¦åœ¨æ¶ˆæ¯è§†å›¾è½½å…¥å›¾ç‰‡ Comments 注释 Author: %1 作者: %1 audio 音频 video 视频 media 多媒体 Link to 链接到 Mark Read/Unread 标记 已读/未读 Mark News Star æ¶ˆæ¯æ ‡æ˜Ÿ Label 标签 Share 分享 Open News in External Browser 在外部æµè§ˆå™¨ä¸­æ‰“å¼€æ¶ˆæ¯ Delete 删除 NotificationWidget Close 关闭 Mark All News Read 标记所有消æ¯ä¸ºå·²è¯» Previous Page 上一页 Next Page 下一页 Incoming News: %1 收到的消æ¯: %1 Page %1 of %2 页 %1 å…± %2 OptionsDialog Options 选项 General 常规 System Tray 系统托盘 Network Connections 网络连接 Browser æµè§ˆå™¨ Feeds Feeds Labels 标签 Notifications 通告 Passwords å¯†ç  Language 语言 Fonts & Colors 字体 & 颜色 Keyboard Shortcuts 键盘快æ·é”® Warning: key is already assigned to 警告: 关键字已ç»åˆ†é…ç»™ Show splash screen on startup 在å¯åŠ¨æ—¶æ˜¾ç¤ºå¯åŠ¨ç”»é¢ Reopen last opened feeds on startup 在å¯åŠ¨æ—¶é‡æ–°æ‰“开最近打开的feeds Open new tab next to active åœ¨å½“å‰æ ‡ç­¾æ—边打开一个新的标签 Hide feeds tree when opening tabs 打开标签页时,éšè—feedsæ ‘ Show default rss-icon instead of favourite one 显示默认的RSSå›¾æ ‡ï¼Œè€Œä¸æ˜¯æœ€å–œæ¬¢çš„一个 Automatically collapse folders è‡ªåŠ¨æŠ˜å æ–‡ä»¶å¤¹ Show close button on tab 标签上显示关闭按钮 Automatically check for updates 自动检查更新 Help improve QuiteRSS by sending usage information 通过å‘逿œ‰ä»·å€¼çš„ä¿¡æ¯å¸®åŠ©æ”¹å–„QuiteRSS Store a DB in memory (requires program restart) 存储一个数æ®åº“(DB)在内存中(需è¦ç¨‹åºé‡æ–°å¯åЍ) Save DB stored in memory to file every 内存中的DBä¿å­˜åˆ°æ–‡ä»¶, æ¯ minutes 分钟 Run QuiteRSS at Windows startup 在系统å¯åŠ¨æ—¶è¿è¡Œ QuiteRSS Show system tray icon 显示系统托盘图标 starting QuiteRSS å¯åЍ QuiteRSS minimizing QuiteRSS 最å°åŒ– QuiteRSS closing QuiteRSS 关闭 QuiteRSS Show static icon æ˜¾ç¤ºé™æ€å›¾æ ‡ Change icon for incoming new news 更改收到新消æ¯çš„图标 Show count of new news æ˜¾ç¤ºæ–°çš„æ¶ˆæ¯æ•° Show count of unread news æ˜¾ç¤ºæœªè¯»æ¶ˆæ¯æ•° Single click instead of double click for show window å•击代替åŒå‡»æ˜¾ç¤ºçª—å£ Empty working set on minimize to tray 清空工作组最å°åŒ–到托盘 Move to the system tray when: 移动到系统托盘: Tray icon behavior: 托盘图标行为: Direct connection to the Internet 直接连接到Internet System proxy configuration (if available) 系统代ç†é…ç½®(如果å¯ç”¨) Manual proxy configuration: 手动é…置代ç†: Proxy server: ä»£ç†æœåС噍: Port: 端å£: Username: 用户å: Password: 密ç : Request timeout: 请求超时: Number of requests: 请求数é‡ï¼š Number of retries: é‡è¯•次数: Options network requests when updating feeds (requires program restart): æ›´æ–° feeds 时,选项的网络请求 (需è¦ç¨‹åºé‡æ–°å¯åЍ) : Use embedded browser ä½¿ç”¨åµŒå…¥å¼æµè§ˆå™¨ Use external browser 使用外部æµè§ˆå™¨ Default external browser 默认的外部æµè§ˆå™¨ Following external browser: 以下外部æµè§ˆå™¨: Browse... æµè§ˆ... Load images 载入图片 Enable JavaScript å¯ç”¨JavaScript Enable plug-ins å¯ç”¨æ’ä»¶ Open links in embedded browser in background 在嵌入æµè§ˆå™¨åŽå°æ‰“开链接 Open links in external browser in background (experimental) 在外部æµè§ˆå™¨åŽå°æ‰“开链接(实验性) Default zoom on pages: 页é¢çš„默认缩放: Browser selection: æµè§ˆå™¨çš„选择: External browser: 外部æµè§ˆå™¨: Content: 内容: User style sheet: 用户样å¼è¡¨: Maximum pages in cache æœ€å¤§ç¼“å­˜é¡µé¢æ•° Store cache in: 存储缓存在: Maximum size of disk cache 最大的ç£ç›˜ç¼“å­˜å¤§å° MB MB Use disk cache 使用ç£ç›˜ç¼“å­˜ Allow local data to be set å…è®¸è®¾ç½®æœ¬åœ°æ•°æ® Keep local data only until quit application ä¿æŒæœ¬åœ°æ•°æ®ç›´åˆ°é€€å‡ºåº”ç”¨ç¨‹åº Block sites from setting any data é˜»æ­¢ç½‘ç«™è®¾ç½®ä»»ä½•æ•°æ® Clear 清除 Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Flash点击是一个æ’件,å¯ä»¥é˜»æ­¢è‡ªåŠ¨åŠ è½½é¡µé¢çš„Flash内容。您å¯ä»¥éšæ—¶æ‰‹åŠ¨ç‚¹å‡»Flash播放图标加载它。 Use Click to Flash 使用Flash点击æ’ä»¶ Add... 添加... Remove... 移除... Ask where to save each file before downloading 在æ¯ä¸ªæ–‡ä»¶ä¸‹è½½å‰è¯¢é—®ä¿å­˜åˆ°å“ªé‡Œ Download location: 下载ä½ç½®: History åŽ†å² Click to Flash Flash点击æ’ä»¶ Downloads 下载 Automatically update the feeds on startup 在å¯åŠ¨æ—¶è‡ªåŠ¨æ›´æ–° feeds Automatically update the feeds every 自动更新 feeds æ¯ seconds ç§’ hours å°æ—¶ Nothing to do ä¸åšä»»ä½•事 Dec Dec December å二月 Display format for date: 显示日期格å¼: time: æ—¶é—´: Alternating row background colors 交替行的背景颜色 Simplified representation of date and time 简化日期和时间的表示 Show All 全部显示 Show New 显示新的 Show Unread 显示未读的 Show Starred 显示标星的 Show Not Starred 显示未标星的 Show Unread or Starred 显示未读的或者标星的 Show Last Day 显示最近一天 Show Last 7 Days 显示最近7天 Style sheet for news: 消æ¯çš„æ ·å¼è¡¨ï¼š Mark news as read: 标记消æ¯ä¸ºå·²è¯»: on selecting. With timeout 选中时,没有超时 after switching to another news 切æ¢åˆ°å¦ä¸€æ¡æ¶ˆæ¯åŽ Mark displayed news as read when switching feeds åˆ‡æ¢ feeds 时,标记显示的消æ¯ä¸ºå·²è¯» Mark displayed news as read when closing tab 关闭标签时,标记显示的消æ¯ä¸ºå·²è¯» Mark displayed news as read on minimize 最å°åŒ–时,标记显示的消æ¯ä¸ºå·²è¯» Change behavior of action 'Next Unread News' æ”¹å˜ '下一个未读消æ¯' 行为 starred news æ¶ˆæ¯æ ‡æ˜Ÿ labeled news æ¶ˆæ¯æ ‡ç­¾ Automatically mark identical news as read 自动标记相åŒçš„æ¶ˆæ¯ä¸ºå·²è¯» Prevent accidental deletion of: 防止æ„外删除: Enable cleanup on shutdown å¯ç”¨å…³é—­æ—¶æ¸…ç† Maximum age of news in days to keep: ä¿ç•™çš„æœ€å¤§å¤©æ•°: Maximum number of news to keep: ä¿ç•™çš„æœ€å¤§æ¶ˆæ¯æ•°: Delete read news åˆ é™¤å·²è¯»æ¶ˆæ¯ Never delete unread news ä¸è¦åˆ é™¤æœªè¯»æ¶ˆæ¯ Never delete starred news ä¸è¦åˆ é™¤æ ‡æ˜Ÿçš„æ¶ˆæ¯ Never delete labeled news ä¸è¦åˆ é™¤æœ‰æ ‡ç­¾çš„æ¶ˆæ¯ Clean up 'Deleted' 清ç†â€™åˆ é™¤çš„‘ Enable DB optimization (slower shutdown) å¯ç”¨æ•°æ®åº“优化(关机速度较慢) Reading 阅读中 Clean Up 清除 New... 新建... Edit... 编辑... Delete... 删除... Move up 上移 Move down 下移 Show when inactive main window 主窗å£ä¸æ´»åŠ¨æ—¶æ˜¾ç¤º Screen å±å¹• Transparency 逿˜Žåº¦ Show titles feeds 显示 feeds 标题 Show icon feed 显示 feed 图标 Show button 'Mark All News Read' 显示 ‘标记所有消æ¯å·²è¯»' 按钮 Show button 'Mark Read/Unread' 显示 ’标记已读/未读' 按钮 Show button 'Open in External Browser' 显示 ‘在外部æµè§ˆå™¨æ‰“开’ 按钮 Show button 'Delete News' 显示 ‘删除新闻’ 按钮 Play sound for incoming new news æ”¶åˆ°æ–°çš„æ¶ˆæ¯æ’­æ”¾å£°éŸ³ Play 播放 Display notification for incoming news æ”¶åˆ°æ¶ˆæ¯æ˜¾ç¤ºé€šå‘Š Top Left 左上 Top Right å³ä¸Š Bottom Left 左下 Bottom Right å³ä¸‹ Review 预览 Position ä½ç½® Show maximum of 显示最大 item on page notification 页é¢é€šçŸ¥ä¸Šçš„æ¡ç›® Width list items æ¡ç›®åˆ—表宽度 pixels åƒç´  Close notification after 在...之åŽå…³é—­é€šå‘Š Do not show notification in fullscreen mode åœ¨å…¨å±æ¨¡å¼ä¸‹ä¸æ˜¾ç¤ºé€šçŸ¥ Display Action mouse on news opening: Single Click: Double Click: Middle Click: Only show selected feeds: åªæ˜¾ç¤ºé€‰å®šçš„ feeds: Notification 通知 Sound 声音 Selection of feeds 选择的 feeds All Feeds 所有 Feeds Site 站点 User 用户 Password å¯†ç  Delete 删除 Delete All 全部删除 Show Passwords æ˜¾ç¤ºå¯†ç  Version 版本 Author 作者 Contact è”ç³» Choose language: 选择语言: Type 类型 Font 字体 Feeds list font Feeds 列表字体 News list font 消æ¯åˆ—表字体 News title font æ¶ˆæ¯æ ‡é¢˜å­—体 News text font æ¶ˆæ¯æ–‡æœ¬å­—体 Notification font 通告字体 Change... 更改... Reset å¤ä½ Feeds list color Feeds 列表颜色 Feeds list background Feeds 列表背景 News list color 消æ¯åˆ—表颜色 News list background 消æ¯åˆ—表背景 Focused news color é‡ç‚¹æ¶ˆæ¯çš„颜色 Focused news background color é‡ç‚¹æ¶ˆæ¯çš„背景颜色 Link color 链接颜色 Title color 标题颜色 Date color 日期颜色 Author color 作者颜色 News text color æ¶ˆæ¯æ–‡æœ¬é¢œè‰² News title background æ¶ˆæ¯æ ‡é¢˜èƒŒæ™¯ News background 消æ¯èƒŒæ™¯ Feed with new news Feed æœ‰æ–°æ¶ˆæ¯ Count of unread news in feeds tree feeds 树中未读消æ¯è®¡æ•° Disabled feed ç¦ç”¨ feed Alternating row colors 交替行的颜色 Notification text color 通知文本颜色 Notification background color 通知背景颜色 Auto load images in news view 在消æ¯è§†å›¾è‡ªåŠ¨è½½å…¥å›¾ç‰‡ Text color of new news 新消æ¯çš„æ–‡æœ¬é¢œè‰² Show feeds tree toggle 显示feeds æ ‘åˆ‡æ¢ Clear new status when minimize to tray 最å°åŒ–到托盘时清除消æ¯çŠ¶æ€ Set focus on the last opened news å°†ç„¦ç‚¹æ”¾åœ¨æœ€åŽæ‰“å¼€æ¶ˆæ¯ Set focus at the top of news list 将焦点放在消æ¯åˆ—表的顶部 Set focus on the unread news å°†ç„¦ç‚¹æ”¾åœ¨æœªè¯»æ¶ˆæ¯ Open the news æ‰“å¼€æ¶ˆæ¯ Default news filter: 默认消æ¯ç­›é€‰å™¨ï¼š Action on feed opening: 打开feed 时的动作: Show news description instead of loading web page 显示消æ¯çš„æè¿°ï¼Œè€Œä¸æ˜¯è½½å…¥ç½‘页 Text color of unread news 未读消æ¯çš„æ–‡æœ¬é¢œè‰² Focused feed color é‡ç‚¹æ¶ˆæ¯çš„颜色 Focused feed background color é‡ç‚¹æ¶ˆæ¯çš„颜色 Standard Standard Fixed Fixed Serif Serif Sans Serif Sans Serif Cursive Cursive Fantasy Fantasy Default font size é»˜è®¤çš„å­—ä½“å¤§å° Fixed font size å›ºå®šçš„å­—ä½“å¤§å° Minimum font size 最å°å­—ä½“å¤§å° Minimum logical font size 最å°åˆç†çš„å­—ä½“å¤§å° Font families: 字体类æ—: Font sizes: 字体大å°ï¼š Fonts 字体 Fonts Browser 字体æµè§ˆå™¨ Colors 颜色 Filter 筛选器 Action æ“作 Description æè¿° Shortcut å¿«æ·é”® Shortcut: å¿«æ·é”®: Open File... 打开文件... Select Style Sheet File 选择样å¼è¡¨æ–‡ä»¶ Open Directory... 打开目录... Add site to whitelist 添加站点到白åå• Site without 'http://' (ex. youtube.com) ç«™ç‚¹åœ°å€æ—  'http://' (例如. youtube.com) QAbstractSpinBox &Step up å‘上(&S) Step &down å‘下(&d) &Select All 全选(&S) QDialogButtonBox Close 关闭 Cancel å–æ¶ˆ &Yes 是(&Y) &No å¦(&N) QFtp Not connected 未连接 Host %1 not found 主机 %1 未找到 Connection refused to host %1 æ‹’ç»è¿žæŽ¥ä¸»æœº %1 Connection timed out to host %1 连接主机 %1 è¶…æ—¶ Connected to host %1 连接到主机 %1 Connection refused for data connection æ•°æ®è¿žæŽ¥è¢«æ‹’ç» Unknown error 未知错误 Connecting to host failed: %1 连接主机失败: %1 Login failed: %1 登录失败: %1 Listing directory failed: %1 列出目录失败: %1 Changing directory failed: %1 更改目录失败: %1 Downloading file failed: %1 下载文件失败: %1 Uploading file failed: %1 上传文件失败: %1 Removing file failed: %1 删除文件失败: %1 Creating directory failed: %1 创建目录失败: %1 Removing directory failed: %1 删除目录失败: %1 Connection closed 连接关闭 QLineEdit &Undo 还原(&U) &Redo é‡å¤(&R) Cu&t 剪切(&t) &Copy å¤åˆ¶(&C) &Paste 粘贴(&P) Delete 删除 Select All 全选 QMultiInputContext Select IM 选择 IM QObject Cannot start external program 无法å¯åŠ¨å¤–éƒ¨ç¨‹åº Cannot start external program! %1 无法å¯åŠ¨å¤–éƒ¨ç¨‹åºï¼ %1 Error 错误 QTextControl &Undo 还原(&U) &Redo é‡å¤(&R) Cu&t 剪切(&t) &Copy å¤åˆ¶(&C) &Paste 粘贴(&P) Delete 删除 Select All 全选 Copy &Link Location å¤åˆ¶é“¾æŽ¥åœ°å€(&L) QWizard Cancel å–æ¶ˆ < &Back < 返回(&B) &Finish 完æˆ(&F) &Next > 下一步(&N) > RSSDetectionWidget Untitled feed 无标题feed RequestFeed Server requires authentication! æœåŠ¡å™¨è¦æ±‚身份验è¯ï¼ Server replied: Not Found! æœåŠ¡å™¨åº”ç­”ï¼šæ‰¾ä¸åˆ°ï¼ Redirect error! é‡å®šå‘é”™è¯¯ï¼ Request timeout! è¯·æ±‚è¶…æ—¶ï¼ SQLiteDriver Error opening database 打开数æ®åº“出错 Error closing database 关闭数æ®åº“出错 Unable to begin transaction 无法开始事务 Unable to commit transaction 无法æäº¤äº‹åŠ¡ Unable to rollback transaction 无法回滚事务 SQLiteResult Unable to fetch row 无法读å–行 No query 没有查询 Unable to execute statement æ— æ³•æ‰§è¡Œè¯­å¥ Unable to execute multiple statements at a time 无法在åŒä¸€æ—¶é—´æ‰§è¡Œå¤šä¸ªè¯­å¥ Unable to reset statement 无法é‡ç½®è¯­å¥ Unable to bind parameters æ— æ³•ç»‘å®šå‚æ•° Parameter count mismatch 傿•°æ•°é‡ä¸åŒ¹é… SslErrorDialog SSL Certificate Error! SSLè¯ä¹¦é”™è¯¯! Only for this session ä»…ç”¨äºŽæ­¤æ¬¡ä¼šè¯ UpdateAppDialog Check for Updates 检查更新 Checking for updates... 正检查更新... Loading history... 正载入历å²... Don't remind about this version ä¸è¦å†æé†’这个版本 &Install 安装(&I) You already have the latest version ä½ å·²ç»æ˜¯æœ€æ–°ç‰ˆæœ¬ A new version of QuiteRSS is available! 一个新版本的QuiteRSS å¯ç”¨ï¼ Click here to go to the download page ç‚¹å‡»è¿™é‡Œè¿›å…¥ä¸‹è½½é¡µé¢ Your version is: 你的版本是: Current version is: 当å‰çš„版本是: Error checking updates 检查更新出错 quiterss-0.18.3/lang/quiterss_zh_TW.ts000066400000000000000000005415721265173051100177640ustar00rootroot00000000000000 AboutDialog About 關於 QuiteRSS Revision Revision Version 版本 QuiteRSS is a open-source cross-platform RSS/Atom news reader QuiteRSS æ˜¯ä¸€å€‹é–‹æ”¾åŽŸå§‹ç¢¼çš„è·¨å¹³å° RSS / Atom 訊æ¯é–±è®€å™¨ Includes: 包å«: Application directory: 應用程å¼è³‡æ–™å¤¾: Resource directory: 資æºè³‡æ–™å¤¾: Data directory: 資料存放資料夾: Backup directory: 備份資料夾: Database file: 資料庫檔案: Settings file: 設定檔: Log file: 記錄檔: Authors 作者 History æ­·å² License 授權 Information 資訊 AdBlockAddSubscriptionDialog Add Subscription 新增訂閱 Title: 標題: Address: 地å€: Add new subscription to AdBlock: 新增 AdBlock 訂閱: AdBlockCustomList Custom Rules 自訂è¦å‰‡ AdBlockDialog AdBlock Configuration AdBlock 設定 Enable AdBlock 啟用 AdBlock Search... æœå°‹â€¦ Options é¸é … AdBlock AdBlock Use only essential part of EasyList (for performance reasons) 僅使用 EasyList çš„é‡è¦éƒ¨åˆ† (é¿å…拖慢效能) Add Rule 新增è¦å‰‡ Remove Rule 移除è¦å‰‡ Add Subscription 新增訂閱 Remove Subscription 移除訂閱 Update Subscriptions 更新訂閱 Learn about writing rules... 了解如何撰寫è¦å‰‡â€¦ AdBlockIcon AdBlock lets you block unwanted content on web pages AdBlock 讓您å¯ä»¥å°éŽ–ç¶²é ä¸­ä¸æƒ³è¦çš„內容 AdBlock AdBlock Show AdBlock &Settings 顯示 AdBlock é¸é … (&S) Disable on %1 在 %1 åœç”¨ Disable only on this page 僅在此é é¢åœç”¨ Blocked Popup Windows å·²å°éŽ–å½ˆå‡ºè¦–çª— %1 with (%2) %1 使用 (%2) No content blocked 未å°éޖ內容 Blocked URL (AdBlock Rule) - click to edit rule URL å·²å°éŽ– (ä¾ç…§ AdBlock è¦å‰‡) - 點擊此處以編輯è¦å‰‡ AdBlockManager EasyList EasyList AdBlockSubscription Cannot load subscription! ç„¡æ³•è¼‰å…¥è¨‚é–±ï¼ AdBlockTreeWidget Add Rule 新增è¦å‰‡ Remove Rule 移除è¦å‰‡ Add Custom Rule 新增自訂è¦å‰‡ Please write your rule here: 請在此撰寫您的è¦å‰‡: %1 (recently updated) %1 (最近更新) %1 (Error: %2) %1 (錯誤: %2) AddFeedWizard Add Feed 加入 Feed Create New Feed 建立新的 Feed Use title of the feed as displayed name 使用標題作為顯示å稱 Server requires authentication: 伺æœå™¨è¦æ±‚é©—è­‰: Username: 使用者å稱: Password: 密碼: Feed URL or website address: Feed 或網站網å€ï¼š Feeds Feeds All Feeds 所有 Feeds New Folder... 新增資料夾... Displayed name: 顯示å稱: Location: ä½ç½®: URL error! URL éŒ¯èª¤ï¼ Duplicate feed! Feed é‡è¤‡ï¼ Can't find feed URL! 找ä¸åˆ° Feed 的網å€ï¼ Request failed! è«‹æ±‚å¤±æ•—ï¼ AddFolderDialog Add Folder 加入資料夾 Feeds Feeds All Feeds 所有 Feeds Name: å稱: Location: ä½ç½®: AuthenticationDialog Save password 儲存密碼 Authorization required 需è¦èº«ä»½èªè­‰ Server: 伺æœå™¨: Message: 訊æ¯: Username: 使用者å稱: Password: 密碼: CategoriesTreeWidget Unread 未讀 Starred 標星 Deleted 已刪除 Labels 標籤 Open in New Tab 在新標籤é ä¸­é–‹å•Ÿ Clear 'Deleted' 清空「已刪除〠Mark Read 標記為已讀 CleanUpWizard Clean Up æ¸…ç† Choose Feeds 鏿“‡ Feeds All Feeds 所有 Feeds Clean Up Options 清ç†é¸é … Maximum age of news in days to keep: ä¿ç•™çš„æœ€å¤§å¤©æ•¸: Maximum number of news to keep: ä¿ç•™çš„æœ€å¤§è¨Šæ¯æ•¸: Delete read news åˆªé™¤å·²è®€è¨Šæ¯ Never delete unread news ä¸è¦åˆªé™¤æœªè®€è¨Šæ¯ Never delete starred news ä¸è¦åˆªé™¤æ¨™æ˜Ÿçš„è¨Šæ¯ Never delete labeled news ä¸è¦åˆªé™¤æœ‰æ¨™ç±¤çš„è¨Šæ¯ Clean up 'Deleted' 清ç†ã€Œå·²åˆªé™¤ã€ Purge DB 清ç†è³‡æ–™åº« Totally remove records that had marked 'deleted' from DB. Ancient news could reappear 從資料庫中完全刪除已標記為「已刪除ã€çš„記錄。 舊的訊æ¯å¯èƒ½æœƒå†æ¬¡å‡ºç¾ Information 資訊 Clean Up wizard deleted %1 news 清ç†ç²¾éˆåˆªé™¤äº† %1 ç­†è¨Šæ¯ ClickToFlash Object blocked by ClickToFlash 物件已被 ClickToFlash å°éŽ– Hide object éš±è—物件 Add '%1' to whitelist 加入「%1ã€åˆ°ç™½åå–® CustomizeToolbarDialog Customize Main Toolbar 自訂主工具列 Customize Feeds Toolbar 自訂 Feeds 工具列 Customize News Toolbar 自訂訊æ¯å·¥å…·åˆ— Load images 載入圖片 Separator 分隔字元 Icon 圖示 Text 文字 Text Beside Icon 文字在圖示æ—邊 Text Under Icon 文字在圖示下方 Big 大 Normal 正常 Small å° Style: 樣å¼: Icon Size: 圖示大å°: Add 加入 Remove 移除 Move up 上移 Move down 下移 Default é è¨­ DownloadItem Remaining time unavailable 剩餘時間無法使用 Error: Cannot write to file! éŒ¯èª¤ï¼šç„¡æ³•å¯«å…¥æª”æ¡ˆï¼ Error: 錯誤: few seconds 幾秒 seconds ç§’ minutes 分 hours å°æ™‚ Unknown size æœªçŸ¥å¤§å° Unknown speed 未知速度 %2 - unknown size (%3) %2 - æœªçŸ¥å¤§å° (%3) Remaining %1 - %2 of %3 (%4) 剩餘 %1 - %2 / %3 (%4) Cancelled - %1 已喿¶ˆ - %1 Delete file 刪除檔案 Do you want to also delete downloaded file? 您è¦ä¸€ä½µåˆªé™¤å·²ä¸‹è¼‰çš„æª”案嗎? Open File 開啟檔案 Open Folder 開啟資料夾 Copy Download Link è¤‡è£½ä¸‹è¼‰é€£çµ Cancel Downloading å–æ¶ˆä¸‹è¼‰ Remove 移除 Cancelled 已喿¶ˆ Error 錯誤 Not found 找ä¸åˆ° Sorry, the file %1 was not found! 抱歉,檔案 ⎠%1 ⎠找ä¸åˆ°ï¼ DownloadManager Clear 清除 File %1 (*.%2) 檔案 %1 (*.%2) All Files (*.*) 所有檔案 (*.*) Save As... å¦å­˜æ–°æª”... Executable: å¯åŸ·è¡Œæª”: Arguments: åƒæ•¸ï¼š FeedPropertiesDialog Properties 屬性 General 一般 Columns æ¬„ä½ Authentication é©—è­‰ Status 狀態 Title: 標題: Homepage: 首é ï¼š Feed URL: Feed ç¶²å€ï¼š Load Title 載入標題 Load Favicon 載入 Favicon Select Icon... 鏿“‡åœ–示... Select Icon 鏿“‡åœ–示 Disable update åœç”¨æ›´æ–° Automatically update every è‡ªå‹•æ›´æ–°æ¯ seconds ç§’ minutes 分 hours å°æ™‚ Starred 標星 Load images 載入圖片 Display in new tab on startup 啟動時,在新標籤é ä¸­é¡¯ç¤º Show news' description instead of loading web page 顯示訊æ¯çš„æè¿°ï¼Œè€Œä¸æ˜¯è¼‰å…¥ç¶²é  Automatically delete duplicate news 自動刪除é‡è¤‡çš„è¨Šæ¯ Display 顯示 Reading 閱讀 Enable JavaScript 啟用 JavaScript Right-to-left layout ç”±å³è‡³å·¦ç‰ˆé¢ Ascending éžå¢ž Descending éžæ¸› Sort by: 排åºä¾ï¼š Add 加入 Remove 移除 Move up 上移 Move down 下移 Default é è¨­ Server requires authentication: 伺æœå™¨è¦æ±‚é©—è­‰: Username: 使用者å稱: Password: 密碼: Feeds count: Feeds 數é‡: Description: æè¿°ï¼š Status: 狀態: Created: 建立: Last update: 最近更新: News count: 訊æ¯çµ±è¨ˆï¼š Good 好 Long ago ;-) å¾ˆä¹…ä»¥å‰ ;-) new æ–°çš„ unread 未讀 Image files 圖片檔案 Select Image 鏿“‡åœ–片 Load icon: can't open a file! 載入圖示: ä¸èƒ½é–‹å•Ÿæª”æ¡ˆï¼ FilterRulesDialog Filter Rules 篩é¸å™¨è¦å‰‡ Feeds Feeds All Feeds 所有 Feeds Filter name: 篩é¸å™¨å稱: Match all news ç›¸ç¬¦æ‰€æœ‰è¨Šæ¯ Match all conditions 相符所有æ¢ä»¶ Match any condition 相符任何æ¢ä»¶ Perform these actions: 執行下列æ“作: Please enter name for the filter. 請為篩é¸å™¨è¼¸å…¥å稱。 Please enter search condition for the news filter. 請為訊æ¯ç¯©é¸å™¨è¼¸å…¥æœå°‹æ¢ä»¶ã€‚ FindFeed Find Name 尋找å稱 Find Link å°‹æ‰¾é€£çµ FindTextContent Find in News 在訊æ¯ä¸­å°‹æ‰¾ Find in Titles 尋找標題 Find in Authors 尋找作者 Find in Categories 尋找分類 Find in Descriptions æœå°‹æè¿° Find in Links 在éˆçµä¸­æœå°‹ Find in Browser 在ç€è¦½å™¨ä¸­å°‹æ‰¾ FtpDownloader Canceled! 已喿¶ˆï¼ ItemAction Mark News as Read 標記訊æ¯ç‚ºå·²è®€ Add Star 加星 Delete 刪除 Add Label 加入標籤 Play a Sound 播放音效 Show News in Notifier åœ¨é€šçŸ¥å™¨ä¸­é¡¯ç¤ºæ–°èž Browse ç€è¦½ Play 播放 Add Action 加入æ“作 Delete Action 刪除æ“作 Open File... 開啟檔案... ItemCondition Title 標題 Description æè¿° Author 作者 Category 分類 State 狀態 Link éˆçµ News è¨Šæ¯ New æ–°çš„ Read 已讀 Starred 標星 Add Condition 加入æ¢ä»¶ Delete Condition 刪除æ¢ä»¶ contains åŒ…å« doesn't contains ä¸åŒ…å« is 是 isn't 䏿˜¯ begins with 以...é–‹å§‹ ends with 以...çµå°¾ Regular expressions æ­£è¦è¡¨é”å¼ LabelDialog New Label 新標籤 Load icon... 載入圖示... Default é è¨­ Select color... 鏿“‡é¡è‰²... Name: å稱: Icon: 圖示: Color text: 文字é¡è‰²: Color background: 背景é¡è‰²: Image files 圖片檔案 Select Image 鏿“‡åœ–片 Load icon: can't open a file! è¼‰å…¥åœ–ç¤ºï¼šç„¡æ³•é–‹å•Ÿæª”æ¡ˆï¼ MainApplication Saving data... 正在儲存資料… MainWindow &AdBlock AdBlock (&A) Hide Categories éš±è—分類 Show Categories 顯示分類 Select OPML-File 鏿“‡ OPML 檔案 OPML-Files (*.%1 *.%2) OPML 檔案 (*.%1 *.%2) Import canceled åŒ¯å…¥å·²å–æ¶ˆ Import: can't open a file 匯入: 無法開啟檔案 OPML-Files (*.%1) OPML 檔案 (*.%1) Export canceled åŒ¯å‡ºå·²å–æ¶ˆ Export: can't open a file 匯出: 無法開啟檔案 Unread: %1 未讀: %1 All: %1 所有: %1 (Browser) (ç€è¦½å™¨) New News: %1 新的訊æ¯: %1 Unread News: %1 未讀的訊æ¯: %1 &Add 加入(&A) Add New Feed 加入新的 Feed &Feed... Feeds(&F)... F&older... 資料夾(&O)... Add New Folder 加入新的資料夾 Open in New Tab 在新分é é–‹å•Ÿ &Delete... 刪除(&D)... Delete Selected Feed 刪除é¸å–çš„ Feed &Import Feeds... 匯入 Feeds(&I)... Import Feeds from OPML File 從 OPML 檔案匯入 Feeds &Export Feeds... 匯出 Feeds(&E)... Export Feeds to OPML File 匯出 Feeds 到 OPML 檔案 E&xit 退出(&X) Update Feed æ›´æ–° Feed Update Current Feed æ›´æ–°ç›®å‰ Feed Update All 全部更新 Update All Feeds 更新所有 Feeds Mark All Feeds Read 標記所有 Feeds 已讀 Mark Read/Unread 標記為已讀/未讀 Mark Current News Read/Unread 標記目å‰è¨Šæ¯ç‚ºå·²è®€/未讀 Mark All News Read 標記所有訊æ¯ç‚ºå·²è®€ Downloads 下載 Clean Up... 清ç†... News Filters... 訊æ¯ç¯©é¸å™¨... Filter News... 篩é¸è¨Šæ¯... Options... é¸é …​​... Open Options Dialog 開啟é¸é …å°è©±æ¡† Filter Feeds ç¯©é¸ Feeds Show All 全部顯示 Show New 顯示新的 Show Unread 顯示未讀的 Show Starred Feeds 顯示標星的 Feeds Show Not Working Feeds 顯示沒有工作的 Feeds Filter News 篩é¸è¨Šæ¯ Show Starred 顯示標星的 Show Not Starred 顯示未標星的 Show Unread or Starred 顯示未讀的或者標星的 Show Last Day 顯示最近 1 天 Show Last 7 Days 顯示最近 7 天 About... 關於... Show 'About' Dialog 顯示「關於ã€å°è©±æ¡† Check for Updates... 檢查更新... Report a Problem... 報告å•題... Open News é–‹å•Ÿè¨Šæ¯ Open in Browser 在ç€è¦½å™¨ä¸­é–‹å•Ÿ Open in External Browser 在外部ç€è¦½å™¨ä¸­é–‹å•Ÿ Open News in External Browser 在外部ç€è¦½å™¨ä¸­é–‹å•Ÿè¨Šæ¯ Open News in New Tab 在新標籤é ä¸­é–‹å•Ÿè¨Šæ¯ Open in Background Tab 在背景標籤é ä¸­é–‹å•Ÿ Open News in Background Tab 在背景標籤é ä¸­é–‹å•Ÿè¨Šæ¯ Star 加星 Mark News Star è¨Šæ¯æ¨™æ˜Ÿ Delete 刪除 Delete Selected News 刪除é¸å–çš„è¨Šæ¯ Delete All News åˆªé™¤æ‰€æœ‰è¨Šæ¯ Delete All News from List å¾žåˆ—è¡¨ä¸­åˆªé™¤æ‰€æœ‰è¨Šæ¯ Restore æ¢å¾© Restore News æ¢å¾©è¨Šæ¯ Copy Link è¤‡è£½é€£çµ Restore last deleted news æ¢å¾©æœ€è¿‘åˆªé™¤çš„è¨Šæ¯ Mark Read 標記為已讀 Mark Feed Read 標記 Feed 為已讀 Properties 屬性 &File 檔案(&F) Count Unread News æœªè®€è¨Šæ¯æ•¸é‡ Count All News æ‰€æœ‰è¨Šæ¯æ•¸é‡ Last Update 最近更新 Reset browser zoom é‡è¨­ç€è¦½å™¨çš„ç¸®æ”¾å¤§å° Print Web Page 列å°ç¶²é  Preview Web Page é è¦½ç¶²é  Save page in database å°‡é é¢å„²å­˜æ–¼è³‡æ–™åº« Save page in database instead of news description å°‡é é¢å„²å­˜æ–¼è³‡æ–™åº«ï¼Œè€Œéžåªæœ‰è¨Šæ¯æè¿° Confirm Delete 確èªåˆªé™¤ Are you sure to delete selected elements? 您確定è¦åˆªé™¤é¸æ“‡çš„元素? Menu é¸å–® Add Feed... 加入 Feed... &Create Backup... 建立備份 (&C)… S&how Menu Bar 顯示é¸å–®åˆ—(&H) Stop Update Feeds åœæ­¢æ›´æ–° Feed Open News Description é–‹å•Ÿè¨Šæ¯æè¿° Copy News Link 複製訊æ¯é€£çµ &View 檢視(&V) Fee&ds Fee&ds &News 訊æ¯(&N) &Browser ç€è¦½å™¨(&B) &Tools 工具(&T) &Help 說明(&H) Main Toolbar 主工具列 Customize Toolbar 自訂工具列 Main Toolbar... 主工具列... Customize Toolbar... 自訂工具列... Feeds Toolbar... Feeds 工具列... News Toolbar... 訊æ¯å·¥å…·åˆ—... Lock Toolbar 鎖定工具列 Hide Toolbar éš±è—工具列 Layout ç‰ˆé¢ Classic 京點 Newspaper 報紙 Application Style æ‡‰ç”¨ç¨‹å¼æ¨£å¼ System 系統 System2 系統2 Green 綠色 Orange 橙色 Purple 紫色 Pink 粉紅色 Gray ç°è‰² Browser Position ç€è¦½å™¨ä½ç½® Top 頂部 Bottom 底部 Right å³é‚Š Left 左邊 Show Window 顯示視窗 Previous Feed å‰ä¸€å€‹ Feed Next Feed 下一個 Feed Previous News å‰é¢çš„è¨Šæ¯ Next News 後é¢çš„è¨Šæ¯ News Page Up 訊æ¯å‘ä¸Šç¿»é  News Page Down 訊æ¯å‘ä¸‹ç¿»é  Next Unread News å¾Œé¢æœªè®€çš„è¨Šæ¯ Previous Unread News å‰é¢æœªè®€çš„è¨Šæ¯ Switch Focus to Next Panel 焦點切æ›åˆ°ä¸‹ä¸€å€‹é¢æ¿ Switch Focus to Next Panel (Tree Feeds, List News, Browser) 焦點切æ›åˆ°ä¸‹ä¸€å€‹é¢æ¿ (Feeds 樹ã€è¨Šæ¯åˆ—表ã€ç€è¦½å™¨) Switch Focus to Previous Panel 焦點切æ›åˆ°å‰ä¸€å€‹é¢æ¿ Switch Focus to Previous Panel (Tree Feeds, Browser, List News) 焦點切æ›åˆ°å‰ä¸€å€‹é¢æ¿ (Feeds 樹ã€è¨Šæ¯åˆ—表ã€ç€è¦½å™¨) Show/Hide Tree Feeds 顯示/éš±è— Feeds 樹 Minimize to Tray 最å°åŒ–到系統匣 Minimize Application to Tray 最å°åŒ–程å¼åˆ°ç³»çµ±åŒ£ Columns 列 Show Indentation 顯示縮排 Search Feed æœå°‹ Feed Zoom 縮放 Zoom In 放大 Zoom in in browser 在ç€è¦½å™¨ä¸­æ”¾å¤§ Zoom Out ç¸®å° Zoom out in browser 在ç€è¦½å™¨ä¸­ç¸®å° 100% 100% Print... 列å°... Print Preview... 列å°é è¦½... Page up (Browser) 上一é ï¼ˆç€è¦½å™¨ï¼‰ Page down (Browser) 下一é ï¼ˆç€è¦½å™¨ï¼‰ Save As... å¦å­˜ç‚º... Save Page As... é é¢å¦å­˜ç‚º... Show/Hide 顯示/éš±è— Feeds Toolbar Feeds 工具列 News Toolbar 訊æ¯å·¥å…·åˆ— Browser Toolbar ç€è¦½å™¨å·¥å…·åˆ— Panel Categories 颿¿åˆ†é¡ž Status Bar 狀態列 Full Screen 全螢幕 Stay On Top ç•™åœ¨æœ€ä¸Šé¢ Categories 分類 Label 標籤 Show labels menu 顯示標籤é¸å–® Close Tab é—œé–‰æ¨™ç±¤é  Close Other Tabs é—œé–‰å…¶ä»–æ¨™ç±¤é  Close All Tabs é—œé–‰æ‰€æœ‰æ¨™ç±¤é  Switch to next tab 切æ›åˆ°ä¸‹ä¸€å€‹æ¨™ç±¤é  Switch to previous tab 切æ›åˆ°å‰ä¸€å€‹æ¨™ç±¤é  Unread 未讀 Starred 已標星 Deleted 已刪除 Labels 標籤 Decrease news list/increase browser æ¸›å°‘è¨Šæ¯æ¸…å–®/增加ç€è¦½å™¨ Increase news list/decrease browser å¢žåŠ è¨Šæ¯æ¸…å–®/減少ç€è¦½å™¨ Find 尋找 Open Homepage Feed é–‹å•Ÿé¦–é  Feed Sort by Name ä¾ç…§åç¨±æŽ’åº Collapse All Folders 折疊所有資料夾 Expand All Folders 展開所有資料夾 Next Folder 下一個資料夾 Previous Folder 上一個資料夾 Expand Folder 展開資料夾 Setting Page: Labels 設定é é¢ï¼šæ¨™ç±¤ Share 分享 Sort By 排åºä¾ Ascending éžå¢ž Descending éžæ¸› Check for updates 檢查更新 A new version of QuiteRSS... 有新版的 QuiteRSS å¯ä»¥ä¸‹è¼‰â€¦ Loading... 載入... Web Page ç¶²é  Save As å¦å­˜ç‚º HTML-Files (*.%1) HTML 檔案 (*.%1) Text files (*.%2) 文字檔案 (*.%2) Save As: can't open a file å¦å­˜: ä¸èƒ½é–‹å•Ÿæª”案 Choose Directory 鏿“‡è³‡æ–™å¤¾ Important é‡è¦ Work 工作 Personal 個人 To Do 計劃 Later 以後 Amusingly 有趣的 NetworkManager SSL Certificate Error! SSL èªè­‰éŒ¯èª¤ï¼ The "%1" server has the following errors in the SSL certificate: 「%1ã€ä¼ºæœå™¨æœ‰ä»¥ä¸‹çš„ SSL 憑證錯誤: <b>Organization: </b> <b>組織: </b> <b>Domain Name: </b> <b>網域å稱: </b> <b>Expiration Date: </b> <b>失效日期: </b> <b>Error: </b> <b>錯誤: </b> Would you like to make an exception for this certificate? 您想è¦å°‡é€™å€‹æ†‘證作為例外嗎? NewsFiltersDialog News Filters 訊æ¯ç¯©é¸å™¨ Feeds Feeds Filter Name éŽæ¿¾å™¨å稱 New... 新增... Edit... 編輯... Delete... 刪除... Move up 上移 Move down 下移 Run Filter 執行篩é¸å™¨ Delete Filter 刪除篩é¸å™¨ Are you sure you want to delete the filter '%1'? 您確定è¦åˆªé™¤éŽæ¿¾å™¨ã€Œ%1ã€å—Žï¼Ÿ NewsHeader Icon Feed 圖示 Feed Title 標題 Published 發佈日期 Received 接收時間 Author 作者 Category 分類 Read 已讀 Star 加星 Label 標籤 Feed Title Feed 標題 Link é€£çµ NewsItem Mark Read/Unread 標記 已讀/未讀 Delete News åˆªé™¤è¨Šæ¯ NewsTabWidget Loading... (%p%) 載入中…(%p%) Home é¦–é  Open Page in External Browser 在外部ç€è¦½å™¨ä¸­é–‹å•Ÿé é¢ Open Link in External Browser 在外部ç€è¦½å™¨ä¸­é–‹å•Ÿé€£çµ Open Link é–‹å•Ÿé€£çµ Open in New Tab 在新標籤é ä¸­é–‹å•Ÿ Save Link... 儲存連çµ... Save Image... 儲存圖片... Copy Link è¤‡è£½é€£çµ Copy 複製 Go Back 返回 Go Forward å‰é€² Stop åœæ­¢ Reload æ›´æ–° Copy Image 複製圖片 Copy Image Address 複製圖片ä½å€ Load Images 載入圖片 Auto Load Images to News View 自動載入圖片到訊æ¯é è¦½ No Load Images ä¸è¼‰å…¥åœ–片 No Load Images to News View ä¸è¼‰å…¥åœ–片到訊æ¯é è¦½ Close Tab é—œé–‰æ¨™ç±¤é  Auto Load Images in News View è‡ªå‹•æ–¼è¨Šæ¯æª¢è¦–中載入圖片 Don't Load Images ä¸è¦è¼‰å…¥åœ–片 Don't Load Images in News View ä¸è¦åœ¨è¨Šæ¯æª¢è¦–中載入圖片 Comments 迴響 Author: %1 作者: %1 audio 音訊 video 視訊 media 多媒體 Link to 連çµåˆ° Mark Read/Unread 標示為已讀 / 未讀 Mark News Star ç‚ºæ–°èžæ¨™æ˜Ÿ Label 標籤 Share 分享 Open News in External Browser 用外部ç€è¦½å™¨é–‹å•Ÿæ–°èž Delete 刪除 NotificationWidget Close 關閉 Mark All News Read 標記所有訊æ¯ç‚ºå·²è®€ Previous Page ä¸Šä¸€é  Next Page ä¸‹ä¸€é  Incoming News: %1 收到的訊æ¯: %1 Page %1 of %2 第 %1 é ï¼Œå…± %2 é  OptionsDialog Options é¸é … General 一般 System Tray 系統匣 Network Connections 網路連線 Browser ç€è¦½å™¨ Feeds Feeds Labels 標籤 Notifications 通告 Passwords 密碼 Language 語言 Fonts & Colors å­—åž‹åŠè‰²å½© Keyboard Shortcuts éµç›¤å¿«é€Ÿéµ Warning: key is already assigned to 警告:按éµå·²ç¶“分é…給 Show splash screen on startup åœ¨å•Ÿå‹•æ™‚é¡¯ç¤ºå•Ÿå‹•ç•«é¢ Reopen last opened feeds on startup åœ¨å•Ÿå‹•æ™‚é‡æ–°é–‹å•Ÿæœ€è¿‘開啟的 feeds Open new tab next to active åœ¨ç›®å‰æ¨™ç±¤æ—邊開啟一個新的標籤 Hide feeds tree when opening tabs é–‹å•Ÿæ¨™ç±¤é æ™‚ï¼Œéš±è— feeds 樹 Show default rss-icon instead of favourite one 顯示é è¨­çš„ RSS åœ–ç¤ºï¼Œè€Œä¸æ˜¯æœ€å–œæ­¡çš„ Automatically collapse folders 自動折疊資料夾 Show close button on tab åœ¨åˆ†é æ¨™ç±¤ä¸­é¡¯ç¤ºé—œé–‰æŒ‰éˆ• Automatically check for updates 自動檢查更新 Help improve QuiteRSS by sending usage information 傳é€ä½¿ç”¨è³‡è¨Šä¾†å¹«åŠ©æ”¹å–„ QuiteRSS Store a DB in memory (requires program restart) 在記憶體中儲存資料庫 (需è¦é‡æ–°å•Ÿå‹•程å¼) Save DB stored in memory to file every å°‡è¨˜æ†¶é«”ä¸­çš„è³‡æ–™åº«å„²å­˜åˆ°æª”æ¡ˆï¼Œæ¯ minutes åˆ†é˜ Run QuiteRSS at Windows startup 在 Windows 啟動時執行 QuiteRSS Show system tray icon 顯示系統匣圖示 starting QuiteRSS 啟動 QuiteRSS minimizing QuiteRSS 最å°åŒ– QuiteRSS closing QuiteRSS 關閉 QuiteRSS Show static icon é¡¯ç¤ºéœæ…‹åœ–示 Change icon for incoming new news 變更收到新訊æ¯çš„圖示 Show count of new news é¡¯ç¤ºæ–°çš„è¨Šæ¯æ•¸ Show count of unread news é¡¯ç¤ºæœªè®€è¨Šæ¯æ•¸ Single click instead of double click for show window 按一下就顯示視窗 Empty working set on minimize to tray 清空工作組最å°åŒ–到系統匣 Move to the system tray when: 移動到系統匣: Tray icon behavior: 系統匣圖示行為: Direct connection to the Internet 直接連線至網際網路 System proxy configuration (if available) 系統代ç†çµ„æ…‹ (如果å¯ç”¨) Manual proxy configuration: 手動設定 Proxy: Proxy server: 代ç†ä¼ºæœå™¨: Port: 連接埠: Username: 使用者å稱: Password: 密碼: Request timeout: 請求逾時: Number of requests: 請求數é‡: Number of retries: é‡è©¦æ•¸é‡: Options network requests when updating feeds (requires program restart): 當更新訂閱 feeds 時 (需è¦é‡æ–°å•Ÿå‹•程å¼),請求網路é¸é …: Use embedded browser 使用嵌入å¼ç€è¦½å™¨ Use external browser 使用外部ç€è¦½å™¨ Default external browser é è¨­çš„外部ç€è¦½å™¨ Following external browser: 以下外部ç€è¦½å™¨: Browse... ç€è¦½... Load images 載入圖片 Enable JavaScript 啟用 JavaScript Enable plug-ins 啟用外掛 Open links in embedded browser in background 在嵌入ç€è¦½å™¨èƒŒæ™¯é–‹å•Ÿé€£çµ Open links in external browser in background (experimental) 在外部ç€è¦½å™¨èƒŒæ™¯é–‹å•Ÿé€£çµ (實驗性) Default zoom on pages: é é¢çš„é è¨­ç¸®æ”¾ï¼š Browser selection: ç€è¦½å™¨çš„鏿“‡: External browser: 外部ç€è¦½å™¨: Content: 內容: User style sheet: 使用者樣å¼è¡¨ï¼š Maximum pages in cache å¿«å–ä¸­çš„æœ€å¤§é æ•¸ Store cache in: å„²å­˜å¿«å–æ–¼ï¼š Maximum size of disk cache ç£ç¢Ÿå¿«å–çš„æœ€å¤§å¤§å° MB MB Use disk cache 使用ç£ç¢Ÿå¿«å– Allow local data to be set å…許在本機設定資料 Keep local data only until quit application 僅在退出應用程å¼ä¹‹å‰ä¿ç•™æœ¬æ©Ÿè³‡æ–™ Block sites from setting any data ä¸å…許任何網站設定資料 Clear 清除 Cookies: Cookies: Click To Flash is a plugin which blocks auto loading of Flash content at page. You can always load it manually by clicking on the Flash play icon. Click To Flash 是一個阻止網é ä¸­çš„ Flash 內容自動載入的外掛程å¼ã€‚按一下 Flash 播放圖示播放。 Use Click to Flash 使用 Click to Flash 功能 Add... 加入... Remove... 移除... Ask where to save each file before downloading 下載æ¯å€‹æª”案å‰è©¢å•儲存ä½ç½® Download location: 下載ä½ç½®ï¼š History æ­·å² Click to Flash Click to Flash Downloads 下載 Automatically update the feeds on startup 在啟動時自動更新 feeds Automatically update the feeds every 自動更新 feeds æ¯ seconds ç§’ hours å°æ™‚ Nothing to do ä¸åšä»»ä½•事 Dec Dec December å二月 Display format for date: 顯示日期格å¼: time: 時間: Alternating row background colors 交替行的背景é¡è‰² Simplified representation of date and time 簡化表示的日期和時間 Show All 全部顯示 Show New 顯示新的 Show Unread 顯示未讀的 Show Starred 顯示標星的 Show Not Starred 顯示未標星的 Show Unread or Starred 顯示未讀的或者標星的 Show Last Day 顯示最近一天 Show Last 7 Days 顯示最近 7 天 Style sheet for news: è¨Šæ¯æ¨£å¼è¡¨: Mark news as read: 標記訊æ¯ç‚ºå·²è®€: on selecting. With timeout 閱讀訊æ¯è¶…éŽ after switching to another news 切æ›åˆ°å¦ä¸€æ¢è¨Šæ¯å¾Œ Mark displayed news as read when switching feeds åˆ‡æ› feeds 時,將已閱讀的文章標記為已讀 Mark displayed news as read when closing tab é—œé–‰åˆ†é æ™‚,將已閱讀的文章標記為已讀 Mark displayed news as read on minimize 最å°åŒ–時,將已閱讀的文章標記為已讀 Change behavior of action 'Next Unread News' 變更æ“作「下一個未讀訊æ¯ã€çš„行為 starred news æ¨™æ˜Ÿçš„è¨Šæ¯ labeled news æœ‰æ¨™ç±¤çš„è¨Šæ¯ Automatically mark identical news as read 自動將相åŒçš„è¨Šæ¯æ¨™è¨˜ç‚ºå·²è®€ Prevent accidental deletion of: 防止æ„外刪除: Enable cleanup on shutdown é—œé–‰æ™‚é€²è¡Œæ¸…ç† Maximum age of news in days to keep: ä¿ç•™çš„æœ€å¤§å¤©æ•¸: Maximum number of news to keep: ä¿ç•™çš„æœ€å¤§è¨Šæ¯æ•¸: Delete read news åˆªé™¤å·²è®€è¨Šæ¯ Never delete unread news ä¸è¦åˆªé™¤æœªè®€è¨Šæ¯ Never delete starred news ä¸è¦åˆªé™¤æ¨™æ˜Ÿçš„è¨Šæ¯ Never delete labeled news ä¸è¦åˆªé™¤æœ‰æ¨™ç±¤çš„è¨Šæ¯ Clean up 'Deleted' 清ç†ã€Œå·²åˆªé™¤ã€ Enable DB optimization (slower shutdown) 最佳化資料庫 (關閉速度較慢) Reading 閱讀中 Clean Up æ¸…ç† New... 新增... Edit... 編輯... Delete... 刪除... Move up 上移 Move down 下移 Show when inactive main window 當主視窗ä¸åœ¨æœ€ä¸Šå±¤æ™‚顯示 Screen ç•«é¢ Transparency 逿˜Žåº¦ Show titles feeds 顯示標題 feeds Show icon feed 顯示圖示 feed Show button 'Mark All News Read' 顯示「標示所有訊æ¯ç‚ºå·²è®€ã€æŒ‰éˆ• Show button 'Mark Read/Unread' 顯示「標示 已讀/æœªè®€ã€æŒ‰éˆ• Show button 'Open in External Browser' 顯示「在外部ç€è¦½å™¨ä¸­é–‹å•Ÿã€æŒ‰éˆ• Show button 'Delete News' 顯示「刪除訊æ¯ã€æŒ‰éˆ• Play sound for incoming new news æ”¶åˆ°æ–°çš„è¨Šæ¯æ’­æ”¾è²éŸ³ Play 播放 Display notification for incoming news 收到訊æ¯é¡¯ç¤ºé€šå‘Š Top Left 左上 Top Right å³ä¸Š Bottom Left 左下 Bottom Right å³ä¸‹ Review 審查 Position ä½ç½® Show maximum of 顯示最大 item on page notification 通告é ä¸Šçš„é …ç›® Width list items 清單項目寬度 pixels åƒç´  Close notification after 在...之後關閉通告 Do not show notification in fullscreen mode 在全螢幕模å¼ä¸‹ä¸é¡¯ç¤ºæé†’ Display 顯示 Action mouse on news opening: 使用滑鼠開啟新èžçš„行為: Single Click: 單擊: Double Click: 雙擊: Middle Click: 中éµé»žæ“Š: Only show selected feeds: åªé¡¯ç¤ºé¸å–çš„ feeds: Notification 通知 Sound 音效 Selection of feeds 鏿“‡ feed All Feeds 所有 Feeds Site 網站 User 使用者 Password 密碼 Delete 刪除 Delete All 全部刪除 Show Passwords 顯示密碼 Version 版本 Author 作者 Contact è¯çµ¡ Choose language: 鏿“‡èªžè¨€: Type 類型 Font å­—åž‹ Feeds list font Feeds 列表字型 News list font 訊æ¯åˆ—表字型 News title font è¨Šæ¯æ¨™é¡Œå­—åž‹ News text font è¨Šæ¯æ–‡å­—å­—åž‹ Notification font 通告字型 Change... 變更... Reset é‡è¨­ Feeds list color Feeds 列表色彩 Feeds list background Feeds 列表背景 News list color 訊æ¯åˆ—表色彩 News list background 訊æ¯åˆ—表背景 Focused news color 焦點訊æ¯è‰²å½© Focused news background color 焦點訊æ¯èƒŒæ™¯è‰²å½© Link color 連çµè‰²å½© Title color 標題色彩 Date color 日期色彩 Author color 作者色彩 News text color è¨Šæ¯æ–‡å­—é¡è‰² News title background è¨Šæ¯æ¨™é¡ŒèƒŒæ™¯ News background 訊æ¯èƒŒæ™¯ Feed with new news Feed çš„æ–°æ¶ˆæ¯ Count of unread news in feeds tree 在 Feed æ¨¹ä¸­è¨ˆç®—æœªè®€è¨Šæ¯æ•¸ Disabled feed å·²åœç”¨çš„ feed Alternating row colors äº¤éŒ¯é¡¯ç¤ºæ¯æ¬„é¡è‰² Notification text color 通知文字色彩 Notification background color 通知背景é¡è‰² Auto load images in news view è‡ªå‹•æ–¼è¨Šæ¯æª¢è¦–中載入圖片 Text color of new news 新訊æ¯çš„æ–‡å­—é¡è‰² Show feeds tree toggle 顯示 Feed 樹切æ›é–‹é—œ Clear new status when minimize to tray 縮å°åˆ°å·¥å…·åˆ—時清除新消æ¯ç‹€æ…‹ Set focus on the last opened news 將焦點移動至先å‰é–‹å•Ÿçš„è¨Šæ¯ Set focus at the top of news list å°‡ç„¦é»žç§»å‹•è‡³è¨Šæ¯æ¸…單頂端 Set focus on the unread news å°‡ç„¦é»žç§»å‹•è‡³æœªè®€è¨Šæ¯ Open the news é–‹å•Ÿè¨Šæ¯ Default news filter: é è¨­è¨Šæ¯ç¯©é¸å™¨: Action on feed opening: feed 開啟行為: Show news description instead of loading web page é¡¯ç¤ºè¨Šæ¯æè¿°ï¼Œè€Œä¸ç›´æŽ¥è¼‰å…¥ç¶²é  Text color of unread news 未讀訊æ¯çš„æ–‡å­—é¡è‰² Focused feed color 焦點 feed 色彩 Focused feed background color 焦點 feed 背景色彩 Standard 標準 Fixed 固定字型 Serif 有襯線字型 Sans Serif 新細明體 Cursive è‰ç¨¿ Fantasy 幻想 Default font size é è¨­å­—åž‹å¤§å° Fixed font size å›ºå®šå­—åž‹å¤§å° Minimum font size 最å°å­—åž‹å¤§å° Minimum logical font size 最å°é‚è¼¯å­—åž‹å¤§å° Font families: 字型家æ—: Font sizes: 字形大å°ï¼š Fonts å­—åž‹ Fonts Browser å­—åž‹ç€è¦½å™¨ Colors 色彩 Filter 篩é¸å™¨ Action æ“作 Description æè¿° Shortcut å¿«é€Ÿéµ Shortcut: 快速éµ: Open File... 開啟檔案... Select Style Sheet File é¸å–樣å¼è¡¨æª”案 Open Directory... 開啟目錄... Add site to whitelist 加入網站到白åå–® Site without 'http://' (ex. youtube.com) 網站ä¸å«ã€Œhttp://ã€(例如:youtube.com) QAbstractSpinBox &Step up å‘上(&S) Step &down å‘下(&D) &Select All å…¨é¸(&S) QDialogButtonBox Close 關閉 Cancel å–æ¶ˆ &Yes 是(&Y) &No å¦(&N) QFtp Not connected 沒有連線 Host %1 not found 找ä¸åˆ°ä¸»æ©Ÿ %1 Connection refused to host %1 主機 %1 拒絕連線 Connection timed out to host %1 主機 %1 連線逾時 Connected to host %1 連線到主機 %1 Connection refused for data connection 資料連線被拒絕 Unknown error 未知錯誤 Connecting to host failed: %1 連線到主機失敗: %1 Login failed: %1 登入失敗: %1 Listing directory failed: %1 列出目錄失敗: %1 Changing directory failed: %1 變更目錄失敗: %1 Downloading file failed: %1 檔案下載失敗: %1 Uploading file failed: %1 檔案上傳失敗: %1 Removing file failed: %1 檔案移除失敗: %1 Creating directory failed: %1 建立目錄失敗: %1 Removing directory failed: %1 移除目錄失敗: %1 Connection closed 連線已關閉 QLineEdit &Undo 還原(&U) &Redo é‡åš(&R) Cu&t 剪下(&T) &Copy 複製(&C) &Paste 貼上(&P) Delete 刪除 Select All å…¨é¸ QMultiInputContext Select IM 鏿“‡ IM QObject Cannot start external program ç„¡æ³•å•Ÿå‹•å¤–éƒ¨ç¨‹å¼ Cannot start external program! %1 無法啟動外部程å¼ï¼%1 Error 錯誤 QTextControl &Undo 還原(&U) &Redo é‡åš(&R) Cu&t 剪下(&T) &Copy 複製(&C) &Paste 貼上(&P) Delete 刪除 Select All å…¨é¸ Copy &Link Location 複製連çµä½å€(&L) QWizard Cancel å–æ¶ˆ < &Back < 返回(&B) &Finish 完æˆ(&F) &Next > 下一步(&N) > RSSDetectionWidget Untitled feed 未命å feed RequestFeed Server requires authentication! 伺æœå™¨è¦æ±‚é©—è­‰ï¼ Server replied: Not Found! 伺æœå™¨å›žæ‡‰ï¼šæ‰¾ä¸åˆ°ï¼ Redirect error! 釿–°å°Žå‘éŒ¯èª¤ï¼ Request timeout! è«‹æ±‚é€¾æ™‚ï¼ SQLiteDriver Error opening database 開啟資料庫時發生錯誤 Error closing database 關閉資料庫時發生錯誤 Unable to begin transaction 無法開始交易 Unable to commit transaction 無法進行交易 Unable to rollback transaction 無法還原交易 SQLiteResult Unable to fetch row 無法å–å›žæ¬„ä½ No query 沒有查詢 Unable to execute statement 無法執行表é”å¼ Unable to execute multiple statements at a time 無法一次執行多個表é”å¼ Unable to reset statement 無法é‡è¨­è¡¨é”å¼ Unable to bind parameters 無法ç¶å®šåƒæ•¸ Parameter count mismatch åƒæ•¸æ•¸é‡ä¸æ­£ç¢º SslErrorDialog SSL Certificate Error! SSL èªè­‰éŒ¯èª¤ï¼ Only for this session 僅此工作階段 UpdateAppDialog Check for Updates 檢查更新 Checking for updates... 正檢查更新... Loading history... 載入版本歷å²... Don't remind about this version ä¸è¦å†æé†’這個版本 &Install 安è£(&I) You already have the latest version 您已經是最新版本 A new version of QuiteRSS is available! 有新版的 QuiteRSS å¯ä»¥ä¸‹è¼‰ï¼ Click here to go to the download page 點擊這裡進入下載é é¢ Your version is: 您的版本是: Current version is: ç›®å‰çš„版本是: Error checking updates 檢查更新發生錯誤 quiterss-0.18.3/lang/tsupdate.bat000066400000000000000000000000531265173051100167230ustar00rootroot00000000000000lupdate .. -no-obsolete -ts quiterss_en.ts quiterss-0.18.3/quiterss.appdata.xml000066400000000000000000000022641265173051100175010ustar00rootroot00000000000000 quiterss.desktop CC0-1.0 GPL-3.0+ QuiteRSS Free news reader

QuiteRSS is an easy to use application designed to help you keep track of the latest news on your RSS feeds. It is quite fast and comfortable to user.

The program allows you to add as many RSS feed links as you want. You can update the feeds manually.

https://github.com/QuiteRSS/tools/raw/master/screenshots/screenshots01.png https://github.com/QuiteRSS/tools/raw/master/screenshots/screenshots02.png https://github.com/QuiteRSS/tools/raw/master/screenshots/screenshots07.png https://quiterss.org quiterssteam@gmail.com
quiterss-0.18.3/quiterss.desktop000066400000000000000000000006561265173051100167440ustar00rootroot00000000000000[Desktop Entry] Name=QuiteRSS Exec=quiterss Icon=quiterss Type=Application GenericName=RSS/Atom feed reader GenericName[pt]=Leitor de fontes RSS/Atom Comment=QuiteRSS is a RSS/Atom feed reader written in C++/Qt4 Comment[pt]=O Quite RSS é um leitor de fontes RSS/Atom desenvolvido em C++/Qt4 Terminal=false Categories=Qt;Network;News; MimeType=application/rss+xml;application/atom+xml;application/rdf+xml; X-DBUS-StartupType=none quiterss-0.18.3/quiterss.icns000066400000000000000000002303751265173051100162320ustar00rootroot00000000000000icns0ýic08$ jP ‡ ftypjp2 jp2 Ojp2hihdrcolr"cdef­jp2cÿOÿQ2ÿR ÿ\@@HHPHHPHHPHHPHHPÿd Axialisÿ =ÿS ÿ]@@HHPHHPHHPHHPHHPÿS ÿ]@@HHPHHPHHPHHPHHPÿS ÿ]@@HHPHHPHHPHHPHHPÿ“ßz •:ÅûáÉP¡Êþí¾xÝã öntc&\¦{Oð8Ö0í°N+¦ê)¸Éz9BFEwÁä´à›"{ sm½C¢gS%ŸÏ°øÐ×ó”¤øØ’’¾+l(ú(…îcÔ‘@Åç?nÈÓ»Ö$Óg:§AvŸÑç¹ó#Š!ÈÂÒ´E‡ŸBv/ϱÐùmù|ßç­;ç§©$ÄßÚd0ß-3—˜¶'^¶÷š Äÿ#kÈß`UÀÈáV~غDng÷uì*É×WßyÈÝÌ}¡2,ƒKLd†öZ!ªi9’Wt´t_ï0Bæ>ЃÑHþc‘7æâ.±ÇÌ “ù¡ÇØyaì>ð4ޝâÿ´pš~Ìü³Až k„ý+qHÌwBæY ±h\ž´ÀIÈ=KØyÕÕáiy XÜÏ©l@ÊšýÞÄ)Ž×†2½V\bx_R/梠@Ÿ€*#~` X®Íb¾˜Î?8£0›sÙ5‡«Â~Z®'¦Z µi_gL²ÓWC½;myËjX–£›¤ð5Ó0(ùXSSikdÑHª¿(Y½dít¸@³ D>~/ŸÇØyaÌ>à)9‰¼´½6\!þÛ.rbÆ2òñ¤²?#?½PøÃº÷žñ Ìd?pÁýhô•užàôX—QiŸ†ÿv¥0Þà¦ØïÇü©¿yX¦­Îj… Ú žšØÎNÕ…m=4œÕ[/&SÁ‡C “£Hß)/|M…Š>S‘3:¡·™Îëiú"2ûÚ¤ÞšÖ`TŒ¹ë¬½¦ql Ê{8³°m‰8W 6Îéê÷9=ŸÇØaä}çÀ-ÑE ³ÉÊzºrqE-K1°ü@1ÂÿnÎeWbmîË%>ÍËÍû{Ñ·‚¯Œƒ¸„ÀôPàÇv Ü7zRÃ:[lŒÐoÝ Ò<þÉUⱃ"!O&Ê׫D½–WAÕH‘¶î^PKì-Gc´¬%+ÐñÌmKž¤(ËöÐnø+, kdB[)ú¤!´4¤pñj®ë« Dò2}.pùD«¦NºÚkÑ?@~’§¿Ï¼b}ãQ÷ˆÆ@™U¼B®È´·vÛÒ"‹zOvøÍ! ^3ÙèBYËÔÖHKÇù[¦Ì(Ï69Ú¤e Ø$'¨æ›FzϾDzÁ¾¥­Æc¤þX(Õ:²Ëá}¯Û^ñ  Æ®MWšè^'f\G šy áÇ28¬8+m˜Zzæ«c| þS=P´Cšú:8Òz‹U™ÞÉZè•PàsJû;®FÜVÄTw*É,/ÞçÓÎñNÉÔ¥íº¿Àí)þEu ÍŽp´Ðƹ‘môgµ br8¡Q 8tpFá²,jŽÍ9s A¡YdoMêQIœA*Ò c쵦°Júìí+¤B0òÃG,x§Å»Ö(J¹u«FÆ´ú|…³ ”oùS’$}XC8ŠKPWßdýš¹¥Ÿ¾“¸¸‹$ìO*šmDè+æƒÞ<°^6y1ߥ!Kÿh~(lK ¯ (iÿPd§]`ÇSÛsT¸?¹& ¥ˆéê2͇¼^Žk|’QMk‡˜¼}{ëƒïúÌQxzhd0mÒÖkð;JÆë‚a[ -!:õ¶C?ƒØ¡$È•Çã¶è/U5òìé_l^ë}^Qù‡VÍR¤'ÈIöÄzÒá~òßÌEòVén+ö›ªvNj`ïéÿƒyº ÞW*ø54NñƒêAÙÖûuLè Ç<ë'¢(xYöiB‚ô°ËÜ0Äšs Áã@a%pix$Œ_í/ç,š¿DTÙnÛ Dõ9mwÀýv)ƒ5ÏYÙzåÇÙ]ÇÙ\Ãì©@T'‰–Ê“®Íà+l>˜ õBÑ!QÚU€y?Ϊ8ÿ›OÒE¹Ž?2”y‚†ÿ°€Æh‚‰ Å_c«k.þÿG=Ⲧ<,µ¢ÑUZ3wØ ‡5ÛsCfüê=+Lĵm©hI¹nµ1Mör [Æ*•qŸÀý3oåçsMÇj Oá7ìÝMH›« Vók7Õ%fÝÆ@^BÃÿ,Âê|j1­º‚ÒW0öTwÑ®µbXÉ}oB¬{m£é ,áX°—Øð6–ÐÖ¼,³õKËFm€,oKòe®'Ørs%Á3”¾ ÄfãMYH°­°@Œos»+­–Ùg¯^Ëb–`ÓŽÜÖsÈOÝS©sSR+æS%©VMyxÄŽ¹üo!FÄèyœJd8œ@ck­°|?ÿ<ý²øÏº¯²}öÙ ØÄ\Â_Í£²Ê²WÁ¿ûqÉ gwå*4¨àÇ‚ËÖ¬iG3¡–Õ°ƒT¡mäœ× 4Çs#Z ¤ Î R=…nu±Œýø¢ÙWNþ`ÈP³¹ø¸Ì4Õ+_…aì篈¼ù]ˆyÊz‚=<¹ß”¥†y“ #·¹f æEƒ:V®CõÔÓÖcÑ¦Ž‡‹ *rŸÇÙ_ÇÛaGßV€[Ù;Ò{oQnUNÁlÆÚ$•º è/ƒÈ¥¨h&]AZCMô‰qHaÞ_Š ÈjÄ ?½¢S#ظ¾®äJ©«sÑÀÛ–É›ñ/QîÝÙx†I„¶ëF32ƒòöæ:ñ¸.¦cƒm÷ÍRtó[Ò(<·>M.d“*°y#¥Iž 0ôs¸y¯Â$GŒF¸zµ×ÃÄ%ÛÇ‘ŽA‰! tU¢àb€k"cœ¦^ìP¸È#~s RB@"‰'­=ã9Dì´Ùé)×Û] 9¾WîøÙúÞ'³:ŸÈ_ž¡rÁ% ëĹ,Â)j…ÀµKLÍ=º–¦í\þÍLàR…;w—Ž´,þ¾ëAdYµ…€9´þ°'„˜d¦Â,6 hs&g³³t].l®{íižÊW·§×÷ =KHºÞðÈÜ2÷ê‘`K•ªì|B†ÑŒs­w±†Éy}Aeõ”âz™ï4¸pð5NtVT» ¸£F¢#…Ø‚rÜZ6¥€¦qø9°ˆñ[—‡òd„ENA¿³âdp«Ù*<;ÄÎTu™¾˜V´íëÁͧ˜|ÞÍ÷F* ­ýøB²¨að¹„tE…gTã°ùí-;‰ë-KU¡óðÅu»¬£§|v±OŒÄʽå¬3µƒ’d ;€vA6Ãoþ®Øš v´›èËÆäÖ“!§'ø)‘<~ÖÙ¶Œ[¬þe~ož‘£1ÜúS)Æë\rÜ%Ý¥X*ѧߑÜûΣï`¥™ß^ªL­Ý0 Dý×Ïz0¬yÎM‡ðÐÕ4‹ "»7žÇÍÜø<®±)>co =éÍSOŸ·¦MåÔ D‚–¬gJ5íâ«sû‡)Pþ µpÒÀäü“iW#‹O§Œž—äª?ö­§î•+­°$P™ŒbºªÕu?ÓyŸMGœÿwCÆ?ÇÛÐ}½CíÚ@Š™ÿ@5*^£hÂ}ÙÞ-SàãèRÄ çàz€.½†é¹¨¿ð{ëë|mããö%®[èb>«ÿ >hG&4Ô %;CØÖÂHÔÞZ§ú—¾Ÿ.UßKr`|*.ñΧà»Ymo|ýèãÛÅi(VÇ…†AÚ“Y¤ ÅÚS©‹{‘ÊÀuûœTBîb沑äŠò- ŠiWuNHˆ¡é¹³× E‹~o™¤Jø}ÑÜi6Ôà~ûœ„;Ôýnðp$$J hþ²\m—ƒV_qúñ}SE!:È18:MŽ”@ß:öcÈ#d×È•||¦y¿ßsŸ¥ù97º¡ ©Ú¶ý÷RP…ŽhT¸añíæ‘T´´¬(QÕ¾c$Ô¶ tï™q"KöJÉ­´,'÷žŒ"Z•¦×'ý<›†•â0›Ðr{¢…Ú¸•EcÆ@gJf[_ Rjb]Zå’7c¦ÔTÉkbŸ¬q)Çñ–ؾ½955¤²8£À‘3ÿ&³ƒDúpBŽËgä7ׇs§n†:­’Ö±”ŠP…6‡mnYØ*%Jã¯Òð< Òaî±g^Q %|7Bˆæ¹åe¼AÐ>·g\äN«ÿQåÌ'—w)M–È x*N}ã|šæ~:š@¸²…$­ux¯dÖ¦?ÇUÙ­¿£9Dïw§¨êå“ßâÏÜv¥aNó;©™‹Fr‘e´tjf Ò‰—y ÷k˜%,ß¹Q‘0.#c a©Ç«^Éënù\å){™+iAd UÅ€ÜK´é*ÅÆF2ð±u·‰U–aQ¦¦-¾î`0‰Ÿº¥iÁ~æ¥|>äõç+ýJzŽ£„t›ëëêq¤ßÌ)Ô•u¢åßÊSãôóv”’I$’K þäš³–VX‰`ûyÁDýN6Ûm·:þâTgÄZ“³n-¹Ô‚#¬¼³ö\2À6)¬OE×٨ ï=¡€#9EOy½ eèÏ'b–©(Ècy-Nþz%•UUUUUUUUXΖá8·GKô'L»8éSªíŒ,Á•=0V“©3¼¹'jýìĉ4Ën!Š»)ÏŸÈ O:ˆ²dâüà&! æå .KtÄ•äf9l™UUUUUWÙê1²ù(hïäФг ðT‚à§ÄÓs´ßá—å”ðê;2ÙåoQ¶Ûm¶ÑØYœÿZÊê ‚ìzÔS\7,Õpï´¶ºÄ…úMhuGú†ºp@$§êñ3J&{{^§ÕägÒê-²'zÎ<8a¶‹¢†x§¡›f¢Í²ðûÏB—ܶßÁ~,Vçù/¦Óø¤SÆÿU‰‘¿R3[æT•3ðE ÌÌÌÌÌÌÌÌÜcîICQ}U¿ Ç=9 …Ù–'Ÿ¼y}*bVî`h‘t?&>1ÏæË”ÄÞA…‹Ç4f5d)`8…·ø*5ÏèËÅÌ)§ž¯ïsUe]}÷…®‹ã§yAˆ6…Ç´s†2xÛºb½ð\ÓD[Wò œãÚ }m2ÏÙ1Êp@@Øî¢‰GÉñk¬£Ùófô‰#Œ¼ˆSÁŒ(wm&@~a¾(V‰Ì,±Êµò'ô–Rüẹ轶†à;…¶c@óc÷AÖ9kº 69Ó! Ę\Äy«ô~héM†d»1Zɶˆ t,nó«[Ú¹ž¢ëß*0à¿•í9`¹§ö J…©ÊžÕ&¦êeö×¾ÆÙÒ2O™Vªr.+¯J£æÿyˆZd–]Í$0ÊdÃ*ßþñ_Öyêð‰?ïeð-{•å;˜\ØU)Ä™ô$uëá³zàOBÜ´nqy4E·‹[-kV& ýØtÙÏÕq¯H®kBÄ͹§)2á“k g©!½v¾Gºòw¬{-¤„~ª¨Xzc«ÃéîL}»åÕ± ŠÆpb©W¨èXd[u¸û¢ù2 ¦ðŽè¯¥Yöé¢o½ï p3½ÏÚz‡ÀÜ4a_ÐÃe<~ì¾gT F¢Œ£r~ø·9ÕùO4yÜi¹)ŒùâÖ¡‹ú)ŠJ±hË>®4˜Z``ª¥?|]šRäÿ1N[%Ã2e`ivM!I¬û§°[W¦ÙP‹°%¤1¾‹Åñi¡t¥aFÐÞ.óEÂŽ?¸zKuG€§…kÎÓw¡}æéív?f¸_õ5ôüËíðXK%·Ážèœ¶„Ó fTº×K¬KxT S9j_§KZC]%0Àóq™èÔf!Ì7]þ~Íû`@‹\áY~ïd4—­ƒò‡øNÁuªïÔ—ô@Æ¡J‘PØÝ×ø¹j§RmªÛ%Åþ\Ì±Ç ­¨­ ÖïzÓÕ©³ߠʧ¶Þ±-+'(Xá£ÆSúvæ4ÊHôø3¥]d; l_¶PÒ0ac—:3Ù\›£¾‚hl'qÆRæAT(»²ÚwÂaU~Pc]š#sAÄ%YKf–Ž1sÏít~_A{;,Ù}·‘á èg¸êßV·*º•.¤Ù ×”‡&M?ÉÌÕWÀrY­]Fð@´©#Ç\M ;`Kº¢œ¼ŸŸ|{;…p 3U÷[0Ö¾§¾”†×ói,âIÆrü<Ž‘0–RTU«mŒ!›¯¥â‘t¼žÓÅêv–r²(~h¾ãm¤·«òœ¨ ÃøyŒNgT'ÛŸ"^E­$õŒÞ›¼›b¡Æ17CTűHª¼Š`·g¾¦ŠÐfàòC%q0«(^ÝÆ‹ˆÃ:v<æÒ€ëÓ˜‹$ý™ÖÉ4œ vëÅ”¤ò'P!n6ð±?¢ÂÚ:IìâøV1cñ êƒk³×IŒó:_eY×¢^ðÞ¿Ø™¥<°%Còô鈠ýÂ>„ÔYë¹8ìž=¿£wÕ×~²_s͸r !K¯~µhÝÙFP¸Ý V9¬ÁñÎÆIŠbt§9Îsœç9Îxzž“e…Ùh‡ž‹UÑú€Ê؇IF~z¤¯Òæ.m.ýeº¾ÈVÑÑ%$[ïÌ`‡@ð”U½éç˜ÒªÌª»Ë«l”%y£ßòÔOüp…? aüÍ_ ùš•¬R{!Ô ·xwÉgzÏ:³…)sZ¯BD4)ÂÔÞc‰¤g½Ü—}^ˆ‹F”Ï~ÛVÉ+_WZkÆ6àiÔž¿or©Š7©¸!$’I$’I%©¯T¿$ð)Ê´}¨ÅÿgÁác¦¹brV6–3xfˆ+7WÁ–i]ÿOâ¿!~õ0¦®>¾Ø{œYÈØ:‹?Ùt¿Šc?VtÏyH®D©›­dòÇ6÷´}v™ã7¢wzaØä5 ÊuOzt°¿*€ ÆOI¹P„†íl?°Â?ù¥ïði«?o-”0‘˜~ª~·13mrfAíÜ¥«ÿ „;'ÚyŽq¤d¼*ÖÄÃâä%c•FüæÛbù jw\&¸„ÜéëÉðëûf ÜV"½Õi0™T3ÿl°8O5Ta^8Øà7ÕF} ƒžvXp¶jÅžgiž{¡ŠTH}ÙÈÿEoÅ©y/ª”ŠØJ?¥—a‚Ϳ3ŽGe(Ðy«¶Ž%±†Ž£öà8^à_eb"+ÚfXhr Xð‘†J©ÿt*ð0ýÐQ_6|—œ•¬üøDáúCyËà¿Y¬ƒñú/&—v³%½ÿ PÍ>r‡‰ÁÞ*³ò+»0øQ¸ÈôˆðìÇÙ¼öô†Ñ€¤9ãÆ8õÆh‘Hà'RœôÃÒ¡èÌ)òΓêá¶Û·a”Ð{}c¾¬áá¸ä+Ö×EŽD±MêKR¤²è[ÑÐ}üc 0ŸPBì)L|X]{êéuw¨Éq¥· Õ®ñ˦á\áŠ?¸ŽÔÃLtÈXò H“/›â=¢§2ÈrÕg˜åÇs¶úÕ(雺ÏïùÊRw4ùB±Úw*.†@¨bI*¹r˜vYË%V)+‘>é¿/á`„¨ Õû6 6ß,r†#ú›eI)ÛÔ;¤fÀz:¯.ä*c¹ãŸ#V¾µ0ù™M²E*`áÇ?„™é}‚øûÐ Yt²Š+nƇå}·è¿ï‹.Qš@*¦‰Nz¸¸RÊY~(à—íúE;³mè›Ñ½ ­é:sC‘ä;MÝ,Ê0/*5#ñûL̶ïæ$µÂ²2F‹Q@lZƒþ¡«DJ¹c &P$[ÚVƒa„‹r”.2SÒÿGî¯mÍv{i¶wyäaÔƒÁÍhÇ7ëŠ}û%Uн°Ý¹ÙU^܆a]†ÉÛ••H¬nPA6ð=£êReêïÓb±À'Øunä›Ï´ió´ ™ñB‰Gv^{‚¢ÁØ¥ŸÍœìƒcisë†?Ÿ¶é`yH¾ìÓL57"@¥ENgòB[Þϣܷß~e´Bn%J/ƘÉt_P«zˆÍ™æƒóDyþÞÝ™äõš>ϺÃbZoß±!*Sü’/àÊ—“9hl§Ê_ \·¤ÏväކÊŶObæ–% ¾â¨_#­vfâú¶R¸Ì^Õqö;WŠ¢ky*Çû ˆžiÃÉã+dzêÓ"‘6û!éŠÂ*í9 ÿLÀ§,«ùR§³‚'N|€uöRˆŒ±ä÷ª£¿î*¯æÄþmÌRì S |ôsS&Û"éÁ*ó=yÌ ©aR}5ø#²G2Ÿë0×Á4Ôó¯Ï`5$ƒ¨ñ0;^Òõ ˆ#àU¥6s.t €ƒaˆx²ƒ +ù½Ý¸·@˜‚†€ž¤0Ü‘)A±ô¡„JƒÐÛm¶àãT÷¨Q‡Ü͸kLÖ+ D ºFÂŒ®ß’'¢#òôAÑܺýª¬/}L? eÜ´çaQ-FØiÅèêÈ\š-¶EváÛ;™‹ó+ÃÓ÷‡ˆ<'ÀÙö¯›¶ëY}:aõÖäxb“M›´“œç9Îsœç:r‰*ªÂåcúôólæþW=„xѹŽä¢áÊq;ÂT}KjäÜÿn½…?‘‘ ÓŠâ±³ú®ÀõüßÀ _DöC­éï…—Úí½ª(è*ý…Ž%[R½‹£=«ÚxróQ*Æ2µ¦kfIÌYÿ"1HäR¯gŽVÓU,×cÐw DšÆ…Ê`®µKþ™º@éAÔðbJ°“”Õ#ÎÉÞs4w/*¶_‚Ôú›ÎF)†<=þM:P,äÁñS“P€\+‘·—¦‹*õX›Óƒæ*}ä@&éâ7åGÓ1šb¹Q|<ÔÃå xàP—:]³ErècHl—o‚õî‡sj§¨<¼üöõnïÿle¬Iƒ6Ê ç6.Z¡ ¤Á2X µ[o{Ô#o(a:OÌw=Rš ñ³z1£ª‰ryàñýù¬»¢q,=\“D1NŽ ÐýùKŒai¯3%7ÎÔ«„Œ¿Äxx•ž $ Ln“(‹æ§iÑdaǶ|%÷ë*qw¹jëÐSEEæÃ¨Ì_]£EDj¶¹d|ǨÌl3ùqPIÅRs»ª3 kJ€Ó&Gmë±—fväú8K; âÛíIº…cçá>)H?Jås`ÐÙ|IKø4¿Ï½ö}íÐû ÀŠrôÔ­ÃËÌíQ£TXôAatè•ô¦ô·ô°ŒÝ¥VA•„Ìo…âUÚpšŒ¯4 äÎâˆâ »fšÒOZ‰ç'Bø>î•Âÿ4ì–x´Ö´Ö´Ö´¸î"b™™>“Þò3ˆêØÜGVÆâ:¶7Õ±¸Ž­Ê/Á ÞkóµG³çí¯Ö»»àT¼kº\J4XZA¨t£…² ø!ÏŠ`Àa³‹hQý¥µgÖ_Š®ÐÓO1¬t˜°4rI$’HëKÀ)ýöÕP~PRË[{Ûm¶Ûm¶àE,¾B‚Yä›lvJ½u\«zÈ á“vD3%ã8äM¾á 0Û"˜·©zþEËáw ‚ƒ ã3ø½¬Å¶ò«ö™ GÒßÏÃÓ>ßI8ü;ÌR¨¡QꌉfT±#Ë­ð×å¢gMÍnL7õ¡²£²~Ü4†÷F³H«×G·væEÝÉ ¨šK­ÔKÌÈÞφà‘Y¯B¾²‘蟃G<ܾÅêùˆ'tjpÝáñg!{©eQÿ=¿ŠÍà*•lWR£§\`7˜Yl‡ØÏ.Ü¥Yðìòøý%íñ‰B?4Kï;¥…«¾aH ¹£ƒKA²ñ¿t2ÎÛr¿kç$lY@Â>Iñ¬mŒÆ"•(×dK=ì¹V9iuú‹îÇ:ÂN…]ÿ)0G#w¸“k: M%ñ Ø‚Ã:ÀµçJ拵C%ÛªDy|¬ .Í¿n'¼×n¨Ün=ÏF‚$óï>Nõ1x®œ`ŽÜ.Š\÷÷µ28?é1ærFP€vY*]?Xé:NÓGGïKÇ-¬Ã&V«§î÷µë‚lM:ŠÌ+‡¦[\]–v/"[¯(±¸ä×th³a;Î2Ù¡ï›jhÈ— Úà§É h×î™S̔ͦ@ rÈÀø Ñ«\¼;²üL³ƒbÙ?w ¥Ä¶Ã ÐX´$Ö®f|&n×<¬ÃÁ ÌÀ[Ž· øîš¶¸ôŽ7Y1ƒG¤ó@3Þ“†l.‰ÃÀM*âuÙ4Ÿ,ã±ÌØcO]G {ÀuÈ8¬Ø¶y™{-ÔCZ“nÀ<RùÕ1¼/»‡Ü ns8?þ—#ÿ`n6\êÕðO7ù\1òŠC,z ŒnÔôKØè©Ù2ÛiÿOF)¿ž¬#´lÍÕÕ‚ü‘‚u|êl–+cžâZ.œP¦iÈ¢L«Ö˜òi6ÏPüD€ $"Ñ"Ö8ûB[7`áî-e¯È["}MÐÅ—IRv98Ÿ$×»rêA¹#ªîç–ê²ï¦^5é¿Häèå\*Xá{ª€G¡>ésHN'•¿£“p}váM‘ýÿ^']m <ÕàOÿ&BSɬ¢¨+ÿŸìDòÚ`mË;l¸zŽé÷ÑS@¾É9__#¿jˆkc衜L¦…é†Oð]Æ+Öet2;~jذã Q‚ÂT„9=M—çá\ÑÛ©!2.KHdÁèPØjÕN‰ÿá «j{ÃþI‚Í gÈuþp‚$€I  •&%[ P»ßl_H “"€)æ¥> )¾ÈÚ$þ˜ùmë•´j{0h°üYÝšVç+çE6^™ù²]oâûPºšÙ’dã{±­1b‚\Ò¢züÉl‡ô<ƒ…À×ixýiô_ "Çb‘«Çºž'oPúû~h4d/TWŽÕé8Ð3Ž]ýŒ°¹†:YÆ¡5U/]¥*ªªªªªªª¨ $š¶’DWøËpE8ô¥n‡ÙS‘WÅßÑ ÏXÜjmŒâ?G%ŒbÀç@nõ ³¦º—ý‡Õ’=ûÜÛe³·Ë6͹´ó<»[sl’ËÄcm½+Ü×gJˆ“7Ãr€Å:õŒÐ¦–Û0o$mÛ@{+.zÞ¿anFLÕ.ܰï[xÚ@½¸5Ëp]D^p~G†Yª$ó Qh åÖãýß ÿ}0ÃâIïúÏЄAÇk¿øœ±9Žˆð÷uIjr $cÕiÆz»É‡ÙX4C@essÓŸñ!›Mž¾;~qÙ¾šN¸Å/€b>ñýH+ÕÛ/O·÷–$,û(¶¼ª#A·$’I$’I$’I$’I$’53êdo‚´›C±{ ÛEŽ6£ü[P¡k#Þ\­ôêè´]zewdÞWT  ×CèBu Ë AÏgcŒÍd¾edNxJ`\¯ò\ï¢ù>ô×,`:ÅZ?u:o—1âKöÄþ¾oLŸDô6œ4¶9œ+&kñÊz=Æ8¯ßZË4¶ÉõbýœïlÛâ —âöÂI$’I$’I$’I$’I$’Ià-^JÂ=ø½²µ-’ù‚Π§‡½ÄÇ e3®2÷‚¡%œ­çÑ"› >\Ú“}™Â¯ÝbÝT°º\7NkâVô(cĽøÞ¦r™† ¨Y†O'':H-¸¨ÚÛQ]‚4ÍÍÚíY‘ZESûéJªªªªªª¨cÑ= òÙ¦<½4$òØØ]Âfá†õñ^ â7#‚ÂÿRlÛ'>öMEV†lüñæàûÐhŽ’øKóarÍíÙêvVn&i?C”GÔÞª®EÚ@O|ñø á–ËâÑ_|úÎrù©­„ÆÅ¯å€K ÎuˆœÏ¥SWüMÐΊÙx!ƒqè’kwÚPT,[™=;6Iý|§¶²*ÅHêh•Ìÿ-3 ×úD˜«¶NLÀ p„ËÒq ÿR§’IŽk’øúD•_ £;lY Íbñõa+•¤êüÆ-_m›¦”ßLÿ$M£$çô“§6E$©ÐzkqÁE è-Sr˜2¦X4ïè' ÓÁÆË÷RÐ(ä ] ~eE¥£yfý&ˆ*ÊêN«Îô½´ò¯¤Ë“Êa¿Z)bA)ßðÙ5€ )E@HØ*Š&¦Èhü'¶Õ¦€ÎH\ÌØ¿t;‡þJsŸKª<Ä'c¥Kª[U×zPf/ŠˆUAHRrú3ýÓéSž¡–ìÒ”Ü( P}»Ùw:]õ>?~'ö̵@s5Íà[›¹oJòª(Rä›v40éËÁ„#>1²ÞaØéÂï„ï_zø­<õ[:á³½„nòj293žV4ntw™ xÕïuù¦E5Bã N#e\s%zã&ôgÖ%ñéxÁ¼!Yu™cBmËûnÖJF.üNùè­óðÄÕo"%ºÓ.h£òi¬ÓÜ) ór*ÂÞ# ™·ßÿH!¸|Ôü‚¢ÖA°êbýG¢jH+†¼¼5 T”ыَcÖ­¤o¿¥ª ÛhöîG9ƒF›9ŨPBì‰޼jXîë;3>üyὋOHüÆvx¤ä g<<=yœ}ÉÖ›†ìFL}ÉÅ4ŽLæyÜ´"+ÿ<ÁC1D%Ö·Ð_&(†áú&a³ø“òhÖ½òK©Õ/¸OÃY»sÈÍ¡¢î%àÒÖ–L?Ù÷Öþ‘ç ©á•ªúöÔZÐ@ÚÑëÿ1† ÿhõ}T±i¿¹ mŽgß8†ë¢6Ç>P´Ão\˜Qi0ÕAØ·«¶ã„ºÔ:¦pxaì,z-šœrò-P궪ÍV“È‘%3m¬•º’ÂáE]66Ãêô ‡ÕèOÕ׸â9“¿Ó© ÌËIyµc¤ÝðžËhr'‰ŸŒ{q= èðÌœ5R”ÛHGÒwëŒçõi«½Üu§Hò;ÞÜ]xs‹Ð¸æ;9ÚîéÄ÷bQ:)ˆù:©ß¹:9w‘lm¦ßF4K§ao4º2˜´éÚ–Ä“‰¿‰˜CèAR70ž¢âü.† ã!x”§`´µpUº óŠÃv2@޾ƒc+õÀ}¥É¥:vL§ØÍ¸ÃR¼ … ^¯;°þ7‚¯R@`/,Ñ3•z×Uïõòz}›þpȲ±X´«j†“"×¶q‰ò¡á\ƥǣá I«óMœ¢LQgaŽ’Ñ÷àš®6xÿ=ÀÖϦúC…¼2Ön*ò+-m5ÛQÕ¤¬Y¾b š§ø2É$:øC\’HëLδ°ÅCß&ÀÃà £B lÛœP?ÔÇËÛ Ì6h‚N³õäï˜c·>îJÚ]¦:Cß'ˆSèÎ$#’Fi¼ %Z<ûÁÜ4޲¸Áø9‡‘Çx»à®Èÿ *©%¥iDP›±ð>í¸ûýѳj®ŒiÊ¿þ%o9>çªÔàzÈìâå*¼ˆ˜S!l¸Ñ¡ò9š6ò0Od/î„H¦då Oé;Õ C¶ÅvGÿv}g‡þ1Ç3%ª=‹<ÉÂ"oJ®¤¾ÿT òD­éòIêgŽ'eƒ W]( PJ´âT¹Ÿ_VÉFZ (6§¥ó1fŸs?jO‘ÃáÐU|¨Z½€Tü­µ$±sCuy+Yîùy“ÓÀ'^—I’‹[‰ø÷€àUyõqÂyt¢ÿ<¾.ðw7_—£†´=®"G…©›yIñl&þÔY-ÓèU˜Õ÷®¬” úuýI¦~ï#ü+r;ÐÉ•kó&•虿GEû–FVNàp"?¦jØÐNÏaÆÉkþÏ›_3üˆÝ¤¼ï÷ïŸf@Öéà Õ’1½X›®Š© ÁÖ{ §WÓýI¹›«Ð8qx‚?Ê¢ÿe8loŠø84L.áÛrY§`ï˜HA^7ü‰½òÀ+ îG@vü©;+$ï>w,ü«-3¯íø"Œ•â+gסþ7¶Â±­=ȡĎܮïIECš¦s[VØñ,± U<>WH*²"¿íù3×7ö$\aí:äÆ.Y¸Ûýt…Õö;0‚uëÌ_ëÌö£û×k«ÿG%p›´Áðÿ~Á—óð!¼Í‡¶ÍHŠLîâ» NqD+£]ž| ßò? öfî·…ásš 7èÜ#^©¦1-8ê§“ð 1- 4VQ/Äâ‘Oå&H'|ãOµR'I[Ön(O‚út"=Âû¥ŒvìWð¤Ó@*?$ÚB6\ûÎð59ìAš®K ¢éĨp#4rê1èÐ>iAÑÿ¡(Ñ·Êê¢ê áfѼ¥TÒZ}íÕgæÑrF6`°¤\ €¹Ÿåu¦“´S•v¼XŽ5Gf0[8k¨ó×Aï…£6¯˜ÒEñ+tƒxœ5„½,~^t¶;&Ue!)ÞT´´’:’7o™Ùø(×\/÷úÙl :Yp©Ã/‹ÿ Íß8Öá·‹e$ºVȆcP¶`²µ±ipU%Gq®`~º.ù Â6þ¡"/Ù‚ФFµ•Œ)¡H?6æŸI²ÆÛ¿0yŸL“ÅÿFïN®ˆ}«ñOuØC<Ø*Hrv.öËÌLSu©;ÆM“ Ïsÿ{Ú×oO™ZHò¼U$Àó†¥û€å¨7Ø€C@Þ,ÿMCà"~SÙÉàÓºÇqÆòÂ;ß§ÖI¥˜`äAKz› #+®8št’„êëÍ®¢å}æ fœ /T Èf¬É½ÜUj¶+gô]¥*ªªª©(øÔ$²Ûm›#¢ˆÆJü ÒóúC„É ÖÖà!°g»ËU^o"ªPZ¿©Qˆ¼fÃÄŠƒ!dþÊùß}l2š¨v©äîx+‹d´–6‚ÑdòLsüµ,~ØFÊÓêÂæ•葳± ýé¾–çßp6rá,’c³È!Ždž ÓmöhFQÝNÁ9ÀêÝ;îóX¤ò|ùŽºž3-†M3–©oèuòüF0_Èuöª¼{äD¤£˜íAÑQ£ñ篇 qý~¦êM}µ0õD²<$ûC!ÊÓ[KÅÈmô½# ™+™*Vn…é ä·a0/›2DÁv3Ý[*Ë8 ‡ÒéNÐ=´¹yjaE-AE‰ àâyñ+ÚjnÅßßE¯\ŽRÄ0\“ 6àûÎõõpyäÌÞ-E²wœ§ÌE…l¯†“õш¬¾id‘§îªø.<©WÁ!„n'­Í &˜qD–,È]”(”}jšÏÐ1G×(¼è“,xöKDÊ͈8‰¤×O¹¦~Üs:-ßr&Ÿ]㣜WX/.­sò+Hœ•€¨ùî9^‘ѤŽGM9×ÐOmô$·ü»¹ñè²ðtyVÞ 0îÚ@×ßû–ÒáSmáòe²²;c'Û€@L`yWôÛÑ‚¯^‹@F‘Ø$¸”Ê\n©Ú½‘|ú7OZÃwe%Ý(bã‘àÔó Ó£ãms¬ ¯bî©£ê¬È,ÑјŒÝí2«X"þ‡×ÛA%NÌ›ñAëJtî‰F–ÁÁ°)P”,JÑu¦ePdÐ.%7›u Ÿ^s!x‘s5d*}’4Få$; Mvi÷hó’Pÿmݨ%íŇԇθB¦½v¯ñ:ËY®s² Úÿ;;€·«]ªMö©Î|ŒÊÎ횀¢DåÌ’*½¡E {t>r1µ\Ät•íÑ×]çèmT?P±ß57 @Cípãp‡†UÊ`^žÃ[V|.m?ŠÇ¡€Ù`Ù¨A%I ¤ãϘziêú$­Zh=f®´Î!õrûšÙP&;ŸlÐÉq}AÎʹÁ´ï^›åIp$ùÞàúœ]¦Ž"ë-ÂÝiM€ý€{<Œ`˜¨§íl¢¬â)Ýâ‚9.&oáps»x$ ™M³q[“%Ñ>ʵ¤û‘¯(ÿI çÊ2m–ÁzË™eGlƒ¢›ó1˜Ùvϵ´Kx?ý_Æ( ¿:Àå²ZòÒ—‹ÕÑK‘‡­Cu´võk™êºBÊÌYl‹<ï²­{!¹z½\¦`<åykœ¸~®Y:^*A+Jeôv=§AreÅÑc*ˆ±ïöøvM©ìEtÕ¬J…5–öd¯ïFL§±ä¯ÞQÚ|,g§0´Ñ…ü·Ý0¥Ô_‹c}z´u½âò¤™½ŸoÇ=Oæ€øØ6{F—wùžŸi ûÑ@!ôü!$®³OÜâ/EÂJúcˆ®EÅ‚a(Ó ¸táõ‡ºße ôuï;LüM èÏÙåçäj%u²1y¿ÜþJ4ŸP)«6†ž|æ1§jBÜ¢h#¡ð/ÂÕ‘ëYÚëDÚ`päñµô;”É{ž}êÑ`!åR¤¬jHðÚ Lžù† D°qi ?ùDH=H2šN]AuÏl5I˜¦9¶9‡¶XDUC}w’Å$®òÅÞõSˆÅ¹Í-!á§"ç²eåj¾eA¥6‹9?§KÔaŸ€ªôÔ%¿…@FÐCõ è'‘Èí2ýÙá×.ê±!=Õ5'  ‘§– rÅ=¶½ÅÀÛnø45¬SÕ#ó×8#7ß ~ûÛ¤’kè ÿ[»pú¡ë583ËRÜ…0°|WEŒÆ‚ ©áÄïì@"XŽ™o¹;$daO%DHõJkÇ^¿†#ôu¡°ÌƒR:æEE™ð†éÖkØäÏ3‰7’¾¦Îµ^XfÅŽHÿmá½è‹ÝF©Wð:'hÿpþjFÕ¢^)_ŒMOWÇ[ÄÊFuÃX.Ìk½‡Õè[GŽ’éôpzv¸b{ÏÄs ŒEàÿY§á! ï4G¤S¾c—Ñíˆkç!®Ö»¾àá‚ÒB“s·Ñ˜š~þùY7zFû·oì ­2©l—Þyû>ÿKY¸ůÒQ±äÈOfÿNx³<;J©Y…z¬-ê.GE¦1Êߤ>7ü´2•çݰÌMÁÞ…NEë%cÓôÝ–.ÃÌÉVGÁî·4î›G#¬»C»­v–j>KÁãuƒubÔ4=enbIâ :à¿÷‚éÕJ È&Fƒ6?Øys¢ ixZÁ ¹?$ÈKGc"£fO'SreFß9@K.n£*;¾Í$çK«„ߎJ“Yæ¡àBŸ'IS[ß©.¬€"­áH2D™X3Ob1Z?â-ðíÊ?'%o”KÏ öÈdt‘`¶Ra è΂ðð¨ræ¨Z^;…,:ÎA£t|U”—m` ¾¥à°iÒ —•‘‡Á&Y´„nƒ $!^ìjs‡2þ_„¶qùÈUæ…>¡›f:FʆîtGkƒŠþØàxð-¥m‹íµ zöqQcTknïD[vdHÄòé„ï9Ö€®òh û—¥s@Ž<@, ë¬›Qóøv âàq€Nj¬ä.[™G”#C3âu$Œ\ÎtD«ÆÞ¡Àû<ü4Õß X¶u R,cÿ>Ö8)i(ûiJªªªªªªªŸ…@Ã%ÿx «!]ø[’]«‡Ü=øær2*òÆôÍ`‡›þžyʈ\A]¼˜ 7$Æ8¹]ŸY¹Ð£h‰¨Ñ„=ˆ3?í½¶G'X$g«}-ÞúK 9Í•ööæ‡ fGÌÿqù˜´•Ï|š yn%eÁSQ}8×J™NöB…^‘ýœÍXš­~á[‰u*ÿ$”è·Ì4«Æx-?‚»ý' À?!‰z´X7jà™{w4ýNÊc›Ã…Åa|ŒŽ¹çÊOƒc|mÂÕÆ–h×Þó`H­dÌR/¡þ¿¡9R€·ÙàfdtSO:‚"ý½*N2õë ËkhW>ÿh_~—_%m2Ê‹ff¶+xx#Õ0†Ã¢¶‰žM–Ÿ]R‚yÌb^_ۛ̀ª÷jr‚yV¯Ú"ü®vì ›0ôáN±ý Í@w9\­”X‘–==4f«Æ<ók‘ÑÈáÿi&]Îa°×š {{9Ø?—žPnüxç>Ø*gÐ7c—cÁÞ:Á²¬›åñv@4u ¹±õu:w²ãÄg1УkdzjƒÒ¡<ÄñTÜlÙÿ+†_6õb©÷®I|~*aÃv¼'`z{´„œï¯;`ÃÖ’½¿ª·¯;’¤—ñ,öÙâðBÓ C³Çfî…¢¨"+±Mz±Lú;¾17Üí-éi| x™7A óñ¯rØZÅ‚|‘P#wA’ïF¿hœ¨#hÒ¿Ð]<ù…ÆÏ=9 dò4W½‹ÿ.‘¯„Æï7’ƒ–Éy/G¬U·jÞÊq|*ä°l‹eæ¡2J_ŒÜÐe@H1nürÕ–67ìDE– ²¶²ß±=œël•“ÑlúïÜ{œÆnð°iÇ ,àïgølDÓîvh”•Ü/h§Å e0â¼²ƒW–›þíì½lõËÿØwÙRÛ]òÇú(E‰ÓV‹ü¶d–ÛÍÔ7‹j¨ ½öI‡§ž`ÊQ÷d7*œb¬y‘â¢k?äã9üc7%\&hf!Zúª€Åñט];zQÕÕ+&rl¥›——}›ù¿´ÉÏyjtöù!vÛ»ƒL¿¬oÙ¯‚¶,üîôν“¡}ò…³L#qèП®ÅVþekH µíÚoŒ{¼Yúäܧû…†±åF{&Þtˆ?áQ[þ[¤Îr“ž“3lxR‡rW¦ÓÖ ¸[ÂÙ4.ޤ03XR]·F1_^ Tæ„•Âí±OaË(z·Ð>Çø*¦;­áŠ\ä^Öœ¨3EÅpet”Ÿ|2;¼ÂRí Ì*GS]}OL&½á9 ÷6Jkk`¬‘üü$ÍPR¼ÇåëNÇ´r†ªzÐëgÉæÝ[îc·“ 0±±•" ªŠ(=ÒMõ)óÖAÎ'¢… `ü½³o×*àw¦æ™1¦¸i6¶þV~{mÿ/¯µYwÆ]JŽøi³…Ò ;GYÓ'À\4¨ÔÛ¢ã5«Â)%«Þ?OEq")yåÇÛvÇÛjÃíR°éœó§ÿx„¾nû•b–ûiýa\*jó%/t£O¤w‡R^ TNü0¿Æz+)b\N1÷cQ 6Þ™ÿ<6ý¾FBE„ñVðAƨÅì/Âü/Âü/Âü/Âü/Âý$}|FA -ÇñäôÁR;@k8¨öÑ V#”mãü93CT°@9úåúíœró›Îo9¼Ôו¿Ohœà×{I²àIRS™ÿB”5_ærðL1_´!&ÏG3›Ô„B6Ñ«Lÿ5¯¢ 1>È5TÍþÒW±=ˆ4mìA¢ÿ1†Íˆ4.îA¡µÿ!ñç‚Èt)»ïø ã*+ä݆“?¤iö?ÝÖ’†€zµ¨©ƒ $,¯eH\ÕýL%‘܆sœa ô? õμ3dã4…_A íúmÝÔþ‰lßîþµSÛ•ˆâ'ñÄ—˜Ý[É ¨Õ‚|xÖXÔÕ…Íáé•A׳ŸÓÐdþF*NC ,×O!P†¢AÀbå1’#XeRë%{uáÌ5µâtˆ?è»JUUUUUUUUd^1A IÁnƒ«ÿg[`îé ÁOø §È]¡Ÿ¬«j+šÊ”—lÁŒmyН}R(Æt5±Í¬ÕˆF%CÀ‡Ñ«ê.¤åœoQcÖ)üg £‡oµ" åo#göiµ‹.ãöô[ûzä¾®—ï«¡¼~Þ…?oU¿·¤)ó÷ÃSÿCpo·\ï·F€²lâ^§±ôÅ´<“ÿ:•¬í©xç)`8¨Am@î›Óçž‚è­×ÎõÙ>#tû7Ebª·Š¥ÆÏ³j[_?Êd㵂À`5ëïw2>À¯.+6þGe+žùŸ@\}”1¸bÃr‚†çÙ‚~†+&ðâ¥ò‚—« W‘3 P¿†(C—xlÙyÚø:vðú/¹XUVÆ.5”…iØ™¿òÀ} É Q˜ª„µêfú{ùôÔÒAÑ·å5ã]¯Píf½f-W<õQ#±0ÿOðSþi„.}ÕËö8SG³oa¸|ÙýHÅô9¢Ìoë­Äå`èð¶ÆJrÖþf îÃëñd‚JÙF¯¯IÁ8-ºkÓ>/ÅÔž}c»>J«9zîmãŸö»µ\ëT~‘ÀÀÕ‰3œË ÜC¸¿ܸ¬“ú£ ±ßYôªu ˆÒWߦFtq»`°ôÐ-8dïqNœš½+ž±ÉùxchµTÉÚ÷QÁà˜å™‰¡oPá(ÀqÛ&˜¾† èAl<2n*hösxSzunùG¤íŠeà+Üã–zÀ}ã‚fDŸå-{<ÉP1±o‡7—i–74ZÝËŽHhŸæ?ÿ‡ºŒ3k«9_nëåÒB$8NR/v+v×ÍQ1Ò t+:–W’‡Û¡wv`Bûã¿‚%t³™GbV…H /ñ$)DôÊ—…†üÎoÝÜ»_ ﻲðÔÿkß8°îÒ˜ †ÈrXU›ˆKɬ ¿rkqðîâØ ÈRÎè83üš< mYžâOÏBhŒÆ Ý?rGT“ûMÁRãZy禰•µxRQã¥oùòüÛ3Aä4’ÍѧdQH4HêÆ›»”õ4¤–0@0¡«QÇúhM+…ޱ’ëÆvl(÷÷e388ë£+ÞñyG Ä«’CÝ½Ý )›e›¸ h— Ï<|<¶rIù{4þ'xfߟ<(]mø¤Ç`sµLb› 0’„˰Átã­ˆ¾Pxꊪã%ÔäéÉÞÏgg©3X¾ä>§ØZRÕdõdÞ¨Ciœ -É£$廸#Ë$Íâæ‘Ѳ"óÓ c;=‹â%9©è—fx[Õ ÎºÃA´Yâµ[zÔâ„cé*nß.)§<øJm]Iig.Æ€„:tô`šÁâùÄm`(G´¦¢2ċއcUÁ¼þÿo´3øtBñ+)ËQ¶XVaõ&”Þx×XœtIÍߥÒ¹ª?¤ºfô©OÁ~y¿ú[ (•÷ÑÍÁV4Q‰õ‘'¦‹Ù,=P6€=•»¥¿lCuœCX)¶:Õ/cžMš’Ä?ص·üÌvN®¤„UÖ4ŠÕ?g¸Xg¾övÂ3©ñ÷!?èŠþZîÃ`o/ §Äê‰ {›RÖCüAŒy9C9…¢Hú4GeíHƒú—#¸Ždõ™ìÞ‘QLvbèüœ"{}X HïnñOœ•sãÝäôi°j£åŠ%S&´ê`!¶ßA¥m¦ÝòR›@ý2ü4? i’œã"ÕS ”+¡1ÌE ¯¬âqæO„އðÜVr‡¡zÓé(gPÝ€DX𽂠ðCõ÷·4°s@ÐóOÝÁÈPŽgØÝ™Ã|Ш½½RB—ÿ kš £ Àå ÃÂe½Àè~f€ØvÇ 8§ýVNt$gL1Ë´Ú§úÌŸÁTõ›ék’ágÃßàF´T©±•8róèâEØ?Т˜³ ‰nuEXp\[tE •’&gÆk“¥X–À2)Œvwo„öW²˜¤åeç_rRJåH-AÉóPÌ\v?Å|AB6û×­óÂpОCrãĢηÏYˇ;¿¡°¥UͳmC"ÅóúºÉÑéùɱ-°]ÅÊ¥Íâo°VÖ¦çp”¦Ï ZA`î9 3eÑï¿ï"1¡vBŸk¦&È»<Åñ6pZvÚá¯ð[Z“b%©[r%á¶õ0Ýšö5‡Lüè‰k·Û5ª]uòÔÅÜþç¤È ¬\¥´e':0Å;´0~=.†„ D¿Íp#™ ÏIÔ -}5Ñb]'fÙd_×4ý[h™zaÍ1e«{“¨>wO«P1Ïü Ü®6Ýçx 4?LX"Xë»uÃ#.u™¥!'ùçjѺÓPƒ8_‚t¨¹}É=Hš†ë<>HRû'šP Ä(YF3s§ésDû›ï¦ˆÄ¨eg¡ê¯¾?°0¾«¶mÈÀ×ö–•I°¦Iݲ~×½'ìåÛo6Éý•7áÑ­§'‚Ôò à6?R@’AâäŠÃNF0;¹á€¥C Ö_| tÏ®ç¿Ë‹ÿsòDëÏÛ·¾…0ÚZßM°/(NN«ï­Á+bhtð‹ f˜öÝÆ ÖFÌIª”"t¼1†ú+ÐѤæ €~Kçßòø}”Ç›§,â—­jüLšm?iqëÙ¤EÑí§´ï.± ‹ø÷B„Òçó|•ѳPjnŽŠr„c\¯…ðüfÇ£ÀW,ÄÄr¹~Y˜uÏ-œRú¿:=KbÖYÙù,ê5J+\ƒ÷pd0¡!â§ïwü*—î›™®¼úfË}è\ÔiÎSFì…͵ûPŽÒwY¿ù¼"SÄ“{<{'5 Œ¢Oª—M¢úïÒç”áÃÊ"g»Ú`éeÞAê) Ìdç¶eì ~¯ÇãÍUi›±eMûRsÞú'#b  eÉ:½$u‹‹{×-ïFü^Ñ;”pæQ5q@!qÎb‚òJv;s.åƒJxò(ÄØA]¤Ë²Uàu‡Vyølw‡ò?ÿ{‡¬¯«ÈJ_̽@iŒ·ø:n°ãsü,7©YŸÝ:éƒ 7©xÀ•gT ÿ5$¸ïú8Ï{Š.¥m9gŠo[S»}@8$;¨¤Ðíè Ì ”…äôD祲­Ó^nDǪSÕ[®R¦CK³³ñùLžSM© |8_Se„˜2( ¤Ì´“ï3ëf0«Öld*I.(FÞ”ã´3jùá}1;'Ûל[qƨ°Ÿ¿R'ÿ@pP"Œ#Y_Ž·„£+¹ÔœS”fâçû¨Ï°À¡& »mÿXáÀÞet.ŸÙÅ fŠã‰ØÊtƒFé%Ëm‹{kà «ù°9ÿ‚é³ó0=îÙ­©°WR§Ô¬—-ñVT& VOüÿ{–àÊ9}Rþ¸ã"Ø-gØú—rM&,^Ã:ì6p{èø i—Å*›>˜ÊšzÉ\V%1ëo—K"€ˆ}- e½cD1 +´@_ö6‚™â¾rG›3¢u¼Lyûç}f.<îu &9³Uæ?oZHè…ÌþOÖméøÀñ¬êVEú1² ¯ñ­=×?žÁ¿ ì‰Pí†< Ï•Z~hRQt~IçhKq¡Øòzæt ë;¢®:¡ß7ˆ5=ËÐh`ÓÐ-Ù`lä³Äýh¶Á8Ý$dJÿJ„Î=Øì¢g©ÂpÊouº>ŒÃÓÝ}Xê+æaÇ0Xáò{Žú SéŽ'ØX8 b 1ZxO‚Õxc"…WÎ|Í4ï½ñk7°þ±´·´)”ƒ,”1Iöa‘§Ï ÂFXí& ¹8Þ.b$X³ŽÄŠŸ`«óŒ‚bã+ËòQÖÑ Ýbíg=·Š‚$•$Õ¡Ïp¹Í³‚€4@×O¸¯i^ðhžDøÕSj#xT£p:© ü<ÃdÞpŠª=µêc;ß­ÃmÍ+ŒôÚ†&÷Æ«À…à„0 „wIS03¡P£$E\‰ÀÁVœ‰P®¦¸>V 6ÃH¶q#ºh}Éqq0dôjñí=Šœ[Ë%.NXÏÿÿ"$aûÕ¶3ƒ\¶€L÷2†-ârf15I“Jg\óX*r2 ]‘dQÌ}ßí¶|ÕÕÅl×Úÿ|˜¸ñ½^¹)>ax³·èB1¥¤­ž%@@U»çéö£éí–€"CÔr;qOjÌÙ$Æ^’ µrÀdÃ<÷ÜGØnê«*ÚŠk3}a>ÆUÿHÍð½ð”Í3NíQ§%¾4­}“‚¹a婿Zý÷w Éùˆâ±{P–Ø›“£ƒjþÜcoYüÀÅÿKW@=úä\ퟆ¤](ª¢^Æxáä£çÈóæ­Å’9·Š>‰Ȥ´ØDãì—×Ï q N*çeÂG'ASº¬”ú `6µdÚç›Äóy— µ"[‡+dn¢íq‡Rø%gÐãÈ›¸ȹÊö`ÕÀÀ~‘& o0!‰¨væÎ”–=E­:»Oêð¶'O|oIŽ”—Øžô·ÈÑÏ%"é  Æ™÷åÔ¶Ì6]þéúЊ"Þ\ØÓx¦ .ÿ`èDA\Í„ús Çõ«\ž…G^'r„P|÷MLMd¹¢±¶U{›9GÎ꣫ÈïtóšÙ/#8ôU$’°Ml;&§¯RƒGÇt&¦| ‰ e)ŸÓ©†3â_}w·ÊZDÛl^$!»M½ê-àó±óá"«fÔÏ(ñù<òU€~Þ„AÉŽé…i$¿`*Á¡Úâ+cSÚ×®z‹”£4«OžURKn4œµÀÊ~Ÿ=‘Ϋ«-‚é·Ö…HÀ(--Ûr¿wOšÑ›g9ó‘bºVŽBßµj'ãGAäÉPw$›*¾n8B-Ž'Rwâ-‚À…ÀÕÅâþ¤f¾Æ ¾ì4úÿQŸ_M{AVìEûÿy¥@ÆrLx53ÿj=-AY_dCý jTòDа «g$š ‰žaA)i-4Œû¹_›øóߤÏÜ ·$+»ÏÀ!£º4ÅJ<²ÂÏ<âhõõ*Á+ïž•Ák©¥´6t¢1!K}’Ÿ˜~ëÎìØÃŸÌ À'NhWS¾I•9ÛäæùÃ0z[Ó *ÑV=&Dø •¢W#Ÿì·ì¤)*Z—öèªaK»À ~\2¹ `¿Þ’mû÷ϰ îÓh€Die…#kÐÞ`K|×±&ä´Ê ™#ÕóB5Ö‚‡¿<Â×ÍøÌŠ9EJq;…ÄFÒ.÷!˜&‰«x–3à6„Ü¿´p"袪zþÆ Jÿt»c§„„Rˆ†ç‚Ò£:Q4ùb¯où­Î§wìp{‰“0¢f!º­1k3¸§N|­Ÿç|~pø?óFšþœ}ˆÄ‹wË3‹Ô#ŸåÄ.ñÖBh@[€¶¦,¥±,•2Œ"oPM÷ Ü›þ=lφI‡}tþ*è)í9 iFÅ£(©nÂS÷Ú¤«Ƨá^Í>i J„d{£ŽÕWy”Jù#ËRúÔÙáZC|•ºÅ¥ät9™B0ÁÑ ÁOpòé¿}±ÿRúçáEà…«ìÏL½*ƒ¾ÕÄšëOóFx!n |H%ÃÅ—ùðpÂB$Ži’ÎFG˳5Ö)( S^úKïOfĬ§fÎr.a!Ϥ‡¼¼Ø iºšw¦Ö)ü CJS] Âý5r„`%¨Pðž~~¯!wf„"@Ê+gÂW¡ÛùAWÈ{g—&<‹%œ kL;é-ö•zÉ~áÀ‚%ÁäUVq{ƒöÊPUèÕ ~èÌŠ|3ÿ'LÃ3Éö}Å£$#ð™’$ÅéƒPÐvS9ûUò6lM8ØyÚDá6Y¸ÔÿxÔ å¯Ýúʘ{ö™ÊšM¢ØáÏ K„·(ÇX1÷eÁ”/d§Ÿ ù‰[Ù½©”^r¼@Ñww ’3Ì=ˆ'7‚ݺøçyí?5oË;«\ÍhaãS“2‡Ôö„ ’·pÈ#"É3ÊœœAºÃø/”¨šœöjxùF´êŸ¸©Nþ¬\j`SkèNaò›'Là]ó’¡4±”D\FÎü™äøÍUe[ÜpŒ”Rµt3Z׈* i­XõŒJÔ¥ = >ÓÎ^+ÄûÉ¡MêÏö_&Yóäÿ2o¯„cœžÙΉÃÕuǨæd9ÔþdÌÏ”zÜ@%Éàzšá‘ o"Sø]ιwÁëžÔN©ìãð_¡Öuh+So3|ȃ‡®û"à+>ø“OÎòšZzFQiâLÖîm£úµÉeáŽã%¡lý0« ÙCC.|NrY±¼Ÿ=Û~ã¼*»˜ß!—]|¯RîÔG‚ŠG5…Ÿ@2<ócàÎ[Y¶üÏÿø ¡,¢¶¯žØ¯ –n\w°z¼§¢¿O¨ dU6Æœî}SVB’Æ¡—ò¥Ï >çqNP ÿ›AX;GØ^ ?ù.7cÜÓ– ²±{“ëÌtÓÔ àt«wn™MÆÖ…óanMk 1ZülaeC*7äF¡†¥#1ÌgÛ¤ió¯.ñýÀ¾½ð¨Dð0Ê,/Ÿà“Á0×?Ô/¢,s9Û©óžõõÃg Sg]w_ìâ8–'2ò¤—H0/È Þ(­dÚu—Ñ ~yåCô©F¹xÛˆoÔˆ²ìãøø 8¦´pƒòŠ2L—.±½ž5ÜÅ("µŸs;D{õ±P?y°ÙœÛë+çÀ­R¤†Êgóàþ_<%Où^ :=®ß¡2 ^ô¹ð·)C@Ùå^L1Õa?Bi›kì:6©ÿ4Uæaš, Åé¹ë«UÎmeæÿô k$(XJqßAc[cÅŸø–·a`¢îy½ !À°NíÏͲ1þHQWI|ra²º“~ÆzÜ­É¡BM°åß9(ús2VD`r¦Ù|lýÅÙbü²ø!e‰w탙5É/ãòîçFèx Ì¢I]rHù×I@ r\«Ô/«© (m;ìPMªp[¼d2´€ ·ºÍMu†ÈʤRµ™ú¼–ífî÷(•Õr¿P¢õ–ô:juþ½AYœr²#KÿNü#8Ç’ÄNŽ`û÷ìç7œh?FÉ8/Õ¢ÆÑOý|Ñgm¯÷ É.{ÂqVê_¸ÿHßÖxdâä¹÷©"²+wé‹]tÿ]N–ž3å¦ó:ßþâÿ²ÄîÁ²Á 2qÓÄ0eàüýîüþ¨ï“Їçïž«¢ÕÔµóú¾~ç`¾~º~­êŸ'^£áõ·¡c½Mü ^ïØ" ”¿MT’‚{È•dø|¯ˆ½ÝÕózh¡–`XÅ}×Ô~Õ˜ùlÊ’Ä'%½AFê"ä€u‹á÷­;Lˆeoî”{`ÜAžàËs&ä¸S7jA¯ ,øß :Œ&qgÅZ)¥ôSš),­ü»&ûL[Þg „žà§”{Õ?g|å$q…QCÔj×5i!†íÉÂc]µô£MÞ®\­¥Òs kLA:ê!"ÈS›˜¢‰€‰ÀêÊ)Ô!W'ýçŸóyÜ·–í÷É3‘ýIie:¸Ê‹ ¼ÿVïÉ›,$ÒêkQiI¬]º”UàÏx×H鸦’"ã’qüéá=´ÔlÑ©A²ÍrXT? ©^uˆû¡•nJØ«üþuåvòã÷&ãÔ›œNBbÁª|Æ”•:ЦGö!&®'¸AÝ’‡G·Ð Þ„XïÊ8ªÄý‡´p©¶H5{:ÁÏܯ6Î’ë«þ2YŽa²ªâ³'xöôBß"»v¨_ ›[¢íˆ ýΠtÉ äJÊšžB_žEwjQ&".VY+>·¯þn×…‰&“µ^x–YBnìÅ÷¸»‡ó ;ªÍg†éHС_-ˆÚ6ÆèšÍ¨;õµ%€!ˆ·ÐÝù°ÔH–‡Yz I%LqÕ>ø­ÿußiÄcôO∡r¶Þ¿f=Qw¥™_ƈªs5“"¾B&ŽÓZ`çé•AáÍpɆ ø^Úq܆v¶fªì\zfDZj$³ ‚>2æ•’N&M.ž)- ÞÀ2o;=~Bl$¿ó“ˆ”¦gÊa¯H¬÷‰Q\ ¹k_ظa‘C÷e…ìçŸo=t¤MÁ䑨¼4çWÉMüÁÄÊÞÆÓ<ˆ ÉÙå°7jlÌï&ÃC)r)ç6\õK 9å4E¼ÆF1€³„>êÐBý€'¹Ø*›A R~0˜®ÁÅ-ó«©ÖXÄkAèÀ1ã’œ½Gm4öâ'åkˆ²K]›÷ÀЙÀ½6 ÁÌ}! Éuc ”sÛ¦ðÊ-°a{ÿE#+îT©ëw¯Ê¼­EQ\#¾8àðMñt¯ÑѲßU|§ 禽S˜l¬OjiPâö â÷ò‰ÅÕ„¡©"¤eö‚éjý!jG†ðëÇ(¯Oä}Ý]ÚOýÕŠç/ÇÞ‹°íù‡Ã ´r#†ÂùÌÿ-3«¸ É€}Ì[3§äÀe›ùàÔÖð5ûÃÐÚ€­‚&±”Ü^Õµ)CWúÿ™¸.šS"Dl(‚ó¿tʧõç×Â8j×µ'¼â¡÷´¥ž§F]õÂÚûÌ» n²R‚ïÁkÃä£Ï,R€l%¡ž`IÌ©öwü'кƒWÇÕFŽ~„vÙZý[óç^ÉWkúÕ4K²¾÷MñºÎ¾¬±æ £\)oËÎ)2ÁyÕ&7OS÷Á´Eá:¯ÕVVó£ž/Š¿B°"ˆÞÁg¡§ð£ç¾ègò§¸cR¾òªNA_K¸Øpr È—.œ¸‹ÐÐøçºo ÷H|š3Å <ƒFŽÑ멯G÷ÊÝÛD6?¢bø"q“iêþÐâ_™,¦°97ØwîéxaJ˜FkÝónÖ"E>J;Žè¢Bf]zwDÞâËVRñHÉ3&Á¨°WDÆì°YBŽ JI謟3‡†1Ì€Í:×{õ Ÿ<2P@³ùºâ™…Ù½G-M.F dü4Ž,[Õ#«´ÃzIOèxr€^ ÷QßUèéJ? ‘ºàñÝäá^¦0‹Štc±Á:àyÂK¹-à2w¬P•Æ0Õ߃ÖÇÙÜâçdKI‹[ºŒsÝÍÙxÄFµ®~"¨+‹EêaæØ™exÚ'óÇÄã,Bá0L©NÞRõD¨ráû \aõJšcEï´°EÛ[óLÝÑÐÚòÙÓf‹móÓA2ÚHóKŒ/Û=ݵVï ŒîÊÜ©3õ¨çƞǪ]* ù;RÂÐO³×GlDØÆáâ©äÂ%eEÙ çnaìÔeu‰Â¸‡x”PrÿBD÷] °«÷à M5(WÖ+“ჱ;Û¹ é¯ò ¡ü‚Ù l„¨€÷l±&ǤŽçí†9rþ!«…b<0DZ–'bvÑ;}"±¹uê5'…ÐQÿH‡°ÏÌ‹]?c¼’=Ø|7ópò9ÚÓÑK]­îbcN Ù[*Ã6uC¸_svì%¸·šuÉË]iê8\<´œ‡Èð3¿ŽûæÐÇí0Ï—mCc?}É^"L™«Š1C”±Ñ“ø³ôúôäF„ƒWý—©„1Ž3[`Éóß`uvÛ iàl¿vDxP¿/ª8H„¡Â÷ÂæT‚ù~Òæq Nb ²¿tSPýŽ5Ø‚´GIűþ…DçP'¦Ç±&•¬ngS¶D9c±zúHcûbçÑ>ËaÆ …ÿÙmù· ‡ÏðudC%—-÷+þ¦c\cê“Y»n´‹¢-˜Ä´Èæh}©3#óx"ì]ƒªïh¶¢g©ó#õ „¦¤Û4ÓdØÍ†f3­ê©½Ù(¿ü‹ÅÈ É‹ìჂàåŒ ‘á•^¢x-ì¦ï÷ ž³_uÖqeo!ä.S|ÚÉ~)óu×üb¡K’Z×'ÂÖG`Þ§C˜.\ïDΈ¤0›'±R¨Õ: þÑÙÃkK’ùžuUß\µA©>RÓ´*ûIpjˆ:Ȇ*^ƒ=oÀ¯äX(_Æççú)Õ éN;ýjùЀ³jÓˆ•Ñ:ÿa÷X‡ÓóRbc®h铘ö^isnì?šb)ÉgBïµhL±yÊ´¢JU-€ÁL¶Ôû}–þªdævÕ]Ë­y± of¯ë”CŒÆa !Â'º‹Øxo·¬ù[¢43ŸK¥j&øó£m$iåLjN$´ÞωÕ6mT†jëÄîÙ=’ÿim•£@õñÈ,0.>UŒUèãÚf)¡Ô#ÔBS% ã-»‘‰Å)Ó6£iÛ+LwÍ<±ÌdÔw¶Ò L4ÝróIÖ‚ãRØqö1)²Ϥâün+U1[å„×<´#ÉrìŽåB]ô¦Ýoºï—N!9×DÜ¡”HÂó"[±Ê†#ÝÒòñó *=½]“à “stM ™ §¦;Í¥;:FQ¥^Ø’ßEw©ó ¨¼e¿ÿiL½Z°;Š'!/ý.ï>«8³½œ‡ïÿohV3²r(Á^5ù@‹»§£¨˜åko·py(„õ~à.™ ߃–a-Ô7üœ Úe—hub¸o!ÆPW»¯j&ÅNØ}Ù˜Íw ’žÚ’иƒêTKW¢øøA˜GêàÛÿPýdÒ5W±CIž"FBT+¯gpXwv8¬T¬NFμcWŸŠ€ZÄ•i`†ã>Í×R ‰Nú+²'ư$†8æ6ÛM,’ v»·þ–Ì¡ pß©ìD?µ±û<’0ün(x˜µaz”Ý·…à—rÂ1Íζ?Mÿu¤Xv‚5Jó åSe?Bÿÿ|4qC{àY¥&¾KuZ f”uŸÐYD€&¤O~ÈžmñÌßE?¿­ys²®$};œ Yû êVµ J×K‡$…«ÁÍBâœè鹚½r—åÓlSt§G÷,©6ïtÇ¥ƒY,‹$‹ϓUüQR"A.Ï.PÚcœy5+€pi“Ÿ@ik{Á÷¦qvõN¶ª.“u3#6êìoÀúœÂè(u¿V÷K¿vwˆÆRÏØUuæŸ=Šõ*ˆWÇö×3˜†¢X³x+…6 ©§ÂÒ÷ø $çÒ®  ±íNò¦j³QPÔZëøZˆc?ÕŸÿqÁã1ÆúC£º'k)l6G弦K¬c?R Àòèè3îõægìŒÌ"÷ûê«k`?q5ù»ª3ú.å!úOjÌL¥'€€ÝÝ©o'ÿñ$yPÊL|&æ^ å5›f öB=MNcðFNñb¨ÀŽ1†sm˦Ç&Š—iŠÒß lC¹•Ó´œÌ¸ýÛÿ€ß‚º4ØÂlŸ(+n(ÂȺþ ]"¥¼5þßÿ"˜AŸó2YÝ6ô¼gHÇp¨h+¸ÇöA4Êj ”|•@;rÔÁÃ^½L‚w§ÁC&.&’IÏy€Ï‚IÿÿÐGÐZ¨koTÿzål¥ xd2æˆÃ»èðŠZ=3/þf+à_õsèþÌ>8 (†Æ‘RMßd#¥âÏþY‰ü«@S”²Â¥†­G¤Ô°Ù#h„ÿÄÏ`0rØŒ&á§ n ¯.÷JѦÌL¸*/ÀSϹ© 7ð$%H+ûæ®Ç;瀋ö窩Òº'¦åÀ‰je©1â­e>íäYÚÖ„Dþa |gP‹âÚÏ. cÍA¦:!õJdÅeßBμnùVù©ê§y›‹nt…ª iuDú‚›XètçBÏŠÅYaÒBß-ÔREÆ¥¨oNʃCÞ—9õ©Xª÷Ã\s·öEAwa!ß{#(ÉŠ±Y¼wVmÂùN!Çœ8ðYr̰x†’yýÕZXÄX=Tª@z~$b‹ãÌÍ=ÈŒ·^ÄCÙl\W|åq±#K1iHôôc#²®¾Cü;¬zãÇÍQ ”nwˆ©ˆN©; XFW`O#]hxµŒÂ›§•Ç\šW(UQ –!úç{VdÀR©÷¡o|·kÐyŒ‚Olò.ý÷iRÉáüâë—wÕ#ý Ÿ”“Ážd! -bœ%rWOn³$A7poÿ™•úPMØ¥c˜WŒ•k½Ò¼§›7³`?2ý~îB*T_ÉÊ—4²H£áïÊME-–¢ -²€uÍ-Y‡©*Z álžCûxS;å{t Ö™è´³ñÖA£Wƒ2*…`&:Û-{AúNI¸|lç_©#ÃE‹d ¬'§BÇÄÒyW|„– O9¨b²iªº¯í?øÙi}‹$ï‡`L¯[‘ê…Wý–µm ë h’ŒŸ@ ÑN7+Þ¼£n?Žáb#Xíöme ›¬0=Ûå¼ñÈÌ ëÒ½ŠJ]ø=FñÞÆÅø#ñKØöVŽ¡0ù2kÖ3ÊW@d{‡äøý¡ °áBOuâK,ÎôË=žÉüqlÅÅ:¾9¸Qé|¶jvKL/ÏR{<Ÿ2îðG¡~‰ð.Éž!@þÅY}¯è»_â[p. H7kÁnù¦^àG"w¾JH„Êѱ¦‘ЭØbìNï¯Bp®2ÅÛ•`]V·¹.–HÌꜾÊFƒv* ó0ŸŽ€-ˆÆ·^c襎 mCà 5³>jØm‘; Ø-ˆ_`þÈ2Õ˜g¹® ×þžà05ž =W@vE –qƒ}y2•Ò“5ÜWÍWÊPø×ÜN®"k–ô<Æay“¿ïPøúpÚ­ÝË^‡°þèæñ”-{ °ëæ ÝùÖ7–NDæµ×,t×[w• –””©ºé&±ù bÙ+g¹¬ò§P•º.£'éæäG¥³½ï¸aÑ'V»å§jM5„# ðç >64¼ú±£Ší¬>ñy–á'êçâ:7 ¡™À% ¢Ñ‹$ÓDÛ{•KðË‹$B ŸAÐ|cƒWp›{&A—¾ÝGÍ0¹ô3Žmˆ†M3ˆû-ßbúßýê¶Ö-g‹œ*zÔ",c£–ã1.”µÅªÅtŒšÔ¤“lÚÅÄ}8@¹^:+cX²(+æ"÷\—égFÂa!Ó "Z§)XU<™·«&¥R_‘9|#Ü&Gõg½gÕ[|b¥m0î´Æ–@7ߊ7ÍuVl­Ân5‡LêÜGúw|f á@'žD‹ÜÐ ùµ@IKæúORMý=FÈ ’#>’[iS~0ƒÝÿG„ëIM²“Ûz7IŸû³üä*e´B£g*L|т֩Ü}‘ªó¸ø×v¾¼·¿õ^òât"FeïW„´:VE”fß§²>^Ì„­¢)?Ëù©|Ø'c¶;AÇ#÷¾Ä ªM­^%Îm]ãû„‰¸ymíòµ£îêþ'÷&a ½±CyŸšÊWoD¿'jîN#ǦcH!Í%ÙóÛãëö≥å%k8§™o-íê²»ì:eœS– :ÇÀLâ®J Áëm ÀïM¹ù$ °l ¿‚‡޽mL󛦭p Jà\¤‰…÷?Ô;ÆÚË‘r”xñÊ¿§ÖšgÜ£$hmpÎûYµC¨ù@DD«P†3,-ÿ+ˆ+jÌ ¸;”.øñÀpÏs׉²J}Ü”Dùæ‰WÓØ‰Ãy+ªjOÿpyÅò’qŠv#+”¢Ka}±Š °È 8„F|Ôa þ޾æ qGÕgÝMû6⇉C„h)óÂf:ºKœïÛZŠY¼96Ji¨ø†lÎÓKò]uSj%±í¸.½ è˜FÒ'o60 Ëcóû@’/ÑUtì+ô†/^äŹä–Ó.häê¹UqEr ¯Éö#8lƒŽôÖœFͧ IrÇ+Ï‹þYoòÈù‡âÜ<‡=ÂÐŒĘ@2O4E‹FËT‘wr?Ý=å¼îyÔV~ëò‹Ü “ÌHEWhˆ´‘°â,…ÕÓ†õ8»Ï¾rÈ*“#5ExÙj”-óNQŒÁ ®5â–obÞlÂxôê%ë%»Wœ:shƒ1kQÚJªnoÒüÊæ¿œíí;±Èf×EM{DÔHw´ì8”öÂ0¤±¥Ê¸<Ĉñy³³Ì9âœt+nʩݫS‘>:í[ÌÑéÉÝä°P¡üÐGØÑrú{ ø¹Ýáªh(ïÕ»ÓÒÏZ[†ÃMz(δZ÷¦Íàˆ@ô±$˜ržôÒ7ü ëD6[­´9$u= Íß» >àôàþÕXž–/xq};u½ç´Ê¯—y¥™É±VüÇá|þW^7Ïè‚ùýáúº3ý]{ß? ûçî†çë_çô |ˆŸ¨ ·¡c½Mü ^ïØ" ”Ía§KŸö´J6È!±/ç‰ Éa÷ì)Å}×Ô~Õ˜ïÙ•"õiT¥u†KN^fjN¥Ó—Ëü~<%z¿ë!ÞH²æÖQwáa9p 7­Ó”ÏÀêjÜ z]›µôÖê°¥ÒõÈVÄkI%W+ƒµGÞ.ÐÆÔIùÜgpr篃YœZÜ™Àó34*N1%¸¥3¡Dýù&V@BÑYWЉ<ø¹°ƒ½ë%•co„®¸g²MÕÕ=Žïp©Ûñ ãñ¥5[ÐÇÞéÌþ1§©Û©Ú¿÷îb¸Â¦`œn¤5Ê<Âz%Éö,£ŸÑ?MðŽ+*)ÁS+ªÄQ²`H=O…¨Ú?)ÍzÖÈÜý»Ø¼+.@TÇ Lr—^>œ’ü¥@îÒÏ@AÍ/Gãë–Ìý³å_ëIÅÍç‹W˜ rõZD‹ôñ <îP[d!+ù‚sÆkˆ§Ê“² Œòo¥q!ùf¤ê‚+“ŠÁ„ØXß`Ê„^TÌYg_S£ß°m2t½Ð9mwÁ£&E$’VÕÔÍi(52Eu÷Õ@MNØù‡7ºÝBX¯åÛ(Zþ2Ìèïéò†¤Š÷½lÎë†P¹ÄS‘ü‚›89úWW[®P}º8¼×Œ½”°í»Õ‰y[Ôb Hk¬%ù&m Õ2"V-·¿¥I-ÎQ4y tLÕ×#¿a·ÎN)£3eLÍÑf¨(Ï@àYé«ÕžÀá8âKìÃ>71Cž à­ŠYpýa„$} XôáS£Îi(3€gÖýH™¢çÌkeOÑÊ}0t§2?RíH*Fš›™è¤0iàù1\Z‡3Keñ[˜göòôXöÇE>+a)úu„Ø¢­4ûß_ŠŠ¿€õG)Iö`¿ðì¥Z˜é¯B༑;ȹóTK‚È¿Ÿ.rµ¨83É'ÖÒÏùÜ·ÈžºOå)9VujAº7;žzøF èezvÿ"€çÉ„Ëaª7ý¶µ¹ër›»]翞‹)MãH“ÅÄí›+ ¸zømÝþü§P9WkRMØ^{ÀÅJo …²­N#Нå3Ì:búæÅ#˜…ß1¦®•›1…›öÓªÞhÀ suÿf¯a5I_‹»nêHÇËñ:ÉCsµi2õÔ¤Ó™/^¶WR&Ãzá¦lÝú£ ÒÊÅ-QNѸ"™‘Ô÷Ý+¿´='Èé-šbfÿf»ÍT&Öæ$#ç—[uù©¬P=?ËwUˆr¢EEz¯:_|WÄ©“Ϫ #URƒZëÙ›jPÊ!:0ãÁjŸ‡Iíu… D`”s²œ`‚8VWÖÌŒÓYFgW?@ç4ª­š0Öf[¸×º9 HØÝ4D—ÉäËæÙ{Â=ú­lR_Y)ìÞM¾Sä4¸žÃõ Ææ„.·"jOþFà¸} qýçåv]—)ÄÇ Ã+6Z+Ôja¾h$^­èqfy*ŽR‹‘VÈϺl ì%p)èQM Ü!ÉF‡˜Rô£c¢Ø¾òu§ÅDs„8]š–aÏ%®§1ý½/´À¾ýEÆ?-!Ev×|в%Œƒkáè\!¨Yg)F˜¯Ø2îIr]É\bQ±Å¥Ò±O÷O”ßÿK‘ËÈð$úsoOføÿ&=×Ù Q®É4ççÓ¥šÚ¸¥˜PiQX Ôp§±žaa}DŒj#>Zõ…?3e ºØk(J¶ÁL<èHP4#<´ª³Th$!°C’$Æü¾’•ÎÇcLY„ rÿ r;sκ™W.CázV)± IoŒk°of»Sýù„ËÌ{j/0x/pf*…kTûë‰"Í… Ó‹™®¨ ôû·JVSߣ<(µÀ•&»x¹ªRXƒ!G(Ý’>Zž)™iJ‘\XÔõ…­‹.¨x*M›k## >Ì•µ- ”)K ÞÁAFܰBÍ«wüÓÅ)öËARJ»¯ð —•kh)êïÞf°*£üàH¥n•Å܆¸›;ÿ{´…xO-ë–¡g1²li1ЛI«):ÿ£È-w8ü™ ²òhxöïþÄ‹V<ð½´o eMÉ‹~“žü>l±È*ûfq uÍGµ{ó¯Ôp ›¼ÇÚQߨ±£†öœ¾³Ìp Žê¡ÊÂÕíñg^nñWò”3&EåE쌚{ µè£î‰+µ¥ƒµå¹Öö|…ªe¾©üªÍ§¶ÎÚïûRC1ð§CBmK‘é"ƒËKRˆ1 ýη^ß L9¬Í'lï¹ é¯ò s$²Šm‹e‰4ÙJ÷ë–8 F³bO-õ‹[„;Òl Òé«TÐË ûY'_&»Œw†D3áÛ1O 4Åά¤¹mºH1Ü“ƒ}=’Z­åÅPÿ%}º\íŽCÒ(pÕtXàÙȇÈoA{ý¨0Ù· M ^ºO@‰Ê÷’¯'|W/50RT_'µ3•Wká¹'õË4!ÿ+,Éh0@HßVìñI‰Õ݈Ê1xcý?+V-í™b¿‚+ìx™ñmÄ„TŒ÷¿Ä3+—Î’EöFäÑÅ„¶’Ó/&vQw’¬6h°)Ép>Øh#3çþOÖw;óô>XÁëñŸ6##¬ëøÅS}Gˆu7¨PChÿ8ž{j¬§udÜ&r©ÿŸÈüÅÚëd‡ DÅ›åk—>¸Ë£Ñ©xf°00µT¯wLºþÑ1^UR¿‚užOP–nŸúšp¾ÝêjÉ…¹.É=ùA'KsÚöÏå¶î]•R—É*‘æÈrV3kÕ—Ëžqcõ ¹•WÓ¡uË e„ñ°Lz8²k\Ì,Ó«O%Y_þïLJBJÉ~˜=B6úÁ¸qØ‚GßMëEÌ3S/¹;¤%ÒýÛcc÷ïåwñ«Úµàäç½á€jìBu‡øîÿÿ2€„è!uõ |og­ym‡3)“Ñî ŠG`–4Æ•F•!9 ÙU4µ¥²÷÷:¹ Kƒ®hé“—1qÞDA²-vàMÏûUõC¦¬'xRYªü”èûesœGÉãTD£›ñ|qèו2Mjþk*ÛÊ[þÓÅH À2z3ØýþâW¼ÁXMkÉà…Y$¢6u"«ù+7›Û ¦ö÷·É9æÒ-3Ý&.vG %ÁÅï9‡!O ¹I²£;.ÛÞn3ÿTb¥tçP5çNº™dÉ]À·I>/:©ç6|³GÐŒš_ý2_îd³œð’e߸²{—NüVN‚Ý"&]ØA§²z涤û(YϹ˜÷¾Èï ä&J¢Æœ µsSüb[M(ȈÒü©É¡ÿs&›pðWÆB¾ú"jæF4¹}§Ï¿Óà% ¼$Æ|ʰγÀdA°›u22Í@ÿ᣺¤·Æ30¦I/¦­Qn—G÷ú˜&˜ØóZûÎ%ëR”– õ[ÉŒNre”E[áydÉ8Åߪg˜fÓ‰ƒìËÀ£SBÍg¢´¢¢F7 †ÍÔA} _qÕ‚¬‘NHû/ÐÃî ùŒ¨ú&æí¡¬±œ2à1b½O¿eÏ­2JðeQàÑxâ,¦ ¶ûìÌ™çÙH%Ä–/CÍ9„xlú¢Ø°f`èÎHOxÆEŒCÞ‹PwTÖ¨d6#㑦)ndq´|Ù}òÕô_*w ÇkÞ‹å6K(ò"Å¡ÇÏq=ÁT\ð(«Ðÿ'ÈU'ítŽËà¢[NþzéêQ]…ÇF_XiS*ñÄh´cˆô‹×!ð<„b9ˆ(8Ѐº漫JN™»åSDo¿ðë5XIíV)ñàE –'²:1…ç‚eÈ/Ö÷qaÐ(Út~XÁG% I-®ÒïN=¼0£ùÙ¶©ê]Ñ™¸ßL-²¼á²hÌ`@î¿ÿ5 HgNÉxë°£âOý#ÈWl)hìz¼]ŸPº1o¸=¥ß r>é:áï˜l÷,©6ìBþó7tÈb7Œ¥eJÀÜ>àÞg3øÂ¯Ùø6¸mèÚu7 ¹T„Þ2ÿ?6JxÛæ÷™ÇSź‹.òƾÿ}:ÇÙ8‘x"-.:ípDT×Ü»ðÉ ®ó‹uŸˆ­Š þßÃüØM<,"–ºÈ”ª¯{]á±éy?êÊïEQ®.‰Ñbð«¼[—·SBS›0%ôq¸/öÖjgË»¿NCó°›,HÕ 4ñ¶ðÒ‡ò˜ ¬ô¸$"Óë”J=ðêÜ/X¢\ý}K3é¢Q޳/ó¨—Ì'BBÚY9bõ>ÕÜD _ÚÅÖÆ(Ãnù/Úü„Ö4³¡ §&öLÞÖ!̳3rhýúh,Q‚M÷ÊŸySÄl§×ÔmW¸¹_G¥G„d±ú iвIËñáB爴s÷<À8§Hg]•j¦ÞˆlMÚhÀØ÷¯<îºîµ»ÖûçgúêR€GP 47mºÏ®â?ÿQŠ´ð,Ñr¸ÈXÿ~uøã lBY “pÐÙÒ±([hð‚ŒY´B¯Žc÷¹G·%¸æk3Œ>µ+}{;Ç(e.ƒã$’õ%Û$‰IzÊè¼îESÿ98òf—e„#‹Ùu0Ì„n›©—³L¬Ýéý2M^’/­Ä6CÏzBnÝN5çmÑq§3×ÀÐ) ?ö窩•zI˜Çf•í‡Q)ˬd&´_È´¤À¨!”±P 1—âÇ¢†NYŒRoðצ7N¯cÞzÁĬY»\¨·MíÎ=-EÆ6vrko )’ƒÓ²ÿ!9˜ ì¾+4qsÚžbŠ!Œ„ œì8·g0jâf„^,Š‘¿õc-Ëè´ Â¥A)(„ét¢ìûjŸ'’ ¦½üv¢>kõtR\³{„Ãjж”kDÀwVžð’ï;uWƒXËÌHUÜ8Bæ¡ÓPßïáÞïã —H«1[(¯ gœ¶gDÇToµŠI¾ÌX³«óèðÞ÷2Y»9¯ç‘ b ÚÌ5¥¥€¥ ¬öÉ©]NÑ‚67*œ´G›eÀúg1c €Ð¿…3vSÃû2 ›·WÜêÅP'LÏ 4ßÿH»Ã¼wÄêŽø02†ÐÛ—·5{B¶ûXƒ1 OÔ±P”€z=sDàÐêÍ&—P#·Æ%ήÉ'Ši³²Ü›á¤"‹Fžé°V|ùÆ.:%Q`l5ó¡Ð —M9Z@ûûßÚ0¥ûBì"iz¯Åx‚cÿý¶Á#š;?ÿí¦Ÿ¸|lÎßô'5]¦K8¤/c÷~‚¼Û9ÏSßh^ÆS¡Yßÿ<êC«“…ï F4b«Yk´˜ÛŠg*ËF%Êiv›]ofÄÀTÜ를IѕڙÈtv4í¿j«Ó W7&£ç¬=ñŠ= cÍLG+Ó“hÍòÿ غïÛRc5EŠOc 3‹PËœªEì╹!í<ÿJià øY}ÎÈeoó¾2¡ç Œ²ã³x+A<’&ÛÔMíŠK¾©Ž‘'?!My«Å"Sâ8¬^GIÆg+–Fe’ŽÛMv¤íŒ—Þ­áß\R¬ºùš?¹6=xˆcôÃ7Û·YDZ~ãMp̆þ§ ¯ÐÆÁ«Ob!D&n`@ÉNд¤;£*ÿ?º|>¯Ù?„…ó×ú€2JVú„ÝÉÊPödÊÍt„­åÞß@­juÚŠ¥Ì–¦ÑázÃy@Lan¼÷,*-ÑÉí=e(uÔý+*; =¦ÓR6±9%­h¨‰¥Ì6ÛëeòKZ½~®³„…£ÿ2i¿Ì{ÀäÐÃÏhöÚ¯&Š*šf…>Œ[ª)ÿ&WUËiòSƒޡ³Ežt‚T-×§:ÂS‘‰bß:“àãƒ9wV…œ0T‚ðc Ö ÝßN-M†µgø d5[½”¶¤r|íÖ½_å¸.³oÉ‹5Õˆ¯4û€´›?RK]§Â1N}ªW–ð2Ê5± ¡ ‘‰Îí ž˜Ë üfv5ÚWð™Ï41 à")ýe„‹vy ˆþæzÔÑn`è}á+×–rDãsÒ4Q U)ÀÈç>ãT wÚ÷3L!.õÜíéEŠÇÐÄ•ÄiÏ1ò»ÌRܨÑeœœû± ›T†gÕæôKÿ ‹Ò¯ñCFìÃÜÙóÂ¥í="(ÈDÜM‘\DZeÃs‘šè±îÜVì ìäŽÌ¥%‹ï²aÇ–zAuL0åñ„ü‘D'ÃÝ Nø;,þŽDÀÞ9Ù-3c`? Û¯›æù¾o›æù¼Z|82 ÄÞÆ _ ÎQ%ß-ÿP`Oÿÿc_‹rθX¹#äÇ¿n&Û²ÉXcA¶(B%MFD ýjõ÷æ”pMDÙñ %bÊv=Õ\›Â@œÂ@œÂ@œÂ@œÂ@œÂ@œÂ@œÂ@œÂ@œÂ@LÊ—¹§¸“ÿýèºô^^^^^^^^^^^•ǽuàØl6 †Ãa°Øl5¬`бNZ±Ñ,T•ýw4 3ßÿj-2§°žý+ ñŠêx?7>[z©—ÿÿP‹Ì:ºóO îBû¾ä/¹ îBû¾ä/¹ îBûÖ´Ÿ+°³·ù5ZÎS^×9%õúH$sÎáŸ/ó#×EûÞ=:0°…m×Íó|ß7ÍówÜâ37ý_oYž=Ù«0?ÅÜ-lm}’…>8äK ˜HBj¡ëqíùÿµ-L9ªùì]ô·ÎŸÛ¦ae¶GoÃC’ÃäE¶?Êv"š”È0Ô"‚â¹ ]¥d]xÐSûrPzû¡åQ=?÷XG_ǸW²¡–W÷[ÔD[§9Î[¤B^áê›9ÕF¿Ä\Þž÷|º‚#XŒ,i‚H¹š§læ¬,w y-k…ðÈ÷ëÄ ¢†ŸVÛ,2_J]&zèŸêÛòªí?Q(ÿÙil32»ŸÿV–T€ÿU¨•Ó¨RÿÿTÍ`…b„dš°db`ÍTÿÿTÉce`\[]_bcfh‚jôô‚j dÉTÿÿTÇdaÿ ⿟hbejlm«ûû«€m kfÇTÿÿTÁe^…ÿד`fpëÿÿë€m lhÁTÿÿU¼f_‡ÿõýýõ»nnmi¼UÿÿU¹hb…ÿòî€éû€é7Ó»¹UÿÿU¶jjd`Œ‰¶Öÿÿêøÿþþüúúüþþÿ÷ä¶UÿÿU³lnmkjhfd` ¶æôúƒùúôÛW³UÿÿU±mmfbbehklibyÞôûøûó³\m±UÿÿU®lf€ÿ ä­xflmj_òû÷úñcpn®UÿÿUªmcƒÿæxjn˜÷÷ö÷÷öøõ›qoªUÿÿU§me…ÿ¢h²ùöôììôöø²ro§UÿÿV£oi†ÿÑà÷ïÔÌÌäï÷àrp£VÿÿV¡qpkf…¢ä‚ÿîê€XäÿÖÔìísr¡VÿÿVŸsttsqoi™ÿÌbjošÿÿñÌZrsŸVÿÿXœtvvutssn…ÿÛmqhÿ›psœXÿÿX™uuqmkmpso™ÿ~qmÚ€ÿ Äot™XÿÿX•vqŸ€ÿŸqtkî€ÿ±pp°€ÿ ämu•XÿÿX“vn‚ÿmvp¯€ÿånr“ÿ mv“XÿÿXwm‚ÿƒwt“ÿms€ÿ mwXÿÿXxp‚ÿoxxlÿnvmÿ mxXÿÿXŠzu–€ÿ–u{zpÿqxqÿ,qyŠXÿÿXˆ{{vqoqv{|{xroorx{xroorx{ˆXÿÿY‡~}}€{}}~}}{€}{ }}‡YÿÿX…•…OÿÿW•YMÿÿ›€ÿ™ŸÿŸÿ–ª§€ÿ©á•ï á£ÿÿªíÉÊʀɇʸ±‚ÊÉíªÿÿªìÊÊÉÇÇÈÈÉÊËÌÌÍÇÂÍ ÌÊìªÿÿªëÊÉÿ õêßÌÉËÌÍͳãã³Í ËëªÿÿªêÊÈ…ÿñÛÉËˤúú¤€Î ÍÌêªÿÿªéËȇÿù׫ÐèèЭÎÎÍÌéªÿÿªçÌÊ…ÿX¯›™žèÞÞèž™›¦°çªÿÿªçÍÍÊɨ׿ñÿÿ¢ÚûøúáÚÚáúøøÕ çªÿÿªæÍÎÍÍÌÌËÊÉßÇ¡ÃÙ×Ö××Ö×ÚÃ¥æªÿÿªäÍÍË€ÊÌÍÍÌʲ¬ÂàÕ῞¨ÍäªÿÿªãÍË€ÿ öãÐËÍÎ̲½ãÒâ¶´ÏÎãªÿÿªâÍʃÿöÐÌλÕÕÐÒÒÐÖͽÏÎâªÿÿªàÎÊ…ÿàÌ­ßϤ¤ÂÏÚ«ÏÎàªÿÿ«àÎ̆ÿï´Ó±¡Ë˦±Ö¬ÏÏà«ÿÿ«ßÏÏÍËÕßõ‚ÿ®¡£ªõÿÖ¿¥¨ÏÏß«ÿÿ«Þ€ÐÏÏÎÌÜÿ̧ÂÎÝÿÿñÌ¥ÏÏÞ«ÿÿ«ÝƒÐÏÎÕÿòÍÏÌÿ ÝÏÐÝ«ÿÿ«ÜÐÐÏ€ÍÏÐÎÝÿÒÏÍò€ÿ ëÎÐÜ«ÿÿ«ÛÐÏÞ€ÿÞÏÐÍù€ÿäÎÎä€ÿ öÎÐÛ«ÿÿ«ÚÐ΂ÿÎÐÏä€ÿöÎÏÚÿ ÍÐÚ«ÿÿ«ÚÐ΂ÿÕÐÐÚÿÎÐÔÿ ÍÐÚ«ÿÿ«ÙÑ΂ÿÎÑÐÍÿÎÐÍÿ ÎÐÙ«ÿÿ«×ÑÐÜ€ÿÜÐÑÑÏÿÏÑÏÿÏÑ׫ÿÿ«ÖÒÑÐÏÎÏÐÑÒÒÑÏÎÎÏ€Ñ ÏÎÎÏÑÒÖ«ÿÿ«Ö•ÒÖ«ÿÿ§Õ•ÔÕ˜ÿÿ§•«•ÿÿ›€ÿ™ŸÿŸÿR•PQ€ÿR©•Ô©OÿÿPÎ`„b…cRK‚c`ÎPÿÿPËdfa]\^_bdgijkgck jeËPÿÿPÈeaÿ âÀŸibfjlmO¯¯O€m lgÈPÿÿPÂf_…ÿØ”bhjDËËD€o miÂPÿÿQ¿h`‡ÿïŠE”„„”Ippnj¿QÿÿQ¼ke…ÿwZ1.:¬gg¬:/2AL¼QÿÿQ¹mmgcŽ‹·Øÿÿ@—ÌÈÛ}ee}ÛÈ¿~:¹QÿÿQ¶oqpnmljgc¢·DQ`^`cc`^`R9Z¶QÿÿR´ppjgghlnolg|lR„]__]„OC^p´RÿÿR±qk€ÿå¯{kprnbV’[]][Rgus±RÿÿR¯qhƒÿæ{ns[{iX[[Xiw`vs¯RÿÿR¬sj…ÿ¥mNƒTO==OT}Mwu¬RÿÿR¨un†ÿÓTcCEÊÊTCmLwv¨RÿÿR§xwqm‰¦å‚ÿJ8T]åÿÖ£=Ayx§RÿÿR¤z{{yxuoÿÌfoužÿÿñÌ`xy¤RÿÿS¢|}}|{zzuŠÿÝtypÿ xz¢SÿÿS ||ytrtxzvžÿ„ytÜ€ÿ Év| SÿÿSœ~z¤€ÿ¤z|sð€ÿµxx´€ÿ æv}œSÿÿS›~w‚ÿv~y´€ÿçwz™ÿ u~›SÿÿT™€w‚ÿŠ}šÿw|‡ÿ v€™TÿÿT—y‚ÿy€vÿx~vÿ w€—TÿÿT•„€ÿ„ƒ{ÿ{‚{ÿ,{ƒ•TÿÿT’…„€{z{€„……‚|zz|‚„‚|zz|‚…’TÿÿU“ˆ‡‡€†‡‡ˆ‡‡†€‡† ‡ˆ“UÿÿT’•’LÿÿS•UJÿÿ›€ÿ™Ÿÿis32~ŽÿugC‚;Cv==guÿÿgœ®£†PDWVÿU^ŽgÿÿC’ÿðm¿ÿÇG‰Cÿÿ;޵Åòÿþÿÿú€ÿ$;ÿÿ;‰@;=SŽÿû÷ýøŽ;ÿÿ;†ÿÿÑuA§ÿûÿª†;ÿÿ;ÿ; ñÿÑôüe;ÿÿ;dOf´ÿÿÍ?úèÒ];ÿÿ;]]QS’ÿÿ?¡ÿà];ÿÿ;]—ÿ—Jøÿmÿÿ];ÿÿ;]€ÿ\¾ÿ¼Mÿÿ];ÿÿC]”ÿ—t½’d½½cCÿÿg‡]`_gÿÿugC…;CguŽÿŽÿ½ÁÀ‚¼Àý½Á½ÿÿÁÞãà×ĿȾӾÌÚÁÿÿÀÜ‚ÿߢÿ¥ÒÙÀÿÿ¼Úæìúÿ¢ÇßÚÞˤ¼ÿÿ¼Ù€¼Ë­¼ÜÕݸ­¼ÿÿ¼ÕÿÿïÏ͵ßÔß²Õ¼ÿÿ¼Ôÿ;篥«Áϼÿÿ¼ÏÁËæÿÿ¢Ôÿè£Î¼ÿÿ¼ÎÈÃÅÙÿÿÔßÿýμÿÿ¼ÎÛÿÛÂûÿÙÍÿÿμÿÿ¼Î€ÿÇéÿèÂÿÿμÿÿÀÎÛÿÛÎÙèÚÊèèÎÀÿÿÁˆÎÊÁÿÿ½ÁÀ…¼ÀÁ½ŽÿŽÿwkI‚@IaBBkwÿÿk˜¯¥†PD\QŽQcŒkÿÿI‘‚ÿ:’CÌMnˆIÿÿ@Œ·Çóÿ:{¥L¥„:@ÿÿ@ˆC@A^|K`]b@|@ÿÿ@†ÿÿÓy]_sMpb†@ÿÿ@‚ÿ;ºS0Š$[o@ÿÿ@mUn·ÿÿFcÿýIi@ÿÿ@ieY[–ÿÿc¥ÿði@ÿÿ@iœÿœTùÿ–tÿÿi@ÿÿ@i€ÿgÂÿÀWÿÿi@ÿÿIišÿœ|˜ÁšmÂÂmIÿÿk‡imjkÿÿwkI…@IkwŽÿit32P€ÿýÿýÿýÿýÿýÿÌœMPãSRQPN9€¿…ÿ±3?OQãSRQPN0€ÏƒÿÌ.!NPRçSQO:€?ƒÿ !(APQSV[`fkÞn c]YURQJ9?Ïÿ .ORSW]fw„Þ’ €pcZUSQN$?ì€ÿ  ,QSV]hy’¤°Þ¶ ŸˆsbZURPA/Ú€ÿ *RSZex—­¼ÆÞÑ ¹¤ŒnaXRR ))Ú€ÿ)RS_t«¼ÆÌѾٸÄÐÐô¡†k[RRÿ )SSf„¥À¾µ¦œÙ™Ÿ«»¿À·œy`SS ÿ )SSm³ÎÀ®–yzÙ{z‚ µÅÅ©‚dSSÿ )SSm²Î¼¡…thÙe ly‹¬ÂÄ©‚dSSÿ )SSm±Í¸›€ngÙe it…¦¿Ä¨‚dSSÿ )SSlŽ±Ìµ˜}lgÁeyŽŽo‘e irƒ£½Ã¨‚dSSÿ )SSlŽ°Ë´—}lgÀfe•ÅÅ|ef iq‚¢¼Â§dSSÿ )SSlŽ°Ë´—|lgÁfªíí„cf iq‚¢¼Â§dSSÿ )SSl¯Ê³—|lg¾fee‡Âòò¤wef iq‚¡»Á¦dSSÿ )SSl®É³–|lg¾fecªÝ÷÷Ìdf iq‚¡ºÀ¦€cSSÿ )SSkŒ®È²–|lg€fy‚~{tro°fgjÇðûûë§gf iq‚ ¹À¥€cSSÿ )SSkŒ­È²–|mh€g³‚ÍȺ¡™Œ°gn„Õõûûò´tg jr‚ ¹¿¥€cSSÿ )SSkŒ­Ç±–|mh€gÏ‚ò ñíçåâÙÙÆ³³Ÿ’ƒ§g eu©áõ÷öõÍ–efg jr‚ ¸¾¤€cSSÿ )SSkŒ¬Æ°•|mh€gÙ‰ÿ òææØÐų¦•„wk¡g d}Ðï÷õõøä´cfg jr‚Ÿ·½¤€cSSÿ )SSk‹¬Ä¯•|mh€gÙÿëÒ¸¥“†|oiœg fjŽìøøõõùóÌnhfŒg jr‚Ÿ¶¼£cSSÿ )SSk‹«Ä¯•|mh€gÙ•ÿ滈oœg f®ò÷÷õõøõÛ˜rfŒg jr‚Ÿ¶»£cSSÿ )SSkŠªÃ¯•|mi€gÙ•ÿøîáѹ™sj˜g ešÚø÷öõõö÷îÐfŒg jr‚žµ»¢~cSSÿ )SSkŠ©Â®”|mi€hÙ˜ÿøéÔ»¨t–hl«ìû÷öøõèŒkŒh jr‚žµº¡~cSSÿ )SSj‰©Á­”|mi€hÙœÿëÆž…ul‘hgg»òû÷öø÷ï¡wg‹h jr´¹¡~bSSÿ )SSj‰©Á­”|mi€hÙžÿöÝžx‘hgfŸÔöù‚÷øøöÃŒf‹h jr´¹¡}bSSÿ )SSj‰¨À¬“|mi€hÙžÿüöæÐ³qhgy³ÃɇÈÖéø…÷ùãÒ‡Èɦfgjrœ³¸ }bSSÿ )SSjˆ§¿¬“|ni€hÙ¡ÿ öåÌ­‰nhhf‚Ûîôˆóöù„÷øùõ‡óôôëÃdgkrœ²·Ÿ}bSSÿ )SSjˆ¦¾¬“|nj€iÙ¤ÿ ìÀ“}neÝôüý‡üú‡øû‡üýüîÁbgkrœ²¶Ÿ}bSSÿ )SSiˆ¦¾«“|nj€iÙ¦ÿî»}ev·äöžøùôÕ¡agkrœ±¶Ÿ|bSSÿ )SSi‡¦½ª’|nj€i¡‚´½ÙÙìÿ úîÕ£wn®Úóøùù—øùù÷òΘkcgkr›°µž|bSSÿ )SSi‡¥¼ª’|nj€i{‚‚ ˆ››§´´ÆÕáîú˜ÿøÚ±‰…žÇó÷˜ùøõ丑o^ehkr›°´|bSSÿ )SSi†¤»©’|njŒi …š­ÁÓßèî÷ü”ÿ ýïËŒxŽÉéöø•ùøõÞ´w`]dghkr›¯´œ{bSSÿ )SSi†£»©’|ok‘j‚£¼áö•ÿ þûå¢e_Èïõú“ùøôí¥]Y`ehjjlsš¯³œ{bSSÿ )SSh†£º¨‘|ok‘jpx~‡Ÿ½Úõ’ÿ þþ÷ã¼}x¦ÝóøúúùúúöëÖŽj^bfhijjls™®²œ{aSSÿ )SSh…£¹§‘|ok•jvˆœ®ÅÝöüÿ þûë¿’‰žÊéöùŒú ùùõß»e\chii€j ls€™­²›zaSSÿ )SSh…¢¸§{ok™j‚§Íâòûÿ þýùÔœy“ÈçöŒúùõൂV^dhƒj ls€™­±šzaSSÿ )SSh…¡¸¦{okœj›Íò’ÿûã±cÆñü‹ûøî²zXafi„j ls€˜¬°šzaSSÿ )SSh„ ·¦{okœjv‚•´Ùòÿþöã¼³Òöü‹ûúô¿…`ghi„j ls€˜«¯™yaSSÿ )SShƒŸ¶¥{okžjpƒœ½ßÿþ÷äÔäúüŒûúؘd‡j ls€—ª®˜yaSSÿ )SShƒŸ´¤{ol¡kƒ¬ÞíøŒÿþúíêóýüýîªj‡k ms€—©­—yaSSÿ )SShƒž´£{ol¢ko{¹æŒÿþøéìöþ„üýý„üÿñ´w‡k ms€–©¬—yaSSÿ )SSg‚ž³£Ž{ol€k¢µ±§•†˜klo~œÄòû‰ÿýõæïøýüýþû÷÷üýý€üýþõÉ“ij…k ms–¨¬—x`SSÿ )SSg‚²¢Ž{ol€k ÇæäÝÑÍǵµ¬ “‡w”kw´àöˆÿúñåóú‚ýþùäÏÏíúƒýùÝ«gj…k ms•¨«–x`SSÿ )SSgœ±¢{ol€kÚ…ÿ òß̺¢‡~unknw®Øò‡ÿ÷îçöüýüùá¶””Æèú‚ýüì¾fj…k ms•§ª•w`SSÿ )SSgœ±¡{pm€lÚŠÿöÞ¹”x“l”͇ÿõëëúþý øì¥qTT¼ïüýþõÊjk…l ns”¦ª•w`SSÿ )SSf›°¡{pm€lÚŠÿüöíäÔµ™~lvµì„ÿýòêðû€þ úôãÁ}c__e}ªíõû€þøØŽtk„l ns”¦©•w`SSÿ )SSf€›¯ {pm€lÚŽÿøæÔ½¤ŒtŽlr„»æƒÿúïéõüÿýøòãÑÆœzggadx¥Úòùÿÿúä®zj„l ns”¥¨”v`SSÿ )SSf€š®Ÿ{pm€lÚ‘ÿøæÁ™„xŽl‡¹èúý€ÿöíëúýü÷íâÓÎàÔ¤tkhc_`§ÔîúýüîË€i„l ns”¤¨“v`SSÿ )SSf€™®Ÿ{pm€lÚ”ÿòÍœl|¤îú€ÿóìïÿýõëãÈÏäõûÍllje_U•Ýìøþúë†h„l ns”¤§“v`SSÿ )SSf™­ŸŒ{pm€lÚ”ÿûòãΗxŒl$p}™ÜùÿÿðéêîîâÔÎ׿ôûþòËxoljg_i„°Þîëâ„h„l ns“£¦’v`SSÿ )SSf˜¬žŒ{pmÚ–ÿý÷Ò²“uoŠm#ou¥ÖùÿñãØÒÔÒÒØéõüþþÿì¶mlkgad{•œœsi„m nt’£¥’u_SSÿ )SSe~˜«‹{qn€mÚ™ÿíÊ™s‹m v§àÿõäÒÇÊÓàîøýÿüó ymmkhc]XVW[dj„m ot~’¢¥‘u_SSÿ )SSe~—«‹zqn€mÚšÿûï±…Œm }©ÿûôíéêïöüþ„ÿÛž€mlkheddfil„m ot~’¢¤‘u_SSÿ )SSe~–ªœ‹zqn€mÚšÿþûëÁ‘‹m q…µëüúùùûüþþ„ÿ öˆmmllkkjjkll„m ot~‘¡£u_SSÿ )SSe}–©œŠzqn€mÚÿêÈžyŠms…¼æŒÿâ¯m ot~‘ £t_SSÿ )SSe}–¨›ŠzqnÈæèîñ÷ü˜ÿöÛ¡€qŠn‰Âö‹ÿùÖ‚sn ot~Ÿ¢t_SSÿ )SSe}•¨›Šzqn’ž¦¾Êßóšÿó¶z‹nžÛŒÿn ot~Ÿ¡t_SSÿ )SSe|”§šŠzqn wz|‚…Š’ž°Èáóü”ÿüæÂ’w‰nz¡óüŠÿúî—tŒn ot~ž¡Žs_SSÿ )SSe|“¦™‰zq‡npv‚’¢®ÀÖí“ÿûìΘz‰n€¶ìŒÿÂŽŒn ot~ž s_SSÿ )SSd{“¥™‰zqoŒn€žÁßêö“ÿȘwˆnqzËó‹ÿí°w‹n ot~Ÿs^SSÿ )SSd{“¥™‰{ros®Þ”ÿÏ“Šo“ÏŒÿÏ“‹o pu~Ÿr^SSÿ )SSd{’¤˜‰{rops~ªÎò‘ÿíÃ{rˆox±í‹ÿíÀ‹o pu~ŽœžŒr^SSÿ )SSdz‘£—ˆ{r’os~–´Îæÿûç·‡sˆoËÿûØ~r‰o pu~Ž›‹r^SSÿ )SSdz¢–ˆzr•ox’¸âôýÿüó«ˆou—îúŠÿç¢{‰o pt}šœ‹r^SSÿ )SScz¢–ˆzr—ovŽÖ÷ÿÛŸ‰o‚¾îŠÿ÷ß‹‰o pt}šœ‹q^SSÿ )SScy¡–ˆzrp–oqw’ÁíŽÿöÕ¥ˆotƒ×ù‰ÿý÷£{ˆo pt}™›Šq^SSÿ )SScy •‡zr™pv·çùÿóÑwˆp·ç‹ÿÉ“ˆp qu}Œ™š‰q^SSÿ )SScyŽŸ•‡zs›p‚¸ÛóÿðÇr‡p“ÍüŠÿí¯u‡p qu}Œ˜š‰q^SSÿ )SScyŽŸ”‡zsp“ÏÿŸxˆp¯ó‹ÿLJ‡p qu}Œ˜™‰q^SSÿ )SSbxž“†zspx™ÉŽÿÕ›ˆp—Ï‹ÿÙ¢‡p qu}‹—˜ˆp]SSÿ )SSbw“†zsqp|™ÏóŒÿ󿇇p€©÷ý‰ÿ뽇p qu}‹–˜‡o]SSÿ )SSbwŒœ“†zsŸqy”Ø÷Œÿ߬t‡qŒß÷‰ÿùÔxr…q ru}‹–—†o]SSÿ )SSbw‹œ’†zs¡q«ßŒÿ÷Ó€t†q€¯ëŠÿãx…q ru}Š•–†o]SSÿ )SSbvŠš‘…zs‰q‚™±ÃÕ€ÛÉ·¢ˆvˆq°ä‹ÿý诀†qw‹âŠÿïÀ„…q ru}‰”•…n]SSÿ )SSbu‰™…zs†qt„¨¿Óãïû€ÿóçÙǯv‡qˆ´ïûŠÿ÷ß’t…qrxÑ÷‰ÿù玅q ru|‰“”„n]SSÿ )SSau‰˜„ys…qzޱçùˆÿí×}t†q†ÇñŒÿ«€‡q·ç‹ÿšu„q ru|ˆ’“„n\SSÿ )SSau‰˜„zt…r•Ðÿç¡}†ruߌÿϘ‡r•Ћÿ¬„r sv|ˆ’“„m\SSÿ )SSatˆ—Ž„ztƒrz•Òóÿù穃†ru°á‹ÿó¶z†rz¾‹ÿ½„r sv|ˆ‘’ƒm\SSÿ )SSat‡–Žƒzt‚ry•ÐóÿÛ¨}†r‰Äù‹ÿÏ”‡r¬íŠÿÕ„r sv|‡‘‘‚m\SSÿ )SSas†•ƒzt‚r‹»“ÿј‡r¦ä‹ÿå´‡r›ÒŠÿí¬„r sv|‡l\SSÿ )SSas†•Œƒzt‚r©ç“ÿïćr‰¸‹ÿ÷χr‰¸‹ÿ¸„r sv|†l\SSÿ )SS`s…”ŒƒztrŒÆù“ÿûÞ•z…rw˜çù‰ÿýÞ‰w…r}¦‹ÿÊŒƒr sv|†l\SSÿ )SS`r…“Œ‚ztr§Ü•ÿí¹„†r„¹íŠÿ뱂…rv™÷ý‰ÿÔ›ƒr sv|†ŽŽ€k\SSÿ )SS`r„’‹‚yts¿ë•ÿõØŒ†sxŠÜû‰ÿö܆sçù‰ÿܧ„s u{…Žk\SSÿ )SS`rƒ’‹‚ytsÐ÷•ÿûï’ˆsÄï‹ÿ–†sŠÑó‰ÿ蹄s u{…k\SSÿ )SS_qƒ‘ŠytsÙý•ÿþû•ˆs¡×‹ÿ§~…s­ê‰ÿ蹄s v{„ŒŒj[SSÿ )SS_qƒ‰yusܘÿ–ˆs„Ä‹ÿ¸Š…sxŠá‰ÿóʃs tv{„ŒŒ~j[SSÿ )SS_p‚‰yusÙý•ÿþû•‰s³öŠÿÊ–‡sÜŠÿ܃s tv{„‹‹}j[SSÿ )SS_p‰yutÐ÷•ÿûï’‰t¢ÜŠÿÜ¢‡tÜŠÿÜ„t v{„‹Š}j[SSÿ )SS_p€Žˆ€yut¿ë•ÿõ؉tŠÿö³‡tÊó‰ÿä–|‚t v{ƒŠ‰|j[SSÿ )SS_o€‡€yut¨Ü•ÿí¹…‰tƒ­‹ÿ¹‡t¿ë‰ÿ碂t v{‚‰‰|i[SSÿ )SS_o€Œ†€yutÆù“ÿûß–|‰tyžûþ‰ÿ½y†t³ä‰ÿé©‚t v{‚ˆˆ{i[SSÿ )SS_oŒ†€yu‚tªç“ÿïÅŒt’ïû‰ÿÈŠ†t¡Ø‰ÿïÀ‡‚t v{‚ˆ‡{i[SSÿ )SS_n~‹†yuut¼“ÿÒ™ŒtØõ‰ÿΔ†tšÒ‰ÿòÌŠt uw{‡‡zh[SSÿ )SS^n~Š…yv‚u|—Ñóÿܪ€ŒuˆÁï‰ÿØ¢†u—щÿóÑŒ‚u w{‡†zhZSSÿ )SS^m}‰„~yvƒu}—Óóÿù諆uƒ®ê‰ÿⱆu—щÿóÑŒ‚u wz€†…ygZSSÿ )SS^m}‰„~yv…u—Ñÿ裀Žu€£è‰ÿ躆u—щÿóÑŒ‚u wz€†…ygZSSÿ )SS^m|ˆƒ~yv…u}‘´çùˆÿíÅš€wŽu€£è‰ÿ躆u—щÿóÑŒ‚u wz€…„xgZSSÿ )SS^l{‡ƒ}yv†uyˆ«ÁÔâèù€ÿîäÚɲ”{u€£è‰ÿ躆u—щÿóÑŒ‚u wz„ƒwgZSSÿ )ST^ly„}yŠv†±»Ô€Üô¥Œ{’v~—ˉÜË©†vº‰ÜÔ»‡‚v wzƒ‚wgZSSÿ )TXaku~~|zxÛv wzƒ‚wfZSSÿ )TX`jt|}|zxÛv wz~‚vfZSSÿ )TX`jsz||zxwÚv wz~‚€ufZSSÿ )TX`iqx{|{yx€wÖv wxz~€ueYSSÿ )TX_govz||{z€yÖw xz|ueYSSÿ)SV\dkrwzƒ|~Õ ~~€~teYSSÿ +UUZ`fmrwz€{||€Õ€~sdYSSÿ .ZUW\aflquww€x|Ú}zrbWSSÿ 4cVUW[`eilopqÜrZ€Sÿ 1b^WVX[_cf‚heÜdW€Sÿ H_[WTVXZ[‚\ZÜYT€Sÿ $NYXëSÿ‚KYXUéSÿ‚éÿù‚ÿ€ ï„ÿ) ï„ÿj^)& í…ÿ†„cWJ=1)%ë$?†ÿ™™‹~nUPKìI†ÿ™™¦¨•UUMJëIÿÿÿýÿýÿýÿýÿýÿÌœ<ž¤ã©¨¦¤¡u€¿…ÿ±3*‚¢¦ã©¨¦¥ c€ÏƒÿÌ.!0 ¤§ç©¦£x€?ƒÿ !Fƒ¤¦¨«­°³¶Þ· ±®¬ª§¥˜u?Ïÿ W¢§¨«®³¼ÄÉÞË Á¸±­ª¨¥ ($?ì€ÿ  V¥©«®´½ÌÖÜÞß ÓÆº±­ª§¤)A/Ú€ÿ U§©¬³½ÏÛãèÞî áÕȸ°«¨§) ))Ú€ÿT¨©¯»ÊÚâèëîçÙåéîîçßÔŶ­¨¨*ÿ T©©³ÄÖåççäßÜÙÛÝáççæàѽ°©©* ÿ T©©·ÊÞíèâÚÐÛÑÓÝäêèÙò©©*ÿ T©©·ÊÞíçÝÔÏËÙÊ ÌÑ×áéèÙò©©*ÿ T©©·ÊÞíåÜÒÍÚÊ ÌÏÕàèèÙò©©*ÿ T©©·ÊÝìåÛÒÌËÊ¿ËÊ»»ÆÊË ÌÎÔßççÙò©©*ÿ T©©·ÊÝìäÛÒÌÁËǸ««¿ÈË ÌÎÔÞççØÃ²©©*ÿ T©©·ÊÝìäÛÒÍÁËÁ³©©ºÅË ÌÎÔÞççØÃ²©©*ÿ T©©·ÊÝìäÛÒÍ¿ËÊɵ¹Äĵ½ÉË ÌÎÔÞççØÃ²©©*ÿ T©©¶ÉÜëäÚÒÍ¿ËÉŪ¿ÝÞ²´ÆË ÌÎÔÞææØÂ²©©*ÿ T©©¶ÉÜëãÚÒÍËуÓÒÐÏÎ¯Ë Êǽ¨Æëë´°ÁÊÊË ÌÎÔÝææØÂ²©©*ÿ T©©¶ÉÜëãÚÒÍËå‚îìèßÜ×¯Ë Êñ´Ïèåµ¹ÊÊË ÌÎÔÝææØÂ²©©*ÿ T©©¶ÉÜëãÚÒÍËîƒú ù÷öõòòëååÞÚÔ§Ë È½¥ÄÓÖÔл®ÆÉË ÌÎÔÝææØÂ²©©*ÿ T©©¶ÉÜêãÚÒÍËò‰ÿ úööòïëåàÚÕÐÌ¡Ë Æ¹ ÓÙÍÌÝ©ÂÈË ÌÎÔÝååײ©©*ÿ T©©¶ÉÛêãÚÒÍËòÿøïçàÚÕÒÍË Êµ§ÛÛÊÊâɬºÆÊŒË ÌÎÓÝååײ©©*ÿ T©©¶ÉÛêãÚÑÍËò•ÿöèÖÍœË Éº±ÂÖÔÌÌØÏ¼¬ÁÊŒË ÌÎÓÝååײ©©*ÿ T©©¶ÉÛêâÙÑÍËò•ÿüùôïçÜÏÌ˜Ë Å±¯ÜÕÐÌÌÏ×Í ºÇŒË ÌÎÓÜååײ©©*ÿ T©©¶ÈÛéâÙÑÍËò˜ÿü÷ðèá×Ï”ËÊʾ¯´çÕÏ€ÎÚÕ£µÂÊ‹Ë ÌÎÓÜääÖÁ²©©*ÿ T©©¶ÈÚéâÙÑÍËòœÿøëÝÕÏÌ‘ËÊȶ²ÀåÕÏ€ÐÙ×µ±¼É‹Ë ÌÎÓÜääÖÁ²©©*ÿ T©©¶ÈÚéâÙÑÍËòžÿüóÝБËÉŬ¼ÕØÒÑÓÖÖ¯´Æ‹Ë ÌÎÓÜääÖÁ²©©*ÿ T©©¶ÈÚéâÙÒÍÌ€ËòžÿþüöïåØÎËʯ©§…¦¥¤œ¿àÒÒÑÒ×㯡¤‡¦ª³ÈËÌÎÓÜääÖÁ²©©*ÿ T©©¶ÈÚèâÚÒÍÌò¡ÿ üöîã×ÎÌÌÈ»¡ÁÊ…ÈÇÇÆÕàуÒÖäÏÈdžÈÊ»±ÃÉÌÎÔÝäãÖÁ²©©*ÿ T©©¶ÈÚèáÙÒÍÌò¤ÿ øêÚÓÍŶœÙîï†íìäÚÒƒÓÕÝè†íîïíͲ¾ÈÌÎÔÜããÖÁ±©©*ÿ T©©µÈÚèáÙÒÍÌò¦ÿ ùèÓÄ´œ¸Í×ÕÔÔ‚ÓÔ„Õ€ÔƒÓ€ÔÕØÆ°¦»ÇÌÎÔÜããÖÁ±©©*ÿ T©©µÇÙèáÙÒÍÌß‚åèòòøÿýùðÚ¾£¢®Â€Ö—ÕÖÖÏ»¨¢«¿ÈÌÎÔÜããÕÀ±©©*ÿ T©©µÇÙçáÙÑÍÌÒ‚Ô ÖÝÝáååëðõùý˜ÿ üïÚÀ¦¡ª¿ÏÖ×דÖרÕɸ¤Ÿ§µÅÊÌÎÓÜãâÕÀ±©©*ÿ T©©µÇÙçáÙÑÍÌ ÕÜãêðô÷ùüþ”ÿ ýõãÁ©ž¢¼ÌÕÙØ‘רØÔȳ ›§´ÁÉËÌÎÓÜãâÕÀ±©©*ÿ T©©µÇÙçáÙÑÍ’ÌÔßèôü•ÿ þûìÌ©–²ÊÝÚÙØ ÙÛÖÄ©››«¸ÃÉ€Ì ÎÓÜãâÕÀ±©©*ÿ T©©µÇÙçáÙÑÍ’ÌÎÐÓÖÞèòû’ÿ þþùíØµ¢Ÿª½ÓÛÛÚ‹Ù ÚÛÛÌ·£¢®½ÄÉË€Ì ÎÓÜãâÕÀ±©©*ÿ T©©µÇÙæàØÑÍ–ÌÐÖÝãëóüþÿ þûòÜÁªž¥¹ÌØÜŠÚ ÛÚׯ²¢œ¥±¾ÇÊËÌ ÎÓÛââÔÀ±©©*ÿ T©©µÇØæàØÑÍšÌÔáíõúýÿ þýùåǪ› ¶ÏÝŠÛ ÜØÊ¬ž¦µÀÇËË‚Ì ÎÓÛâáÔÀ±©©*ÿ T©©µÇØæàØÑÍÌÝîú’ÿûíÒ©š¥¾ßŠÜÝÔ´ªºÄÊ…Ì ÎÓÛâáÔÀ±©©*ÿ T©©µÇØæàØÑÍÌÐÔÚåòúÿþùíÕª´ÑâÞ‰ÜÝÚ˧¨¹ÆÉË…Ì ÎÓÛâáÔÀ±©©*ÿ T©©µÇØåߨÑÍŸÌÎÔÝèôÿþøé¯½ßâߊÞßÞ¬¬¿ËË†Ì ÎÓÚááÔÀ±©©*ÿ T©©µÆØåߨÑÍ¢ÌÔâóùüŒÿþùé°Äèà‹ßâ걬¿ËË†Ì ÎÓÚáàÓÀ±©©*ÿ T©©µÆ×åߨÑÍ£ÌÍÒçöŒÿþõÚ¶Íìƒàáââá‚àãﻯ¹ËË†Ì ÎÓÚáàÓÀ±©©*ÿ T©©µÆ×åߨÑÍÍ€ÌßåäáÛÙÖ˜ÌÍÎÓÝëúý‰ÿýìÀ¿ÖéààááâäÚÎÊÞãâáààãìË´°ÉË…Ì ÍÏÓÚáàÓ¿±©©*ÿ T©©µÆ×äÞØÑÎÍ ìöõôïîìææãßÛÖÑ”ÍÑÙåôüˆÿúã¬ËßçááâããÓ¾®«ÄØããâáãéÚ»©ÅË†Í ÏÓÚààÓ¿±©©*ÿ T©©µÆ×äÞØÑÎÍò…ÿúôîèߨÖÓÐ’ÍÐãñú‡ÿ÷Ü¡ÖçåãäãßÕ¸¢––¥¿×âäããæçæÀÉ†Í ÏÓÚàßÓ¿±©©*ÿ T©©µÆ×äÞØÑÎÍòŠÿüôçÚГÍÛî‡ÿôפàìåæèâÏ¨ššŸŸ˜œ±Üåçååð̪¼È†Í ÏÓÚàßÓ¿±©©*ÿ T©©µÆ×äÞØÑÎÍòŠÿþüùõðåÜÓÍÐØæø„ÿýæÈ´âìçéÚÁ­«¦¬´´¨ŸžªÇÝéçîÕ·°ÄÌ…Í ÏÓÚàßÓ¿±©©*ÿ T©©µÅÖãÞ×ÑÎÍòŽÿüöðèàØÏŽÍÏÕèöƒÿúÙ½ÊçìâÑ»°±ÃÅÄÃù¬ ™«ÀÕèîßĦ¿Ê…Í ÏÓÚàßÒ¿±©©*ÿ T©©µÅÖãÝ×ÑÎÍò‘ÿüöêÜÕÑŽÍÖç÷ýþ€ÿöζãëãα§³ÊàæÜÎËÆ¼®ž›¤·×çèÒ ºÈ…Í ÏÓÙßÞÒ¿±©©*ÿ T©©µÅÖãÝ×ÑÎÍò”ÿúîÝÍÒàùý€ÿóÅ´ýêÆ¦·ÏäõûîÙÍÌÈ¿³¡›¤Ôðæ£¸Æ…Í ÏÓÙßÞÒ¿±©©*ÿ T©©µÅÖãÝ×ÑÎÍò”ÿýúõîÛÑŒÍ$ÎÒÛòüÿÿïŤ´¯ª¬¼ÓæôûþúíÐÍËȳ¦š©±¯Ÿ´Ä…Í ÏÓÙßÞÒ¿±©©*ÿ T©©µÅÕâÝ×ÑÎÍò–ÿþüïäÚÏŒÍ"ÏàðüÿðÑ´¬­µÃØéõüþþÿøåÓÌËʶ© œš›¡µÄ…Í ÏÓÙßÞÑ¿±©©*ÿ T©©µÅÕâÝ×ÑÎÍò™ÿøìÛÓÏ‹Í ÏàôÿõäÒÇÊÓàîøýÿýúÞÑÍÍÊÄ»¯¦¡¢«¼Ç…Í ÏÓÙÞÝÑ¿±©©*ÿ T©©µÅÕâÜ×ÑÎÍòšÿýùäÕŒÍ Òáÿûôíéêïöüþ„ÿòÝ€ÍÌÉý»»¿ÆË…Í ÏÓÙÞÝÑ¿±©©*ÿ T©©µÅÕâÜÖÑÎÍòšÿþýøêÙ‹Í ÎÕæ÷üúùùûüþþ„ÿ ûêÖÍÍÌÌÊÉÈÈÉËÌ…Í ÏÒØÞÝÑ¿±©©*ÿ T©©µÅÕáÜÖÑÎÍòÿøìÝÑŠÍÏÕèöŒÿõãÍ ÏÒØÞÝÑ¿±©©*ÿ T©©´ÄÔáÜÖÑÎÍìö÷ùúüý˜ÿûòÞÓ‹ÍÖêû‹ÿüðÔÎŽÍ ÏÒØÞÜо°©©*ÿ T©©´ÄÔáÜÖÑÎÍÙÞàéìóúšÿúåЋÍÝòŒÿùéÔŽÍ ÏÒØÞÜо°©©*ÿ T©©´ÄÔàÛÖÑÎÍ ÐÒÒÔÕ×ÚÞäìôúý”ÿýöéÙЉÍÑßúýŠÿýùÛÏÍ ÏÒØÝÜо°©©*ÿ T©©´ÄÔàÛÖщÎÐÔÚßãéñù“ÿýøîÜÒ‰ÎÔæøŒÿêØÎ ÏÓØÝÜо°©©*ÿ T©©´ÄÔàÛÖÒÏÎÔÞêôøü“ÿìÜщÎÑíú‹ÿøäьΠÐÓØÝÜо°©©*ÿ T©©´ÄÔàÛÖÒÏÎÏÓãô”ÿîÚŠÎÚîŒÿîڌΠÐÓØÝÜо°©©*ÿ T©©´ÃÓßÛÖÒÏÎÏÓÙâîú‘ÿøêщÎÑäø‹ÿøéŒÎ ÐÓØÜÛϽ°©©*ÿ T©©´ÃÓßÛÖÑÏ’ÎÏÓÛåîöÿýöæÕψÎØê‹ÿýñÓÏŠÎ ÏÒØÜÛϽ°©©*ÿ T©©´ÃÓßÛÕÑÏ•ÎÐÚçõûþÿýúâÔˆÎÏÛùýŠÿ÷ßÒŠÎ ÏÒ×ÜÛϽ°©©*ÿ T©©´ÃÓßÚÕÑÏ—ÎÐÙñüÿóÞ‰ÎÔéùŠÿüô׊ΠÏÒ×ÜÛϽ°©©*ÿ T©©´ÃÒÞÚÕÑϘÎÐÙéøŽÿüðàˆÎÏÔñü‰ÿþüß҉ΠÏÒ×ÛÚϽ°©©*ÿ T©©´ÃÒÞÚÕÑÏ™ÎÏØæ÷ýÿûïÙЈÎæö‹ÿìډΠÏÒ×ÛÚν°©©*ÿ T©©´ÂÒÞÚÕÑÏ›ÎÔæòúÿùêÖˆÎÚîýŠÿøãЈΠÏÒ×ÛÚν°©©*ÿ T©©³ÂÒÞÚÕÑÏÎÚîÿÞЈÎãú‹ÿìֈΠÏÒ×ÛÚμ°©©*ÿ T©©³ÂÑÝÙÕÑÏÎÑÜìŽÿð܈ÎÛî‹ÿò߈ΠÏÒÖÚÙμ°©©*ÿ T©©³ÂÑÝÙÕÑÏžÎÒÜîúŒÿúéÖ‡ÎÓáüþ‰ÿøèˆÎ ÏÒÖÚÙμ°©©*ÿ T©©³ÂÑÝÙÕÑÏŸÎÑÚñüŒÿôâχÎ×óü‰ÿüðЇΠÏÒÖÚÙμ°©©*ÿ T©©³ÂÑÝÙÕÑÏ¡ÎâôŒÿüïÓφÎÓäøŠÿõÙІΠÏÒÖÚÙμ°©©*ÿ T©©³ÂÑÜÙÕÑωÎÔÝäêð€òìæà×ЈÎÓäö‹ÿþ÷äÔ†ÎÑØõŠÿùéՆΠÏÒÖÚØÍ¼°©©*ÿ T©©³ÂÐÜÙÕчÏÐÕáéðõùý€ÿú÷òìäÙЇÏ×åùýŠÿüôÚІÏÑïü‰ÿý÷Ù‡Ï ÒÖÚØÍ¼°©©*ÿ T©©³ÂÐÜÙÕцÏÒØäöüˆÿøêÛÓІÏÖìúŒÿâÔ‡Ïæö‹ÿÝÐ†Ï ÒÖÚØÍ¼°©©*ÿ T©©³ÂÐÜÙÕцÏÛïÿ÷ßÓ†ÏÐÔôŒÿï܇ÏÛï‹ÿãÔ†Ï ÒÖÚØÍ¼°©©*ÿ T©©³ÂÐÛØÔÑ„ÏÒÛðûÿý÷âÕ†ÏÐäô‹ÿûæÑ†ÏÒé‹ÿèØ†Ï ÒÕÙ×ͼ°©©*ÿ T©©³ÁÐÛØÔуÏÑÛïûÿóáÓ†ÏÖëý‹ÿïÛ‡ÏãùŠÿðÝ†Ï ÒÕÙ×̼°©©*ÿ T©©³ÁÏÛØÔуÏ×è“ÿï܇Ïáö‹ÿöæ‡ÏÝðŠÿøâ†Ï ÒÕÙ×̼°©©*ÿ T©©³ÁÏÛØÔуÏáö“ÿùê‡Ï×ç‹ÿüï‡Ï×ç‹ÿç†Ï ÒÕÙ×̼°©©*ÿ T©©³ÁÏÚ×ÔÑ‚ÏØëü“ÿýóÛÒ…ÏÑÛöü‰ÿþô×Ñ…ÏÒà‹ÿíØ…Ï ÒÕØÖ̼°©©*ÿ T©©³ÁÏÚ×ÔÑ‚Ïáó•ÿùçÕ†ÏÕçùŠÿøäÔ…ÏÐÜüþ‰ÿðÜ…Ï ÒÕØÖÌ»¯©©*ÿ T©©²ÀÏÚ×ÔÑ‚Ïéø•ÿûñ׆ÏÑ×óý‰ÿüó؆ÏÙ÷ý‰ÿòà…Ï ÒÕØÖË»¯©©*ÿ T©©²ÀÎÚ×ÔÑ‚Ïïü•ÿýúÙˆÏêù‹ÿÛ†Ï×ïû‰ÿ÷ç…Ï ÒÕØÖË»¯©©*ÿ T©©²ÀÎÙÖÔÑ‚Ïòþ•ÿþýÚˆÏÞñ‹ÿáÓ…ÏÔãø‰ÿ÷ç…Ï ÒÕ×ÕË»¯©©*ÿ T©©²ÀÎÙÖÓЂÏó˜ÿÛˆÏÕë‹ÿç×…ÏÑ×õ‰ÿûí…Ï ÑÔ×ÕË»¯©©*ÿ T©©²ÀÎÙÖÓЂÏòþ•ÿþýÚ‰ÏåüŠÿìÚ‡ÏóŠÿó…Ï ÑÔ×ÕË»¯©©*ÿ T©©²ÀÎÙÖÓЂÏïü•ÿýúÙ‰ÏßóŠÿó߇ÏóŠÿó…Ï ÑÔ×ÕË»¯©©*ÿ T©©²ÀÍØÖÓÑ‚Ïéø•ÿûñ؉ÏÙêŠÿüå‡Ïíú‰ÿöÛÒ‚Ï ÐÑÔÖÔÊ»¯©©*ÿ T©©²ÀÍØÕÓÑ‚Ðáó•ÿùçÕ‰ÐÕã‹ÿç‡Ðéø‰ÿ÷àԃРÒÔÖÔÊ»¯©©*ÿ T©©²ÀÍØÕÓÑ‚ÐÙìü“ÿýôÜÓ‰ÐÑÞýþ‰ÿèцÐåõ‰ÿ÷âԃРÒÔÖÔÊ»¯©©*ÿ T©©²ÀÍØÕÓуÐâö“ÿùëŒÐÚúý‰ÿì׆Ðßò‰ÿùêփРÒÔÖÔÊ»¯©©*ÿ T©©²ÀÍ×ÕÓуÐØè“ÿïÜŒÐØñû‰ÿîÚ†ÐÜð‰ÿúí׃РÒÔÖÓÊ»¯©©*ÿ T©©²¿Ì×ÕÓуÐÒÛïûÿóâÓŒÐÖêù‰ÿò߆ÐÜï‰ÿûï׃РÒÓÕÓɺ¯©©*ÿ T©©²¿Ì×ÔÒÑ„ÐÓÜðûÿý÷âÖÐÔãø‰ÿõä†ÐÜï‰ÿûï׃РÑÓÕÓɺ¯©©*ÿT©©²¿Ì×ÔÒ‡ÐÜïÿ÷àÔŽÐÔà÷‰ÿ÷ç†ÐÜï‰ÿûï׃РÑÓÕÓɺ¯©©*ÿT©©²¿ÌÖÔÒ‡ÐÓÙåöüˆÿøëÜÔÑŽÐÔà÷‰ÿ÷ç†ÐÜï‰ÿûï׃РÑÓÕÒɺ¯©©*ÿT©©²¿ÌÖÔÒˆÐÑÖâéðõ÷ý€ÿùõòìäÚÑÐÔà÷‰ÿ÷ç†ÐÜï‰ÿûï׃РÑÓÕÒɺ¯©©*ÿT©ª²¾ËÔÓÒ‹ÐÕÝäçð€óêåà×Ñ’ÐÓÜí‰óíá†ÐÙç‰óðçՃРÑÓÕÒɺ¯©©*ÿTª­µ¾ÇÏÑÑÞÐ ÑÓÕÒɺ¯©©*ÿTª­´¾ÇÎÐÑÞÐ ÑÒÔÒȹ¯©©*ÿTª®µ½ÆÍÏßÐ ÑÒÔÑȹ¯©©*ÿTª­µ¼ÄËÎßÐ ÑÒÔÑȹ¯©©*ÿTª­³»ÂÉÍЃÑ×Ð ÑÒÒÔÑȹ¯©©*ÿ T©¬±¸¿ÅÊÎЂÑÒÕÓÒÓÑȹ¯©©*ÿ T¨¨®´ºÀÆËÍ‚ÏÒÕÔ‚ÓÐǹ¯©©*ÿ U¨¤ª°µ»ÀÅÈÊËÏÚÐÎÇ·­©©*ÿ W«¤§¬°µ¹½ÀÃĀůÜǰ€©*ÿ U©¨¦©­±´·º‚½ºÜ¹­€©*ÿ :¨§¨©¬®¯°‚²Ý¯ª€©*ÿGŒ¡§¦€¨ç©*ÿ‚=‹¥€¦¨ç©*ÿ‚")è* ÿù‚ÿ€ ï„ÿ) ï„ÿj^)& í…ÿ†„cWJ=1)%ë$?†ÿ™™‹~nUPKìI†ÿ™™¦¨•UUMJëIÿÿÿýÿýÿýÿýÿýÿÌœILãONMLJ6€¿…ÿ±3LMOSX]chÞk `ZURNMF6 ?Ïÿ ,KNOTZcuƒŒÞ }m`WROMJ$?ì€ÿ  *MOSZev‘¤°Þµ ž†p`WQNLA/Ú€ÿ (NOWcv–®½ÇÞÓ º¤‹l^TNN ))Ú€ÿ'NO[rŽ«½ÈÎÓ¿Ù¹ÅÒÒĵ¡„hWNNÿ 'OOcƒ¥ÂÃÀ·§Ù𠬽Á¸›v\OO ÿ 'OOj޳Я—y{Ù|{„¡·ÇÇ©aOOÿ 'OOjŽ²Ð¾¢†uiÙf mzŒ­ÄÆ©aOOÿ 'OOjŽ²Ï¹œ€ogeØf ju†§ÁÅ©€aOOÿ 'OOj²Î·š~lge¿fe^WWaef is„¥¿Å¨€aOOÿ 'OOj±Í¶™}lgÀfdVII]ef ir„¤¾Ä§€aOOÿ 'OOj°Íµ™~mhÀgaVLL\dg jr„£½Ã§€aOOÿ 'OOiŒ°Ìµ˜}mh¾gffSe~~\[fg jrƒ£½Â§`OOÿ 'OOiŒ¯Ëµ˜}mh¾gfdEt­­YQeg jrƒ¢¼Â¦`OOÿ 'OOiŒ¯Ë´˜}mh€gz‚€|usp°ge_F€ÂÀ^Oag jrƒ¢¼Á¦`OOÿ 'OOiŒ¯Ë´˜~ni€h³‚ÍÈ»¢š°hbSb‰§Ÿu_[h ks„¢¼Á¦`OOÿ 'OOi‹®Ê³˜~ni€hÏ‚ò ñîçåâÙÙÆ³³ “„§h f]D„rjŠmMfgh ks„¢»Á¥~`OOÿ 'OOi‹­É³˜~ni€hÙ‰ÿ òææØÐÆ³§–…yl¡h fZ=˜‡VRšxGdgh ks„¢ºÀ¤~`OOÿ 'OOiŠ­È³—~nj€iÙÿìÓ¹§”ˆ}qkœi hcXJžƒLL˜~P]ehŒi ks„¡º¿¤~`OOÿ 'OOhŠ­È²—~oj€iÙ•ÿ漊qœi hZY}ƒkQQxqMahŒi lt„¡¹¿¤}`OOÿ 'OOhŠ¬Ç²—~oj€iÙ•ÿøîáÒ¹šul˜i fOU§t[SSZ‚Œ:ZgŒi lt„¡¹¾£}`OOÿ 'OOh‰«Æ±—~oj€iÙ˜ÿøéÔ¼©Žu–iaO\¯l€VS~‘BWdŒi lt„ ¸½¢}`OOÿ 'OOh‰ªÄ°–~ok€jÙœÿìÇŸ‡wn‘jiiXZn™fVXXUs†bW^i‹j lt„ ·¼¢}_OOÿ 'OOg‰ªÄ¯–~ok€jÙžÿöÞŸz‘jigKmŽm]Y[[X^r™WTg‹j lt„Ÿ¶»¢|_OOÿ 'OOgˆ©Ã¯–~ok€jÙžÿüöçÑ´ŽsjiaLC?>…=<3n˜][[\\[[n§T:<…=>?DPhiltƒŸ¶º¡|_OOÿ 'OOgˆ©Â¯–~pk€jÙ¡ÿöæÍ®‹pjjh[;sƒ€€…~ŒŠY[€]\Zh˜‡€…€ƒhRfimtƒŸµº |_OOÿ 'OOgˆ¨Á®–pl€kÚ¤ÿ ìÁ”pgY7–µ´³…²³–r[]€^]\bz¤†²³´´„Xdimu„Ÿ´¹ |_OOÿ 'OOgˆ¨Á®–pl€kÚ¦ÿ î¼gZ?KV\ZYƒXYY[\__`_^\ZY„XYZ\QGIcimu„Ÿ´¸ |_OOÿ 'OOg‡§Á®•~pl€k¢‚´¾ÚÚìÿ úîÕ¤qQEGQ_`_ƒ^__`…a`_„^`_ZKCIVdimtƒž´¸Ÿ{_OOÿ 'OOg‡§À­•~pl€k}‚„ Š©µµÇÖâîú˜ÿ øÛ²ŠZHIP\bcb‚a‰babbcaXMFIS`gjnuƒž´¸Ÿ{_OOÿ 'OOg†§¿­•qmŒl ‡œ®ÁÔàèî÷ü”ÿ ýðÌcKCQ\ced‘cddbYLEKV_fjknu„ž³·žz_OOÿ 'OOg†¦¿­•qm‘l„¥½áö•ÿ þûå£aM?I[igfefhdWBDP[bgjllnu„ž³¶žz_OOÿ 'OOg†¥¾¬•qn‘lr{Š¡¾Ûö’ÿ þþ÷ã»zXGEQbggf hg\MBJS]eik€l ov„²¶z_OOÿ 'OOf…¥½«”rn•my‹ž°ÆÞ÷ýÿ þûëÀ”gGDO\eŒh geWLEHV_fkll€m ov„±µz^OOÿ 'OOf…¤¼ª”rn™m…©Îãòüÿ þýùÕžiIAObj‹ig`GBJYagkƒm ov„œ°´œy^OOÿ 'OOf…¤¼ª”rnœmÎó’ÿûã³eIN`Œjg]HL[dil„m ov„œ°´œy^OOÿ 'OOf„£»ª”rnœmy†˜¶Úóÿþ÷ã½b`|ynŠko}PQdjl…m ov„œ¯³›y^OOÿ 'OOe„¢º©”rožnt†ž¾àÿþ÷åeiwnl‡mllv—QOgmm…n pv„œ¯²›x^OOÿ 'OOeƒ¢¹©“so¡n†®ÞíùŒÿþøäco™om‚noonmmz¦SNf‡n pwƒ›®²šx^OOÿ 'OOeƒ¡¹¨“so¢nr~ºçŒÿþïÅhx˜mno€pqrrqpnz¤`R_‡n pwƒ›®±šx^OOÿ 'OOeƒ¡¸§“so€n¤¶³ª˜’‰˜norŸÆóü‰ÿýߎq€Žnppqrtka]osqppox•sZTm†n pwƒš­°™x^OOÿ 'OOeƒ ¸§“sp€o ÉçäÞÒÏÉ··¯¢–Š{”o{“·á÷ˆÿúÐ`|ˆ„pq€sfWLJZissrqv‡†bJkn…o qw„š­°™x^OOÿ 'OOe‚ ·§“sp€oÛ…ÿ óà쥑‹‚yror{±Ùó‡ÿöÃC‡Ž|rttpgRGCCGWitutu{•kDhm…o qw„š¬°˜w^OOÿ 'OOe‚Ÿ·§“€tq€pÛŠÿ÷ß»—|“p—χÿñ»@‘‘uuxscBDNWWJAIovwurŸvHfm…p rx„š¬¯˜w^OOÿ 'OOd‚Ÿ¶¦’€tq€pÛŠÿý÷îåÕ¸œpy·í„ÿýÔ–VŒwzlWRt^]ccZOFC[oyu–~ZUho„p rx„™«®˜w]OOÿ 'OOdŸµ¦’€tq€pÛŽÿùçÕ¿§wŽpu‡½çƒÿú»zr‰sfR_‚¯˜}kke\PBHVhw†jHdn„p rx„™«®—v]OOÿ 'OOdž´¥’€tq€pÛ‘ÿùç܇{ŽpŠ»éûþ€ÿö¥d}cLU‰ÃàÖ¦xolg_TDBOiƒŽ{?`m„p rx„™ª­–v]OOÿ 'OOd´¥’€ur€qÛ”ÿóÏŸq€§ïû€ÿó’S°‹`BC ÏäõûÏ”qqojcYG:=m–“<^m„q sx„™ª¬–v]OOÿ 'OOd€³¤‘€ur€qÛ”ÿüóäÏš|Œq$t›Ýùÿÿï“BSJWv¦ÍæôûþóÌ|spnkcXLAEMM:\l„q sx„˜©«–u]OOÿ 'OOd€œ²£‘€ur€qÛ–ÿý÷Ó´–xrŠq#rx§×ùÿð¹ƒxz°Øéõüþþÿí·‚qpoke\PHDEJal„q sx„˜¨«•u]OOÿ 'OOdœ±£‘€ur€qÛ™ÿíË›„w‹q yªáÿõäÒÇÊÓàîøýÿüó£}qqpmga\YY_hn„q sx„˜¨ª”u]OOÿ 'OOd›±¢‘€urÛšÿûï´‰Œr ¬ÿûôíéêïöüþ„ÿÛ¡€rqpmjhhknq„r sx„—§©”u]OOÿ 'OOdš°¢urÛšÿþûìÄ”‹r u‰¸ìüúùùûüþþ„ÿ öÄŒrrqqppoopqq„r syƒ—§©“u]OOÿ 'OOc~š¯¢vs€rÛÿëÉ¡}Šrw‰¾çŒÿã²r tyƒ–¦¨“t\OOÿ 'OOc~š¯¡vs€rÊçéïò÷ü˜ÿöÛ£ƒuŠrŒÄö‹ÿù×…wr tyƒ–¦¨“t\OOÿ 'OOc~𝡀vs•¡¨ÀÌàóšÿó¸~‹s¢ÜŒÿïÀ†s ty„–¦¨“t\OOÿ 'OOc~™® €vs {~€†‰Ž•¡²Êâóü”ÿüçÄ•{‰s~¤óüŠÿûïšxŒs tz„–¥§’t\OOÿ 'OOc}˜­ €wt†su{†–¦±ÂØí“ÿûíЛ‰s„¹íŒÿÄ’Œs uz„–¤¦‘s\OOÿ 'OOc}—¬ €wt„¢Ãàë÷“ÿÊœ|ˆtvÍó‹ÿí³|‹t uz„•¤¥‘s\OOÿ 'OOb}—¬Ÿ€wtwƒ°ß”ÿЖŠt–ÐŒÿЖ‹t uz„•£¥‘s\OOÿ 'OOb|—«Ÿ€wtwƒ”­Ïó‘ÿíÄvˆt|³í‹ÿíÁ‹t uz„•£¤r\OOÿ 'OOb|–ªž€wu‘txƒš·Ðçÿû繋xˆt“Å‹ÿûÚƒx‰t vz„”¢£r\OOÿ 'OOb{•©Žx•u}—»äõýÿü󮆈uzœïûŠÿ覉u v{„”¡£Žr\OOÿ 'OOb{”©Žx—u|“Ø÷ÿÜ£‰uˆÁïŠÿ÷à‰u v{„“¡¢Žr\OOÿ 'OOa{”¨œŽ€x—uv|–ÃíŽÿöÖ¨ˆuyˆØù‰ÿý÷¦€ˆu vzƒ“ ¡Žq[OOÿ 'OOaz”§œŽ€xv˜u{”ºèùÿóÒ“}ˆu¹ç‹ÿË—ˆu w{ƒ“ ¡q[OOÿ 'OOaz“¦›Žy›v‡»ÜóÿðÅŒw‡v—ÏüŠÿî³{‡v w{„“Ÿ q[OOÿ 'OOaz“¦›Žyv—Ñÿ£}ˆv³ó‹ÿÉŒ‡v w{„“ŸŸq[OOÿ 'OOaz’¦›ŽywœvžËŽÿ× ˆvœÑ‹ÿÚ¦‡v w{„“ŸŸŒq[OOÿ 'OOay’¥›yžw‚žÑóŒÿó‡w†­÷ý‰ÿìÀ‡w x|„’žŸŒp[OOÿ 'OOay’¤šzŸw˜Ú÷Œÿà°z‡w‘à÷‰ÿùÖ~x…w x|„’ž‹p[OOÿ 'OOay‘¤šz¡w¯àŒÿ÷Õ†z†w†³ìŠÿä•~…w x|„’‹p[OOÿ 'OOax£™zxˆwˆžµÆ×€Ý̺¦}ˆw…³å‹ÿý鳆†w~’ãŠÿw x|„‘œŠo[OOÿ 'OOax¢˜Œz†x{ЬÂÕäðû€ÿóèÚʳ–}‡xŽ·ðûŠÿ÷à—{…xyÓ÷‰ÿùè”…x y|„‘œœ‰o[OOÿ 'OO`w¡˜Œz…x€”µèùˆÿîÆœƒz†xŒÊñŒÿ°†‡x»è‹ÿŸ{„x y|„››‰oZOOÿ 'OO`w¡˜Œz…x™Òÿ襃†x{‡áŒÿчx™Ò‹ÿ¯†„x y|„››‰nZOOÿ 'OO`wŽ —Œzy‚x™Ôóÿùè­‰…xy|´â‹ÿó¹†xÁ‹ÿÀ’„x y}„ššˆnZOOÿ 'OO`vŸ–Œ{‚y€šÒóÿݬƒ†yÇù‹ÿÒš‡y±îŠÿס„y z}„™™‡nZOOÿ 'OO`vŒž–‹{‚y¾“ÿÓœ‡y«å‹ÿ渇y ÕŠÿî°„y z}ƒ™˜‡nZOOÿ 'OO_vŒž•‹{‚y­è“ÿðLJy»‹ÿ÷Ò‡y»‹ÿ¼„y z}ƒ˜˜‡mZOOÿ 'OO_uŒ•‹{z€y’Éù“ÿûàš‚…yèù‰ÿýà…y„«‹ÿÌ’ƒy z}ƒŽ——†mZOOÿ 'OO_u‹”‹‚|z«Ý•ÿ†zмîŠÿ쵈…z}ž÷ý‰ÿÖ ƒz {~„Ž——†mZOOÿ 'OO_u‹œ”‹‚|zÂì•ÿõÚ’†zÝû‰ÿöÞ“†z•èù‰ÿÝ«ƒz {~„Ž——…mZOOÿ 'OO_uŠœ”‹‚|{Ò÷•ÿûð˜ˆ{Èð‹ÿœ†{‘Óô‰ÿ齄{ ~„Ž—–…mZOOÿ 'OO_uŠ›“Š‚|{Ûý•ÿþû›ˆ{§Ú‹ÿ¬……{ˆ²ë‰ÿ齄{ ~„–•…mZOOÿ 'OO_tŠš“Š‚}{Þ˜ÿœˆ{‹È‹ÿ¼…{€‘ã‰ÿô̓{ |~„••„lYOOÿ 'OO^s‰™“Š‚}{Ûý•ÿþû›‰{·öŠÿÍœ‡{ÞŠÿÞƒ{ |~„•”ƒkYOOÿ 'OO^sˆ™’Š‚}|Ó÷•ÿûð™‰|¨ÞŠÿÞ¨‡|ÞŠÿÞ„| ~„”“ƒkYOOÿ 'OO^s‡˜‘‰‚}|Ãí•ÿöÛ“‰|—ÅŠÿö¸‡|Íô‰ÿ朄‚| ~„Œ“’‚kYOOÿ 'OO^r‡—‘‰‚}|­Þ•ÿ‰|в‹ÿ½‡|Ãí‰ÿ駆‚| „Œ“’‚kYOOÿ 'OO^r‡–‰‚~|”Êù“ÿûàœ„‰|£ûþ‰ÿÁ†|¸å‰ÿꮈ| }„Œ’‘jYOOÿ 'OO^r†–‰‚~‚}¯é“ÿðÈŒ}™ðû‰ÿÌ’†}§Ú‰ÿðÄŽ‚} „‹’jYOOÿ 'OO^q…•‰‚~‚}”À“ÿÕŸŒ}”Ûö‰ÿÑš†}ŸÕ‰ÿóБ‚} „‹‘€jYOOÿ 'OO^q…”ˆ‚~‚}„ÔôÿÞ¯ˆŒ}Åð‰ÿÚ¨†}Ó‰ÿôÔ“} ~„‹‘€jYOOÿ 'OO]q„”Žˆ‚ƒ~†žÖôÿù鱎~‹³ì‰ÿ㶆~žÔ‰ÿôÔ“‚~ €„ŠŽjXOOÿ 'OO]p„”Žˆ‚…~žÔÿ驈Ž~ˆ©é‰ÿ龆~žÔ‰ÿôÔ“‚~ €„ŠŽiXOOÿ 'OO]p„“Žˆ‚…~†˜¸éùˆÿîÉ ˆ€Ž~ˆ©é‰ÿ龆~žÔ‰ÿôÔ“‚~ €„ŠŽiXOOÿ 'OO]pƒ’ˆ‚†~‚°Å×äêù€ÿïæÜÍ·›ƒ~‰©é‰ÿ鿆~žÔ‰ÿôÔ”‚~ €„Š~iXOOÿ 'OP^oŒ‡ƒŠŽ£¶¿×€ßǹ«”„’†žÎ‰ßϯ†–¾‰ß׿‚ €„‰ŽŒ}hXOOÿ 'PVao|‡‡†„Û „‰ŽŒ}hXOOÿ 'PVan{…‡†„Û „‰‹}hXOOÿ 'PVamyƒ††„€Ù €„ˆŠ|gXOOÿ 'PU`lw€…†„‚‚Ù€ ‚„ˆŒŠ{gXOOÿ 'PU_jt}ƒ††…„€ƒÖ€ ‚„†‰Œ‰{gXOOÿ 'PT\enw„†‡†ˆÕ‰ ˆˆ‰ŠŒˆ{fWOOÿ )RRX`hqyƒ‚…ŠÕŒ ‹Š‹‹ŒˆzfWOOÿ ,WQU[bjqw|~€…Ú‡„zcUOOÿ 2`RQU[agmqtv€wyÜzY€Oÿ /^ZSSV[`dh‚kgÜfT€Oÿ E[WSQTVXZ\[XÜWQ€Oÿ #JUTëOÿ‚GUTQéOÿ‚éÿù‚ÿ€ ï„ÿ) ï„ÿj^)& í…ÿ†„cWJ=1)%ë$?†ÿ™™‹~nUPKìI†ÿ™™¦¨•UUMJëIÿÿl8mkêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°ëÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁ5ðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅ. 5BCCCCCCCCCCCCCCCCCCCCCC?. s8mk1ÉÿÿÿÿÿÿÿÿÿÿÉ1ÉÿÿÿÿÿÿÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÿÿÿÿÿÿÿÿÿÿÿÿÉ1ÉÿÿÿÿÿÿÿÿÿÿÉ1t8mk@6Wm|uhN&3…¾äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúðÛ¯j)  2ªÓðÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèÅ‚  :…Óäôÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿïß¹l$  \¾ðôúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøóß®6  sâÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÙB ‚öÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüôK ˆüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþüO ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠþþþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ŠþýýþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP †÷ùüýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP €ëôúýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP wÛòøüþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP kÂãðøýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP !NÑåôüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP #3Y¥ÃßôúýþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP %+5Kt¬Üî÷üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP ")07ETahjmooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooonmmifd`- &+0245778::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::9865321/,' "&+,-/0012222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222221/-*(&((%"!#%'**+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,++)&#"!  "#$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%&%#"!!    quiterss-0.18.3/quiterss_os2.rc000066400000000000000000000000561265173051100164540ustar00rootroot00000000000000ICON 1 DISCARDABLE "QuiteRSS_os2.ico" quiterss-0.18.3/sound/000077500000000000000000000000001265173051100146135ustar00rootroot00000000000000quiterss-0.18.3/sound/notification.wav000066400000000000000000000374001265173051100200240ustar00rootroot00000000000000RIFFø>WAVEfmt D¬ˆXdataÔ>MT^>= %=.íÿîÿ "ýÿ¾ÿ·ÿÕÿúÿÎÿ5Ôÿ²ÿ‘ÿÿoÿ§ÿòÿ-kƒ`¦³Ì«€$þÿâÿæÿ[WS5JRp’ƒf)þÿÔÿùÿáÿñÿõÿÀÿ´ÿ¶ÿ¸ÿ£ÿ -#CXO +üÿ!;SLGEF5ðÿÓÿÏÿËÿÂÿ»ÿÇÿÙÿòÿ &% üÿéÿÛÿÙÿ×ÿÆÿÄÿÏÿäÿÿÿ$*ùÿêÿÚÿßÿÒÿ»ÿ¶ÿ­ÿÏÿØÿðÿ+22*  úÿóÿÿÿ #Q>#301<ëÿòÿ ûÿ'  äÿâÿçÿ ÿÿëÿôÿæÿÞÿ×ÿÐÿØÿäÿùÿ&êÿÀÿËÿçÿéÿÂÿŸÿÃÿ Úÿ˜ÿöÿ¥.Ôý†ûjûvü2üôúÛúSü*ýbüòûný®ÿ¨¼šmÑl ,m - \ ² ê ø ¶ B Ž…Rÿr¿þöü=ûËùfø÷ñõõZô¶óMó/óSó’ó ôÈôºõ¸öÕ÷JùáúPü¬ýeÿ¢ƒô0? * ÷ ~ Ë Ü Ö ” â ô Ìiÿ…ÝIÿÂý;üÈúmùOøN÷söµõQõõõ?õ‡õ%öÞöÎ÷ÚøúDûÂüTþÐÿ<š‚ÏÔÅ– D š ¿ à ¿ j Ö  ¸C¸BÏÿ"þ‚üûÚùø–÷«öìõcõõÔôËô õxõöáöÝ÷ùMúÌûYýçþ[ö‘\¢·£ i ó ^ u V  y Ä àÆt¥!ðþeýÞûdúùÍ÷×öëõ,õ¶ôaôRôôõ¢õö‘÷¼øúûý¡þ5ÀHË/a€ 4 × B w Z › ÷ ë¤6¶† ÿ~ý÷ûŒú@ù)ø;÷möÌõ?õûôöôõSõÏõwö[÷bø‚ùòú}ü þ‘ÿ1ÑgÐ :0  – ú ( & Ü k Þ " 5Ì_ònÐÿ6þÄüGûÍù›øŒ÷˜ö¢õõÄôÄôÅôúô„õ?ö÷øTù“úü†ýÿš9± ‚ÐòØ ­ K ˜ “ _ b r \Ièu”€þ÷ü…û@úùý÷óöö|õõÐôÙôüôPõúõÎöÌ÷ïøCú¿ûJýåþ‚o§«‘ O Î  +  © 5 t yO ®GÊ/þý¢ûAúûøÖ÷éöövõõõõDõªõHöE÷FøJùŠúü–ýÿ™ ½e‘¤“ S ß . 6 ð ” å  ö>ßdÖÿ<þÆügû2úýøê÷÷ö#öƒõ"õîôÜô&õ¤õcöC÷Iøxù½úü–ý0ÿ¸UË9wš¸§ T Ê # (  ‡ ô 8 <È~qÉÿEþËüaûóù—ø‹÷«öíõWõõõõEõºõkö>÷Lølù®ú ü¤ýÿ¶^ÿw»÷ ì •  + 0 ð w Î  ÷¶_óXÁÿ6þÇüeûóù¸ø ÷ öÐõ@õóôîô õPõáõ§öŠ÷†ø½ùû}üéý~ÿ‹ qË  ó ’ ð L d  “ â 爱,½(ÿˆýüÄú‰ù`øR÷göÄõOõ õõôõnõçõ®ö¦÷Ëøú’ûýŠþ+ÌW® aŽu  z ç  ú ± # € v2çTÄ@¤þ!ý•û0ú ù ø÷>ö¾õ}õ[õXõ‘õìõ™öi÷SøYù­ú%ü©ý5ÿÈsìN£ø Ñ k ò 8 & Þ T ¹ ØÔ¯bâaÞLÿÌý;üÜú™ùpø`÷‹öÜõqõAõ*õGõ©õXö÷é÷ùSú¹ûýžþ-ÍR¹`Še  ” ì ð Ï c Ê  +$èwˆìÿfþßülûúôøê÷ìöö¤õaõ9õiõ¹õ1öàöÀ÷Âø÷ù>û¥ü!þ«ÿ@Á8”Ö Ø r à ú ó š  A b=ü›'³†þõüšûWú3ù!øE÷‡öáõ}õWõfõ†õñõ£öˆ÷‰ø¶ù û†ü&þ°ÿ^ÝWÅ÷  ß K œ Ì í «  { ¥“Ná\Ð’þýƒûúÊøÇ÷òö0ö¡õqõWõvõ¯õ1öùöâ÷Óøçù7û¢ü(þšÿ"­;­ä& ü v ß þ ñ ›  3 D5ìjì‡æÿiþûü€û#ú÷øê÷ôö5öÆõ~õ?õ[õÃõ?öÖöÃ÷üøGú§û0ýÖþY÷ˆ\}‰h  ‹ í ò ° 0 àÞµv b×NÿÂý(ü¯útùXøB÷döäõtõ+õõ‡õö´ö|÷„ø¹ùÿúdüéý|ÿó†d¢ËÊ– 7 Š Ï Ï † ÷ Y ‘` ´Aœœþý û?ú ù-øC÷töíõwõVõsõÂõAöòöÞ÷áø,ú™ûý›þGâsæ2giT ÿ ƒ ¼ Ä * ” ¾Á‰<ÐJŸÿ‚ýüžúOù0ø<÷öéõ‚õQõoõªõöíöÐ÷Êøôù\ûæüfþÏÿYîzã2- ö o © ‹ G ° ÙDZoëQ¿2ÿšýü»úwùMøO÷‡öúõ‘õSõ[õ¹õö§ö›÷¹øìù,û™ü(þÂÿJáiË Ý b ¯ Ì › = £ å¼i …æDÿŽýûû™úXù3ø$÷UöÊõuõEõKõ–õ1öæö·÷Öøú€ûùü‚þ¸;»BW3 ú  « © ¡ 8 … ª˜h ŒåQ½þ3ýªûAúùø2÷\öâõ“õzõšõÝõSö"÷#ø4ùúõûxýýþ¢Vñ^¶àÓ¯ 0 z “ ‰ L ¼ ö !Ì[årðÿLþ§ü9ûåù˜øv÷„öáõsõDõVõ«õ;öïöÚ÷÷ø6úvûëürþúÿtènÀß# ð k ¦ ² ‰  t ž~:ÝM³“þý”û$úþøø)÷döÞõÄõ§õ£õüõŸög÷ZøtùÇúdüðýnÿûº_À 7) ã [ ‰ “ L Í $ PQ>þ„ÿmýÛûpú1ùø ÷/ö¬õsõ]õŸõö°öš÷§øÑùû{üöýŸÿŸnªÍÙ¦  H s I Ü . U["£ ‡ÿÿxþ÷ü£ûTúùå÷÷löýõ´õ¯õýõoö÷ç÷àøú‡ûþüqþ÷ÿ‚sÔúÉy ù - % å ‰ ÏåÍw )ÿ þü3ûÞùËøØ÷÷sööËõÐõöžöa÷<øMù‘úõûnýÿ«QÖ5v‡¥…  : W @ Ð  1M%ÝeÜTªþý­ûrú3ù ø ÷oöö¨õŽõËõKö÷ã÷Úø1ú¶ûGýÇþLïvÂóö} Ó   Í S ‹¢@Ê%‹ùþgýåûuúFù?ød÷°öSööö<öŽö5÷øýøúvûÛüNþÒÿu#¨E_3 ½ ÷ %  “ ù.>$Þ^ó{ÿƒýü¶úsùdøj÷³ö4öÝõÂõöqö÷øøø1ú§û3ýþµdØ89 ¶ ú $  ‡ Ô ¬,¢Œþ ýšûPú&ù ø,÷—ö?öö*ö}ö ÷´÷“ø©ùëúMü­ý4ÿ¼SÎClg ™ ¾ Î –  Q}VÅGÄEÿÝýsüûÝù×øã÷ ÷–öGö3öDö¯öN÷)ø"ùbú¹û@ýßþeëI¦ð¿: ´ 2 €®¡p¥"™ÿ%þ¤üDûþùæøö÷N÷ÕööföŽöðöq÷@ø&ùJú¤ûýþœ –Ù¾2 – º “  ]Ž}Pàr Œÿõýuü0ûõùËøÛ÷L÷Çöxöpö£ö÷¼÷‰øœùéúüzýïþvü‡ñ â]   • u  åpçkÿcýÞû§ú‹ù~ø§÷÷§ösö‚öÙöO÷øüøú3ûxüöý‘ÿ)¢jœª’K ¼ Í ® j ¾Ò²}†ÿçýHüûïùèøÜ÷2÷Ôö…öböwöïö™÷møTùˆúÜû\ýÿ”#ÄJœ”y õ Ø Š @é²1«‰þ ý–ûEú#ù'ø;÷Ÿö;ö&ö5ö’öU÷Cø8ùNúÀûUýýþ=Ì.pˆ‰I ¬ Ê Ã w ô# ÆQÃ:þ ý‰û6úùù÷ ÷eööö$ö“ö`÷=øHùúðû‘ý%ÿ¹A·p˜‹< °   ¯  _LÈN¡åÿUþÏüCûòùÌø´÷æökö.ö;ö‡öÿö³÷«øÁùûpüéýoÿžyÀÕ²F ” Û Í ^ Ÿ¸ºq÷lÚ ÿ}ýü£úmùQøs÷Íönöiö˜öÖöm÷Oø`ù…úÏûDý×þ‡‘d…J ½ í ç ­  ôÍ_ÄZÿËýGüÚúù‰ø›÷×öOö=ö{ö¼ö8÷ø!ùVú¸û$ý»þdþ—÷ašd è  í ˜ ù&ê•2¿]ÿ¹ý5üÎú™ù‹ø‹÷ÉöCöö-öhöãöÎ÷éøúûýâþ€»f¹Ôæµ 8 P L M dAådÈLÿýêûkúùü÷õö&ö§õ‡õ¨õüõöƒ÷¸øú¯ûaýÿä<Î0iV  — À ‹ p m8Ã0¶ãþ ýcûÕùƒøZ÷bö´õpõ}õ·õ$öóöõ÷9ù›ú$üîý±ÿd©o™¡ W ¦ ¼ ˆ   û²$a”ÍÿþTü¢úGù*ø"÷LöÕõ¨õÍõ8ö½ö§÷Êøúfûúü¼þq'߃àûÕ g v # ·  ù¯1›ØWþ»ü4ûÂù€ør÷¿ö@ööö{ö÷÷÷ù*úûÿü¾þ•eädÕ ¶  ô \ }n%¶lÃÿþ€üû´ù—øŠ÷¼öUö(ö;ö’ö6÷@ø—ùÚúPüÿýÇÿ‰=ÝTŽœy ÷ , ¡ ïÝwå(lµþ ý`ûÐù’ø‡÷µö!öêõ öZöÎö¹÷ðøQúØû~ý@ÿ»`ü^œ¢ ` ­ ° x Ü Ô}ÔÞòþ1ý‡ûöù“øe÷fö¯õ@õTõ™õþõÐöøaùÕú€üaþhE=Ú÷ Ð C \ ‡ ¦ j÷k±¶¾ÿåýü?ú¤ø:÷0ö\õ®ômô˜ô!õöõ*÷{øúÎûÈýÍÿÅÞÂsÞ!  ¢ · ” = h * §9/ þEüdú©ø9÷$ö)õôAôVôªôuõ•öø®ù…û‘ý©ÿÉÔ½zù. 3 Ö õ ´ 4 n F ÊXV3)þ)üJúŽø ÷»õ¼ô0ôô3ô¡ôŒõÎöHøâùÈû÷ý÷¨ > $ Ç ÿ ¼ % A # …«É¹˜ÿyýjûyùð÷œöƒõ§ô+ô/ôgôñôíõc÷óø¬úŸüÌþéöüÑ}ò  ¤ ü ê „ ½ › +h–™™zþRüIú²øC÷îõîôSô9ôWôÅô›õïöiøúü2þ{xnP‘ à ‘ ý  ­ ð „å×–þ„üžúÃø.÷èõþôRôô>ô¿ôõ¬ö9øöùÝûâý+xcž á ° & Ì  ö Šáýæ¶‘þxü…ú¥ø÷µõ°ôôÜóô‡ômõ³öJøúüQþ‡ºÚ¾yê ä . ¦ ñ ½ #a…p*üýÜûéù(ø–ö9õTôÚó²óôó¶ôìõN÷úøóúý1ÿm©Å©M ¾ ¶ A ~ Y Ã Æ \ §Çµ‚+ÿåü½úÞø*÷žõpôÅózówóñóÇô'öÕ÷–ù‚ûÏý<w¨¶ºd ° l Ç Ü ˆ — ; ϧKþÙû¶ù·÷öžôÂó5ó óSóôIõ»ö•øŸúÑü#ÿ‚Ê °  « Ù ‘ Ù Ì N •ˆc9âþ§ü‹ú™øäö~õ[ôÅóžó×óyôlõËö}øpúüóþI|–•V £ … A  N < õNCôÑþ”ü„ú¸ø"÷´õ«ôôôTô²ô¼õ·÷ªù_ú°ú‰üCj¿ü… Ð : ˆ ô < Ÿ ‘ mvPˆQ˜þ†üúã÷föaõ‹ôôþóXôõö÷dùUû›ýáÿ é} ™ Y Ô ¯  > Œ²½®zÿBý?ûPù’÷öæôTôôôóqô€õÕö{øOúiüµþs–¢\ ³ ¤ @ P _ / ¤Úì×£LþDühú¤øøö–õ¼ô>ô3ôsô õBöÔ÷‘ùû¶ýüÿOg`EÄ Ä g ¢ ‡ û î ®(cj9ÿý&ûLù¶÷qö§õ.õñô#õèõ÷bøúõûþ í‘óõ Ú ¸ 5 ' Õ;my[;þNü~úÈøY÷3ö€õ<õfõþõíö)ø¸ù}ûsý‡ÿ}tY&£Ä v à Ü ‚ » qñ2,åÄþ´üÒúù^÷.öcõåôÅô:õö6÷øJúMü{þ®ÀЛG» °  V A £ clKþïûõù&ø§öŽõ»ô^ôtôõòõG÷áøÌúöü0ÿx”›]Ý Î ( + Ç Ü ±,q„xNÿ/ý<ûfù»÷\ö„õõóô:õôõ/÷Äøšú–üÄþó àF‚ D ¬ À c ‹ _y™Œlÿaýtû›ùï÷§öÅõUõ)õiõ@öq÷Õø‚ú…ü¦þÎŤvJ ù a p  H +Ê6EHdÿpý{û¼ùDø,÷jöîõßõ)öïöøzùûüüàþÇ»r×¾d È ¸ " >!Ê JžþÜü û‘ùjø˜÷÷¾öãö÷\øùû¼ü’þTמ!IÓ( D è ðŠá)pþ¿üû…ùPø„÷ïö¤ö¹öL÷øPù¼úyügþJ:(ø†Ô£   ° ûÕÚðþ ýMûùø÷VöëõáõEö÷Iø¬ùWû2ý-ÿMV*Â-8 Î â º 6 Fÿj³âõÿûýEü°ú@ù ø%÷Ëö·öêö‘÷¦øåùRû ýÿø²w-Šsè ÝI^ ‡ÔëÿþJý½û>úùõ÷Z÷!÷.÷§÷šøÓù+û¾ü„þtTº,TöQ q  -÷ƒÕЩÿ±ýÌûú“ø^÷zö öëõAö÷,ø§ùLû%ý0ÿPM6×V’ C „ q  # ÅE0öÿÄýµûØùøÃö×õfõDõ®õ‘öÅ÷\ù'ûýÿ*&µ © ê ¼ > DôL}‘®ÿ£ýÇû!ú£øŽ÷Æö{ö¢ö1÷øbùòú¿ü§þƒn<Ø2GÜ ÚTaü„Îæòþý]ûàù¥ø§÷ ÷µöîö˜÷ŽøÎù`û.ý0ÿ7Þ— ¯  â % ªûÝ¥þšüÉú"ù©÷|öãõÃõîõö ÷ùÐú¹üÁþÞóìÃU~ - ‡ y Ù Â`¯Í®oÿAý;ûiù¸÷vöÅõsõdõêõþö`ø!úü?þˆÈË«R— T ¤ ‚ æ óÅÇ«…ÿjýZûtùð÷Ëöö´õÑõoö\÷xøúü6þ]SYAâ ×  û n Wå#7ÿ÷ü û`ùø÷“öƒö·öw÷±ø$ú»û‘ý“ÿ–„;ÓÊ+ 7 õ-Ý6Ѝ›ÿ–ý½û ú‡øq÷Ìö…öšö.÷>ø°ùQû-ý8ÿXsPÛ-) › ® 6 ^IÓöäÙÿÏýàûúŽøM÷ööõõxöa÷ø>ú4ü<þp‘“w8 ó 1 ø S ,²ÿÒ«þ¦ü¼úõøŠ÷šö öúõEö÷Pøêùºû¨ý·ÿÅÖ©Jr>   — $ 4Ó$I4ÿ ýûRùê÷ëöLö#ö…öZ÷nøùùÎûÙýêÿòóÊTvB ƒ x õøªB'ÿ ý.ûYùú÷÷hö3önö4÷cø÷ù½ûÈýäÿä’9 ƒ d ·Q¥ÁÉáþæüû†ùTøj÷õöæöY÷+ø.ù¤úrümþJ-Ø ùƒÅ‡²„$•¬¶ÿÈýûûjúùø‰÷\÷÷5øHù®úTü9þ$ðÇ‚íÏN”Šß¿iñ*9þxü¯úùø>÷×öëö\÷7ø‡ù+ûýÿ&. »Ë7 9 ÀÚ– kxmÿvý’ûùù¯øº÷÷ôö9÷øù€ú:üþÒ«aϵJ‹e±~!¥íöÿ&þqüçúdù[øÉ÷„÷¹÷QøTùšú/üÚýÅÿ«y P@Ý"Óó¶6p«ÿôýmüóúÂùÿø•øgø«ø[ùcú«ûýáþ˜4ÄDwD´Ùœ·€°ãþý?ûÚùÈø ø…÷÷"øùLú¸ûxýiÿ=û½-CÿfuÊKœËùþTý¨ûúùeøï÷Õ÷.øþø=úû ýÐþ®ZïRl.‚‚øê„æiþëüûRú“ù>ù4ùhùúû^üÊýFÿÔt) œùðjmFúg®ÿäýhüÿú¤ù£ø7ø0øpøùú’ûýÌþ³”JÍæJ=åítÑ)ÿ`ý¸û9úù@ø·÷£÷ øâøúkûýáþÇy…Ÿa¶š*Z›ôO’þý¡û\úrùüøÚø ùµùºúügýóþ·uø%ÒÔJIû‚éOÿžýüÅúËù"ùåøëøPù)ú>û§üFþðÿ KÈ|œi™$”àÿ6ý ûJú ùNøø,ø‰øjùÅú;üóýÕÿ½¦XÁ»:PT*ä#ÿ4ý{ûðùµøø¼÷Û÷Oø4ù‰ú-üëý¿ÿ©€0 ºCqXŸfæ:ftÿgý­ûúÄøî÷÷²÷#øùiúüÚýÅÿ±‡/Š~úºúÓs½êÿJý˜û+ú ùhø4øYøüøòù=ûÑü„þ\Bƒ»‘ý~‡2±ï5þŒüþúÄùìøhø`ø­økùœú ü•ýNÿÀ^²™.ò@É]Çÿ{ýüÑúæù]ù7ùrù!úûiüíýƒÿ7Ü`¡” Lò+Ù9þü ûºùÇø7ø)ø€øCù‚úüµý“ÿzGþZh2v:y bmŒÿ·ýïûQúù5øØ÷ß÷Pø>ùúüêýÑÿ±k eP½Íb‡8¶ÿ#lþ·ü%ûðù7ùÔøÙøAùú_ûàüþCù !Ð !ªª€ [—ÿéýJüøúÝùùÐøæølùDú}ûüü½þz.ÃH–4nQãäc±ü'ÿNý¿ûPú6ùœøzøÌøxù€úÿû­ý`ÿ@¸«Çm¶“Db‘þÖü5ûÁùÃøRø;ørøùcúÜûýUÿE.ãHY+×ü² du]þwüèú‹ù€øü÷ø÷nøDù•ú6üþâÿ¼‹8—^½Éf}h±âÿôý>üªúxùÂønørøúøú\ûòü°þAÞXx2qF³³S¹à ÿDý¡ûBúTùÎø¸øùÒùûdüþñÿ¿fX'{IÏÙt¶õ=ÿ‚ýÂû2ú3ù»ø¸øÐøwù¸ú6üÙý•ÿm(Ô! €0l?§âùÿþOüÇúhù˜øPø]øÓø´ùûØüÎþ”p?ÑâyÄ¢ý»?Œ¸±þÀüûªùÁøSøMø¯ø¢ùøúœümþ;ûœ,cjkë¸%‹Êÿòý7ü¾ú¸ù$ùÌøèø‹ù±úü¡ý^ÿ/ég±wáÃ.N%² Vÿªý$ü×úþù“ù’ùóù¥ú¿û#ý®þ<ÍAš’7‚lÕÓ¢B»ìþQýìû¶úØù_ùfùãùÀúéûlý ÿÝ~Þ"$¥£G’ f°ÿþžü"ûõùFùùDùøùûü'þÄÿy#žÙ½¦È€øj¶ÿïý0ü´úŽùìø¡øÕøù ú ü§ýmÿ »>—nÔÙh¤\æV£ÿÜýRüÿú ú¯ù©ù úÑú üqý÷þ|üi·—êÉ+µJÊÿ'þšü7ûúsùUùžù>úLû»üþa½DìÒUNà<„¸þýüzûú!ù±ø½ø!ùèù*ûËü–þRÃ9Zÿ'yió?‹Ûþ%ý„û8úLùõøù´ùÀúüÏýŒÿ<Î46Ùóˆ eÜWøþšýüâúúÉùúùwúvûÓü`þáÿxp‹8†fãí¢)š÷þ_ýÑûVúLùÀø¾øù údûý½þ†6ÝkXÐ×™õÑNÂ)zþýzûGú´ù¥ùéùú”û÷üzþðÿhÔs„gòñŒGôþý üôú[ú;úLúµúªûúütþåÿrûAcu@°Ä«PçÿþCýü%û”úúÒú`ûRüýèþX¶ F99ýiiE³ÿPþýêûû‰úSú¥úAû:ühýÅþDÉÚÓZ~lNæþÔýËüÙûhû1ûBûÂû¢üÃýëþOˆOÅÖ»}û" ÿ6þaý™üü ü-ü…ü4ýBþ|ÿ¡ÍÙátjwl;ÿþ(ýMü‡û4ûJû®ûMü:ýlþ»ÿÏñûØYBðŠäü  ÿ*þhýÖüeü(ü!üyü"ýþÿ2<$Ó!èhÌöÿýþþ7ý”üüÝûñûYüýþ>ÿuª¬h sG›Ý Þÿ¾þÔýýwüüàûÚû8üáüÔýöþ;LD£¦5’¾¶‹lÿMþQý{üÞû„û…ûªûüöüþSÿw¥Â¦G²‘éýõêÆÿ®þ¯ýÈü$üìûíû:ü¶ü`ýzþ»ÿÔÓïÐi›süÏ…sÿ^þQý]üÇûpûkûÑûYü,ýAþ—ÿÝ (<\C·óÅbÍþ¨ý—üžû ûûQû©û/ü^ýÇþ<m—‘õžÕ¥0ãÿ±þ“ý‚ü¤û?û$ûû ü«üœýÿy©¤ÀÚXWå(½Dýþ÷ýý#ü`û@û‰ûÝûAü ýHþÏÿó¾Óð³µiÙî›?ÿ!þ`ý’üäû«ûüÃüOýþXÿ²Ç®‘=NÒß\ªÿ6þTý‡üœûüúýú…û=üæüÎý,ÿª¦-ö ʪüC_ ~ÿHþvýçüVüÖû¼ûOü6ýþÒþ‘‡ ©‚ü- ü~Íþ?ý8ü…ûíúhúnú<ûfütý…þ•ÐvÿÎ^$XmWYÿôý ýmüØû`û[ûüýûýÿ{ûêkåu´ô¿'ÿ§ý¬üüŸû=û'û¬û¯üÛýÿj ¥‘æ"a5XŸ[þÂü·û6ûÝú›úÈú‰û•üØý0ÿÀhÓÁ.ašr‚(àÿ&þ™üûÛú[ú úQúûGü“ýÿ² ÒG½ë[]í<aÿ«ýSü`û¶ú/ú'úªú²ûèüSþÌo‡ýRŒH˜S¸Iþºü¥û÷ú„únúºú–û¹üðý]ÿô’å¯ Xl%Eùf¬ÿüý–ü¦ûëúqúwú&ûòûêü^þüÿŽ =Ä a0¹IþÄü¼ûû°úšúûòûüüAþÅÿ}Ræ.;rkTžþýòû9û»úzúÏú¯ûÞü,þ•ÿ0×DbV*Šq‡áþ@ýãûÿú–údú—ú]û•üõý<ÿÃwŽ‘^éÓ9eÿ•ýüúúqú:úRúáúü‹ýçþOﯔˆI2°®_g!þæûOûfûÏúýù‰úxüåýOþÿ3" NùêëŽSôÿMþ¨üžûþú£ú‘ú û-ü|ýÖþEõ Áöò³ ÈKþêü±ûâúhú<ú’ú‹ûÂüþ“ÿ4ÒCm~MÓc£þðüžûÂúXú>ú~úûßüWþÛÿ„Ÿê¾>ž†â/þüIûú>úVúÀú²ûýþ¸;˜ŒÝzÆ«nþØü°ûëúšúÈú>ûüYýÎþ-ƒÚ0+iö6€‚{ÿßýqülûÀúœú"ûÎû¹üþ¨ÿYŸöíúTs†k÷ÿYýÿûñú%úôùtú6ûXüìý¬ÿ#vÎý U;>/®ÝþDýü#û}ú‹úIû+üPýÕþ‡ñ*BbÕÖ §„Ðÿåý[üKû†ú!ú7úùúüiýÿÊA‹ÆÖWòûÊ¿n±ÿÛýlüqû›úIú”úpûzüÐýuÿ `† Šä4 ü ®çþ2ýâûíúFúJúéúÞû ý»þ˜R£l]DùÉŠÖÿàýüàú ú‹ùËùµúæû1ýéþçÊ4ÇUêÏxÔÿþ¤üû¿úVú½ú›ûºüúý‹ÿI4#û*s. Øÿcþøüïûgû(û@ûùû ý[þ³ÿK·ž]8Ä}oùݸ6ÿ“ý8üeûÔú“ú û!üGýƒþ&Çö¾ŽQV]ó’hÿ‡ý$üûŠúcúÕúâûBýªþxgáÜ¢f¹–ðpùÿLþ˜ü?ûOúèùñù˜úÇûJýÖþ›Pu@ÎÝ˦^üþnýþûû¤ú•úûCüžý*ÿÊ‘ÍYL†äœ)ÿýüÄúú¯ùåùÖú'üˆýBÿ*ì%á¦E%õK¼NÑþJýÖû¹ú5ú=úÒúÙû8ýÚþ°\¹‹&·Ü‡ÑBðþý3üûSú8ú«ú©ûýü{þè`@ÛnÑ6²£NÿôýŸüšûøú¬úüúåû!ývþšÙTà Ƣ dÿCþ9ý+ü|û_û•ûSü~ýàþTÕÖO‘¸ki¡ìÿŽþiý^üuûÇú¤úûúûcýÞþzžµ;Wa2 ZfÈþ€ýü‚ûÉú˜úñúèû%ý þ)×ZcÖøù¥Ç4„þ>ýTüoû¦úrúùúíûBýÐþ‰Qå«ãÐr†ìèÿ„ýKüHûkúóù*úñúü¸ýWÿ À Ü 3–Mo‘ÿIþ?ýHü~ûû"ûÚûþüVþóÿ‚û6êû±J]{‹þý2üˆû×ú€úâúÎûýþ6îW”Mf¯Ûýÿ­ýšü»ûû·úúúÌû÷üZþíÿpçü´Ù“e'Ntþþü9üœû(ûÿúqû}üÊý5ÿ¼b½Á âù¦ÌÿÈýeü¢ûBûíúãúƒû«üþŽÿ–ùîd5¢ÉѸÿ¾ýTü‘ûû¼úÀú`ûƒüÞýkÿˆËÕQ9ŠœR£ÿÃýaü“û,ûéú û¢ûÇüAþÒÿvâëI}pK4ÿUýçûû·ú{ú¨ú‹ûÐüCþÒO}HZZ+üÏþòüªû!ûÙúÍú@ûHü´ýMÿú‡Ýàx‹ ¹uþÿKþ¤ügû·úlú‰ú ûüpýÿ×G‡•]“(LRùrÈþBý-ütû%ûJû¿û…üÁýÿ‹èÙWcà ÷ß”ÿ:þûü-üßûãûKüîüñý$ÿ†°°€õ/ì4! Þÿ¸þŽý üüÅûüªüýºþöÿ/N%¹ßbs<øÿ¹þ‰ý¤üóûžûÊûSü8ýGþ„ÿéLOfvüê“Aÿßý ü´û>û'ûû]üpýÈþ5·%Dä'mIÇD¹þ@ý ü$û¹úÆú>û6üuýÕþm÷0ƒ f¢{,¿ÿpþYý’üÿûÆûáû„ütýþÊÿþ7&§Å¡+aIãþµýåüFüëûúûwü@ý]þ‹ÿÎ ÍDUí¾~6ÿÓý¾üíûuûQû½û’ü¬ýÿú(,°Â|Ò¹aíÿzþýþûhû9ûyûüõüEþÚÿD›É‰è¸5=ÿÿýLü]ûÛúñúVû?ü{ýêþ_¹øãr¥‰Á¦m¦þYýnüèû™û¥û\üvý·þ„ûIƒtëÚ+Ìþcý5üqûûû}ûnü¾ýÿ† J,»Óo[ ºÿIþý üšûyû¾ûpüýÀþ2…¯ =s0zw?Üÿ‚þDýbüÁûsûŸûHü>ý_þ¯ÿ ^\7™žf0ÎþUý[üÁû‰û¡û(ü,ýuþÃÿ3«©_ÁÀ:H‹ ÿœýhüƒû!ûûbûNüŠýìþh×þ˜Ý…¼²Yäÿcþ"ýüzû'û]ûÞûÚüþmÿà&ê];ÆÿæÄÿJþ@ýŒüüüuüFý;þRÿ¢¤^¬Ÿ?…`%ÿþýrüüü’ümýdþÿι#$½îö®kÿþÏü ü¯û«ûóû¢ü«ýÿFŠ£wù(Ò*&ô£ÿ`þ8ýZüÕûÏûü·üµýìþ=¤½ƒ0 ^[Üÿþ^ýsüÿûÝûéû~üwý¸þ×ÿG<µé@L- Âþ–ý«üEüü3ü½üŽý—þ¾ÿã_º)ïÿÚþÜýùünü ü]üÐü¡ý§þ©ÿàúÕ¿J|yi"ÿþýü(ü3ü‚ü!ýþ.ÿOGRóBEhƒ{…ÿšþ°ýý¾ü½üýÉýšþ¨ÿÎÒª7vVâêÿÃþ¾ýÐü+üåûü|ü,ý3þxÿ¹ßÒÿö‘ÎͪxÿWþ}ýËüeü^ü›ü1ý(þVÿn€sA¤™E¡Ä¦”ÿ‚þýÉücüDühüýüÒýäþ "ÞLk<¸ïâêÿúþþfý ýòü%ý¢ývþ€ÿxzSë68èKaYLÿBþvýÖü|üoüÍü^ý3þ4ÿBPÉ!9úl›·ÅÿÆþòýEýòüåü,ýºýnþIÿ8)íy¦Â˜ø"Trÿ‚þÂý@ý ýÿüJýàýœþeÿKÎ_•šBäJVdÿ…þÒýOýýýsýþôþâÿηsñ#æüöÿïþþFý¡üQü]ü×üœý˜þ¨ÿÎÚ©M™ul„Š_ÿSþ‹ýùü¥ü¢üòü¢ýþ›ÿXÞº ;c|ÿ›þ¿ý/ýüüýUýïýÂþ¼ÿ¯p…ÀÀ€úBZtÿ™þÒýgý'ýý_ýöýÈþžÿl6ñl¸›L½ù1RÿˆþÛýuýJýýãýhþÿÄÿ’JáQ–|1 ä .ÿrþâýoý,ýKý¬ý\þÿîÿÔ²M£Æ—Yzfÿ`þŸýÿü¿üÁüý ýsþdÿte+ÚAbŽÉóöÿôþþ{ý*ýúü*ý¶ýwþRÿ<ÕsÒã•${pÿŽþÂý*ý¹ü‹üÛüaý!þ ÿ)!ÄC˜{ô8{•ÿŠþ÷ýˆýRýpýÕýlþÿàÿ•0ªûÄY¸ûÿ#ÿ_þ¹ýXýCýiý®ýSþÿðÿáÆlÕ#,íY”š¦ÿÊþåýEýçüËüãüRýëý¶þ‹ÿZDëg |¡þD‰ÿÌþ=þêýÇýÏýþŠþ;ÿòÿ¡<µ '²1„Õÿÿ|þõý‘ýŠý¯ýþ¥þbÿ!õ´2gZLâ<{Åÿ ÿqþõý¯ý«ýÕýMþëþŸÿSþ|Ý ÆE¦øÿ^ÿÈþJþ þýýþ^þÞþvÿ.Ñdå03ÕcÙ,ÿ ÿ§þbþ,þ.þƒþìþBÿÅÿ7¦ú7U/×}~ÿÿÃþ‰þyþ¦þõþSÿ¾ÿ\õjÓ2ÎZÌ&~ÿÔþMþúý²ý¡ýÀý$þ³þ4ÿ½ÿ`÷S¨Â´y¿[éÿyÿÿÜþÎþÕþýþUÿÑÿ>›÷3N9ž:Ïÿ_ÿãþþ]þWþnþ¬þÿzÿ†÷X¡µ¦p¿7»ÿ@ÿÛþ¤þ•þ¦þÔþÿÿ$‹ñ=bww+ÍuöÿŽÿÿÖþºþ¨þ¯þùþjÿÃÿ-„å!!×wÀÿÿ*ÿÿ ÿ"ÿ?ÿ|ÿëÿC–í4@<Ùƒ#Éÿuÿ;ÿ ÿßþßþ$ÿUÿ„ÿÝÿ?—ÈíÏ’7ÃÿoÿÿÐþ¬þ¬þÌþÿdÿÖÿ[ÞEšà÷ÐŒ?Ê@¬ÿ-ÿÊþnþ@þ=þ\þœþÿoÿ÷ÿjÇDWBÉr Éÿzÿ5ÿÿ&ÿ@ÿ}ÿáÿ<œæ"=N@ô6ÅÿJÿûþ©þ}þpþŽþØþ'ÿŠÿñÿN›F`E' ºZõÿ§ÿbÿAÿ&ÿ'ÿ6ÿwÿÇÿ÷ÿ:ƒÉÛÓ´¤VìÿžÿFÿ ÿâþÐþÀþìþ-ÿÿñÿ<™ûFC#è™Côÿ–ÿdÿ3ÿ*ÿ)ÿ7ÿeÿ²ÿôÿ<x”¦¢‘c!Ïÿ›ÿkÿAÿ%ÿÿ,ÿOÿ‡ÿÁÿ=”ÑîÒ£\ ¼ÿ‡ÿEÿÿÿ ÿ0ÿJÿ|ÿ·ÿ?hƒŸª‹\& ïÿºÿÿsÿqÿzÿÿ‹ÿÔÿ%Ut©±£‘p:þÿ¹ÿÿbÿGÿ&ÿ2ÿMÿuÿ«ÿèÿH~£ÑðÑ“E ÎÿxÿFÿ*ÿ'ÿ,ÿDÿyÿÓÿU×úã×È›9ìÿ¶ÿ‡ÿ]ÿ;ÿKÿMÿOÿlÿ¢ÿÑÿEt£“•†kP8ïÿÂÿ¿ÿ®ÿ³ÿ½ÿÐÿãÿöÿ"èÿÈÿºÿ·ÿ¨ÿ¡ÿ¡ÿ¨ÿÎÿïÿGo˜¤‘†{HäÿÙÿ»ÿ‘ÿ‡ÿÿ¤ÿÅÿàÿöÿ'/7%òÿ×ÿÏÿºÿ´ÿ¡ÿ§ÿºÿÉÿÛÿïÿ ?npz~{iJ%ìÿ×ÿ¸ÿ¤ÿ—ÿœÿœÿªÿÂÿÊÿÙÿõÿ8'%$):=441ÿÿËÿ­ÿžÿ¡ÿ©ÿ¥ÿ®ÿÊÿìÿôÿýÿ<>"ùÿëÿáÿØÿÇÿÍÿÁÿÕÿ:OgmlpUQ5!ùÿ×ÿ½ÿ£ÿŸÿÿ•ÿ¢ÿÂÿ´ÿ±ÿºÿ¾ÿÆÿ¿ÿÄÿÔÿéÿäÿÿÿ B[fW_eW<9ßÿ¼ÿ¾ÿÅÿ£ÿ¢ÿÔÿÿÿ/(#,GF6+2($ ûÿöÿËÿ­ÿ«ÿ¯ÿ®ÿÆÿÖÿâÿîÿ 462BWL6#8;$öÿãÿáÿáÿåÿöÿ òÿ õÿðÿÒÿ«ÿ˜ÿ‹ÿ•ÿÿƒÿyÿ¨ÿØÿG‡”Ž›ª˜†oiH ðÿáÿâÿÉÿ¯ÿ¡ÿªÿ“ÿ‚ÿ‰ÿ”ÿ¬ÿÎÿ ';P[3ÿÿquiterss-0.18.3/src/000077500000000000000000000000001265173051100142525ustar00rootroot00000000000000quiterss-0.18.3/src/VersionNo.h000066400000000000000000000005631265173051100163510ustar00rootroot00000000000000#include "VersionRev.h" #define STRDATE "26.01.2016\0" #define STRPRODUCTVER "0.18.3\0" #define VERSION 0,18,3 #define PRODUCTVER VERSION,0 #define FILEVER VERSION,VCS_REVISION #define _STRFILE_BUILD(n) #n #define STRFILE_BUILD(n) _STRFILE_BUILD(n) #define STRFILEVER_FULL STRPRODUCTVER "." STRFILE_BUILD(VCS_REVISION) "\0" quiterss-0.18.3/src/aboutdialog.cpp000066400000000000000000000140351265173051100172530ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "aboutdialog.h" #include "mainapplication.h" #include "settings.h" #include "VersionNo.h" #include #ifdef HAVE_QT5 #include #else #include #endif AboutDialog::AboutDialog(const QString &lang, QWidget *parent) : Dialog(parent, Qt::MSWindowsFixedSizeDialogHint) { setWindowTitle(tr("About")); setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setObjectName("AboutDialog"); setMinimumWidth(480); QTabWidget *tabWidget = new QTabWidget(); QString revisionStr; if (QString("%1").arg(VCS_REVISION) != "0") { revisionStr = "
" + tr("Revision") + " " + QString("%1").arg(VCS_REVISION); } QString appInfo = "" "
" "" "
" "

" + tr("Version") + " " + "" + QString(STRPRODUCTVER) + "" + QString(" (%1)").arg(STRDATE) + revisionStr + "

" + "
" + tr("QuiteRSS is a open-source cross-platform RSS/Atom news reader") + "

" + tr("Includes:") + QString(" Qt-%1, SQLite-%2, WebKit-%4"). arg(QT_VERSION_STR).arg(SQLITE_VERSION).arg(qWebKitVersion()) + "

" + QString("%1").arg("http://quiterss.org") + "

Copyright © 2011-2016 QuiteRSS Team " + QString("E-mail").arg("mailto:quiterssteam@gmail.com") + "

" "
"; QLabel *infoLabel = new QLabel(appInfo); infoLabel->setOpenExternalLinks(true); infoLabel->setTextInteractionFlags(Qt::TextBrowserInteraction); QHBoxLayout *mainLayout = new QHBoxLayout(); mainLayout->addWidget(infoLabel); QWidget *mainWidget = new QWidget(); mainWidget->setLayout(mainLayout); QTextEdit *authorsTextEdit = new QTextEdit(this); authorsTextEdit->setReadOnly(true); QFile file; file.setFileName(":/file/AUTHORS"); file.open(QFile::ReadOnly); authorsTextEdit->setText(QString::fromUtf8(file.readAll())); file.close(); QHBoxLayout *authorsLayout = new QHBoxLayout(); authorsLayout->addWidget(authorsTextEdit); QWidget *authorsWidget = new QWidget(); authorsWidget->setLayout(authorsLayout); QTextBrowser *historyTextBrowser = new QTextBrowser(); historyTextBrowser->setOpenExternalLinks(true); if (lang.contains("ru", Qt::CaseInsensitive)) file.setFileName(":/file/HISTORY_RU"); else file.setFileName(":/file/HISTORY_EN"); file.open(QFile::ReadOnly); historyTextBrowser->setHtml(QString::fromUtf8(file.readAll())); file.close(); QHBoxLayout *historyLayout = new QHBoxLayout(); historyLayout->addWidget(historyTextBrowser); QWidget *historyWidget = new QWidget(); historyWidget->setLayout(historyLayout); QTextEdit *licenseTextEdit = new QTextEdit(); licenseTextEdit->setReadOnly(true); file.setFileName(":/file/COPYING"); file.open(QFile::ReadOnly); QString str = QString(QString::fromUtf8(file.readAll())).section("-----", 1, 1); licenseTextEdit->setText(str); file.close(); QHBoxLayout *licenseLayout = new QHBoxLayout(); licenseLayout->addWidget(licenseTextEdit); QWidget *licenseWidget = new QWidget(); licenseWidget->setLayout(licenseLayout); QString portable; if (mainApp->isPortable()) { if (!mainApp->isPortableAppsCom()) portable = "(Portable)"; else portable = "(PortableApps)"; } Settings settings; QString information = "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "
" + tr("Version") + " " + QString("%1.%2 %3 %4").arg(STRPRODUCTVER).arg(VCS_REVISION).arg(portable).arg(STRDATE) + "
" + tr("Application directory:") + " " + QCoreApplication::applicationDirPath() + "
" + tr("Resource directory:") + " " + mainApp->resourcesDir() + "
" + tr("Data directory:") + " " + mainApp->dataDir() + "
" + tr("Backup directory:") + " " + mainApp->dataDir() + "/backup" + "
" + tr("Database file:") + " " + mainApp->dbFileName() + "
" + tr("Settings file:") + " " + settings.fileName() + "
" + tr("Log file:") + " " + mainApp->dataDir() + "/debug.log" + "
"; QTextEdit *informationTextEdit = new QTextEdit(); informationTextEdit->setReadOnly(true); informationTextEdit->setText(information); QHBoxLayout *informationLayout = new QHBoxLayout(); informationLayout->addWidget(informationTextEdit); QWidget *informationWidget = new QWidget(); informationWidget->setLayout(informationLayout); tabWidget->addTab(mainWidget, tr("Version")); tabWidget->addTab(authorsWidget, tr("Authors")); tabWidget->addTab(historyWidget, tr("History")); tabWidget->addTab(licenseWidget, tr("License")); tabWidget->addTab(informationWidget, tr("Information")); pageLayout->addWidget(tabWidget); buttonBox->addButton(QDialogButtonBox::Close); } quiterss-0.18.3/src/aboutdialog.h000066400000000000000000000021361265173051100167170ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ABOUTDIALOG_H #define ABOUTDIALOG_H #include "dialog.h" class AboutDialog : public Dialog { Q_OBJECT public: explicit AboutDialog(const QString &lang, QWidget *parent = 0); }; #endif // ABOUTDIALOG_H quiterss-0.18.3/src/adblock/000077500000000000000000000000001265173051100156515ustar00rootroot00000000000000quiterss-0.18.3/src/adblock/adblockaddsubscriptiondialog.cpp000066400000000000000000000130361265173051100242550ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblockaddsubscriptiondialog.h" #include "ui_adblockaddsubscriptiondialog.h" #include "mainapplication.h" #include "common.h" AdBlockAddSubscriptionDialog::AdBlockAddSubscriptionDialog(QWidget* parent) : QDialog(parent) , ui(new Ui::AdBlockAddSubscriptionDialog) { ui->setupUi(this); m_knownSubscriptions << Subscription("EasyList (English)", ADBLOCK_EASYLIST_URL) << Subscription("Adversity (English)", "https://raw.githubusercontent.com/Hubird-au/Adversity/master/Adversity.txt") << Subscription("BSI Lista Polska (Polish)", "http://www.bsi.info.pl/filtrABP.txt") << Subscription("Czech List (Czech)", "http://adblock.dajbych.net/adblock.txt") << Subscription("dutchblock (Dutch)", "http://groenewoudt.net/dutchblock/list.txt") << Subscription("Filtros Nauscopicos (Spanish)", "http://abp.mozilla-hispano.org/nauscopio/filtros.txt") << Subscription("hufilter (Hungarian)", "http://www.hufilter.hu/hufilter.txt") << Subscription("IsraelList (Hebrew)", "https://www.fanboy.co.nz/israelilist/IsraelList.txt") << Subscription("Lista Basa (Polish)", "https://plok.studentlive.pl/abp.txt") << Subscription("NLBlock (Dutch)", "http://www.verzijlbergh.com/adblock/nlblock.txt") << Subscription("Peter Lowe's list (English)", "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblockplus&mimetype=plaintext") << Subscription("PLgeneral (Polish)", "http://www.niecko.pl/adblock/adblock.txt") << Subscription("Schacks Adblock Plus liste (Danish)", "https://adblock.schack.dk/block.txt") << Subscription("Xfiles (Italian)", "http://mozilla.gfsolone.com/filtri.txt") << Subscription("EasyPrivacy (English)", "https://easylist-downloads.adblockplus.org/easyprivacy.txt") << Subscription("Antisocial (English)", "https://raw.githubusercontent.com/Hubird-au/Adversity/master/Antisocial.txt") << Subscription("RuAdList+EasyList (Russian, Ukrainian)", "https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt") << Subscription("RU AdList (Russian, Ukrainian)", "https://easylist-downloads.adblockplus.org/advblock.txt") << Subscription("ABPindo (Indonesian)", "https://raw.githubusercontent.com/heradhis/indonesianadblockrules/master/subscriptions/abpindo.txt") << Subscription("Easylist China (Chinese)", "https://easylist-downloads.adblockplus.org/easylistchina.txt") << Subscription("Malware Domains", "https://easylist-downloads.adblockplus.org/malwaredomains_full.txt"); foreach (const Subscription &subscription, m_knownSubscriptions) { ui->comboBox->addItem(subscription.title); } connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(indexChanged(int))); indexChanged(0); } QString AdBlockAddSubscriptionDialog::title() const { return ui->title->text(); } QString AdBlockAddSubscriptionDialog::url() const { return ui->url->text(); } void AdBlockAddSubscriptionDialog::indexChanged(int index) { const Subscription subscription = m_knownSubscriptions.at(index); // "Other..." entry if (subscription.url.isEmpty()) { ui->title->clear(); ui->url->clear(); } else { int pos = subscription.title.indexOf(QLatin1Char('(')); QString title = subscription.title; if (pos > 0) { title = title.left(pos).trimmed(); } ui->title->setText(title); ui->title->setCursorPosition(0); ui->url->setText(subscription.url); ui->url->setCursorPosition(0); } } AdBlockAddSubscriptionDialog::~AdBlockAddSubscriptionDialog() { delete ui; } quiterss-0.18.3/src/adblock/adblockaddsubscriptiondialog.h000066400000000000000000000047361265173051100237310ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADBLOCKADDSUBSCRIPTIONDIALOG_H #define ADBLOCKADDSUBSCRIPTIONDIALOG_H #include #include namespace Ui { class AdBlockAddSubscriptionDialog; } class AdBlockAddSubscriptionDialog : public QDialog { Q_OBJECT public: explicit AdBlockAddSubscriptionDialog(QWidget* parent = 0); ~AdBlockAddSubscriptionDialog(); QString title() const; QString url() const; private slots: void indexChanged(int index); private: Ui::AdBlockAddSubscriptionDialog* ui; struct Subscription { QString title; QString url; Subscription() {} Subscription(const QString &t, const QString &u) { title = t; url = u; } }; QVector m_knownSubscriptions; }; #endif // ADBLOCKADDSUBSCRIPTIONDIALOG_H quiterss-0.18.3/src/adblock/adblockaddsubscriptiondialog.ui000066400000000000000000000044411265173051100241100ustar00rootroot00000000000000 AdBlockAddSubscriptionDialog 0 0 557 162 Add Subscription Title: Address: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Add new subscription to AdBlock: buttonBox accepted() AdBlockAddSubscriptionDialog accept() 248 254 157 274 buttonBox rejected() AdBlockAddSubscriptionDialog reject() 316 260 286 274 quiterss-0.18.3/src/adblock/adblockblockednetworkreply.cpp000066400000000000000000000102471265173051100237720ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /** * Copyright (c) 2009, Benjamin C. Meyer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Benjamin Meyer 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 REGENTS 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 THE REGENTS 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. */ #include "adblockblockednetworkreply.h" #include "adblocksubscription.h" #include "adblockrule.h" #include #include AdBlockBlockedNetworkReply::AdBlockBlockedNetworkReply(const AdBlockRule* rule, QObject* parent) : QNetworkReply(parent) { setOperation(QNetworkAccessManager::GetOperation); setError(QNetworkReply::ContentAccessDenied, QString("AdBlock: %1 (%2)").arg(rule->subscription()->title(), rule->filter())); open(QIODevice::ReadOnly); QTimer::singleShot(0, this, SLOT(delayedFinished())); } void AdBlockBlockedNetworkReply::setRequest(const QNetworkRequest &request) { QNetworkReply::setRequest(request); setUrl(request.url()); } qint64 AdBlockBlockedNetworkReply::readData(char* data, qint64 maxSize) { Q_UNUSED(data); Q_UNUSED(maxSize); return -1; } void AdBlockBlockedNetworkReply::delayedFinished() { emit error(QNetworkReply::ContentAccessDenied); emit finished(); } quiterss-0.18.3/src/adblock/adblockblockednetworkreply.h000066400000000000000000000074021265173051100234360ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /** * Copyright (c) 2009, Benjamin C. Meyer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Benjamin Meyer 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 REGENTS 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 THE REGENTS 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. */ #ifndef ADBLOCKBLOCKEDNETWORKREPLY_H #define ADBLOCKBLOCKEDNETWORKREPLY_H #include class AdBlockRule; class AdBlockSubscription; class AdBlockBlockedNetworkReply : public QNetworkReply { Q_OBJECT public: AdBlockBlockedNetworkReply(const AdBlockRule* rule, QObject* parent = 0); void abort() {} void setRequest(const QNetworkRequest &request); protected: qint64 readData(char* data, qint64 maxSize); private slots: void delayedFinished(); }; #endif // ADBLOCKBLOCKEDNETWORKREPLY_H quiterss-0.18.3/src/adblock/adblockdialog.cpp000066400000000000000000000161561265173051100211450ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblockdialog.h" #include "adblockmanager.h" #include "adblocksubscription.h" #include "adblocktreewidget.h" #include "adblockaddsubscriptiondialog.h" #include "mainapplication.h" #include "mainwindow.h" #include "common.h" #include #include #include #include AdBlockDialog::AdBlockDialog(QWidget* parent) : QWidget(parent) , m_manager(AdBlockManager::instance()) , m_currentTreeWidget(0) , m_currentSubscription(0) , m_loaded(false) , m_useLimitedEasyList(false) { setAttribute(Qt::WA_DeleteOnClose); setupUi(this); const QRect screen = QApplication::desktop()->screenGeometry(); const QRect size = geometry(); move((screen.width() - size.width()) / 2, (screen.height() - size.height()) / 2); tabWidget->setDocumentMode(false); #ifdef Q_OS_MAC tabWidget->setDocumentMode(false); #endif adblockCheckBox->setChecked(m_manager->isEnabled()); buttonOptions->setText(buttonOptions->text() % " "); QMenu* menu = new QMenu(buttonOptions); m_actionAddRule = menu->addAction(tr("Add Rule"), this, SLOT(addRule())); m_actionRemoveRule = menu->addAction(tr("Remove Rule"), this, SLOT(removeRule())); menu->addSeparator(); m_actionAddSubscription = menu->addAction(tr("Add Subscription"), this, SLOT(addSubscription())); m_actionRemoveSubscription = menu->addAction(tr("Remove Subscription"), this, SLOT(removeSubscription())); menu->addAction(tr("Update Subscriptions"), m_manager, SLOT(updateAllSubscriptions())); menu->addSeparator(); menu->addAction(tr("Learn about writing rules..."), this, SLOT(learnAboutRules())); buttonOptions->setMenu(menu); connect(menu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowMenu())); connect(adblockCheckBox, SIGNAL(toggled(bool)), this, SLOT(enableAdBlock(bool))); connect(search, SIGNAL(textChanged(QString)), this, SLOT(filterString(QString))); connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int))); connect(buttonBox, SIGNAL(accepted()), this, SLOT(close())); load(); buttonBox->setFocus(); } void AdBlockDialog::showRule(const AdBlockRule* rule) const { AdBlockSubscription* subscription = rule->subscription(); if (!subscription) { return; } for (int i = 0; i < tabWidget->count(); ++i) { AdBlockTreeWidget* treeWidget = qobject_cast(tabWidget->widget(i)); if (subscription == treeWidget->subscription()) { treeWidget->showRule(rule); tabWidget->setCurrentIndex(i); break; } } } void AdBlockDialog::addRule() { m_currentTreeWidget->addRule(); } void AdBlockDialog::removeRule() { m_currentTreeWidget->removeRule(); } void AdBlockDialog::addSubscription() { AdBlockAddSubscriptionDialog dialog(this); if (dialog.exec() != QDialog::Accepted) { return; } QString title = dialog.title(); QString url = dialog.url(); if (AdBlockSubscription* subscription = m_manager->addSubscription(title, url)) { AdBlockTreeWidget* tree = new AdBlockTreeWidget(subscription, tabWidget); int index = tabWidget->insertTab(tabWidget->count() - 1, tree, subscription->title()); tabWidget->setCurrentIndex(index); } } void AdBlockDialog::removeSubscription() { if (m_manager->removeSubscription(m_currentSubscription)) { delete m_currentTreeWidget; } } void AdBlockDialog::currentChanged(int index) { if (index != -1) { m_currentTreeWidget = qobject_cast(tabWidget->widget(index)); m_currentSubscription = m_currentTreeWidget->subscription(); bool isEasyList = m_currentSubscription->url() == QUrl(ADBLOCK_EASYLIST_URL); useLimitedEasyList->setVisible(isEasyList); } } void AdBlockDialog::filterString(const QString &string) { if (m_currentTreeWidget && adblockCheckBox->isChecked()) { m_currentTreeWidget->filterString(string); } } void AdBlockDialog::enableAdBlock(bool state) { m_manager->setEnabled(state); if (state) { load(); } } void AdBlockDialog::aboutToShowMenu() { bool subscriptionEditable = m_currentSubscription && m_currentSubscription->canEditRules(); bool subscriptionRemovable = m_currentSubscription && m_currentSubscription->canBeRemoved(); m_actionAddRule->setEnabled(subscriptionEditable); m_actionRemoveRule->setEnabled(subscriptionEditable); m_actionRemoveSubscription->setEnabled(subscriptionRemovable); } void AdBlockDialog::learnAboutRules() { mainApp->mainWindow()->openNewsTab_ = NEW_TAB_FOREGROUND; mainApp->mainWindow()->createWebTab(QUrl("https://adblockplus.org/en/filters")); } void AdBlockDialog::loadSubscriptions() { for (int i = 0; i < tabWidget->count(); ++i) { AdBlockTreeWidget* treeWidget = qobject_cast(tabWidget->widget(i)); treeWidget->refresh(); } } void AdBlockDialog::load() { if (m_loaded || !adblockCheckBox->isChecked()) { return; } foreach (AdBlockSubscription* subscription, m_manager->subscriptions()) { AdBlockTreeWidget* tree = new AdBlockTreeWidget(subscription, tabWidget); tabWidget->addTab(tree, subscription->title()); } m_useLimitedEasyList = m_manager->useLimitedEasyList(); useLimitedEasyList->setChecked(m_useLimitedEasyList); m_loaded = true; QTimer::singleShot(50, this, SLOT(loadSubscriptions())); } void AdBlockDialog::closeEvent(QCloseEvent* ev) { if (useLimitedEasyList->isChecked() != m_useLimitedEasyList) { m_manager->setUseLimitedEasyList(useLimitedEasyList->isChecked()); } QWidget::closeEvent(ev); } quiterss-0.18.3/src/adblock/adblockdialog.h000066400000000000000000000054211265173051100206030ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADBLOCKDIALOG_H #define ADBLOCKDIALOG_H #include #include "ui_adblockdialog.h" class AdBlockSubscription; class AdBlockTreeWidget; class AdBlockManager; class AdBlockRule; class AdBlockDialog : public QWidget, public Ui_AdBlockDialog { Q_OBJECT public: explicit AdBlockDialog(QWidget* parent = 0); void showRule(const AdBlockRule* rule) const; private slots: void addRule(); void removeRule(); void addSubscription(); void removeSubscription(); void currentChanged(int index); void filterString(const QString &string); void enableAdBlock(bool state); void aboutToShowMenu(); void learnAboutRules(); void loadSubscriptions(); void load(); private: void closeEvent(QCloseEvent* ev); AdBlockManager* m_manager; AdBlockTreeWidget* m_currentTreeWidget; AdBlockSubscription* m_currentSubscription; QAction* m_actionAddRule; QAction* m_actionRemoveRule; QAction* m_actionAddSubscription; QAction* m_actionRemoveSubscription; bool m_loaded; bool m_useLimitedEasyList; }; #endif // ADBLOCKDIALOG_H quiterss-0.18.3/src/adblock/adblockdialog.ui000066400000000000000000000104211265173051100207650ustar00rootroot00000000000000 AdBlockDialog 0 0 546 462 AdBlock Configuration Enable AdBlock true Search... Qt::Horizontal QSizePolicy::Fixed 50 20 true 0 Options :/images/images/adblock.png:/images/images/adblock.png Qt::Horizontal 40 20 0 0 AdBlock -1 true Use only essential part of EasyList (for performance reasons) Qt::Horizontal QDialogButtonBox::Ok adblockCheckBox toggled(bool) adblockWidget setEnabled(bool) 106 39 349 74 quiterss-0.18.3/src/adblock/adblockicon.cpp000066400000000000000000000201451265173051100206270ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblockicon.h" #include "adblockrule.h" #include "adblockmanager.h" #include "adblocksubscription.h" #include "mainwindow.h" #include "webpage.h" #include #include AdBlockIcon::AdBlockIcon(MainWindow *window, QWidget *parent) : QToolButton(parent) , m_window(window) , m_menuAction(0) , m_flashTimer(0) , m_timerTicks(0) , m_enabled(false) { setFocusPolicy(Qt::NoFocus); setStyleSheet("QToolButton { border: none; padding: 0px; }"); connect(this, SIGNAL(clicked(QPoint)), this, SLOT(showMenu(QPoint))); connect(AdBlockManager::instance(), SIGNAL(enabledChanged(bool)), this, SLOT(setEnabled(bool))); } void AdBlockIcon::retranslateStrings() { setToolTip(tr("AdBlock lets you block unwanted content on web pages")); if (!m_enabled) return; AdBlockManager::instance()->customList()->retranslateStrings(); } void AdBlockIcon::popupBlocked(const QString &ruleString, const QUrl &url) { int index = ruleString.lastIndexOf(QLatin1String(" (")); const QString subscriptionName = ruleString.left(index); const QString filter = ruleString.mid(index + 2, ruleString.size() - index - 3); AdBlockSubscription* subscription = AdBlockManager::instance()->subscriptionByName(subscriptionName); if (filter.isEmpty() || !subscription) { return; } QPair pair; pair.first = new AdBlockRule(filter, subscription); pair.second = url; m_blockedPopups.append(pair); //!** FIXME // mApp->desktopNotifications()->showNotification(QPixmap(":images/images/adblock_big.png"), tr("Blocked popup window"), tr("AdBlock blocked unwanted popup window.")); if (!m_flashTimer) { m_flashTimer = new QTimer(this); } if (m_flashTimer->isActive()) { stopAnimation(); } m_flashTimer->setInterval(500); m_flashTimer->start(); connect(m_flashTimer, SIGNAL(timeout()), this, SLOT(animateIcon())); } QAction* AdBlockIcon::menuAction() { if (!m_menuAction) { m_menuAction = new QAction(tr("AdBlock"), this); m_menuAction->setMenu(new QMenu); connect(m_menuAction->menu(), SIGNAL(aboutToShow()), this, SLOT(createMenu())); } m_menuAction->setIcon(QIcon(m_enabled ? ":images/images/adblock.png" : ":images/images/adblock-disabled.png")); return m_menuAction; } void AdBlockIcon::createMenu(QMenu* menu) { if (!menu) { menu = qobject_cast(sender()); if (!menu) { return; } } menu->clear(); AdBlockManager* manager = AdBlockManager::instance(); AdBlockCustomList* customList = manager->customList(); WebPage* page = qobject_cast(m_window->currentNewsTab->webView_->page()); const QUrl pageUrl = page->mainFrame()->url(); menu->addAction(tr("Show AdBlock &Settings"), manager, SLOT(showDialog())); menu->addSeparator(); if (!pageUrl.host().isEmpty() && m_enabled && manager->canRunOnScheme(pageUrl.scheme())) { const QString host = pageUrl.host().contains(QLatin1String("www.")) ? pageUrl.host().mid(4) : pageUrl.host(); const QString hostFilter = QString("@@||%1^$document").arg(host); const QString pageFilter = QString("@@|%1|$document").arg(pageUrl.toString()); QAction* act = menu->addAction(tr("Disable on %1").arg(host)); act->setCheckable(true); act->setChecked(customList->containsFilter(hostFilter)); act->setData(hostFilter); connect(act, SIGNAL(triggered()), this, SLOT(toggleCustomFilter())); act = menu->addAction(tr("Disable only on this page")); act->setCheckable(true); act->setChecked(customList->containsFilter(pageFilter)); act->setData(pageFilter); connect(act, SIGNAL(triggered()), this, SLOT(toggleCustomFilter())); menu->addSeparator(); } if (!m_blockedPopups.isEmpty()) { menu->addAction(tr("Blocked Popup Windows"))->setEnabled(false); for (int i = 0; i < m_blockedPopups.count(); i++) { const QPair &pair = m_blockedPopups.at(i); QString address = pair.second.toString().right(55); QString actionText = tr("%1 with (%2)").arg(address, pair.first->filter()).replace(QLatin1Char('&'), QLatin1String("&&")); QAction* action = menu->addAction(actionText, manager, SLOT(showRule())); action->setData(QVariant::fromValue((void*)pair.first)); } } menu->addSeparator(); QVector entries = page->adBlockedEntries(); if (entries.isEmpty()) { menu->addAction(tr("No content blocked"))->setEnabled(false); } else { menu->addAction(tr("Blocked URL (AdBlock Rule) - click to edit rule"))->setEnabled(false); foreach (const WebPage::AdBlockedEntry &entry, entries) { QString address = entry.url.toString().right(55); QString actionText = tr("%1 with (%2)").arg(address, entry.rule->filter()).replace(QLatin1Char('&'), QLatin1String("&&")); QAction* action = menu->addAction(actionText, manager, SLOT(showRule())); action->setData(QVariant::fromValue((void*)entry.rule)); } } } void AdBlockIcon::showMenu(const QPoint &pos) { QMenu menu; createMenu(&menu); menu.exec(pos); } void AdBlockIcon::toggleCustomFilter() { QAction* action = qobject_cast(sender()); if (!action) { return; } const QString filter = action->data().toString(); AdBlockManager* manager = AdBlockManager::instance(); AdBlockCustomList* customList = manager->customList(); if (customList->containsFilter(filter)) { customList->removeFilter(filter); } else { AdBlockRule* rule = new AdBlockRule(filter, customList); customList->addRule(rule); } } void AdBlockIcon::animateIcon() { ++m_timerTicks; if (m_timerTicks > 10) { stopAnimation(); return; } if (icon().isNull()) { setIcon(QIcon(":images/images/adblock.png")); } else { setIcon(QIcon()); } } void AdBlockIcon::stopAnimation() { m_timerTicks = 0; m_flashTimer->stop(); disconnect(m_flashTimer, SIGNAL(timeout()), this, SLOT(animateIcon())); setEnabled(m_enabled); } void AdBlockIcon::setEnabled(bool enabled) { if (enabled) { setIcon(QIcon(":images/images/adblock.png")); } else { setIcon(QIcon(":images/images/adblock-disabled.png")); } m_enabled = enabled; } void AdBlockIcon::mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton && rect().contains(event->pos())) { if (event->modifiers() != Qt::ControlModifier) { emit clicked(event->globalPos()); } } else { QToolButton::mouseReleaseEvent(event); } } AdBlockIcon::~AdBlockIcon() { } quiterss-0.18.3/src/adblock/adblockicon.h000066400000000000000000000051461265173051100203000ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADBLOCKICON_H #define ADBLOCKICON_H #include #include "adblockrule.h" class QMenu; class QUrl; class MainWindow; class AdBlockIcon : public QToolButton { Q_OBJECT public: explicit AdBlockIcon(MainWindow *window, QWidget *parent = 0); ~AdBlockIcon(); void retranslateStrings(); void popupBlocked(const QString &ruleString, const QUrl &url); QAction* menuAction(); signals: void clicked(QPoint); public slots: void setEnabled(bool enabled); void createMenu(QMenu* menu = 0); private slots: void showMenu(const QPoint &pos); void toggleCustomFilter(); void animateIcon(); void stopAnimation(); private: void mouseReleaseEvent(QMouseEvent* event); MainWindow *m_window; QAction* m_menuAction; QVector > m_blockedPopups; QTimer* m_flashTimer; int m_timerTicks; bool m_enabled; }; #endif // ADBLOCKICON_H quiterss-0.18.3/src/adblock/adblockmanager.cpp000066400000000000000000000267711265173051100213240ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblockmanager.h" #include "adblockdialog.h" #include "adblockmatcher.h" #include "adblocksubscription.h" #include "adblockblockednetworkreply.h" #include "adblockicon.h" #include "common.h" #include "mainapplication.h" #include "networkmanager.h" #include "webpage.h" #include "settings.h" #include #include #include #include #include //#define ADBLOCK_DEBUG #ifdef ADBLOCK_DEBUG #include #endif AdBlockManager* AdBlockManager::s_adBlockManager = 0; AdBlockManager::AdBlockManager(QObject* parent) : QObject(parent) , m_loaded(false) , m_enabled(true) , m_useLimitedEasyList(true) , m_matcher(new AdBlockMatcher(this)) { load(); } AdBlockManager::~AdBlockManager() { qDeleteAll(m_subscriptions); } AdBlockManager* AdBlockManager::instance() { if (!s_adBlockManager) { s_adBlockManager = new AdBlockManager(mainApp->networkManager()); } return s_adBlockManager; } void AdBlockManager::setEnabled(bool enabled) { if (m_enabled == enabled) { return; } m_enabled = enabled; emit enabledChanged(enabled); Settings settings; settings.beginGroup("AdBlock"); settings.setValue("enabled", m_enabled); settings.endGroup(); load(); mainApp->reloadUserStyleBrowser(); } QList AdBlockManager::subscriptions() const { return m_subscriptions; } QNetworkReply* AdBlockManager::block(const QNetworkRequest &request) { #ifdef ADBLOCK_DEBUG QElapsedTimer timer; timer.start(); #endif const QString urlString = request.url().toEncoded().toLower(); const QString urlDomain = request.url().host().toLower(); const QString urlScheme = request.url().scheme().toLower(); if (!isEnabled() || !canRunOnScheme(urlScheme)) return 0; const AdBlockRule* blockedRule = m_matcher->match(request, urlDomain, urlString); if (blockedRule) { QVariant v = request.attribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100)); WebPage* webPage = static_cast(v.value()); if (WebPage::isPointerSafeToUse(webPage)) { if (!canBeBlocked(webPage->mainFrame()->url())) { return 0; } webPage->addAdBlockRule(blockedRule, request.url()); } AdBlockBlockedNetworkReply* reply = new AdBlockBlockedNetworkReply(blockedRule, this); reply->setRequest(request); #ifdef ADBLOCK_DEBUG qDebug() << "BLOCKED: " << timer.elapsed() << blockedRule->filter() << request.url(); #endif return reply; } #ifdef ADBLOCK_DEBUG qDebug() << timer.elapsed() << request.url(); #endif return 0; } QStringList AdBlockManager::disabledRules() const { return m_disabledRules; } void AdBlockManager::addDisabledRule(const QString &filter) { m_disabledRules.append(filter); } void AdBlockManager::removeDisabledRule(const QString &filter) { m_disabledRules.removeOne(filter); } AdBlockSubscription* AdBlockManager::addSubscription(const QString &title, const QString &url) { if (title.isEmpty() || url.isEmpty()) { return 0; } QString fileName = Common::filterCharsFromFilename(title.toLower()) + ".txt"; QString filePath = Common::ensureUniqueFilename(mainApp->dataDir() + "/adblock/" + fileName); QByteArray data = QString("Title: %1\nUrl: %2\n[Adblock Plus 1.1.1]").arg(title, url).toLatin1(); QFile file(filePath); if (!file.open(QFile::WriteOnly | QFile::Truncate)) { qWarning() << "AdBlockManager: Cannot write to file" << filePath; return 0; } file.write(data); file.close(); AdBlockSubscription* subscription = new AdBlockSubscription(title, this); subscription->setUrl(QUrl(url)); subscription->setFilePath(filePath); subscription->loadSubscription(m_disabledRules); m_subscriptions.insert(m_subscriptions.count() - 1, subscription); return subscription; } bool AdBlockManager::removeSubscription(AdBlockSubscription* subscription) { if (!m_subscriptions.contains(subscription) || !subscription->canBeRemoved()) { return false; } QFile(subscription->filePath()).remove(); m_subscriptions.removeOne(subscription); delete subscription; return true; } AdBlockCustomList* AdBlockManager::customList() const { foreach (AdBlockSubscription* subscription, m_subscriptions) { AdBlockCustomList* list = qobject_cast(subscription); if (list) { return list; } } return 0; } void AdBlockManager::load() { if (m_loaded) { return; } #ifdef ADBLOCK_DEBUG QElapsedTimer timer; timer.start(); #endif Settings settings; settings.beginGroup("AdBlock"); m_enabled = settings.value("enabled", m_enabled).toBool(); m_useLimitedEasyList = settings.value("useLimitedEasyList", m_useLimitedEasyList).toBool(); m_disabledRules = settings.value("disabledRules", QStringList()).toStringList(); QDateTime lastUpdate = settings.value("lastUpdate", QDateTime()).toDateTime(); settings.endGroup(); if (!m_enabled) { return; } QDir adblockDir(mainApp->dataDir() + "/adblock"); // Create if neccessary if (!adblockDir.exists()) { QDir(mainApp->dataDir()).mkdir("adblock"); } foreach (const QString &fileName, adblockDir.entryList(QStringList("*.txt"), QDir::Files)) { if (fileName == QLatin1String("customlist.txt")) { continue; } const QString absolutePath = adblockDir.absoluteFilePath(fileName); QFile file(absolutePath); if (!file.open(QFile::ReadOnly)) { continue; } QTextStream textStream(&file); textStream.setCodec("UTF-8"); QString title = textStream.readLine(1024).remove(QLatin1String("Title: ")); QUrl url = QUrl(textStream.readLine(1024).remove(QLatin1String("Url: "))); if (title.isEmpty() || !url.isValid()) { qWarning() << "AdBlockManager: Invalid subscription file" << absolutePath; continue; } AdBlockSubscription* subscription = new AdBlockSubscription(title, this); subscription->setUrl(url); subscription->setFilePath(absolutePath); m_subscriptions.append(subscription); } // Prepend EasyList if subscriptions are empty if (m_subscriptions.isEmpty()) { AdBlockSubscription* easyList = new AdBlockSubscription(tr("EasyList"), this); easyList->setUrl(QUrl(ADBLOCK_EASYLIST_URL)); easyList->setFilePath(mainApp->dataDir() + "/adblock/easylist.txt"); connect(easyList, SIGNAL(subscriptionUpdated()), mainApp, SLOT(reloadUserStyleBrowser())); m_subscriptions.prepend(easyList); } // Append CustomList AdBlockCustomList* customList = new AdBlockCustomList(this); m_subscriptions.append(customList); // Load all subscriptions foreach (AdBlockSubscription* subscription, m_subscriptions) { subscription->loadSubscription(m_disabledRules); connect(subscription, SIGNAL(subscriptionUpdated()), mainApp, SLOT(reloadUserStyleBrowser())); connect(subscription, SIGNAL(subscriptionChanged()), m_matcher, SLOT(update())); } if (lastUpdate.addDays(5) < QDateTime::currentDateTime()) { QTimer::singleShot(1000 * 60, this, SLOT(updateAllSubscriptions())); } #ifdef ADBLOCK_DEBUG qDebug() << "AdBlock loaded in" << timer.elapsed(); #endif m_matcher->update(); m_loaded = true; } void AdBlockManager::updateAllSubscriptions() { foreach (AdBlockSubscription* subscription, m_subscriptions) { subscription->updateSubscription(); } Settings settings; settings.beginGroup("AdBlock"); settings.setValue("lastUpdate", QDateTime::currentDateTime()); settings.endGroup(); } void AdBlockManager::save() { if (!m_loaded) { return; } foreach (AdBlockSubscription* subscription, m_subscriptions) { subscription->saveSubscription(); } Settings settings; settings.beginGroup("AdBlock"); settings.setValue("enabled", m_enabled); settings.setValue("useLimitedEasyList", m_useLimitedEasyList); settings.setValue("disabledRules", m_disabledRules); settings.endGroup(); } bool AdBlockManager::isEnabled() const { return m_enabled; } bool AdBlockManager::canRunOnScheme(const QString &scheme) const { return !(scheme == QLatin1String("file") || scheme == QLatin1String("qrc") || scheme == QLatin1String("qupzilla") || scheme == QLatin1String("data") || scheme == QLatin1String("abp")); } bool AdBlockManager::useLimitedEasyList() const { return m_useLimitedEasyList; } void AdBlockManager::setUseLimitedEasyList(bool useLimited) { m_useLimitedEasyList = useLimited; foreach (AdBlockSubscription* subscription, m_subscriptions) { if (subscription->url() == QUrl(ADBLOCK_EASYLIST_URL)) { subscription->updateSubscription(); } } } bool AdBlockManager::canBeBlocked(const QUrl &url) const { return !m_matcher->adBlockDisabledForUrl(url); } QString AdBlockManager::elementHidingRules() const { return m_matcher->elementHidingRules(); } QString AdBlockManager::elementHidingRulesForDomain(const QUrl &url) const { if (!isEnabled() || !canRunOnScheme(url.scheme()) || !canBeBlocked(url)) return QString(); // Acid3 doesn't like the way element hiding rules are embedded into page if (url.host() == QLatin1String("acid3.acidtests.org")) return QString(); return m_matcher->elementHidingRulesForDomain(url.host()); } AdBlockSubscription* AdBlockManager::subscriptionByName(const QString &name) const { foreach (AdBlockSubscription* subscription, m_subscriptions) { if (subscription->title() == name) { return subscription; } } return 0; } AdBlockDialog* AdBlockManager::showDialog() { if (!m_adBlockDialog) { m_adBlockDialog = new AdBlockDialog; } m_adBlockDialog.data()->show(); m_adBlockDialog.data()->raise(); m_adBlockDialog.data()->activateWindow(); return m_adBlockDialog.data(); } void AdBlockManager::showRule() { if (QAction* action = qobject_cast(sender())) { const AdBlockRule* rule = static_cast(action->data().value()); if (rule) { showDialog()->showRule(rule); } } } quiterss-0.18.3/src/adblock/adblockmanager.h000066400000000000000000000067171265173051100207670ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADBLOCKMANAGER_H #define ADBLOCKMANAGER_H #include #include #include class QUrl; class QNetworkReply; class QNetworkRequest; class AdBlockRule; class AdBlockDialog; class AdBlockMatcher; class AdBlockCustomList; class AdBlockSubscription; class AdBlockManager : public QObject { Q_OBJECT public: AdBlockManager(QObject* parent = 0); ~AdBlockManager(); static AdBlockManager* instance(); void load(); void save(); bool isEnabled() const; bool canRunOnScheme(const QString &scheme) const; bool useLimitedEasyList() const; void setUseLimitedEasyList(bool useLimited); QString elementHidingRules() const; QString elementHidingRulesForDomain(const QUrl &url) const; AdBlockSubscription* subscriptionByName(const QString &name) const; QList subscriptions() const; QNetworkReply* block(const QNetworkRequest &request); QStringList disabledRules() const; void addDisabledRule(const QString &filter); void removeDisabledRule(const QString &filter); AdBlockSubscription* addSubscription(const QString &title, const QString &url); bool removeSubscription(AdBlockSubscription* subscription); AdBlockCustomList* customList() const; signals: void enabledChanged(bool enabled); public slots: void setEnabled(bool enabled); void showRule(); void updateAllSubscriptions(); AdBlockDialog* showDialog(); private: inline bool canBeBlocked(const QUrl &url) const; bool m_loaded; bool m_enabled; bool m_useLimitedEasyList; QList m_subscriptions; static AdBlockManager* s_adBlockManager; AdBlockMatcher* m_matcher; QStringList m_disabledRules; QPointer m_adBlockDialog; }; #endif // ADBLOCKMANAGER_H quiterss-0.18.3/src/adblock/adblockmatcher.cpp000066400000000000000000000165451265173051100213330ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblockmatcher.h" #include "adblockmanager.h" #include "adblockrule.h" #include "adblocksubscription.h" #include "common.h" AdBlockMatcher::AdBlockMatcher(AdBlockManager* manager) : QObject(manager) , m_manager(manager) { connect(manager, SIGNAL(enabledChanged(bool)), this, SLOT(enabledChanged(bool))); } AdBlockMatcher::~AdBlockMatcher() { clear(); } const AdBlockRule* AdBlockMatcher::match(const QNetworkRequest &request, const QString &urlDomain, const QString &urlString) const { // Exception rules if (m_networkExceptionTree.find(request, urlDomain, urlString)) return 0; int count = m_networkExceptionRules.count(); for (int i = 0; i < count; ++i) { const AdBlockRule* rule = m_networkExceptionRules.at(i); if (rule->networkMatch(request, urlDomain, urlString)) return 0; } // Block rules if (const AdBlockRule* rule = m_networkBlockTree.find(request, urlDomain, urlString)) return rule; count = m_networkBlockRules.count(); for (int i = 0; i < count; ++i) { const AdBlockRule* rule = m_networkBlockRules.at(i); if (rule->networkMatch(request, urlDomain, urlString)) return rule; } return 0; } bool AdBlockMatcher::adBlockDisabledForUrl(const QUrl &url) const { int count = m_documentRules.count(); for (int i = 0; i < count; ++i) if (m_documentRules.at(i)->urlMatch(url)) return true; return false; } bool AdBlockMatcher::elemHideDisabledForUrl(const QUrl &url) const { if (adBlockDisabledForUrl(url)) return true; int count = m_elemhideRules.count(); for (int i = 0; i < count; ++i) if (m_elemhideRules.at(i)->urlMatch(url)) return true; return false; } QString AdBlockMatcher::elementHidingRules() const { return m_elementHidingRules; } QString AdBlockMatcher::elementHidingRulesForDomain(const QString &domain) const { QString rules; int addedRulesCount = 0; int count = m_domainRestrictedCssRules.count(); for (int i = 0; i < count; ++i) { const AdBlockRule* rule = m_domainRestrictedCssRules.at(i); if (!rule->matchDomain(domain)) continue; if (Q_UNLIKELY(addedRulesCount == 1000)) { rules.append(rule->cssSelector()); rules.append(QLatin1String("{display:none !important;}\n")); addedRulesCount = 0; } else { rules.append(rule->cssSelector() + QLatin1Char(',')); addedRulesCount++; } } if (addedRulesCount != 0) { rules = rules.left(rules.size() - 1); rules.append(QLatin1String("{display:none !important;}\n")); } return rules; } void AdBlockMatcher::update() { clear(); QHash cssRulesHash; QVector exceptionCssRules; foreach (AdBlockSubscription* subscription, m_manager->subscriptions()) { foreach (const AdBlockRule* rule, subscription->allRules()) { // Don't add internally disabled rules to cache if (rule->isInternalDisabled()) continue; if (rule->isCssRule()) { // We will add only enabled css rules to cache, because there is no enabled/disabled // check on match. They are directly embedded to pages. if (!rule->isEnabled()) continue; if (rule->isException()) exceptionCssRules.append(rule); else cssRulesHash.insert(rule->cssSelector(), rule); } else if (rule->isDocument()) { m_documentRules.append(rule); } else if (rule->isElemhide()) { m_elemhideRules.append(rule); } else if (rule->isException()) { if (!m_networkExceptionTree.add(rule)) m_networkExceptionRules.append(rule); } else { if (!m_networkBlockTree.add(rule)) m_networkBlockRules.append(rule); } } } foreach (const AdBlockRule* rule, exceptionCssRules) { const AdBlockRule* originalRule = cssRulesHash.value(rule->cssSelector()); // If we don't have this selector, the exception does nothing if (!originalRule) continue; AdBlockRule* copiedRule = originalRule->copy(); copiedRule->m_options |= AdBlockRule::DomainRestrictedOption; copiedRule->m_blockedDomains.append(rule->m_allowedDomains); cssRulesHash[rule->cssSelector()] = copiedRule; m_createdRules.append(copiedRule); } // Apparently, excessive amount of selectors for one CSS rule is not what WebKit likes. // (In my testings, 4931 is the number that makes it crash) // So let's split it by 1000 selectors... int hidingRulesCount = 0; QHashIterator it(cssRulesHash); while (it.hasNext()) { it.next(); const AdBlockRule* rule = it.value(); if (rule->isDomainRestricted()) { m_domainRestrictedCssRules.append(rule); } else if (Q_UNLIKELY(hidingRulesCount == 1000)) { m_elementHidingRules.append(rule->cssSelector()); m_elementHidingRules.append(QLatin1String("{display:none !important;} ")); hidingRulesCount = 0; } else { m_elementHidingRules.append(rule->cssSelector() + QLatin1Char(',')); hidingRulesCount++; } } if (hidingRulesCount != 0) { m_elementHidingRules = m_elementHidingRules.left(m_elementHidingRules.size() - 1); m_elementHidingRules.append(QLatin1String("{display:none !important;} ")); } } void AdBlockMatcher::clear() { m_networkExceptionTree.clear(); m_networkExceptionRules.clear(); m_networkBlockTree.clear(); m_networkBlockRules.clear(); m_domainRestrictedCssRules.clear(); m_elementHidingRules.clear(); m_documentRules.clear(); m_elemhideRules.clear(); qDeleteAll(m_createdRules); m_createdRules.clear(); } void AdBlockMatcher::enabledChanged(bool enabled) { if (enabled) update(); else clear(); } quiterss-0.18.3/src/adblock/adblockmatcher.h000066400000000000000000000056561265173051100210010ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADBLOCKMATCHER_H #define ADBLOCKMATCHER_H #include #include #include #include "adblocksearchtree.h" class AdBlockManager; class AdBlockRule; class AdBlockMatcher : public QObject { Q_OBJECT public: explicit AdBlockMatcher(AdBlockManager* manager); ~AdBlockMatcher(); const AdBlockRule* match(const QNetworkRequest &request, const QString &urlDomain, const QString &urlString) const; bool adBlockDisabledForUrl(const QUrl &url) const; bool elemHideDisabledForUrl(const QUrl &url) const; QString elementHidingRules() const; QString elementHidingRulesForDomain(const QString &domain) const; public slots: void update(); void clear(); private slots: void enabledChanged(bool enabled); private: AdBlockManager* m_manager; QVector m_createdRules; QVector m_networkExceptionRules; QVector m_networkBlockRules; QVector m_domainRestrictedCssRules; QVector m_documentRules; QVector m_elemhideRules; QString m_elementHidingRules; AdBlockSearchTree m_networkBlockTree; AdBlockSearchTree m_networkExceptionTree; }; #endif // ADBLOCKMATCHER_H quiterss-0.18.3/src/adblock/adblockrule.cpp000066400000000000000000000500101265173051100206400ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /** * Copyright (c) 2009, Zsombor Gegesy * Copyright (c) 2009, Benjamin C. Meyer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Benjamin Meyer 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 REGENTS 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 THE REGENTS 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. */ #include "adblockrule.h" #include "adblocksubscription.h" #include "common.h" #include #include #include #include #include #include #include // Version for Qt < 4.8 has one issue, it will wrongly // count .co.uk (and others) as second-level domain static QString toSecondLevelDomain(const QUrl &url) { #if QT_VERSION >= 0x040800 const QString topLevelDomain = url.topLevelDomain(); const QString urlHost = url.host(); if (topLevelDomain.isEmpty() || urlHost.isEmpty()) { return QString(); } QString domain = urlHost.left(urlHost.size() - topLevelDomain.size()); if (domain.count(QL1C('.')) == 0) { return urlHost; } while (domain.count(QL1C('.')) != 0) { domain = domain.mid(domain.indexOf(QL1C('.')) + 1); } return domain + topLevelDomain; #else QString domain = url.host(); if (domain.count(QL1C('.')) == 0) { return QString(); } while (domain.count(QL1C('.')) != 1) { domain = domain.mid(domain.indexOf(QL1C('.')) + 1); } return domain; #endif } AdBlockRule::AdBlockRule(const QString &filter, AdBlockSubscription* subscription) : m_subscription(subscription) , m_type(StringContainsMatchRule) , m_caseSensitivity(Qt::CaseInsensitive) , m_isEnabled(true) , m_isException(false) , m_isInternalDisabled(false) , m_regExp(0) { setFilter(filter); } AdBlockRule::~AdBlockRule() { delete m_regExp; } AdBlockRule* AdBlockRule::copy() const { AdBlockRule* rule = new AdBlockRule(); rule->m_subscription = m_subscription; rule->m_type = m_type; rule->m_options = m_options; rule->m_exceptions = m_exceptions; rule->m_filter = m_filter; rule->m_matchString = m_matchString; rule->m_caseSensitivity = m_caseSensitivity; rule->m_isEnabled = m_isEnabled; rule->m_isException = m_isException; rule->m_isInternalDisabled = m_isInternalDisabled; rule->m_allowedDomains = m_allowedDomains; rule->m_blockedDomains = m_blockedDomains; if (m_regExp) { rule->m_regExp = new RegExp; rule->m_regExp->regExp = m_regExp->regExp; rule->m_regExp->matchers = m_regExp->matchers; } return rule; } AdBlockSubscription* AdBlockRule::subscription() const { return m_subscription; } void AdBlockRule::setSubscription(AdBlockSubscription* subscription) { m_subscription = subscription; } QString AdBlockRule::filter() const { return m_filter; } void AdBlockRule::setFilter(const QString &filter) { m_filter = filter; parseFilter(); } bool AdBlockRule::isCssRule() const { return m_type == CssRule; } QString AdBlockRule::cssSelector() const { return m_matchString; } bool AdBlockRule::isDocument() const { return hasOption(DocumentOption); } bool AdBlockRule::isElemhide() const { return hasOption(ElementHideOption); } bool AdBlockRule::isDomainRestricted() const { return hasOption(DomainRestrictedOption); } bool AdBlockRule::isException() const { return m_isException; } bool AdBlockRule::isComment() const { return m_filter.startsWith(QL1C('!')); } bool AdBlockRule::isEnabled() const { return m_isEnabled; } void AdBlockRule::setEnabled(bool enabled) { m_isEnabled = enabled; } bool AdBlockRule::isSlow() const { return m_regExp != 0; } bool AdBlockRule::isInternalDisabled() const { return m_isInternalDisabled; } bool AdBlockRule::urlMatch(const QUrl &url) const { if (!hasOption(DocumentOption) && !hasOption(ElementHideOption)) { return false; } const QString encodedUrl = url.toEncoded(); const QString domain = url.host(); return networkMatch(QNetworkRequest(url), domain, encodedUrl); } bool AdBlockRule::networkMatch(const QNetworkRequest &request, const QString &domain, const QString &encodedUrl) const { if (m_type == CssRule || !m_isEnabled || m_isInternalDisabled) { return false; } bool matched = false; if (m_type == StringContainsMatchRule) { matched = encodedUrl.contains(m_matchString, m_caseSensitivity); } else if (m_type == DomainMatchRule) { matched = isMatchingDomain(domain, m_matchString); } else if (m_type == StringEndsMatchRule) { matched = encodedUrl.endsWith(m_matchString, m_caseSensitivity); } else if (m_type == RegExpMatchRule) { if (!isMatchingRegExpStrings(encodedUrl)) { return false; } matched = (m_regExp->regExp.indexIn(encodedUrl) != -1); } if (matched) { // Check domain restrictions if (hasOption(DomainRestrictedOption) && !matchDomain(domain)) { return false; } // Check third-party restriction if (hasOption(ThirdPartyOption) && !matchThirdParty(request)) { return false; } // Check object restrictions if (hasOption(ObjectOption) && !matchObject(request)) { return false; } // Check subdocument restriction if (hasOption(SubdocumentOption) && !matchSubdocument(request)) { return false; } // Check xmlhttprequest restriction if (hasOption(XMLHttpRequestOption) && !matchXmlHttpRequest(request)) { return false; } // Check image restriction if (hasOption(ImageOption) && !matchImage(encodedUrl)) { return false; } } return matched; } bool AdBlockRule::matchDomain(const QString &domain) const { if (!m_isEnabled) { return false; } if (!hasOption(DomainRestrictedOption)) { return true; } if (m_blockedDomains.isEmpty()) { foreach (const QString &d, m_allowedDomains) { if (isMatchingDomain(domain, d)) { return true; } } } else if (m_allowedDomains.isEmpty()) { foreach (const QString &d, m_blockedDomains) { if (isMatchingDomain(domain, d)) { return false; } } return true; } else { foreach (const QString &d, m_blockedDomains) { if (isMatchingDomain(domain, d)) { return false; } } foreach (const QString &d, m_allowedDomains) { if (isMatchingDomain(domain, d)) { return true; } } } return false; } bool AdBlockRule::matchThirdParty(const QNetworkRequest &request) const { const QString referer = request.attribute(QNetworkRequest::Attribute(QNetworkRequest::User + 151), QString()).toString(); if (referer.isEmpty()) { return false; } // Third-party matching should be performed on second-level domains const QString refererHost = toSecondLevelDomain(QUrl(referer)); const QString host = toSecondLevelDomain(request.url()); bool match = refererHost != host; return hasException(ThirdPartyOption) ? !match : match; } bool AdBlockRule::matchObject(const QNetworkRequest &request) const { bool match = request.attribute(QNetworkRequest::Attribute(QNetworkRequest::User + 150)).toString() == QL1S("object"); return hasException(ObjectOption) ? !match : match; } bool AdBlockRule::matchSubdocument(const QNetworkRequest &request) const { QWebFrame* originatingFrame = static_cast(request.originatingObject()); if (!originatingFrame) { return false; } QWebPage* page = originatingFrame->page(); if (!page) { return false; } bool match = !(originatingFrame == page->mainFrame()); return hasException(SubdocumentOption) ? !match : match; } bool AdBlockRule::matchXmlHttpRequest(const QNetworkRequest &request) const { bool match = request.rawHeader("X-Requested-With") == QByteArray("XMLHttpRequest"); return hasException(XMLHttpRequestOption) ? !match : match; } bool AdBlockRule::matchImage(const QString &encodedUrl) const { bool match = encodedUrl.endsWith(QL1S(".png")) || encodedUrl.endsWith(QL1S(".jpg")) || encodedUrl.endsWith(QL1S(".gif")) || encodedUrl.endsWith(QL1S(".jpeg")); return hasException(ImageOption) ? !match : match; } void AdBlockRule::parseFilter() { QString parsedLine = m_filter; // Empty rule or just comment if (m_filter.trimmed().isEmpty() || m_filter.startsWith(QL1C('!'))) { // We want to differentiate rule disabled by user and rule disabled in subscription file // m_isInternalDisabled is also used when rule is disabled due to all options not being supported m_isEnabled = false; m_isInternalDisabled = true; m_type = Invalid; return; } // CSS Element hiding rule if (parsedLine.contains(QL1S("##")) || parsedLine.contains(QL1S("#@#"))) { m_type = CssRule; int pos = parsedLine.indexOf(QL1C('#')); // Domain restricted rule if (!parsedLine.startsWith(QL1S("##"))) { QString domains = parsedLine.left(pos); parseDomains(domains, QL1C(',')); } m_isException = parsedLine.at(pos + 1) == QL1C('@'); m_matchString = parsedLine.mid(m_isException ? pos + 3 : pos + 2); // CSS rule cannot have more options -> stop parsing return; } // Exception always starts with @@ if (parsedLine.startsWith(QL1S("@@"))) { m_isException = true; parsedLine = parsedLine.mid(2); } // Parse all options following $ char int optionsIndex = parsedLine.indexOf(QL1C('$')); if (optionsIndex >= 0) { const QStringList options = parsedLine.mid(optionsIndex + 1).split(QL1C(','), QString::SkipEmptyParts); int handledOptions = 0; foreach (const QString &option, options) { if (option.startsWith(QL1S("domain="))) { parseDomains(option.mid(7), QL1C('|')); ++handledOptions; } else if (option == QL1S("match-case")) { m_caseSensitivity = Qt::CaseSensitive; ++handledOptions; } else if (option.endsWith(QL1S("third-party"))) { setOption(ThirdPartyOption); setException(ThirdPartyOption, option.startsWith(QL1C('~'))); ++handledOptions; } else if (option.endsWith(QL1S("object"))) { setOption(ObjectOption); setException(ObjectOption, option.startsWith(QL1C('~'))); ++handledOptions; } else if (option.endsWith(QL1S("subdocument"))) { setOption(SubdocumentOption); setException(SubdocumentOption, option.startsWith(QL1C('~'))); ++handledOptions; } else if (option.endsWith(QL1S("xmlhttprequest"))) { setOption(XMLHttpRequestOption); setException(XMLHttpRequestOption, option.startsWith(QL1C('~'))); ++handledOptions; } else if (option.endsWith(QL1S("image"))) { setOption(ImageOption); setException(ImageOption, option.startsWith(QL1C('~'))); ++handledOptions; } else if (option == QL1S("document") && m_isException) { setOption(DocumentOption); ++handledOptions; } else if (option == QL1S("elemhide") && m_isException) { setOption(ElementHideOption); ++handledOptions; } else if (option == QL1S("collapse")) { // Hiding placeholders of blocked elements is enabled by default ++handledOptions; } } // If we don't handle all options, it's safer to just disable this rule if (handledOptions != options.count()) { m_isInternalDisabled = true; m_type = Invalid; return; } parsedLine = parsedLine.left(optionsIndex); } // Rule is classic regexp if (parsedLine.startsWith(QL1C('/')) && parsedLine.endsWith(QL1C('/'))) { parsedLine = parsedLine.mid(1); parsedLine = parsedLine.left(parsedLine.size() - 1); m_type = RegExpMatchRule; m_regExp = new RegExp; m_regExp->regExp = QzRegExp(parsedLine, m_caseSensitivity); m_regExp->matchers = createStringMatchers(parseRegExpFilter(parsedLine)); return; } // Remove starting and ending wildcards (*) if (parsedLine.startsWith(QL1C('*'))) { parsedLine = parsedLine.mid(1); } if (parsedLine.endsWith(QL1C('*'))) { parsedLine = parsedLine.left(parsedLine.size() - 1); } // We can use fast string matching for domain here if (filterIsOnlyDomain(parsedLine)) { parsedLine = parsedLine.mid(2); parsedLine = parsedLine.left(parsedLine.size() - 1); m_type = DomainMatchRule; m_matchString = parsedLine; return; } // If rule contains only | at end, we can also use string matching if (filterIsOnlyEndsMatch(parsedLine)) { parsedLine = parsedLine.left(parsedLine.size() - 1); m_type = StringEndsMatchRule; m_matchString = parsedLine; return; } // If we still find a wildcard (*) or separator (^) or (|) // we must modify parsedLine to comply with QzRegExp if (parsedLine.contains(QL1C('*')) || parsedLine.contains(QL1C('^')) || parsedLine.contains(QL1C('|')) ) { m_type = RegExpMatchRule; m_regExp = new RegExp; m_regExp->regExp = QzRegExp(createRegExpFromFilter(parsedLine), m_caseSensitivity); m_regExp->matchers = createStringMatchers(parseRegExpFilter(parsedLine)); return; } // We haven't found anything that needs use of regexp, yay! m_type = StringContainsMatchRule; m_matchString = parsedLine; } void AdBlockRule::parseDomains(const QString &domains, const QChar &separator) { QStringList domainsList = domains.split(separator, QString::SkipEmptyParts); foreach (const QString domain, domainsList) { if (domain.isEmpty()) { continue; } if (domain.startsWith(QL1C('~'))) { m_blockedDomains.append(domain.mid(1)); } else { m_allowedDomains.append(domain); } } if (!m_blockedDomains.isEmpty() || !m_allowedDomains.isEmpty()) { setOption(DomainRestrictedOption); } } bool AdBlockRule::filterIsOnlyDomain(const QString &filter) const { if (!filter.endsWith(QL1C('^')) || !filter.startsWith(QL1S("||"))) return false; for (int i = 0; i < filter.size(); ++i) { switch (filter.at(i).toLatin1()) { case '/': case ':': case '?': case '=': case '&': case '*': return false; default: break; } } return true; } bool AdBlockRule::filterIsOnlyEndsMatch(const QString &filter) const { for (int i = 0; i < filter.size(); ++i) { switch (filter.at(i).toLatin1()) { case '^': case '*': return false; case '|': return i == filter.size() - 1; default: break; } } return false; } static bool wordCharacter(const QChar &c) { return c.isLetterOrNumber() || c.isMark() || c == QL1C('_'); } QString AdBlockRule::createRegExpFromFilter(const QString &filter) const { QString parsed; parsed.reserve(filter.size()); bool hadWildcard = false; // Filter multiple wildcards for (int i = 0; i < filter.size(); ++i) { const QChar c = filter.at(i); switch (c.toLatin1()) { case '^': parsed.append(QL1S("(?:[^\\w\\d\\-.%]|$)")); break; case '*': if (!hadWildcard) parsed.append(QL1S(".*")); break; case '|': if (i == 0) { if (filter.size() > 1 && filter.at(1) == QL1C('|')) { parsed.append(QL1S("^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?")); i++; } else { parsed.append('^'); } break; } else if (i == filter.size() - 1) { parsed.append(QL1C('$')); break; } // fallthrough default: if (!wordCharacter(c)) parsed.append(QL1C('\\') + c); else parsed.append(c); } hadWildcard = c == QL1C('*'); } return parsed; } QList AdBlockRule::createStringMatchers(const QStringList &filters) const { QList matchers; matchers.reserve(filters.size()); foreach (const QString &filter, filters) { matchers.append(QStringMatcher(filter, m_caseSensitivity)); } return matchers; } bool AdBlockRule::isMatchingDomain(const QString &domain, const QString &filter) const { return Common::matchDomain(filter, domain); } bool AdBlockRule::isMatchingRegExpStrings(const QString &url) const { Q_ASSERT(m_regExp); foreach (const QStringMatcher &matcher, m_regExp->matchers) { if (matcher.indexIn(url) == -1) return false; } return true; } // Split regexp filter into strings that can be used with QString::contains // Don't use parts that contains only 1 char and duplicated parts QStringList AdBlockRule::parseRegExpFilter(const QString &filter) const { QStringList list; int startPos = -1; for (int i = 0; i < filter.size(); ++i) { const QChar c = filter.at(i); // Meta characters in AdBlock rules are | * ^ if (c == QL1C('|') || c == QL1C('*') || c == QL1C('^')) { const QString sub = filter.mid(startPos, i - startPos); if (sub.size() > 1) list.append(sub); startPos = i + 1; } } const QString sub = filter.mid(startPos); if (sub.size() > 1) list.append(sub); list.removeDuplicates(); return list; } bool AdBlockRule::hasOption(const AdBlockRule::RuleOption &opt) const { return (m_options & opt); } bool AdBlockRule::hasException(const AdBlockRule::RuleOption &opt) const { return (m_exceptions & opt); } void AdBlockRule::setOption(const AdBlockRule::RuleOption &opt) { m_options |= opt; } void AdBlockRule::setException(const AdBlockRule::RuleOption &opt, bool on) { if (on) { m_exceptions |= opt; } } quiterss-0.18.3/src/adblock/adblockrule.h000066400000000000000000000150261265173051100203150ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /** * Copyright (c) 2009, Benjamin C. Meyer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Benjamin Meyer 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 REGENTS 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 THE REGENTS 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. */ #ifndef ADBLOCKRULE_H #define ADBLOCKRULE_H #include #include #include class QNetworkRequest; class QUrl; class AdBlockSubscription; class AdBlockRule { public: AdBlockRule(const QString &filter = QString(), AdBlockSubscription* subscription = 0); ~AdBlockRule(); AdBlockRule* copy() const; AdBlockSubscription* subscription() const; void setSubscription(AdBlockSubscription* subscription); QString filter() const; void setFilter(const QString &filter); bool isCssRule() const; QString cssSelector() const; bool isDocument() const; bool isElemhide() const; bool isDomainRestricted() const; bool isException() const; bool isComment() const; bool isEnabled() const; void setEnabled(bool enabled); bool isSlow() const; bool isInternalDisabled() const; bool urlMatch(const QUrl &url) const; bool networkMatch(const QNetworkRequest &request, const QString &domain, const QString &encodedUrl) const; bool matchDomain(const QString &domain) const; bool matchThirdParty(const QNetworkRequest &request) const; bool matchObject(const QNetworkRequest &request) const; bool matchSubdocument(const QNetworkRequest &request) const; bool matchXmlHttpRequest(const QNetworkRequest &request) const; bool matchImage(const QString &encodedUrl) const; protected: bool isMatchingDomain(const QString &domain, const QString &filter) const; bool isMatchingRegExpStrings(const QString &url) const; QStringList parseRegExpFilter(const QString &filter) const; private: enum RuleType { CssRule = 0, DomainMatchRule = 1, RegExpMatchRule = 2, StringEndsMatchRule = 3, StringContainsMatchRule = 4, Invalid = 5 }; enum RuleOption { DomainRestrictedOption = 1, ThirdPartyOption = 2, ObjectOption = 4, SubdocumentOption = 8, XMLHttpRequestOption = 16, ImageOption = 32, // Exception only options DocumentOption = 64, ElementHideOption = 128 }; Q_DECLARE_FLAGS(RuleOptions, RuleOption) inline bool hasOption(const RuleOption &opt) const; inline bool hasException(const RuleOption &opt) const; inline void setOption(const RuleOption &opt); inline void setException(const RuleOption &opt, bool on); void parseFilter(); void parseDomains(const QString &domains, const QChar &separator); bool filterIsOnlyDomain(const QString &filter) const; bool filterIsOnlyEndsMatch(const QString &filter) const; QString createRegExpFromFilter(const QString &filter) const; QList createStringMatchers(const QStringList &filters) const; AdBlockSubscription* m_subscription; RuleType m_type; RuleOptions m_options; RuleOptions m_exceptions; // Original rule filter QString m_filter; // Parsed rule for string matching (CSS Selector for CSS rules) QString m_matchString; // Case sensitivity for string matching Qt::CaseSensitivity m_caseSensitivity; bool m_isEnabled; bool m_isException; bool m_isInternalDisabled; QStringList m_allowedDomains; QStringList m_blockedDomains; struct RegExp { QzRegExp regExp; QList matchers; }; // Use dynamic allocation to save memory RegExp* m_regExp; friend class AdBlockMatcher; friend class AdBlockSearchTree; friend class AdBlockSubscription; }; #endif // ADBLOCKRULE_H quiterss-0.18.3/src/adblock/adblocksearchtree.cpp000066400000000000000000000077301265173051100220310ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblocksearchtree.h" #include "adblockrule.h" #include AdBlockSearchTree::AdBlockSearchTree() : m_root(new Node) { } AdBlockSearchTree::~AdBlockSearchTree() { deleteNode(m_root); } void AdBlockSearchTree::clear() { deleteNode(m_root); m_root = new Node; } bool AdBlockSearchTree::add(const AdBlockRule* rule) { if (rule->m_type != AdBlockRule::StringContainsMatchRule) { return false; } const QString filter = rule->m_matchString; int len = filter.size(); if (len <= 0) { qDebug() << "AdBlockSearchTree: Inserting rule with filter len <= 0!"; return false; } Node* node = m_root; for (int i = 0; i < len; ++i) { const QChar c = filter.at(i); if (!node->children.contains(c)) { Node* n = new Node; n->c = c; node->children[c] = n; } node = node->children[c]; } node->rule = rule; return true; } const AdBlockRule* AdBlockSearchTree::find(const QNetworkRequest &request, const QString &domain, const QString &urlString) const { int len = urlString.size(); if (len <= 0) { return 0; } const QChar* string = urlString.constData(); for (int i = 0; i < len; ++i) { const AdBlockRule* rule = prefixSearch(request, domain, urlString, string++, len - i); if (rule) { return rule; } } return 0; } const AdBlockRule* AdBlockSearchTree::prefixSearch(const QNetworkRequest &request, const QString &domain, const QString &urlString, const QChar* string, int len) const { if (len <= 0) { return 0; } QChar c = string[0]; if (!m_root->children.contains(c)) { return 0; } Node* node = m_root->children[c]; for (int i = 1; i < len; ++i) { const QChar c = (++string)[0]; if (node->rule && node->rule->networkMatch(request, domain, urlString)) { return node->rule; } if (!node->children.contains(c)) { return 0; } node = node->children[c]; } if (node->rule && node->rule->networkMatch(request, domain, urlString)) { return node->rule; } return 0; } void AdBlockSearchTree::deleteNode(AdBlockSearchTree::Node* node) { if (!node) { return; } QHashIterator i(node->children); while (i.hasNext()) { i.next(); deleteNode(i.value()); } delete node; } quiterss-0.18.3/src/adblock/adblocksearchtree.h000066400000000000000000000050061265173051100214700ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2013-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADBLOCKSEARCHTREE_H #define ADBLOCKSEARCHTREE_H #include #include class QNetworkRequest; class AdBlockRule; class AdBlockSearchTree { public: explicit AdBlockSearchTree(); ~AdBlockSearchTree(); void clear(); bool add(const AdBlockRule* rule); const AdBlockRule* find(const QNetworkRequest &request, const QString &domain, const QString &urlString) const; private: struct Node { QChar c; const AdBlockRule* rule; QHash children; Node() : c(0) , rule(0) { } }; const AdBlockRule* prefixSearch(const QNetworkRequest &request, const QString &domain, const QString &urlString, const QChar* string, int len) const; void deleteNode(Node* node); Node* m_root; }; #endif // ADBLOCKSEARCHTREE_H quiterss-0.18.3/src/adblock/adblocksubscription.cpp000066400000000000000000000301731265173051100224250ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /** * Copyright (c) 2009, Benjamin C. Meyer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Benjamin Meyer 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 REGENTS 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 THE REGENTS 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. */ #include "adblocksubscription.h" #include "adblockmanager.h" #include "adblocksearchtree.h" #include "followredirectreply.h" #include "mainapplication.h" #include "networkmanager.h" #include "common.h" #include #include #include #include #include AdBlockSubscription::AdBlockSubscription(const QString &title, QObject* parent) : QObject(parent) , m_reply(0) , m_title(title) , m_updated(false) { } QString AdBlockSubscription::title() const { return m_title; } void AdBlockSubscription::setTitle(const QString &title) { m_title = title; } QString AdBlockSubscription::filePath() const { return m_filePath; } void AdBlockSubscription::setFilePath(const QString &path) { m_filePath = path; } QUrl AdBlockSubscription::url() const { return m_url; } void AdBlockSubscription::setUrl(const QUrl &url) { m_url = url; } void AdBlockSubscription::loadSubscription(const QStringList &disabledRules) { QFile file(m_filePath); if (!file.exists()) { QTimer::singleShot(0, this, SLOT(updateSubscription())); return; } if (!file.open(QFile::ReadOnly)) { qWarning() << "AdBlockSubscription::" << __FUNCTION__ << "Unable to open adblock file for reading" << m_filePath; QTimer::singleShot(0, this, SLOT(updateSubscription())); return; } QTextStream textStream(&file); textStream.setCodec("UTF-8"); // Header is on 3rd line textStream.readLine(1024); textStream.readLine(1024); QString header = textStream.readLine(1024); if (!header.startsWith(QLatin1String("[Adblock")) || m_title.isEmpty()) { qWarning() << "AdBlockSubscription::" << __FUNCTION__ << "invalid format of adblock file" << m_filePath; QTimer::singleShot(0, this, SLOT(updateSubscription())); return; } m_rules.clear(); while (!textStream.atEnd()) { AdBlockRule* rule = new AdBlockRule(textStream.readLine(), this); if (disabledRules.contains(rule->filter())) { rule->setEnabled(false); } m_rules.append(rule); } // Initial update if (m_rules.isEmpty() && !m_updated) { QTimer::singleShot(0, this, SLOT(updateSubscription())); } } void AdBlockSubscription::saveSubscription() { } void AdBlockSubscription::updateSubscription() { if (m_reply || !m_url.isValid()) { return; } m_reply = new FollowRedirectReply(m_url, mainApp->networkManager()); connect(m_reply, SIGNAL(finished()), this, SLOT(subscriptionDownloaded())); } void AdBlockSubscription::subscriptionDownloaded() { if (m_reply != qobject_cast(sender())) { return; } bool error = false; const QByteArray response = QString::fromUtf8(m_reply->readAll()).toUtf8(); if (m_reply->error() != QNetworkReply::NoError || !response.startsWith(QByteArray("[Adblock")) || !saveDownloadedData(response) ) { error = true; } m_reply->deleteLater(); m_reply = 0; if (error) { emit subscriptionError(tr("Cannot load subscription!")); return; } loadSubscription(AdBlockManager::instance()->disabledRules()); emit subscriptionUpdated(); emit subscriptionChanged(); } bool AdBlockSubscription::saveDownloadedData(const QByteArray &data) { QFile file(m_filePath); if (!file.open(QFile::ReadWrite | QFile::Truncate)) { qWarning() << "AdBlockSubscription::" << __FUNCTION__ << "Unable to open adblock file for writing:" << m_filePath; return false; } // Write subscription header file.write(QString("Title: %1\nUrl: %2\n").arg(title(), url().toString()).toUtf8()); if (AdBlockManager::instance()->useLimitedEasyList() && m_url == QUrl(ADBLOCK_EASYLIST_URL)) { // Third-party advertisers rules are with start domain (||) placeholder which needs regexps // So we are ignoring it for keeping good performance // But we will use whitelist rules at the end of list QByteArray part1 = data.left(data.indexOf(QLatin1String("!-----------------------------Third-party adverts-----------------------------!"))); QByteArray part2 = data.mid(data.indexOf(QLatin1String("!---------------------------------Whitelists----------------------------------!"))); file.write(part1); file.write(part2); file.close(); return true; } file.write(data); file.close(); return true; } const AdBlockRule* AdBlockSubscription::rule(int offset) const { if (!(offset >= 0 && m_rules.count() > offset)) { return 0; } return m_rules[offset]; } QVector AdBlockSubscription::allRules() const { return m_rules; } const AdBlockRule* AdBlockSubscription::enableRule(int offset) { if (!(offset >= 0 && m_rules.count() > offset)) { return 0; } AdBlockRule* rule = m_rules[offset]; rule->setEnabled(true); AdBlockManager::instance()->removeDisabledRule(rule->filter()); emit subscriptionChanged(); if (rule->isCssRule()) mainApp->reloadUserStyleBrowser(); return rule; } const AdBlockRule* AdBlockSubscription::disableRule(int offset) { if (!(offset >= 0 && m_rules.count() > offset)) { return 0; } AdBlockRule* rule = m_rules[offset]; rule->setEnabled(false); AdBlockManager::instance()->addDisabledRule(rule->filter()); emit subscriptionChanged(); if (rule->isCssRule()) mainApp->reloadUserStyleBrowser(); return rule; } bool AdBlockSubscription::canEditRules() const { return false; } bool AdBlockSubscription::canBeRemoved() const { return true; } int AdBlockSubscription::addRule(AdBlockRule* rule) { Q_UNUSED(rule) return -1; } bool AdBlockSubscription::removeRule(int offset) { Q_UNUSED(offset) return false; } const AdBlockRule* AdBlockSubscription::replaceRule(AdBlockRule* rule, int offset) { Q_UNUSED(rule) Q_UNUSED(offset) return 0; } AdBlockSubscription::~AdBlockSubscription() { qDeleteAll(m_rules); } // AdBlockCustomList AdBlockCustomList::AdBlockCustomList(QObject* parent) : AdBlockSubscription(tr("Custom Rules"), parent) { setFilePath(mainApp->dataDir() + "/adblock/customlist.txt"); } void AdBlockCustomList::retranslateStrings() { setTitle(tr("Custom Rules")); } void AdBlockCustomList::loadSubscription(const QStringList &disabledRules) { // DuckDuckGo ad whitelist rules // They cannot be removed, but can be disabled. // Please consider not disabling them. Thanks! const QString ddg1 = QSL("@@||duckduckgo.com^$document"); const QString ddg2 = QSL("duckduckgo.com#@#.has-ad"); const QString rules = Common::readAllFileContents(filePath()); QFile file(filePath()); if (file.open(QFile::WriteOnly | QFile::Append)) { QTextStream stream(&file); stream.setCodec("UTF-8"); if (!rules.contains(ddg1 + QLatin1String("\n"))) stream << ddg1 << endl; if (!rules.contains(QLatin1String("\n") + ddg2)) stream << ddg2 << endl; } file.close(); AdBlockSubscription::loadSubscription(disabledRules); } void AdBlockCustomList::saveSubscription() { QFile file(filePath()); if (!file.open(QFile::ReadWrite | QFile::Truncate)) { qWarning() << "AdBlockSubscription::" << __FUNCTION__ << "Unable to open adblock file for writing:" << filePath(); return; } QTextStream textStream(&file); textStream.setCodec("UTF-8"); textStream << "Title: " << title() << endl; textStream << "Url: " << url().toString() << endl; textStream << "[Adblock Plus 1.1.1]" << endl; foreach (const AdBlockRule* rule, m_rules) { textStream << rule->filter() << endl; } file.close(); } bool AdBlockCustomList::canEditRules() const { return true; } bool AdBlockCustomList::canBeRemoved() const { return false; } bool AdBlockCustomList::containsFilter(const QString &filter) const { foreach (const AdBlockRule* rule, m_rules) { if (rule->filter() == filter) { return true; } } return false; } bool AdBlockCustomList::removeFilter(const QString &filter) { for (int i = 0; i < m_rules.count(); ++i) { const AdBlockRule* rule = m_rules.at(i); if (rule->filter() == filter) { return removeRule(i); } } return false; } int AdBlockCustomList::addRule(AdBlockRule* rule) { m_rules.append(rule); emit subscriptionChanged(); if (rule->isCssRule()) mainApp->reloadUserStyleBrowser(); return m_rules.count() - 1; } bool AdBlockCustomList::removeRule(int offset) { if (!(offset >= 0 && m_rules.count() > offset)) { return false; } AdBlockRule* rule = m_rules.at(offset); const QString filter = rule->filter(); m_rules.remove(offset); emit subscriptionChanged(); if (rule->isCssRule()) mainApp->reloadUserStyleBrowser(); AdBlockManager::instance()->removeDisabledRule(filter); delete rule; return true; } const AdBlockRule* AdBlockCustomList::replaceRule(AdBlockRule* rule, int offset) { if (!(offset >= 0 && m_rules.count() > offset)) { return 0; } AdBlockRule* oldRule = m_rules.at(offset); m_rules[offset] = rule; emit subscriptionChanged(); if (rule->isCssRule() || oldRule->isCssRule()) mainApp->reloadUserStyleBrowser(); delete oldRule; return m_rules[offset]; } quiterss-0.18.3/src/adblock/adblocksubscription.h000066400000000000000000000124741265173051100220760ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /** * Copyright (c) 2009, Benjamin C. Meyer * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * 3. Neither the name of the Benjamin Meyer 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 REGENTS 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 THE REGENTS 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. */ #ifndef ADBLOCKSUBSCRIPTION_H #define ADBLOCKSUBSCRIPTION_H #include #include #include "adblockrule.h" #include "adblocksearchtree.h" class QNetworkRequest; class QNetworkReply; class QUrl; class FollowRedirectReply; class AdBlockSubscription : public QObject { Q_OBJECT public: explicit AdBlockSubscription(const QString &title, QObject* parent = 0); ~AdBlockSubscription(); QString title() const; void setTitle(const QString &title); QString filePath() const; void setFilePath(const QString &path); QUrl url() const; void setUrl(const QUrl &url); virtual void loadSubscription(const QStringList &disabledRules); virtual void saveSubscription(); const AdBlockRule* rule(int offset) const; QVector allRules() const; const AdBlockRule* enableRule(int offset); const AdBlockRule* disableRule(int offset); virtual bool canEditRules() const; virtual bool canBeRemoved() const; virtual int addRule(AdBlockRule* rule); virtual bool removeRule(int offset); virtual const AdBlockRule* replaceRule(AdBlockRule* rule, int offset); public slots: void updateSubscription(); signals: void subscriptionChanged(); void subscriptionUpdated(); void subscriptionError(const QString &message); protected slots: void subscriptionDownloaded(); protected: virtual bool saveDownloadedData(const QByteArray &data); FollowRedirectReply* m_reply; QVector m_rules; private: QString m_title; QString m_filePath; QUrl m_url; bool m_updated; }; class AdBlockCustomList : public AdBlockSubscription { Q_OBJECT public: explicit AdBlockCustomList(QObject* parent = 0); void retranslateStrings(); void loadSubscription(const QStringList &disabledRules); void saveSubscription(); bool canEditRules() const; bool canBeRemoved() const; bool containsFilter(const QString &filter) const; bool removeFilter(const QString &filter); int addRule(AdBlockRule* rule); bool removeRule(int offset); const AdBlockRule* replaceRule(AdBlockRule* rule, int offset); }; #endif // ADBLOCKSUBSCRIPTION_H quiterss-0.18.3/src/adblock/adblocktreewidget.cpp000066400000000000000000000233321265173051100220430ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "adblocktreewidget.h" #include "adblocksubscription.h" #include #include #include #include #include AdBlockTreeWidget::AdBlockTreeWidget(AdBlockSubscription* subscription, QWidget* parent) : QTreeWidget(parent) , m_subscription(subscription) , m_topItem(0) , m_itemChangingBlock(false) , m_refreshAllItemsNeeded(true) { setContextMenuPolicy(Qt::CustomContextMenu); setHeaderHidden(true); setAlternatingRowColors(true); setFrameStyle(QFrame::NoFrame); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuRequested(QPoint))); connect(this, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(itemChanged(QTreeWidgetItem*))); connect(m_subscription, SIGNAL(subscriptionUpdated()), this, SLOT(subscriptionUpdated())); connect(m_subscription, SIGNAL(subscriptionError(QString)), this, SLOT(subscriptionError(QString))); } AdBlockSubscription* AdBlockTreeWidget::subscription() const { return m_subscription; } void AdBlockTreeWidget::showRule(const AdBlockRule* rule) { if (!m_topItem && rule) { m_ruleToBeSelected = rule->filter(); } else if (!m_ruleToBeSelected.isEmpty()) { QList items = findItems(m_ruleToBeSelected, Qt::MatchRecursive); if (!items.isEmpty()) { QTreeWidgetItem* item = items.at(0); setCurrentItem(item); scrollToItem(item, QAbstractItemView::PositionAtCenter); } m_ruleToBeSelected.clear(); } } void AdBlockTreeWidget::contextMenuRequested(const QPoint &pos) { if (!m_subscription->canEditRules()) { return; } QTreeWidgetItem* item = itemAt(pos); if (!item) { return; } QMenu menu; menu.addAction(tr("Add Rule"), this, SLOT(addRule())); menu.addSeparator(); QAction* deleteAction = menu.addAction(tr("Remove Rule"), this, SLOT(removeRule())); if (!item->parent()) { deleteAction->setDisabled(true); } menu.exec(viewport()->mapToGlobal(pos)); } void AdBlockTreeWidget::itemChanged(QTreeWidgetItem* item) { m_refreshAllItemsNeeded = true; if (!item || m_itemChangingBlock) { return; } m_itemChangingBlock = true; int offset = item->data(0, Qt::UserRole + 10).toInt(); const AdBlockRule* oldRule = m_subscription->rule(offset); if (item->checkState(0) == Qt::Unchecked && oldRule->isEnabled()) { // Disable rule const AdBlockRule* rule = m_subscription->disableRule(offset); adjustItemFeatures(item, rule); } else if (item->checkState(0) == Qt::Checked && !oldRule->isEnabled()) { // Enable rule const AdBlockRule* rule = m_subscription->enableRule(offset); adjustItemFeatures(item, rule); } else if (m_subscription->canEditRules()) { // Custom rule has been changed AdBlockRule* newRule = new AdBlockRule(item->text(0), m_subscription); const AdBlockRule* rule = m_subscription->replaceRule(newRule, offset); adjustItemFeatures(item, rule); } m_itemChangingBlock = false; } void AdBlockTreeWidget::copyFilter() { QTreeWidgetItem* item = currentItem(); if (!item) { return; } QApplication::clipboard()->setText(item->text(0)); } void AdBlockTreeWidget::addRule() { if (!m_subscription->canEditRules()) { return; } QString newRule = QInputDialog::getText(this, tr("Add Custom Rule"), tr("Please write your rule here:")); if (newRule.isEmpty()) { return; } AdBlockRule* rule = new AdBlockRule(newRule, m_subscription); int offset = m_subscription->addRule(rule); QTreeWidgetItem* item = new QTreeWidgetItem(); item->setText(0, newRule); item->setData(0, Qt::UserRole + 10, offset); item->setFlags(item->flags() | Qt::ItemIsEditable); m_itemChangingBlock = true; m_topItem->addChild(item); m_itemChangingBlock = false; adjustItemFeatures(item, rule); } void AdBlockTreeWidget::removeRule() { QTreeWidgetItem* item = currentItem(); if (!item || !m_subscription->canEditRules() || item == m_topItem) { return; } int offset = item->data(0, Qt::UserRole + 10).toInt(); m_subscription->removeRule(offset); delete item; } void AdBlockTreeWidget::subscriptionUpdated() { refresh(); m_itemChangingBlock = true; m_topItem->setText(0, tr("%1 (recently updated)").arg(m_subscription->title())); m_itemChangingBlock = false; } void AdBlockTreeWidget::subscriptionError(const QString &message) { refresh(); m_itemChangingBlock = true; m_topItem->setText(0, tr("%1 (Error: %2)").arg(m_subscription->title(), message)); m_itemChangingBlock = false; } void AdBlockTreeWidget::adjustItemFeatures(QTreeWidgetItem* item, const AdBlockRule* rule) { if (!rule->isEnabled()) { QFont font; font.setItalic(true); item->setForeground(0, QColor(Qt::gray)); if (!rule->isComment()) { item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(0, Qt::Unchecked); item->setFont(0, font); } return; } item->setFlags(item->flags() | Qt::ItemIsUserCheckable); item->setCheckState(0, Qt::Checked); if (rule->isException()) { item->setForeground(0, QColor(Qt::darkGreen)); item->setFont(0, QFont()); } else if (rule->isCssRule()) { item->setForeground(0, QColor(Qt::darkBlue)); item->setFont(0, QFont()); } else { item->setForeground(0, QColor()); item->setFont(0, QFont()); } } void AdBlockTreeWidget::keyPressEvent(QKeyEvent* event) { if (event->key() == Qt::Key_C && event->modifiers() & Qt::ControlModifier) { copyFilter(); } if (event->key() == Qt::Key_Delete) { removeRule(); } QTreeWidget::keyPressEvent(event); } void AdBlockTreeWidget::refresh() { m_itemChangingBlock = true; clear(); QFont boldFont; boldFont.setBold(true); m_topItem = new QTreeWidgetItem(this); m_topItem->setText(0, m_subscription->title()); m_topItem->setFont(0, boldFont); m_topItem->setExpanded(true); addTopLevelItem(m_topItem); const QVector &allRules = m_subscription->allRules(); int index = 0; foreach (const AdBlockRule* rule, allRules) { QTreeWidgetItem* item = new QTreeWidgetItem(m_topItem); item->setText(0, rule->filter()); item->setData(0, Qt::UserRole + 10, index); if (m_subscription->canEditRules()) { item->setFlags(item->flags() | Qt::ItemIsEditable); } adjustItemFeatures(item, rule); ++index; } showRule(0); m_itemChangingBlock = false; } void AdBlockTreeWidget::clear() { QTreeWidget::clear(); m_allTreeItems.clear(); } void AdBlockTreeWidget::addTopLevelItem(QTreeWidgetItem* item) { m_allTreeItems.append(item); QTreeWidget::addTopLevelItem(item); } void AdBlockTreeWidget::iterateAllItems(QTreeWidgetItem* parent) { int count = parent ? parent->childCount() : topLevelItemCount(); for (int i = 0; i < count; i++) { QTreeWidgetItem* item = parent ? parent->child(i) : topLevelItem(i); if (item->childCount() == 0) { m_allTreeItems.append(item); } iterateAllItems(item); } } QList AdBlockTreeWidget::allItems() { if (m_refreshAllItemsNeeded) { m_allTreeItems.clear(); iterateAllItems(0); m_refreshAllItemsNeeded = false; } return m_allTreeItems; } void AdBlockTreeWidget::filterString(const QString &string) { QList _allItems = allItems(); QList parents; bool stringIsEmpty = string.isEmpty(); foreach (QTreeWidgetItem* item, _allItems) { bool containsString = stringIsEmpty || item->text(0).contains(string, Qt::CaseInsensitive); if (containsString) { item->setHidden(false); if (item->parent()) { if (!parents.contains(item->parent())) { parents << item->parent(); } } } else { item->setHidden(true); if (item->parent()) { item->parent()->setHidden(true); } } } for (int i = 0; i < parents.size(); ++i) { QTreeWidgetItem* parentItem = parents.at(i); parentItem->setHidden(false); parentItem->setExpanded(true); if (parentItem->parent() && !parents.contains(parentItem->parent())) { parents << parentItem->parent(); } } } quiterss-0.18.3/src/adblock/adblocktreewidget.h000066400000000000000000000056311265173051100215120ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADBLOCKTREEWIDGET_H #define ADBLOCKTREEWIDGET_H #include class AdBlockSubscription; class AdBlockRule; class AdBlockTreeWidget : public QTreeWidget { Q_OBJECT public: explicit AdBlockTreeWidget(AdBlockSubscription* subscription, QWidget* parent = 0); AdBlockSubscription* subscription() const; void showRule(const AdBlockRule* rule); void refresh(); public slots: void addRule(); void removeRule(); void filterString(const QString &string); void clear(); private slots: void contextMenuRequested(const QPoint &pos); void itemChanged(QTreeWidgetItem* item); void copyFilter(); void subscriptionUpdated(); void subscriptionError(const QString &message); private: void adjustItemFeatures(QTreeWidgetItem* item, const AdBlockRule* rule); void keyPressEvent(QKeyEvent* event); void addTopLevelItem(QTreeWidgetItem* item); QList allItems(); void iterateAllItems(QTreeWidgetItem* parent); AdBlockSubscription* m_subscription; QTreeWidgetItem* m_topItem; QString m_ruleToBeSelected; bool m_itemChangingBlock; bool m_refreshAllItemsNeeded; QList m_allTreeItems; }; #endif // ADBLOCKTREEWIDGET_H quiterss-0.18.3/src/adblock/followredirectreply.cpp000066400000000000000000000061011265173051100224530ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "followredirectreply.h" #include FollowRedirectReply::FollowRedirectReply(const QUrl &url, QNetworkAccessManager* manager) : QObject() , m_manager(manager) , m_redirectCount(0) { m_reply = m_manager->get(QNetworkRequest(url)); connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished())); } QNetworkReply* FollowRedirectReply::reply() const { return m_reply; } QUrl FollowRedirectReply::originalUrl() const { return m_reply->request().url(); } QUrl FollowRedirectReply::url() const { return m_reply->url(); } QNetworkReply::NetworkError FollowRedirectReply::error() const { return m_reply->error(); } QByteArray FollowRedirectReply::readAll() { return m_reply->readAll(); } void FollowRedirectReply::replyFinished() { int replyStatus = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if ((replyStatus != 301 && replyStatus != 302) || m_redirectCount == 5) { emit finished(); return; } m_redirectCount++; QUrl redirectUrl = m_reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); m_reply->close(); m_reply->deleteLater(); m_reply = m_manager->get(QNetworkRequest(redirectUrl)); connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished())); } FollowRedirectReply::~FollowRedirectReply() { m_reply->close(); m_reply->deleteLater(); } quiterss-0.18.3/src/adblock/followredirectreply.h000066400000000000000000000046261265173051100221320ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FOLLOWREDIRECTREPLY_H #define FOLLOWREDIRECTREPLY_H #include #include class QNetworkAccessManager; class QNetworkReply; class QUrl; class FollowRedirectReply : public QObject { Q_OBJECT public: explicit FollowRedirectReply(const QUrl &url, QNetworkAccessManager* manager); ~FollowRedirectReply(); QNetworkReply* reply() const; QUrl originalUrl() const; QUrl url() const; QNetworkReply::NetworkError error() const; QByteArray readAll(); signals: void finished(); private slots: void replyFinished(); private: QNetworkAccessManager* m_manager; QNetworkReply* m_reply; int m_redirectCount; }; #endif // FOLLOWREDIRECTREPLY_H quiterss-0.18.3/src/addfeedwizard.cpp000066400000000000000000000563761265173051100175740ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "addfeedwizard.h" #include "mainapplication.h" #include "addfolderdialog.h" #include "authenticationdialog.h" #include "toolbutton.h" #include "settings.h" #include #include extern QString kCreateNewsTableQuery; AddFeedWizard::AddFeedWizard(QWidget *parent, int curFolderId) : QWizard(parent), curFolderId_(curFolderId) { setModal(true); setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Add Feed")); setWizardStyle(QWizard::ModernStyle); setOptions(QWizard::HaveFinishButtonOnEarlyPages | QWizard::NoBackButtonOnStartPage); addPage(createUrlFeedPage()); addPage(createNameFeedPage()); updateFeeds_ = new UpdateFeeds(this, true); connect(button(QWizard::BackButton), SIGNAL(clicked()), this, SLOT(backButtonClicked())); connect(button(QWizard::NextButton), SIGNAL(clicked()), this, SLOT(nextButtonClicked())); connect(button(QWizard::FinishButton), SIGNAL(clicked()), this, SLOT(finishButtonClicked())); connect(this, SIGNAL(currentIdChanged(int)), SLOT(slotCurrentIdChanged(int)), Qt::QueuedConnection); resize(400, 300); Settings settings; restoreGeometry(settings.value("addFeedWizard/geometry").toByteArray()); } AddFeedWizard::~AddFeedWizard() { Settings settings; settings.setValue("addFeedWizard/geometry", saveGeometry()); updateFeeds_->disconnectObjects(); delete updateFeeds_; } /*virtual*/ void AddFeedWizard::done(int result) { if (result == QDialog::Rejected) { if (progressBar_->isVisible() || (currentId() == 1)) deleteFeed(); } QWizard::done(result); } void AddFeedWizard::changeEvent(QEvent *event) { if ((event->type() == QEvent::ActivationChange) && isActiveWindow() && (currentId() == 0) && urlFeedEdit_->isEnabled()) { QClipboard *clipboard_ = QApplication::clipboard(); QString clipboardStr = clipboard_->text().left(8); if (clipboardStr.contains("http://", Qt::CaseInsensitive) || clipboardStr.contains("https://", Qt::CaseInsensitive) || clipboardStr.contains("www.", Qt::CaseInsensitive) || clipboardStr.contains("feed://", Qt::CaseInsensitive) || clipboardStr.contains("file://", Qt::CaseInsensitive)) { urlFeedEdit_->setText(clipboard_->text()); urlFeedEdit_->selectAll(); urlFeedEdit_->setFocus(); } } } QWizardPage *AddFeedWizard::createUrlFeedPage() { QWizardPage *page = new QWizardPage; page->setTitle(tr("Create New Feed")); selectedPage = false; finishOn = false; urlFeedEdit_ = new LineEdit(this); urlFeedEdit_->setText("http://"); titleFeedAsName_ = new QCheckBox( tr("Use title of the feed as displayed name"), this); titleFeedAsName_->setChecked(true); authentication_ = new QGroupBox(this); authentication_->setTitle(tr("Server requires authentication:")); authentication_->setCheckable(true); authentication_->setChecked(false); user_ = new LineEdit(this); pass_ = new LineEdit(this); pass_->setEchoMode(QLineEdit::Password); QGridLayout *authenticationLayout = new QGridLayout(); authenticationLayout->addWidget(new QLabel(tr("Username:")), 0, 0); authenticationLayout->addWidget(user_, 0, 1); authenticationLayout->addWidget(new QLabel(tr("Password:")), 1, 0); authenticationLayout->addWidget(pass_, 1, 1); authentication_->setLayout(authenticationLayout); QLabel *iconWarning = new QLabel(this); iconWarning->setPixmap(QPixmap(":/images/warning")); textWarning = new QLabel(this); QFont font = textWarning->font(); font.setBold(true); textWarning->setFont(font); QHBoxLayout *warningLayout = new QHBoxLayout(); warningLayout->setMargin(0); warningLayout->addWidget(iconWarning); warningLayout->addWidget(textWarning, 1); warningWidget_ = new QWidget(this); warningWidget_->setLayout(warningLayout); progressBar_ = new QProgressBar(this); progressBar_->setObjectName("progressBar_"); progressBar_->setTextVisible(false); progressBar_->setFixedHeight(15); progressBar_->setMinimum(0); progressBar_->setMaximum(0); progressBar_->setVisible(false); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(new QLabel(tr("Feed URL or website address:"))); layout->addWidget(urlFeedEdit_); layout->addWidget(titleFeedAsName_); layout->addSpacing(10); layout->addWidget(authentication_); layout->addStretch(1); layout->addWidget(warningWidget_); layout->addWidget(progressBar_); page->setLayout(layout); connect(urlFeedEdit_, SIGNAL(textChanged(const QString&)), this, SLOT(urlFeedEditChanged(const QString&))); connect(titleFeedAsName_, SIGNAL(stateChanged(int)), this, SLOT(titleFeedAsNameStateChanged(int))); return page; } QWizardPage *AddFeedWizard::createNameFeedPage() { QWizardPage *page = new QWizardPage; page->setTitle(tr("Create New Feed")); page->setFinalPage(false); nameFeedEdit_ = new LineEdit(this); foldersTree_ = new QTreeWidget(this); foldersTree_->setObjectName("foldersTree_"); foldersTree_->setColumnCount(2); foldersTree_->setColumnHidden(1, true); foldersTree_->header()->hide(); QStringList treeItem; treeItem << tr("Feeds") << "Id"; foldersTree_->setHeaderLabels(treeItem); treeItem.clear(); treeItem << tr("All Feeds") << "0"; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/folder")); foldersTree_->addTopLevelItem(treeWidgetItem); foldersTree_->setCurrentItem(treeWidgetItem); QSqlQuery q; QQueue parentIds; parentIds.enqueue(0); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); QString qStr = QString("SELECT text, id FROM feeds WHERE parentId='%1' AND (xmlUrl='' OR xmlUrl IS NULL)"). arg(parentId); q.exec(qStr); while (q.next()) { QString folderText = q.value(0).toString(); QString folderId = q.value(1).toString(); QStringList treeItem; treeItem << folderText << folderId; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/folder")); QList treeItems = foldersTree_->findItems(QString::number(parentId), Qt::MatchFixedString | Qt::MatchRecursive, 1); treeItems.at(0)->addChild(treeWidgetItem); if (folderId.toInt() == curFolderId_) foldersTree_->setCurrentItem(treeWidgetItem); parentIds.enqueue(folderId.toInt()); } } foldersTree_->expandAll(); foldersTree_->sortByColumn(0, Qt::AscendingOrder); ToolButton *newFolderButton = new ToolButton(this); newFolderButton->setIcon(QIcon(":/images/addT")); newFolderButton->setToolTip(tr("New Folder...")); newFolderButton->setAutoRaise(true); QHBoxLayout *newFolderLayout = new QHBoxLayout; newFolderLayout->setMargin(0); newFolderLayout->addWidget(newFolderButton); newFolderLayout->addStretch(); QVBoxLayout *newFolderVLayout = new QVBoxLayout; newFolderVLayout->setMargin(2); newFolderVLayout->addStretch(); newFolderVLayout->addLayout(newFolderLayout); foldersTree_->setLayout(newFolderVLayout); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(new QLabel(tr("Displayed name:"))); layout->addWidget(nameFeedEdit_); layout->addWidget(new QLabel(tr("Location:"))); layout->addWidget(foldersTree_); page->setLayout(layout); connect(nameFeedEdit_, SIGNAL(textChanged(const QString&)), this, SLOT(nameFeedEditChanged(const QString&))); connect(newFolderButton, SIGNAL(clicked()), this, SLOT(newFolder())); return page; } void AddFeedWizard::setUrlFeed(const QString &feedUrl) { urlFeedEdit_->setText(feedUrl); } void AddFeedWizard::urlFeedEditChanged(const QString& text) { button(QWizard::NextButton)->setEnabled( !text.isEmpty() && (text != "http://")); bool buttonEnable = false; if (titleFeedAsName_->isChecked() && (text != "http://") && !text.isEmpty()) { buttonEnable = true; } warningWidget_->setVisible(false); button(QWizard::FinishButton)->setEnabled(buttonEnable); } void AddFeedWizard::titleFeedAsNameStateChanged(int state) { bool buttonEnable = false; if ((state == Qt::Checked) && (urlFeedEdit_->text() != "http://") && !urlFeedEdit_->text().isEmpty()) { buttonEnable = true; } button(QWizard::FinishButton)->setEnabled(buttonEnable); } void AddFeedWizard::nameFeedEditChanged(const QString& text) { button(QWizard::FinishButton)->setEnabled(!text.isEmpty()); } void AddFeedWizard::backButtonClicked() { deleteFeed(); nameFeedEdit_->clear(); page(0)->setEnabled(true); selectedPage = false; } void AddFeedWizard::nextButtonClicked() { if (currentId() == 0) addFeed(); } void AddFeedWizard::finishButtonClicked() { if (currentId() == 0) { finishOn = true; addFeed(); } else if (currentId() == 1) { finish(); } } void AddFeedWizard::addFeed() { // Set URL-schema for URL-address "http://" or leave it "https://" feedUrlString_ = urlFeedEdit_->text().simplified(); if (feedUrlString_.contains("feed:", Qt::CaseInsensitive)) { if (feedUrlString_.contains("https://", Qt::CaseInsensitive)) { feedUrlString_.remove(0, 5); urlFeedEdit_->setText(feedUrlString_); } else { feedUrlString_.remove(0, 7); urlFeedEdit_->setText("http://" + feedUrlString_); } } QUrl feedUrl(urlFeedEdit_->text().simplified()); if (feedUrl.scheme().isEmpty()) { feedUrl.setUrl("http://" % urlFeedEdit_->text().simplified()); } feedUrlString_ = feedUrl.toString(); urlFeedEdit_->setText(feedUrlString_); #if QT_VERSION >= 0x040800 if (feedUrl.host().isEmpty() && !feedUrl.isLocalFile()) { #else if (feedUrl.host().isEmpty() && (feedUrl.scheme() != "file")) { #endif textWarning->setText(tr("URL error!")); warningWidget_->setVisible(true); return; } QSqlQuery q; int duplicateFoundId = -1; q.prepare("SELECT id FROM feeds WHERE xmlUrl LIKE :xmlUrl"); q.bindValue(":xmlUrl", feedUrlString_); q.exec(); if (q.first()) duplicateFoundId = q.value(0).toInt(); if (0 <= duplicateFoundId) { textWarning->setText(tr("Duplicate feed!")); warningWidget_->setVisible(true); } else { button(QWizard::NextButton)->setEnabled(false); button(QWizard::CancelButton)->setEnabled(false); button(QWizard::FinishButton)->setEnabled(false); page(0)->setEnabled(false); showProgressBar(); // Calculate row's number to insert new feed int rowToParent = 0; q.exec("SELECT count(id) FROM feeds WHERE parentId=0"); if (q.next()) rowToParent = q.value(0).toInt(); int auth = 0; QString userInfo; if (authentication_->isChecked()) { auth = 1; userInfo = QString("%1:%2").arg(user_->text()).arg(pass_->text()); } // Insert feed q.prepare("INSERT INTO feeds(xmlUrl, created, rowToParent, authentication) " "VALUES (:feedUrl, :feedCreateTime, :rowToParent, :authentication)"); q.bindValue(":feedUrl", feedUrlString_); q.bindValue(":feedCreateTime", QLocale::c().toString(QDateTime::currentDateTimeUtc(), "yyyy-MM-ddTHH:mm:ss")); q.bindValue(":rowToParent", rowToParent); q.bindValue(":authentication", auth); q.exec(); feedId_ = q.lastInsertId().toInt(); q.finish(); if (feedUrlString_.contains(":COOKIE:", Qt::CaseInsensitive)) { int index = feedUrlString_.lastIndexOf(":COOKIE:", -1, Qt::CaseInsensitive); QString cookieStr = feedUrlString_.right(feedUrlString_.length() - index - 8); QStringList cookieStrList = cookieStr.split(";"); QList loadedCookies; foreach (QString cookieStr, cookieStrList) { const QList &cookieList = QNetworkCookie::parseCookies(cookieStr.toUtf8()); if (cookieList.isEmpty()) { continue; } QNetworkCookie cookie = cookieList.at(0); QDateTime date = QDateTime::currentDateTime(); date = date.addYears(35); cookie.setExpirationDate(date); loadedCookies.append(cookie); } mainApp->cookieJar()->setCookiesFromUrl(loadedCookies, feedUrlString_); } emit signalRequestUrl(feedId_, feedUrlString_, QDateTime(), userInfo); } } void AddFeedWizard::deleteFeed() { QSqlQuery q; q.exec(QString("DELETE FROM feeds WHERE id='%1'").arg(feedId_)); q.exec(QString("DELETE FROM news WHERE feedId='%1'").arg(feedId_)); // Correct rowToParent field QList idList; q.exec("SELECT id FROM feeds WHERE parentId=0 ORDER BY rowToParent"); while (q.next()) { idList << q.value(0).toInt(); } for (int i = 0; i < idList.count(); i++) { q.exec(QString("UPDATE feeds SET rowToParent='%1' WHERE id=='%2'"). arg(i).arg(idList.at(i))); } q.finish(); } void AddFeedWizard::slotCurrentIdChanged(int idPage) { if (idPage == 0) urlFeedEditChanged(urlFeedEdit_->text()); else if (idPage == 1) nameFeedEditChanged(nameFeedEdit_->text()); } /*virtual*/ bool AddFeedWizard::validateCurrentPage() { if (!selectedPage) { return false; } return true; } void AddFeedWizard::showProgressBar() { progressBar_->show(); QTimer::singleShot(250, this, SLOT(slotProgressBarUpdate())); } void AddFeedWizard::slotProgressBarUpdate() { progressBar_->update(); if (progressBar_->isVisible()) QTimer::singleShot(250, this, SLOT(slotProgressBarUpdate())); } void AddFeedWizard::getUrlDone(int result, int feedId, QString feedUrlStr, QString error, QByteArray data, QDateTime dtReply, QString codecName) { if (!data.isEmpty()) { bool isFeed = false; QString errorStr; int errorLine; int errorColumn; QDomDocument doc("parseDoc"); if (!doc.setContent(data, false, &errorStr, &errorLine, &errorColumn)) { qWarning() << QString("Parse data error (1): url %1, id %2, line %3, column %4: %5"). arg(feedUrlStr).arg(feedId). arg(errorLine).arg(errorColumn).arg(errorStr); } else { QDomElement docElem = doc.documentElement(); if ((docElem.tagName() == "rss") || (docElem.tagName() == "feed") || (docElem.tagName() == "rdf:RDF")) isFeed = true; } if (!isFeed) { QString str = QString::fromUtf8(data); QzRegExp rx("]+(atom|rss)\\+xml[^>]+>", Qt::CaseInsensitive); int pos = rx.indexIn(str); if (pos > -1) { str = rx.cap(0); rx.setPattern("href=\"([^\"]+)"); pos = rx.indexIn(str); if (pos > -1) { QString linkFeedString = rx.cap(1); linkFeedString.replace("&", "&", Qt::CaseInsensitive); QUrl url(linkFeedString); QUrl feedUrl(feedUrlStr); if (url.host().isEmpty()) { url.setScheme(feedUrl.scheme()); url.setHost(feedUrl.host()); if (feedUrl.toString().indexOf('?') > -1) { str = feedUrl.path(); str = str.left(str.lastIndexOf('/')+1); url.setPath(str+url.path()); } } linkFeedString = url.toString(); qDebug() << "Parse feed URL, valid:" << linkFeedString; QSqlQuery q; int duplicateFoundId = -1; q.prepare("SELECT id FROM feeds WHERE xmlUrl LIKE :xmlUrl"); q.bindValue(":xmlUrl", linkFeedString); q.exec(); if (q.next()) duplicateFoundId = q.value(0).toInt(); if (0 <= duplicateFoundId) { if (feedUrlString_ != linkFeedString) textWarning->setText(tr("Duplicate feed!")); else textWarning->setText(tr("Can't find feed URL!")); warningWidget_->setVisible(true); deleteFeed(); progressBar_->hide(); page(0)->setEnabled(true); selectedPage = false; button(QWizard::CancelButton)->setEnabled(true); } else { feedUrlString_ = linkFeedString; q.prepare("UPDATE feeds SET xmlUrl = :xmlUrl WHERE id == :id"); q.bindValue(":xmlUrl", linkFeedString); q.bindValue(":id", feedId); q.exec(); authentication_->setChecked(false); emit signalRequestUrl(feedId, linkFeedString, QDateTime(), ""); } } } if (pos < 0) { textWarning->setText(tr("Can't find feed URL!")); warningWidget_->setVisible(true); deleteFeed(); progressBar_->hide(); page(0)->setEnabled(true); selectedPage = false; button(QWizard::CancelButton)->setEnabled(true); } return; } emit xmlReadyParse(data, feedId, dtReply, codecName); } if ((result < 0) || data.isEmpty()) { if ((result >= -5) && (result <= -1)) textWarning->setText(error); else textWarning->setText(tr("Request failed!")); warningWidget_->setVisible(true); qWarning() << QString("Request failed: result = %1, error - %2, url - %3"). arg(result).arg(error).arg(feedUrlStr); deleteFeed(); progressBar_->hide(); page(0)->setEnabled(true); selectedPage = false; button(QWizard::CancelButton)->setEnabled(true); } } void AddFeedWizard::slotUpdateFeed(int feedId, bool, int newCount, QString) { qDebug() << "ParseDone: " << feedUrlString_; selectedPage = true; newCount_ = newCount; if (titleFeedAsName_->isChecked()) { QSqlQuery q; q.exec(QString("SELECT title FROM feeds WHERE id=='%1'").arg(feedId)); if (q.first()) nameFeedEdit_->setText(q.value(0).toString()); nameFeedEdit_->selectAll(); nameFeedEdit_->setFocus(); } if (!finishOn) { button(QWizard::CancelButton)->setEnabled(true); next(); } else { finish(); } progressBar_->hide(); } void AddFeedWizard::finish() { QSqlQuery q; q.exec(QString("SELECT htmlUrl FROM feeds WHERE id=='%1'").arg(feedId_)); if (q.first()) htmlUrlString_ = q.value(0).toString(); feedParentId_ = foldersTree_->currentItem()->text(1).toInt(); // Correct rowToParent field QList idList; q.exec("SELECT id FROM feeds WHERE parentId=0 ORDER BY rowToParent"); while (q.next()) { if (feedId_ != q.value(0).toInt()) idList << q.value(0).toInt(); } for (int i = 0; i < idList.count(); i++) { q.exec(QString("UPDATE feeds SET rowToParent='%1' WHERE id=='%2'"). arg(i).arg(idList.at(i))); } // Calculate row number to insert feed int rowToParent = 0; q.exec(QString("SELECT count(id) FROM feeds WHERE parentId='%1' AND id!='%2'"). arg(feedParentId_).arg(feedId_)); if (q.next()) rowToParent = q.value(0).toInt(); int auth = 0; if (authentication_->isChecked()) auth = 1; q.prepare("UPDATE feeds SET text = ?, parentId = ?, rowToParent = ?, authentication = ? WHERE id == ?"); q.addBindValue(nameFeedEdit_->text()); q.addBindValue(feedParentId_); q.addBindValue(rowToParent); q.addBindValue(auth); q.addBindValue(feedId_); q.exec(); if (auth) { QUrl url(feedUrlString_); QString server = url.host(); q.prepare("SELECT * FROM passwords WHERE server=?"); q.addBindValue(server); q.exec(); if (!q.next()) { q.prepare("INSERT INTO passwords (server, username, password) " "VALUES (:server, :username, :password)"); q.bindValue(":server", server); q.bindValue(":username", user_->text()); q.bindValue(":password", pass_->text().toUtf8().toBase64()); q.exec(); } } if (feedParentId_) { q.prepare("SELECT columns, sort, sortType, " "updateIntervalEnable, updateInterval, updateIntervalType, " "displayEmbeddedImages, displayNews, layoutDirection, " "javaScriptEnable " "FROM feeds WHERE id=?"); q.addBindValue(feedParentId_); q.exec(); if (q.next()) { QSqlQuery q1; q1.prepare("UPDATE feeds SET columns = ?, sort = ?, sortType = ?, " "updateIntervalEnable = ?, updateInterval = ?, updateIntervalType = ?, " "displayEmbeddedImages = ?, displayNews = ?, layoutDirection = ?, " "javaScriptEnable = ? " "WHERE id == ?"); q1.addBindValue(q.value(0).toString()); q1.addBindValue(q.value(1).toInt()); q1.addBindValue(q.value(2).toInt()); q1.addBindValue(q.value(3).toInt()); q1.addBindValue(q.value(4).toInt()); q1.addBindValue(q.value(5).toInt()); q1.addBindValue(q.value(6).toInt()); q1.addBindValue(q.value(7).toInt()); q1.addBindValue(q.value(8).toInt()); q1.addBindValue(q.value(9).toInt()); q1.addBindValue(feedId_); q1.exec(); } } accept(); } /*! \brief Adding new folder **************************************************/ void AddFeedWizard::newFolder() { AddFolderDialog *addFolderDialog = new AddFolderDialog(this); QList treeItems = addFolderDialog->foldersTree_->findItems(foldersTree_->currentItem()->text(1), Qt::MatchFixedString | Qt::MatchRecursive, 1); addFolderDialog->foldersTree_->setCurrentItem(treeItems.at(0)); if (addFolderDialog->exec() == QDialog::Rejected) { delete addFolderDialog; return; } int folderId = 0; QString folderText = addFolderDialog->nameFeedEdit_->text(); int parentId = addFolderDialog->foldersTree_->currentItem()->text(1).toInt(); // Calculate row number to insert folder int rowToParent = 0; QSqlQuery q; q.exec(QString("SELECT count(id) FROM feeds WHERE parentId='%1'").arg(parentId)); if (q.first()) rowToParent = q.value(0).toInt(); // Add folder q.prepare("INSERT INTO feeds(text, created, parentId, rowToParent) " "VALUES (:text, :feedCreateTime, :parentId, :rowToParent)"); q.bindValue(":text", folderText); q.bindValue(":feedCreateTime", QLocale::c().toString(QDateTime::currentDateTimeUtc(), "yyyy-MM-ddTHH:mm:ss")); q.bindValue(":parentId", parentId); q.bindValue(":rowToParent", rowToParent); q.exec(); folderId = q.lastInsertId().toInt(); q.finish(); treeItems = foldersTree_->findItems(QString::number(parentId), Qt::MatchFixedString | Qt::MatchRecursive, 1); QStringList treeItem; treeItem << folderText << QString::number(folderId); QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeItems.at(0)->addChild(treeWidgetItem); foldersTree_->setCurrentItem(treeWidgetItem); delete addFolderDialog; } quiterss-0.18.3/src/addfeedwizard.h000066400000000000000000000054441265173051100172270ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADDFEEDDIALOG_H #define ADDFEEDDIALOG_H #ifdef HAVE_QT5 #include #else #include #include #endif #include #include "lineedit.h" #include "updatefeeds.h" class AddFeedWizard : public QWizard { Q_OBJECT public: explicit AddFeedWizard(QWidget *parent, int curFolderId); ~AddFeedWizard(); void setUrlFeed(const QString &feedUrl); LineEdit *nameFeedEdit_; LineEdit *urlFeedEdit_; QString htmlUrlString_; QString feedUrlString_; int feedId_; int feedParentId_; int newCount_; public slots: void getUrlDone(int result, int feedId, QString feedUrlStr, QString error, QByteArray data, QDateTime dtReply, QString codecName); void slotUpdateFeed(int feedId, bool, int newCount, QString); signals: void xmlReadyParse(QByteArray data, int feedId, QDateTime dtReply, QString codecName); void signalRequestUrl(int feedId, QString urlString, QDateTime date, QString userInfo); protected: virtual bool validateCurrentPage(); virtual void done(int result); void changeEvent(QEvent *event); private slots: void urlFeedEditChanged(const QString&); void nameFeedEditChanged(const QString&); void backButtonClicked(); void nextButtonClicked(); void finishButtonClicked(); void slotCurrentIdChanged(int); void titleFeedAsNameStateChanged(int); void slotProgressBarUpdate(); void newFolder(); private: void addFeed(); void deleteFeed(); void showProgressBar(); void finish(); UpdateFeeds *updateFeeds_; QWizardPage *createUrlFeedPage(); QWizardPage *createNameFeedPage(); QCheckBox *titleFeedAsName_; QGroupBox *authentication_; LineEdit *user_; LineEdit *pass_; QLabel *textWarning; QWidget *warningWidget_; QProgressBar *progressBar_; bool selectedPage; bool finishOn; QTreeWidget *foldersTree_; int curFolderId_; }; #endif // ADDFEEDDIALOG_H quiterss-0.18.3/src/addfolderdialog.cpp000066400000000000000000000070451265173051100200700ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "addfolderdialog.h" AddFolderDialog::AddFolderDialog(QWidget *parent, int curFolderId) : Dialog(parent, Qt::MSWindowsFixedSizeDialogHint) { setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Add Folder")); setMinimumWidth(400); setMinimumHeight(300); nameFeedEdit_ = new LineEdit(this); foldersTree_ = new QTreeWidget(this); foldersTree_->setObjectName("foldersTree_"); foldersTree_->setColumnCount(2); foldersTree_->setColumnHidden(1, true); foldersTree_->header()->hide(); QStringList treeItem; treeItem << tr("Feeds") << "Id"; foldersTree_->setHeaderLabels(treeItem); treeItem.clear(); treeItem << tr("All Feeds") << "0"; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/folder")); foldersTree_->addTopLevelItem(treeWidgetItem); foldersTree_->setCurrentItem(treeWidgetItem); QSqlQuery q; QQueue parentIds; parentIds.enqueue(0); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); QString qStr = QString("SELECT text, id FROM feeds WHERE parentId='%1' AND (xmlUrl='' OR xmlUrl IS NULL)"). arg(parentId); q.exec(qStr); while (q.next()) { QString folderText = q.value(0).toString(); QString folderId = q.value(1).toString(); QStringList treeItem; treeItem << folderText << folderId; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/folder")); QList treeItems = foldersTree_->findItems(QString::number(parentId), Qt::MatchFixedString | Qt::MatchRecursive, 1); treeItems.at(0)->addChild(treeWidgetItem); if (folderId.toInt() == curFolderId) foldersTree_->setCurrentItem(treeWidgetItem); parentIds.enqueue(folderId.toInt()); } } foldersTree_->expandAll(); foldersTree_->sortByColumn(0, Qt::AscendingOrder); pageLayout->addWidget(new QLabel(tr("Name:"))); pageLayout->addWidget(nameFeedEdit_); pageLayout->addWidget(new QLabel(tr("Location:"))); pageLayout->addWidget(foldersTree_); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(nameFeedEdit_, SIGNAL(textChanged(const QString&)), this, SLOT(nameFeedEditChanged(const QString&))); } void AddFolderDialog::nameFeedEditChanged(const QString& text) { buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!text.isEmpty()); } quiterss-0.18.3/src/addfolderdialog.h000066400000000000000000000024141265173051100175300ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ADDFOLDERDIALOG_H #define ADDFOLDERDIALOG_H #include #include "dialog.h" #include "lineedit.h" class AddFolderDialog : public Dialog { Q_OBJECT public: explicit AddFolderDialog(QWidget *parent, int curFolderId = 0); LineEdit *nameFeedEdit_; QTreeWidget *foldersTree_; private slots: void nameFeedEditChanged(const QString&); }; #endif // ADDFOLDERDIALOG_H quiterss-0.18.3/src/application/000077500000000000000000000000001265173051100165555ustar00rootroot00000000000000quiterss-0.18.3/src/application/logfile.cpp000066400000000000000000000066721265173051100207150ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "logfile.h" #include "mainapplication.h" LogFile::LogFile() { } #ifdef HAVE_QT5 void LogFile::msgHandler(QtMsgType type, const QMessageLogContext &, const QString &msg) { if (msg.startsWith("libpng warning: iCCP")) return; if (type == QtDebugMsg) { if (mainApp->isNoDebugOutput()) return; } QFile file; file.setFileName(mainApp->dataDir() + "/debug.log"); QIODevice::OpenMode openMode = QIODevice::WriteOnly | QIODevice::Text; if (file.exists() && (file.size() < maxLogFileSize)) { openMode |= QIODevice::Append; } file.open(openMode); QTextStream stream; stream.setDevice(&file); stream.setCodec("UTF-8"); if (file.isOpen()) { QString currentDateTime = QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss.zzz"); switch (type) { case QtDebugMsg: stream << currentDateTime << " DEBUG: " << msg << "\n"; break; case QtWarningMsg: stream << currentDateTime << " WARNING: " << msg << "\n"; break; case QtCriticalMsg: stream << currentDateTime << " CRITICAL: " << msg << "\n"; break; case QtFatalMsg: stream << currentDateTime << " FATAL: " << msg << "\n"; qApp->exit(EXIT_FAILURE); default: break; } stream.flush(); file.flush(); file.close(); } } #else void LogFile::msgHandler(QtMsgType type, const char *msg) { if (QString::fromUtf8(msg) == "QFont::setPixelSize: Pixel size <= 0 (0)") return; if (type == QtDebugMsg) { if (mainApp->isNoDebugOutput()) return; } QFile file; file.setFileName(mainApp->dataDir() + "/debug.log"); QIODevice::OpenMode openMode = QIODevice::WriteOnly | QIODevice::Text; if (file.exists() && (file.size() < maxLogFileSize)) { openMode |= QIODevice::Append; } file.open(openMode); QTextStream stream; stream.setDevice(&file); stream.setCodec("UTF-8"); if (file.isOpen()) { QString currentDateTime = QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss.zzz"); switch (type) { case QtDebugMsg: stream << currentDateTime << " DEBUG: " << QString::fromUtf8(msg) << "\n"; break; case QtWarningMsg: stream << currentDateTime << " WARNING: " << QString::fromUtf8(msg) << "\n"; break; case QtCriticalMsg: stream << currentDateTime << " CRITICAL: " << QString::fromUtf8(msg) << "\n"; break; case QtFatalMsg: stream << currentDateTime << " FATAL: " << QString::fromUtf8(msg) << "\n"; qApp->exit(EXIT_FAILURE); default: break; } stream.flush(); file.flush(); file.close(); } } #endif quiterss-0.18.3/src/application/logfile.h000066400000000000000000000025211265173051100203470ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef LOGFILE_H #define LOGFILE_H #include #include #include #include #include const size_t maxLogFileSize = 1 * 1024 * 1024; //1 MB class LogFile { public: #ifdef HAVE_QT5 static void msgHandler(QtMsgType type, const QMessageLogContext &, const QString &msg); #else static void msgHandler(QtMsgType type, const char *msg); #endif private: explicit LogFile(); }; #endif // LOGFILE_H quiterss-0.18.3/src/application/mainapplication.cpp000066400000000000000000000411661265173051100224410ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "mainapplication.h" #include "common.h" #include "cookiejar.h" #include "database.h" #include "networkmanager.h" #include "adblockmanager.h" #include "settings.h" #include "splashscreen.h" #include "updatefeeds.h" #include "VersionNo.h" MainApplication::MainApplication(int &argc, char **argv) : QtSingleApplication(argc, argv) , isPortable_(false) , isPortableAppsCom_(false) , isClosing_(false) , dbFileExists_(false) , translator_(0) , mainWindow_(0) , networkManager_(0) , cookieJar_(0) , diskCache_(0) , downloadManager_(0) { QString message = arguments().value(1); if (isRunning()) { if (argc == 1) { sendMessage("--show"); } else { for (int i = 2; i < argc; ++i) message += '\n' + arguments().value(i); sendMessage(message); } isClosing_ = true; return; } else { if (message.contains("--exit", Qt::CaseInsensitive)) { isClosing_ = true; return; } } setApplicationName("QuiteRss"); setOrganizationName("QuiteRss"); setApplicationVersion(STRPRODUCTVER); setWindowIcon(QIcon(":/images/quiterss32")); setQuitOnLastWindowClosed(false); QSettings::setDefaultFormat(QSettings::IniFormat); checkPortable(); checkDir(); createSettings(); qWarning() << "Run application!"; setStyleApplication(); setTranslateApplication(); showSplashScreen(); connectDatabase(); setProgressSplashScreen(30); qWarning() << "Run application 2"; mainWindow_ = new MainWindow(); qWarning() << "Run application 3"; setProgressSplashScreen(60); loadSettings(); qWarning() << "Run application 4"; updateFeeds_ = new UpdateFeeds(mainWindow_); setProgressSplashScreen(90); qWarning() << "Run application 5"; mainWindow_->restoreFeedsOnStartUp(); setProgressSplashScreen(100); qWarning() << "Run application 6"; if (!mainWindow_->startingTray_ || !mainWindow_->showTrayIcon_) { mainWindow_->show(); } mainWindow_->isMinimizeToTray_ = false; closeSplashScreen(); if (mainWindow_->showTrayIcon_) { QTimer::singleShot(0, mainWindow_->traySystem, SLOT(show())); } if (updateFeedsStartUp_) { QTimer::singleShot(0, mainWindow_, SLOT(slotGetAllFeeds())); } receiveMessage(message); connect(this, SIGNAL(messageReceived(QString)), SLOT(receiveMessage(QString))); } MainApplication::~MainApplication() { } MainApplication *MainApplication::getInstance() { return static_cast(QCoreApplication::instance()); } void MainApplication::receiveMessage(const QString &message) { if (!message.isEmpty()) { qWarning() << QString("Received message: %1").arg(message); QStringList params = message.split('\n'); foreach (QString param, params) { if (param == "--show") { if (isClosing_) return; mainWindow_->showWindows(); } if (param == "--exit") mainWindow_->quitApp(); if (param.contains("feed:", Qt::CaseInsensitive)) { QClipboard *clipboard = QApplication::clipboard(); if (param.contains("https://", Qt::CaseInsensitive)) { param.remove(0, 5); clipboard->setText(param); } else { param.remove(0, 7); clipboard->setText("http://" + param); } mainWindow_->addFeed(); } } } } void MainApplication::checkPortable() { #if defined(Q_OS_WIN) isPortable_ = true; QString fileName(QCoreApplication::applicationDirPath() + "/portable.dat"); if (!QFile::exists(fileName)) { fileName = QCoreApplication::applicationDirPath() + "/" + QCoreApplication::applicationName() + ".ini"; if (!QFile::exists(fileName)) isPortable_ = false; } if (isPortable_) { fileName = QCoreApplication::applicationDirPath() + "/../../QuiteRSSPortable.exe"; if (QFile::exists(fileName)) { isPortableAppsCom_ = true; QFile::remove(QCoreApplication::applicationDirPath() + "/Updater.exe"); } } #endif } void MainApplication::checkDir() { #if defined(Q_OS_WIN) || defined(Q_OS_OS2) resourcesDir_ = QCoreApplication::applicationDirPath(); #else #if defined(Q_OS_MAC) resourcesDir_ = QCoreApplication::applicationDirPath() + "/../Resources"; #else resourcesDir_ = RESOURCES_DIR; #endif #endif if (isPortable_) { dataDir_ = QCoreApplication::applicationDirPath(); cacheDir_ = "cache"; soundNotifyDir_ = "sound"; } else { #ifdef HAVE_QT5 dataDir_ = QStandardPaths::writableLocation(QStandardPaths::DataLocation); cacheDir_ = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); #else dataDir_ = QDesktopServices::storageLocation(QDesktopServices::DataLocation); cacheDir_ = QDesktopServices::storageLocation(QDesktopServices::CacheLocation); #endif soundNotifyDir_ = resourcesDir_ % "/sound"; QDir dir(dataDir_); dir.mkpath(dataDir_); } } void MainApplication::createSettings() { QString fileName; if (isPortable_) fileName = mainApp->dataDir() % "/" % QCoreApplication::applicationName() % ".ini"; Settings::createSettings(fileName); Settings settings; settings.beginGroup("Settings"); storeDBMemory_ = settings.value("storeDBMemory", true).toBool(); isSaveDataLastFeed_ = settings.value("createLastFeed", false).toBool(); styleApplication_ = settings.value("styleApplication", "greenStyle_").toString(); showSplashScreen_ = settings.value("showSplashScreen", true).toBool(); updateFeedsStartUp_ = settings.value("autoUpdatefeedsStartUp", false).toBool(); noDebugOutput_ = settings.value("noDebugOutput", true).toBool(); QString strLang; QString strLocalLang = QLocale::system().name(); bool findLang = false; QDir langDir(resourcesDir_ + "/lang"); foreach (QString file, langDir.entryList(QStringList("*.qm"), QDir::Files)) { strLang = file.section('.', 0, 0).section('_', 1); if (strLocalLang == strLang) { strLang = strLocalLang; findLang = true; break; } } if (!findLang) { strLocalLang = strLocalLang.left(2); foreach (QString file, langDir.entryList(QStringList("*.qm"), QDir::Files)) { strLang = file.section('.', 0, 0).section('_', 1); if (strLocalLang.contains(strLang, Qt::CaseInsensitive)) { strLang = strLocalLang; findLang = true; break; } } } if (!findLang) strLang = "en"; langFileName_ = settings.value("langFileName", strLang).toString(); settings.endGroup(); } void MainApplication::connectDatabase() { QString fileName(dbFileName() % ".bak"); if (QFile(fileName).exists()) { QString sourceFileName = QFile::symLinkTarget(dbFileName()); if (sourceFileName.isEmpty()) { sourceFileName = dbFileName(); } if (QFile::remove(sourceFileName)) { if (!QFile::rename(fileName, sourceFileName)) qCritical() << "Failed to rename new database file!"; } else { qCritical() << "Failed to delete old database file!"; } } if (QFile(dbFileName()).exists()) { dbFileExists_ = true; } Database::initialization(); } void MainApplication::loadSettings() { c2fLoadSettings(); reloadUserStyleBrowser(); } void MainApplication::quitApplication() { qWarning() << "quitApplication 1"; delete mainWindow_; qWarning() << "quitApplication 2"; delete networkManager_; delete cookieJar_; delete closingWidget_; qWarning() << "Quit application"; quit(); } void MainApplication::showClosingWidget() { closingWidget_ = new QWidget(0, Qt::Dialog | Qt::WindowStaysOnTopHint | Qt::WindowCloseButtonHint); closingWidget_->setFocusPolicy(Qt::NoFocus); QVBoxLayout *layout = new QVBoxLayout(closingWidget_); layout->addWidget(new QLabel(tr("Saving data..."))); closingWidget_->resize(150, 20); closingWidget_->show(); closingWidget_->move(QApplication::desktop()->availableGeometry().width() - closingWidget_->frameSize().width(), QApplication::desktop()->availableGeometry().height() - closingWidget_->frameSize().height()); closingWidget_->setFixedSize(closingWidget_->size()); qApp->processEvents(); } void MainApplication::commitData(QSessionManager &manager) { manager.release(); mainWindow_->quitApp(); } bool MainApplication::isPortable() const { return isPortable_; } bool MainApplication::isPortableAppsCom() const { return isPortableAppsCom_; } void MainApplication::setClosing() { isClosing_ = true; } bool MainApplication::isClosing() const { return isClosing_; } QString MainApplication::resourcesDir() const { return resourcesDir_; } QString MainApplication::dataDir() const { return dataDir_; } QString MainApplication::absolutePath(const QString &path) const { QString absolutePath = path; if (isPortable_) { if (!QDir::isAbsolutePath(path)) { absolutePath = dataDir_ % "/" % path; } } return absolutePath; } QString MainApplication::dbFileName() const { return dataDir_ % "/feeds.db"; } bool MainApplication::isSaveDataLastFeed() const { return isSaveDataLastFeed_; } bool MainApplication::storeDBMemory() const { return storeDBMemory_; } void MainApplication::setStyleApplication() { QString fileName(resourcesDir_); if (styleApplication_ == "systemStyle_") { fileName.append("/style/system.qss"); } else if (styleApplication_ == "system2Style_") { fileName.append("/style/system2.qss"); } else if (styleApplication_ == "orangeStyle_") { fileName.append("/style/orange.qss"); } else if (styleApplication_ == "purpleStyle_") { fileName.append("/style/purple.qss"); } else if (styleApplication_ == "pinkStyle_") { fileName.append("/style/pink.qss"); } else if (styleApplication_ == "grayStyle_") { fileName.append("/style/gray.qss"); } else { fileName.append("/style/green.qss"); } QFile file(fileName); if (!file.open(QFile::ReadOnly)) { file.setFileName(":/style/systemStyle"); file.open(QFile::ReadOnly); } setStyleSheet(QLatin1String(file.readAll())); file.close(); setStyle(new QProxyStyle); } void MainApplication::setTranslateApplication() { if (!translator_) translator_ = new QTranslator(this); removeTranslator(translator_); translator_->load(resourcesDir_ + QString("/lang/quiterss_%1").arg(langFileName_)); installTranslator(translator_); } void MainApplication::showSplashScreen() { Settings settings; int versionDB = settings.value("versionDB", "1").toInt(); if ((versionDB != Database::version()) && QFile::exists(settings.fileName())) showSplashScreen_ = true; if (showSplashScreen_) { splashScreen_ = new SplashScreen(QPixmap(":/images/images/splashScreen.png")); splashScreen_->show(); processEvents(); if ((versionDB != Database::version()) && QFile::exists(settings.fileName())) { splashScreen_->showMessage(QString("Converting database to version %1...").arg(Database::version()), Qt::AlignRight | Qt::AlignTop, Qt::darkGray); } } } void MainApplication::closeSplashScreen() { if (showSplashScreen_) { splashScreen_->finish(mainWindow_); splashScreen_->deleteLater(); } } void MainApplication::setProgressSplashScreen(int value) { if (showSplashScreen_) splashScreen_->setProgress(value); } MainWindow *MainApplication::mainWindow() { return mainWindow_; } NetworkManager *MainApplication::networkManager() { if (!networkManager_) { networkManager_ = new NetworkManager(false, this); setDiskCache(); } return networkManager_; } CookieJar *MainApplication::cookieJar() { if (!cookieJar_) { cookieJar_ = new CookieJar(this); } return cookieJar_; } void MainApplication::setDiskCache() { Settings settings; settings.beginGroup("Settings"); bool useDiskCache = settings.value("useDiskCache", true).toBool(); if (useDiskCache) { if (!diskCache_) { diskCache_ = new QNetworkDiskCache(this); } QString diskCacheDirPath = settings.value("dirDiskCache", cacheDir_).toString(); if (diskCacheDirPath.isEmpty()) diskCacheDirPath = cacheDir_; diskCacheDirPath = absolutePath(diskCacheDirPath); bool cleanDiskCache = settings.value("cleanDiskCache", true).toBool(); if (cleanDiskCache) { Common::removePath(diskCacheDirPath); settings.setValue("cleanDiskCache", false); } diskCache_->setCacheDirectory(diskCacheDirPath); int maxDiskCache = settings.value("maxDiskCache", 50).toInt(); diskCache_->setMaximumCacheSize(maxDiskCache*1024*1024); networkManager()->setCache(diskCache_); } else { if (diskCache_) { diskCache_->setMaximumCacheSize(0); diskCache_->clear(); } } settings.endGroup(); } QString MainApplication::cacheDefaultDir() const { return cacheDir_; } QString MainApplication::soundNotifyDefaultFile() const { return soundNotifyDir_ % "/notification.wav"; } QString MainApplication::styleSheetNewsDefaultFile() const { if (isPortable_) { return "style/news.css"; } else { return resourcesDir_ % "/style/news.css"; } } UpdateFeeds *MainApplication::updateFeeds() { return updateFeeds_; } void MainApplication::runUserFilter(int feedId, int filterId) { emit signalRunUserFilter(feedId, filterId); } void MainApplication::sqlQueryExec(const QString &query) { emit signalSqlQueryExec(query); } /** @brief Click to Flash *---------------------------------------------------------------------------*/ void MainApplication::c2fLoadSettings() { Settings settings; settings.beginGroup("ClickToFlash"); c2fWhitelist_ = settings.value("whitelist", QStringList()).toStringList(); c2fEnabled_ = settings.value("enabled", true).toBool(); settings.endGroup(); } void MainApplication::c2fSaveSettings() { Settings settings; settings.beginGroup("ClickToFlash"); settings.setValue("whitelist", c2fWhitelist_); settings.setValue("enabled", c2fEnabled_); settings.endGroup(); } bool MainApplication::c2fIsEnabled() const { return c2fEnabled_; } void MainApplication::c2fSetEnabled(bool enabled) { c2fEnabled_ = enabled; } QStringList MainApplication::c2fGetWhitelist() { return c2fWhitelist_; } void MainApplication::c2fSetWhitelist(QStringList whitelist) { c2fWhitelist_ = whitelist; } void MainApplication::c2fAddWhitelist(const QString &site) { c2fWhitelist_.append(site); } DownloadManager *MainApplication::downloadManager() { if (!downloadManager_) { downloadManager_ = new DownloadManager(); } return downloadManager_; } void MainApplication::reloadUserStyleBrowser() { Settings settings; settings.beginGroup("Settings"); QString userStyleBrowser = settings.value("userStyleBrowser", QString()).toString(); QWebSettings::globalSettings()->setUserStyleSheetUrl(userStyleSheet(userStyleBrowser)); settings.endGroup(); } /** @brief Set user style sheet for browser * @param filePath Filepath of user style * @return URL-link to user style *---------------------------------------------------------------------------*/ QUrl MainApplication::userStyleSheet(const QString &filePath) const { QString userStyle; #ifndef HAVE_X11 // Don't grey out selection on losing focus (to prevent graying out found text) QString highlightColor; QString highlightedTextColor; #ifdef Q_OS_MAC highlightColor = QLatin1String("#b6d6fc"); highlightedTextColor = QLatin1String("#000"); #else QPalette pal = style()->standardPalette(); highlightColor = pal.color(QPalette::Highlight).name(); highlightedTextColor = pal.color(QPalette::HighlightedText).name(); #endif userStyle += QString("::selection {background: %1; color: %2;} ").arg(highlightColor, highlightedTextColor); #endif userStyle += AdBlockManager::instance()->elementHidingRules(); QFile file(filePath); if (!filePath.isEmpty() && file.open(QFile::ReadOnly)) { QString fileData = QString::fromUtf8(file.readAll()); fileData.remove(QLatin1Char('\n')); userStyle.append(fileData); file.close(); } const QString &encodedStyle = userStyle.toLatin1().toBase64(); const QString &dataString = QString("data:text/css;charset=utf-8;base64,%1").arg(encodedStyle); return QUrl(dataString); } quiterss-0.18.3/src/application/mainapplication.h000066400000000000000000000077031265173051100221050ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef MAINAPPLICATION_H #define MAINAPPLICATION_H #define mainApp MainApplication::getInstance() #ifdef HAVE_QT5 #include #else #include #endif #include #include #include "cookiejar.h" #include "downloadmanager.h" #include "mainwindow.h" class NetworkManager; class SplashScreen; class UpdateFeeds; class MainApplication : public QtSingleApplication { Q_OBJECT public: explicit MainApplication(int &argc, char** argv); ~MainApplication(); static MainApplication *getInstance(); bool isPortable() const; bool isPortableAppsCom() const; void setClosing(); bool isClosing() const; bool isNoDebugOutput() const { return noDebugOutput_; } void showClosingWidget(); QString resourcesDir() const; QString dataDir() const; QString absolutePath(const QString &path) const; QString dbFileName() const; QString cacheDefaultDir() const; QString soundNotifyDefaultFile() const; QString styleSheetNewsDefaultFile() const; bool storeDBMemory() const; bool dbFileExists() const { return dbFileExists_; } bool isSaveDataLastFeed() const; void sqlQueryExec(const QString &query); MainWindow *mainWindow(); NetworkManager *networkManager(); CookieJar *cookieJar(); void setDiskCache(); UpdateFeeds *updateFeeds(); void runUserFilter(int feedId, int filterId); DownloadManager *downloadManager(); void c2fLoadSettings(); void c2fSaveSettings(); bool c2fIsEnabled() const; void c2fSetEnabled(bool enabled); QStringList c2fGetWhitelist(); void c2fSetWhitelist(QStringList whitelist); void c2fAddWhitelist(const QString &site); void setTranslateApplication(); QString language() const { return langFileName_; } void setLanguage(const QString &lang) { langFileName_ = lang; } public slots: void receiveMessage(const QString &message); void quitApplication(); void reloadUserStyleBrowser(); signals: void signalRunUserFilter(int feedId, int filterId); void signalSqlQueryExec(const QString &query); private slots: void commitData(QSessionManager &manager); private: void checkPortable(); void checkDir(); void createSettings(); void connectDatabase(); void loadSettings(); void setStyleApplication(); void showSplashScreen(); void closeSplashScreen(); void setProgressSplashScreen(int value); bool isPortable_; bool isPortableAppsCom_; bool isClosing_; QString resourcesDir_; QString dataDir_; QString cacheDir_; QString soundNotifyDir_; bool storeDBMemory_; bool dbFileExists_; bool isSaveDataLastFeed_; QString styleApplication_; bool showSplashScreen_; bool updateFeedsStartUp_; bool noDebugOutput_; QTranslator *translator_; QString langFileName_; SplashScreen *splashScreen_; MainWindow *mainWindow_; NetworkManager *networkManager_; CookieJar *cookieJar_; QNetworkDiskCache *diskCache_; UpdateFeeds *updateFeeds_; DownloadManager *downloadManager_; QWidget *closingWidget_; QStringList c2fWhitelist_; bool c2fEnabled_; QUrl userStyleSheet(const QString &filePath) const; }; #endif // MAINAPPLICATION_H quiterss-0.18.3/src/application/mainwindow.cpp000066400000000000000000011564521265173051100214530ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "mainwindow.h" #include "common.h" #include "mainapplication.h" #include "database.h" #include "aboutdialog.h" #include "adblockmanager.h" #include "adblockicon.h" #include "addfeedwizard.h" #include "addfolderdialog.h" #include "cleanupwizard.h" #include "customizetoolbardialog.h" #include "feedpropertiesdialog.h" #include "filterrulesdialog.h" #include "newsfiltersdialog.h" #include "webpage.h" #include "settings.h" #if defined(Q_OS_WIN) #include #include #endif #include #include #include // --------------------------------------------------------------------------- MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , isMinimizeToTray_(true) , currentNewsTab(NULL) , isOpeningLink_(false) , openNewsTab_(0) , feedsFilterAction_(NULL) , newsFilterAction_(NULL) , newsView_(NULL) , updateTimeCount_(0) #if defined(HAVE_QT5) || defined(HAVE_PHONON) , mediaPlayer_(NULL) #endif , updateAppDialog_(NULL) , notificationWidget(NULL) , feedIdOld_(-2) , isStartImportFeed_(false) , recountCategoryCountsOn_(false) , optionsDialog_(NULL) { setObjectName("mainWindow"); setWindowTitle("QuiteRSS"); setContextMenuPolicy(Qt::CustomContextMenu); db_ = QSqlDatabase::database(); createFeedsWidget(); createToolBarNull(); createActions(); createShortcut(); createMenu(); createToolBar(); createStatusBar(); createTray(); createTabBarWidget(); createCentralWidget(); loadSettingsFeeds(); setStyleSheet("QMainWindow::separator { width: 1px; }"); loadSettings(); addOurFeed(); initUpdateFeeds(); QTimer::singleShot(10000, this, SLOT(slotUpdateAppCheck())); connect(this, SIGNAL(signalShowNotification(bool)), SLOT(showNotification(bool)), Qt::QueuedConnection); connect(this, SIGNAL(signalPlaySoundNewNews()), SLOT(slotPlaySoundNewNews()), Qt::QueuedConnection); qRegisterMetaType >("QList"); connect(this, SIGNAL(setFeedRead(int,int,int,QList)), SIGNAL(signalSetFeedRead(int,int,int,QList)), Qt::QueuedConnection); connect(&timerLinkOpening_, SIGNAL(timeout()), this, SLOT(slotTimerLinkOpening())); connect(mainApp->downloadManager(), SIGNAL(signalShowDownloads(bool)), this, SLOT(showDownloadManager(bool))); connect(mainApp->downloadManager(), SIGNAL(signalUpdateInfo(QString)), this, SLOT(updateInfoDownloads(QString))); connect(&timerTrayOpenNotify, SIGNAL(timeout()), this, SLOT(slotTrayOpenNotifyTimer())); timerTrayOpenNotify.setSingleShot(true); retranslateStrings(); installEventFilter(this); } // --------------------------------------------------------------------------- MainWindow::~MainWindow() { } // --------------------------------------------------------------------------- void MainWindow::closeEvent(QCloseEvent *event) { if (mainApp->isClosing()) return; if (closingTray_ && showTrayIcon_) { event->ignore(); isOpeningLink_ = false; oldState = windowState(); emit signalPlaceToTray(); } else { #if defined(Q_OS_MAC) event->ignore(); #endif quitApp(); } } /** @brief Process quit application *---------------------------------------------------------------------------*/ void MainWindow::quitApp() { mainApp->setClosing(); isMinimizeToTray_ = true; disconnect(this); if (updateAppDialog_) { updateAppDialog_->disconnectObjects(); updateAppDialog_->deleteLater(); } if (optionsDialog_) { optionsDialog_->close(); } mainApp->showClosingWidget(); hide(); traySystem->hide(); saveSettings(); for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); widget->disconnectObjects(); } mainApp->networkManager()->disconnect(mainApp->networkManager()); mainApp->updateFeeds()->disconnectObjects(); mainApp->updateFeeds()->quitApp(); } // --------------------------------------------------------------------------- bool MainWindow::eventFilter(QObject *obj, QEvent *event) { static int deactivateState = 0; if (obj == this) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if ((keyEvent->key() == Qt::Key_Up) || (keyEvent->key() == Qt::Key_Down) || (keyEvent->key() == Qt::Key_Left) || (keyEvent->key() == Qt::Key_Right)) { QListIterator iter(listActions_); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->shortcut() == QKeySequence(keyEvent->key())) { pAction->activate(QAction::Trigger); break; } } } } } if (obj == statusBar()) { if (event->type() == QEvent::MouseButtonRelease) { if (windowState() & Qt::WindowMaximized) { QMouseEvent *mouseEvent = static_cast(event); if ((mouseEvent->pos().x() > (statusBar()->width()-statusBar()->height())) && (mouseEvent->pos().y() > 0)) { setFullScreen(); } } } return false; } else if (obj == categoriesLabel_) { if (event->type() == QEvent::MouseButtonRelease) { showNewsCategoriesTree(); } return false; } else if (obj == categoriesTree_) { if (event->type() == QEvent::Show) { recountCategoryCounts(); } } else if (event->type() == QEvent::WindowActivate) { activationStateChangedTime_ = QDateTime::currentMSecsSinceEpoch(); } // Process open link in browser in background else if (event->type() == QEvent::WindowDeactivate) { if (isOpeningLink_ && openLinkInBackground_) { isOpeningLink_ = false; timerLinkOpening_.start(openingLinkTimeout_); deactivateState = 1; } activationStateChangedTime_ = QDateTime::currentMSecsSinceEpoch(); } // deactivation has painted else if ((event->type() == QEvent::Paint) && (deactivateState == 1)) { deactivateState = 2; } // deactivation in done. Reactivating else if ((deactivateState == 2) && timerLinkOpening_.isActive()) { deactivateState = 3; if (!isActiveWindow()) { setWindowState(windowState() & ~Qt::WindowActive); show(); raise(); activateWindow(); } } // activating had painted else if ((deactivateState == 3) && (event->type() == QEvent::Paint)) { deactivateState = 0; } else if (event->type() == QEvent::Hide) { if (minimizingTray_ && showTrayIcon_ && !isMinimizeToTray_) { emit signalPlaceToTray(); } } // pass the event on to the parent class return QMainWindow::eventFilter(obj, event); } /** @brief Process send link to external browser in background *---------------------------------------------------------------------------*/ void MainWindow::slotTimerLinkOpening() { timerLinkOpening_.stop(); if (!isActiveWindow()) { setWindowState(windowState() & ~Qt::WindowActive); show(); raise(); activateWindow(); } } /** @brief Process changing window state *---------------------------------------------------------------------------*/ void MainWindow::changeEvent(QEvent *event) { if(event->type() == QEvent::WindowStateChange) { isOpeningLink_ = false; if(isMinimized()) { oldState = ((QWindowStateChangeEvent*)event)->oldState(); } else { oldState = windowState(); } } else if(event->type() == QEvent::ActivationChange) { if (isActiveWindow() && (behaviorIconTray_ == CHANGE_ICON_TRAY)) { traySystem->setIcon(QIcon(":/images/quiterss16")); } } else if(event->type() == QEvent::LanguageChange) { retranslateStrings(); } QMainWindow::changeEvent(event); } /** @brief Process placing to tray event *---------------------------------------------------------------------------*/ void MainWindow::slotPlaceToTray() { isMinimizeToTray_ = true; hide(); if (emptyWorking_) QTimer::singleShot(10000, this, SLOT(myEmptyWorkingSet())); if (markReadMinimize_) setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadPlaceToTray, currentNewsTab); if (clearStatusNew_) QTimer::singleShot(0, this, SIGNAL(signalMarkAllFeedsOld())); clearNotification(true); saveSettings(); mainApp->updateFeeds()->saveMemoryDatabase(); isMinimizeToTray_ = false; } /** @brief Process tray event *---------------------------------------------------------------------------*/ void MainWindow::slotActivationTray(QSystemTrayIcon::ActivationReason reason) { bool activated = false; switch (reason) { case QSystemTrayIcon::Unknown: break; case QSystemTrayIcon::Context: trayMenu_->activateWindow(); break; case QSystemTrayIcon::DoubleClick: { if (!singleClickTray_) { timerTrayOpenNotify.stop(); if ((QDateTime::currentMSecsSinceEpoch() - activationStateChangedTime_ < 300) || isActiveWindow()) { activated = true; } showWindows(activated); } break; } case QSystemTrayIcon::Trigger: { if (singleClickTray_) { qint64 lastActiveChangeTime = QDateTime::currentMSecsSinceEpoch() - activationStateChangedTime_; if (isActiveWindow() ? (lastActiveChangeTime >= 200) : (lastActiveChangeTime < 200)) { activated = true; } showWindows(activated); } else { if (notificationWidget == NULL) { if (!timerTrayOpenNotify.isActive()) { timerTrayOpenNotify.start(400); } } else { delete notificationWidget; notificationWidget = NULL; } } break; } case QSystemTrayIcon::MiddleClick: break; } } void MainWindow::slotTrayOpenNotifyTimer() { emit signalShowNotification(true); } /** @brief Show window on event *---------------------------------------------------------------------------*/ void MainWindow::showWindows(bool trayClick) { if (!trayClick || isHidden()) { if (oldState & Qt::WindowFullScreen) { show(); } else if (oldState & Qt::WindowMaximized) { showMaximized(); } else { showNormal(); Settings settings; restoreGeometry(settings.value("GeometryState").toByteArray()); } activateWindow(); } else { if (minimizingTray_) emit signalPlaceToTray(); else showMinimized(); } } // --------------------------------------------------------------------------- void MainWindow::createFeedsWidget() { feedsModel_ = new FeedsModel(this); feedsProxyModel_ = new FeedsProxyModel(feedsModel_); feedsProxyModel_->setSourceModel(feedsModel_); feedsView_ = new FeedsView(this); feedsView_->setModel(feedsProxyModel_); feedsView_->setSourceModel(feedsModel_); feedsModel_->setView(feedsView_); for (int i = 0; i < feedsView_->model()->columnCount(); ++i) feedsView_->hideColumn(i); feedsView_->showColumn(feedsView_->columnIndex("text")); #ifdef HAVE_QT5 feedsView_->header()->setSectionResizeMode(feedsView_->columnIndex("text"), QHeaderView::Stretch); feedsView_->header()->setSectionResizeMode(feedsView_->columnIndex("unread"), QHeaderView::ResizeToContents); feedsView_->header()->setSectionResizeMode(feedsView_->columnIndex("undeleteCount"), QHeaderView::ResizeToContents); feedsView_->header()->setSectionResizeMode(feedsView_->columnIndex("updated"), QHeaderView::ResizeToContents); #else feedsView_->header()->setResizeMode(feedsView_->columnIndex("text"), QHeaderView::Stretch); feedsView_->header()->setResizeMode(feedsView_->columnIndex("unread"), QHeaderView::ResizeToContents); feedsView_->header()->setResizeMode(feedsView_->columnIndex("undeleteCount"), QHeaderView::ResizeToContents); feedsView_->header()->setResizeMode(feedsView_->columnIndex("updated"), QHeaderView::ResizeToContents); #endif feedsToolBar_ = new QToolBar(this); feedsToolBar_->setObjectName("feedsToolBar"); feedsToolBar_->setStyleSheet("QToolBar { border: none; padding: 0px; }"); QHBoxLayout *feedsPanelLayout = new QHBoxLayout(); feedsPanelLayout->setMargin(2); feedsPanelLayout->addWidget(feedsToolBar_, 1); feedsPanel_ = new QWidget(this); feedsPanel_->setObjectName("feedsPanel_"); feedsPanel_->setStyleSheet( QString("#feedsPanel_ {border-bottom: 1px solid %1;}"). arg(qApp->palette().color(QPalette::Dark).name())); feedsPanel_->setLayout(feedsPanelLayout); findFeeds_ = new FindFeed(this); QVBoxLayout *findFeedsLayout = new QVBoxLayout(); findFeedsLayout->setMargin(2); findFeedsLayout->addWidget(findFeeds_); findFeedsWidget_ = new QWidget(this); findFeedsWidget_->hide(); findFeedsWidget_->setLayout(findFeedsLayout); categoriesTree_ = new CategoriesTreeWidget(this); categoriesLabel_ = new QLabel(this); categoriesLabel_->setObjectName("categoriesLabel_"); showCategoriesButton_ = new ToolButton(this); showCategoriesButton_->setFocusPolicy(Qt::NoFocus); showCategoriesButton_->setMaximumSize(16, 16); showCategoriesButton_->setAutoRaise(true); QHBoxLayout *categoriesPanelLayout = new QHBoxLayout(); categoriesPanelLayout->setMargin(2); categoriesPanelLayout->addSpacing(2); categoriesPanelLayout->addWidget(categoriesLabel_, 1); categoriesPanelLayout->addWidget(showCategoriesButton_); categoriesPanel_ = new QWidget(this); categoriesPanel_->setObjectName("categoriesPanel_"); categoriesPanel_->setLayout(categoriesPanelLayout); QVBoxLayout *categoriesLayout = new QVBoxLayout(); categoriesLayout->setMargin(0); categoriesLayout->setSpacing(0); categoriesLayout->addWidget(categoriesPanel_); categoriesLayout->addWidget(categoriesTree_, 1); categoriesWidget_ = new QWidget(this); categoriesWidget_->setLayout(categoriesLayout); feedsSplitter_ = new QSplitter(Qt::Vertical); feedsSplitter_->setChildrenCollapsible(false); feedsSplitter_->setHandleWidth(1); feedsSplitter_->setStyleSheet( QString("QSplitter::handle {background: %1;}"). arg(qApp->palette().color(QPalette::Dark).name())); feedsSplitter_->addWidget(feedsView_); feedsSplitter_->addWidget(categoriesWidget_); feedsSplitter_->setStretchFactor(0, 1); #define CATEGORIES_HEIGHT 210 QList sizes; sizes << QApplication::desktop()->height() << CATEGORIES_HEIGHT; feedsSplitter_->setSizes(sizes); QVBoxLayout *feedsLayout = new QVBoxLayout(); feedsLayout->setMargin(0); feedsLayout->setSpacing(0); feedsLayout->addWidget(feedsPanel_); feedsLayout->addWidget(findFeedsWidget_); feedsLayout->addWidget(feedsSplitter_, 1); feedsWidget_ = new QFrame(this); feedsWidget_->setFrameStyle(QFrame::NoFrame); feedsWidget_->setLayout(feedsLayout); connect(feedsView_, SIGNAL(pressed(QModelIndex)), this, SLOT(slotFeedClicked(QModelIndex))); connect(feedsView_, SIGNAL(signalMiddleClicked()), this, SLOT(slotOpenFeedNewTab())); connect(feedsView_, SIGNAL(signalDoubleClicked()), this, SLOT(slotGetFeed())); connect(feedsView_, SIGNAL(pressKeyUp()), this, SLOT(slotFeedUpPressed())); connect(feedsView_, SIGNAL(pressKeyDown()), this, SLOT(slotFeedDownPressed())); connect(feedsView_, SIGNAL(pressKeyHome()), this, SLOT(slotFeedHomePressed())); connect(feedsView_, SIGNAL(pressKeyEnd()), this, SLOT(slotFeedEndPressed())); connect(feedsView_, SIGNAL(signalDropped(QModelIndex,int)), this, SLOT(slotMoveIndex(QModelIndex,int))); connect(feedsView_, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenuFeed(const QPoint &))); connect(findFeeds_, SIGNAL(textChanged(QString)), this, SLOT(slotFindFeeds(QString))); connect(findFeeds_, SIGNAL(signalSelectFind()), this, SLOT(slotSelectFind())); connect(findFeeds_, SIGNAL(returnPressed()), this, SLOT(slotSelectFind())); connect(categoriesTree_, SIGNAL(itemPressed(QTreeWidgetItem*,int)), this, SLOT(slotCategoriesClicked(QTreeWidgetItem*,int))); connect(categoriesTree_, SIGNAL(signalMiddleClicked()), this, SLOT(slotOpenCategoryNewTab())); connect(categoriesTree_, SIGNAL(signalClearDeleted()), this, SLOT(clearDeleted())); connect(categoriesTree_, SIGNAL(signalMarkRead(QTreeWidgetItem*)), this, SLOT(slotMarkReadCategory(QTreeWidgetItem*))); connect(showCategoriesButton_, SIGNAL(clicked()), this, SLOT(showNewsCategoriesTree())); connect(feedsSplitter_, SIGNAL(splitterMoved(int,int)), this, SLOT(feedsSplitterMoved(int,int))); categoriesLabel_->installEventFilter(this); categoriesTree_->installEventFilter(this); } // --------------------------------------------------------------------------- void MainWindow::createToolBarNull() { pushButtonNull_ = new QPushButton(this); pushButtonNull_->setObjectName("pushButtonNull"); pushButtonNull_->setIcon(QIcon(":/images/images/triangleR.png")); pushButtonNull_->setFixedWidth(6); pushButtonNull_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); pushButtonNull_->setFocusPolicy(Qt::NoFocus); pushButtonNull_->setStyleSheet("background: #E8E8E8; border: none; padding: 0px;"); } // --------------------------------------------------------------------------- void MainWindow::createNewsTab(int index) { currentNewsTab = (NewsTabWidget*)stackedWidget_->widget(index); currentNewsTab->setSettings(); currentNewsTab->retranslateStrings(); currentNewsTab->setBrowserPosition(); newsModel_ = currentNewsTab->newsModel_; newsView_ = currentNewsTab->newsView_; } // --------------------------------------------------------------------------- void MainWindow::createStatusBar() { #if defined(HAVE_X11) || defined(Q_OS_MAC) statusBar()->setStyleSheet(QString("QStatusBar::item {border-right: 1px solid %1;" "margin: 1px;}"). arg(qApp->palette().color(QPalette::Dark).name())); #endif progressBar_ = new QProgressBar(this); progressBar_->setObjectName("progressBar_"); progressBar_->setFormat("%p%"); progressBar_->setAlignment(Qt::AlignCenter); progressBar_->setFixedWidth(100); progressBar_->setFixedHeight(15); progressBar_->setMinimum(0); progressBar_->setMaximum(0); progressBar_->setValue(0); progressBar_->setVisible(false); QToolButton *stopUpdateButton_ = new QToolButton(progressBar_); stopUpdateButton_->setFocusPolicy(Qt::NoFocus); stopUpdateButton_->setToolButtonStyle(Qt::ToolButtonIconOnly); stopUpdateButton_->setFixedSize(15, 15); stopUpdateButton_->setCursor(Qt::ArrowCursor); stopUpdateButton_->setDefaultAction(stopUpdateAct_); stopUpdateButton_->setStyleSheet( "QToolButton { border: none; padding: 0px; }" "QToolButton:hover { background: rgba(150, 150, 150, 60) }" ); stopUpdateButton_->move(progressBar_->rect().right() - stopUpdateButton_->sizeHint().width(), progressBar_->rect().top()); adblockIcon_ = new AdBlockIcon(this); QToolButton *loadImagesButton = new QToolButton(this); loadImagesButton->setFocusPolicy(Qt::NoFocus); loadImagesButton->setIconSize(QSize(16,16)); loadImagesButton->setDefaultAction(autoLoadImagesToggle_); loadImagesButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); QToolButton *fullScreenButton = new QToolButton(this); fullScreenButton->setFocusPolicy(Qt::NoFocus); loadImagesButton->setIconSize(QSize(16,16)); fullScreenButton->setDefaultAction(fullScreenAct_); fullScreenButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); statusBar()->installEventFilter(this); statusBar()->addPermanentWidget(progressBar_); statusUnread_ = new QLabel(this); statusUnread_->hide(); statusBar()->addPermanentWidget(statusUnread_); statusAll_ = new QLabel(this); statusAll_->hide(); statusBar()->addPermanentWidget(statusAll_); statusBar()->addPermanentWidget(adblockIcon_); statusBar()->addPermanentWidget(loadImagesButton); statusBar()->addPermanentWidget(fullScreenButton); statusBar()->setVisible(true); } // --------------------------------------------------------------------------- void MainWindow::createTray() { traySystem = new QSystemTrayIcon(QIcon(":/images/quiterss16"), this); traySystem->setToolTip("QuiteRSS"); #ifndef Q_OS_MAC connect(traySystem,SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(slotActivationTray(QSystemTrayIcon::ActivationReason))); connect(this, SIGNAL(signalPlaceToTray()), this, SLOT(slotPlaceToTray()), Qt::QueuedConnection); #endif createTrayMenu(); } /** @brief Create tabbar widget *---------------------------------------------------------------------------*/ void MainWindow::createTabBarWidget() { mainMenuButton_ = new ToolButton(this); mainMenuButton_->setObjectName("mainMenuButton"); mainMenuButton_->setIcon(QIcon(":/images/menu")); tabBar_ = new TabBar(); QHBoxLayout *tabBarLayout = new QHBoxLayout(); tabBarLayout->setContentsMargins(0, 0, 0, 0); tabBarLayout->setSpacing(0); tabBarLayout->addWidget(mainMenuButton_); tabBarLayout->addSpacing(5); tabBarLayout->addWidget(tabBar_, 1); tabBarWidget_ = new QWidget(this); tabBarWidget_->setObjectName("tabBarWidget"); tabBarWidget_->setMinimumHeight(1); tabBarWidget_->setLayout(tabBarLayout); connect(mainMenuButton_, SIGNAL(clicked()), this, SLOT(showMainMenu())); connect(tabBar_, SIGNAL(closeTab(int)), this, SLOT(slotCloseTab(int))); connect(tabBar_, SIGNAL(currentChanged(int)), this, SLOT(slotTabCurrentChanged(int)), Qt::QueuedConnection); connect(tabBar_, SIGNAL(tabMoved(int,int)), SLOT(slotTabMoved(int,int))); connect(this, SIGNAL(signalSetCurrentTab(int,bool)), SLOT(setCurrentTab(int,bool)), Qt::QueuedConnection); connect(closeTabAct_, SIGNAL(triggered()), tabBar_, SLOT(slotCloseTab())); connect(closeOtherTabsAct_, SIGNAL(triggered()), tabBar_, SLOT(slotCloseOtherTabs())); connect(closeAllTabsAct_, SIGNAL(triggered()), tabBar_, SLOT(slotCloseAllTab())); connect(nextTabAct_, SIGNAL(triggered()), tabBar_, SLOT(slotNextTab())); connect(prevTabAct_, SIGNAL(triggered()), tabBar_, SLOT(slotPrevTab())); } void MainWindow::createCentralWidget() { stackedWidget_ = new QStackedWidget(this); stackedWidget_->setObjectName("stackedWidget_"); stackedWidget_->setFrameStyle(QFrame::NoFrame); mainSplitter_ = new QSplitter(this); mainSplitter_ ->setFrameStyle(QFrame::NoFrame); mainSplitter_->setHandleWidth(1); mainSplitter_->setStyleSheet( QString("QSplitter::handle {background: qlineargradient(" "x1: 0, y1: 0, x2: 0, y2: 1," "stop: 0 %1, stop: 0.07 %2);}"). arg(feedsPanel_->palette().background().color().name()). arg(qApp->palette().color(QPalette::Dark).name())); mainSplitter_->setChildrenCollapsible(false); mainSplitter_->addWidget(feedsWidget_); mainSplitter_->addWidget(stackedWidget_); mainSplitter_->setStretchFactor(1, 1); #define FEEDS_WIDTH 180 QList sizes; sizes << FEEDS_WIDTH << QApplication::desktop()->width(); mainSplitter_->setSizes(sizes); QHBoxLayout *mainLayout1 = new QHBoxLayout(); mainLayout1->addWidget(pushButtonNull_); mainLayout1->addWidget(mainSplitter_, 1); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->setMargin(0); mainLayout->setSpacing(0); mainLayout->addWidget(tabBarWidget_); mainLayout->addLayout(mainLayout1, 1); centralWidget_ = new QWidget(this); centralWidget_->setLayout(mainLayout); setCentralWidget(centralWidget_); } /** @brief Create actions for main menu and toolbar *---------------------------------------------------------------------------*/ void MainWindow::createActions() { addAct_ = new QAction(this); addAct_->setObjectName("newAct"); addAct_->setIcon(QIcon(":/images/add")); this->addAction(addAct_); connect(addAct_, SIGNAL(triggered()), this, SLOT(addFeed())); addFeedAct_ = new QAction(this); addFeedAct_->setObjectName("addFeedAct"); addFeedAct_->setIcon(QIcon(":/images/feed")); this->addAction(addFeedAct_); connect(addFeedAct_, SIGNAL(triggered()), this, SLOT(addFeed())); addFeedTrayAct_ = new QAction(this); addFeedTrayAct_->setIcon(QIcon(":/images/feed")); connect(addFeedTrayAct_, SIGNAL(triggered()), this, SLOT(addFeed())); addFolderAct_ = new QAction(this); addFolderAct_->setObjectName("addFolderAct"); addFolderAct_->setIcon(QIcon(":/images/folder")); this->addAction(addFolderAct_); connect(addFolderAct_, SIGNAL(triggered()), this, SLOT(addFolder())); openFeedNewTabAct_ = new QAction(this); openFeedNewTabAct_->setObjectName("openNewTabAct"); this->addAction(openFeedNewTabAct_); connect(openFeedNewTabAct_, SIGNAL(triggered()), this, SLOT(slotOpenFeedNewTab())); deleteFeedAct_ = new QAction(this); deleteFeedAct_->setObjectName("deleteFeedAct"); deleteFeedAct_->setIcon(QIcon(":/images/delete")); this->addAction(deleteFeedAct_); connect(deleteFeedAct_, SIGNAL(triggered()), this, SLOT(deleteItemFeedsTree())); importFeedsAct_ = new QAction(this); importFeedsAct_->setObjectName("importFeedsAct"); importFeedsAct_->setIcon(QIcon(":/images/importFeeds")); this->addAction(importFeedsAct_); connect(importFeedsAct_, SIGNAL(triggered()), this, SLOT(slotImportFeeds())); exportFeedsAct_ = new QAction(this); exportFeedsAct_->setObjectName("exportFeedsAct"); exportFeedsAct_->setIcon(QIcon(":/images/exportFeeds")); this->addAction(exportFeedsAct_); connect(exportFeedsAct_, SIGNAL(triggered()), this, SLOT(slotExportFeeds())); createBackupAct_ = new QAction(this); createBackupAct_->setObjectName("createBackupAct"); createBackupAct_->setIcon(QIcon(":/images/backup")); this->addAction(createBackupAct_); connect(createBackupAct_, SIGNAL(triggered()), this, SLOT(createBackup())); showMenuBarAct_ = new QAction(this); showMenuBarAct_->setCheckable(true); connect(showMenuBarAct_, SIGNAL(triggered()), this, SLOT(showMenuBar())); exitAct_ = new QAction(this); exitAct_->setObjectName("exitAct"); this->addAction(exitAct_); connect(exitAct_, SIGNAL(triggered()), this, SLOT(quitApp())); mainToolbarToggle_ = new QAction(this); mainToolbarToggle_->setCheckable(true); feedsToolbarToggle_ = new QAction(this); feedsToolbarToggle_->setCheckable(true); newsToolbarToggle_ = new QAction(this); newsToolbarToggle_->setCheckable(true); browserToolbarToggle_ = new QAction(this); browserToolbarToggle_->setCheckable(true); categoriesPanelToggle_ = new QAction(this); categoriesPanelToggle_->setCheckable(true); statusBarToggle_ = new QAction(this); statusBarToggle_->setCheckable(true); connect(feedsToolbarToggle_, SIGNAL(toggled(bool)), feedsPanel_, SLOT(setVisible(bool))); connect(categoriesPanelToggle_, SIGNAL(toggled(bool)), categoriesWidget_, SLOT(setVisible(bool))); connect(statusBarToggle_, SIGNAL(toggled(bool)), statusBar(), SLOT(setVisible(bool))); customizeMainToolbarAct_ = new QAction(this); customizeMainToolbarAct_->setObjectName("customizeMainToolbarAct"); customizeMainToolbarAct2_ = new QAction(this); connect(customizeMainToolbarAct2_, SIGNAL(triggered()), this, SLOT(customizeMainToolbar())); toolBarLockAct_ = new QAction(this); toolBarLockAct_->setCheckable(true); toolBarHideAct_ = new QAction(this); customizeFeedsToolbarAct_ = new QAction(this); customizeFeedsToolbarAct_->setObjectName("customizeFeedsToolbarAct"); customizeNewsToolbarAct_ = new QAction(this); customizeNewsToolbarAct_->setObjectName("customizeNewsToolbarAct"); classicLayoutAct_ = new QAction(this); classicLayoutAct_->setObjectName("classicLayoutAct_"); classicLayoutAct_->setIcon(QIcon(":/images/layout_classic")); classicLayoutAct_->setCheckable(true); classicLayoutAct_->setData(0); newspaperLayoutAct_ = new QAction(this); newspaperLayoutAct_->setObjectName("newspaperLayoutAct_"); newspaperLayoutAct_->setIcon(QIcon(":/images/layout_newspaper")); newspaperLayoutAct_->setCheckable(true); newspaperLayoutAct_->setData(1); layoutToggle_ = new QAction(this); layoutToggle_->setObjectName("layoutToggle"); layoutToggle_->setIcon(QIcon(":/images/layout_classic")); this->addAction(layoutToggle_); connect(layoutToggle_, SIGNAL(triggered()), this, SLOT(setNewsLayout())); systemStyle_ = new QAction(this); systemStyle_->setObjectName("systemStyle_"); systemStyle_->setCheckable(true); system2Style_ = new QAction(this); system2Style_->setObjectName("system2Style_"); system2Style_->setCheckable(true); greenStyle_ = new QAction(this); greenStyle_->setObjectName("greenStyle_"); greenStyle_->setCheckable(true); greenStyle_->setChecked(true); orangeStyle_ = new QAction(this); orangeStyle_->setObjectName("orangeStyle_"); orangeStyle_->setCheckable(true); purpleStyle_ = new QAction(this); purpleStyle_->setObjectName("purpleStyle_"); purpleStyle_->setCheckable(true); pinkStyle_ = new QAction(this); pinkStyle_->setObjectName("pinkStyle_"); pinkStyle_->setCheckable(true); grayStyle_ = new QAction(this); grayStyle_->setObjectName("grayStyle_"); grayStyle_->setCheckable(true); topBrowserPositionAct_ = new QAction(this); topBrowserPositionAct_->setCheckable(true); topBrowserPositionAct_->setData(TOP_POSITION); bottomBrowserPositionAct_ = new QAction(this); bottomBrowserPositionAct_->setCheckable(true); bottomBrowserPositionAct_->setData(BOTTOM_POSITION); rightBrowserPositionAct_ = new QAction(this); rightBrowserPositionAct_->setCheckable(true); rightBrowserPositionAct_->setData(RIGHT_POSITION); leftBrowserPositionAct_ = new QAction(this); leftBrowserPositionAct_->setCheckable(true); leftBrowserPositionAct_->setData(LEFT_POSITION); autoLoadImagesToggle_ = new QAction(this); autoLoadImagesToggle_->setObjectName("autoLoadImagesToggle"); autoLoadImagesToggle_->setIcon(QIcon(":/images/imagesOn")); this->addAction(autoLoadImagesToggle_); printAct_ = new QAction(this); printAct_->setObjectName("printAct"); printAct_->setIcon(QIcon(":/images/printer")); this->addAction(printAct_); connect(printAct_, SIGNAL(triggered()), this, SLOT(slotPrint())); printPreviewAct_ = new QAction(this); printPreviewAct_->setObjectName("printPreviewAct"); printPreviewAct_->setIcon(QIcon(":/images/printer")); this->addAction(printPreviewAct_); connect(printPreviewAct_, SIGNAL(triggered()), this, SLOT(slotPrintPreview())); savePageAsAct_ = new QAction(this); savePageAsAct_->setObjectName("savePageAsAct"); savePageAsAct_->setIcon(QIcon(":/images/save_as")); this->addAction(savePageAsAct_); connect(savePageAsAct_, SIGNAL(triggered()), this, SLOT(slotSavePageAs())); savePageAsDescriptAct_ = new QAction(this); savePageAsDescriptAct_->setObjectName("savePageAsDescriptAct"); savePageAsDescriptAct_->setIcon(QIcon(":/images/save_as")); this->addAction(savePageAsDescriptAct_); connect(savePageAsDescriptAct_, SIGNAL(triggered()), this, SLOT(slotSavePageAsDescript())); zoomInAct_ = new QAction(this); zoomInAct_->setObjectName("zoomInAct"); zoomInAct_->setIcon(QIcon(":/images/zoomIn")); this->addAction(zoomInAct_); zoomOutAct_ = new QAction(this); zoomOutAct_->setObjectName("zoomOutAct"); zoomOutAct_->setIcon(QIcon(":/images/zoomOut")); this->addAction(zoomOutAct_); zoomTo100Act_ = new QAction(this); zoomTo100Act_->setObjectName("zoomTo100Act"); this->addAction(zoomTo100Act_); updateFeedAct_ = new QAction(this); updateFeedAct_->setObjectName("updateFeedAct"); updateFeedAct_->setIcon(QIcon(":/images/updateFeed")); this->addAction(updateFeedAct_); connect(updateFeedAct_, SIGNAL(triggered()), this, SLOT(slotGetFeed())); updateAllFeedsAct_ = new QAction(this); updateAllFeedsAct_->setObjectName("updateAllFeedsAct"); updateAllFeedsAct_->setIcon(QIcon(":/images/updateAllFeeds")); this->addAction(updateAllFeedsAct_); connect(updateAllFeedsAct_, SIGNAL(triggered()), this, SLOT(slotGetAllFeeds())); stopUpdateAct_ = new QAction(this); stopUpdateAct_->setObjectName("stopUpdateAct"); stopUpdateAct_->setIcon(QIcon(":/images/close")); this->addAction(stopUpdateAct_); connect(stopUpdateAct_, SIGNAL(triggered()), this, SLOT(slotStopUpdate())); markAllFeedsRead_ = new QAction(this); markAllFeedsRead_->setObjectName("markAllFeedRead"); markAllFeedsRead_->setIcon(QIcon(":/images/markReadAll")); this->addAction(markAllFeedsRead_); connect(markAllFeedsRead_, SIGNAL(triggered()), this, SIGNAL(signalMarkAllFeedsRead())); indentationFeedsTreeAct_ = new QAction(this); indentationFeedsTreeAct_->setCheckable(true); connect(indentationFeedsTreeAct_, SIGNAL(triggered()), this, SLOT(slotIndentationFeedsTree())); sortedByTitleFeedsTreeAct_ = new QAction(this); connect(sortedByTitleFeedsTreeAct_, SIGNAL(triggered()), this, SLOT(sortedByTitleFeedsTree())); collapseAllFoldersAct_ = new QAction(this); collapseAllFoldersAct_->setObjectName("collapseAllFolderAct"); collapseAllFoldersAct_->setIcon(QIcon(":/images/bulletMinus")); this->addAction(collapseAllFoldersAct_); connect(collapseAllFoldersAct_, SIGNAL(triggered()), feedsView_, SLOT(collapseAll())); expandAllFoldersAct_ = new QAction(this); expandAllFoldersAct_->setObjectName("expandAllFolderAct"); expandAllFoldersAct_->setIcon(QIcon(":/images/bulletPlus")); this->addAction(expandAllFoldersAct_); connect(expandAllFoldersAct_, SIGNAL(triggered()), feedsView_, SLOT(expandAll())); markNewsRead_ = new QAction(this); markNewsRead_->setObjectName("markNewsRead"); markNewsRead_->setIcon(QIcon(":/images/markRead")); this->addAction(markNewsRead_); markAllNewsRead_ = new QAction(this); markAllNewsRead_->setObjectName("markAllNewsRead"); markAllNewsRead_->setIcon(QIcon(":/images/markReadAll")); this->addAction(markAllNewsRead_); showDownloadManagerAct_ = new QAction(this); showDownloadManagerAct_->setObjectName("showDownloadManagerAct"); showDownloadManagerAct_->setIcon(QIcon(":/images/download")); this->addAction(showDownloadManagerAct_); connect(showDownloadManagerAct_, SIGNAL(triggered()), this, SLOT(showDownloadManager())); showCleanUpWizardAct_ = new QAction(this); showCleanUpWizardAct_->setObjectName("showCleanUpWizardAct"); showCleanUpWizardAct_->setIcon(QIcon(":/images/cleanup")); this->addAction(showCleanUpWizardAct_); connect(showCleanUpWizardAct_, SIGNAL(triggered()), this, SLOT(cleanUp())); setNewsFiltersAct_ = new QAction(this); setNewsFiltersAct_->setObjectName("setNewsFiltersAct"); setNewsFiltersAct_->setIcon(QIcon(":/images/filterOff")); this->addAction(setNewsFiltersAct_); connect(setNewsFiltersAct_, SIGNAL(triggered()), this, SLOT(showNewsFiltersDlg())); setFilterNewsAct_ = new QAction(this); setFilterNewsAct_->setObjectName("setFilterNewsAct"); setFilterNewsAct_->setIcon(QIcon(":/images/filterOff")); this->addAction(setFilterNewsAct_); connect(setFilterNewsAct_, SIGNAL(triggered()), this, SLOT(showFilterRulesDlg())); optionsAct_ = new QAction(this); optionsAct_->setObjectName("optionsAct"); optionsAct_->setIcon(QIcon(":/images/options")); this->addAction(optionsAct_); connect(optionsAct_, SIGNAL(triggered()), this, SLOT(showOptionDlg())); feedsFilter_ = new QAction(this); feedsFilter_->setObjectName("feedsFilter"); feedsFilter_->setIcon(QIcon(":/images/filterOff")); this->addAction(feedsFilter_); filterFeedsAll_ = new QAction(this); filterFeedsAll_->setObjectName("filterFeedsAll_"); filterFeedsAll_->setCheckable(true); filterFeedsAll_->setChecked(true); filterFeedsNew_ = new QAction(this); filterFeedsNew_->setObjectName("filterFeedsNew_"); filterFeedsNew_->setCheckable(true); filterFeedsUnread_ = new QAction(this); filterFeedsUnread_->setObjectName("filterFeedsUnread_"); filterFeedsUnread_->setCheckable(true); filterFeedsStarred_ = new QAction(this); filterFeedsStarred_->setObjectName("filterFeedsStarred_"); filterFeedsStarred_->setCheckable(true); filterFeedsError_ = new QAction(this); filterFeedsError_->setObjectName("filterFeedsError_"); filterFeedsError_->setCheckable(true); newsFilter_ = new QAction(this); newsFilter_->setObjectName("newsFilter"); newsFilter_->setIcon(QIcon(":/images/filterOff")); this->addAction(newsFilter_); filterNewsAll_ = new QAction(this); filterNewsAll_->setObjectName("filterNewsAll_"); filterNewsAll_->setCheckable(true); filterNewsAll_->setChecked(true); filterNewsNew_ = new QAction(this); filterNewsNew_->setObjectName("filterNewsNew_"); filterNewsNew_->setCheckable(true); filterNewsUnread_ = new QAction(this); filterNewsUnread_->setObjectName("filterNewsUnread_"); filterNewsUnread_->setCheckable(true); filterNewsStar_ = new QAction(this); filterNewsStar_->setObjectName("filterNewsStar_"); filterNewsStar_->setCheckable(true); filterNewsNotStarred_ = new QAction(this); filterNewsNotStarred_->setObjectName("filterNewsNotStarred_"); filterNewsNotStarred_->setCheckable(true); filterNewsUnreadStar_ = new QAction(this); filterNewsUnreadStar_->setObjectName("filterNewsUnreadStar_"); filterNewsUnreadStar_->setCheckable(true); filterNewsLastDay_ = new QAction(this); filterNewsLastDay_->setObjectName("filterNewsLastDay_"); filterNewsLastDay_->setCheckable(true); filterNewsLastWeek_ = new QAction(this); filterNewsLastWeek_->setObjectName("filterNewsLastWeek_"); filterNewsLastWeek_->setCheckable(true); newsSortByColumnGroup_ = new QActionGroup(this); newsSortByColumnGroup_->setExclusive(true); connect(newsSortByColumnGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setNewsSortByColumn())); newsSortOrderGroup_ = new QActionGroup(this); newsSortOrderGroup_->setExclusive(true); QStringList listAct; listAct << "sortOrderAsc" << "sortOrderDesc"; foreach (QString actionStr, listAct) { QAction *newsSortOrderAct = new QAction(this); newsSortOrderAct->setObjectName(actionStr); newsSortOrderAct->setCheckable(true); newsSortOrderGroup_->addAction(newsSortOrderAct); } connect(newsSortOrderGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setNewsSortByColumn())); aboutAct_ = new QAction(this); aboutAct_->setObjectName("AboutAct_"); connect(aboutAct_, SIGNAL(triggered()), this, SLOT(slotShowAboutDlg())); updateAppAct_ = new QAction(this); updateAppAct_->setObjectName("UpdateApp_"); connect(updateAppAct_, SIGNAL(triggered()), this, SLOT(slotShowUpdateAppDlg())); reportProblemAct_ = new QAction(this); reportProblemAct_->setObjectName("reportProblemAct_"); connect(reportProblemAct_, SIGNAL(triggered()), this, SLOT(slotReportProblem())); openInBrowserAct_ = new QAction(this); openInBrowserAct_->setObjectName("openInBrowserAct"); this->addAction(openInBrowserAct_); openInExternalBrowserAct_ = new QAction(this); openInExternalBrowserAct_->setObjectName("openInExternalBrowserAct"); openInExternalBrowserAct_->setIcon(QIcon(":/images/openBrowser")); this->addAction(openInExternalBrowserAct_); openNewsNewTabAct_ = new QAction(this); openNewsNewTabAct_->setObjectName("openInNewTabAct"); openNewsNewTabAct_->setIcon(QIcon(":/images/images/tab_go.png")); this->addAction(openNewsNewTabAct_); openNewsBackgroundTabAct_ = new QAction(this); openNewsBackgroundTabAct_->setObjectName("openInBackgroundTabAct"); this->addAction(openNewsBackgroundTabAct_); markStarAct_ = new QAction(this); markStarAct_->setObjectName("markStarAct"); markStarAct_->setIcon(QIcon(":/images/starOn")); this->addAction(markStarAct_); deleteNewsAct_ = new QAction(this); deleteNewsAct_->setObjectName("deleteNewsAct"); deleteNewsAct_->setIcon(QIcon(":/images/delete")); this->addAction(deleteNewsAct_); deleteAllNewsAct_ = new QAction(this); deleteAllNewsAct_->setObjectName("deleteAllNewsAct"); this->addAction(deleteAllNewsAct_); restoreNewsAct_ = new QAction(this); restoreNewsAct_->setObjectName("restoreNewsAct"); restoreNewsAct_->setIcon(QIcon(":/images/images/arrow_turn_left.png")); restoreLastNewsAct_ = new QAction(this); restoreLastNewsAct_->setObjectName("restoreLastNewsAct"); restoreLastNewsAct_->setIcon(QIcon(":/images/images/arrow_turn_left.png")); this->addAction(restoreLastNewsAct_); connect(restoreLastNewsAct_, SIGNAL(triggered()), this, SLOT(restoreLastNews())); markFeedRead_ = new QAction(this); markFeedRead_->setObjectName("markFeedRead"); markFeedRead_->setIcon(QIcon(":/images/markRead")); this->addAction(markFeedRead_); connect(markFeedRead_, SIGNAL(triggered()), this, SLOT(markFeedRead())); feedProperties_ = new QAction(this); feedProperties_->setObjectName("feedProperties"); feedProperties_->setIcon(QIcon(":/images/preferencesFeed")); this->addAction(feedProperties_); connect(feedProperties_, SIGNAL(triggered()), this, SLOT(showFeedPropertiesDlg())); feedKeyUpAct_ = new QAction(this); feedKeyUpAct_->setObjectName("feedKeyUp"); connect(feedKeyUpAct_, SIGNAL(triggered()), this, SLOT(slotFeedPrevious())); this->addAction(feedKeyUpAct_); feedKeyDownAct_ = new QAction(this); feedKeyDownAct_->setObjectName("feedKeyDownAct"); connect(feedKeyDownAct_, SIGNAL(triggered()), this, SLOT(slotFeedNext())); this->addAction(feedKeyDownAct_); newsKeyUpAct_ = new QAction(this); newsKeyUpAct_->setObjectName("newsKeyUpAct"); this->addAction(newsKeyUpAct_); newsKeyDownAct_ = new QAction(this); newsKeyDownAct_->setObjectName("newsKeyDownAct"); this->addAction(newsKeyDownAct_); newsKeyPageUpAct_ = new QAction(this); newsKeyPageUpAct_->setObjectName("newsKeyPageUpAct"); this->addAction(newsKeyPageUpAct_); newsKeyPageDownAct_ = new QAction(this); newsKeyPageDownAct_->setObjectName("newsKeyPageDownAct"); this->addAction(newsKeyPageDownAct_); switchFocusAct_ = new QAction(this); switchFocusAct_->setObjectName("switchFocusAct"); connect(switchFocusAct_, SIGNAL(triggered()), this, SLOT(slotSwitchFocus())); this->addAction(switchFocusAct_); switchFocusPrevAct_ = new QAction(this); switchFocusPrevAct_->setObjectName("switchFocusPrevAct"); connect(switchFocusPrevAct_, SIGNAL(triggered()), this, SLOT(slotSwitchPrevFocus())); this->addAction(switchFocusPrevAct_); feedsWidgetVisibleAct_ = new QAction(this); feedsWidgetVisibleAct_->setObjectName("visibleFeedsWidgetAct"); feedsWidgetVisibleAct_->setCheckable(true); connect(feedsWidgetVisibleAct_, SIGNAL(triggered()), this, SLOT(slotVisibledFeedsWidget())); connect(pushButtonNull_, SIGNAL(clicked()), feedsWidgetVisibleAct_, SLOT(trigger())); this->addAction(feedsWidgetVisibleAct_); showUnreadCount_ = new QAction(this); showUnreadCount_->setData(feedsView_->columnIndex("unread")); showUnreadCount_->setCheckable(true); showUndeleteCount_ = new QAction(this); showUndeleteCount_->setData(feedsView_->columnIndex("undeleteCount")); showUndeleteCount_->setCheckable(true); showLastUpdated_ = new QAction(this); showLastUpdated_->setData(feedsView_->columnIndex("updated")); showLastUpdated_->setCheckable(true); openDescriptionNewsAct_ = new QAction(this); openDescriptionNewsAct_->setObjectName("openDescriptionNewsAct"); connect(openDescriptionNewsAct_, SIGNAL(triggered()), this, SLOT(slotOpenNewsWebView())); this->addAction(openDescriptionNewsAct_); findTextAct_ = new QAction(this); findTextAct_->setObjectName("findTextAct"); connect(findTextAct_, SIGNAL(triggered()), this, SLOT(findText())); this->addAction(findTextAct_); placeToTrayAct_ = new QAction(this); placeToTrayAct_->setObjectName("placeToTrayAct"); connect(placeToTrayAct_, SIGNAL(triggered()), this, SLOT(slotPlaceToTray())); this->addAction(placeToTrayAct_); findFeedAct_ = new QAction(this); findFeedAct_->setObjectName("findFeedAct"); findFeedAct_->setCheckable(true); findFeedAct_->setChecked(false); findFeedAct_->setIcon(QIcon(":/images/images/findFeed.png")); this->addAction(findFeedAct_); connect(findFeedAct_, SIGNAL(triggered(bool)), this, SLOT(findFeedVisible(bool))); fullScreenAct_ = new QAction(this); fullScreenAct_->setObjectName("fullScreenAct"); fullScreenAct_->setIcon(QIcon(":/images/images/fullScreen.png")); this->addAction(fullScreenAct_); connect(fullScreenAct_, SIGNAL(triggered()), this, SLOT(setFullScreen())); stayOnTopAct_ = new QAction(this); stayOnTopAct_->setObjectName("stayOnTopAct"); stayOnTopAct_->setCheckable(true); this->addAction(stayOnTopAct_); connect(stayOnTopAct_, SIGNAL(triggered()), this, SLOT(setStayOnTop())); newsLabelGroup_ = new QActionGroup(this); newsLabelGroup_->setExclusive(false); QSqlQuery q; q.exec("SELECT id, name, image FROM labels ORDER BY num"); while (q.next()) { int idLabel = q.value(0).toInt(); QString nameLabel = q.value(1).toString(); QByteArray byteArray = q.value(2).toByteArray(); QPixmap imageLabel; if (!byteArray.isNull()) imageLabel.loadFromData(byteArray); QAction *action = new QAction(QIcon(imageLabel), nameLabel, this); action->setObjectName(QString("labelAction_%1").arg(idLabel)); action->setCheckable(true); action->setData(idLabel); newsLabelGroup_->addAction(action); } this->addActions(newsLabelGroup_->actions()); newsLabelAction_ = new QAction(this); newsLabelAction_->setObjectName("newsLabelAction"); this->addAction(newsLabelAction_); if (newsLabelGroup_->actions().count()) { newsLabelAction_->setIcon(newsLabelGroup_->actions().at(0)->icon()); newsLabelAction_->setToolTip(newsLabelGroup_->actions().at(0)->text()); newsLabelAction_->setData(newsLabelGroup_->actions().at(0)->data()); } connect(newsLabelAction_, SIGNAL(triggered()), this, SLOT(setDefaultLabelNews())); connect(newsLabelGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setLabelNews(QAction*))); showLabelsMenuAct_ = new QAction(this); showLabelsMenuAct_->setObjectName("showLabelsMenuAct"); this->addAction(showLabelsMenuAct_); connect(showLabelsMenuAct_, SIGNAL(triggered()), this, SLOT(slotShowLabelsMenu())); closeTabAct_ = new QAction(this); closeTabAct_->setObjectName("closeTabAct"); this->addAction(closeTabAct_); closeOtherTabsAct_ = new QAction(this); closeOtherTabsAct_->setObjectName("closeOtherTabsAct"); this->addAction(closeOtherTabsAct_); closeAllTabsAct_ = new QAction(this); closeAllTabsAct_->setObjectName("closeAllTabsAct"); this->addAction(closeAllTabsAct_); nextTabAct_ = new QAction(this); nextTabAct_->setObjectName("nextTabAct"); this->addAction(nextTabAct_); prevTabAct_ = new QAction(this); prevTabAct_->setObjectName("prevTabAct"); this->addAction(prevTabAct_); reduceNewsListAct_ = new QAction(this); reduceNewsListAct_->setObjectName("reduceNewsListAct"); this->addAction(reduceNewsListAct_); connect(reduceNewsListAct_, SIGNAL(triggered()), this, SLOT(reduceNewsList())); increaseNewsListAct_ = new QAction(this); increaseNewsListAct_->setObjectName("increaseNewsListAct"); this->addAction(increaseNewsListAct_); connect(increaseNewsListAct_, SIGNAL(triggered()), this, SLOT(increaseNewsList())); nextUnreadNewsAct_ = new QAction(this); nextUnreadNewsAct_->setObjectName("nextUnreadNewsAct"); nextUnreadNewsAct_->setIcon(QIcon(":/images/moveDown")); this->addAction(nextUnreadNewsAct_); connect(nextUnreadNewsAct_, SIGNAL(triggered()), this, SLOT(nextUnreadNews())); prevUnreadNewsAct_ = new QAction(this); prevUnreadNewsAct_->setObjectName("prevUnreadNewsAct"); prevUnreadNewsAct_->setIcon(QIcon(":/images/moveUp")); this->addAction(prevUnreadNewsAct_); connect(prevUnreadNewsAct_, SIGNAL(triggered()), this, SLOT(prevUnreadNews())); openHomeFeedAct_ = new QAction(this); openHomeFeedAct_->setObjectName("openHomeFeedsAct"); openHomeFeedAct_->setIcon(QIcon(":/images/homePage")); this->addAction(openHomeFeedAct_); connect(openHomeFeedAct_, SIGNAL(triggered()), this, SLOT(slotOpenHomeFeed())); copyLinkAct_ = new QAction(this); copyLinkAct_->setObjectName("copyLinkAct"); copyLinkAct_->setIcon(QIcon(":/images/copy")); this->addAction(copyLinkAct_); connect(copyLinkAct_, SIGNAL(triggered()), this, SLOT(slotCopyLinkNews())); pageUpWebViewAct_ = new QAction(this); pageUpWebViewAct_->setObjectName("pageUpWebViewAct"); this->addAction(pageUpWebViewAct_); connect(pageUpWebViewAct_, SIGNAL(triggered()), this, SLOT(slotPageUpWebView())); pageDownWebViewAct_ = new QAction(this); pageDownWebViewAct_->setObjectName("pageDownWebViewAct"); this->addAction(pageDownWebViewAct_); connect(pageDownWebViewAct_, SIGNAL(triggered()), this, SLOT(slotPageDownWebView())); nextFolderAct_ = new QAction(this); nextFolderAct_->setObjectName("nextFolderAct"); this->addAction(nextFolderAct_); connect(nextFolderAct_, SIGNAL(triggered()), this, SLOT(slotNextFolder())); prevFolderAct_ = new QAction(this); prevFolderAct_->setObjectName("prevFolderAct"); this->addAction(prevFolderAct_); connect(prevFolderAct_, SIGNAL(triggered()), this, SLOT(slotPrevFolder())); expandFolderAct_ = new QAction(this); expandFolderAct_->setObjectName("expandFolderAct"); this->addAction(expandFolderAct_); connect(expandFolderAct_, SIGNAL(triggered()), this, SLOT(slotExpandFolder())); settingPageLabelsAct_ = new QAction(this); settingPageLabelsAct_->setObjectName("settingPageLabelsAct"); this->addAction(settingPageLabelsAct_); connect(settingPageLabelsAct_, SIGNAL(triggered()), this, SLOT(showSettingPageLabels())); backWebPageAct_ = new QAction(this); backWebPageAct_->setObjectName("backWebPageAct"); forwardWebPageAct_ = new QAction(this); forwardWebPageAct_->setObjectName("forwardWebPageAct"); reloadWebPageAct_ = new QAction(this); reloadWebPageAct_->setObjectName("reloadWebPageAct"); shareGroup_ = new QActionGroup(this); shareGroup_->setExclusive(false); emailShareAct_ = new QAction(this); emailShareAct_->setObjectName("emailShareAct"); emailShareAct_->setText("Email"); emailShareAct_->setIcon(QIcon(":/images/images/email.png")); shareGroup_->addAction(emailShareAct_); evernoteShareAct_ = new QAction(this); evernoteShareAct_->setObjectName("evernoteShareAct"); evernoteShareAct_->setText("Evernote"); evernoteShareAct_->setIcon(QIcon(":/share/images/share/evernote.png")); shareGroup_->addAction(evernoteShareAct_); gplusShareAct_ = new QAction(this); gplusShareAct_->setObjectName("gplusShareAct"); gplusShareAct_->setText("Google+"); gplusShareAct_->setIcon(QIcon(":/share/images/share/gplus.png")); shareGroup_->addAction(gplusShareAct_); facebookShareAct_ = new QAction(this); facebookShareAct_->setObjectName("facebookShareAct"); facebookShareAct_->setText("Facebook"); facebookShareAct_->setIcon(QIcon(":/share/images/share/facebook.png")); shareGroup_->addAction(facebookShareAct_); livejournalShareAct_ = new QAction(this); livejournalShareAct_->setObjectName("livejournalShareAct"); livejournalShareAct_->setText("LiveJournal"); livejournalShareAct_->setIcon(QIcon(":/share/images/share/livejournal.png")); shareGroup_->addAction(livejournalShareAct_); pocketShareAct_ = new QAction(this); pocketShareAct_->setObjectName("pocketShareAct"); pocketShareAct_->setText("Pocket"); pocketShareAct_->setIcon(QIcon(":/share/images/share/pocket.png")); shareGroup_->addAction(pocketShareAct_); twitterShareAct_ = new QAction(this); twitterShareAct_->setObjectName("twitterShareAct"); twitterShareAct_->setText("Twitter"); twitterShareAct_->setIcon(QIcon(":/share/images/share/twitter.png")); shareGroup_->addAction(twitterShareAct_); vkShareAct_ = new QAction(this); vkShareAct_->setObjectName("vkShareAct"); vkShareAct_->setText("VK"); vkShareAct_->setIcon(QIcon(":/share/images/share/vk.png")); shareGroup_->addAction(vkShareAct_); linkedinShareAct_ = new QAction(this); linkedinShareAct_->setObjectName("linkedinShareAct"); linkedinShareAct_->setText("LinkedIn"); linkedinShareAct_->setIcon(QIcon(":/share/images/share/linkedin.png")); shareGroup_->addAction(linkedinShareAct_); bloggerShareAct_ = new QAction(this); bloggerShareAct_->setObjectName("bloggerShareAct"); bloggerShareAct_->setText("Blogger"); bloggerShareAct_->setIcon(QIcon(":/share/images/share/blogger.png")); shareGroup_->addAction(bloggerShareAct_); printfriendlyShareAct_ = new QAction(this); printfriendlyShareAct_->setObjectName("printfriendlyShareAct"); printfriendlyShareAct_->setText("PrintFriendly"); printfriendlyShareAct_->setIcon(QIcon(":/share/images/share/printfriendly.png")); shareGroup_->addAction(printfriendlyShareAct_); this->addActions(shareGroup_->actions()); connect(shareGroup_, SIGNAL(triggered(QAction*)), this, SLOT(slotShareNews(QAction*))); connect(markNewsRead_, SIGNAL(triggered()), this, SLOT(markNewsRead())); connect(markAllNewsRead_, SIGNAL(triggered()), this, SLOT(markAllNewsRead())); connect(markStarAct_, SIGNAL(triggered()), this, SLOT(markNewsStar())); connect(deleteNewsAct_, SIGNAL(triggered()), this, SLOT(deleteNews())); connect(deleteAllNewsAct_, SIGNAL(triggered()), this, SLOT(deleteAllNewsList())); connect(restoreNewsAct_, SIGNAL(triggered()), this, SLOT(restoreNews())); connect(newsKeyUpAct_, SIGNAL(triggered()), this, SLOT(slotNewsUpPressed())); connect(newsKeyDownAct_, SIGNAL(triggered()), this, SLOT(slotNewsDownPressed())); connect(newsKeyPageUpAct_, SIGNAL(triggered()), this, SLOT(slotNewsPageUpPressed())); connect(newsKeyPageDownAct_, SIGNAL(triggered()), this, SLOT(slotNewsPageDownPressed())); connect(openInBrowserAct_, SIGNAL(triggered()), this, SLOT(openInBrowserNews())); connect(openInExternalBrowserAct_, SIGNAL(triggered()), this, SLOT(openInExternalBrowserNews())); connect(openNewsNewTabAct_, SIGNAL(triggered()), this, SLOT(slotOpenNewsNewTab())); connect(openNewsBackgroundTabAct_, SIGNAL(triggered()), this, SLOT(slotOpenNewsBackgroundTab())); } // --------------------------------------------------------------------------- void MainWindow::createShortcut() { addFeedAct_->setShortcut(QKeySequence(QKeySequence::New)); listActions_.append(addFeedAct_); addFolderAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_N)); listActions_.append(addFolderAct_); listActions_.append(deleteFeedAct_); listActions_.append(createBackupAct_); exitAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); // standart on other OS listActions_.append(exitAct_); updateFeedAct_->setShortcut(QKeySequence(Qt::Key_F5)); listActions_.append(updateFeedAct_); updateAllFeedsAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F5)); listActions_.append(updateAllFeedsAct_); listActions_.append(stopUpdateAct_); listActions_.append(openHomeFeedAct_); listActions_.append(showDownloadManagerAct_); listActions_.append(showCleanUpWizardAct_); listActions_.append(setNewsFiltersAct_); listActions_.append(setFilterNewsAct_); optionsAct_->setShortcut(QKeySequence(Qt::Key_F8)); listActions_.append(optionsAct_); deleteNewsAct_->setShortcut(QKeySequence(Qt::Key_Delete)); listActions_.append(deleteNewsAct_); deleteAllNewsAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Delete)); listActions_.append(deleteAllNewsAct_); feedProperties_->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_E)); listActions_.append(feedProperties_); feedKeyUpAct_->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_Up)); listActions_.append(feedKeyUpAct_); feedKeyDownAct_->setShortcut(QKeySequence(Qt::CTRL+Qt::Key_Down)); listActions_.append(feedKeyDownAct_); newsKeyUpAct_->setShortcut(QKeySequence(Qt::Key_Left)); listActions_.append(newsKeyUpAct_); newsKeyDownAct_->setShortcut(QKeySequence(Qt::Key_Right)); listActions_.append(newsKeyDownAct_); listActions_.append(newsKeyPageUpAct_); listActions_.append(newsKeyPageDownAct_); listActions_.append(nextUnreadNewsAct_); listActions_.append(prevUnreadNewsAct_); listActions_.append(nextFolderAct_); listActions_.append(prevFolderAct_); listActions_.append(importFeedsAct_); listActions_.append(exportFeedsAct_); listActions_.append(createBackupAct_); listActions_.append(autoLoadImagesToggle_); listActions_.append(markAllFeedsRead_); listActions_.append(markFeedRead_); listActions_.append(markNewsRead_); listActions_.append(markAllNewsRead_); listActions_.append(markStarAct_); listActions_.append(collapseAllFoldersAct_); listActions_.append(expandAllFoldersAct_); listActions_.append(expandFolderAct_); listActions_.append(openDescriptionNewsAct_); openDescriptionNewsAct_->setShortcut(QKeySequence(Qt::Key_Return)); listActions_.append(openInBrowserAct_); openInBrowserAct_->setShortcut(QKeySequence(Qt::Key_Space)); listActions_.append(openInExternalBrowserAct_); openInExternalBrowserAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O)); openNewsNewTabAct_->setShortcut(QKeySequence(Qt::Key_T)); listActions_.append(openNewsNewTabAct_); openNewsBackgroundTabAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_T)); listActions_.append(openNewsBackgroundTabAct_); switchFocusAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Tab)); listActions_.append(switchFocusAct_); switchFocusPrevAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Tab)); listActions_.append(switchFocusPrevAct_); feedsWidgetVisibleAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_D)); listActions_.append(feedsWidgetVisibleAct_); listActions_.append(placeToTrayAct_); zoomInAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Plus)); listActions_.append(zoomInAct_); zoomOutAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Minus)); listActions_.append(zoomOutAct_); zoomTo100Act_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); listActions_.append(zoomTo100Act_); printAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_P)); listActions_.append(printAct_); printPreviewAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_P)); listActions_.append(printPreviewAct_); savePageAsAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); listActions_.append(savePageAsAct_); listActions_.append(savePageAsDescriptAct_); fullScreenAct_->setShortcut(QKeySequence(Qt::Key_F11)); listActions_.append(fullScreenAct_); stayOnTopAct_->setShortcut(QKeySequence(Qt::Key_F10)); listActions_.append(stayOnTopAct_); listActions_.append(layoutToggle_); closeTabAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_W)); listActions_.append(closeTabAct_); listActions_.append(closeOtherTabsAct_); listActions_.append(closeAllTabsAct_); listActions_.append(nextTabAct_); listActions_.append(prevTabAct_); reduceNewsListAct_->setShortcut(QKeySequence(Qt::ALT+ Qt::Key_Up)); listActions_.append(reduceNewsListAct_); increaseNewsListAct_->setShortcut(QKeySequence(Qt::ALT + Qt::Key_Down)); listActions_.append(increaseNewsListAct_); restoreLastNewsAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Z)); listActions_.append(restoreLastNewsAct_); findTextAct_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_F)); listActions_.append(findTextAct_); listActions_.append(copyLinkAct_); listActions_.append(backWebPageAct_); listActions_.append(forwardWebPageAct_); listActions_.append(reloadWebPageAct_); listActions_.append(pageUpWebViewAct_); listActions_.append(pageDownWebViewAct_); listActions_.append(shareGroup_->actions()); // Actions for labels do add at the end listActions_.append(settingPageLabelsAct_); listActions_.append(showLabelsMenuAct_); listActions_.append(newsLabelGroup_->actions()); loadActionShortcuts(); } // --------------------------------------------------------------------------- void MainWindow::loadActionShortcuts() { Settings settings; settings.beginGroup("/Shortcuts"); QListIterator iter(listActions_); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) continue; listDefaultShortcut_.append(pAction->shortcut().toString()); const QString& sKey = '/' + pAction->objectName(); const QString& sValue = settings.value('/' + sKey, pAction->shortcut().toString()).toString(); pAction->setShortcut(QKeySequence(sValue)); } settings.endGroup(); } // --------------------------------------------------------------------------- void MainWindow::saveActionShortcuts() { Settings settings; settings.beginGroup("/Shortcuts/"); QListIterator iter(listActions_); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) continue; const QString& sKey = '/' + pAction->objectName(); const QString& sValue = QString(pAction->shortcut().toString()); settings.setValue(sKey, sValue); } settings.endGroup(); } // --------------------------------------------------------------------------- void MainWindow::createMenu() { mainMenu_ = new QMenu(this); newMenu_ = new QMenu(this); newMenu_->addAction(addFeedAct_); newMenu_->addAction(addFolderAct_); addAct_->setMenu(newMenu_); fileMenu_ = new QMenu(this); fileMenu_->addAction(addAct_); fileMenu_->addSeparator(); fileMenu_->addAction(importFeedsAct_); fileMenu_->addAction(exportFeedsAct_); fileMenu_->addSeparator(); fileMenu_->addAction(createBackupAct_); fileMenu_->addSeparator(); #ifndef Q_OS_MAC fileMenu_->addAction(showMenuBarAct_); fileMenu_->addSeparator(); #endif fileMenu_->addAction(exitAct_); mainMenu_->addAction(addAct_); mainMenu_->addSeparator(); mainMenu_->addAction(importFeedsAct_); mainMenu_->addAction(exportFeedsAct_); mainMenu_->addSeparator(); mainMenu_->addAction(createBackupAct_); mainMenu_->addSeparator(); toolbarsMenu_ = new QMenu(this); toolbarsMenu_->addAction(mainToolbarToggle_); toolbarsMenu_->addAction(feedsToolbarToggle_); toolbarsMenu_->addAction(newsToolbarToggle_); toolbarsMenu_->addAction(browserToolbarToggle_); toolbarsMenu_->addAction(categoriesPanelToggle_); toolbarsMenu_->addAction(statusBarToggle_); customizeToolbarGroup_ = new QActionGroup(this); customizeToolbarGroup_->addAction(customizeMainToolbarAct_); customizeToolbarGroup_->addAction(customizeFeedsToolbarAct_); customizeToolbarGroup_->addAction(customizeNewsToolbarAct_); customizeToolbarMenu_ = new QMenu(this); customizeToolbarMenu_->addActions(customizeToolbarGroup_->actions()); layoutGroup_ = new QActionGroup(this); layoutGroup_->addAction(classicLayoutAct_); layoutGroup_->addAction(newspaperLayoutAct_); layoutMenu_ = new QMenu(this); layoutMenu_->addActions(layoutGroup_->actions()); layoutToggle_->setMenu(layoutMenu_); styleGroup_ = new QActionGroup(this); styleGroup_->addAction(systemStyle_); styleGroup_->addAction(system2Style_); styleGroup_->addAction(greenStyle_); styleGroup_->addAction(orangeStyle_); styleGroup_->addAction(purpleStyle_); styleGroup_->addAction(pinkStyle_); styleGroup_->addAction(grayStyle_); styleMenu_ = new QMenu(this); styleMenu_->addActions(styleGroup_->actions()); browserPositionGroup_ = new QActionGroup(this); browserPositionGroup_->addAction(topBrowserPositionAct_); browserPositionGroup_->addAction(bottomBrowserPositionAct_); browserPositionGroup_->addAction(rightBrowserPositionAct_); browserPositionGroup_->addAction(leftBrowserPositionAct_); browserPositionMenu_ = new QMenu(this); browserPositionMenu_->addActions(browserPositionGroup_->actions()); viewMenu_ = new QMenu(this); viewMenu_->addMenu(toolbarsMenu_); viewMenu_->addMenu(customizeToolbarMenu_); viewMenu_->addSeparator(); viewMenu_->addMenu(layoutMenu_); viewMenu_->addMenu(browserPositionMenu_); viewMenu_->addMenu(styleMenu_); viewMenu_->addSeparator(); viewMenu_->addAction(stayOnTopAct_); viewMenu_->addAction(fullScreenAct_); mainMenu_->addMenu(viewMenu_); feedMenu_ = new QMenu(this); feedMenu_->addAction(updateFeedAct_); feedMenu_->addAction(updateAllFeedsAct_); feedMenu_->addSeparator(); feedMenu_->addAction(markFeedRead_); feedMenu_->addAction(markAllFeedsRead_); feedMenu_->addSeparator(); mainMenu_->addMenu(feedMenu_); feedsFilterGroup_ = new QActionGroup(this); feedsFilterGroup_->setExclusive(true); feedsFilterGroup_->addAction(filterFeedsAll_); feedsFilterGroup_->addAction(filterFeedsNew_); feedsFilterGroup_->addAction(filterFeedsUnread_); feedsFilterGroup_->addAction(filterFeedsStarred_); feedsFilterGroup_->addAction(filterFeedsError_); feedsFilterMenu_ = new QMenu(this); feedsFilterMenu_->addActions(feedsFilterGroup_->actions()); feedsFilterMenu_->insertSeparator(filterFeedsNew_); feedsFilter_->setMenu(feedsFilterMenu_); feedMenu_->addAction(feedsFilter_); feedsColumnsGroup_ = new QActionGroup(this); feedsColumnsGroup_->setExclusive(false); feedsColumnsGroup_->addAction(showUnreadCount_); feedsColumnsGroup_->addAction(showUndeleteCount_); feedsColumnsGroup_->addAction(showLastUpdated_); feedsColumnsMenu_ = new QMenu(this); feedsColumnsMenu_->addActions(feedsColumnsGroup_->actions()); feedMenu_->addMenu(feedsColumnsMenu_); feedMenu_->addAction(sortedByTitleFeedsTreeAct_); feedMenu_->addAction(indentationFeedsTreeAct_); feedMenu_->addSeparator(); feedMenu_->addAction(deleteFeedAct_); feedMenu_->addSeparator(); feedMenu_->addAction(feedProperties_); feedMenu_->addSeparator(); newsMenu_ = new QMenu(this); newsMenu_->addAction(markNewsRead_); newsMenu_->addAction(markAllNewsRead_); newsMenu_->addSeparator(); newsMenu_->addAction(markStarAct_); mainMenu_->addMenu(newsMenu_); newsLabelMenu_ = new QMenu(this); newsLabelMenu_->addActions(newsLabelGroup_->actions()); newsLabelMenuAction_ = new QAction(this); newsLabelMenuAction_->setIcon(QIcon(":/images/label_3")); newsLabelAction_->setMenu(newsLabelMenu_); newsLabelMenuAction_->setMenu(newsLabelMenu_); newsMenu_->addAction(newsLabelMenuAction_); shareMenu_ = new QMenu(this); shareMenu_->addActions(shareGroup_->actions()); shareMenuAct_ = new QAction(this); shareMenuAct_->setObjectName("shareMenuAct"); shareMenuAct_->setIcon(QIcon(":/images/images/share.png")); shareMenuAct_->setMenu(shareMenu_); newsMenu_->addAction(shareMenuAct_); this->addAction(shareMenuAct_); newsMenu_->addSeparator(); newsFilterGroup_ = new QActionGroup(this); newsFilterGroup_->setExclusive(true); newsFilterGroup_->addAction(filterNewsAll_); newsFilterGroup_->addAction(filterNewsNew_); newsFilterGroup_->addAction(filterNewsUnread_); newsFilterGroup_->addAction(filterNewsStar_); newsFilterGroup_->addAction(filterNewsNotStarred_); newsFilterGroup_->addAction(filterNewsUnreadStar_); newsFilterGroup_->addAction(filterNewsLastDay_); newsFilterGroup_->addAction(filterNewsLastWeek_); newsFilterMenu_ = new QMenu(this); newsFilterMenu_->addActions(newsFilterGroup_->actions()); newsFilterMenu_->insertSeparator(filterNewsNew_); newsFilterMenu_->insertSeparator(filterNewsLastDay_); newsFilter_->setMenu(newsFilterMenu_); newsMenu_->addAction(newsFilter_); newsSortByMenu_ = new QMenu(this); newsSortByMenu_->addSeparator(); newsSortByMenu_->addActions(newsSortOrderGroup_->actions()); newsMenu_->addMenu(newsSortByMenu_); newsMenu_->addSeparator(); newsMenu_->addAction(deleteNewsAct_); newsMenu_->addAction(deleteAllNewsAct_); browserMenu_ = new QMenu(this); mainMenu_->addMenu(browserMenu_); browserZoomGroup_ = new QActionGroup(this); browserZoomGroup_->addAction(zoomInAct_); browserZoomGroup_->addAction(zoomOutAct_); browserZoomGroup_->addAction(zoomTo100Act_); browserZoomMenu_ = new QMenu(this); browserZoomMenu_->setIcon(QIcon(":/images/zoom")); browserZoomMenu_->addActions(browserZoomGroup_->actions()); browserZoomMenu_->insertSeparator(zoomTo100Act_); browserMenu_->addAction(autoLoadImagesToggle_); browserMenu_->addMenu(browserZoomMenu_); browserMenu_->addSeparator(); browserMenu_->addAction(printAct_); browserMenu_->addAction(printPreviewAct_); browserMenu_->addSeparator(); browserMenu_->addAction(savePageAsAct_); browserMenu_->addSeparator(); browserMenu_->addAction(tr("&AdBlock"), AdBlockManager::instance(), SLOT(showDialog())); mainMenu_->addSeparator(); toolsMenu_ = new QMenu(this); toolsMenu_->addAction(showDownloadManagerAct_); toolsMenu_->addSeparator(); toolsMenu_->addAction(showCleanUpWizardAct_); toolsMenu_->addAction(setNewsFiltersAct_); toolsMenu_->addSeparator(); toolsMenu_->addAction(optionsAct_); mainMenu_->addMenu(toolsMenu_); helpMenu_ = new QMenu(this); helpMenu_->addAction(updateAppAct_); helpMenu_->addSeparator(); helpMenu_->addAction(reportProblemAct_); helpMenu_->addAction(aboutAct_); mainMenu_->addSeparator(); mainMenu_->addMenu(helpMenu_); mainMenu_->addSeparator(); #ifndef Q_OS_MAC mainMenu_->addAction(showMenuBarAct_); mainMenu_->addSeparator(); #endif mainMenu_->addAction(exitAct_); menuBar()->addMenu(fileMenu_); menuBar()->addMenu(viewMenu_); menuBar()->addMenu(feedMenu_); menuBar()->addMenu(newsMenu_); menuBar()->addMenu(browserMenu_); menuBar()->addMenu(toolsMenu_); menuBar()->addMenu(helpMenu_); connect(customizeToolbarGroup_, SIGNAL(triggered(QAction*)), this, SLOT(showCustomizeToolbarDlg(QAction*))); connect(styleGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setStyleApp(QAction*))); connect(browserPositionGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setBrowserPosition(QAction*))); connect(feedsFilterGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setFeedsFilter())); connect(feedsFilter_, SIGNAL(triggered()), this, SLOT(slotFeedsFilter())); connect(feedsColumnsGroup_, SIGNAL(triggered(QAction*)), this, SLOT(feedsColumnVisible(QAction*))); connect(feedMenu_, SIGNAL(aboutToShow()), this, SLOT(slotFeedMenuShow())); connect(newsLabelMenu_, SIGNAL(aboutToShow()), this, SLOT(getLabelNews())); connect(shareMenuAct_, SIGNAL(triggered()), this, SLOT(showMenuShareNews())); connect(newsFilterGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setNewsFilter(QAction*))); connect(newsFilter_, SIGNAL(triggered()), this, SLOT(slotNewsFilter())); connect(newsSortByMenu_, SIGNAL(aboutToShow()), this, SLOT(showNewsSortByMenu())); connect(newsMenu_, SIGNAL(aboutToShow()), this, SLOT(showNewsMenu())); connect(browserZoomGroup_, SIGNAL(triggered(QAction*)), this, SLOT(browserZoom(QAction*))); } // --------------------------------------------------------------------------- void MainWindow::createToolBar() { mainToolbar_ = new QToolBar(this); mainToolbar_->setObjectName("ToolBar_General"); mainToolbar_->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); mainToolbar_->setContextMenuPolicy(Qt::CustomContextMenu); addToolBar(mainToolbar_); connect(mainToolbarToggle_, SIGNAL(toggled(bool)), mainToolbar_, SLOT(setVisible(bool))); connect(mainToolbar_, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenuToolBar(const QPoint &))); connect(toolBarLockAct_, SIGNAL(toggled(bool)), this, SLOT(lockMainToolbar(bool))); connect(toolBarHideAct_, SIGNAL(triggered()), this, SLOT(hideMainToolbar())); } /** @brief Load settings from ini-file *---------------------------------------------------------------------------*/ void MainWindow::loadSettings() { Settings settings; settings.beginGroup("Settings"); showSplashScreen_ = settings.value("showSplashScreen", true).toBool(); reopenFeedStartup_ = settings.value("reopenFeedStartup", true).toBool(); openNewTabNextToActive_ = settings.value("openNewTabNextToActive", false).toBool(); showTrayIcon_ = settings.value("showTrayIcon", true).toBool(); #ifndef Q_OS_MAC startingTray_ = settings.value("startingTray", false).toBool(); minimizingTray_ = settings.value("minimizingTray", true).toBool(); closingTray_ = settings.value("closingTray", false).toBool(); #else startingTray_ = false; minimizingTray_ = false; closingTray_ = false; #endif singleClickTray_ = settings.value("singleClickTray", false).toBool(); clearStatusNew_ = settings.value("clearStatusNew", true).toBool(); emptyWorking_ = settings.value("emptyWorking", true).toBool(); QString fontFamily = settings.value("feedsFontFamily", qApp->font().family()).toString(); int fontSize = settings.value("feedsFontSize", qApp->font().pointSize()).toInt(); feedsView_->setFont(QFont(fontFamily, fontSize)); feedsModel_->font_ = feedsView_->font(); newsListFontFamily_ = settings.value("newsFontFamily", qApp->font().family()).toString(); newsListFontSize_ = settings.value("newsFontSize", qApp->font().pointSize()).toInt(); newsTitleFontFamily_ = settings.value("newsTitleFontFamily", qApp->font().family()).toString(); newsTitleFontSize_ = settings.value("newsTitleFontSize", qApp->font().pointSize()+2).toInt(); newsTextFontFamily_ = settings.value("newsTextFontFamily", qApp->font().family()).toString(); newsTextFontSize_ = settings.value("newsTextFontSize", qApp->font().pointSize()+2).toInt(); notificationFontFamily_ = settings.value("notificationFontFamily", qApp->font().family()).toString(); notificationFontSize_ = settings.value("notificationFontSize", qApp->font().pointSize()).toInt(); QString browserStandardFont = settings.value( "browserStandardFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::StandardFont)).toString(); QString browserFixedFont = settings.value( "browserFixedFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::FixedFont)).toString(); QString browserSerifFont = settings.value( "browserSerifFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::SerifFont)).toString(); QString browserSansSerifFont = settings.value( "browserSansSerifFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::SansSerifFont)).toString(); QString browserCursiveFont = settings.value( "browserCursiveFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::CursiveFont)).toString(); QString browserFantasyFont = settings.value( "browserFantasyFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::FantasyFont)).toString(); int browserDefaultFontSize = settings.value( "browserDefaultFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::DefaultFontSize)).toInt(); int browserFixedFontSize = settings.value( "browserFixedFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::DefaultFixedFontSize)).toInt(); int browserMinFontSize = settings.value( "browserMinFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::MinimumFontSize)).toInt(); int browserMinLogFontSize = settings.value( "browserMinLogFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::MinimumLogicalFontSize)).toInt(); QWebSettings::globalSettings()->setFontFamily( QWebSettings::StandardFont, browserStandardFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::FixedFont, browserFixedFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::SerifFont, browserSerifFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::SansSerifFont, browserSansSerifFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::CursiveFont, browserCursiveFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::FantasyFont, browserFantasyFont); QWebSettings::globalSettings()->setFontSize( QWebSettings::DefaultFontSize, browserDefaultFontSize); QWebSettings::globalSettings()->setFontSize( QWebSettings::DefaultFixedFontSize, browserFixedFontSize); QWebSettings::globalSettings()->setFontSize( QWebSettings::MinimumFontSize, browserMinFontSize); QWebSettings::globalSettings()->setFontSize( QWebSettings::MinimumLogicalFontSize, browserMinLogFontSize); updateFeedsEnable_ = settings.value("autoUpdatefeeds", false).toBool(); updateFeedsInterval_ = settings.value("autoUpdatefeedsTime", 10).toInt(); updateFeedsIntervalType_ = settings.value("autoUpdatefeedsInterval", 0).toInt(); openingFeedAction_ = settings.value("openingFeedAction", 0).toInt(); openNewsWebViewOn_ = settings.value("openNewsWebViewOn", true).toBool(); markNewsReadOn_ = settings.value("markNewsReadOn", true).toBool(); markCurNewsRead_ = settings.value("markCurNewsRead", true).toBool(); markNewsReadTime_ = settings.value("markNewsReadTime", 0).toInt(); markPrevNewsRead_= settings.value("markPrevNewsRead", false).toBool(); markReadSwitchingFeed_ = settings.value("markReadSwitchingFeed", false).toBool(); markReadClosingTab_ = settings.value("markReadClosingTab", false).toBool(); markReadMinimize_ = settings.value("markReadMinimize", false).toBool(); showDescriptionNews_ = settings.value("showDescriptionNews", true).toBool(); int singleClick = settings.value("NewsSingleClickAction", (int)ENewsClickAction::NCA_Description).toInt(); int doubleClick = settings.value("NewsDoubleClickAction", (int)ENewsClickAction::NCA_WebPage).toInt(); int middleClick = settings.value("NewsMiddleClickAction", (int)ENewsClickAction::NCA_WebPageNewTab).toInt(); if (singleClick < (int)ENewsClickAction::NCA_Start || singleClick >= (int)ENewsClickAction::NCA_Max || singleClick == (int)ENewsClickAction::NCA_Default) { singleClick = (int)ENewsClickAction::NCA_Description; } if (doubleClick < (int)ENewsClickAction::NCA_Start || doubleClick >= (int)ENewsClickAction::NCA_Max || singleClick == (int)ENewsClickAction::NCA_Default) { doubleClick = (int)ENewsClickAction::NCA_WebPage; } if (middleClick < (int)ENewsClickAction::NCA_Start || middleClick >= (int)ENewsClickAction::NCA_Max || singleClick == (int)ENewsClickAction::NCA_Default) { middleClick = (int)ENewsClickAction::NCA_WebPageNewTab; } newsSingleClickAction = (ENewsClickAction::Type)singleClick; newsDoubleClickAction = (ENewsClickAction::Type)doubleClick; newsMiddleClickAction = (ENewsClickAction::Type)middleClick; formatDate_ = settings.value("formatData", "dd.MM.yy").toString(); formatTime_ = settings.value("formatTime", "hh:mm").toString(); feedsModel_->formatDate_ = formatDate_; feedsModel_->formatTime_ = formatTime_; alternatingRowColorsNews_ = settings.value("alternatingColorsNews", false).toBool(); changeBehaviorActionNUN_ = settings.value("changeBehaviorActionNUN", false).toBool(); simplifiedDateTime_ = settings.value("simplifiedDateTime", true).toBool(); notDeleteStarred_ = settings.value("notDeleteStarred", false).toBool(); notDeleteLabeled_ = settings.value("notDeleteLabeled", false).toBool(); markIdenticalNewsRead_ = settings.value("markIdenticalNewsRead", true).toBool(); mainNewsFilter_ = settings.value("mainNewsFilter", "filterNewsAll_").toString(); cleanupOnShutdown_ = settings.value("cleanupOnShutdown", true).toBool(); maxDayCleanUp_ = settings.value("maxDayClearUp", 30).toInt(); maxNewsCleanUp_ = settings.value("maxNewsClearUp", 200).toInt(); dayCleanUpOn_ = settings.value("dayClearUpOn", true).toBool(); newsCleanUpOn_ = settings.value("newsClearUpOn", true).toBool(); readCleanUp_ = settings.value("readClearUp", false).toBool(); neverUnreadCleanUp_ = settings.value("neverUnreadClearUp", true).toBool(); neverStarCleanUp_ = settings.value("neverStarClearUp", true).toBool(); neverLabelCleanUp_ = settings.value("neverLabelClearUp", true).toBool(); cleanUpDeleted_ = settings.value("cleanUpDeleted", false).toBool(); optimizeDB_ = settings.value("optimizeDB", false).toBool(); externalBrowserOn_ = settings.value("externalBrowserOn", 0).toInt(); externalBrowser_ = settings.value("externalBrowser", "").toString(); javaScriptEnable_ = settings.value("javaScriptEnable", true).toBool(); pluginsEnable_ = settings.value("pluginsEnable", true).toBool(); maxPagesInCache_ = settings.value("maxPagesInCache", 3).toInt(); downloadLocation_ = settings.value("downloadLocation", "").toString(); askDownloadLocation_ = settings.value("askDownloadLocation", true).toBool(); defaultZoomPages_ = settings.value("defaultZoomPages", 100).toInt(); autoLoadImages_ = settings.value("autoLoadImages", true).toBool(); QWebSettings::globalSettings()->setAttribute( QWebSettings::JavascriptEnabled, javaScriptEnable_); QWebSettings::globalSettings()->setAttribute( QWebSettings::PluginsEnabled, pluginsEnable_); QWebSettings::globalSettings()->setMaximumPagesInCache(maxPagesInCache_); soundNewNews_ = settings.value("soundNewNews", true).toBool(); soundNotifyPath_ = settings.value("soundNotifyPath", mainApp->soundNotifyDefaultFile()).toString(); showNotifyOn_ = settings.value("showNotifyOn", true).toBool(); screenNotify_ = settings.value("screenNotify", 0).toInt(); positionNotify_ = settings.value("positionNotify", 3).toInt(); transparencyNotify_ = settings.value("transparencyNotify", 60).toInt(); countShowNewsNotify_ = settings.value("countShowNewsNotify", 10).toInt(); widthTitleNewsNotify_ = settings.value("widthTitleNewsNotify", 300).toInt(); timeShowNewsNotify_ = settings.value("timeShowNewsNotify", 10).toInt(); fullscreenModeNotify_ = settings.value("fullscreenModeNotify", true).toBool(); showNotifyInactiveApp_ = settings.value("showNotifyInactiveApp", true).toBool(); onlySelectedFeeds_ = settings.value("onlySelectedFeeds", false).toBool(); showTitlesFeedsNotify_ = settings.value("showTitlesFeedsNotify", true).toBool(); showIconFeedNotify_ = settings.value("showIconFeedNotify", false).toBool(); showButtonMarkAllNotify_ = settings.value("showButtonMarkAllNotify", true).toBool(); showButtonMarkReadNotify_ = settings.value("showButtonMarkReadNotify", true).toBool(); showButtonExBrowserNotify_ = settings.value("showButtonExBrowserNotify", true).toBool(); showButtonDeleteNotify_ = settings.value("showButtonDeleteNotify", true).toBool(); toolBarLockAct_->setChecked(settings.value("mainToolbarLock", true).toBool()); lockMainToolbar(toolBarLockAct_->isChecked()); mainToolbarToggle_->setChecked(settings.value("mainToolbarShow2", false).toBool()); feedsToolbarToggle_->setChecked(settings.value("feedsToolbarShow2", true).toBool()); newsToolbarToggle_->setChecked(settings.value("newsToolbarShow", true).toBool()); browserToolbarToggle_->setChecked(settings.value("browserToolbarShow", true).toBool()); categoriesPanelToggle_->setChecked(settings.value("categoriesPanelShow", true).toBool()); categoriesWidget_->setVisible(categoriesPanelToggle_->isChecked()); statusBarToggle_->setChecked(settings.value("statusBarShow", true).toBool()); QString str = settings.value("mainToolBar", "newAct,Separator,updateFeedAct,updateAllFeedsAct," "Separator,markFeedRead,Separator,autoLoadImagesToggle").toString(); foreach (QString actionStr, str.split(",", QString::SkipEmptyParts)) { if (actionStr == "Separator") { mainToolbar_->addSeparator(); } else { QListIterator iter(actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (!pAction->icon().isNull()) { if (pAction->objectName() == actionStr) { mainToolbar_->addAction(pAction); break; } } } } } str = settings.value("feedsToolBar2", "newAct,Separator,updateAllFeedsAct,markFeedRead," "Separator,feedsFilter,findFeedAct").toString(); foreach (QString actionStr, str.split(",", QString::SkipEmptyParts)) { if (actionStr == "Separator") { feedsToolBar_->addSeparator(); } else { QListIterator iter(actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (!pAction->icon().isNull()) { if (pAction->objectName() == actionStr) { feedsToolBar_->addAction(pAction); break; } } } } } setToolBarStyle(settings.value("toolBarStyle", "toolBarStyleTuI_").toString()); QString iconStr = settings.value("toolBarIconSize", "toolBarIconNormal_").toString(); setToolBarIconSize(mainToolbar_, iconStr); iconStr = settings.value("feedsToolBarIconSize", "toolBarIconSmall_").toString(); setToolBarIconSize(feedsToolBar_, iconStr); str = settings.value("styleApplication", "defaultStyle_").toString(); QList listActions = styleGroup_->actions(); foreach(QAction *action, listActions) { if (action->objectName() == str) { action->setChecked(true); break; } } showUnreadCount_->setChecked(settings.value("showUnreadCount", true).toBool()); showUndeleteCount_->setChecked(settings.value("showUndeleteCount", false).toBool()); showLastUpdated_->setChecked(settings.value("showLastUpdated", false).toBool()); feedsColumnVisible(showUnreadCount_); feedsColumnVisible(showUndeleteCount_); feedsColumnVisible(showLastUpdated_); indentationFeedsTreeAct_->setChecked(settings.value("indentationFeedsTree", true).toBool()); slotIndentationFeedsTree(); newsLayout_ = settings.value("newsLayout", 0).toInt(); switch (newsLayout_) { case 1: newspaperLayoutAct_->setChecked(true); layoutToggle_->setIcon(QIcon(":/images/layout_newspaper")); break; default: classicLayoutAct_->setChecked(true); layoutToggle_->setIcon(QIcon(":/images/layout_classic")); } connect(layoutGroup_, SIGNAL(triggered(QAction*)), this, SLOT(setNewsLayout(QAction*))); browserPosition_ = settings.value("browserPosition", BOTTOM_POSITION).toInt(); switch (browserPosition_) { case TOP_POSITION: topBrowserPositionAct_->setChecked(true); break; case RIGHT_POSITION: rightBrowserPositionAct_->setChecked(true); break; case LEFT_POSITION: leftBrowserPositionAct_->setChecked(true); break; default: bottomBrowserPositionAct_->setChecked(true); } openLinkInBackground_ = settings.value("openLinkInBackground", true).toBool(); openLinkInBackgroundEmbedded_ = settings.value("openLinkInBackgroundEmbedded", true).toBool(); openingLinkTimeout_ = settings.value("openingLinkTimeout", 1000).toInt(); stayOnTopAct_->setChecked(settings.value("stayOnTop", false).toBool()); if (stayOnTopAct_->isChecked()) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); else setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); hideFeedsOpenTab_ = settings.value("hideFeedsOpenTab", false).toBool(); showToggleFeedsTree_ = settings.value("showToggleFeedsTree", true).toBool(); pushButtonNull_->setVisible(showToggleFeedsTree_); defaultIconFeeds_ = settings.value("defaultIconFeeds", false).toBool(); feedsModel_->defaultIconFeeds_ = defaultIconFeeds_; feedsView_->autocollapseFolder_ = settings.value("autocollapseFolder", false).toBool(); #ifndef Q_OS_MAC showMenuBarAct_->setChecked(settings.value("showMenuBar", false).toBool()); #else showMenuBarAct_->setChecked(true); #endif settings.endGroup(); settings.beginGroup("Color"); QString windowTextColor = qApp->palette().brush(QPalette::WindowText).color().name(); QString linkTextColor = qApp->palette().brush(QPalette::Link).color().name(); feedsModel_->textColor_ = settings.value("feedsListTextColor", windowTextColor).toString(); feedsModel_->backgroundColor_ = settings.value("feedsListBackgroundColor", "").toString(); feedsView_->setStyleSheet(QString("#feedsView_ {background: %1;}").arg(feedsModel_->backgroundColor_)); newsListTextColor_ = settings.value("newsListTextColor", windowTextColor).toString(); newsListBackgroundColor_ = settings.value("newsListBackgroundColor", "").toString(); newNewsTextColor_ = settings.value("newNewsTextColor", windowTextColor).toString(); unreadNewsTextColor_ = settings.value("unreadNewsTextColor", windowTextColor).toString(); focusedNewsTextColor_ = settings.value("focusedNewsTextColor", windowTextColor).toString(); focusedNewsBGColor_ = settings.value("focusedNewsBGColor", "").toString(); linkColor_ = settings.value("linkColor", "#0066CC").toString(); titleColor_ = settings.value("titleColor", "#0066CC").toString(); dateColor_ = settings.value("dateColor", "#666666").toString(); authorColor_ = settings.value("authorColor", "#666666").toString(); newsTextColor_ = settings.value("newsTextColor", "#000000").toString(); newsTitleBackgroundColor_ = settings.value("newsTitleBackgroundColor", "#FFFFFF").toString(); newsBackgroundColor_ = settings.value("newsBackgroundColor", "#FFFFFF").toString(); feedsModel_->feedWithNewNewsColor_ = settings.value("feedWithNewNewsColor", linkTextColor).toString(); feedsModel_->countNewsUnreadColor_ = settings.value("countNewsUnreadColor", linkTextColor).toString(); feedsModel_->focusedFeedTextColor_ = settings.value("focusedFeedTextColor", windowTextColor).toString(); feedsModel_->focusedFeedBGColor_ = settings.value("focusedFeedBGColor", "").toString(); feedsModel_->feedDisabledUpdateColor_ = settings.value("feedDisabledUpdateColor", "#999999").toString(); alternatingRowColors_ = settings.value("alternatingRowColors", qApp->palette().color(QPalette::AlternateBase).name()).toString(); notifierTextColor_ = settings.value("notifierTextColor", windowTextColor).toString(); notifierBackgroundColor_ = settings.value("notifierBackgroundColor", "#FFFFFF").toString(); settings.endGroup(); resize(800, 600); restoreGeometry(settings.value("GeometryState").toByteArray()); restoreState(settings.value("ToolBarsState").toByteArray()); if (!mainToolbarToggle_->isChecked()) mainToolbar_->hide(); if (!feedsToolbarToggle_->isChecked()) feedsPanel_->hide(); if (!statusBarToggle_->isChecked()) statusBar()->hide(); mainSplitter_->restoreState(settings.value("MainSplitterState").toByteArray()); feedsWidgetVisibleAct_->setChecked(settings.value("FeedsWidgetVisible", true).toBool()); slotVisibledFeedsWidget(); feedsWidgetSplitterState_ = settings.value("FeedsWidgetSplitterState").toByteArray(); bool showCategories = settings.value("NewsCategoriesTreeVisible", true).toBool(); categoriesTree_->setVisible(showCategories); if (showCategories) { showCategoriesButton_->setIcon(QIcon(":/images/images/panel_hide.png")); showCategoriesButton_->setToolTip(tr("Hide Categories")); feedsSplitter_->restoreState(feedsWidgetSplitterState_); } else { showCategoriesButton_->setIcon(QIcon(":/images/images/panel_show.png")); showCategoriesButton_->setToolTip(tr("Show Categories")); QList sizes; sizes << QApplication::desktop()->height() << 20; feedsSplitter_->setSizes(sizes); } bool expandCategories = settings.value("categoriesTreeExpanded", true).toBool(); if (expandCategories) categoriesTree_->expandAll(); showMenuBar(); networkProxy_.setType(static_cast( settings.value("networkProxy/type", QNetworkProxy::DefaultProxy).toInt())); networkProxy_.setHostName(settings.value("networkProxy/hostName", "").toString()); networkProxy_.setPort( settings.value("networkProxy/port", "").toUInt()); networkProxy_.setUser( settings.value("networkProxy/user", "").toString()); networkProxy_.setPassword(settings.value("networkProxy/password", "").toString()); setProxy(networkProxy_); adblockIcon_->setEnabled(settings.value("AdBlock/enabled", true).toBool()); } /** @brief Save settings in ini-file *---------------------------------------------------------------------------*/ void MainWindow::saveSettings() { Settings settings; settings.beginGroup("Settings"); settings.setValue("showSplashScreen", showSplashScreen_); settings.setValue("reopenFeedStartup", reopenFeedStartup_); settings.setValue("openNewTabNextToActive", openNewTabNextToActive_); settings.setValue("createLastFeed", mainApp->isSaveDataLastFeed()); settings.setValue("showTrayIcon", showTrayIcon_); settings.setValue("startingTray", startingTray_); settings.setValue("minimizingTray", minimizingTray_); settings.setValue("closingTray", closingTray_); settings.setValue("behaviorIconTray", behaviorIconTray_); settings.setValue("singleClickTray", singleClickTray_); settings.setValue("clearStatusNew", clearStatusNew_); settings.setValue("emptyWorking", emptyWorking_); settings.setValue("langFileName", mainApp->language()); QString fontFamily = feedsView_->font().family(); settings.setValue("feedsFontFamily", fontFamily); int fontSize = feedsView_->font().pointSize(); settings.setValue("feedsFontSize", fontSize); settings.setValue("newsFontFamily", newsListFontFamily_); settings.setValue("newsFontSize", newsListFontSize_); settings.setValue("newsTitleFontFamily", newsTitleFontFamily_); settings.setValue("newsTitleFontSize", newsTitleFontSize_); settings.setValue("newsTextFontFamily", newsTextFontFamily_); settings.setValue("newsTextFontSize", newsTextFontSize_); settings.setValue("notificationFontFamily", notificationFontFamily_); settings.setValue("notificationFontSize", notificationFontSize_); settings.setValue("autoUpdatefeeds", updateFeedsEnable_); settings.setValue("autoUpdatefeedsTime", updateFeedsInterval_); settings.setValue("autoUpdatefeedsInterval", updateFeedsIntervalType_); settings.setValue("openingFeedAction", openingFeedAction_); settings.setValue("openNewsWebViewOn", openNewsWebViewOn_); settings.setValue("markNewsReadOn", markNewsReadOn_); settings.setValue("markCurNewsRead", markCurNewsRead_); settings.setValue("markNewsReadTime", markNewsReadTime_); settings.setValue("markPrevNewsRead", markPrevNewsRead_); settings.setValue("markReadSwitchingFeed", markReadSwitchingFeed_); settings.setValue("markReadClosingTab", markReadClosingTab_); settings.setValue("markReadMinimize", markReadMinimize_); settings.setValue("showDescriptionNews", showDescriptionNews_); settings.setValue("NewsSingleClickAction", (int)newsSingleClickAction); settings.setValue("NewsDoubleClickAction", (int)newsDoubleClickAction); settings.setValue("NewsMiddleClickAction", (int)newsMiddleClickAction); settings.setValue("formatData", formatDate_); settings.setValue("formatTime", formatTime_); settings.setValue("alternatingColorsNews", alternatingRowColorsNews_); settings.setValue("changeBehaviorActionNUN", changeBehaviorActionNUN_); settings.setValue("simplifiedDateTime", simplifiedDateTime_); settings.setValue("notDeleteStarred", notDeleteStarred_); settings.setValue("notDeleteLabeled", notDeleteLabeled_); settings.setValue("markIdenticalNewsRead", markIdenticalNewsRead_); settings.setValue("mainNewsFilter", mainNewsFilter_); settings.setValue("cleanupOnShutdown", cleanupOnShutdown_); settings.setValue("maxDayClearUp", maxDayCleanUp_); settings.setValue("maxNewsClearUp", maxNewsCleanUp_); settings.setValue("dayClearUpOn", dayCleanUpOn_); settings.setValue("newsClearUpOn", newsCleanUpOn_); settings.setValue("readClearUp", readCleanUp_); settings.setValue("neverUnreadClearUp", neverUnreadCleanUp_); settings.setValue("neverStarClearUp", neverStarCleanUp_); settings.setValue("neverLabelClearUp", neverLabelCleanUp_); settings.setValue("cleanUpDeleted", cleanUpDeleted_); settings.setValue("optimizeDB", optimizeDB_); settings.setValue("externalBrowserOn", externalBrowserOn_); settings.setValue("externalBrowser", externalBrowser_); settings.setValue("javaScriptEnable", javaScriptEnable_); settings.setValue("pluginsEnable", pluginsEnable_); settings.setValue("maxPagesInCache", maxPagesInCache_); settings.setValue("downloadLocation", downloadLocation_); settings.setValue("askDownloadLocation", askDownloadLocation_); settings.setValue("defaultZoomPages", defaultZoomPages_); settings.setValue("autoLoadImages", autoLoadImages_); settings.setValue("soundNewNews", soundNewNews_); settings.setValue("soundNotifyPath", soundNotifyPath_); settings.setValue("showNotifyOn", showNotifyOn_); settings.setValue("screenNotify", screenNotify_); settings.setValue("positionNotify", positionNotify_); settings.setValue("transparencyNotify", transparencyNotify_); settings.setValue("countShowNewsNotify", countShowNewsNotify_); settings.setValue("widthTitleNewsNotify", widthTitleNewsNotify_); settings.setValue("timeShowNewsNotify", timeShowNewsNotify_); settings.setValue("fullscreenModeNotify", fullscreenModeNotify_); settings.setValue("showNotifyInactiveApp", showNotifyInactiveApp_); settings.setValue("onlySelectedFeeds", onlySelectedFeeds_); settings.setValue("showTitlesFeedsNotify", showTitlesFeedsNotify_); settings.setValue("showIconFeedNotify", showIconFeedNotify_); settings.setValue("showButtonMarkAllNotify", showButtonMarkAllNotify_); settings.setValue("showButtonMarkReadNotify", showButtonMarkReadNotify_); settings.setValue("showButtonExBrowserNotify", showButtonExBrowserNotify_); settings.setValue("showButtonDeleteNotify", showButtonDeleteNotify_); settings.setValue("mainToolbarLock", toolBarLockAct_->isChecked()); settings.setValue("mainToolbarShow2", mainToolbarToggle_->isChecked()); settings.setValue("feedsToolbarShow2", feedsToolbarToggle_->isChecked()); settings.setValue("newsToolbarShow", newsToolbarToggle_->isChecked()); settings.setValue("browserToolbarShow", browserToolbarToggle_->isChecked()); settings.setValue("categoriesPanelShow", categoriesPanelToggle_->isChecked()); settings.setValue("statusBarShow", statusBarToggle_->isChecked()); settings.setValue("styleApplication", styleGroup_->checkedAction()->objectName()); settings.setValue("showUnreadCount", showUnreadCount_->isChecked()); settings.setValue("showUndeleteCount", showUndeleteCount_->isChecked()); settings.setValue("showLastUpdated", showLastUpdated_->isChecked()); settings.setValue("indentationFeedsTree", indentationFeedsTreeAct_->isChecked()); settings.setValue("newsLayout", newsLayout_); settings.setValue("browserPosition", browserPosition_); settings.setValue("openLinkInBackground", openLinkInBackground_); settings.setValue("openLinkInBackgroundEmbedded", openLinkInBackgroundEmbedded_); settings.setValue("openingLinkTimeout", openingLinkTimeout_); settings.setValue("stayOnTop", stayOnTopAct_->isChecked()); settings.setValue("hideFeedsOpenTab", hideFeedsOpenTab_); settings.setValue("showToggleFeedsTree", showToggleFeedsTree_); settings.setValue("defaultIconFeeds", defaultIconFeeds_); settings.setValue("autocollapseFolder", feedsView_->autocollapseFolder_); settings.setValue("showMenuBar", showMenuBarAct_->isChecked()); settings.endGroup(); settings.beginGroup("Color"); settings.setValue("feedsListTextColor", feedsModel_->textColor_); settings.setValue("feedsListBackgroundColor", feedsModel_->backgroundColor_); settings.setValue("newsListTextColor", newsListTextColor_); settings.setValue("newsListBackgroundColor", newsListBackgroundColor_); settings.setValue("newNewsTextColor", newNewsTextColor_); settings.setValue("unreadNewsTextColor", unreadNewsTextColor_); settings.setValue("focusedNewsTextColor", focusedNewsTextColor_); settings.setValue("focusedNewsBGColor", focusedNewsBGColor_); settings.setValue("linkColor", linkColor_); settings.setValue("titleColor", titleColor_); settings.setValue("dateColor", dateColor_); settings.setValue("authorColor", authorColor_); settings.setValue("newsTextColor", newsTextColor_); settings.setValue("newsTitleBackgroundColor", newsTitleBackgroundColor_); settings.setValue("newsBackgroundColor", newsBackgroundColor_); settings.setValue("feedWithNewNewsColor", feedsModel_->feedWithNewNewsColor_); settings.setValue("countNewsUnreadColor", feedsModel_->countNewsUnreadColor_); settings.setValue("focusedFeedTextColor", feedsModel_->focusedFeedTextColor_); settings.setValue("focusedFeedBGColor", feedsModel_->focusedFeedBGColor_); settings.setValue("feedDisabledUpdateColor", feedsModel_->feedDisabledUpdateColor_); settings.setValue("alternatingRowColors", alternatingRowColors_); settings.setValue("notifierTextColor", notifierTextColor_); settings.setValue("notifierBackgroundColor", notifierBackgroundColor_); settings.endGroup(); settings.setValue("GeometryState", saveGeometry()); settings.setValue("ToolBarsState", saveState()); settings.setValue("MainSplitterState", mainSplitter_->saveState()); settings.setValue("FeedsWidgetVisible", showFeedsTabPermanent_); bool newsCategoriesTreeVisible = true; if (categoriesWidget_->height() <= (categoriesPanel_->height()+2)) { newsCategoriesTreeVisible = false; settings.setValue("FeedsWidgetSplitterState", feedsWidgetSplitterState_); } else { settings.setValue("FeedsWidgetSplitterState", feedsSplitter_->saveState()); } settings.setValue("NewsCategoriesTreeVisible", newsCategoriesTreeVisible); settings.setValue("categoriesTreeExpanded", categoriesTree_->topLevelItem(CategoriesTreeWidget::LabelsItem)->isExpanded()); if (stackedWidget_->count()) { NewsTabWidget *widget; if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) widget = currentNewsTab; else widget = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); widget->newsHeader_->saveStateColumns(widget); settings.setValue("NewsTabSplitterState", widget->newsTabWidgetSplitter_->saveState()); } settings.setValue("networkProxy/type", networkProxy_.type()); settings.setValue("networkProxy/hostName", networkProxy_.hostName()); settings.setValue("networkProxy/port", networkProxy_.port()); settings.setValue("networkProxy/user", networkProxy_.user()); settings.setValue("networkProxy/password", networkProxy_.password()); NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); settings.setValue("feedSettings/currentId", widget->feedId_); settings.setValue("feedSettings/filterName", feedsFilterGroup_->checkedAction()->objectName()); settings.setValue("newsSettings/filterName", newsFilterGroup_->checkedAction()->objectName()); mainApp->cookieJar()->saveCookies(); mainApp->c2fSaveSettings(); AdBlockManager::instance()->save(); } void MainWindow::setProxy(const QNetworkProxy proxy) { networkProxy_ = proxy; if (QNetworkProxy::DefaultProxy == networkProxy_.type()) QNetworkProxyFactory::setUseSystemConfiguration(true); else QNetworkProxy::setApplicationProxy(networkProxy_); } void MainWindow::showMainMenu() { mainMenu_->popup(mainMenuButton_->mapToGlobal(QPoint(0, mainMenuButton_->height()))); } /** @brief Add feed to feed list *---------------------------------------------------------------------------*/ void MainWindow::addFeed() { int curFolderId = 0; QPersistentModelIndex curIndex = feedsView_->selectIndex(); if (feedsModel_->isFolder(curIndex)) { curFolderId = feedsModel_->idByIndex(curIndex); } else { curFolderId = feedsModel_->paridByIndex(curIndex); } AddFeedWizard *addFeedWizard = new AddFeedWizard(0, curFolderId); addFeedWizard->show(); addFeedWizard->raise(); addFeedWizard->activateWindow(); int result = addFeedWizard->exec(); if (result == QDialog::Rejected) { delete addFeedWizard; return; } emit faviconRequestUrl(addFeedWizard->htmlUrlString_, addFeedWizard->feedUrlString_); QList categoriesList; categoriesList << addFeedWizard->feedParentId_; recountFeedCategories(categoriesList); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); feedsView_->setCurrentIndex(QModelIndex()); feedsModelReload(); QModelIndex index = feedsProxyModel_->mapFromSource(addFeedWizard->feedId_); feedsView_->selectIdEn_ = true; feedsView_->setCurrentIndex(index); slotFeedClicked(index); QApplication::restoreOverrideCursor(); slotUpdateFeed(addFeedWizard->feedId_, true, addFeedWizard->newCount_, false); delete addFeedWizard; } /** @brief Add folder to feed list *---------------------------------------------------------------------------*/ void MainWindow::addFolder() { int curFolderId = 0; QPersistentModelIndex curIndex = feedsView_->selectIndex(); if (feedsModel_->isFolder(curIndex)) { curFolderId = feedsModel_->idByIndex(curIndex); } else { curFolderId = feedsModel_->paridByIndex(curIndex); } AddFolderDialog *addFolderDialog = new AddFolderDialog(this, curFolderId); if (addFolderDialog->exec() == QDialog::Rejected) { delete addFolderDialog; return; } QString folderText = addFolderDialog->nameFeedEdit_->text(); int parentId = addFolderDialog->foldersTree_->currentItem()->text(1).toInt(); QSqlQuery q; // Determine row number for folder int rowToParent = 0; q.exec(QString("SELECT count(id) FROM feeds WHERE parentId='%1'"). arg(parentId)); if (q.next()) rowToParent = q.value(0).toInt(); // Add feed to DB q.prepare("INSERT INTO feeds(text, created, parentId, rowToParent) " "VALUES (:text, :feedCreateTime, :parentId, :rowToParent)"); q.bindValue(":text", folderText); q.bindValue(":feedCreateTime", QLocale::c().toString(QDateTime::currentDateTimeUtc(), "yyyy-MM-ddTHH:mm:ss")); q.bindValue(":parentId", parentId); q.bindValue(":rowToParent", rowToParent); q.exec(); delete addFolderDialog; QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); feedsModelReload(); QApplication::restoreOverrideCursor(); } /** @brief Delete feed list item with confirmation *---------------------------------------------------------------------------*/ void MainWindow::deleteItemFeedsTree() { if (!feedsView_->selectIndex().isValid()) return; QMessageBox msgBox(this); msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("Confirm Delete")); msgBox.setText(tr("Are you sure to delete selected elements?")); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); if (msgBox.exec() == QMessageBox::No) return; QModelIndex currentIndex = feedsProxyModel_->mapToSource(feedsView_->currentIndex()); int feedIdCur = feedsModel_->idByIndex(currentIndex); QModelIndexList indexList = feedsView_->selectionModel()->selectedRows(0); if (indexList.count() <= 1) { indexList.clear(); indexList.append(feedsProxyModel_->mapFromSource(feedsView_->selectIndex())); } QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QList idList; QList parentIdList; for (int i = indexList.count()-1; i >= 0; --i) { QModelIndex index = feedsProxyModel_->mapToSource(indexList[i]); if (feedsModel_->isFolder(index)) { idList.append(feedsModel_->dataField(index, "id").toInt()); int parentId = feedsModel_->dataField(index, "parentId").toInt(); if (!parentIdList.contains(parentId)) { parentIdList.append(parentId); } indexList.removeAt(i); } } for (int i = indexList.count()-1; i >= 0; --i) { QModelIndex index = feedsProxyModel_->mapToSource(indexList[i]); int parentId = feedsModel_->dataField(index, "parentId").toInt(); if (!idList.contains(parentId)) { idList.append(feedsModel_->dataField(index, "id").toInt()); int parentId = feedsModel_->dataField(index, "parentId").toInt(); if (!parentIdList.contains(parentId)) { parentIdList.append(parentId); } } indexList.removeAt(i); } db_.transaction(); QSqlQuery q; QString idStr; QString feedIdStr; foreach (int feedId, idList) { if (idStr.isEmpty()) { idStr.append(QString("id='%1'").arg(feedId)); feedIdStr.append(QString("feedId='%1'").arg(feedId)); } else { idStr.append(QString(" OR id='%1'").arg(feedId)); feedIdStr.append(QString(" OR feedId='%1'").arg(feedId)); } QQueue parentIds; parentIds.enqueue(feedId); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); q.exec(QString("SELECT id FROM feeds WHERE parentId='%1'").arg(parentId)); while (q.next()) { int feedId = q.value(0).toInt(); idStr.append(QString(" OR id='%1'").arg(feedId)); feedIdStr.append(QString(" OR feedId='%1'").arg(feedId)); parentIds.enqueue(feedId); } } } q.exec(QString("DELETE FROM feeds WHERE %1").arg(idStr)); q.exec(QString("DELETE FROM news WHERE %1").arg(feedIdStr)); db_.commit(); // Correction row foreach (int parentId, parentIdList) { QList idCorrectList; q.exec(QString("SELECT id FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(parentId)); while (q.next()) { idCorrectList << q.value(0).toInt(); } for (int i = 0; i < idCorrectList.count(); i++) { q.exec(QString("UPDATE feeds SET rowToParent='%1' WHERE id=='%2'"). arg(i).arg(idCorrectList.at(i))); } } recountFeedCategories(parentIdList); feedsModelReload(); currentIndex = feedsProxyModel_->mapFromSource(feedIdCur); feedsView_->setCurrentIndex(currentIndex); slotFeedClicked(currentIndex); QApplication::restoreOverrideCursor(); } /** @brief Import feeds from OPML-file * * Calls open file system dialog with filter *.opml. * Adds all feeds to DB include hierarchy, ignore duplicate feeds *---------------------------------------------------------------------------*/ void MainWindow::slotImportFeeds() { QString fileName = QFileDialog::getOpenFileName(this, tr("Select OPML-File"), QDir::homePath(), QString(tr("OPML-Files (*.%1 *.%2)")) .arg("opml").arg("xml")); if (fileName.isNull()) { statusBar()->showMessage(tr("Import canceled"), 3000); return; } qDebug() << "import file:" << fileName; QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { statusBar()->showMessage(tr("Import: can't open a file"), 3000); return; } QByteArray xmlData = file.readAll(); file.close(); isStartImportFeed_ = true; emit signalImportFeeds(xmlData); } /** @brief Export feeds to OPML-file *---------------------------------------------------------------------------*/ void MainWindow::slotExportFeeds() { QString fileName = QFileDialog::getSaveFileName(this, tr("Select OPML-File"), QDir::homePath(), QString(tr("OPML-Files (*.%1)")) .arg("opml")); if (fileName.isNull()) { statusBar()->showMessage(tr("Export canceled"), 3000); return; } QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { statusBar()->showMessage(tr("Export: can't open a file"), 3000); return; } QXmlStreamWriter xml(&file); xml.setAutoFormatting(true); xml.writeStartDocument(); xml.writeStartElement("opml"); xml.writeAttribute("version", "2.0"); xml.writeStartElement("head"); xml.writeTextElement("title", "QuiteRSS"); xml.writeTextElement("dateModified", QDateTime::currentDateTime().toString()); xml.writeEndElement(); // xml.writeStartElement("body"); // Create model and view for export // Expand the view to step on every item FeedsModel exportTreeModel(this); QTreeView exportTreeView; exportTreeView.setModel(&exportTreeModel); exportTreeModel.setView(feedsView_); exportTreeView.expandAll(); QModelIndex index = exportTreeModel.index(0, 0); QStack parentIdsStack; parentIdsStack.push(0); while (index.isValid()) { int feedId = exportTreeModel.idByIndex(index); int feedParId = exportTreeModel.paridByIndex(index); // Parent differs from previouse one - close folder while (feedParId != parentIdsStack.top()) { xml.writeEndElement(); // "outline" - folder finishes parentIdsStack.pop(); } // Folder has found. Open it if (exportTreeModel.isFolder(index)) { parentIdsStack.push(feedId); xml.writeStartElement("outline"); // Folder starts xml.writeAttribute("text", exportTreeModel.dataField(index, "text").toString()); } // Feed has found. Save it else { xml.writeEmptyElement("outline"); xml.writeAttribute("text", exportTreeModel.dataField(index, "text").toString()); xml.writeAttribute("type", "rss"); xml.writeAttribute("htmlUrl", exportTreeModel.dataField(index, "htmlUrl").toString()); xml.writeAttribute("xmlUrl", exportTreeModel.dataField(index, "xmlUrl").toString()); } index = exportTreeView.indexBelow(index); } xml.writeEndElement(); // xml.writeEndElement(); // xml.writeEndDocument(); file.close(); } // ---------------------------------------------------------------------------- void MainWindow::slotFeedsViewportUpdate() { feedsView_->viewport()->update(); #ifdef HAVE_QT5 feedsView_->header()->setSectionResizeMode(feedsView_->columnIndex("unread"), QHeaderView::ResizeToContents); feedsView_->header()->setSectionResizeMode(feedsView_->columnIndex("undeleteCount"), QHeaderView::ResizeToContents); feedsView_->header()->setSectionResizeMode(feedsView_->columnIndex("updated"), QHeaderView::ResizeToContents); #else feedsView_->header()->setResizeMode(feedsView_->columnIndex("unread"), QHeaderView::ResizeToContents); feedsView_->header()->setResizeMode(feedsView_->columnIndex("undeleteCount"), QHeaderView::ResizeToContents); feedsView_->header()->setResizeMode(feedsView_->columnIndex("updated"), QHeaderView::ResizeToContents); #endif } // ---------------------------------------------------------------------------- void MainWindow::slotFeedCountsUpdate(FeedCountStruct counts) { QModelIndex index = feedsModel_->indexById(counts.feedId); if (index.isValid()) { QModelIndex indexUnread = feedsModel_->indexSibling(index, "unread"); QModelIndex indexNew = feedsModel_->indexSibling(index, "newCount"); QModelIndex indexUndelete = feedsModel_->indexSibling(index, "undeleteCount"); feedsModel_->setData(indexUnread, counts.unreadCount); feedsModel_->setData(indexNew, counts.newCount); feedsModel_->setData(indexUndelete, counts.undeleteCount); if (!counts.updated.isEmpty()) { QModelIndex indexUpdated = feedsModel_->indexSibling(index, "updated"); feedsModel_->setData(indexUpdated, counts.updated); } if (!counts.lastBuildDate.isEmpty()) { QModelIndex indexLastBuildDate = feedsModel_->indexSibling(index, "lastBuildDate"); feedsModel_->setData(indexLastBuildDate, counts.lastBuildDate); } if (!counts.htmlUrl.isEmpty()) { QModelIndex indexHtmlUrl = feedsModel_->indexSibling(index, "htmlUrl"); feedsModel_->setData(indexHtmlUrl, counts.htmlUrl); } if (!counts.title.isEmpty()) { QModelIndex indexTitle = feedsModel_->indexSibling(index, "title"); feedsModel_->setData(indexTitle, counts.title); } } if (isStartImportFeed_ && !counts.xmlUrl.isEmpty()) { emit faviconRequestUrl(counts.htmlUrl, counts.xmlUrl); } } /** @brief Recalculate counters for specified categories * @details Processing DB data. Model "reselect()" needed. * @param categoriesList - categories identifiers list for processing *---------------------------------------------------------------------------*/ void MainWindow::recountFeedCategories(const QList &categoriesList) { QSqlQuery q; QString qStr; foreach (int categoryIdStart, categoriesList) { if (categoryIdStart < 1) continue; int categoryId = categoryIdStart; // Process all parents while (0 < categoryId) { int unreadCount = -1; int undeleteCount = -1; int newCount = -1; // Calculate sum of all feeds with same parent qStr = QString("SELECT sum(unread), sum(undeleteCount), sum(newCount) " "FROM feeds WHERE parentId=='%1'").arg(categoryId); q.exec(qStr); if (q.next()) { unreadCount = q.value(0).toInt(); undeleteCount = q.value(1).toInt(); newCount = q.value(2).toInt(); } if (unreadCount != -1) { qStr = QString("UPDATE feeds SET unread='%1', undeleteCount='%2', newCount='%3' WHERE id=='%4'"). arg(unreadCount).arg(undeleteCount).arg(newCount).arg(categoryId); q.exec(qStr); } // go to next parent's parent qStr = QString("SELECT parentId FROM feeds WHERE id=='%1'"). arg(categoryId); categoryId = 0; q.exec(qStr); if (q.next()) categoryId = q.value(0).toInt(); } } } // ---------------------------------------------------------------------------- void MainWindow::recountCategoryCounts() { if (recountCategoryCountsOn_) return; if (!categoriesTree_->isVisible() || !stackedWidget_->count()) return; recountCategoryCountsOn_ = true; emit signalRecountCategoryCounts(); } /** @brief Process recalculating categories counters *----------------------------------------------------------------------------*/ void MainWindow::slotRecountCategoryCounts(QList deletedList, QList starredList, QList readList, QStringList labelList) { int allStarredCount = 0; int unreadStarredCount = 0; int deletedCount = 0; QMap allCountList; QMap unreadCountList; int allLabelCount = 0; int unreadLabelCount = 0; QFont font; QTreeWidgetItem *labelTreeItem = categoriesTree_->topLevelItem(CategoriesTreeWidget::LabelsItem); for (int i = 0; i < labelTreeItem->childCount(); i++) { int id = labelTreeItem->child(i)->text(2).toInt(); allCountList.insert(id, 0); unreadCountList.insert(id, 0); } for (int i = 0; i < deletedList.count(); ++i) { if (deletedList.at(i) == 0) { if (starredList.at(i) == 1) { allStarredCount++; if (readList.at(i) == 0) unreadStarredCount++; } QString idString = labelList.at(i); if (!idString.isEmpty() && idString != ",") { QStringList idList = idString.split(",", QString::SkipEmptyParts); foreach (QString idStr, idList) { int id = idStr.toInt(); if (allCountList.contains(id)) { allCountList[id]++; if (readList.at(i) == 0) unreadCountList[id]++; } } } } else if (deletedList.at(i) == 1) { deletedCount++; } } for (int i = 0; i < labelTreeItem->childCount(); i++) { int id = labelTreeItem->child(i)->text(2).toInt(); QString countStr; if (!unreadCountList[id] && !allCountList[id]) countStr = ""; else countStr = QString("(%1/%2)").arg(unreadCountList[id]).arg(allCountList[id]); labelTreeItem->child(i)->setText(4, countStr); font = labelTreeItem->child(i)->font(0); if (unreadCountList[id]) font.setBold(true); else font.setBold(false); labelTreeItem->child(i)->setFont(0, font); unreadLabelCount = unreadLabelCount + unreadCountList[id]; allLabelCount = allLabelCount + allCountList[id]; } QString countStr; if (!unreadStarredCount && !allStarredCount) countStr = ""; else countStr = QString("(%1/%2)").arg(unreadStarredCount).arg(allStarredCount); categoriesTree_->topLevelItem(CategoriesTreeWidget::StarredItem)->setText(4, countStr); font = categoriesTree_->topLevelItem(CategoriesTreeWidget::StarredItem)->font(0); if (unreadStarredCount) font.setBold(true); else font.setBold(false); categoriesTree_->topLevelItem(CategoriesTreeWidget::StarredItem)->setFont(0, font); if (!deletedCount) countStr = ""; else countStr = QString("(%1)").arg(deletedCount); categoriesTree_->topLevelItem(CategoriesTreeWidget::DeletedItem)->setText(4, countStr); if (!unreadLabelCount && !allLabelCount) countStr = ""; else countStr = QString("(%1/%2)").arg(unreadLabelCount).arg(allLabelCount); categoriesTree_->topLevelItem(CategoriesTreeWidget::LabelsItem)->setText(4, countStr); font = categoriesTree_->topLevelItem(CategoriesTreeWidget::LabelsItem)->font(0); if (unreadLabelCount) font.setBold(true); else font.setBold(false); categoriesTree_->topLevelItem(CategoriesTreeWidget::LabelsItem)->setFont(0, font); NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(stackedWidget_->currentIndex()); if ((widget->type_ > NewsTabWidget::TabTypeFeed) && (widget->type_ < NewsTabWidget::TabTypeWeb) && categoriesTree_->currentIndex().isValid()) { int unreadCount = widget->getUnreadCount(categoriesTree_->currentItem()->text(4)); int allCount = widget->newsModel_->rowCount(); statusUnread_->setText(QString(" " + tr("Unread: %1") + " ").arg(unreadCount)); statusAll_->setText(QString(" " + tr("All: %1") + " ").arg(allCount)); } recountCategoryCountsOn_ = false; } /** @brief Update feed view * * Slot is called by UpdateDelayer after some delay * @param feedId Feed identifier to update * @param changed Flag indicating that feed is updated indeed *---------------------------------------------------------------------------*/ void MainWindow::slotUpdateFeed(int feedId, bool changed, int newCount, bool finish) { if (finish) { emit signalShowNotification(); progressBar_->hide(); progressBar_->setMaximum(0); progressBar_->setValue(0); isStartImportFeed_ = false; } if (!changed) { emit signalNextUpdate(finish); return; } // Action after new news has arrived: tray, sound if (!isActiveWindow() && (newCount > 0) && (behaviorIconTray_ == CHANGE_ICON_TRAY)) { traySystem->setIcon(QIcon(":/images/quiterss16_NewNews")); } emit signalRefreshInfoTray(); if (newCount > 0) emit signalPlaySoundNewNews(); // Manage notifications bool showNotify = true; if (showNotifyInactiveApp_) { showNotify = !isActiveWindow(); } if (!showNotify) { clearNotification(); } if (newCount > 0) { bool bAddRecentNews = !onlySelectedFeeds_ || idFeedsNotifyList_.contains(feedId); bool bAddNewNews = bAddRecentNews && showNotify; if (bAddNewNews) { int newFeedIdIndex = newNews.idFeedList_.indexOf(feedId); if (-1 < newFeedIdIndex) { newNews.cntNewsList_[newFeedIdIndex] = newCount; } else { newNews.idFeedList_.append(feedId); newNews.cntNewsList_.append(newCount); } } if (bAddRecentNews) { int recentFeedIdIndex = recentNews.idFeedList_.indexOf(feedId); if (-1 < recentFeedIdIndex) { recentNews.cntNewsList_[recentFeedIdIndex] += newCount; } else { recentNews.idFeedList_.append(feedId); recentNews.cntNewsList_.append(newCount); } } } recountCategoryCounts(); emit signalNextUpdate(finish); } /** @brief Process updating news list *---------------------------------------------------------------------------*/ void MainWindow::slotUpdateNews(int refresh) { int newsId = newsModel_->index( newsView_->currentIndex().row(), newsModel_->fieldIndex("id")).data(Qt::EditRole).toInt(); newsModel_->select(); if (newsModel_->rowCount() != 0) { while (newsModel_->canFetchMore()) newsModel_->fetchMore(); } currentNewsTab->loadNewspaper(refresh); QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(index, Qt::EditRole, newsId); if (indexList.count()) { int newsRow = indexList.first().row(); newsView_->setCurrentIndex(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); } else { currentNewsTab->currentNewsIdOld = newsId; currentNewsTab->hideWebContent(); } } /** @brief Process click in feed tree *---------------------------------------------------------------------------*/ void MainWindow::slotFeedClicked(QModelIndex index) { if (feedsView_->selectionModel()->selectedRows(0).count() > 1) return; int feedIdCur = feedsModel_->idByIndex(feedsProxyModel_->mapToSource(index)); if (stackedWidget_->count() && currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { currentNewsTab->newsHeader_->saveStateColumns(currentNewsTab); } // Search open tab containing this feed int indexTab = -1; for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->feedId_ == feedIdCur) { indexTab = i; break; } } if (indexTab == -1) { if (tabBar_->currentIndex() != TAB_WIDGET_PERMANENT) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingTab, currentNewsTab); updateCurrentTab_ = false; tabBar_->setCurrentIndex(TAB_WIDGET_PERMANENT); updateCurrentTab_ = true; QModelIndex currentIndex = feedsProxyModel_->mapFromSource(feedIdCur); feedsView_->setCurrentIndex(currentIndex); currentNewsTab = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); newsModel_ = currentNewsTab->newsModel_; newsView_ = currentNewsTab->newsView_; } else { if (stackedWidget_->count() && currentNewsTab->type_ != NewsTabWidget::TabTypeFeed) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingFeed, currentNewsTab); } else { // Mark previous feed Read while switching to another feed setFeedRead(NewsTabWidget::TabTypeFeed, feedIdOld_, FeedReadSwitchingFeed, 0, feedIdCur); } categoriesTree_->setCurrentIndex(QModelIndex()); } slotFeedSelected(feedsModel_->indexById(feedIdCur)); feedsView_->repaint(); } else if (indexTab != -1) { tabBar_->setCurrentIndex(indexTab); } feedIdOld_ = feedIdCur; } /** @brief Process feed choosing *---------------------------------------------------------------------------*/ void MainWindow::slotFeedSelected(QModelIndex index, bool createTab) { int feedId = feedsModel_->idByIndex(index); int feedParId = feedsModel_->paridByIndex(index); // Open or create feed tab if (!stackedWidget_->count() || createTab) { NewsTabWidget *widget = new NewsTabWidget(this, NewsTabWidget::TabTypeFeed, feedId, feedParId); int indexTab = addTab(widget); createNewsTab(indexTab); if (indexTab == 0) currentNewsTab->closeButton_->setVisible(false); if (!index.isValid()) currentNewsTab->setVisible(false); emit signalSetCurrentTab(indexTab); } else { currentNewsTab->type_ = NewsTabWidget::TabTypeFeed; currentNewsTab->feedId_ = feedId; currentNewsTab->feedParId_ = feedParId; currentNewsTab->setSettings(true, false); currentNewsTab->setVisible(index.isValid()); } statusUnread_->setVisible(index.isValid()); statusAll_->setVisible(index.isValid()); // Set icon for tab has opened bool isFeed = (index.isValid() && feedsModel_->isFolder(index)) ? false : true; QPixmap iconTab; QByteArray byteArray = feedsModel_->dataField(index, "image").toByteArray(); if (!isFeed) { iconTab.load(":/images/folder"); } else { if (byteArray.isNull() || defaultIconFeeds_) { iconTab.load(":/images/feed"); } else if (isFeed) { iconTab.loadFromData(QByteArray::fromBase64(byteArray)); } } currentNewsTab->newsIconTitle_->setPixmap(iconTab); // Set title for tab has opened currentNewsTab->setTextTab(feedsModel_->dataField(index, "text").toString()); feedProperties_->setEnabled(index.isValid()); setNewsFilter(newsFilterGroup_->checkedAction(), false); // Search feed news that displayed before int newsRow = -1; if (openingFeedAction_ == 0) { QModelIndex feedIndex = feedsModel_->indexById(feedId); int newsIdCur = feedsModel_->dataField(feedIndex, "currentNews").toInt(); QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(index, Qt::EditRole, newsIdCur); if (!indexList.isEmpty()) newsRow = indexList.first().row(); } else if (openingFeedAction_ == 1) { newsRow = 0; } else if ((openingFeedAction_ == 3) || (openingFeedAction_ == 4)) { QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("read")); QModelIndexList indexList; if ((newsView_->header()->sortIndicatorOrder() == Qt::DescendingOrder) && (openingFeedAction_ != 4)) indexList = newsModel_->match(index, Qt::EditRole, 0, -1); else indexList = newsModel_->match(index, Qt::EditRole, 0); if (!indexList.isEmpty()) newsRow = indexList.last().row(); } // Focus feed news that displayed before newsView_->setCurrentIndex(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); if (newsRow == -1) newsView_->verticalScrollBar()->setValue(newsRow); if ((openingFeedAction_ != 2) && openNewsWebViewOn_) { currentNewsTab->slotNewsViewSelected(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); } else { currentNewsTab->slotNewsViewSelected(newsModel_->index(-1, newsModel_->fieldIndex("title"))); int newsId = newsModel_->index(newsRow, newsModel_->fieldIndex("id")).data(Qt::EditRole).toInt(); QString qStr = QString("UPDATE feeds SET currentNews='%1' WHERE id=='%2'").arg(newsId).arg(feedId); mainApp->sqlQueryExec(qStr); QModelIndex feedIndex = feedsModel_->indexById(feedId); feedsModel_->setData(feedsModel_->indexSibling(feedIndex, "currentNews"), newsId); } } // ---------------------------------------------------------------------------- void MainWindow::showOptionDlg(int index) { static int pageIndex = 0; Settings settings; if (index != -1) pageIndex = index; if (optionsDialog_) { optionsDialog_->activateWindow(); return; } optionsDialog_ = new OptionsDialog(this); settings.beginGroup("Settings"); bool updateFeedsStartUp = settings.value("autoUpdatefeedsStartUp", false).toBool(); settings.endGroup(); optionsDialog_->showSplashScreen_->setChecked(showSplashScreen_); optionsDialog_->reopenFeedStartup_->setChecked(reopenFeedStartup_); optionsDialog_->openNewTabNextToActive_->setChecked(openNewTabNextToActive_); optionsDialog_->hideFeedsOpenTab_->setChecked(hideFeedsOpenTab_); optionsDialog_->showToggleFeedsTree_->setChecked(showToggleFeedsTree_); optionsDialog_->defaultIconFeeds_->setChecked(defaultIconFeeds_); optionsDialog_->autocollapseFolder_->setChecked(feedsView_->autocollapseFolder_); bool showCloseButtonTab = settings.value("Settings/showCloseButtonTab", true).toBool(); optionsDialog_->showCloseButtonTab_->setChecked(showCloseButtonTab); bool updateCheckEnabled = settings.value("Settings/updateCheckEnabled", true).toBool(); optionsDialog_->updateCheckEnabled_->setChecked(updateCheckEnabled); bool statisticsEnabled = settings.value("Settings/statisticsEnabled", true).toBool(); optionsDialog_->statisticsEnabled_->setChecked(statisticsEnabled); bool storeDBMemory_ = settings.value("Settings/storeDBMemory", true).toBool(); optionsDialog_->storeDBMemory_->setChecked(storeDBMemory_); int saveDBMemFileInterval = settings.value("Settings/saveDBMemFileInterval", 30).toInt(); optionsDialog_->saveDBMemFileInterval_->setValue(saveDBMemFileInterval); optionsDialog_->showTrayIconBox_->setChecked(showTrayIcon_); optionsDialog_->startingTray_->setChecked(startingTray_); optionsDialog_->minimizingTray_->setChecked(minimizingTray_); optionsDialog_->closingTray_->setChecked(closingTray_); optionsDialog_->setBehaviorIconTray(behaviorIconTray_); optionsDialog_->singleClickTray_->setChecked(singleClickTray_); optionsDialog_->clearStatusNew_->setChecked(clearStatusNew_); optionsDialog_->emptyWorking_->setChecked(emptyWorking_); optionsDialog_->setProxy(networkProxy_); int timeoutRequest = settings.value("Settings/timeoutRequest", 15).toInt(); int numberRequests = settings.value("Settings/numberRequest", 10).toInt(); int numberRepeats = settings.value("Settings/numberRepeats", 2).toInt(); optionsDialog_->timeoutRequest_->setValue(timeoutRequest); optionsDialog_->numberRequests_->setValue(numberRequests); optionsDialog_->numberRepeats_->setValue(numberRepeats); optionsDialog_->embeddedBrowserOn_->setChecked(externalBrowserOn_ <= 0); optionsDialog_->externalBrowserOn_->setChecked(externalBrowserOn_ >= 1); optionsDialog_->defaultExternalBrowserOn_->setChecked((externalBrowserOn_ == 0) || (externalBrowserOn_ == 1)); optionsDialog_->otherExternalBrowserOn_->setChecked((externalBrowserOn_ == -1) || (externalBrowserOn_ == 2)); optionsDialog_->otherExternalBrowserEdit_->setText(externalBrowser_); optionsDialog_->autoLoadImages_->setChecked(autoLoadImages_); optionsDialog_->javaScriptEnable_->setChecked(javaScriptEnable_); optionsDialog_->pluginsEnable_->setChecked(pluginsEnable_); optionsDialog_->defaultZoomPages_->setValue(defaultZoomPages_); optionsDialog_->openLinkInBackground_->setChecked(openLinkInBackground_); optionsDialog_->openLinkInBackgroundEmbedded_->setChecked(openLinkInBackgroundEmbedded_); optionsDialog_->maxPagesInCache_->setValue(maxPagesInCache_); settings.beginGroup("Settings"); QString userStyleBrowser = settings.value("userStyleBrowser", QString()).toString(); optionsDialog_->userStyleBrowserEdit_->setText(userStyleBrowser); bool useDiskCache = settings.value("useDiskCache", true).toBool(); optionsDialog_->diskCacheOn_->setChecked(useDiskCache); QString diskCacheDir = settings.value("dirDiskCache", mainApp->cacheDefaultDir()).toString(); if (diskCacheDir.isEmpty()) diskCacheDir = mainApp->cacheDefaultDir(); optionsDialog_->dirDiskCacheEdit_->setText(diskCacheDir); int maxDiskCache = settings.value("maxDiskCache", 50).toInt(); optionsDialog_->maxDiskCache_->setValue(maxDiskCache); settings.endGroup(); UseCookies useCookies = mainApp->cookieJar()->useCookies(); optionsDialog_->saveCookies_->setChecked(useCookies == SaveCookies); optionsDialog_->deleteCookiesOnClose_->setChecked(useCookies == DeleteCookiesOnClose); optionsDialog_->blockCookies_->setChecked(useCookies == BlockCookies); optionsDialog_->downloadLocationEdit_->setText(downloadLocation_); optionsDialog_->askDownloadLocation_->setChecked(askDownloadLocation_); optionsDialog_->updateFeedsStartUp_->setChecked(updateFeedsStartUp); optionsDialog_->updateFeedsEnable_->setChecked(updateFeedsEnable_); optionsDialog_->updateIntervalType_->setCurrentIndex(updateFeedsIntervalType_+1); optionsDialog_->updateFeedsInterval_->setValue(updateFeedsInterval_); optionsDialog_->setOpeningFeed(openingFeedAction_); optionsDialog_->openNewsWebViewOn_->setChecked(openNewsWebViewOn_); optionsDialog_->markNewsReadOn_->setChecked(markNewsReadOn_); optionsDialog_->markCurNewsRead_->setChecked(markCurNewsRead_); optionsDialog_->markNewsReadTime_->setValue(markNewsReadTime_); optionsDialog_->markPrevNewsRead_->setChecked(markPrevNewsRead_); optionsDialog_->markReadSwitchingFeed_->setChecked(markReadSwitchingFeed_); optionsDialog_->markReadClosingTab_->setChecked(markReadClosingTab_); optionsDialog_->markReadMinimize_->setChecked(markReadMinimize_); optionsDialog_->showDescriptionNews_->setChecked(showDescriptionNews_); int curClickValIdx = optionsDialog_->singleClickAction->findData((int)newsSingleClickAction); optionsDialog_->singleClickAction->setCurrentIndex(curClickValIdx); curClickValIdx = optionsDialog_->doubleClickAction->findData((int)newsDoubleClickAction); optionsDialog_->doubleClickAction->setCurrentIndex(curClickValIdx); curClickValIdx = optionsDialog_->middleClickAction->findData((int)newsMiddleClickAction); optionsDialog_->middleClickAction->setCurrentIndex(curClickValIdx); for (int i = 0; i < optionsDialog_->formatDate_->count(); i++) { if (optionsDialog_->formatDate_->itemData(i).toString() == formatDate_) { optionsDialog_->formatDate_->setCurrentIndex(i); break; } } for (int i = 0; i < optionsDialog_->formatTime_->count(); i++) { if (optionsDialog_->formatTime_->itemData(i).toString() == formatTime_) { optionsDialog_->formatTime_->setCurrentIndex(i); break; } } optionsDialog_->alternatingRowColorsNews_->setChecked(alternatingRowColorsNews_); optionsDialog_->changeBehaviorActionNUN_->setChecked(changeBehaviorActionNUN_); optionsDialog_->simplifiedDateTime_->setChecked(simplifiedDateTime_); optionsDialog_->notDeleteStarred_->setChecked(notDeleteStarred_); optionsDialog_->notDeleteLabeled_->setChecked(notDeleteLabeled_); optionsDialog_->markIdenticalNewsRead_->setChecked(markIdenticalNewsRead_); for (int i = 0; i < optionsDialog_->mainNewsFilter_->count(); i++) { if (optionsDialog_->mainNewsFilter_->itemData(i).toString() == mainNewsFilter_) { optionsDialog_->mainNewsFilter_->setCurrentIndex(i); break; } } QString styleSheetNews = settings.value("Settings/styleSheetNews", mainApp->styleSheetNewsDefaultFile()).toString(); optionsDialog_->styleSheetNewsEdit_->setText(styleSheetNews); optionsDialog_->cleanupOnShutdownBox_->setChecked(cleanupOnShutdown_); optionsDialog_->dayCleanUpOn_->setChecked(dayCleanUpOn_); optionsDialog_->maxDayCleanUp_->setValue(maxDayCleanUp_); optionsDialog_->newsCleanUpOn_->setChecked(newsCleanUpOn_); optionsDialog_->maxNewsCleanUp_->setValue(maxNewsCleanUp_); optionsDialog_->readCleanUp_->setChecked(readCleanUp_); optionsDialog_->neverUnreadCleanUp_->setChecked(neverUnreadCleanUp_); optionsDialog_->neverStarCleanUp_->setChecked(neverStarCleanUp_); optionsDialog_->neverLabelCleanUp_->setChecked(neverLabelCleanUp_); optionsDialog_->cleanUpDeleted_->setChecked(cleanUpDeleted_); optionsDialog_->optimizeDB_->setChecked(optimizeDB_); optionsDialog_->soundNotifyBox_->setChecked(soundNewNews_); optionsDialog_->editSoundNotifer_->setText(soundNotifyPath_); optionsDialog_->showNotifyOn_->setChecked(showNotifyOn_); optionsDialog_->screenNotify_->setCurrentIndex(screenNotify_+1); optionsDialog_->positionNotify_->setCurrentIndex(positionNotify_); optionsDialog_->transparencyNotify_->setValue(transparencyNotify_); optionsDialog_->countShowNewsNotify_->setValue(countShowNewsNotify_); optionsDialog_->widthTitleNewsNotify_->setValue(widthTitleNewsNotify_); optionsDialog_->timeShowNewsNotify_->setValue(timeShowNewsNotify_); optionsDialog_->fullscreenModeNotify_->setChecked(fullscreenModeNotify_); optionsDialog_->showNotifyInactiveApp_->setChecked(showNotifyInactiveApp_); optionsDialog_->onlySelectedFeeds_->setChecked(onlySelectedFeeds_); optionsDialog_->showTitlesFeedsNotify_->setChecked(showTitlesFeedsNotify_); optionsDialog_->showIconFeedNotify_->setChecked(showIconFeedNotify_); optionsDialog_->showButtonMarkAllNotify_->setChecked(showButtonMarkAllNotify_); optionsDialog_->showButtonMarkReadNotify_->setChecked(showButtonMarkReadNotify_); optionsDialog_->showButtonExBrowserNotify_->setChecked(showButtonExBrowserNotify_); optionsDialog_->showButtonDeleteNotify_->setChecked(showButtonDeleteNotify_); optionsDialog_->setLanguage(mainApp->language()); QString strFont = QString("%1, %2"). arg(feedsView_->font().family()). arg(feedsView_->font().pointSize()); optionsDialog_->fontsTree_->topLevelItem(0)->setText(2, strFont); strFont = QString("%1, %2").arg(newsListFontFamily_).arg(newsListFontSize_); optionsDialog_->fontsTree_->topLevelItem(1)->setText(2, strFont); strFont = QString("%1, %2").arg(newsTitleFontFamily_).arg(newsTitleFontSize_); optionsDialog_->fontsTree_->topLevelItem(2)->setText(2, strFont); strFont = QString("%1, %2").arg(newsTextFontFamily_).arg(newsTextFontSize_); optionsDialog_->fontsTree_->topLevelItem(3)->setText(2, strFont); strFont = QString("%1, %2").arg(notificationFontFamily_).arg(notificationFontSize_); optionsDialog_->fontsTree_->topLevelItem(4)->setText(2, strFont); settings.beginGroup("Settings"); QString browserStandardFont = settings.value( "browserStandardFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::StandardFont)).toString(); QString browserFixedFont = settings.value( "browserFixedFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::FixedFont)).toString(); QString browserSerifFont = settings.value( "browserSerifFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::SerifFont)).toString(); QString browserSansSerifFont = settings.value( "browserSansSerifFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::SansSerifFont)).toString(); QString browserCursiveFont = settings.value( "browserCursiveFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::CursiveFont)).toString(); QString browserFantasyFont = settings.value( "browserFantasyFont", QWebSettings::globalSettings()->fontFamily(QWebSettings::FantasyFont)).toString(); int browserDefaultFontSize = settings.value( "browserDefaultFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::DefaultFontSize)).toInt(); int browserFixedFontSize = settings.value( "browserFixedFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::DefaultFixedFontSize)).toInt(); int browserMinFontSize = settings.value( "browserMinFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::MinimumFontSize)).toInt(); int browserMinLogFontSize = settings.value( "browserMinLogFontSize", QWebSettings::globalSettings()->fontSize(QWebSettings::MinimumLogicalFontSize)).toInt(); settings.endGroup(); optionsDialog_->browserStandardFont_->setCurrentFont(QFont(browserStandardFont)); optionsDialog_->browserFixedFont_->setCurrentFont(QFont(browserFixedFont)); optionsDialog_->browserSerifFont_->setCurrentFont(QFont(browserSerifFont)); optionsDialog_->browserSansSerifFont_->setCurrentFont(QFont(browserSansSerifFont)); optionsDialog_->browserCursiveFont_->setCurrentFont(QFont(browserCursiveFont)); optionsDialog_->browserFantasyFont_->setCurrentFont(QFont(browserFantasyFont)); optionsDialog_->browserDefaultFontSize_->setValue(browserDefaultFontSize); optionsDialog_->browserFixedFontSize_->setValue(browserFixedFontSize); optionsDialog_->browserMinFontSize_->setValue(browserMinFontSize); optionsDialog_->browserMinLogFontSize_->setValue(browserMinLogFontSize); QPixmap pixmapColor(14, 14); pixmapColor.fill(feedsModel_->textColor_); optionsDialog_->colorsTree_->topLevelItem(0)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(0)->setText(1, feedsModel_->textColor_); if (feedsModel_->backgroundColor_.isEmpty()) pixmapColor.fill(QColor(0, 0, 0, 0)); else pixmapColor.fill(feedsModel_->backgroundColor_); optionsDialog_->colorsTree_->topLevelItem(1)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(1)->setText(1, feedsModel_->backgroundColor_); pixmapColor.fill(newsListTextColor_); optionsDialog_->colorsTree_->topLevelItem(2)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(2)->setText(1, newsListTextColor_); if (newsListBackgroundColor_.isEmpty()) pixmapColor.fill(QColor(0, 0, 0, 0)); else pixmapColor.fill(newsListBackgroundColor_); optionsDialog_->colorsTree_->topLevelItem(3)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(3)->setText(1, newsListBackgroundColor_); pixmapColor.fill(focusedNewsTextColor_); optionsDialog_->colorsTree_->topLevelItem(4)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(4)->setText(1, focusedNewsTextColor_); if (focusedNewsBGColor_.isEmpty()) pixmapColor.fill(QColor(0, 0, 0, 0)); else pixmapColor.fill(focusedNewsBGColor_); optionsDialog_->colorsTree_->topLevelItem(5)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(5)->setText(1, focusedNewsBGColor_); pixmapColor.fill(linkColor_); optionsDialog_->colorsTree_->topLevelItem(6)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(6)->setText(1, linkColor_); pixmapColor.fill(titleColor_); optionsDialog_->colorsTree_->topLevelItem(7)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(7)->setText(1, titleColor_); pixmapColor.fill(dateColor_); optionsDialog_->colorsTree_->topLevelItem(8)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(8)->setText(1, dateColor_); pixmapColor.fill(authorColor_); optionsDialog_->colorsTree_->topLevelItem(9)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(9)->setText(1, authorColor_); pixmapColor.fill(newsTextColor_); optionsDialog_->colorsTree_->topLevelItem(10)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(10)->setText(1, newsTextColor_); pixmapColor.fill(newsTitleBackgroundColor_); optionsDialog_->colorsTree_->topLevelItem(11)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(11)->setText(1, newsTitleBackgroundColor_); pixmapColor.fill(newsBackgroundColor_); optionsDialog_->colorsTree_->topLevelItem(12)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(12)->setText(1, newsBackgroundColor_); pixmapColor.fill(feedsModel_->feedWithNewNewsColor_); optionsDialog_->colorsTree_->topLevelItem(13)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(13)->setText(1, feedsModel_->feedWithNewNewsColor_); pixmapColor.fill(feedsModel_->countNewsUnreadColor_); optionsDialog_->colorsTree_->topLevelItem(14)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(14)->setText(1, feedsModel_->countNewsUnreadColor_); pixmapColor.fill(newNewsTextColor_); optionsDialog_->colorsTree_->topLevelItem(15)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(15)->setText(1, newNewsTextColor_); pixmapColor.fill(unreadNewsTextColor_); optionsDialog_->colorsTree_->topLevelItem(16)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(16)->setText(1, unreadNewsTextColor_); pixmapColor.fill(feedsModel_->focusedFeedTextColor_); optionsDialog_->colorsTree_->topLevelItem(17)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(17)->setText(1, feedsModel_->focusedFeedTextColor_); if (feedsModel_->focusedFeedBGColor_.isEmpty()) pixmapColor.fill(QColor(0, 0, 0, 0)); else pixmapColor.fill(feedsModel_->focusedFeedBGColor_); optionsDialog_->colorsTree_->topLevelItem(18)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(18)->setText(1, feedsModel_->focusedFeedBGColor_); pixmapColor.fill(feedsModel_->feedDisabledUpdateColor_); optionsDialog_->colorsTree_->topLevelItem(19)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(19)->setText(1, feedsModel_->feedDisabledUpdateColor_); pixmapColor.fill(alternatingRowColors_); optionsDialog_->colorsTree_->topLevelItem(20)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(20)->setText(1, alternatingRowColors_); pixmapColor.fill(notifierTextColor_); optionsDialog_->colorsTree_->topLevelItem(21)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(21)->setText(1, notifierTextColor_); pixmapColor.fill(notifierBackgroundColor_); optionsDialog_->colorsTree_->topLevelItem(22)->setIcon(0, pixmapColor); optionsDialog_->colorsTree_->topLevelItem(22)->setText(1, notifierBackgroundColor_); NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); backWebPageAct_->setText(widget->webView_->page()->action(QWebPage::Back)->text()); backWebPageAct_->setToolTip(widget->webView_->page()->action(QWebPage::Back)->toolTip() + " " + tr("(Browser)")); backWebPageAct_->setIcon(widget->webView_->page()->action(QWebPage::Back)->icon()); backWebPageAct_->setShortcut(widget->webView_->page()->action(QWebPage::Back)->shortcut()); forwardWebPageAct_->setText(widget->webView_->page()->action(QWebPage::Forward)->text()); forwardWebPageAct_->setToolTip(widget->webView_->page()->action(QWebPage::Forward)->toolTip() + " " + tr("(Browser)")); forwardWebPageAct_->setIcon(widget->webView_->page()->action(QWebPage::Forward)->icon()); forwardWebPageAct_->setShortcut(widget->webView_->page()->action(QWebPage::Forward)->shortcut()); reloadWebPageAct_->setText(widget->webView_->page()->action(QWebPage::Reload)->text()); reloadWebPageAct_->setToolTip(widget->webView_->page()->action(QWebPage::Reload)->toolTip() + " " + tr("(Browser)")); reloadWebPageAct_->setIcon(widget->webView_->page()->action(QWebPage::Reload)->icon()); reloadWebPageAct_->setShortcut(widget->webView_->page()->action(QWebPage::Reload)->shortcut()); optionsDialog_->loadActionShortcut(listActions_, &listDefaultShortcut_); // Display setting dialog optionsDialog_->setCurrentItem(pageIndex); int result = optionsDialog_->exec(); pageIndex = optionsDialog_->currentIndex(); if (result == QDialog::Rejected) { delete optionsDialog_; optionsDialog_ = NULL; return; } // Apply accepted settings foreach (QAction *action, listActions_) { QString objectName = action->objectName(); if (objectName.contains("labelAction_")) { listActions_.removeOne(action); delete action; } } optionsDialog_->saveActionShortcut(listActions_, newsLabelGroup_); listActions_.append(newsLabelGroup_->actions()); newsLabelMenu_->addActions(newsLabelGroup_->actions()); this->addActions(newsLabelGroup_->actions()); if (newsLabelGroup_->actions().count()) { newsLabelAction_->setIcon(newsLabelGroup_->actions().at(0)->icon()); newsLabelAction_->setToolTip(newsLabelGroup_->actions().at(0)->text()); newsLabelAction_->setData(newsLabelGroup_->actions().at(0)->data()); } if (optionsDialog_->idLabels_.count()) { QTreeWidgetItem *labelTreeItem = categoriesTree_->topLevelItem(CategoriesTreeWidget::LabelsItem); while (labelTreeItem->childCount()) { labelTreeItem->removeChild(labelTreeItem->child(0)); } bool closeTab = true; int indexTab = -1; int tabLabelId = -1; for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->type_ == NewsTabWidget::TabTypeLabel) { indexTab = i; tabLabelId = widget->labelId_; break; } } QSqlQuery q; q.exec("SELECT id, name, image, currentNews, num, color_bg, color_text FROM labels ORDER BY num"); while (q.next()) { int idLabel = q.value(0).toInt(); QString nameLabel = q.value(1).toString(); QByteArray byteArray = q.value(2).toByteArray(); QString currentNews = q.value(3).toString(); QPixmap imageLabel; if (!byteArray.isNull()) imageLabel.loadFromData(byteArray); QStringList dataItem; dataItem << nameLabel << QString::number(NewsTabWidget::TabTypeLabel) << QString::number(idLabel) << currentNews; QTreeWidgetItem *childItem = new QTreeWidgetItem(dataItem); childItem->setIcon(0, QIcon(imageLabel)); childItem->setData(0, CategoriesTreeWidget::ImageRole, q.value(2)); childItem->setData(0, CategoriesTreeWidget::NumRole, q.value(4)); childItem->setData(0, CategoriesTreeWidget::colorBgRole, q.value(5)); childItem->setData(0, CategoriesTreeWidget::colorTextRole, q.value(6)); labelTreeItem->addChild(childItem); if (idLabel == tabLabelId) { closeTab = false; NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(indexTab); // Set icon and title for tab has opened widget->newsIconTitle_->setPixmap(imageLabel); widget->setTextTab(nameLabel); } } if (closeTab && (indexTab > 0) && (tabLabelId > 0)) { slotCloseTab(indexTab); } if ((tabBar_->currentIndex() == indexTab) && (indexTab > 0) && (tabLabelId == 0)) { slotUpdateNews(NewsTabWidget::RefreshWithPos); } } showSplashScreen_ = optionsDialog_->showSplashScreen_->isChecked(); reopenFeedStartup_ = optionsDialog_->reopenFeedStartup_->isChecked(); openNewTabNextToActive_ = optionsDialog_->openNewTabNextToActive_->isChecked(); hideFeedsOpenTab_ = optionsDialog_->hideFeedsOpenTab_->isChecked(); showToggleFeedsTree_ = optionsDialog_->showToggleFeedsTree_->isChecked(); defaultIconFeeds_ = optionsDialog_->defaultIconFeeds_->isChecked(); feedsModel_->defaultIconFeeds_ = defaultIconFeeds_; feedsView_->autocollapseFolder_ = optionsDialog_->autocollapseFolder_->isChecked(); showCloseButtonTab = optionsDialog_->showCloseButtonTab_->isChecked(); settings.setValue("Settings/showCloseButtonTab", showCloseButtonTab); pushButtonNull_->setVisible(showToggleFeedsTree_); updateCheckEnabled = optionsDialog_->updateCheckEnabled_->isChecked(); settings.setValue("Settings/updateCheckEnabled", updateCheckEnabled); statisticsEnabled = optionsDialog_->statisticsEnabled_->isChecked(); settings.setValue("Settings/statisticsEnabled", statisticsEnabled); storeDBMemory_ = optionsDialog_->storeDBMemory_->isChecked(); settings.setValue("Settings/storeDBMemory", storeDBMemory_); if (saveDBMemFileInterval != optionsDialog_->saveDBMemFileInterval_->value()) { saveDBMemFileInterval = optionsDialog_->saveDBMemFileInterval_->value(); settings.setValue("Settings/saveDBMemFileInterval", saveDBMemFileInterval); mainApp->updateFeeds()->startSaveTimer(); } showTrayIcon_ = optionsDialog_->showTrayIconBox_->isChecked(); startingTray_ = optionsDialog_->startingTray_->isChecked(); minimizingTray_ = optionsDialog_->minimizingTray_->isChecked(); closingTray_ = optionsDialog_->closingTray_->isChecked(); behaviorIconTray_ = optionsDialog_->behaviorIconTray(); if (behaviorIconTray_ > CHANGE_ICON_TRAY) { emit signalRefreshInfoTray(); } else { traySystem->setIcon(QIcon(":/images/quiterss16")); } singleClickTray_ = optionsDialog_->singleClickTray_->isChecked(); clearStatusNew_ = optionsDialog_->clearStatusNew_->isChecked(); emptyWorking_ = optionsDialog_->emptyWorking_->isChecked(); if (showTrayIcon_) traySystem->show(); else traySystem->hide(); networkProxy_ = optionsDialog_->proxy(); setProxy(networkProxy_); timeoutRequest = optionsDialog_->timeoutRequest_->value(); numberRequests = optionsDialog_->numberRequests_->value(); numberRepeats = optionsDialog_->numberRepeats_->value(); settings.setValue("Settings/timeoutRequest", timeoutRequest); settings.setValue("Settings/numberRequest", numberRequests); settings.setValue("Settings/numberRepeats", numberRepeats); if (optionsDialog_->embeddedBrowserOn_->isChecked()) { if (optionsDialog_->defaultExternalBrowserOn_->isChecked()) externalBrowserOn_ = 0; else externalBrowserOn_ = -1; } else { if (optionsDialog_->defaultExternalBrowserOn_->isChecked()) externalBrowserOn_ = 1; else externalBrowserOn_ = 2; } externalBrowser_ = optionsDialog_->otherExternalBrowserEdit_->text(); autoLoadImages_ = optionsDialog_->autoLoadImages_->isChecked(); javaScriptEnable_ = optionsDialog_->javaScriptEnable_->isChecked(); pluginsEnable_ = optionsDialog_->pluginsEnable_->isChecked(); openLinkInBackground_ = optionsDialog_->openLinkInBackground_->isChecked(); openLinkInBackgroundEmbedded_ = optionsDialog_->openLinkInBackgroundEmbedded_->isChecked(); maxPagesInCache_ = optionsDialog_->maxPagesInCache_->value(); defaultZoomPages_ = optionsDialog_->defaultZoomPages_->value(); QWebSettings::globalSettings()->setAttribute( QWebSettings::JavascriptEnabled, javaScriptEnable_); QWebSettings::globalSettings()->setAttribute( QWebSettings::PluginsEnabled, pluginsEnable_); QWebSettings::globalSettings()->setMaximumPagesInCache(maxPagesInCache_); settings.beginGroup("Settings"); userStyleBrowser = optionsDialog_->userStyleBrowserEdit_->text(); settings.setValue("userStyleBrowser", userStyleBrowser); useDiskCache = optionsDialog_->diskCacheOn_->isChecked(); settings.setValue("useDiskCache", useDiskCache); maxDiskCache = optionsDialog_->maxDiskCache_->value(); settings.setValue("maxDiskCache", maxDiskCache); if (diskCacheDir != optionsDialog_->dirDiskCacheEdit_->text()) { Common::removePath(diskCacheDir); } diskCacheDir = optionsDialog_->dirDiskCacheEdit_->text(); if (diskCacheDir.isEmpty()) diskCacheDir = mainApp->cacheDefaultDir(); settings.setValue("dirDiskCache", diskCacheDir); settings.endGroup(); mainApp->setDiskCache(); useCookies = SaveCookies; if (optionsDialog_->deleteCookiesOnClose_->isChecked()) useCookies = DeleteCookiesOnClose; else if (optionsDialog_->blockCookies_->isChecked()) useCookies = BlockCookies; mainApp->cookieJar()->setUseCookies(useCookies); downloadLocation_ = optionsDialog_->downloadLocationEdit_->text(); askDownloadLocation_ = optionsDialog_->askDownloadLocation_->isChecked(); updateFeedsStartUp = optionsDialog_->updateFeedsStartUp_->isChecked(); updateFeedsEnable_ = optionsDialog_->updateFeedsEnable_->isChecked(); updateFeedsInterval_ = optionsDialog_->updateFeedsInterval_->value(); updateFeedsIntervalType_ = optionsDialog_->updateIntervalType_->currentIndex()-1; int updateInterval = updateFeedsInterval_; if (updateFeedsIntervalType_ == 0) updateInterval = updateInterval*60; else if (updateFeedsIntervalType_ == 1) updateInterval = updateInterval*60*60; updateIntervalSec_ = updateInterval; openingFeedAction_ = optionsDialog_->getOpeningFeed(); openNewsWebViewOn_ = optionsDialog_->openNewsWebViewOn_->isChecked(); markNewsReadOn_ = optionsDialog_->markNewsReadOn_->isChecked(); markCurNewsRead_ = optionsDialog_->markCurNewsRead_->isChecked(); markNewsReadTime_ = optionsDialog_->markNewsReadTime_->value(); markPrevNewsRead_ = optionsDialog_->markPrevNewsRead_->isChecked(); markReadSwitchingFeed_ = optionsDialog_->markReadSwitchingFeed_->isChecked(); markReadClosingTab_ = optionsDialog_->markReadClosingTab_->isChecked(); markReadMinimize_ = optionsDialog_->markReadMinimize_->isChecked(); showDescriptionNews_ = optionsDialog_->showDescriptionNews_->isChecked(); newsSingleClickAction = (ENewsClickAction::Type)optionsDialog_->singleClickAction-> itemData(optionsDialog_->singleClickAction->currentIndex()).toInt(); newsDoubleClickAction = (ENewsClickAction::Type)optionsDialog_->doubleClickAction-> itemData(optionsDialog_->doubleClickAction->currentIndex()).toInt(); newsMiddleClickAction = (ENewsClickAction::Type)optionsDialog_->middleClickAction-> itemData(optionsDialog_->middleClickAction->currentIndex()).toInt(); formatDate_ = optionsDialog_->formatDate_->itemData( optionsDialog_->formatDate_->currentIndex()).toString(); feedsModel_->formatDate_ = formatDate_; formatTime_ = optionsDialog_->formatTime_->itemData( optionsDialog_->formatTime_->currentIndex()).toString(); feedsModel_->formatTime_ = formatTime_; alternatingRowColorsNews_ = optionsDialog_->alternatingRowColorsNews_->isChecked(); changeBehaviorActionNUN_ = optionsDialog_->changeBehaviorActionNUN_->isChecked(); simplifiedDateTime_ = optionsDialog_->simplifiedDateTime_->isChecked(); notDeleteStarred_ = optionsDialog_->notDeleteStarred_->isChecked(); notDeleteLabeled_ = optionsDialog_->notDeleteLabeled_->isChecked(); markIdenticalNewsRead_ = optionsDialog_->markIdenticalNewsRead_->isChecked(); mainNewsFilter_ = optionsDialog_->mainNewsFilter_->itemData( optionsDialog_->mainNewsFilter_->currentIndex()).toString(); styleSheetNews = optionsDialog_->styleSheetNewsEdit_->text(); if (styleSheetNews.isEmpty()) styleSheetNews = mainApp->styleSheetNewsDefaultFile(); settings.setValue("Settings/styleSheetNews", styleSheetNews); cleanupOnShutdown_ = optionsDialog_->cleanupOnShutdownBox_->isChecked(); dayCleanUpOn_ = optionsDialog_->dayCleanUpOn_->isChecked(); maxDayCleanUp_ = optionsDialog_->maxDayCleanUp_->value(); newsCleanUpOn_ = optionsDialog_->newsCleanUpOn_->isChecked(); maxNewsCleanUp_ = optionsDialog_->maxNewsCleanUp_->value(); readCleanUp_ = optionsDialog_->readCleanUp_->isChecked(); neverUnreadCleanUp_ = optionsDialog_->neverUnreadCleanUp_->isChecked(); neverStarCleanUp_ = optionsDialog_->neverStarCleanUp_->isChecked(); neverLabelCleanUp_ = optionsDialog_->neverLabelCleanUp_->isChecked(); cleanUpDeleted_ = optionsDialog_->cleanUpDeleted_->isChecked(); optimizeDB_ = optionsDialog_->optimizeDB_->isChecked(); soundNewNews_ = optionsDialog_->soundNotifyBox_->isChecked(); soundNotifyPath_ = optionsDialog_->editSoundNotifer_->text(); showNotifyOn_ = optionsDialog_->showNotifyOn_->isChecked(); screenNotify_ = optionsDialog_->screenNotify_->currentIndex()-1; positionNotify_ = optionsDialog_->positionNotify_->currentIndex(); transparencyNotify_ = optionsDialog_->transparencyNotify_->value(); countShowNewsNotify_ = optionsDialog_->countShowNewsNotify_->value(); widthTitleNewsNotify_ = optionsDialog_->widthTitleNewsNotify_->value(); timeShowNewsNotify_ = optionsDialog_->timeShowNewsNotify_->value(); fullscreenModeNotify_ = optionsDialog_->fullscreenModeNotify_->isChecked(); showNotifyInactiveApp_ = optionsDialog_->showNotifyInactiveApp_->isChecked(); onlySelectedFeeds_ = optionsDialog_->onlySelectedFeeds_->isChecked(); showTitlesFeedsNotify_ = optionsDialog_->showTitlesFeedsNotify_->isChecked(); showIconFeedNotify_ = optionsDialog_->showIconFeedNotify_->isChecked(); showButtonMarkAllNotify_ = optionsDialog_->showButtonMarkAllNotify_->isChecked(); showButtonMarkReadNotify_ = optionsDialog_->showButtonMarkReadNotify_->isChecked(); showButtonExBrowserNotify_ = optionsDialog_->showButtonExBrowserNotify_->isChecked(); showButtonDeleteNotify_ = optionsDialog_->showButtonDeleteNotify_->isChecked(); mainApp->setLanguage(optionsDialog_->language()); mainApp->setTranslateApplication(); QFont font = feedsView_->font(); font.setFamily( optionsDialog_->fontsTree_->topLevelItem(0)->text(2).section(", ", 0, 0)); font.setPointSize( optionsDialog_->fontsTree_->topLevelItem(0)->text(2).section(", ", 1).toInt()); feedsView_->setFont(font); feedsModel_->font_ = font; newsListFontFamily_ = optionsDialog_->fontsTree_->topLevelItem(1)->text(2).section(", ", 0, 0); newsListFontSize_ = optionsDialog_->fontsTree_->topLevelItem(1)->text(2).section(", ", 1).toInt(); newsTitleFontFamily_ = optionsDialog_->fontsTree_->topLevelItem(2)->text(2).section(", ", 0, 0); newsTitleFontSize_ = optionsDialog_->fontsTree_->topLevelItem(2)->text(2).section(", ", 1).toInt(); newsTextFontFamily_ = optionsDialog_->fontsTree_->topLevelItem(3)->text(2).section(", ", 0, 0); newsTextFontSize_ = optionsDialog_->fontsTree_->topLevelItem(3)->text(2).section(", ", 1).toInt(); notificationFontFamily_ = optionsDialog_->fontsTree_->topLevelItem(4)->text(2).section(", ", 0, 0); notificationFontSize_ = optionsDialog_->fontsTree_->topLevelItem(4)->text(2).section(", ", 1).toInt(); browserStandardFont = optionsDialog_->browserStandardFont_->currentFont().family(); browserFixedFont = optionsDialog_->browserFixedFont_->currentFont().family(); browserSerifFont = optionsDialog_->browserSerifFont_->currentFont().family(); browserSansSerifFont = optionsDialog_->browserSansSerifFont_->currentFont().family(); browserCursiveFont = optionsDialog_->browserCursiveFont_->currentFont().family(); browserFantasyFont = optionsDialog_->browserFantasyFont_->currentFont().family(); browserDefaultFontSize = optionsDialog_->browserDefaultFontSize_->value(); browserFixedFontSize = optionsDialog_->browserFixedFontSize_->value(); browserMinFontSize = optionsDialog_->browserMinFontSize_->value(); browserMinLogFontSize = optionsDialog_->browserMinLogFontSize_->value(); QWebSettings::globalSettings()->setFontFamily( QWebSettings::StandardFont, browserStandardFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::FixedFont, browserFixedFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::SerifFont, browserSerifFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::SansSerifFont, browserSansSerifFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::CursiveFont, browserCursiveFont); QWebSettings::globalSettings()->setFontFamily( QWebSettings::FantasyFont, browserFantasyFont); QWebSettings::globalSettings()->setFontSize( QWebSettings::DefaultFontSize, browserDefaultFontSize); QWebSettings::globalSettings()->setFontSize( QWebSettings::DefaultFixedFontSize, browserFixedFontSize); QWebSettings::globalSettings()->setFontSize( QWebSettings::MinimumFontSize, browserMinFontSize); QWebSettings::globalSettings()->setFontSize( QWebSettings::MinimumLogicalFontSize, browserMinLogFontSize); settings.beginGroup("Settings"); settings.setValue("browserStandardFont", browserStandardFont); settings.setValue("browserFixedFont", browserFixedFont); settings.setValue("browserSerifFont", browserSerifFont); settings.setValue("browserSansSerifFont", browserSansSerifFont); settings.setValue("browserCursiveFont", browserCursiveFont); settings.setValue("browserFantasyFont", browserFantasyFont); settings.setValue("browserDefaultFontSize", browserDefaultFontSize); settings.setValue("browserFixedFontSize", browserFixedFontSize); settings.setValue("browserMinFontSize", browserMinFontSize); settings.setValue("browserMinLogFontSize", browserMinLogFontSize); settings.endGroup(); feedsModel_->textColor_ = optionsDialog_->colorsTree_->topLevelItem(0)->text(1); feedsModel_->backgroundColor_ = optionsDialog_->colorsTree_->topLevelItem(1)->text(1); feedsView_->setStyleSheet(QString("#feedsView_ {background: %1;}").arg(feedsModel_->backgroundColor_)); newsListTextColor_ = optionsDialog_->colorsTree_->topLevelItem(2)->text(1); newsListBackgroundColor_ = optionsDialog_->colorsTree_->topLevelItem(3)->text(1); focusedNewsTextColor_ = optionsDialog_->colorsTree_->topLevelItem(4)->text(1); focusedNewsBGColor_ = optionsDialog_->colorsTree_->topLevelItem(5)->text(1); linkColor_ = optionsDialog_->colorsTree_->topLevelItem(6)->text(1); titleColor_ = optionsDialog_->colorsTree_->topLevelItem(7)->text(1); dateColor_ = optionsDialog_->colorsTree_->topLevelItem(8)->text(1); authorColor_ = optionsDialog_->colorsTree_->topLevelItem(9)->text(1); newsTextColor_ = optionsDialog_->colorsTree_->topLevelItem(10)->text(1); newsTitleBackgroundColor_ = optionsDialog_->colorsTree_->topLevelItem(11)->text(1); newsBackgroundColor_ = optionsDialog_->colorsTree_->topLevelItem(12)->text(1); feedsModel_->feedWithNewNewsColor_ = optionsDialog_->colorsTree_->topLevelItem(13)->text(1); feedsModel_->countNewsUnreadColor_ = optionsDialog_->colorsTree_->topLevelItem(14)->text(1); newNewsTextColor_ = optionsDialog_->colorsTree_->topLevelItem(15)->text(1); unreadNewsTextColor_ = optionsDialog_->colorsTree_->topLevelItem(16)->text(1); feedsModel_->focusedFeedTextColor_ = optionsDialog_->colorsTree_->topLevelItem(17)->text(1); feedsModel_->focusedFeedBGColor_ = optionsDialog_->colorsTree_->topLevelItem(18)->text(1); feedsModel_->feedDisabledUpdateColor_ = optionsDialog_->colorsTree_->topLevelItem(19)->text(1); alternatingRowColors_ = optionsDialog_->colorsTree_->topLevelItem(20)->text(1); notifierTextColor_ = optionsDialog_->colorsTree_->topLevelItem(21)->text(1); notifierBackgroundColor_ = optionsDialog_->colorsTree_->topLevelItem(22)->text(1); delete optionsDialog_; optionsDialog_ = NULL; settings.beginGroup("Settings"); settings.setValue("autoUpdatefeedsStartUp", updateFeedsStartUp); settings.endGroup(); saveSettings(); saveActionShortcuts(); mainApp->reloadUserStyleBrowser(); if (currentNewsTab != NULL) { if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) currentNewsTab->newsHeader_->saveStateColumns(currentNewsTab); currentNewsTab->setSettings(false); } } void MainWindow::showSettingPageLabels() { showOptionDlg(5); } // ---------------------------------------------------------------------------- void MainWindow::createTrayMenu() { trayMenu_ = new QMenu(this); showWindowAct_ = new QAction(this); connect(showWindowAct_, SIGNAL(triggered()), this, SLOT(showWindows())); QFont font_ = showWindowAct_->font(); font_.setBold(true); showWindowAct_->setFont(font_); trayMenu_->addAction(showWindowAct_); trayMenu_->addAction(addFeedTrayAct_); trayMenu_->addAction(updateAllFeedsAct_); trayMenu_->addAction(markAllFeedsRead_); trayMenu_->addSeparator(); trayMenu_->addAction(optionsAct_); trayMenu_->addSeparator(); trayMenu_->addAction(exitAct_); traySystem->setContextMenu(trayMenu_); } /** @brief Free memory working set in Windows *---------------------------------------------------------------------------*/ void MainWindow::myEmptyWorkingSet() { #if defined(Q_OS_WIN) if (isHidden()) EmptyWorkingSet(GetCurrentProcess()); #endif } // ---------------------------------------------------------------------------- void MainWindow::initUpdateFeeds() { QSqlQuery q; if (onlySelectedFeeds_) { q.exec("SELECT feedId FROM feeds_ex WHERE value=1 AND name='showNotification'"); while (q.next()) { idFeedsNotifyList_.append(q.value(0).toInt()); } } q.exec("SELECT id, updateInterval, updateIntervalType FROM feeds WHERE xmlUrl != '' AND updateIntervalEnable == 1"); while (q.next()) { int updateInterval = q.value(1).toInt(); int updateIntervalType = q.value(2).toInt(); if (updateIntervalType == 0) updateInterval = updateInterval*60; else if (updateIntervalType == 1) updateInterval = updateInterval*60*60; updateFeedsIntervalSec_.insert(q.value(0).toInt(), updateInterval); updateFeedsTimeCount_.insert(q.value(0).toInt(), 0); } int updateInterval = updateFeedsInterval_; if (updateFeedsIntervalType_ == 0) updateInterval = updateInterval*60; else if (updateFeedsIntervalType_ == 1) updateInterval = updateInterval*60*60; updateIntervalSec_ = updateInterval; updateFeedsTimer_ = new QTimer(this); connect(updateFeedsTimer_, SIGNAL(timeout()), this, SLOT(slotGetFeedsTimer())); updateFeedsTimer_->start(1000); } // ---------------------------------------------------------------------------- void MainWindow::slotGetFeedsTimer() { if (updateFeedsEnable_) { updateTimeCount_++; if (updateTimeCount_ >= updateIntervalSec_) { updateTimeCount_ = 0; emit signalGetAllFeedsTimer(); } } else { updateTimeCount_ = 0; } QMapIterator iterator(updateFeedsTimeCount_); while (iterator.hasNext()) { iterator.next(); int feedId = iterator.key(); updateFeedsTimeCount_[feedId]++; if (updateFeedsTimeCount_[feedId] >= updateFeedsIntervalSec_[feedId]) { updateFeedsTimeCount_[feedId] = 0; emit signalGetFeedTimer(feedId); } } } /** @brief Process update feed action *---------------------------------------------------------------------------*/ void MainWindow::slotGetFeed() { QModelIndexList indexList = feedsView_->selectionModel()->selectedRows(0); if (indexList.count() <= 1) { indexList.clear(); indexList.append(feedsProxyModel_->mapFromSource(feedsView_->selectIndex())); } QList idList; foreach (QModelIndex indexProxy, indexList) { QModelIndex index = feedsProxyModel_->mapToSource(indexProxy); if (feedsModel_->isFolder(index)) { QList list = UpdateObject::getIdFeedsInList(feedsModel_->dataField(index, "id").toInt()); foreach (int idFeed, list) { if (!idList.contains(idFeed)) { idList.append(idFeed); index = feedsModel_->indexById(idFeed); if (!feedsModel_->dataField(index, "disableUpdate").toBool()) { emit signalGetFeed(feedsModel_->dataField(index, "id").toInt(), feedsModel_->dataField(index, "xmlUrl").toString(), feedsModel_->dataField(index, "lastBuildDate").toDateTime(), feedsModel_->dataField(index, "authentication").toInt()); } } } } else { int idFeed = feedsModel_->dataField(index, "id").toInt(); if (!idList.contains(idFeed)) { idList.append(idFeed); emit signalGetFeed(feedsModel_->dataField(index, "id").toInt(), feedsModel_->dataField(index, "xmlUrl").toString(), feedsModel_->dataField(index, "lastBuildDate").toDateTime(), feedsModel_->dataField(index, "authentication").toInt()); } } } } /** @brief Process update all feeds action *---------------------------------------------------------------------------*/ void MainWindow::slotGetAllFeeds() { emit signalGetAllFeeds(); } void MainWindow::slotStopUpdate() { progressBar_->hide(); emit signalStopUpdate(); } /** @brief Show update progress bar after feed update has started *---------------------------------------------------------------------------*/ void MainWindow::showProgressBar(int maximum) { if (maximum == 0) { isStartImportFeed_ = false; return; } Settings settings; settings.setValue("Flags/updatingFeeds", true); playSoundNewNews_ = false; progressBar_->setMaximum(maximum); progressBar_->show(); } void MainWindow::slotSetValue(int value) { if (progressBar_->isVisible()) progressBar_->setValue(progressBar_->maximum() - value); } void MainWindow::showMessageStatusBar(QString message, int timeout) { statusBar()->showMessage(message, timeout); } void MainWindow::slotCountsStatusBar(int unreadCount, int allCount) { statusUnread_->setText(QString(" " + tr("Unread: %1") + " ").arg(unreadCount)); statusAll_->setText(QString(" " + tr("All: %1") + " ").arg(allCount)); } // ---------------------------------------------------------------------------- void MainWindow::slotVisibledFeedsWidget() { if (tabBar_->currentIndex() == TAB_WIDGET_PERMANENT) { showFeedsTabPermanent_ = feedsWidgetVisibleAct_->isChecked(); } feedsWidget_->setVisible(feedsWidgetVisibleAct_->isChecked()); updateIconToolBarNull(feedsWidgetVisibleAct_->isChecked()); } // ---------------------------------------------------------------------------- void MainWindow::updateIconToolBarNull(bool feedsWidgetVisible) { if (feedsWidgetVisible) pushButtonNull_->setIcon(QIcon(":/images/images/triangleR.png")); else pushButtonNull_->setIcon(QIcon(":/images/images/triangleL.png")); } /** @brief Update status of current feed or feed of current tab *---------------------------------------------------------------------------*/ void MainWindow::slotUpdateStatus(int feedId, bool changed) { emit signalUpdateStatus(feedId, changed); } /** @brief Set filter for viewing feeds and categories * @param pAct Filter mode * @param clicked Flag to call function after user click or from programm code * true - user click * false - programm call *----------------------------------------------------------------------------*/ void MainWindow::setFeedsFilter(bool clicked) { QList idList; static bool setFilter = false; if (setFilter) return; setFilter = true; QAction* filterAct = feedsFilterGroup_->checkedAction(); if (filterAct->objectName() == "filterFeedsNew_") { QModelIndex index = feedsProxyModel_->mapToSource(feedsView_->currentIndex()); int newCount = feedsModel_->dataField(index, "newCount").toInt(); if (!(clicked && !newCount)) { while (index.isValid()) { idList << feedsModel_->idByIndex(index); index = index.parent(); } } } else if (filterAct->objectName() == "filterFeedsUnread_") { QModelIndex index = feedsProxyModel_->mapToSource(feedsView_->currentIndex()); int unRead = feedsModel_->dataField(index, "unread").toInt(); if (!(clicked && !unRead)) { while (index.isValid()) { idList << feedsModel_->idByIndex(index); index = index.parent(); } } } else if (filterAct->objectName() == "filterFeedsStarred_") { QSqlQuery q; q.exec(QString("SELECT id, parentId FROM feeds WHERE label LIKE '%starred%'")); while (q.next()) { idList.append(q.value(0).toInt()); int parentId = q.value(1).toInt(); if (!idList.contains(parentId)) { while (parentId) { if (!idList.contains(parentId)) idList.append(parentId); else break; QSqlQuery q1; q1.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(parentId)); if (q1.next()) parentId = q1.value(0).toInt(); } } } } else if (filterAct->objectName() == "filterFeedsError_") { QSqlQuery q; q.exec(QString("SELECT id, parentId FROM feeds WHERE status!=0 AND status!=''")); while (q.next()) { idList.append(q.value(0).toInt()); int parentId = q.value(1).toInt(); if (!idList.contains(parentId)) { while (parentId) { if (!idList.contains(parentId)) idList.append(parentId); else break; QSqlQuery q1; q1.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(parentId)); if (q1.next()) parentId = q1.value(0).toInt(); } } } } if ((filterAct->objectName() == "filterFeedsNew_") || (filterAct->objectName() == "filterFeedsUnread_")) { for (int i = 0; i < stackedWidget_->count(); i++) { if ((i == 0) && clicked && (stackedWidget_->currentIndex() == 0)) continue; NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (!idList.contains(widget->feedId_)) { idList.append(widget->feedId_); QModelIndex index = feedsModel_->indexById(widget->feedId_).parent(); while (index.isValid()) { int id = feedsModel_->idByIndex(index); if (!idList.contains(id)) idList.append(id); index = index.parent(); } } } } // Set filter feedsProxyModel_->setFilter(filterAct->objectName(), idList, findFeeds_->findGroup_->checkedAction()->objectName(), findFeeds_->text()); feedsView_->restoreExpanded(); feedsView_->clearSelection(); feedsView_->setCurrentIndex(feedsView_->currentIndex()); if (clicked && (tabBar_->currentIndex() == TAB_WIDGET_PERMANENT)) { slotFeedClicked(feedsView_->currentIndex()); } if (filterAct->objectName() == "filterFeedsAll_") feedsFilter_->setIcon(QIcon(":/images/filterOff")); else feedsFilter_->setIcon(QIcon(":/images/filterOn")); // Store filter to enable it as "last used filter" if (filterAct->objectName() != "filterFeedsAll_") feedsFilterAction_ = filterAct; setFilter = false; } /** @brief Set filter for news list *---------------------------------------------------------------------------*/ void MainWindow::setNewsFilter(QAction* pAct, bool clicked) { if (currentNewsTab == NULL) return; if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) { filterNewsAll_->setChecked(true); return; } QElapsedTimer timer; timer.start(); qDebug() << __FUNCTION__ << __LINE__ << timer.elapsed(); QModelIndex index = newsView_->currentIndex(); int feedId = currentNewsTab->feedId_; int newsId = newsModel_->index( index.row(), newsModel_->fieldIndex("id")).data(Qt::EditRole).toInt(); // Hide news has marrked "Read" // read=1 - show regardless of filter // read=2 - don't display at all if (clicked) { QString qStr = QString("UPDATE news SET read=2 WHERE feedId='%1' AND read=1"). arg(feedId); mainApp->sqlQueryExec(qStr); } // Create filter for category or for feed if (feedsModel_->isFolder(feedsModel_->indexById(feedId))) { newsFilterStr = QString("(%1) AND ").arg(getIdFeedsString(feedId)); } else { newsFilterStr = QString("feedId=%1 AND ").arg(feedId); } // ... add filter from "filter" if (pAct->objectName() == "filterNewsAll_") { newsFilterStr.append("deleted = 0"); } else if (pAct->objectName() == "filterNewsNew_") { newsFilterStr.append(QString("new = 1 AND deleted = 0")); } else if (pAct->objectName() == "filterNewsUnread_") { newsFilterStr.append(QString("read < 2 AND deleted = 0")); } else if (pAct->objectName() == "filterNewsStar_") { newsFilterStr.append(QString("starred = 1 AND deleted = 0")); } else if (pAct->objectName() == "filterNewsNotStarred_") { newsFilterStr.append(QString("starred = 0 AND deleted = 0")); } else if (pAct->objectName() == "filterNewsUnreadStar_") { newsFilterStr.append(QString("(read < 2 OR starred = 1) AND deleted = 0")); } else if (pAct->objectName() == "filterNewsLastDay_") { newsFilterStr.append(QString("(published >= datetime('now', '-1 day')) AND deleted = 0")); } else if (pAct->objectName() == "filterNewsLastWeek_") { newsFilterStr.append(QString("(published >= datetime('now', '-7 day')) AND deleted = 0")); } // ... add filter from "search" QString filterStr = newsFilterStr; QString objectName = currentNewsTab->findText_->findGroup_->checkedAction()->objectName(); if (objectName != "findInBrowserAct") { QString findText = currentNewsTab->findText_->text(); if (!findText.isEmpty()) { findText = findText.replace("'", "''").toUpper(); if (objectName == "findTitleAct") { filterStr.append( QString(" AND UPPER(title) LIKE '%%1%'").arg(findText)); } else if (objectName == "findAuthorAct") { filterStr.append( QString(" AND UPPER(author_name) LIKE '%%1%'").arg(findText)); } else if (objectName == "findCategoryAct") { filterStr.append( QString(" AND UPPER(category) LIKE '%%1%'").arg(findText)); } else if (objectName == "findContentAct") { filterStr.append( QString(" AND (UPPER(content) LIKE '%%1%' OR UPPER(description) LIKE '%%1%')"). arg(findText)); } else if (objectName == "findLinkAct") { filterStr.append( QString(" AND link_href LIKE '%%1%'"). arg(findText)); } else { filterStr.append( QString(" AND (UPPER(title) LIKE '%%1%' OR UPPER(author_name) LIKE '%%1%' " "OR UPPER(category) LIKE '%%1%' OR UPPER(content) LIKE '%%1%' " "OR UPPER(description) LIKE '%%1%')"). arg(findText)); } } } qDebug() << __FUNCTION__ << __LINE__ << timer.elapsed(); newsModel_->setFilter(filterStr); while (newsModel_->canFetchMore()) newsModel_->fetchMore(); qDebug() << __FUNCTION__ << __LINE__ << timer.elapsed(); if ((currentNewsTab->newsHeader_->sortIndicatorSection() == newsModel_->fieldIndex("read")) || currentNewsTab->newsHeader_->sortIndicatorSection() == newsModel_->fieldIndex("starred")) { currentNewsTab->slotSort(currentNewsTab->newsHeader_->sortIndicatorSection(), currentNewsTab->newsHeader_->sortIndicatorOrder()); } currentNewsTab->loadNewspaper(); // Set icon right before user click if (pAct->objectName() == "filterNewsAll_") newsFilter_->setIcon(QIcon(":/images/filterOff")); else newsFilter_->setIcon(QIcon(":/images/filterOn")); // Set focus on previous displayed feed, if user click has been if (clicked) { QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(index, Qt::EditRole, newsId); if (indexList.count()) { int newsRow = indexList.first().row(); newsView_->setCurrentIndex(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); } else { currentNewsTab->currentNewsIdOld = newsId; currentNewsTab->hideWebContent(); } } qDebug() << __FUNCTION__ << __LINE__ << timer.elapsed(); // Store filter to enable it as "last used filter" if (pAct->objectName() != mainNewsFilter_) newsFilterAction_ = pAct; } /** @brief Mark feed Read while clicking on unfocused one *---------------------------------------------------------------------------*/ void MainWindow::setFeedRead(int type, int feedId, FeedReedType feedReadType, NewsTabWidget *widgetTab, int idException) { if ((type >= NewsTabWidget::TabTypeWeb) || (type == NewsTabWidget::TabTypeDel)) return; if ((type == NewsTabWidget::TabTypeFeed) && (feedReadType != FeedReadSwitchingTab)) { if (feedId <= -1) return; QList idNewsList; if (((feedReadType == FeedReadSwitchingFeed) && markReadSwitchingFeed_) || ((feedReadType == FeedReadClosingTab) && markReadClosingTab_) || ((feedReadType == FeedReadPlaceToTray) && markReadMinimize_)) { emit setFeedRead(feedReadType, feedId, idException, idNewsList); } else { emit setFeedRead(feedReadType, feedId, idException, idNewsList); } } else { int cnt = widgetTab->newsModel_->rowCount(); if (cnt == 0) return; QList idNewsList; for (int i = cnt-1; i >= 0; --i) { int newsId = widgetTab->newsModel_->index(i, widgetTab->newsModel_->fieldIndex("id")).data().toInt(); idNewsList.append(newsId); } for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if ((widget->type_ < NewsTabWidget::TabTypeWeb) && !((feedReadType == FeedReadSwitchingFeed) && (i == TAB_WIDGET_PERMANENT))) { int row = widget->newsView_->currentIndex().row(); int newsId = widget->newsModel_->index(row, widget->newsModel_->fieldIndex("id")).data().toInt(); idNewsList.removeOne(newsId); } } emit setFeedRead(FeedReadSwitchingTab, feedId, idException, idNewsList); } } /** @brief Mark feed read *---------------------------------------------------------------------------*/ void MainWindow::markFeedRead() { bool openFeed = false; bool isFolder = false; QModelIndexList indexList = feedsView_->selectionModel()->selectedRows(0); if (indexList.count() <= 1) { indexList.clear(); indexList.append(feedsProxyModel_->mapFromSource(feedsView_->selectIndex())); } QList idList; for (int i = indexList.count()-1; i >= 0; --i) { QModelIndex index = feedsProxyModel_->mapToSource(indexList[i]); if (feedsModel_->isFolder(index)) { idList.append(feedsModel_->dataField(index, "id").toInt()); indexList.removeAt(i); } } for (int i = indexList.count()-1; i >= 0; --i) { QModelIndex index = feedsProxyModel_->mapToSource(indexList[i]); int parentId = feedsModel_->dataField(index, "parentId").toInt(); if (!idList.contains(parentId)) { idList.append(feedsModel_->dataField(index, "id").toInt()); } indexList.removeAt(i); } foreach (int id, idList) { bool openFeedT = false; QModelIndex index = feedsModel_->indexById(id); int parentId = feedsModel_->dataField(index, "parentId").toInt(); if ((currentNewsTab->feedId_ == id)) { openFeedT = true; openFeed = true; } if ((currentNewsTab->feedParId_ == id)) { openFeed = true; } if (currentNewsTab->feedId_ == parentId) { openFeed = true; isFolder = true; } if (feedsModel_->isFolder(index)) { if (currentNewsTab->feedId_ == id) { isFolder = true; } QList list = UpdateObject::getIdFeedsInList(id); foreach (int id1, list) { QModelIndex index1 = feedsModel_->indexById(id1); QModelIndex indexUnread = feedsModel_->indexSibling(index1, "unread"); QModelIndex indexNew = feedsModel_->indexSibling(index1, "newCount"); feedsModel_->setData(indexUnread, 0); feedsModel_->setData(indexNew, 0); if (!openFeed) { int parentId1 = feedsModel_->dataField(index1, "parentId").toInt(); if ((currentNewsTab->feedId_ == id1) || (currentNewsTab->feedId_ == parentId1)) { openFeed = true; } } } } QModelIndex indexUnread = feedsModel_->indexSibling(index, "unread"); QModelIndex indexNew = feedsModel_->indexSibling(index, "newCount"); feedsModel_->setData(indexUnread, 0); feedsModel_->setData(indexNew, 0); emit signalMarkFeedRead(id, feedsModel_->isFolder(index), openFeedT); } // Update feed view with focus if (openFeed) { if ((tabBar_->currentIndex() == TAB_WIDGET_PERMANENT) && !isFolder) { signalRefreshNewsView(1); } else { signalRefreshNewsView(0); recountCategoryCounts(); emit signalSetFeedsFilter(true); } } // Update feeds view without focus else { recountCategoryCounts(); emit signalSetFeedsFilter(); } } /** @brief Refresh news view (After mark all feeds or one feed read) *---------------------------------------------------------------------------*/ void MainWindow::slotRefreshNewsView(int nextUnread) { if (nextUnread == 1) { feedsView_->clearSelection(); QModelIndex indexNextUnread = feedsView_->indexNextUnread(feedsView_->currentIndex()); feedsView_->setCurrentIndex(indexNextUnread); slotFeedClicked(indexNextUnread); } else if ((tabBar_->currentIndex() == TAB_WIDGET_PERMANENT) && (nextUnread == -1)) { QModelIndex index = feedsProxyModel_->index(-1, "text"); feedsView_->setCurrentIndex(index); slotFeedClicked(index); } else { int currentRow = newsView_->currentIndex().row(); newsModel_->select(); while (newsModel_->canFetchMore()) newsModel_->fetchMore(); currentNewsTab->loadNewspaper(NewsTabWidget::RefreshWithPos); newsView_->setCurrentIndex(newsModel_->index(currentRow, newsModel_->fieldIndex("title"))); } } // ---------------------------------------------------------------------------- void MainWindow::slotShowAboutDlg() { AboutDialog *aboutDialog = new AboutDialog(mainApp->language(), this); aboutDialog->exec(); delete aboutDialog; } /** @brief Call context menu of the feeds tree *----------------------------------------------------------------------------*/ void MainWindow::showContextMenuFeed(const QPoint &pos) { slotFeedMenuShow(); QModelIndex index = feedsView_->indexAt(pos); if (index.isValid()) { QRect rectText = feedsView_->visualRect(index); if (pos.x() >= rectText.x()) { QMenu menu; menu.addAction(addAct_); menu.addSeparator(); menu.addAction(openFeedNewTabAct_); menu.addSeparator(); menu.addAction(updateFeedAct_); menu.addSeparator(); menu.addAction(markFeedRead_); menu.addSeparator(); menu.addAction(deleteFeedAct_); menu.addSeparator(); menu.addAction(setFilterNewsAct_); menu.addAction(feedProperties_); menu.exec(feedsView_->viewport()->mapToGlobal(pos)); } } else { QMenu menu; menu.addAction(addAct_); menu.exec(feedsView_->viewport()->mapToGlobal(pos)); } index = feedsProxyModel_->mapToSource(feedsView_->currentIndex()); feedsView_->selectId_ = feedsModel_->idByIndex(index); feedProperties_->setEnabled(feedsView_->selectIndex().isValid()); } // ---------------------------------------------------------------------------- void MainWindow::slotFeedMenuShow() { feedProperties_->setEnabled(feedsView_->selectIndex().isValid()); } // ---------------------------------------------------------------------------- void MainWindow::loadSettingsFeeds() { markCurNewsRead_ = false; Settings settings; behaviorIconTray_ = settings.value("Settings/behaviorIconTray", NEW_COUNT_ICON_TRAY).toInt(); QString filterName = settings.value("feedSettings/filterName", "filterFeedsAll_").toString(); QList listActions = feedsFilterGroup_->actions(); foreach(QAction *action, listActions) { if (action->objectName() == filterName) { action->setChecked(true); break; } } filterName = settings.value("newsSettings/filterName", "filterNewsAll_").toString(); listActions = newsFilterGroup_->actions(); foreach(QAction *action, listActions) { if (action->objectName() == filterName) { action->setChecked(true); break; } } setFeedsFilter(false); } /** @brief Restore feeds state on application startup *---------------------------------------------------------------------------*/ void MainWindow::restoreFeedsOnStartUp() { qApp->processEvents(); //* Restore current feed QModelIndex feedIndex = QModelIndex(); if (reopenFeedStartup_) { Settings settings; int feedId = settings.value("feedSettings/currentId", 0).toInt(); feedIndex = feedsProxyModel_->mapFromSource(feedId); } feedsView_->setCurrentIndex(feedIndex); updateCurrentTab_ = false; slotFeedClicked(feedIndex); currentNewsTab->webView_->setFocus(); updateCurrentTab_ = true; slotUpdateStatus(-1, false); recountCategoryCounts(); // Open feeds in tabs QSqlQuery q; q.exec(QString("SELECT id, parentId FROM feeds WHERE displayOnStartup=1")); while(q.next()) { creatFeedTab(q.value(0).toInt(), q.value(1).toInt()); } } // ---------------------------------------------------------------------------- void MainWindow::slotFeedsFilter() { if (feedsFilterGroup_->checkedAction()->objectName() == "filterFeedsAll_") { if (feedsFilterAction_ != NULL) { feedsFilterAction_->setChecked(true); setFeedsFilter(); } else { if (mainToolbar_->widgetForAction(feedsFilter_)) { QWidget *widget = mainToolbar_->widgetForAction(feedsFilter_); if (widget->underMouse()) { feedsFilterMenu_->popup(widget->mapToGlobal(QPoint(0, mainToolbar_->height()-1))); } } if (feedsToolBar_->widgetForAction(feedsFilter_)) { QWidget *widget = feedsToolBar_->widgetForAction(feedsFilter_); if (widget->underMouse()) { feedsFilterMenu_->popup(widget->mapToGlobal(QPoint(0, feedsToolBar_->height()-1))); } } if (currentNewsTab->newsToolBar_->widgetForAction(feedsFilter_)) { QWidget *widget = currentNewsTab->newsToolBar_->widgetForAction(feedsFilter_); if (widget->underMouse()) { feedsFilterMenu_->popup(widget->mapToGlobal(QPoint(0, currentNewsTab->newsToolBar_->height()-1))); } } } } else { filterFeedsAll_->setChecked(true); setFeedsFilter(); } } // ---------------------------------------------------------------------------- void MainWindow::slotNewsFilter() { if (newsFilterGroup_->checkedAction()->objectName() == mainNewsFilter_) { if (newsFilterAction_ != NULL) { newsFilterAction_->setChecked(true); setNewsFilter(newsFilterAction_); } else { if (mainToolbar_->widgetForAction(newsFilter_)) { QWidget *widget = mainToolbar_->widgetForAction(newsFilter_); if (widget->underMouse()) { newsFilterMenu_->popup(widget->mapToGlobal(QPoint(0, mainToolbar_->height()-1))); } } if (feedsToolBar_->widgetForAction(newsFilter_)) { QWidget *widget = feedsToolBar_->widgetForAction(newsFilter_); if (widget->underMouse()) { newsFilterMenu_->popup(widget->mapToGlobal(QPoint(0, feedsToolBar_->height()-1))); } } if (currentNewsTab->newsToolBar_->widgetForAction(newsFilter_)) { QWidget *widget = currentNewsTab->newsToolBar_->widgetForAction(newsFilter_); if (widget->underMouse()) { newsFilterMenu_->popup(widget->mapToGlobal(QPoint(0, currentNewsTab->newsToolBar_->height()-1))); } } } } else { foreach(QAction *action, newsFilterGroup_->actions()) { if (action->objectName() == mainNewsFilter_) { action->setChecked(true); setNewsFilter(action); break; } } } } // ---------------------------------------------------------------------------- void MainWindow::slotShowUpdateAppDlg() { UpdateAppDialog *updateAppDialog = new UpdateAppDialog(mainApp->language(), this); updateAppDialog->activateWindow(); updateAppDialog->exec(); delete updateAppDialog; } // ---------------------------------------------------------------------------- void MainWindow::retranslateStrings() { QString str = statusUnread_->text(); str = str.right(str.length() - str.indexOf(':') - 1).replace(" ", ""); statusUnread_->setText(QString(" " + tr("Unread: %1") + " ").arg(str)); str = statusAll_->text(); str = str.right(str.length() - str.indexOf(':') - 1).replace(" ", ""); statusAll_->setText(QString(" " + tr("All: %1") + " ").arg(str)); str = traySystem->toolTip(); QString info = "QuiteRSS\n" + QString(tr("New News: %1")).arg(str.section(": ", 1).section("\n", 0, 0)) + QString("\n") + QString(tr("Unread News: %1")).arg(str.section(": ", 2)); traySystem->setToolTip(info); mainMenuButton_->setToolTip(tr("Menu")); addAct_->setText(tr("&Add")); addAct_->setToolTip(tr("Add New Feed")); addFeedAct_->setText(tr("&Feed...")); addFeedAct_->setToolTip(tr("Add New Feed")); addFeedTrayAct_->setText(tr("Add Feed...")); addFolderAct_->setText(tr("F&older...")); addFolderAct_->setToolTip(tr("Add New Folder")); openFeedNewTabAct_->setText(tr("Open in New Tab")); deleteFeedAct_->setText(tr("&Delete...")); deleteFeedAct_->setToolTip(tr("Delete Selected Feed")); importFeedsAct_->setText(tr("&Import Feeds...")); importFeedsAct_->setToolTip(tr("Import Feeds from OPML File")); exportFeedsAct_->setText(tr("&Export Feeds...")); exportFeedsAct_->setToolTip(tr("Export Feeds to OPML File")); createBackupAct_->setText(tr("&Create Backup...")); showMenuBarAct_->setText(tr("S&how Menu Bar")); exitAct_->setText(tr("E&xit")); updateFeedAct_->setText(tr("Update Feed")); updateFeedAct_->setToolTip(tr("Update Current Feed")); updateAllFeedsAct_->setText(tr("Update All")); updateAllFeedsAct_->setToolTip(tr("Update All Feeds")); stopUpdateAct_->setText(tr("Stop Update Feeds")); stopUpdateAct_->setToolTip(tr("Stop Update Feeds")); markAllFeedsRead_->setText(tr("Mark All Feeds Read")); markNewsRead_->setText(tr("Mark Read/Unread")); markNewsRead_->setToolTip(tr("Mark Current News Read/Unread")); markAllNewsRead_->setText(tr("Mark All News Read")); markAllNewsRead_->setToolTip(tr("Mark All News Read")); showDownloadManagerAct_->setText(tr("Downloads")); showCleanUpWizardAct_->setText(tr("Clean Up...")); setNewsFiltersAct_->setText(tr("News Filters...")); setFilterNewsAct_->setText(tr("Filter News...")); optionsAct_->setText(tr("Options...")); optionsAct_->setToolTip(tr("Open Options Dialog")); feedsFilter_->setText(tr("Filter Feeds")); filterFeedsAll_->setText(tr("Show All")); filterFeedsNew_->setText(tr("Show New")); filterFeedsUnread_->setText(tr("Show Unread")); filterFeedsStarred_->setText(tr("Show Starred Feeds")); filterFeedsError_->setText(tr("Show Not Working Feeds")); newsFilter_->setText(tr("Filter News")); filterNewsAll_->setText(tr("Show All")); filterNewsNew_->setText(tr("Show New")); filterNewsUnread_->setText(tr("Show Unread")); filterNewsStar_->setText(tr("Show Starred")); filterNewsNotStarred_->setText(tr("Show Not Starred")); filterNewsUnreadStar_->setText(tr("Show Unread or Starred")); filterNewsLastDay_->setText(tr("Show Last Day")); filterNewsLastWeek_->setText(tr("Show Last 7 Days")); aboutAct_ ->setText(tr("About...")); aboutAct_->setToolTip(tr("Show 'About' Dialog")); updateAppAct_->setText(tr("Check for Updates...")); reportProblemAct_->setText(tr("Report a Problem...")); openDescriptionNewsAct_->setText(tr("Open News")); openDescriptionNewsAct_->setToolTip(tr("Open News Description")); openInBrowserAct_->setText(tr("Open in Browser")); openInExternalBrowserAct_->setText(tr("Open in External Browser")); openInExternalBrowserAct_->setToolTip(tr("Open News in External Browser")); openNewsNewTabAct_->setText(tr("Open in New Tab")); openNewsNewTabAct_->setToolTip(tr("Open News in New Tab")); openNewsBackgroundTabAct_->setText(tr("Open in Background Tab")); openNewsBackgroundTabAct_->setToolTip(tr("Open News in Background Tab")); markStarAct_->setText(tr("Star")); markStarAct_->setToolTip(tr("Mark News Star")); deleteNewsAct_->setText(tr("Delete")); deleteNewsAct_->setToolTip(tr("Delete Selected News")); deleteAllNewsAct_->setText(tr("Delete All News")); deleteAllNewsAct_->setToolTip(tr("Delete All News from List")); restoreNewsAct_->setText(tr("Restore")); restoreNewsAct_->setToolTip(tr("Restore News")); copyLinkAct_->setText(tr("Copy Link")); copyLinkAct_->setToolTip(tr("Copy News Link")); restoreLastNewsAct_->setText(tr("Restore last deleted news")); markFeedRead_->setText(tr("Mark Read")); markFeedRead_->setToolTip(tr("Mark Feed Read")); feedProperties_->setText(tr("Properties")); feedProperties_->setToolTip(tr("Properties")); fileMenu_->setTitle(tr("&File")); viewMenu_->setTitle(tr("&View")); feedMenu_->setTitle(tr("Fee&ds")); newsMenu_->setTitle(tr("&News")); browserMenu_->setTitle(tr("&Browser")); toolsMenu_->setTitle(tr("&Tools")); helpMenu_->setTitle(tr("&Help")); mainToolbar_->setWindowTitle(tr("Main Toolbar")); customizeToolbarMenu_->setTitle(tr("Customize Toolbar")); customizeMainToolbarAct_->setText(tr("Main Toolbar...")); customizeMainToolbarAct2_->setText(tr("Customize Toolbar...")); customizeFeedsToolbarAct_->setText(tr("Feeds Toolbar...")); customizeNewsToolbarAct_->setText(tr("News Toolbar...")); toolBarLockAct_->setText(tr("Lock Toolbar")); toolBarHideAct_->setText(tr("Hide Toolbar")); layoutMenu_->setTitle(tr("Layout")); classicLayoutAct_->setText(tr("Classic")); newspaperLayoutAct_->setText(tr("Newspaper")); layoutToggle_->setText(tr("Layout")); styleMenu_->setTitle(tr("Application Style")); systemStyle_->setText(tr("System")); system2Style_->setText(tr("System2")); greenStyle_->setText(tr("Green")); orangeStyle_->setText(tr("Orange")); purpleStyle_->setText(tr("Purple")); pinkStyle_->setText(tr("Pink")); grayStyle_->setText(tr("Gray")); browserPositionMenu_->setTitle(tr("Browser Position")); topBrowserPositionAct_->setText(tr("Top")); bottomBrowserPositionAct_->setText(tr("Bottom")); rightBrowserPositionAct_->setText(tr("Right")); leftBrowserPositionAct_->setText(tr("Left")); showWindowAct_->setText(tr("Show Window")); feedKeyUpAct_->setText(tr("Previous Feed")); feedKeyDownAct_->setText(tr("Next Feed")); newsKeyUpAct_->setText(tr("Previous News")); newsKeyDownAct_->setText(tr("Next News")); newsKeyPageUpAct_->setText(tr("News Page Up")); newsKeyPageDownAct_->setText(tr("News Page Down")); nextUnreadNewsAct_->setText(tr("Next Unread News")); prevUnreadNewsAct_->setText(tr("Previous Unread News")); switchFocusAct_->setText(tr("Switch Focus to Next Panel")); switchFocusAct_->setToolTip( tr("Switch Focus to Next Panel (Tree Feeds, List News, Browser)")); switchFocusPrevAct_->setText(tr("Switch Focus to Previous Panel")); switchFocusPrevAct_->setToolTip( tr("Switch Focus to Previous Panel (Tree Feeds, Browser, List News)")); feedsWidgetVisibleAct_->setText(tr("Show/Hide Tree Feeds")); placeToTrayAct_->setText(tr("Minimize to Tray")); placeToTrayAct_->setToolTip(tr("Minimize Application to Tray")); feedsColumnsMenu_->setTitle(tr("Columns")); showUnreadCount_->setText(tr("Count Unread News")); showUndeleteCount_->setText(tr("Count All News")); showLastUpdated_->setText(tr("Last Update")); indentationFeedsTreeAct_->setText(tr("Show Indentation")); findFeedAct_->setText(tr("Search Feed")); findFeedAct_->setToolTip(tr("Search Feed")); browserZoomMenu_->setTitle(tr("Zoom")); zoomInAct_->setText(tr("Zoom In")); zoomInAct_->setToolTip(tr("Zoom in in browser")); zoomOutAct_->setText(tr("Zoom Out")); zoomOutAct_->setToolTip(tr("Zoom out in browser")); zoomTo100Act_->setText(tr("100%")); zoomTo100Act_->setToolTip(tr("Reset browser zoom")); printAct_->setText(tr("Print...")); printAct_->setToolTip(tr("Print Web Page")); printPreviewAct_->setText(tr("Print Preview...")); printPreviewAct_->setToolTip(tr("Preview Web Page")); pageUpWebViewAct_->setText(tr("Page up (Browser)")); pageDownWebViewAct_->setText(tr("Page down (Browser)")); savePageAsAct_->setText(tr("Save As...")); savePageAsAct_->setToolTip(tr("Save Page As...")); savePageAsDescriptAct_->setText(tr("Save page in database")); savePageAsDescriptAct_->setToolTip(tr("Save page in database instead of news description")); toolbarsMenu_->setTitle(tr("Show/Hide")); mainToolbarToggle_->setText(tr("Main Toolbar")); feedsToolbarToggle_->setText(tr("Feeds Toolbar")); newsToolbarToggle_->setText(tr("News Toolbar")); browserToolbarToggle_->setText(tr("Browser Toolbar")); categoriesPanelToggle_->setText(tr("Panel Categories")); statusBarToggle_->setText(tr("Status Bar")); fullScreenAct_->setText(tr("Full Screen")); fullScreenAct_->setToolTip(tr("Full Screen")); stayOnTopAct_->setText(tr("Stay On Top")); stayOnTopAct_->setToolTip(tr("Stay On Top")); categoriesLabel_->setText(tr("Categories")); if (categoriesTree_->isHidden()) showCategoriesButton_->setToolTip(tr("Show Categories")); else showCategoriesButton_->setToolTip(tr("Hide Categories")); newsLabelMenuAction_->setText(tr("Label")); newsLabelAction_->setText(tr("Label")); showLabelsMenuAct_->setText(tr("Show labels menu")); closeTabAct_->setText(tr("Close Tab")); closeOtherTabsAct_->setText(tr("Close Other Tabs")); closeAllTabsAct_->setText(tr("Close All Tabs")); nextTabAct_->setText(tr("Switch to next tab")); prevTabAct_->setText(tr("Switch to previous tab")); categoriesTree_->topLevelItem(CategoriesTreeWidget::UnreadItem)->setText(0, tr("Unread")); categoriesTree_->topLevelItem(CategoriesTreeWidget::StarredItem)->setText(0, tr("Starred")); categoriesTree_->topLevelItem(CategoriesTreeWidget::DeletedItem)->setText(0, tr("Deleted")); categoriesTree_->topLevelItem(CategoriesTreeWidget::LabelsItem)->setText(0, tr("Labels")); reduceNewsListAct_->setText(tr("Decrease news list/increase browser")); increaseNewsListAct_->setText(tr("Increase news list/decrease browser")); findTextAct_->setText(tr("Find")); openHomeFeedAct_->setText(tr("Open Homepage Feed")); sortedByTitleFeedsTreeAct_->setText(tr("Sort by Name")); collapseAllFoldersAct_->setText(tr("Collapse All Folders")); expandAllFoldersAct_->setText(tr("Expand All Folders")); nextFolderAct_->setText(tr("Next Folder")); prevFolderAct_->setText(tr("Previous Folder")); expandFolderAct_->setText(tr("Expand Folder")); settingPageLabelsAct_->setText(tr("Setting Page: Labels")); shareMenuAct_->setText(tr("Share")); newsSortByMenu_->setTitle(tr("Sort By")); newsSortOrderGroup_->actions().at(0)->setText(tr("Ascending")); newsSortOrderGroup_->actions().at(1)->setText(tr("Descending")); QApplication::translate("QDialogButtonBox", "Close"); QApplication::translate("QDialogButtonBox", "Cancel"); QApplication::translate("QDialogButtonBox", "&Yes"); QApplication::translate("QDialogButtonBox", "&No"); QApplication::translate("QLineEdit", "&Undo"); QApplication::translate("QLineEdit", "&Redo"); QApplication::translate("QLineEdit", "Cu&t"); QApplication::translate("QLineEdit", "&Copy"); QApplication::translate("QLineEdit", "&Paste"); QApplication::translate("QLineEdit", "Delete"); QApplication::translate("QLineEdit", "Select All"); QApplication::translate("QTextControl", "&Undo"); QApplication::translate("QTextControl", "&Redo"); QApplication::translate("QTextControl", "Cu&t"); QApplication::translate("QTextControl", "&Copy"); QApplication::translate("QTextControl", "&Paste"); QApplication::translate("QTextControl", "Delete"); QApplication::translate("QTextControl", "Select All"); QApplication::translate("QTextControl", "Copy &Link Location"); QApplication::translate("QAbstractSpinBox", "&Step up"); QApplication::translate("QAbstractSpinBox", "Step &down"); QApplication::translate("QAbstractSpinBox", "&Select All"); QApplication::translate("QMultiInputContext", "Select IM"); QApplication::translate("QWizard", "Cancel"); QApplication::translate("QWizard", "< &Back"); QApplication::translate("QWizard", "&Finish"); QApplication::translate("QWizard", "&Next >"); QSqlQuery q; q.exec("SELECT id, name FROM labels WHERE id <= 6"); while (q.next()) { int idLabel = q.value(0).toInt(); QString nameLabel = q.value(1).toString(); QList treeItems; treeItems = categoriesTree_->findItems(QString::number(idLabel), Qt::MatchFixedString|Qt::MatchRecursive, 2); if (treeItems.count() && (nameLabels().at(idLabel-1) == nameLabel)) { treeItems.at(0)->setText(0, trNameLabels().at(idLabel-1)); for (int i = 0; i < newsLabelGroup_->actions().count(); i++) { if (newsLabelGroup_->actions().at(i)->data().toInt() == idLabel) { newsLabelGroup_->actions().at(i)->setText(trNameLabels().at(idLabel-1)); newsLabelGroup_->actions().at(i)->setToolTip(trNameLabels().at(idLabel-1)); break; } } for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->type_ == NewsTabWidget::TabTypeLabel) { if (widget->labelId_ == idLabel) { widget->setTextTab(trNameLabels().at(idLabel-1)); } } } } } if (newsView_) { currentNewsTab->retranslateStrings(); } findFeeds_->retranslateStrings(); mainApp->downloadManager()->retranslateStrings(); adblockIcon_->retranslateStrings(); QApplication::translate("AdBlockCustomList", "Custom Rules"); if ((mainApp->language() == "ar") || (mainApp->language() == "fa")) { QApplication::setLayoutDirection(Qt::RightToLeft); mainMenuButton_->setStyleSheet("#mainMenuButton { border: none; padding: 0px 5px 0px 0px; }"); } else { QApplication::setLayoutDirection(Qt::LeftToRight); mainMenuButton_->setStyleSheet("#mainMenuButton { border: none; padding: 0px 0px 0px 5px; }"); } /** Hack ltr <-> rtl**/ int indexTab = tabBar_->addTab(""); tabBar_->removeTab(indexTab); } // ---------------------------------------------------------------------------- void MainWindow::setToolBarStyle(const QString &styleStr) { if (mainToolbar_->widgetForAction(addAct_)) mainToolbar_->widgetForAction(addAct_)->setMinimumWidth(10); if (styleStr == "toolBarStyleI_") { mainToolbar_->setToolButtonStyle(Qt::ToolButtonIconOnly); } else if (styleStr == "toolBarStyleT_") { mainToolbar_->setToolButtonStyle(Qt::ToolButtonTextOnly); } else if (styleStr == "toolBarStyleTbI_") { mainToolbar_->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); } else { mainToolbar_->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); if (mainToolbar_->widgetForAction(addAct_)) mainToolbar_->widgetForAction(addAct_)->setMinimumWidth(60); } } // ---------------------------------------------------------------------------- void MainWindow::setToolBarIconSize(QToolBar *toolbar, const QString &iconSizeStr) { if (iconSizeStr == "toolBarIconBig_") { toolbar->setIconSize(QSize(32, 32)); } else if (iconSizeStr == "toolBarIconSmall_") { toolbar->setIconSize(QSize(18, 18)); } else { toolbar->setIconSize(QSize(24, 24)); } } /** @brief Call toolbar context menu *----------------------------------------------------------------------------*/ void MainWindow::showContextMenuToolBar(const QPoint &pos) { QMenu menu; menu.addAction(customizeMainToolbarAct2_); menu.addSeparator(); menu.addAction(toolBarLockAct_); menu.addAction(toolBarHideAct_); menu.exec(mainToolbar_->mapToGlobal(pos)); } // ---------------------------------------------------------------------------- void MainWindow::lockMainToolbar(bool lock) { mainToolbar_->setMovable(!lock); } // ---------------------------------------------------------------------------- void MainWindow::hideMainToolbar() { mainToolbarToggle_->setChecked(false); mainToolbar_->hide(); } // ---------------------------------------------------------------------------- void MainWindow::showFeedPropertiesDlg() { if (!feedsView_->selectIndex().isValid()) { feedProperties_->setEnabled(false); return; } QPersistentModelIndex index = feedsView_->selectIndex(); int feedId = feedsModel_->idByIndex(index); bool isFeed = (index.isValid() && feedsModel_->isFolder(index)) ? false : true; FeedPropertiesDialog *feedPropertiesDialog = new FeedPropertiesDialog(isFeed, this); FEED_PROPERTIES properties; FEED_PROPERTIES properties_tmp; QByteArray byteArray = feedsModel_->dataField(index, "image").toByteArray(); if (!byteArray.isNull()) { QPixmap icon; icon.loadFromData(QByteArray::fromBase64(byteArray)); feedPropertiesDialog->setWindowIcon(icon); } else if (isFeed) { feedPropertiesDialog->setWindowIcon(QPixmap(":/images/feed")); } else { feedPropertiesDialog->setWindowIcon(QPixmap(":/images/folder")); } properties.general.image = QByteArray::fromBase64(byteArray); QString str(feedPropertiesDialog->windowTitle() + " '" + feedsModel_->dataField(index, "text").toString() + "'"); feedPropertiesDialog->setWindowTitle(str); properties.general.text = feedsModel_->dataField(index, "text").toString(); properties.general.title = feedsModel_->dataField(index, "title").toString(); properties.general.url = feedsModel_->dataField(index, "xmlUrl").toString(); properties.general.homepage = feedsModel_->dataField(index, "htmlUrl").toString(); properties.general.displayOnStartup = feedsModel_->dataField(index, "displayOnStartup").toInt(); properties.mouse.singleClickAction = (ENewsClickAction::Type)feedsModel_->dataField(index, "SingleClickAction").toInt(); properties.mouse.doubleClickAction = (ENewsClickAction::Type)feedsModel_->dataField(index, "DoubleClickAction").toInt(); properties.mouse.middleClickAction = (ENewsClickAction::Type)feedsModel_->dataField(index, "MiddleClickAction").toInt(); properties.display.displayEmbeddedImages = feedsModel_->dataField(index, "displayEmbeddedImages").toInt(); properties.display.javaScriptEnable = feedsModel_->dataField(index, "javaScriptEnable").toInt(); if (feedsModel_->dataField(index, "displayNews").toString().isEmpty()) properties.display.displayNews = !showDescriptionNews_; else properties.display.displayNews = feedsModel_->dataField(index, "displayNews").toInt(); properties.display.layoutDirection = feedsModel_->dataField(index, "layoutDirection").toInt(); properties.general.disableUpdate = feedsModel_->dataField(index, "disableUpdate").toBool(); if (feedsModel_->dataField(index, "updateIntervalEnable").isNull() || (feedsModel_->dataField(index, "updateIntervalEnable").toInt() == -1)) { properties.general.updateEnable = updateFeedsEnable_; properties.general.updateInterval = updateFeedsInterval_; properties.general.intervalType = updateFeedsIntervalType_; } else { properties.general.updateEnable = feedsModel_->dataField(index, "updateIntervalEnable").toBool(); properties.general.updateInterval = feedsModel_->dataField(index, "updateInterval").toInt(); properties.general.intervalType = feedsModel_->dataField(index, "updateIntervalType").toInt(); } if (feedsModel_->dataField(index, "label").toString().contains("starred")) properties.general.starred = true; else properties.general.starred = false; properties.general.duplicateNewsMode = feedsModel_->dataField(index, "duplicateNewsMode").toBool(); Settings settings; settings.beginGroup("NewsHeader"); QString indexColumnsStr = settings.value("columns").toString(); QStringList indexColumnsList = indexColumnsStr.split(",", QString::SkipEmptyParts); foreach (QString indexStr, indexColumnsList) { properties.columnDefault.columns.append(indexStr.toInt()); } NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); int sortBy = settings.value("sortBy", widget->newsModel_->fieldIndex("published")).toInt(); properties.columnDefault.sortBy = sortBy; int sortType = settings.value("sortOrder", Qt::DescendingOrder).toInt(); properties.columnDefault.sortType = sortType; settings.endGroup(); if (feedsModel_->dataField(index, "columns").toString().isEmpty()) { widget = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); QListIterator iter(widget->newsHeader_->viewMenu_->actions()); while (iter.hasNext()) { QAction *nextAction = iter.next(); properties.column.indexList.append(nextAction->data().toInt()); properties.column.nameList.append(nextAction->text()); if (nextAction->isChecked()) properties.column.columns.append(nextAction->data().toInt()); } int section = widget->newsHeader_->sortIndicatorSection(); properties.column.sortBy = section; if (widget->newsHeader_->sortIndicatorOrder() == Qt::AscendingOrder) { properties.column.sortType = 0; } else { properties.column.sortType = 1; } } else { widget = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); QListIterator iter(widget->newsHeader_->viewMenu_->actions()); while (iter.hasNext()) { QAction *nextAction = iter.next(); properties.column.indexList.append(nextAction->data().toInt()); properties.column.nameList.append(nextAction->text()); } indexColumnsStr = feedsModel_->dataField(index, "columns").toString(); indexColumnsList = indexColumnsStr.split(",", QString::SkipEmptyParts); foreach (QString indexStr, indexColumnsList) { properties.column.columns.append(indexStr.toInt()); } properties.column.sortBy = feedsModel_->dataField(index, "sort").toInt(); properties.column.sortType = feedsModel_->dataField(index, "sortType").toInt(); } properties.authentication.on = false; if (feedsModel_->dataField(index, "authentication").toInt() == 1) { properties.authentication.on = true; } QUrl url(feedsModel_->dataField(index, "xmlUrl").toString()); QSqlQuery q; q.prepare("SELECT username, password FROM passwords WHERE server=?"); q.addBindValue(url.host()); q.exec(); if (q.next()) { properties.authentication.user = q.value(0).toString(); properties.authentication.pass = QString::fromUtf8(QByteArray::fromBase64(q.value(1).toByteArray())); } properties.status.feedStatus = feedsModel_->dataField(index, "status").toString(); QDateTime dtLocalTime = QDateTime::currentDateTime(); QDateTime dtUTC = QDateTime(dtLocalTime.date(), dtLocalTime.time(), Qt::UTC); int nTimeShift = dtLocalTime.secsTo(dtUTC); QDateTime dt = QDateTime::fromString( feedsModel_->dataField(index, "created").toString(), Qt::ISODate); properties.status.createdTime = dt.addSecs(nTimeShift); dt = QDateTime::fromString( feedsModel_->dataField(index, "updated").toString(), Qt::ISODate); properties.status.lastUpdate = dt.addSecs(nTimeShift); dt = QDateTime::fromString( feedsModel_->dataField(index, "lastBuildDate").toString(), Qt::ISODate); properties.status.lastBuildDate = dt.addSecs(nTimeShift); properties.status.undeleteCount = feedsModel_->dataField(index, "undeleteCount").toInt(); properties.status.newCount = feedsModel_->dataField(index, "newCount").toInt(); properties.status.unreadCount = feedsModel_->dataField(index, "unread").toInt(); properties.status.description = feedsModel_->dataField(index, "description").toString(); properties.status.feedsCount = 0; if (!isFeed) { QQueue parentIds; parentIds.enqueue(feedId); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); q.exec(QString("SELECT id, xmlUrl FROM feeds WHERE parentId='%1'").arg(parentId)); while (q.next()) { QString xmlUrl = q.value(1).toString(); if (xmlUrl.isEmpty()) parentIds.enqueue(q.value(0).toInt()); else properties.status.feedsCount++; } } } feedPropertiesDialog->setFeedProperties(properties); properties_tmp = properties; int result = feedPropertiesDialog->exec(); if (result == QDialog::Rejected) { delete feedPropertiesDialog; return; } if (!mainApp->storeDBMemory()) db_.transaction(); properties = feedPropertiesDialog->getFeedProperties(); delete feedPropertiesDialog; index = feedsModel_->indexById(feedId); q.prepare("UPDATE feeds SET text = ?, xmlUrl = ?, displayOnStartup = ?, " "SingleClickAction = ?, DoubleClickAction = ?, MiddleClickAction = ?, " "displayEmbeddedImages = ?, displayNews = ?, layoutDirection = ?, " "label = ?, duplicateNewsMode = ?, authentication = ?, disableUpdate = ?, " "javaScriptEnable = ? WHERE id == ?"); q.addBindValue(properties.general.text); q.addBindValue(properties.general.url); q.addBindValue(properties.general.displayOnStartup); q.addBindValue((int)properties.mouse.singleClickAction); q.addBindValue((int)properties.mouse.doubleClickAction); q.addBindValue((int)properties.mouse.middleClickAction); q.addBindValue(properties.display.displayEmbeddedImages); q.addBindValue(properties.display.displayNews); q.addBindValue(properties.display.layoutDirection); if (properties.general.starred) q.addBindValue("starred"); else q.addBindValue(""); q.addBindValue(properties.general.duplicateNewsMode ? 1 : 0); q.addBindValue(properties.authentication.on ? 1 : 0); q.addBindValue(properties.general.disableUpdate ? 1 : 0); q.addBindValue(properties.display.javaScriptEnable); q.addBindValue(feedId); q.exec(); indexColumnsStr = ""; if ((properties.column.columns != properties.columnDefault.columns) || (properties.column.sortBy != properties.columnDefault.sortBy) || (properties.column.sortType != properties.columnDefault.sortType)) { for (int i = 0; i < properties.column.columns.count(); ++i) { int index = properties.column.columns.at(i); indexColumnsStr.append(","); indexColumnsStr.append(QString::number(index)); } indexColumnsStr.append(","); } else { properties.column.sortBy = 0; properties.column.sortType = 0; } q.prepare("UPDATE feeds SET columns = ?, sort = ?, sortType = ? WHERE id == ?"); q.addBindValue(indexColumnsStr); q.addBindValue(properties.column.sortBy); q.addBindValue(properties.column.sortType); q.addBindValue(feedId); q.exec(); QModelIndex indexColumns = feedsModel_->indexSibling(index, "columns"); QModelIndex indexSort = feedsModel_->indexSibling(index, "sort"); QModelIndex indexSortType = feedsModel_->indexSibling(index, "sortType"); feedsModel_->setData(indexColumns, indexColumnsStr); feedsModel_->setData(indexSort, properties.column.sortBy); feedsModel_->setData(indexSortType, properties.column.sortType); if (!isFeed) { QQueue parentIds; parentIds.enqueue(feedId); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); q.exec(QString("SELECT id, xmlUrl FROM feeds WHERE parentId='%1'"). arg(parentId)); while (q.next()) { int id = q.value(0).toInt(); QString xmlUrl = q.value(1).toString(); QSqlQuery q1; q1.prepare("UPDATE feeds SET columns = ?, sort = ?, sortType = ? WHERE id == ?"); q1.addBindValue(indexColumnsStr); q1.addBindValue(properties.column.sortBy); q1.addBindValue(properties.column.sortType); q1.addBindValue(id); q1.exec(); QPersistentModelIndex index1 = feedsModel_->indexById(id); indexColumns = feedsModel_->indexSibling(index1, "columns"); indexSort = feedsModel_->indexSibling(index1, "sort"); indexSortType = feedsModel_->indexSibling(index1, "sortType"); feedsModel_->setData(indexColumns, indexColumnsStr); feedsModel_->setData(indexSort, properties.column.sortBy); feedsModel_->setData(indexSortType, properties.column.sortType); if (currentNewsTab->feedId_ == id) currentNewsTab->newsHeader_->setColumns(index1); if (xmlUrl.isEmpty()) parentIds.enqueue(id); } } } if (currentNewsTab->feedId_ == feedId) currentNewsTab->newsHeader_->setColumns(index); if (!(!feedsModel_->dataField(index, "authentication").toInt() && !properties.authentication.on)) { q.prepare("SELECT * FROM passwords WHERE server=?"); q.addBindValue(url.host()); q.exec(); if (q.next()) { q.prepare("UPDATE passwords SET username = ?, password = ? WHERE server=?"); q.addBindValue(properties.authentication.user); q.addBindValue(properties.authentication.pass.toUtf8().toBase64()); q.addBindValue(url.host()); q.exec(); } else if (properties.authentication.on) { q.prepare("INSERT INTO passwords (server, username, password) " "VALUES (:server, :username, :password)"); q.bindValue(":server", url.host()); q.bindValue(":username", properties.authentication.user); q.bindValue(":password", properties.authentication.pass.toUtf8().toBase64()); q.exec(); } } QPersistentModelIndex indexText = feedsModel_->indexSibling(index, "text"); QPersistentModelIndex indexUrl = feedsModel_->indexSibling(index, "xmlUrl"); QPersistentModelIndex indexStartup = feedsModel_->indexSibling(index, "displayOnStartup"); QModelIndex indexSingleClickAction = feedsModel_->indexSibling(index, "SingleClickAction"); QModelIndex indexDoubleClickAction = feedsModel_->indexSibling(index, "DoubleClickAction"); QModelIndex indexMiddleClickAction = feedsModel_->indexSibling(index, "MiddleClickAction"); QModelIndex indexImages = feedsModel_->indexSibling(index, "displayEmbeddedImages"); QModelIndex indexNews = feedsModel_->indexSibling(index, "displayNews"); QModelIndex indexRTL = feedsModel_->indexSibling(index, "layoutDirection"); QModelIndex indexLabel = feedsModel_->indexSibling(index, "label"); QModelIndex indexDuplicate = feedsModel_->indexSibling(index, "duplicateNewsMode"); QModelIndex indexAuthentication = feedsModel_->indexSibling(index, "authentication"); QModelIndex indexDisableUpdate = feedsModel_->indexSibling(index, "disableUpdate"); QModelIndex indexJavaScript = feedsModel_->indexSibling(index, "javaScriptEnable"); feedsModel_->setData(indexText, properties.general.text); feedsModel_->setData(indexUrl, properties.general.url); feedsModel_->setData(indexStartup, properties.general.displayOnStartup); feedsModel_->setData(indexSingleClickAction, (int)properties.mouse.singleClickAction); feedsModel_->setData(indexDoubleClickAction, (int)properties.mouse.doubleClickAction); feedsModel_->setData(indexMiddleClickAction, (int)properties.mouse.middleClickAction); feedsModel_->setData(indexImages, properties.display.displayEmbeddedImages); feedsModel_->setData(indexNews, properties.display.displayNews); feedsModel_->setData(indexRTL, properties.display.layoutDirection); feedsModel_->setData(indexLabel, properties.general.starred ? "starred" : ""); feedsModel_->setData(indexDuplicate, properties.general.duplicateNewsMode ? 1 : 0); feedsModel_->setData(indexAuthentication, properties.authentication.on ? 1 : 0); feedsModel_->setData(indexDisableUpdate, properties.general.disableUpdate ? 1 : 0); feedsModel_->setData(indexJavaScript, properties.display.javaScriptEnable); if (!properties.general.updateEnable || (properties.general.updateEnable != updateFeedsEnable_) || (properties.general.updateInterval != updateFeedsInterval_) || (properties.general.intervalType != updateFeedsIntervalType_)) { q.prepare("UPDATE feeds SET updateIntervalEnable = ?, updateInterval = ?, " "updateIntervalType = ? WHERE id == ?"); q.addBindValue(properties.general.updateEnable ? 1 : 0); q.addBindValue(properties.general.updateInterval); q.addBindValue(properties.general.intervalType); q.addBindValue(feedId); q.exec(); QPersistentModelIndex indexUpdateEnable = feedsModel_->indexSibling(index, "updateIntervalEnable"); QPersistentModelIndex indexUpdateInterval = feedsModel_->indexSibling(index, "updateInterval"); QPersistentModelIndex indexIntervalType = feedsModel_->indexSibling(index, "updateIntervalType"); feedsModel_->setData(indexUpdateEnable, properties.general.updateEnable ? 1 : 0); feedsModel_->setData(indexUpdateInterval, properties.general.updateInterval); feedsModel_->setData(indexIntervalType, properties.general.intervalType); int updateInterval = properties.general.updateInterval; int updateIntervalType = properties.general.intervalType; if (updateIntervalType == 0) updateInterval = updateInterval*60; else if (updateIntervalType == 1) updateInterval = updateInterval*60*60; if (!isFeed) { QQueue parentIds; parentIds.enqueue(feedId); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); q.exec(QString("SELECT id, xmlUrl FROM feeds WHERE parentId='%1'"). arg(parentId)); while (q.next()) { int id = q.value(0).toInt(); QString xmlUrl = q.value(1).toString(); QSqlQuery q1; q1.prepare("UPDATE feeds SET updateIntervalEnable = ?, updateInterval = ?, " "updateIntervalType = ? WHERE id == ?"); q1.addBindValue(properties.general.updateEnable ? 1 : 0); q1.addBindValue(properties.general.updateInterval); q1.addBindValue(properties.general.intervalType); q1.addBindValue(id); q1.exec(); QPersistentModelIndex index1 = feedsModel_->indexById(id); indexUpdateEnable = feedsModel_->indexSibling(index1, "updateIntervalEnable"); indexUpdateInterval = feedsModel_->indexSibling(index1, "updateInterval"); indexIntervalType = feedsModel_->indexSibling(index1, "updateIntervalType"); feedsModel_->setData(indexUpdateEnable, properties.general.updateEnable ? 1 : 0); feedsModel_->setData(indexUpdateInterval, properties.general.updateInterval); feedsModel_->setData(indexIntervalType, properties.general.intervalType); if (!xmlUrl.isEmpty()) { if (properties.general.updateEnable) { updateFeedsIntervalSec_.insert(id, updateInterval); updateFeedsTimeCount_.insert(id, 0); } else { updateFeedsIntervalSec_.remove(id); updateFeedsTimeCount_.remove(id); } } else { parentIds.enqueue(id); } } } } else { if (properties.general.updateEnable) { updateFeedsIntervalSec_.insert(feedId, updateInterval); updateFeedsTimeCount_.insert(feedId, 0); } else { updateFeedsIntervalSec_.remove(feedId); updateFeedsTimeCount_.remove(feedId); } } } else { q.prepare("UPDATE feeds SET updateIntervalEnable = -1 WHERE id == ?"); q.addBindValue(feedId); q.exec(); QPersistentModelIndex indexUpdateEnable = feedsModel_->indexSibling(index, "updateIntervalEnable"); feedsModel_->setData(indexUpdateEnable, "-1"); updateFeedsIntervalSec_.remove(feedId); updateFeedsTimeCount_.remove(feedId); } if (properties.general.image != properties_tmp.general.image) { q.prepare("UPDATE feeds SET image = ? WHERE id == ?"); q.addBindValue(properties.general.image.toBase64()); q.addBindValue(feedId); q.exec(); slotIconFeedUpdate(feedId, properties.general.image); } for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->feedId_ == feedId) { if (properties.general.text != properties_tmp.general.text) { widget->setTextTab(properties.general.text); } if ((properties.display.layoutDirection != properties_tmp.display.layoutDirection) || (properties.display.javaScriptEnable != properties_tmp.display.javaScriptEnable)) { widget->setSettings(); } } } if ((properties.general.disableUpdate != properties_tmp.general.disableUpdate) && !isFeed) { QQueue parentIds; parentIds.enqueue(feedId); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); q.exec(QString("SELECT id, xmlUrl FROM feeds WHERE parentId='%1'").arg(parentId)); while (q.next()) { int id = q.value(0).toInt(); QString xmlUrl = q.value(1).toString(); QSqlQuery q1; q1.prepare("UPDATE feeds SET disableUpdate = ? WHERE id == ?"); q1.addBindValue(properties.general.disableUpdate ? 1 : 0); q1.addBindValue(id); q1.exec(); QPersistentModelIndex index1 = feedsModel_->indexById(id); indexDisableUpdate = feedsModel_->indexSibling(index1, "disableUpdate"); feedsModel_->setData(indexDisableUpdate, properties.general.disableUpdate ? 1 : 0); if (xmlUrl.isEmpty()) parentIds.enqueue(id); } } } if (!mainApp->storeDBMemory()) db_.commit(); } /** @brief Update tray information: icon and tooltip text *---------------------------------------------------------------------------*/ void MainWindow::slotRefreshInfoTray(int newCount, int unreadCount) { if (!unreadCount) categoriesTree_->topLevelItem(CategoriesTreeWidget::UnreadItem)->setText(4, ""); else categoriesTree_->topLevelItem(CategoriesTreeWidget::UnreadItem)->setText(4, QString("(%1)").arg(unreadCount)); QFont font = categoriesTree_->topLevelItem(CategoriesTreeWidget::UnreadItem)->font(0); if (unreadCount) font.setBold(true); else font.setBold(false); categoriesTree_->topLevelItem(CategoriesTreeWidget::UnreadItem)->setFont(0, font); if (!showTrayIcon_) return; // Setting tooltip text QString info = "QuiteRSS\n" + QString(tr("New News: %1")).arg(newCount) + QString("\n") + QString(tr("Unread News: %1")).arg(unreadCount); traySystem->setToolTip(info); // Display new number or unread number of news if (behaviorIconTray_ > CHANGE_ICON_TRAY) { int trayCount = (behaviorIconTray_ == UNREAD_COUNT_ICON_TRAY) ? unreadCount : newCount; // Display icon with number if (trayCount != 0) { // Prepare number QString trayCountStr; QFont font("Consolas"); if (trayCount > 99) { font.setBold(false); if (trayCount < 1000) { font.setPixelSize(8); trayCountStr = QString::number(trayCount); } else { font.setPixelSize(11); trayCountStr = "#"; } } else { font.setBold(true); font.setPixelSize(11); trayCountStr = QString::number(trayCount); } // Draw icon, text above it, and set this icon to tray icon QPixmap icon = QPixmap(":/images/countNew"); QPainter trayPainter; trayPainter.begin(&icon); trayPainter.setFont(font); trayPainter.setPen(Qt::white); trayPainter.drawText(QRect(1, 0, 15, 16), Qt::AlignVCenter | Qt::AlignHCenter, trayCountStr); trayPainter.end(); traySystem->setIcon(icon); } // Draw icon without number else { traySystem->setIcon(QIcon(":/images/quiterss16")); } } } /** @brief Prepare feed icon for storing in DB *---------------------------------------------------------------------------*/ void MainWindow::slotIconFeedPreparing(QString feedUrl, QByteArray byteArray, QString format) { QPixmap icon; if (icon.loadFromData(byteArray)) { icon = icon.scaled(16, 16, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); QByteArray faviconData; QBuffer buffer(&faviconData); buffer.open(QIODevice::WriteOnly); if (icon.save(&buffer, "ICO")) { emit signalIconFeedReady(feedUrl, faviconData); } } else if (icon.loadFromData(byteArray, format.toUtf8().data())) { icon = icon.scaled(16, 16, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); QByteArray faviconData; QBuffer buffer(&faviconData); buffer.open(QIODevice::WriteOnly); if (icon.save(&buffer, "ICO")) { emit signalIconFeedReady(feedUrl, faviconData); } } } /** @brief Update feed icon in model and view *---------------------------------------------------------------------------*/ void MainWindow::slotIconFeedUpdate(int feedId, QByteArray faviconData) { QModelIndex index = feedsModel_->indexById(feedId); if (index.isValid()) { QModelIndex indexImage = feedsModel_->indexSibling(index, "image"); feedsModel_->setData(indexImage, faviconData.toBase64()); feedsView_->viewport()->update(); } if (defaultIconFeeds_) return; for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->feedId_ == feedId) { QPixmap iconTab; if (!faviconData.isNull()) { iconTab.loadFromData(faviconData); } else { iconTab.load(":/images/feed"); } widget->newsIconTitle_->setPixmap(iconTab); } } if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) currentNewsTab->newsView_->viewport()->update(); } // ---------------------------------------------------------------------------- void MainWindow::slotPlaySound(const QString &path) { QString soundPath = mainApp->absolutePath(path); if (!QFile::exists(soundPath)) { qWarning() << QString("Error playing sound: %1").arg(soundPath); return; } bool playing = false; Settings settings; bool useMediaPlayer = settings.value("Settings/useMediaPlayer", true).toBool(); if (useMediaPlayer) { #ifdef HAVE_QT5 if (mediaPlayer_ == NULL) { playlist_ = new QMediaPlaylist(this); mediaPlayer_ = new QMediaPlayer(this); mediaPlayer_->setPlaylist(playlist_); connect(mediaPlayer_, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus)), this, SLOT(mediaStatusChanged(QMediaPlayer::MediaStatus))); connect(mediaPlayer_, SIGNAL(error(QMediaPlayer::Error)), this, SLOT(mediaError(QMediaPlayer::Error))); } playlist_->addMedia(QUrl::fromLocalFile(soundPath)); if (playlist_->currentIndex() == -1) { playlist_->setCurrentIndex(1); mediaPlayer_->play(); } playing = true; #else #ifdef HAVE_PHONON if (mediaPlayer_ == NULL) { mediaPlayer_ = new Phonon::MediaObject(this); audioOutput_ = new Phonon::AudioOutput(Phonon::MusicCategory, this); Phonon::createPath(mediaPlayer_, audioOutput_); connect(mediaPlayer_, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(mediaStateChanged(Phonon::State,Phonon::State))); } if (mediaPlayer_->state() == Phonon::ErrorState) mediaPlayer_->clear(); if ((mediaPlayer_->state() != Phonon::PausedState) && (mediaPlayer_->state() != Phonon::StoppedState)) { mediaPlayer_->enqueue(soundPath); } else { mediaPlayer_->setCurrentSource(soundPath); } mediaPlayer_->play(); playing = true; #endif #endif } if (!playing) { #if defined(Q_OS_WIN) || defined(Q_OS_OS2) QSound::play(soundPath); #else QProcess::startDetached(QString("play %1").arg(soundPath)); #endif } } #ifdef HAVE_QT5 void MainWindow::mediaStatusChanged(QMediaPlayer::MediaStatus status) { if (status == QMediaPlayer::EndOfMedia) { playlist_->removeMedia(0); } } void MainWindow::mediaError(QMediaPlayer::Error error) { QTextCodec *codec = QTextCodec::codecForLocale(); qCritical() << QString("Error Media: %1 - %2"). arg(error). arg(codec->toUnicode(mediaPlayer_->errorString().toUtf8())); } #endif #ifdef HAVE_PHONON void MainWindow::mediaStateChanged(Phonon::State newstate, Phonon::State) { if (newstate == Phonon::ErrorState) { QTextCodec *codec = QTextCodec::codecForLocale(); qCritical() << QString("Error Phonon: %1 - %2"). arg(mediaPlayer_->errorType()). arg(codec->toUnicode(mediaPlayer_->errorString().toUtf8())); } } #endif void MainWindow::slotPlaySoundNewNews() { if (!playSoundNewNews_ && soundNewNews_) { slotPlaySound(soundNotifyPath_); playSoundNewNews_ = true; } } // ---------------------------------------------------------------------------- void MainWindow::showNewsFiltersDlg(bool newFilter) { NewsFiltersDialog *newsFiltersDialog = new NewsFiltersDialog(this); if (newFilter) { newsFiltersDialog->filtersTree_->setCurrentItem( newsFiltersDialog->filtersTree_->topLevelItem( newsFiltersDialog->filtersTree_->topLevelItemCount()-1)); } newsFiltersDialog->exec(); delete newsFiltersDialog; } // ---------------------------------------------------------------------------- void MainWindow::showFilterRulesDlg() { if (!feedsView_->selectIndex().isValid()) return; int feedId = feedsView_->selectId_; FilterRulesDialog *filterRulesDialog = new FilterRulesDialog( this, -1, feedId); QModelIndex index = feedsModel_->indexById(feedId); QString text = feedsModel_->dataField(index, "text").toString(); filterRulesDialog->filterName_->setText(QString("'%1'").arg(text)); int result = filterRulesDialog->exec(); if (result == QDialog::Rejected) { delete filterRulesDialog; return; } delete filterRulesDialog; showNewsFiltersDlg(true); } // ---------------------------------------------------------------------------- void MainWindow::slotUpdateAppCheck() { updateAppDialog_ = new UpdateAppDialog(mainApp->language(), this, false); connect(updateAppDialog_, SIGNAL(signalNewVersion(QString)), this, SLOT(slotNewVersion(QString)), Qt::QueuedConnection); } // ---------------------------------------------------------------------------- void MainWindow::slotNewVersion(const QString &newVersion) { updateAppDialog_->disconnectObjects(); delete updateAppDialog_; updateAppDialog_ = NULL; if (!newVersion.isEmpty()) { traySystem->showMessage(tr("Check for updates"), tr("A new version of QuiteRSS...")); connect(traySystem, SIGNAL(messageClicked()), this, SLOT(slotShowUpdateAppDlg())); } } /** @brief Process Key_Up in feeds tree *---------------------------------------------------------------------------*/ void MainWindow::slotFeedUpPressed() { QModelIndex indexBefore = feedsView_->currentIndex(); QModelIndex indexAfter; // Jump to bottom in case of the most top index if (!indexBefore.isValid()) indexAfter = feedsProxyModel_->index(feedsProxyModel_->rowCount()-1, "text"); else indexAfter = feedsView_->indexAbove(indexBefore); // There is no "upper" index if (!indexAfter.isValid()) return; feedsView_->setCurrentIndex(indexAfter); slotFeedClicked(indexAfter); } /** @brief Process Key_Down in feeds tree *---------------------------------------------------------------------------*/ void MainWindow::slotFeedDownPressed() { QModelIndex indexBefore = feedsView_->currentIndex(); QModelIndex indexAfter; // Jump to top in case of the most bottom index if (!indexBefore.isValid()) indexAfter = feedsProxyModel_->index(0, "text"); else indexAfter = feedsView_->indexBelow(indexBefore); // There is no "downer" index if (!indexAfter.isValid()) return; feedsView_->setCurrentIndex(indexAfter); slotFeedClicked(indexAfter); } /** @brief Process previous feed shortcut *---------------------------------------------------------------------------*/ void MainWindow::slotFeedPrevious() { QModelIndex indexBefore = feedsView_->currentIndex(); if (!indexBefore.isValid()) indexBefore = feedsProxyModel_->index(feedsProxyModel_->rowCount()-1, feedsView_->columnIndex("text")); QModelIndex indexAfter = feedsView_->indexPrevious(indexBefore); // There is no "upper" index if (!indexAfter.isValid()) return; feedsView_->clearSelection(); feedsView_->setCurrentIndex(indexAfter); slotFeedClicked(indexAfter); } /** @brief Process next feed shortcut *---------------------------------------------------------------------------*/ void MainWindow::slotFeedNext() { QModelIndex indexBefore = feedsView_->currentIndex(); if (!indexBefore.isValid()) indexBefore = feedsProxyModel_->index(0, feedsView_->columnIndex("text")); QModelIndex indexAfter = feedsView_->indexNext(indexBefore); // There is no "downer" index if (!indexAfter.isValid()) return; feedsView_->clearSelection(); feedsView_->setCurrentIndex(indexAfter); slotFeedClicked(indexAfter); } /** @brief Process Key_Home in feeds tree *---------------------------------------------------------------------------*/ void MainWindow::slotFeedHomePressed() { QModelIndex index = feedsProxyModel_->index(0, "text"); feedsView_->setCurrentIndex(index); slotFeedClicked(index); } /** @brief Process Key_End in feeds tree *---------------------------------------------------------------------------*/ void MainWindow::slotFeedEndPressed() { QModelIndex index = feedsProxyModel_->index(feedsProxyModel_->rowCount()-1, "text"); feedsView_->setCurrentIndex(index); slotFeedClicked(index); } /** @brief Set application style *---------------------------------------------------------------------------*/ void MainWindow::setStyleApp(QAction *pAct) { QString fileName(mainApp->resourcesDir()); if (pAct->objectName() == "systemStyle_") { fileName.append("/style/system.qss"); } else if (pAct->objectName() == "system2Style_") { fileName.append("/style/system2.qss"); } else if (pAct->objectName() == "orangeStyle_") { fileName.append("/style/orange.qss"); } else if (pAct->objectName() == "purpleStyle_") { fileName.append("/style/purple.qss"); } else if (pAct->objectName() == "pinkStyle_") { fileName.append("/style/pink.qss"); } else if (pAct->objectName() == "grayStyle_") { fileName.append("/style/gray.qss"); } else { fileName.append("/style/green.qss"); } QFile file(fileName); if (!file.open(QFile::ReadOnly)) { file.setFileName(":/style/systemStyle"); file.open(QFile::ReadOnly); } qApp->setStyleSheet(QLatin1String(file.readAll())); file.close(); mainSplitter_->setStyleSheet( QString("QSplitter::handle {background: qlineargradient(" "x1: 0, y1: 0, x2: 0, y2: 1," "stop: 0 %1, stop: 0.07 %2);}"). arg(feedsPanel_->palette().background().color().name()). arg(qApp->palette().color(QPalette::Dark).name())); } /** Switch focus forward between feed tree, news list and browser *---------------------------------------------------------------------------*/ void MainWindow::slotSwitchFocus() { if (feedsView_->hasFocus()) { newsView_->setFocus(); } else if (newsView_->hasFocus()) { currentNewsTab->webView_->setFocus(); } else { feedsView_->setFocus(); } } /** @brief Switch focus backward between feed tree, news list and browser *---------------------------------------------------------------------------*/ void MainWindow::slotSwitchPrevFocus() { if (feedsView_->hasFocus()) { currentNewsTab->webView_->setFocus(); } else if (currentNewsTab->webView_->hasFocus()) { newsView_->setFocus(); } else { feedsView_->setFocus(); } } /** @brief Open feed in a new tab *---------------------------------------------------------------------------*/ void MainWindow::slotOpenFeedNewTab() { if (stackedWidget_->count() && currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingTab, currentNewsTab); currentNewsTab->newsHeader_->saveStateColumns(currentNewsTab); Settings settings; settings.setValue("NewsTabSplitterState", currentNewsTab->newsTabWidgetSplitter_->saveState()); } QModelIndexList indexList = feedsView_->selectionModel()->selectedRows(0); if (indexList.count() <= 1) { indexList.clear(); indexList.append(feedsProxyModel_->mapFromSource(feedsView_->selectIndex())); } QModelIndex index = indexList.takeFirst(); feedsView_->selectIdEn_ = false; feedsView_->setCurrentIndex(index); slotFeedSelected(feedsProxyModel_->mapToSource(index), true); foreach (QModelIndex indexProxy, indexList) { QModelIndex index = feedsProxyModel_->mapToSource(indexProxy); creatFeedTab(feedsModel_->dataField(index, "id").toInt(), feedsModel_->dataField(index, "parentId").toInt()); } } void MainWindow::slotOpenCategoryNewTab() { slotCategoriesClicked(categoriesTree_->currentItem(), 0, true); } /** @brief Close tab with \a index *---------------------------------------------------------------------------*/ void MainWindow::slotCloseTab(int index) { if (index != 0) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(index); setFeedRead(widget->type_, widget->feedId_, FeedReadClosingTab, widget); stackedWidget_->removeWidget(widget); tabBar_->removeTab(index); widget->disconnectObjects(); widget->newsTitleLabel_->deleteLater(); widget->deleteLater(); } } /** @brief Switch to tab with index \a index *---------------------------------------------------------------------------*/ void MainWindow::slotTabCurrentChanged(int index) { if (!stackedWidget_->count()) return; if (tabBar_->closingTabState_ == TabBar::CloseTabOtherIndex) return; NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(index); if ((widget->type_ == NewsTabWidget::TabTypeFeed) || (widget->type_ >= NewsTabWidget::TabTypeWeb)) categoriesTree_->setCurrentIndex(QModelIndex()); if (widget->type_ != NewsTabWidget::TabTypeFeed) { feedsView_->setCurrentIndex(QModelIndex()); feedProperties_->setEnabled(false); } if (index == TAB_WIDGET_PERMANENT) { feedsWidgetVisibleAct_->setChecked(showFeedsTabPermanent_); slotVisibledFeedsWidget(); } else { if (hideFeedsOpenTab_) { feedsWidgetVisibleAct_->setChecked(false); slotVisibledFeedsWidget(); } } stackedWidget_->setCurrentIndex(index); if (!updateCurrentTab_) return; if ((tabBar_->closingTabState_ == TabBar::CloseTabIdle) && (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb)) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingTab, currentNewsTab); currentNewsTab->newsHeader_->saveStateColumns(currentNewsTab); Settings settings; settings.setValue("NewsTabSplitterState", currentNewsTab->newsTabWidgetSplitter_->saveState()); } if (widget->type_ == NewsTabWidget::TabTypeFeed) { if (widget->feedId_ == 0) widget->hide(); currentNewsTab = (NewsTabWidget*)stackedWidget_->widget(index); currentNewsTab->setSettings(false); currentNewsTab->retranslateStrings(); currentNewsTab->setBrowserPosition(); newsModel_ = currentNewsTab->newsModel_; newsView_ = currentNewsTab->newsView_; QModelIndex feedIndex = feedsProxyModel_->mapFromSource(feedsModel_->indexById(widget->feedId_)); feedsView_->setCurrentIndex(feedIndex); feedProperties_->setEnabled(feedIndex.isValid()); setFeedsFilter(false); slotUpdateNews(NewsTabWidget::RefreshWithPos); if (widget->isVisible()) newsView_->setFocus(); else feedsView_->setFocus(); statusUnread_->setVisible(widget->feedId_); statusAll_->setVisible(widget->feedId_); } else if (widget->type_ == NewsTabWidget::TabTypeWeb) { statusUnread_->setVisible(false); statusAll_->setVisible(false); currentNewsTab = widget; currentNewsTab->setSettings(false); currentNewsTab->retranslateStrings(); currentNewsTab->webView_->setFocus(); } else if (widget->type_ == NewsTabWidget::TabTypeDownloads) { statusUnread_->setVisible(false); statusAll_->setVisible(false); mainApp->downloadManager()->show(); currentNewsTab = widget; currentNewsTab->retranslateStrings(); } else { QList treeItems; if (widget->type_ == NewsTabWidget::TabTypeLabel) { treeItems = categoriesTree_->findItems(QString::number(widget->labelId_), Qt::MatchFixedString|Qt::MatchRecursive, 2); } else { treeItems = categoriesTree_->findItems(QString::number(widget->type_), Qt::MatchFixedString, 1); } categoriesTree_->setCurrentItem(treeItems.at(0)); currentNewsTab = (NewsTabWidget*)stackedWidget_->widget(index); currentNewsTab->setSettings(false); currentNewsTab->retranslateStrings(); currentNewsTab->setBrowserPosition(); newsModel_ = currentNewsTab->newsModel_; newsView_ = currentNewsTab->newsView_; slotUpdateNews(NewsTabWidget::RefreshWithPos); newsView_->setFocus(); int unreadCount = widget->getUnreadCount(categoriesTree_->currentItem()->text(4)); int allCount = widget->newsModel_->rowCount(); statusUnread_->setText(QString(" " + tr("Unread: %1") + " ").arg(unreadCount)); statusAll_->setText(QString(" " + tr("All: %1") + " ").arg(allCount)); statusUnread_->setVisible(widget->type_ != NewsTabWidget::TabTypeDel); statusAll_->setVisible(true); } setTextTitle(widget->newsTitleLabel_->toolTip(), widget); } /** @brief Process tab moving *----------------------------------------------------------------------------*/ void MainWindow::slotTabMoved(int fromIndex, int toIndex) { stackedWidget_->insertWidget(toIndex, stackedWidget_->widget(fromIndex)); } /** @brief Manage displaying columns in feed tree *---------------------------------------------------------------------------*/ void MainWindow::feedsColumnVisible(QAction *action) { int idx = action->data().toInt(); if (action->isChecked()) feedsView_->showColumn(idx); else feedsView_->hideColumn(idx); } void MainWindow::setNewsLayout(QAction *action) { newsLayout_ = action->data().toInt(); switch (newsLayout_) { case 1: layoutToggle_->setIcon(QIcon(":/images/layout_newspaper")); break; default: layoutToggle_->setIcon(QIcon(":/images/layout_classic")); } currentNewsTab->setNewsLayout(); } void MainWindow::setNewsLayout() { if ((newsLayout_ + 1) >= layoutGroup_->actions().count()) layoutGroup_->actions().at(0)->setChecked(true); else layoutGroup_->actions().at(newsLayout_ + 1)->setChecked(true); setNewsLayout(layoutGroup_->checkedAction()); } /** @brief Set browser position *---------------------------------------------------------------------------*/ void MainWindow::setBrowserPosition(QAction *action) { browserPosition_ = action->data().toInt(); currentNewsTab->setBrowserPosition(); } /** @brief Create tab with browser only (without news list) *---------------------------------------------------------------------------*/ QWebPage *MainWindow::createWebTab(QUrl url, const QString &overrideHtml) { NewsTabWidget *widget = new NewsTabWidget(this, NewsTabWidget::TabTypeWeb); int indexTab = addTab(widget); widget->setTextTab(tr("Loading...")); if (openNewsTab_ == NEW_TAB_FOREGROUND) { currentNewsTab = widget; emit signalSetCurrentTab(indexTab); } widget->setSettings(); widget->retranslateStrings(); openNewsTab_ = 0; if (!url.isEmpty()) { if (overrideHtml.isEmpty()) { widget->locationBar_->setText(url.toString()); widget->webView_->load(url); } else { widget->setHtmlWebView(overrideHtml, url); } } return widget->webView_->page(); } // ---------------------------------------------------------------------------- void MainWindow::creatFeedTab(int feedId, int feedParId) { QSqlQuery q; q.exec(QString("SELECT text, image, currentNews, xmlUrl FROM feeds WHERE id=='%1'"). arg(feedId)); if (q.next()) { NewsTabWidget *widget = new NewsTabWidget(this, NewsTabWidget::TabTypeFeed, feedId, feedParId); addTab(widget); widget->setSettings(); widget->retranslateStrings(); widget->setBrowserPosition(); bool isFeed = true; if (q.value(3).toString().isEmpty()) isFeed = false; // Set icon and title for tab QPixmap iconTab; QByteArray byteArray = q.value(1).toByteArray(); if (!isFeed) { iconTab.load(":/images/folder"); } else { if (byteArray.isNull() || defaultIconFeeds_) { iconTab.load(":/images/feed"); } else if (isFeed) { iconTab.loadFromData(QByteArray::fromBase64(byteArray)); } } widget->newsIconTitle_->setPixmap(iconTab); widget->setTextTab(q.value(0).toString()); QString feedIdFilter; if (feedsModel_->isFolder(feedsModel_->indexById(feedId))) { feedIdFilter = QString("(%1) AND ").arg(getIdFeedsString(feedId)); } else { feedIdFilter = QString("feedId=%1 AND ").arg(feedId); } if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsAll_") { feedIdFilter.append("deleted = 0"); } else if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsNew_") { feedIdFilter.append(QString("new = 1 AND deleted = 0")); } else if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsUnread_") { feedIdFilter.append(QString("read < 2 AND deleted = 0")); } else if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsStar_") { feedIdFilter.append(QString("starred = 1 AND deleted = 0")); } else if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsNotStarred_") { feedIdFilter.append(QString("starred = 0 AND deleted = 0")); } else if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsUnreadStar_") { feedIdFilter.append(QString("(read < 2 OR starred = 1) AND deleted = 0")); } else if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsLastDay_") { feedIdFilter.append(QString("(published >= datetime('now', '-1 day')) AND deleted = 0")); } else if (newsFilterGroup_->checkedAction()->objectName() == "filterNewsLastWeek_") { feedIdFilter.append(QString("(published >= datetime('now', '-7 day')) AND deleted = 0")); } widget->newsModel_->setFilter(feedIdFilter); if (widget->newsModel_->rowCount() != 0) { while (widget->newsModel_->canFetchMore()) widget->newsModel_->fetchMore(); } currentNewsTab->loadNewspaper(); // focus feed has displayed before int newsRow = -1; int newsId = widget->newsModel_->index(newsRow, widget->newsModel_->fieldIndex("id")).data(Qt::EditRole).toInt(); if (openingFeedAction_ == 0) { QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(index, Qt::EditRole, newsId); if (indexList.count()) newsRow = indexList.first().row(); } else if (openingFeedAction_ == 1) newsRow = 0; widget->newsView_->setCurrentIndex(widget->newsModel_->index(newsRow, widget->newsModel_->fieldIndex("title"))); if (newsRow == -1) widget->newsView_->verticalScrollBar()->setValue(newsRow); if ((openingFeedAction_ < 2) && openNewsWebViewOn_) { widget->slotNewsViewSelected(widget->newsModel_->index(newsRow, widget->newsModel_->fieldIndex("title"))); } else { widget->slotNewsViewSelected(widget->newsModel_->index(-1, widget->newsModel_->fieldIndex("title"))); QSqlQuery q; QString qStr = QString("UPDATE feeds SET currentNews='%1' WHERE id=='%2'"). arg(newsId).arg(feedId); q.exec(qStr); } } } /** @brief Open news using Enter key *---------------------------------------------------------------------------*/ void MainWindow::slotOpenNewsWebView() { if (!newsView_->hasFocus()) return; currentNewsTab->slotNewsViewSelected(newsView_->currentIndex()); } // ---------------------------------------------------------------------------- void MainWindow::slotNewsUpPressed() { currentNewsTab->slotNewsUpPressed(); } // ---------------------------------------------------------------------------- void MainWindow::slotNewsDownPressed() { currentNewsTab->slotNewsDownPressed(); } // ---------------------------------------------------------------------------- void MainWindow::slotNewsPageUpPressed() { currentNewsTab->slotNewsPageUpPressed(); } // ---------------------------------------------------------------------------- void MainWindow::slotNewsPageDownPressed() { currentNewsTab->slotNewsPageDownPressed(); } // ---------------------------------------------------------------------------- void MainWindow::markNewsRead() { currentNewsTab->markNewsRead(); } // ---------------------------------------------------------------------------- void MainWindow::markAllNewsRead() { currentNewsTab->markAllNewsRead(); } // ---------------------------------------------------------------------------- void MainWindow::markNewsStar() { currentNewsTab->markNewsStar(); } // ---------------------------------------------------------------------------- void MainWindow::deleteNews() { currentNewsTab->deleteNews(); } // ---------------------------------------------------------------------------- void MainWindow::deleteAllNewsList() { currentNewsTab->deleteAllNewsList(); } // ---------------------------------------------------------------------------- void MainWindow::restoreNews() { currentNewsTab->restoreNews(); } // ---------------------------------------------------------------------------- void MainWindow::openInBrowserNews() { currentNewsTab->openInBrowserNews(); } // ---------------------------------------------------------------------------- void MainWindow::openInExternalBrowserNews() { currentNewsTab->openInExternalBrowserNews(); } // ---------------------------------------------------------------------------- void MainWindow::slotOpenNewsNewTab() { openNewsTab_ = NEW_TAB_FOREGROUND; currentNewsTab->openNewsNewTab(); } // ---------------------------------------------------------------------------- void MainWindow::slotOpenNewsBackgroundTab() { openNewsTab_ = NEW_TAB_BACKGROUND; currentNewsTab->openNewsNewTab(); } /** @brief Copy news URL-link *----------------------------------------------------------------------------*/ void MainWindow::slotCopyLinkNews() { currentNewsTab->slotCopyLinkNews(); } void MainWindow::slotShowLabelsMenu() { currentNewsTab->showLabelsMenu(); } // ---------------------------------------------------------------------------- void MainWindow::slotPageUpWebView() { QKeyEvent *keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_PageUp, Qt::NoModifier); QApplication::sendEvent(currentNewsTab->webView_, keyEvent); } void MainWindow::slotPageDownWebView() { QKeyEvent *keyEvent = new QKeyEvent(QEvent::KeyPress, Qt::Key_PageDown, Qt::NoModifier); QApplication::sendEvent(currentNewsTab->webView_, keyEvent); } /** @brief Reload full model * @details Performs: reload model, reset proxy model, restore focus *---------------------------------------------------------------------------*/ void MainWindow::feedsModelReload(bool checkFilter) { if (checkFilter) { if (feedsFilterGroup_->checkedAction()->objectName() != "filterFeedsAll_") { setFeedsFilter(false); } slotFeedsViewportUpdate(); return; } int topRow = feedsView_->verticalScrollBar()->value(); QModelIndex feedIndex = feedsProxyModel_->mapToSource(feedsView_->currentIndex()); int feedId = feedsModel_->idByIndex(feedIndex); feedsView_->refresh(); feedIndex = feedsProxyModel_->mapFromSource(feedId); feedsView_->selectIdEn_ = false; feedsView_->setCurrentIndex(feedIndex); feedsView_->verticalScrollBar()->setValue(topRow); } // ---------------------------------------------------------------------------- void MainWindow::setCurrentTab(int index, bool updateCurrentTab) { updateCurrentTab_ = updateCurrentTab; tabBar_->setCurrentIndex(index); updateCurrentTab_ = true; } /** @brief Set focus to search field (CTRL+F) *---------------------------------------------------------------------------*/ void MainWindow::findText() { if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) currentNewsTab->findText_->setFocus(); } /** @brief Show notification on inbox news *---------------------------------------------------------------------------*/ void MainWindow::showNotification(bool bShowRecentNews/*=false*/) { Settings settings; settings.setValue("Flags/updatingFeeds", false); bool showNotify = true; if (showNotifyInactiveApp_) { showNotify = !isActiveWindow(); } NewNewsData& curNews = (bShowRecentNews ? recentNews : newNews); if (curNews.idFeedList_.isEmpty() || !showNotify || !showNotifyOn_) { clearNotification(); return; } if (fullscreenModeNotify_) { #if defined(Q_OS_WIN) HWND hWnd = GetForegroundWindow(); RECT appBounds; RECT rc; GetWindowRect(GetDesktopWindow(), &rc); if((hWnd != GetDesktopWindow()) #ifdef HAVE_QT5 && (hWnd != GetShellWindow()) #endif ) { GetWindowRect(hWnd, &appBounds); if ((rc.top == appBounds.top) && (rc.bottom == appBounds.bottom) && (rc.left == appBounds.left) && (rc.right == appBounds.right)) { return; } } #endif } timerTrayOpenNotify.stop(); if (notificationWidget != NULL) { delete notificationWidget; } notificationWidget = new NotificationWidget(curNews.idFeedList_, curNews.cntNewsList_, idColorList_, colorList_, this); if (!bShowRecentNews) { clearNotification(); } connect(notificationWidget, SIGNAL(signalShow()), this, SLOT(showWindows())); connect(notificationWidget, SIGNAL(signalClose()), this, SLOT(deleteNotification())); connect(notificationWidget, SIGNAL(signalOpenNews(int, int)), this, SLOT(slotOpenNew(int, int))); connect(notificationWidget, SIGNAL(signalOpenExternalBrowser(QUrl)), this, SLOT(slotOpenNewBrowser(QUrl))); connect(notificationWidget, SIGNAL(signalMarkRead(int,int,int)), this, SLOT(slotMarkReadNewsInNotification(int,int,int))); connect(notificationWidget, SIGNAL(signalDeleteNews(int,int)), this, SLOT(slotDeleteNewsInNotification(int,int))); connect(notificationWidget, SIGNAL(signalMarkAllRead()), this, SLOT(slotMarkAllReadNewsInNotification())); notificationWidget->show(); } /** @brief Delete notification widget *---------------------------------------------------------------------------*/ void MainWindow::deleteNotification() { notificationWidget->deleteLater(); notificationWidget = NULL; } void MainWindow::clearNotification(bool bClearRecentNews/*=false*/) { newNews.idFeedList_.clear(); newNews.cntNewsList_.clear(); if (bClearRecentNews) { recentNews.idFeedList_.clear(); recentNews.cntNewsList_.clear(); idColorList_.clear(); colorList_.clear(); } } void MainWindow::slotAddColorList(int id, const QString &color) { if (idColorList_.indexOf(id) == -1) { idColorList_.append(id); colorList_.append(color); } } /** @brief Show news on click in notification window *---------------------------------------------------------------------------*/ void MainWindow::slotOpenNew(int feedId, int newsId) { openingFeedAction_ = 0; openNewsWebViewOn_ = true; QSqlQuery q; q.exec(QString("UPDATE feeds SET currentNews='%1' WHERE id=='%2'").arg(newsId).arg(feedId)); QModelIndex feedIndex = feedsModel_->indexById(feedId); feedsView_->setCurrentIndex(feedsProxyModel_->mapFromSource(feedIndex)); feedsModel_->setData(feedsModel_->indexSibling(feedIndex, "currentNews"), newsId); if (stackedWidget_->count() && currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { currentNewsTab->newsHeader_->saveStateColumns(currentNewsTab); } // Search open tab containing this feed int indexTab = -1; for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->feedId_ == feedId) { indexTab = i; break; } } if (indexTab == -1) { if (tabBar_->currentIndex() != TAB_WIDGET_PERMANENT) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingTab, currentNewsTab); updateCurrentTab_ = false; tabBar_->setCurrentIndex(TAB_WIDGET_PERMANENT); updateCurrentTab_ = true; currentNewsTab = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); newsModel_ = currentNewsTab->newsModel_; newsView_ = currentNewsTab->newsView_; } else { if (stackedWidget_->count() && currentNewsTab->type_ != NewsTabWidget::TabTypeFeed) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingFeed, currentNewsTab); } else { // Mark previous feed Read while switching to another feed setFeedRead(NewsTabWidget::TabTypeFeed, feedIdOld_, FeedReadSwitchingFeed, 0, feedId); } categoriesTree_->setCurrentIndex(QModelIndex()); } } else { tabBar_->setCurrentIndex(indexTab); } slotFeedSelected(feedIndex); feedsView_->repaint(); feedIdOld_ = feedId; Settings settings; openingFeedAction_ = settings.value("/Settings/openingFeedAction", 0).toInt(); openNewsWebViewOn_ = settings.value("/Settings/openNewsWebViewOn", true).toBool(); showWindows(); newsView_->setFocus(); } /** @brief Open news in external browser on click in notification window *---------------------------------------------------------------------------*/ void MainWindow::slotOpenNewBrowser(const QUrl &url) { currentNewsTab->openUrl(url); } void MainWindow::slotMarkReadNewsInNotification(int feedId, int newsId, int read) { QSqlQuery q; bool showNews = false; if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { int cnt = newsModel_->rowCount(); for (int i = 0; i < cnt; ++i) { if (newsId == newsModel_->index(i, newsModel_->fieldIndex("id")).data().toInt()) { if (read == 1) { if (newsModel_->index(i, newsModel_->fieldIndex("new")).data(Qt::EditRole).toInt() == 1) { newsModel_->setData( newsModel_->index(i, newsModel_->fieldIndex("new")), 0); q.exec(QString("UPDATE news SET new=0 WHERE id=='%1'").arg(newsId)); } if (newsModel_->index(i, newsModel_->fieldIndex("read")).data(Qt::EditRole).toInt() == 0) { newsModel_->setData( newsModel_->index(i, newsModel_->fieldIndex("read")), 1); q.exec(QString("UPDATE news SET read=1 WHERE id=='%1'").arg(newsId)); } } else { if (newsModel_->index(i, newsModel_->fieldIndex("read")).data(Qt::EditRole).toInt() != 0) { newsModel_->setData( newsModel_->index(i, newsModel_->fieldIndex("read")), 0); q.exec(QString("UPDATE news SET read=0 WHERE id=='%1'").arg(newsId)); } } newsView_->viewport()->update(); showNews = true; break; } } } if (!showNews) { q.exec(QString("UPDATE news SET new=0, read='%1' WHERE id=='%2'"). arg(read).arg(newsId)); } slotUpdateStatus(feedId); recountCategoryCounts(); } void MainWindow::slotDeleteNewsInNotification(int feedId, int newsId) { mainApp->sqlQueryExec(QString("UPDATE news SET new=0, read=2, deleted=1, deleteDate='%1' WHERE id=='%2'"). arg(QDateTime::currentDateTime().toString(Qt::ISODate)). arg(newsId)); if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { for (int i = 0; i < newsModel_->rowCount(); ++i) { if (newsId == newsModel_->index(i, newsModel_->fieldIndex("id")).data().toInt()) { newsModel_->setData(newsModel_->index(i, newsModel_->fieldIndex("new")), 0); newsModel_->setData(newsModel_->index(i, newsModel_->fieldIndex("read")), 2); newsModel_->setData(newsModel_->index(i, newsModel_->fieldIndex("deleted")), 1); newsModel_->setData(newsModel_->index(i, newsModel_->fieldIndex("deleteDate")), QDateTime::currentDateTime().toString(Qt::ISODate)); newsModel_->submitAll(); while (newsModel_->canFetchMore()) newsModel_->fetchMore(); currentNewsTab->loadNewspaper(NewsTabWidget::RefreshWithPos); QModelIndex curIndex; if (i == newsModel_->rowCount()) curIndex = newsModel_->index(i-1, newsModel_->fieldIndex("title")); else if (i > newsModel_->rowCount()) curIndex = newsModel_->index(i-1, newsModel_->fieldIndex("title")); else curIndex = newsModel_->index(i, newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(curIndex); currentNewsTab->slotNewsViewSelected(curIndex); break; } } } slotUpdateStatus(feedId); recountCategoryCounts(); } void MainWindow::slotMarkAllReadNewsInNotification() { if (NotificationWidget *notificationWidget = qobject_cast(sender())) { QList idFeedList = notificationWidget->idFeedList(); QList idNewsList = notificationWidget->idNewsList(); if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { for (int i = 0; i < newsModel_->rowCount(); ++i) { if (idNewsList.contains(newsModel_->index(i, newsModel_->fieldIndex("id")).data().toInt())) { newsModel_->setData( newsModel_->index(i, newsModel_->fieldIndex("new")), 0); newsModel_->setData( newsModel_->index(i, newsModel_->fieldIndex("read")), 1); } } newsView_->viewport()->update(); } foreach (int newsId, idNewsList) { mainApp->sqlQueryExec(QString("UPDATE news SET new=0, read=1 WHERE id=='%1'"). arg(newsId)); } foreach (int feedId, idFeedList) { slotUpdateStatus(feedId); } recountCategoryCounts(); } } // ---------------------------------------------------------------------------- void MainWindow::slotFindFeeds(QString) { if (!findFeedsWidget_->isVisible()) return; setFeedsFilter(false); } // ---------------------------------------------------------------------------- void MainWindow::slotSelectFind() { slotFindFeeds(findFeeds_->text()); } // ---------------------------------------------------------------------------- void MainWindow::findFeedVisible(bool visible) { findFeedsWidget_->setVisible(visible); if (visible) { findFeeds_->setFocus(); } else { findFeeds_->clear(); // Call filter explicitly, because invisible widget don't calls it setFeedsFilter(false); } } /** @brief Totally remove news *---------------------------------------------------------------------------*/ void MainWindow::cleanUp() { CleanUpWizard *cleanUpWizard = new CleanUpWizard(this); cleanUpWizard->exec(); delete cleanUpWizard; } /** @brief Zooming in browser *---------------------------------------------------------------------------*/ void MainWindow::browserZoom(QAction *action) { if (currentNewsTab->type_ == NewsTabWidget::TabTypeDownloads) return; if (action->objectName() == "zoomInAct") { if (currentNewsTab->webView_->zoomFactor() < 5.0) currentNewsTab->webView_->setZoomFactor(currentNewsTab->webView_->zoomFactor()+0.1); } else if (action->objectName() == "zoomOutAct") { if (currentNewsTab->webView_->zoomFactor() > 0.3) currentNewsTab->webView_->setZoomFactor(currentNewsTab->webView_->zoomFactor()-0.1); } else { currentNewsTab->webView_->setZoomFactor(1); } } /** @brief Call default e-mail application to report the problem *---------------------------------------------------------------------------*/ void MainWindow::slotReportProblem() { QDesktopServices::openUrl(QUrl("https://github.com/QuiteRSS/quiterss/issues")); } /** @brief Print browser page *---------------------------------------------------------------------------*/ void MainWindow::slotPrint(QWebFrame *frame) { if (currentNewsTab->type_ == NewsTabWidget::TabTypeDownloads) return; QPrinter printer; printer.setDocName(tr("Web Page")); QPrintDialog *printDlg = new QPrintDialog(&printer); if (!frame) connect(printDlg, SIGNAL(accepted(QPrinter*)), currentNewsTab->webView_, SLOT(print(QPrinter*))); else connect(printDlg, SIGNAL(accepted(QPrinter*)), frame, SLOT(print(QPrinter*))); printDlg->exec(); printDlg->deleteLater(); } /** @brief Call print preview dialog *---------------------------------------------------------------------------*/ void MainWindow::slotPrintPreview(QWebFrame *frame) { if (currentNewsTab->type_ == NewsTabWidget::TabTypeDownloads) return; QPrinter printer; printer.setDocName(tr("Web Page")); QPrintPreviewDialog *prevDlg = new QPrintPreviewDialog(&printer); prevDlg->setWindowFlags(prevDlg->windowFlags() | Qt::WindowMaximizeButtonHint); prevDlg->resize(650, 800); if (!frame) connect(prevDlg, SIGNAL(paintRequested(QPrinter*)), currentNewsTab->webView_, SLOT(print(QPrinter*))); else connect(prevDlg, SIGNAL(paintRequested(QPrinter*)), frame, SLOT(print(QPrinter*))); prevDlg->exec(); prevDlg->deleteLater(); } // ---------------------------------------------------------------------------- void MainWindow::setFullScreen() { if (!isFullScreen()) { // hide menu menuBar()->hide(); #ifdef HAVE_X11 show(); raise(); setWindowState(windowState() | Qt::WindowFullScreen); #else setWindowState(windowState() | Qt::WindowFullScreen); #endif } else { if (showMenuBarAct_->isChecked()) menuBar()->show(); setWindowState(windowState() & ~Qt::WindowFullScreen); } } // ---------------------------------------------------------------------------- void MainWindow::setStayOnTop() { isMinimizeToTray_ = true; int state = windowState(); if (stayOnTopAct_->isChecked()) setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); else setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); if ((state & Qt::WindowFullScreen) || (state & Qt::WindowMaximized)) { Settings settings; restoreGeometry(settings.value("GeometryState").toByteArray()); } setWindowState((Qt::WindowState)state); show(); isMinimizeToTray_ = false; } void MainWindow::showMenuBar() { if (showMenuBarAct_->isChecked()) { mainMenuButton_->hide(); if (isFullScreen()) menuBar()->hide(); else menuBar()->show(); } else { mainMenuButton_->show(); menuBar()->hide(); } } /** @brief Move index after drag&drop operations * @param indexWhat index that is moving * @param indexWhere index, where to move *---------------------------------------------------------------------------*/ void MainWindow::slotMoveIndex(const QModelIndex &indexWhere, int how) { feedsView_->setCursor(Qt::WaitCursor); QModelIndexList indexList = feedsView_->selectionModel()->selectedRows(0); for (int i = 0; i < indexList.count(); i++) { QModelIndex indexWhat = feedsProxyModel_->mapToSource(indexList[i]); int feedIdWhat = feedsModel_->idByIndex(indexWhat); int feedParIdWhat = feedsModel_->paridByIndex(indexWhat); int feedIdWhere = feedsModel_->idByIndex(indexWhere); int feedParIdWhere = feedsModel_->paridByIndex(indexWhere); // Repair rowToParent QSqlQuery q; if (how == 2) { // Move to another folder QList idList; q.exec(QString("SELECT id FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(feedParIdWhat)); while (q.next()) { if (feedIdWhat != q.value(0).toInt()) idList << q.value(0).toInt(); } for (int i = 0; i < idList.count(); i++) { q.exec(QString("UPDATE feeds SET rowToParent='%1' WHERE id=='%2'"). arg(i).arg(idList.at(i))); } int rowToParent = 0; q.exec(QString("SELECT count(id) FROM feeds WHERE parentId='%1'"). arg(feedIdWhere)); if (q.next()) rowToParent = q.value(0).toInt(); q.exec(QString("UPDATE feeds SET parentId='%1', rowToParent='%2' WHERE id=='%3'"). arg(feedIdWhere).arg(rowToParent).arg(feedIdWhat)); QList categoriesList; categoriesList << feedParIdWhat << feedIdWhere; recountFeedCategories(categoriesList); } else if (feedParIdWhat == feedParIdWhere) { // Move inside folder QList idList; q.exec(QString("SELECT id FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(feedParIdWhat)); while (q.next()) { idList << q.value(0).toInt(); } int rowWhat = feedsModel_->dataField(indexWhat, "rowToParent").toInt(); int rowWhere = feedsModel_->dataField(indexWhere, "rowToParent").toInt(); if ((rowWhat < rowWhere) && (how != 1)) rowWhere--; else if (how == 1) rowWhere++; idList.insert(rowWhere, idList.takeAt(rowWhat)); for (int i = 0; i < idList.count(); i++) { q.exec(QString("UPDATE feeds SET rowToParent='%1' WHERE id=='%2'"). arg(i).arg(idList.at(i))); } } else { // Move in another folder beside feeds QList idList; q.exec(QString("SELECT id FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(feedParIdWhat)); while (q.next()) { if (feedIdWhat != q.value(0).toInt()) idList << q.value(0).toInt(); } for (int i = 0; i < idList.count(); i++) { q.exec(QString("UPDATE feeds SET rowToParent='%1' WHERE id=='%2'"). arg(i).arg(idList.at(i))); } // idList.clear(); q.exec(QString("SELECT id FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(feedParIdWhere)); while (q.next()) { idList << q.value(0).toInt(); } int rowWhere = feedsModel_->dataField(indexWhere, "rowToParent").toInt(); if (how == 1) rowWhere++; idList.insert(rowWhere, feedIdWhat); for (int i = 0; i < idList.count(); i++) { q.exec(QString("UPDATE feeds SET rowToParent='%1' WHERE id=='%2'"). arg(i).arg(idList.at(i))); } q.exec(QString("UPDATE feeds SET parentId='%1' WHERE id=='%2'"). arg(feedParIdWhere).arg(feedIdWhat)); QList categoriesList; categoriesList << feedParIdWhat << feedParIdWhere; recountFeedCategories(categoriesList); } } feedsView_->refresh(); feedsView_->setCurrentIndex(feedsProxyModel_->mapFromSource(feedIdOld_)); feedsView_->setCursor(Qt::ArrowCursor); } /** @brief Process clicks in feeds tree * @param item Item that was clicked *---------------------------------------------------------------------------*/ void MainWindow::slotCategoriesClicked(QTreeWidgetItem *item, int, bool createTab) { if (stackedWidget_->count() && currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { currentNewsTab->newsHeader_->saveStateColumns(currentNewsTab); Settings settings; settings.setValue("NewsTabSplitterState", currentNewsTab->newsTabWidgetSplitter_->saveState()); } int type = item->text(1).toInt(); NewsTabWidget::TabType tabType = static_cast(type); int indexTab = -1; if (!createTab) { for (int i = 0; i < stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->type_ == tabType) { if (widget->type_ == NewsTabWidget::TabTypeLabel) { if (widget->labelId_ == item->text(2).toInt()) { indexTab = i; break; } } else { indexTab = i; break; } } } } if (indexTab == -1) { if (createTab) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingTab, currentNewsTab); NewsTabWidget *widget = new NewsTabWidget(this, tabType); indexTab = addTab(widget); createNewsTab(indexTab); } else { feedsView_->setCurrentIndex(QModelIndex()); feedProperties_->setEnabled(false); if (tabBar_->currentIndex() != TAB_WIDGET_PERMANENT) { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingTab, currentNewsTab); QModelIndex curIndex = categoriesTree_->currentIndex(); updateCurrentTab_ = false; tabBar_->setCurrentIndex(TAB_WIDGET_PERMANENT); updateCurrentTab_ = true; categoriesTree_->setCurrentIndex(curIndex); currentNewsTab = (NewsTabWidget*)stackedWidget_->widget(TAB_WIDGET_PERMANENT); newsModel_ = currentNewsTab->newsModel_; newsView_ = currentNewsTab->newsView_; } else { setFeedRead(currentNewsTab->type_, currentNewsTab->feedId_, FeedReadSwitchingFeed, currentNewsTab); } currentNewsTab->type_ = tabType; currentNewsTab->feedId_ = -1; currentNewsTab->feedParId_ = -1; currentNewsTab->setSettings(true, false); currentNewsTab->setVisible(true); } // Set icon and title of current tab currentNewsTab->newsIconTitle_->setPixmap(item->icon(0).pixmap(16,16)); currentNewsTab->setTextTab(item->text(0)); currentNewsTab->labelId_ = item->text(2).toInt(); switch (type) { case NewsTabWidget::TabTypeUnread: currentNewsTab->categoryFilterStr_ = "feedId > 0 AND deleted = 0 AND read < 2"; break; case NewsTabWidget::TabTypeStar: currentNewsTab->categoryFilterStr_ = "feedId > 0 AND deleted = 0 AND starred = 1"; break; case NewsTabWidget::TabTypeDel: currentNewsTab->categoryFilterStr_ = "feedId > 0 AND deleted = 1"; break; case NewsTabWidget::TabTypeLabel: if (currentNewsTab->labelId_ != 0) { currentNewsTab->categoryFilterStr_ = QString("feedId > 0 AND deleted = 0 AND label LIKE '%,%1,%'"). arg(currentNewsTab->labelId_); } else { currentNewsTab->categoryFilterStr_ = QString("feedId > 0 AND deleted = 0 AND label!='' AND label!=','"); } break; } // ... add filter from "search" QString filterStr = currentNewsTab->categoryFilterStr_; QString objectName = currentNewsTab->findText_->findGroup_->checkedAction()->objectName(); if (objectName != "findInBrowserAct") { QString findText = currentNewsTab->findText_->text(); if (!findText.isEmpty()) { findText = findText.replace("'", "''").toUpper(); if (objectName == "findTitleAct") { filterStr.append( QString(" AND UPPER(title) LIKE '%%1%'").arg(findText)); } else if (objectName == "findAuthorAct") { filterStr.append( QString(" AND UPPER(author_name) LIKE '%%1%'").arg(findText)); } else if (objectName == "findCategoryAct") { filterStr.append( QString(" AND UPPER(category) LIKE '%%1%'").arg(findText)); } else if (objectName == "findContentAct") { filterStr.append( QString(" AND (UPPER(content) LIKE '%%1%' OR UPPER(description) LIKE '%%1%')"). arg(findText)); } else if (objectName == "findLinkAct") { filterStr.append( QString(" AND link_href LIKE '%%1%'"). arg(findText)); } else { filterStr.append( QString(" AND (UPPER(title) LIKE '%%1%' OR UPPER(author_name) LIKE '%%1%' " "OR UPPER(category) LIKE '%%1%' OR UPPER(content) LIKE '%%1%' " "OR UPPER(description) LIKE '%%1%')"). arg(findText)); } } } newsModel_->setFilter(filterStr); if (newsModel_->rowCount() != 0) { while (newsModel_->canFetchMore()) newsModel_->fetchMore(); } if (type == NewsTabWidget::TabTypeDel){ currentNewsTab->newsHeader_->setSortIndicator(newsModel_->fieldIndex("deleteDate"), Qt::DescendingOrder); } else { if ((currentNewsTab->newsHeader_->sortIndicatorSection() == newsModel_->fieldIndex("read")) || currentNewsTab->newsHeader_->sortIndicatorSection() == newsModel_->fieldIndex("starred")) { currentNewsTab->slotSort(currentNewsTab->newsHeader_->sortIndicatorSection(), currentNewsTab->newsHeader_->sortIndicatorOrder()); } } currentNewsTab->loadNewspaper(); // Search previous displayed news of the feed int newsRow = -1; if (openingFeedAction_ == 0) { int newsIdCur = item->text(3).toInt(); QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(index, Qt::EditRole, newsIdCur); if (!indexList.isEmpty()) newsRow = indexList.first().row(); } else if (openingFeedAction_ == 1) { newsRow = 0; } else if (openingFeedAction_ == 3) { QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("read")); QModelIndexList indexList; if (newsView_->header()->sortIndicatorOrder() == Qt::DescendingOrder) indexList = newsModel_->match(index, Qt::EditRole, 0, -1); else indexList = newsModel_->match(index, Qt::EditRole, 0); if (!indexList.isEmpty()) newsRow = indexList.last().row(); } // Display previous displayed news of the feed newsView_->setCurrentIndex(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); if (newsRow == -1) newsView_->verticalScrollBar()->setValue(newsRow); if ((openingFeedAction_ != 2) && openNewsWebViewOn_) { currentNewsTab->slotNewsViewSelected(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); } else { currentNewsTab->slotNewsViewSelected(newsModel_->index(-1, newsModel_->fieldIndex("title"))); } if (createTab) emit signalSetCurrentTab(indexTab); } else { emit signalSetCurrentTab(indexTab, true); } int unreadCount = currentNewsTab->getUnreadCount(categoriesTree_->currentItem()->text(4)); int allCount = currentNewsTab->newsModel_->rowCount(); statusUnread_->setText(QString(" " + tr("Unread: %1") + " ").arg(unreadCount)); statusAll_->setText(QString(" " + tr("All: %1") + " ").arg(allCount)); statusUnread_->setVisible(currentNewsTab->type_ != NewsTabWidget::TabTypeDel); statusAll_->setVisible(true); } void MainWindow::clearDeleted() { QSqlQuery q; q.exec("UPDATE news SET description='', content='', received='', " "author_name='', author_uri='', author_email='', " "category='', new='', read='', starred='', label='', " "deleteDate='', feedParentId='', deleted=2 WHERE deleted==1"); if (currentNewsTab->type_ == NewsTabWidget::TabTypeDel) { currentNewsTab->newsModel_->select(); currentNewsTab->slotNewsViewSelected(QModelIndex()); } recountCategoryCounts(); } void MainWindow::slotMarkReadCategory(QTreeWidgetItem *item) { int type = item->text(1).toInt(); int labelId = item->text(2).toInt(); if ((currentNewsTab->type_ == type) && (currentNewsTab->labelId_ == labelId)) { currentNewsTab->markAllNewsRead(); } else { emit signalMarkReadCategory(type, labelId); recountCategoryCounts(); } } /** @brief Show/Hide categories tree *---------------------------------------------------------------------------*/ void MainWindow::showNewsCategoriesTree() { if (categoriesTree_->isHidden()) { showCategoriesButton_->setIcon(QIcon(":/images/images/panel_hide.png")); showCategoriesButton_->setToolTip(tr("Hide Categories")); categoriesTree_->show(); feedsSplitter_->restoreState(feedsWidgetSplitterState_); } else { feedsWidgetSplitterState_ = feedsSplitter_->saveState(); showCategoriesButton_->setIcon(QIcon(":/images/images/panel_show.png")); showCategoriesButton_->setToolTip(tr("Show Categories")); categoriesTree_->hide(); QList sizes; sizes << height() << 20; feedsSplitter_->setSizes(sizes); } } /** @brief Move splitter between feeds tree and categories tree *---------------------------------------------------------------------------*/ void MainWindow::feedsSplitterMoved(int pos, int) { if (categoriesTree_->isHidden()) { int height = pos + categoriesPanel_->height() + 2; if (height < feedsSplitter_->height()) { showCategoriesButton_->setIcon(QIcon(":/images/images/panel_hide.png")); showCategoriesButton_->setToolTip(tr("Hide Categories")); categoriesTree_->show(); recountCategoryCounts(); } } } /** @brief Set specified label for news *---------------------------------------------------------------------------*/ void MainWindow::setLabelNews(QAction *action) { if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) return; newsLabelAction_->setIcon(action->icon()); newsLabelAction_->setToolTip(action->text()); newsLabelAction_->setData(action->data()); currentNewsTab->setLabelNews(action->data().toInt()); } /** @brief Set last chosen label for news *---------------------------------------------------------------------------*/ void MainWindow::setDefaultLabelNews() { if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) return; currentNewsTab->setLabelNews(newsLabelAction_->data().toInt()); } /** @brief Get Label that belong to current news *---------------------------------------------------------------------------*/ void MainWindow::getLabelNews() { for (int i = 0; i < newsLabelGroup_->actions().count(); i++) { newsLabelGroup_->actions().at(i)->setChecked(false); } if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) return; QList indexes = newsView_->selectionModel()->selectedRows( newsModel_->fieldIndex("label")); if (!indexes.count()) return; if (indexes.count() == 1) { QModelIndex index = indexes.at(0); QStringList strLabelIdList = index.data(Qt::EditRole).toString().split(",", QString::SkipEmptyParts); foreach (QString strLabelId, strLabelIdList) { for (int i = 0; i < newsLabelGroup_->actions().count(); i++) { if (newsLabelGroup_->actions().at(i)->data().toString() == strLabelId) newsLabelGroup_->actions().at(i)->setChecked(true); } } } else { for (int i = 0; i < newsLabelGroup_->actions().count(); i++) { bool check = false; QString strLabelId = newsLabelGroup_->actions().at(i)->data().toString(); for (int y = indexes.count()-1; y >= 0; --y) { QModelIndex index = indexes.at(y); QString strIdLabels = index.data(Qt::EditRole).toString(); if (!strIdLabels.contains(QString(",%1,").arg(strLabelId))) { check = false; break; } check = true; } newsLabelGroup_->actions().at(i)->setChecked(check); } } } /** @brief Add tab widget to tabs stack widget *---------------------------------------------------------------------------*/ int MainWindow::addTab(NewsTabWidget *widget) { int indexTab; if (openNewTabNextToActive_) { if (stackedWidget_->count()) tabBar_->insertTab(tabBar_->currentIndex()+1, ""); indexTab = stackedWidget_->insertWidget(stackedWidget_->currentIndex()+1, widget); } else { if (stackedWidget_->count()) tabBar_->addTab(""); indexTab = stackedWidget_->addWidget(widget); } tabBar_->setTabButton(indexTab, QTabBar::LeftSide, widget->newsTitleLabel_); return indexTab; } // ---------------------------------------------------------------------------- void MainWindow::reduceNewsList() { currentNewsTab->reduceNewsList(); } // ---------------------------------------------------------------------------- void MainWindow::increaseNewsList() { currentNewsTab->increaseNewsList(); } /** @brief Save browser current page to file *---------------------------------------------------------------------------*/ void MainWindow::slotSavePageAs() { if (currentNewsTab->type_ == NewsTabWidget::TabTypeDownloads) return; QString fileName = currentNewsTab->webView_->title(); if (newsLayout_ == 0) { if (fileName == "news_descriptions") { int row = currentNewsTab->newsView_->currentIndex().row(); fileName = currentNewsTab->newsModel_->dataField(row, "title").toString(); } } else { if (currentNewsTab->type_ == NewsTabWidget::TabTypeFeed) { QModelIndex feedIndex = feedsView_->currentIndex(); feedIndex = feedsProxyModel_->mapToSource(feedIndex); fileName = feedsModel_->dataField(feedIndex, "text").toString(); } else { fileName = categoriesTree_->currentItem()->text(0); } } QString title = fileName.trimmed(); fileName = fileName.trimmed(); fileName = fileName.replace(QzRegExp("[:\"]"), "_"); fileName = QDir::toNativeSeparators(QDir::homePath() + "/" + fileName); fileName = QFileDialog::getSaveFileName(this, tr("Save As"), fileName, QString(tr("HTML-Files (*.%1)") + ";;" + tr("Text files (*.%2)")) .arg("html").arg("txt")); if (fileName.isNull()) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) { statusBar()->showMessage(tr("Save As: can't open a file"), 3000); return; } QFileInfo fileInfo(fileName); if (fileInfo.suffix() == "txt") { file.write(currentNewsTab->webView_->page()->mainFrame()->toPlainText().toUtf8()); } else { QString html = currentNewsTab->webView_->page()->mainFrame()->toHtml(); QzRegExp reg("news_descriptions", Qt::CaseInsensitive); html = html.replace(reg, title); reg.setPattern("]+\\>"); html = html.remove(reg); QTextCodec *codec = QTextCodec::codecForHtml(html.toUtf8(), QTextCodec::codecForName("UTF-8")); file.write(codec->fromUnicode(html)); } file.close(); } void MainWindow::slotSavePageAsDescript() { currentNewsTab->savePageAsDescript(); } /** @brief Restore last deleted news *---------------------------------------------------------------------------*/ void MainWindow::restoreLastNews() { QSqlQuery q; q.exec("SELECT id, feedId FROM news WHERE deleted=1 AND deleteDate!='' ORDER BY deleteDate DESC"); if (q.next()) { QModelIndex curIndex = newsView_->currentIndex(); int newsIdCur = newsModel_->index(curIndex.row(), newsModel_->fieldIndex("id")).data().toInt(); int newsId = q.value(0).toInt(); int feedId = q.value(1).toInt(); q.exec(QString("UPDATE news SET deleted=0, deleteDate='' WHERE id=='%1'"). arg(newsId)); newsModel_->select(); while (newsModel_->canFetchMore()) newsModel_->fetchMore(); currentNewsTab->loadNewspaper(NewsTabWidget::RefreshWithPos); QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(index, Qt::EditRole, newsIdCur); if (indexList.count()) { int newsRow = indexList.first().row(); newsView_->setCurrentIndex(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); } slotUpdateStatus(feedId); recountCategoryCounts(); } } /** @brief Switch to next unread news *---------------------------------------------------------------------------*/ void MainWindow::nextUnreadNews() { if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) return; newsView_->clearSelection(); int newsRow = currentNewsTab->findUnreadNews(true); if (newsRow == -1) { if (currentNewsTab->type_ != NewsTabWidget::TabTypeFeed) return; QModelIndex indexPrevUnread = QModelIndex(); if (feedsView_->currentIndex().isValid()) indexPrevUnread = feedsView_->indexNextUnread(feedsView_->currentIndex(), 1); if (!indexPrevUnread.isValid()) { indexPrevUnread = feedsView_->indexNextUnread(QModelIndex(), 1); } if (indexPrevUnread.isValid()) { if (changeBehaviorActionNUN_) openingFeedAction_ = 4; else openingFeedAction_ = 3; feedsView_->clearSelection(); feedsView_->setCurrentIndex(indexPrevUnread); slotFeedClicked(indexPrevUnread); if (tabBar_->currentIndex() != TAB_WIDGET_PERMANENT) { QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("read")); QModelIndexList indexList; if ((newsView_->header()->sortIndicatorOrder() == Qt::DescendingOrder) && (openingFeedAction_ != 4)) indexList = newsModel_->match(index, Qt::EditRole, 0, -1); else indexList = newsModel_->match(index, Qt::EditRole, 0); if (!indexList.isEmpty()) newsRow = indexList.last().row(); // Focus feed news that displayed before newsView_->setCurrentIndex(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); if (newsRow == -1) newsView_->verticalScrollBar()->setValue(newsRow); if (openNewsWebViewOn_) { currentNewsTab->slotNewsViewSelected(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); } } Settings settings; openingFeedAction_ = settings.value("/Settings/openingFeedAction", 0).toInt(); } newsView_->setCurrentIndex(newsView_->currentIndex()); return; } int value = newsView_->verticalScrollBar()->value(); int pageStep = newsView_->verticalScrollBar()->pageStep(); if (newsRow > (value + pageStep/2)) newsView_->verticalScrollBar()->setValue(newsRow - pageStep/2); QModelIndex index = newsModel_->index(newsRow, newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(index); currentNewsTab->slotNewsViewSelected(index); } /** @brief Switch to previous unread news *---------------------------------------------------------------------------*/ void MainWindow::prevUnreadNews() { if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) return; newsView_->clearSelection(); int newsRow = currentNewsTab->findUnreadNews(false); int newsRowCur = newsView_->currentIndex().row(); if ((newsRow >= newsRowCur) || (newsRow == -1)) { if (currentNewsTab->type_ != NewsTabWidget::TabTypeFeed) return; QModelIndex indexNextUnread = feedsView_->indexNextUnread(feedsView_->currentIndex(), 2); if (indexNextUnread.isValid()) { openingFeedAction_ = 3; feedsView_->clearSelection(); feedsView_->setCurrentIndex(indexNextUnread); slotFeedClicked(indexNextUnread); Settings settings; openingFeedAction_ = settings.value("/Settings/openingFeedAction", 0).toInt(); } newsView_->setCurrentIndex(newsView_->currentIndex()); return; } int value = newsView_->verticalScrollBar()->value(); int pageStep = newsView_->verticalScrollBar()->pageStep(); if (newsRow < (value + pageStep/2)) newsView_->verticalScrollBar()->setValue(newsRow - pageStep/2); QModelIndex index = newsModel_->index(newsRow, newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(index); currentNewsTab->slotNewsViewSelected(index); } /** @brief Get feeds ids list string of folder \a idFolder *---------------------------------------------------------------------------*/ QString MainWindow::getIdFeedsString(int idFolder, int idException) { QList idList = UpdateObject::getIdFeedsInList(idFolder); if (idList.count()) { QString str; foreach (int id, idList) { if (id == idException) continue; if (!str.isEmpty()) str.append(" OR "); str.append(QString("feedId=%1").arg(id)); } return str; } else { return QString("feedId=-1"); } } /** @brief Set application title *---------------------------------------------------------------------------*/ void MainWindow::setTextTitle(const QString &text, NewsTabWidget *widget) { if (currentNewsTab != widget) return; if (text.isEmpty()) setWindowTitle("QuiteRSS"); else setWindowTitle(QString("%1 - QuiteRSS").arg(text)); } /** @brief Enable|Disable indent in feeds tree *---------------------------------------------------------------------------*/ void MainWindow::slotIndentationFeedsTree() { feedsView_->setRootIsDecorated(indentationFeedsTreeAct_->isChecked()); } // ---------------------------------------------------------------------------- void MainWindow::customizeMainToolbar() { showCustomizeToolbarDlg(customizeMainToolbarAct2_); } // ---------------------------------------------------------------------------- void MainWindow::showCustomizeToolbarDlg(QAction *action) { QToolBar *toolbar = mainToolbar_; if (action->objectName() == "customizeFeedsToolbarAct") { toolbar = feedsToolBar_; } else if (action->objectName() == "customizeNewsToolbarAct") { if (currentNewsTab->type_ == NewsTabWidget::TabTypeWeb) return; if (currentNewsTab->type_ == NewsTabWidget::TabTypeDownloads) return; toolbar = currentNewsTab->newsToolBar_; } CustomizeToolbarDialog *toolbarDlg = new CustomizeToolbarDialog(this, toolbar); toolbarDlg->exec(); delete toolbarDlg; } /** @brief Process news sharing *---------------------------------------------------------------------------*/ void MainWindow::slotShareNews(QAction *action) { currentNewsTab->slotShareNews(action); } // ---------------------------------------------------------------------------- void MainWindow::showMenuShareNews() { if (mainToolbar_->widgetForAction(shareMenuAct_)) { QWidget *widget = mainToolbar_->widgetForAction(shareMenuAct_); if (widget->underMouse()) { shareMenu_->popup(widget->mapToGlobal(QPoint(0, mainToolbar_->height()-1))); } } if (feedsToolBar_->widgetForAction(shareMenuAct_)) { QWidget *widget = feedsToolBar_->widgetForAction(shareMenuAct_); if (widget->underMouse()) { shareMenu_->popup(widget->mapToGlobal(QPoint(0, feedsToolBar_->height()-1))); } } if (currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { if (currentNewsTab->newsToolBar_->widgetForAction(shareMenuAct_)) { QWidget *widget = currentNewsTab->newsToolBar_->widgetForAction(shareMenuAct_); if (widget->underMouse()) { shareMenu_->popup(widget->mapToGlobal(QPoint(0, currentNewsTab->newsToolBar_->height()-1))); } } } if (currentNewsTab->webToolBar_->widgetForAction(shareMenuAct_)) { QWidget *widget = currentNewsTab->webToolBar_->widgetForAction(shareMenuAct_); if (widget->underMouse()) { shareMenu_->popup(widget->mapToGlobal(QPoint(0, currentNewsTab->webToolBar_->height()-1))); } } } /** @brief Open feed home page in external browser *---------------------------------------------------------------------------*/ void MainWindow::slotOpenHomeFeed() { QModelIndex index = feedsView_->currentIndex(); if (!index.isValid()) return; index = feedsProxyModel_->mapToSource(index); QString homePage = feedsModel_->dataField(index, "htmlUrl").toString(); QDesktopServices::openUrl(homePage); } /** @brief Sort feed and folders by title *---------------------------------------------------------------------------*/ void MainWindow::sortedByTitleFeedsTree() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QList parentIdsPotential; parentIdsPotential << 0; while (!parentIdsPotential.empty()) { int parentId = parentIdsPotential.takeFirst(); // Search children of parent QSqlQuery q; q.prepare(QString("SELECT id, xmlUrl FROM feeds WHERE parentId=? ORDER BY text COLLATE LOCALE")); q.addBindValue(parentId); q.exec(); // assing each child his // ... store it in prospactive parent list int rowToParent = 0; while (q.next()) { int parentIdNew = q.value(0).toInt(); QString xmlUrl = q.value(1).toString(); QSqlQuery q2; q2.prepare("UPDATE feeds SET rowToParent=? WHERE id=?"); q2.addBindValue(rowToParent); q2.addBindValue(parentIdNew); q2.exec(); if (xmlUrl.isEmpty()) parentIdsPotential << parentIdNew; ++rowToParent; } } feedsModelReload(); QApplication::restoreOverrideCursor(); } // ---------------------------------------------------------------------------- void MainWindow::showNewsMenu() { if (currentNewsTab) newsSortByMenu_->setEnabled(currentNewsTab->type_ < NewsTabWidget::TabTypeWeb); } // ---------------------------------------------------------------------------- void MainWindow::showNewsSortByMenu() { if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) return; QListIterator iter(newsSortByColumnGroup_->actions()); while (iter.hasNext()) { QAction *nextAction = iter.next(); delete nextAction; } int section = currentNewsTab->newsHeader_->sortIndicatorSection(); iter = currentNewsTab->newsHeader_->viewMenu_->actions(); while (iter.hasNext()) { QAction *nextAction = iter.next(); QAction *newsSortByColumnAct = new QAction(this); newsSortByColumnAct->setCheckable(true); newsSortByColumnAct->setText(nextAction->text()); newsSortByColumnAct->setData(nextAction->data()); if (nextAction->data().toInt() == section) { newsSortByColumnAct->setChecked(true); } newsSortByColumnGroup_->addAction(newsSortByColumnAct); } newsSortByMenu_->insertActions(newsSortByMenu_->actions().at(0), newsSortByColumnGroup_->actions()); if (currentNewsTab->newsHeader_->sortIndicatorOrder() == Qt::AscendingOrder) { newsSortOrderGroup_->actions().at(0)->setChecked(true); } else { newsSortOrderGroup_->actions().at(1)->setChecked(true); } } // ---------------------------------------------------------------------------- void MainWindow::setNewsSortByColumn() { if (currentNewsTab->type_ >= NewsTabWidget::TabTypeWeb) return; int lIdx = newsSortByColumnGroup_->checkedAction()->data().toInt(); if (newsSortOrderGroup_->actions().at(0)->isChecked()) { currentNewsTab->newsHeader_->setSortIndicator(lIdx, Qt::AscendingOrder); } else { currentNewsTab->newsHeader_->setSortIndicator(lIdx, Qt::DescendingOrder); } } // ---------------------------------------------------------------------------- void MainWindow::slotPrevFolder() { QModelIndex indexBefore = feedsView_->currentIndex(); QModelIndex indexAfter; // Set to bottom folder, if there's no above folder if (!indexBefore.isValid()) indexAfter = feedsView_->lastFolderInFolder(QModelIndex()); else indexAfter = feedsView_->indexPreviousFolder(indexBefore); // there's no "upper" index if (!indexAfter.isValid()) return; feedsView_->clearSelection(); feedsView_->setCurrentIndex(indexAfter); slotFeedClicked(indexAfter); } // ---------------------------------------------------------------------------- void MainWindow::slotNextFolder() { QModelIndex indexBefore = feedsView_->currentIndex(); QModelIndex indexAfter; // Set to top index, if there's no below index if (!indexBefore.isValid()) indexAfter = feedsView_->firstFolderInFolder(QModelIndex()); else indexAfter = feedsView_->indexNextFolder(indexBefore); // there's no "downer" index if (!indexAfter.isValid()) return; feedsView_->clearSelection(); feedsView_->setCurrentIndex(indexAfter); slotFeedClicked(indexAfter); } // ---------------------------------------------------------------------------- void MainWindow::slotExpandFolder() { QModelIndex index = feedsView_->currentIndex(); if (!feedsModel_->isFolder(index)) { index = feedsModel_->parent(index); } feedsView_->setExpanded(index, !feedsView_->isExpanded(index)); } // ---------------------------------------------------------------------------- void MainWindow::showDownloadManager(bool activate) { int indexTab = -1; NewsTabWidget *widget; for (int i = 0; i < stackedWidget_->count(); i++) { widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->type_ == NewsTabWidget::TabTypeDownloads) { indexTab = i; break; } } if (indexTab == -1) { widget = new NewsTabWidget(this, NewsTabWidget::TabTypeDownloads); indexTab = addTab(widget); QPixmap iconTab; iconTab.load(":/images/download"); widget->newsIconTitle_->setPixmap(iconTab); widget->retranslateStrings(); } if (activate) { currentNewsTab = widget; currentNewsTab->setTextTab(tr("Downloads")); statusUnread_->setVisible(false); statusAll_->setVisible(false); mainApp->downloadManager()->show(); emit signalSetCurrentTab(indexTab); } else { widget->setTextTab(tr("Downloads")); } } // ---------------------------------------------------------------------------- void MainWindow::updateInfoDownloads(const QString &text) { NewsTabWidget *widget; for (int i = 0; i < stackedWidget_->count(); i++) { widget = (NewsTabWidget*)stackedWidget_->widget(i); if (widget->type_ == NewsTabWidget::TabTypeDownloads) { widget->setTextTab(QString("%1 %2").arg(tr("Downloads")).arg(text)); break; } } } void MainWindow::setStatusFeed(int feedId, QString status) { QModelIndex index = feedsModel_->indexById(feedId); if (index.isValid()) { QModelIndex indexStatus = feedsModel_->indexSibling(index, "status"); feedsModel_->setData(indexStatus, status); feedsView_->viewport()->update(); } } void MainWindow::addOurFeed() { if (mainApp->dbFileExists()) return; QPixmap icon(":/images/quiterss16"); QByteArray iconData; QBuffer buffer(&iconData); buffer.open(QIODevice::WriteOnly); icon.save(&buffer, "PNG"); buffer.close(); QString xmlUrl = "http://quiterss.org/en/rss.xml"; if (mainApp->language() == "ru") xmlUrl = "http://quiterss.org/ru/rss.xml"; QSqlQuery q; q.prepare("INSERT INTO feeds(text, title, xmlUrl, htmlUrl, created, parentId, rowToParent, image) " "VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); q.addBindValue("QuiteRSS"); q.addBindValue("QuiteRSS"); q.addBindValue(xmlUrl); q.addBindValue("http://quiterss.org"); q.addBindValue(QDateTime::currentDateTimeUtc().toString(Qt::ISODate)); q.addBindValue(0); q.addBindValue(0); q.addBindValue(iconData.toBase64()); q.exec(); feedsModelReload(); } void MainWindow::createBackup() { QString backupDir(QDir::currentPath()); Settings settings; backupDir = settings.value("Settings/backupDir", backupDir).toString(); backupDir = QFileDialog::getExistingDirectory(this, tr("Choose Directory"), backupDir, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (!backupDir.isEmpty()) { settings.setValue("Settings/backupDir", backupDir); QFileInfo fileInfo; QString backupFileName; QString timeStr(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss")); fileInfo.setFile(mainApp->dbFileName()); backupFileName = QString("%1/%2_%3.bak"). arg(backupDir). arg(fileInfo.fileName()). arg(timeStr); QFile::copy(mainApp->dbFileName(), backupFileName); fileInfo.setFile(settings.fileName()); backupFileName = QString("%1/%2_%3.bak"). arg(backupDir). arg(fileInfo.fileName()). arg(timeStr); QFile::copy(settings.fileName(), backupFileName); } } quiterss-0.18.3/src/application/mainwindow.h000066400000000000000000000524111265173051100211050ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef MAINWINDOW_H #define MAINWINDOW_H #ifdef HAVE_QT5 #include #include #include #else #include #ifdef HAVE_PHONON #include #include #endif #endif #include #include #include #include #include #include #include #include "categoriestreewidget.h" #include "feedsmodel.h" #include "feedsview.h" #include "findfeed.h" #include "newsheader.h" #include "newsmodel.h" #include "newstabwidget.h" #include "newsview.h" #include "notificationswidget.h" #include "tabbar.h" #include "optionsdialog.h" #include "updateappdialog.h" #include "webview.h" #include "parseobject.h" #include "toolbutton.h" #define TAB_WIDGET_PERMANENT 0 #define NEW_TAB_FOREGROUND 1 #define NEW_TAB_BACKGROUND 2 #define MAX_TAB_WIDTH 150 enum FeedReedType { FeedReadSwitchingFeed, FeedReadClosingTab, FeedReadPlaceToTray, FeedReadTypeCount, FeedReadSwitchingTab }; class AdBlockIcon; class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void loadSettings(); void saveSettings(); bool showSplashScreen_; bool showTrayIcon_; bool startingTray_; bool isMinimizeToTray_; QSystemTrayIcon *traySystem; QString getIdFeedsString(int idFolder, int idException = -1); void recountCategoryCounts(); void setToolBarStyle(const QString &styleStr); void setToolBarIconSize(QToolBar *toolbar, const QString &iconSizeStr); static QStringList nameLabels() { QStringList nameLabels; nameLabels << "Important" << "Work" << "Personal" << "To Do" << "Later" << "Amusingly"; return nameLabels; } static QStringList trNameLabels() { QStringList trNameLabels; trNameLabels << tr("Important") << tr("Work") << tr("Personal") << tr("To Do") << tr("Later") << tr("Amusingly"); return trNameLabels; } QSqlDatabase db_; FeedsModel *feedsModel_; FeedsProxyModel *feedsProxyModel_; FeedsView *feedsView_; CategoriesTreeWidget *categoriesTree_; QStackedWidget *stackedWidget_; bool showFeedsTabPermanent_; NewsTabWidget *currentNewsTab; QAction *newsToolbarToggle_; QAction *browserToolbarToggle_; QAction *categoriesPanelToggle_; QAction *statusBarToggle_; QAction *newsFilter_; QAction *openDescriptionNewsAct_; QAction *openInBrowserAct_; QAction *openInExternalBrowserAct_; QAction *openNewsNewTabAct_; QAction *openNewsBackgroundTabAct_; QAction *markNewsRead_; QAction *markAllNewsRead_; QAction *markStarAct_; QAction *updateFeedAct_; QAction *deleteNewsAct_; QAction *deleteAllNewsAct_; QAction *newsKeyUpAct_; QAction *newsKeyDownAct_; QAction *newsKeyPageUpAct_; QAction *newsKeyPageDownAct_; QAction *prevUnreadNewsAct_; QAction *nextUnreadNewsAct_; QAction *autoLoadImagesToggle_; QAction *printAct_; QAction *printPreviewAct_; QAction *savePageAsAct_; QAction *savePageAsDescriptAct_; QAction *restoreNewsAct_; QAction *restoreLastNewsAct_; QAction *newsLabelAction_; QAction *newsLabelMenuAction_; QAction *showLabelsMenuAct_; QAction *findTextAct_; QAction *openHomeFeedAct_; QAction *shareMenuAct_; QAction *emailShareAct_; QAction *evernoteShareAct_; QAction *gplusShareAct_; QAction *facebookShareAct_; QAction *livejournalShareAct_; QAction *pocketShareAct_; QAction *twitterShareAct_; QAction *vkShareAct_; QAction *linkedinShareAct_; QAction *bloggerShareAct_; QAction *printfriendlyShareAct_; QAction *copyLinkAct_; QAction *pageUpWebViewAct_; QAction *pageDownWebViewAct_; QAction *nextFolderAct_; QAction *prevFolderAct_; QAction *expandFolderAct_; QAction *closeTabAct_; QAction *closeOtherTabsAct_; QAction *closeAllTabsAct_; QAction *settingPageLabelsAct_; QAction *backWebPageAct_; QAction *forwardWebPageAct_; QAction *reloadWebPageAct_; QActionGroup *newsFilterGroup_; QActionGroup *newsLabelGroup_; QActionGroup *shareGroup_; QMenu *newsLabelMenu_; QMenu *shareMenu_; QMenu *newsSortByMenu_; QString newsListFontFamily_; int newsListFontSize_; QString newsTitleFontFamily_; int newsTitleFontSize_; QString newsTextFontFamily_; int newsTextFontSize_; QString notificationFontFamily_; int notificationFontSize_; QString newsListTextColor_; QString newsListBackgroundColor_; QString newNewsTextColor_; QString unreadNewsTextColor_; QString focusedNewsTextColor_; QString focusedNewsBGColor_; QString linkColor_; QString titleColor_; QString dateColor_; QString authorColor_; QString newsTextColor_; QString newsTitleBackgroundColor_; QString newsBackgroundColor_; QString alternatingRowColors_; QString notifierTextColor_; QString notifierBackgroundColor_; QString formatDate_; QString formatTime_; bool markNewsReadOn_; bool markCurNewsRead_; int markNewsReadTime_; bool markPrevNewsRead_; bool markReadSwitchingFeed_; bool markReadClosingTab_; bool markReadMinimize_; bool showDescriptionNews_; ENewsClickAction::Type newsSingleClickAction; ENewsClickAction::Type newsDoubleClickAction; ENewsClickAction::Type newsMiddleClickAction; bool alternatingRowColorsNews_; bool simplifiedDateTime_; bool notDeleteStarred_; bool notDeleteLabeled_; bool markIdenticalNewsRead_; bool autoLoadImages_; bool openLinkInBackground_; bool isOpeningLink_; //!< Flag - link is being opened bool openLinkInBackgroundEmbedded_; int externalBrowserOn_; QString externalBrowser_; bool javaScriptEnable_; bool pluginsEnable_; int maxPagesInCache_; QString downloadLocation_; bool askDownloadLocation_; int defaultZoomPages_; int newsLayout_; int browserPosition_; QString newsFilterStr; int oldState; bool hideFeedsOpenTab_; bool showToggleFeedsTree_; bool defaultIconFeeds_; int openNewsTab_; int screenNotify_; int positionNotify_; int transparencyNotify_; int countShowNewsNotify_; int widthTitleNewsNotify_; int timeShowNewsNotify_; bool showTitlesFeedsNotify_; bool showIconFeedNotify_; bool showButtonMarkAllNotify_; bool showButtonMarkReadNotify_; bool showButtonExBrowserNotify_; bool showButtonDeleteNotify_; QList idFeedsNotifyList_; AdBlockIcon *adBlockIcon() { return adblockIcon_; } public slots: void restoreFeedsOnStartUp(); void addFeed(); void addFolder(); void deleteItemFeedsTree(); void slotImportFeeds(); void slotExportFeeds(); void slotFeedClicked(QModelIndex index); void slotFeedSelected(QModelIndex index, bool createTab = false); void setFeedsFilter(bool clicked = true); void slotGetFeed(); void slotGetAllFeeds(); void slotStopUpdate(); void showProgressBar(int addToMaximum); void slotSetValue(int value); void showMessageStatusBar(QString message, int timeout = 0); void slotCountsStatusBar(int unreadCount, int allCount); void slotPlaySound(const QString &path); void slotAddColorList(int id, const QString &color); void showOptionDlg(int index = -1); void slotPlaceToTray(); void slotActivationTray(QSystemTrayIcon::ActivationReason reason); void slotTrayOpenNotifyTimer(); void showWindows(bool trayClick = false); void quitApp(); void myEmptyWorkingSet(); void slotUpdateFeed(int feedId, bool changed, int newCount, bool finish); void slotFeedCountsUpdate(FeedCountStruct counts); void slotUpdateNews(int refresh = NewsTabWidget::RefreshInsert); void slotUpdateStatus(int feedId, bool changed = true); void setNewsFilter(QAction*, bool clicked = true); void slotCloseTab(int index); QWebPage *createWebTab(QUrl url = QUrl(), const QString &overrideHtml=""); void feedsModelReload(bool checkFilter = false); void setStatusFeed(int feedId, QString status); void slotPrint(QWebFrame *frame = 0); void slotPrintPreview(QWebFrame* frame = 0); signals: void signalPlaceToTray(); void signalGetFeedTimer(int feedId); void signalGetAllFeedsTimer(); void signalGetFeed(int feedId, QString feedUrl, QDateTime date, int auth); void signalGetFeedsFolder(QString query); void signalGetAllFeeds(); void signalStopUpdate(); void signalImportFeeds(QByteArray xmlData); void signalRequestUrl(int feedId, QString urlString, QDateTime date, QString userInfo); void faviconRequestUrl(QString urlString, QString feedUrl); void signalIconFeedReady(QString feedUrl, QByteArray faviconData); void signalSetCurrentTab(int index, bool updateTab = false); void signalShowNotification(bool bShowRecentNews=false); void signalRefreshInfoTray(); void signalNextUpdate(bool finish); void signalRecountCategoryCounts(); void signalRecountFeedCounts(int feedId, bool update = true); void setFeedRead(int readType, int feedId, int idException, QList idNewsList); void signalSetFeedRead(int readType, int feedId, int idException, QList idNewsList); void signalPlaySoundNewNews(); void signalUpdateStatus(int feedId, bool changed); void signalMarkAllFeedsRead(); void signalMarkFeedRead(int id, bool isFolder, bool openFeed); void signalRefreshNewsView(int nextUnread); void signalSetFeedsFilter(bool clicked = false); void signalMarkAllFeedsOld(); void signalMarkReadCategory(int type, int idLabel); private slots: void showMainMenu(); void slotTimerLinkOpening(); void slotVisibledFeedsWidget(); void updateIconToolBarNull(bool feedsWidgetVisible); void setFeedRead(int type, int feedId, FeedReedType feedReadType, NewsTabWidget *widgetTab = 0, int idException = -1); void markFeedRead(); void slotRecountCategoryCounts(QList deletedList, QList starredList, QList readList, QStringList labelList); void slotFeedsViewportUpdate(); void slotPlaySoundNewNews(); #ifdef HAVE_QT5 void mediaStatusChanged(QMediaPlayer::MediaStatus status); void mediaError(QMediaPlayer::Error error); #endif #ifdef HAVE_PHONON void mediaStateChanged(Phonon::State newstate, Phonon::State oldstate); #endif void slotShowAboutDlg(); void showContextMenuFeed(const QPoint & pos); void slotFeedsFilter(); void slotNewsFilter(); void slotGetFeedsTimer(); void slotShowUpdateAppDlg(); void showContextMenuToolBar(const QPoint &pos); void showFeedPropertiesDlg(); void slotFeedMenuShow(); void slotRefreshNewsView(int nextUnread = -1); void slotIconFeedPreparing(QString feedUrl, QByteArray byteArray, QString format); void slotIconFeedUpdate(int feedId, QByteArray faviconData); void showNewsFiltersDlg(bool newFilter = false); void showFilterRulesDlg(); void slotUpdateAppCheck(); void slotNewVersion(const QString &newVersion); void slotFeedUpPressed(); void slotFeedDownPressed(); void slotFeedHomePressed(); void slotFeedEndPressed(); void slotFeedPrevious(); void slotFeedNext(); void setStyleApp(QAction*); void slotSwitchFocus(); void slotSwitchPrevFocus(); void slotOpenFeedNewTab(); void slotOpenCategoryNewTab(); void slotTabCurrentChanged(int index); void slotTabMoved(int fromIndex, int toIndex); void feedsColumnVisible(QAction *action); void setNewsLayout(QAction *action); void setNewsLayout(); void setBrowserPosition(QAction *action); void slotOpenNewsWebView(); void slotNewsUpPressed(); void slotNewsDownPressed(); void slotNewsPageUpPressed(); void slotNewsPageDownPressed(); void markNewsRead(); void markAllNewsRead(); void markNewsStar(); void deleteNews(); void deleteAllNewsList(); void restoreNews(); void openInBrowserNews(); void openInExternalBrowserNews(); void slotOpenNewsNewTab(); void slotOpenNewsBackgroundTab(); void slotCopyLinkNews(); void slotShowLabelsMenu(); void slotPageUpWebView(); void slotPageDownWebView(); void setCurrentTab(int index, bool updateCurrentTab = false); void findText(); void showNotification(bool bShowRecentNews=false); void deleteNotification(); void clearNotification(bool bClearRecentNews=false); void slotOpenNew(int feedId, int newsId); void slotOpenNewBrowser(const QUrl &url); void slotMarkReadNewsInNotification(int feedId, int newsId, int read); void slotDeleteNewsInNotification(int feedId, int newsId); void slotMarkAllReadNewsInNotification(); void slotFindFeeds(QString); void slotSelectFind(); void findFeedVisible(bool visible); void browserZoom(QAction*); void slotReportProblem(); void slotSavePageAs(); void slotSavePageAsDescript(); void setFullScreen(); void setStayOnTop(); void showMenuBar(); void slotMoveIndex(const QModelIndex &indexWhere, int how); void slotRefreshInfoTray(int newCount, int unreadCount); void slotCategoriesClicked(QTreeWidgetItem *item, int, bool createTab = false); void clearDeleted(); void slotMarkReadCategory(QTreeWidgetItem *item); void showNewsCategoriesTree(); void feedsSplitterMoved(int pos, int); void setLabelNews(QAction *action); void setDefaultLabelNews(); void getLabelNews(); void setTextTitle(const QString &text, NewsTabWidget *widget); void lockMainToolbar(bool lock); void hideMainToolbar(); void reduceNewsList(); void increaseNewsList(); void restoreLastNews(); void nextUnreadNews(); void prevUnreadNews(); void slotIndentationFeedsTree(); void customizeMainToolbar(); void showCustomizeToolbarDlg(QAction *action); void slotShareNews(QAction *action); void showMenuShareNews(); void slotOpenHomeFeed(); void sortedByTitleFeedsTree(); void showNewsMenu(); void showNewsSortByMenu(); void setNewsSortByColumn(); void slotNextFolder(); void slotPrevFolder(); void slotExpandFolder(); void showDownloadManager(bool activate = true); void updateInfoDownloads(const QString &text); void cleanUp(); void showSettingPageLabels(); void createBackup(); private: void closeEvent(QCloseEvent *event); bool eventFilter(QObject *obj, QEvent *event); void changeEvent(QEvent *event); QNetworkProxy networkProxy_; void setProxy(const QNetworkProxy proxy); void createFeedsWidget(); void createNewsTab(int index); void createToolBarNull(); void createActions(); void createShortcut(); void loadActionShortcuts(); void saveActionShortcuts(); void createMenu(); void createToolBar(); void createTrayMenu(); void createStatusBar(); void createTray(); void createTabBarWidget(); void createCentralWidget(); void loadSettingsFeeds(); void retranslateStrings(); void recountFeedCategories(const QList &categoriesList); void creatFeedTab(int feedId, int feedParId); void initUpdateFeeds(); void addOurFeed(); int addTab(NewsTabWidget *widget); NewsModel *newsModel_; QMenu *mainMenu_; ToolButton *mainMenuButton_; TabBar *tabBar_; QWidget *tabBarWidget_; QSplitter *mainSplitter_; QWidget *feedsPanel_; QFrame *feedsWidget_; QWidget *centralWidget_; QList listActions_; QStringList listDefaultShortcut_; QAction *addAct_; QAction *addFeedAct_; QAction *addFeedTrayAct_; QAction *addFolderAct_; QAction *deleteFeedAct_; QAction *importFeedsAct_; QAction *exportFeedsAct_; QAction *mainToolbarToggle_; QAction *feedsToolbarToggle_; QAction *toolBarLockAct_; QAction *toolBarHideAct_; QAction *customizeMainToolbarAct_; QAction *customizeMainToolbarAct2_; QAction *customizeFeedsToolbarAct_; QAction *customizeNewsToolbarAct_; QAction *classicLayoutAct_; QAction *newspaperLayoutAct_; QAction *layoutToggle_; QAction *systemStyle_; QAction *system2Style_; QAction *greenStyle_; QAction *orangeStyle_; QAction *purpleStyle_; QAction *pinkStyle_; QAction *grayStyle_; QAction *topBrowserPositionAct_; QAction *bottomBrowserPositionAct_; QAction *rightBrowserPositionAct_; QAction *leftBrowserPositionAct_; QAction *showCleanUpWizardAct_; QAction *showDownloadManagerAct_; QAction *setNewsFiltersAct_; QAction *setFilterNewsAct_; QAction *optionsAct_; QAction *updateAllFeedsAct_; QAction *stopUpdateAct_; QAction *markAllFeedsRead_; QAction *indentationFeedsTreeAct_; QAction *sortedByTitleFeedsTreeAct_; QAction *collapseAllFoldersAct_; QAction *expandAllFoldersAct_; QAction *exitAct_; QAction *feedsFilter_; QAction *filterFeedsAll_; QAction *filterFeedsNew_; QAction *filterFeedsUnread_; QAction *filterFeedsStarred_; QAction *filterFeedsError_; QAction *filterNewsAll_; QAction *filterNewsNew_; QAction *filterNewsUnread_; QAction *filterNewsStar_; QAction *filterNewsNotStarred_; QAction *filterNewsUnreadStar_; QAction *filterNewsLastDay_; QAction *filterNewsLastWeek_; QAction *aboutAct_; QAction *updateAppAct_; QAction *reportProblemAct_; QAction *markFeedRead_; QAction *feedProperties_; QAction *showWindowAct_; QAction *feedKeyUpAct_; QAction *feedKeyDownAct_; QAction *switchFocusAct_; QAction *switchFocusPrevAct_; QAction *feedsWidgetVisibleAct_; QAction *openFeedNewTabAct_; QAction *placeToTrayAct_; QAction *zoomInAct_; QAction *zoomOutAct_; QAction *zoomTo100Act_; QActionGroup *customizeToolbarGroup_; QActionGroup *layoutGroup_; QActionGroup *styleGroup_; QActionGroup *browserPositionGroup_; QActionGroup *feedsFilterGroup_; QActionGroup *browserZoomGroup_; QActionGroup *newsSortByColumnGroup_; QActionGroup *newsSortOrderGroup_; QAction *feedsFilterAction_; //!< Filter name storage, needed to enable last used filter QAction *newsFilterAction_; //!< Filter name storege, needed to enable last used filter QString mainNewsFilter_; QAction *showUnreadCount_; QAction *showUndeleteCount_; QAction *showLastUpdated_; QActionGroup *feedsColumnsGroup_; QAction *findFeedAct_; QAction *fullScreenAct_; QAction *stayOnTopAct_; QAction *nextTabAct_; QAction *prevTabAct_; QAction *reduceNewsListAct_; QAction *increaseNewsListAct_; QAction *createBackupAct_; QAction *showMenuBarAct_; QMenu *fileMenu_; QMenu *newMenu_; QMenu *viewMenu_; QMenu *toolbarsMenu_; QMenu *customizeToolbarMenu_; QMenu *layoutMenu_; QMenu *styleMenu_; QMenu *browserPositionMenu_; QMenu *feedMenu_; QMenu *newsMenu_; QMenu *browserMenu_; QMenu *toolsMenu_; QMenu *helpMenu_; QMenu *trayMenu_; QMenu *newsContextMenu_; QMenu *feedsFilterMenu_; QMenu *newsFilterMenu_; QMenu *feedsColumnsMenu_; QMenu *browserZoomMenu_; QToolBar *mainToolbar_; QToolBar *feedsToolBar_; NewsView *newsView_; QProgressBar *progressBar_; QLabel *statusUnread_; QLabel *statusAll_; QPushButton *pushButtonNull_; QTimer *updateFeedsTimer_; int updateIntervalSec_; int updateTimeCount_; bool updateFeedsEnable_; int updateFeedsInterval_; int updateFeedsIntervalType_; QList feedIdList_; QMap updateFeedsIntervalSec_; QMap updateFeedsTimeCount_; bool minimizingTray_; bool closingTray_; bool singleClickTray_; bool clearStatusNew_; bool emptyWorking_; int behaviorIconTray_; int openingFeedAction_; bool openNewsWebViewOn_; #ifdef HAVE_QT5 QMediaPlayer *mediaPlayer_; QMediaPlaylist *playlist_; #else #ifdef HAVE_PHONON Phonon::MediaObject *mediaPlayer_; Phonon::AudioOutput *audioOutput_; #endif #endif bool soundNewNews_; QString soundNotifyPath_; bool playSoundNewNews_; bool showNotifyOn_; bool fullscreenModeNotify_; bool showNotifyInactiveApp_; bool onlySelectedFeeds_; UpdateAppDialog *updateAppDialog_; bool cleanupOnShutdown_; int maxDayCleanUp_; int maxNewsCleanUp_; bool dayCleanUpOn_; bool newsCleanUpOn_; bool readCleanUp_; bool neverUnreadCleanUp_; bool neverStarCleanUp_; bool neverLabelCleanUp_; bool cleanUpDeleted_; bool optimizeDB_; struct NewNewsData { QList idFeedList_; QList cntNewsList_; }; NewNewsData newNews; NewNewsData recentNews; QList idColorList_; QStringList colorList_; QTimer timerTrayOpenNotify; bool reopenFeedStartup_; bool openNewTabNextToActive_; bool updateCurrentTab_; NotificationWidget *notificationWidget; FindFeed *findFeeds_; QWidget *findFeedsWidget_; int feedIdOld_; int openingLinkTimeout_; //!< During this time we'll trying swithing back to apllication QTimer timerLinkOpening_; QWidget *categoriesPanel_; QLabel *categoriesLabel_; ToolButton *showCategoriesButton_; QWidget *categoriesWidget_; QSplitter *feedsSplitter_; QByteArray feedsWidgetSplitterState_; qint64 activationStateChangedTime_; bool isStartImportFeed_; bool changeBehaviorActionNUN_; bool recountCategoryCountsOn_; OptionsDialog *optionsDialog_; AdBlockIcon* adblockIcon_; }; #endif // MAINWINDOW_H quiterss-0.18.3/src/application/settings.cpp000066400000000000000000000041501265173051100211210ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "settings.h" #include QSettings *Settings::settings_ = 0; Settings::Settings() { if (!settings_->group().isEmpty()) settings_->endGroup(); } Settings::~Settings() { if (!settings_->group().isEmpty()) settings_->endGroup(); } void Settings::createSettings(const QString &fileName) { if (!fileName.isEmpty()) { settings_ = new QSettings(fileName, QSettings::IniFormat); } else { settings_ = new QSettings(QSettings::IniFormat, QSettings::UserScope, QCoreApplication::organizationName(), QCoreApplication::applicationName()); } } QSettings* Settings::getSettings() { return settings_; } void Settings::syncSettings() { settings_->sync(); } QString Settings::fileName() { return settings_->fileName(); } void Settings::beginGroup(const QString &prefix) { settings_->beginGroup(prefix); } void Settings::endGroup() { settings_->endGroup(); } void Settings::setValue(const QString &key, const QVariant &defaultValue) { settings_->setValue(key, defaultValue); } QVariant Settings::value(const QString &key, const QVariant &defaultValue) { return settings_->value(key, defaultValue); } quiterss-0.18.3/src/application/settings.h000066400000000000000000000027241265173051100205730ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef SETTINGS_H #define SETTINGS_H #include #include class Settings { public: explicit Settings(); ~Settings(); static void createSettings(const QString &fileName = QString()); static QSettings* getSettings(); static void syncSettings(); QString fileName(); void beginGroup(const QString &prefix); void endGroup(); void setValue(const QString &key, const QVariant &defaultValue = QVariant()); QVariant value(const QString &key, const QVariant &defaultValue = QVariant()); private: static QSettings* settings_; }; #endif // SETTINGS_H quiterss-0.18.3/src/application/splashscreen.cpp000066400000000000000000000037521265173051100217620ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "splashscreen.h" #include "VersionNo.h" SplashScreen::SplashScreen(const QPixmap &pixmap, Qt::WindowFlags flag) : QSplashScreen(pixmap, flag) { setFixedSize(pixmap.width(), pixmap.height()); setContentsMargins(5, 0, 5, 0); setEnabled(false); showMessage("Prepare loading... " % QString("%1").arg(STRPRODUCTVER), Qt::AlignRight | Qt::AlignTop, Qt::darkGray); setAttribute(Qt::WA_DeleteOnClose); QFont font = this->font(); font.setPixelSize(12); setFont(font); splashProgress_.setObjectName("splashProgress"); splashProgress_.setTextVisible(false); splashProgress_.setFixedHeight(10); splashProgress_.setMaximum(100); splashProgress_.setValue(10); QVBoxLayout *layout = new QVBoxLayout(); layout->addStretch(1); layout->addWidget(&splashProgress_); setLayout(layout); } void SplashScreen::setProgress(int value) { qApp->processEvents(); splashProgress_.setValue(value); showMessage("Loading: " % QString::number(value) % "% " % QString("%1").arg(STRPRODUCTVER), Qt::AlignRight | Qt::AlignTop, Qt::darkGray); } quiterss-0.18.3/src/application/splashscreen.h000066400000000000000000000023661265173051100214270ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef SPLASHSCREEN_H #define SPLASHSCREEN_H #ifdef HAVE_QT5 #include #else #include #endif class SplashScreen : public QSplashScreen { Q_OBJECT public: explicit SplashScreen(const QPixmap &pixmap = QPixmap(), Qt::WindowFlags flag = 0); void setProgress(int value); private: QProgressBar splashProgress_; }; #endif // SPLASHSCREEN_H quiterss-0.18.3/src/categoriestreewidget.cpp000066400000000000000000000131471265173051100211750ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "categoriestreewidget.h" #include "delegatewithoutfocus.h" #include "newstabwidget.h" #include CategoriesTreeWidget::CategoriesTreeWidget(QWidget * parent) : QTreeWidget(parent) , itemClicked_(0) { setObjectName("newsCategoriesTree_"); setFrameStyle(QFrame::NoFrame); setContextMenuPolicy(Qt::CustomContextMenu); setStyleSheet( QString("#newsCategoriesTree_ {border-top: 1px solid %1;}"). arg(qApp->palette().color(QPalette::Dark).name())); setColumnCount(5); setColumnHidden(1, true); setColumnHidden(2, true); setColumnHidden(3, true); header()->hide(); #ifdef HAVE_QT5 header()->setSectionResizeMode(0, QHeaderView::Stretch); header()->setSectionResizeMode(4, QHeaderView::ResizeToContents); #else header()->setResizeMode(0, QHeaderView::Stretch); header()->setResizeMode(4, QHeaderView::ResizeToContents); #endif header()->setStretchLastSection(false); DelegateWithoutFocus *itemDelegate = new DelegateWithoutFocus(this); setItemDelegate(itemDelegate); QStringList treeItem; treeItem.clear(); treeItem << "Categories" << "Type" << "Id" << "CurrentNews" << ""; setHeaderLabels(treeItem); treeItem.clear(); treeItem << tr("Unread") << QString::number(NewsTabWidget::TabTypeUnread) << "-1"; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/images/folder_unread.png")); addTopLevelItem(treeWidgetItem); treeItem.clear(); treeItem << tr("Starred") << QString::number(NewsTabWidget::TabTypeStar) << "-1"; treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/images/folder_star.png")); addTopLevelItem(treeWidgetItem); treeItem.clear(); treeItem << tr("Deleted") << QString::number(NewsTabWidget::TabTypeDel) << "-1"; treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/images/trash.png")); addTopLevelItem(treeWidgetItem); treeItem.clear(); treeItem << tr("Labels") << QString::number(NewsTabWidget::TabTypeLabel) << "0"; treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setIcon(0, QIcon(":/images/label_3")); addTopLevelItem(treeWidgetItem); QSqlQuery q; q.exec("SELECT id, name, image, currentNews, num, color_bg, color_text FROM labels ORDER BY num"); while (q.next()) { int idLabel = q.value(0).toInt(); QString nameLabel = q.value(1).toString(); QByteArray byteArray = q.value(2).toByteArray(); QString currentNews = q.value(3).toString(); QPixmap imageLabel; if (!byteArray.isNull()) imageLabel.loadFromData(byteArray); treeItem.clear(); treeItem << nameLabel << QString::number(NewsTabWidget::TabTypeLabel) << QString::number(idLabel) << currentNews; QTreeWidgetItem *childItem = new QTreeWidgetItem(treeItem); childItem->setIcon(0, QIcon(imageLabel)); childItem->setData(0, ImageRole, q.value(2)); childItem->setData(0, NumRole, q.value(4)); childItem->setData(0, colorBgRole, q.value(5)); childItem->setData(0, colorTextRole, q.value(6)); treeWidgetItem->addChild(childItem); } connect(this, SIGNAL(customContextMenuRequested(QPoint)), SLOT(showContextMenuCategory(const QPoint &))); } void CategoriesTreeWidget::mousePressEvent(QMouseEvent *event) { QModelIndex index = indexAt(event->pos()); QRect rectText = visualRect(index); if (event->buttons() & Qt::RightButton) { return; } if (!index.isValid()) return; if (!(event->pos().x() >= rectText.x())) { QTreeWidget::mousePressEvent(event); return; } if ((event->buttons() == Qt::MiddleButton)) { setCurrentIndex(index); emit signalMiddleClicked(); } else if (event->buttons() & Qt::LeftButton) { QTreeWidget::mousePressEvent(event); } } /** @brief Call context menu of the categories tree *----------------------------------------------------------------------------*/ void CategoriesTreeWidget::showContextMenuCategory(const QPoint &pos) { QModelIndex index = indexAt(pos); if (index.isValid()) { QRect rectText = visualRect(index); if (pos.x() >= rectText.x()) { itemClicked_ = itemAt(pos); QMenu menu; menu.addAction(tr("Open in New Tab"), this, SLOT(openCategoryNewTab())); if (itemClicked_ == topLevelItem(2)) { menu.addSeparator(); menu.addAction(tr("Clear 'Deleted'"), this, SIGNAL(signalClearDeleted())); } else { menu.addSeparator(); menu.addAction(tr("Mark Read"), this, SLOT(slotMarkRead())); } menu.exec(viewport()->mapToGlobal(pos)); } } } void CategoriesTreeWidget::openCategoryNewTab() { setCurrentItem(itemClicked_); emit signalMiddleClicked(); } void CategoriesTreeWidget::slotMarkRead() { emit signalMarkRead(itemClicked_); } quiterss-0.18.3/src/categoriestreewidget.h000066400000000000000000000045241265173051100206410ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef CATEGORIESTREEWIDGET_H #define CATEGORIESTREEWIDGET_H #include #ifdef HAVE_QT5 #include #else #include #endif class CategoriesTreeWidget : public QTreeWidget { Q_OBJECT public: explicit CategoriesTreeWidget(QWidget *parent = 0); enum Items {UnreadItem, StarredItem, DeletedItem, LabelsItem}; enum LabelRole {ImageRole = Qt::UserRole+1, NumRole, colorBgRole, colorTextRole}; QList getLabelListItems() const { QList items; for (int i = 0; i < topLevelItem(LabelsItem)->childCount(); ++i) { items.append(topLevelItem(LabelsItem)->child(i)); } return items; } QTreeWidgetItem* getLabelItem(int id) const { for (int i = 0; i < topLevelItem(LabelsItem)->childCount(); ++i) { QTreeWidgetItem *item = topLevelItem(LabelsItem)->child(i); if (item->text(2).toInt() == id) return item; } return 0; } int labelsCount() const { return topLevelItem(LabelsItem)->childCount(); } signals: void signalMiddleClicked(); void signalClearDeleted(); void signalMarkRead(QTreeWidgetItem *item); // void pressKeyUp(); // void pressKeyDown(); protected: virtual void mousePressEvent(QMouseEvent*); // virtual void keyPressEvent(QKeyEvent*); private slots: void showContextMenuCategory(const QPoint &pos); void openCategoryNewTab(); void slotMarkRead(); private: QTreeWidgetItem *itemClicked_; }; #endif // CATEGORIESTREEWIDGET_H quiterss-0.18.3/src/cleanupwizard.cpp000066400000000000000000000430061265173051100176310ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "cleanupwizard.h" #include "mainapplication.h" #include "database.h" #include "settings.h" #if defined(Q_OS_WIN) #include #include #endif CleanUpThread::CleanUpThread(QObject *parent) : QThread(parent) , maxDayCleanUp_(0) , maxNewsCleanUp_(0) , dayCleanUpOn_(false) , newsCleanUpOn_(false) , readCleanUp_(false) , neverUnreadCleanUp_(false) , neverStarCleanUp_(false) , neverLabelCleanUp_(false) , cleanUpDeleted_(false) , fullCleanUp_(false) , countDeleted(0) { } CleanUpThread::~CleanUpThread() { exit(); wait(); } /*virtual*/ void CleanUpThread::run() { QSqlQuery q; QString qStr; QSqlDatabase db = QSqlDatabase::database(); db.transaction(); q.exec("SELECT count(id) FROM news WHERE deleted < 2"); if (q.first()) countDeleted = q.value(0).toInt(); foreach (QString feedId, feedsIdList_) { int cntT = 0; int cntNews = 0; qStr = QString("SELECT undeleteCount FROM feeds WHERE id=='%1'"). arg(feedId); q.exec(qStr); if (q.next()) cntNews = q.value(0).toInt(); if (fullCleanUp_) q.exec(QString("DELETE FROM news WHERE feedId=='%1' AND deleted >= 2").arg(feedId)); QString qStr1 = QString("UPDATE news SET description='', content='', received='', " "author_name='', author_uri='', author_email='', " "category='', new='', read='', starred='', label='', " "deleteDate='', feedParentId='', deleted=2"); qStr = QString("SELECT id, received FROM news WHERE feedId=='%1' AND deleted = 0").arg(feedId); if (neverUnreadCleanUp_) qStr.append(" AND read!=0"); if (neverStarCleanUp_) qStr.append(" AND starred==0"); if (neverLabelCleanUp_) qStr.append(" AND (label=='' OR label==',' OR label IS NULL)"); qStr.append(" ORDER BY published"); q.exec(qStr); while (q.next()) { int newsId = q.value(0).toInt(); if (newsCleanUpOn_ && (cntT < (cntNews - maxNewsCleanUp_))) { if (fullCleanUp_) qStr = QString("DELETE FROM news WHERE id='%1'").arg(newsId); else qStr = QString("%1 WHERE id=='%2'").arg(qStr1).arg(newsId); QSqlQuery qt; qt.exec(qStr); cntT++; continue; } QDateTime dateTime = QDateTime::fromString(q.value(1).toString(), Qt::ISODate); if (dayCleanUpOn_ && (dateTime.daysTo(QDateTime::currentDateTime()) > maxDayCleanUp_)) { if (fullCleanUp_) qStr = QString("DELETE FROM news WHERE id='%1'").arg(newsId); else qStr = QString("%1 WHERE id=='%2'").arg(qStr1).arg(newsId); QSqlQuery qt; qt.exec(qStr); cntT++; continue; } if (readCleanUp_) { if (fullCleanUp_) qStr = QString("DELETE FROM news WHERE id='%1'").arg(newsId); else qStr = QString("%1 WHERE read!=0 AND id=='%2'").arg(qStr1).arg(newsId); QSqlQuery qt; qt.exec(qStr); cntT++; } } int undeleteCount = 0; qStr = QString("SELECT count(id) FROM news WHERE feedId=='%1' AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) undeleteCount = q.value(0).toInt(); int unreadCount = 0; qStr = QString("SELECT count(read) FROM news WHERE feedId=='%1' AND read==0 AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) unreadCount = q.value(0).toInt(); int newCount = 0; qStr = QString("SELECT count(new) FROM news WHERE feedId=='%1' AND new==1 AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) newCount = q.value(0).toInt(); qStr = QString("UPDATE feeds SET unread='%1', newCount='%2', undeleteCount='%3' WHERE id=='%4'"). arg(unreadCount).arg(newCount).arg(undeleteCount).arg(feedId); q.exec(qStr); } foreach (int folderIdStart, foldersIdList_) { if (folderIdStart < 1) continue; int categoryId = folderIdStart; // Process all parents while (0 < categoryId) { int unreadCount = -1; int undeleteCount = -1; int newCount = -1; // Calculate sum of all feeds with same parent qStr = QString("SELECT sum(unread), sum(undeleteCount), sum(newCount) " "FROM feeds WHERE parentId=='%1'").arg(categoryId); q.exec(qStr); if (q.next()) { unreadCount = q.value(0).toInt(); undeleteCount = q.value(1).toInt(); newCount = q.value(2).toInt(); } if (unreadCount != -1) { qStr = QString("UPDATE feeds SET unread='%1', undeleteCount='%2', newCount='%3' WHERE id=='%4'"). arg(unreadCount).arg(undeleteCount).arg(newCount).arg(categoryId); q.exec(qStr); } // go to next parent's parent qStr = QString("SELECT parentId FROM feeds WHERE id=='%1'"). arg(categoryId); categoryId = 0; q.exec(qStr); if (q.next()) categoryId = q.value(0).toInt(); } } if (cleanUpDeleted_) { q.exec("UPDATE news SET description='', content='', received='', " "author_name='', author_uri='', author_email='', " "category='', new='', read='', starred='', label='', " "deleteDate='', feedParentId='', deleted=2 WHERE deleted==1"); } q.exec("SELECT count(id) FROM news WHERE deleted < 2"); if (q.first()) countDeleted = countDeleted - q.value(0).toInt(); q.finish(); db.commit(); if (!mainApp->storeDBMemory()) { db.exec("VACUUM"); } else { Database::sqliteDBMemFile(); Database::setVacuum(); } } CleanUpWizard::CleanUpWizard(QWidget *parent) : QWizard(parent) , selectedPage_(true) , itemNotChecked_(false) { setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Clean Up")); setWizardStyle(QWizard::ModernStyle); setOptions(QWizard::NoBackButtonOnStartPage); setMinimumWidth(440); setMinimumHeight(380); addPage(createChooseFeedsPage()); addPage(createCleanUpOptionsPage()); Settings settings; restoreGeometry(settings.value("CleanUpWizard/geometry").toByteArray()); cleanUpThread_ = new CleanUpThread(this); connect(button(QWizard::FinishButton), SIGNAL(clicked()), this, SLOT(finishButtonClicked())); connect(this, SIGNAL(currentIdChanged(int)), SLOT(currentIdChanged(int))); } CleanUpWizard::~CleanUpWizard() { Settings settings; settings.setValue("CleanUpWizard/geometry", saveGeometry()); } /*virtual*/ void CleanUpWizard::closeEvent(QCloseEvent* event) { if (progressBar_->isVisible()) event->ignore(); } QWizardPage *CleanUpWizard::createChooseFeedsPage() { QWizardPage *page = new QWizardPage; page->setTitle(tr("Choose Feeds")); Settings settings; QStringList feedsIdList = settings.value("CleanUpWizard/feedsIdList").toStringList(); feedsTree_ = new QTreeWidget(this); feedsTree_->setObjectName("feedsTreeFR"); feedsTree_->setColumnCount(3); feedsTree_->setColumnHidden(1, true); feedsTree_->setColumnHidden(2, true); feedsTree_->setHeaderHidden(true); QStringList treeItem; treeItem << tr("All Feeds") << "0"<< "-1"; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); if (feedsIdList.isEmpty()) treeWidgetItem->setCheckState(0, Qt::Checked); else treeWidgetItem->setCheckState(0, Qt::Unchecked); feedsTree_->addTopLevelItem(treeWidgetItem); QSqlQuery q; QQueue parentIds; parentIds.enqueue(0); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); QString qStr = QString("SELECT text, id, image, xmlUrl FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(parentId); q.exec(qStr); while (q.next()) { QString feedText = q.value(0).toString(); QString feedIdStr = q.value(1).toString(); QByteArray byteArray = q.value(2).toByteArray(); QString xmlUrl = q.value(3).toString(); treeItem.clear(); treeItem << feedText << feedIdStr << (xmlUrl.isEmpty() ? "0" : "1"); treeWidgetItem = new QTreeWidgetItem(treeItem); if (feedsIdList.contains(feedIdStr) || feedsIdList.isEmpty()) treeWidgetItem->setCheckState(0, Qt::Checked); else treeWidgetItem->setCheckState(0, Qt::Unchecked); QPixmap iconItem; if (xmlUrl.isEmpty()) { iconItem.load(":/images/folder"); } else { MainWindow *mainWindow = mainApp->mainWindow(); if (byteArray.isNull() || mainWindow->defaultIconFeeds_) { iconItem.load(":/images/feed"); } else { iconItem.loadFromData(QByteArray::fromBase64(byteArray)); } } treeWidgetItem->setIcon(0, iconItem); QList treeItems = feedsTree_->findItems(QString::number(parentId), Qt::MatchFixedString | Qt::MatchRecursive, 1); treeItems.at(0)->addChild(treeWidgetItem); if (xmlUrl.isEmpty()) parentIds.enqueue(feedIdStr.toInt()); } } feedsTree_->expandAll(); connect(feedsTree_, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(feedItemChanged(QTreeWidgetItem*,int))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(feedsTree_); page->setLayout(layout); return page; } QWizardPage *CleanUpWizard::createCleanUpOptionsPage() { QWizardPage *page = new QWizardPage; page->setTitle(tr("Clean Up Options")); dayCleanUpOn_ = new QCheckBox(tr("Maximum age of news in days to keep:")); maxDayCleanUp_ = new QSpinBox(); maxDayCleanUp_->setEnabled(false); maxDayCleanUp_->setRange(0, 9999); connect(dayCleanUpOn_, SIGNAL(toggled(bool)), maxDayCleanUp_, SLOT(setEnabled(bool))); newsCleanUpOn_ = new QCheckBox(tr("Maximum number of news to keep:")); maxNewsCleanUp_ = new QSpinBox(); maxNewsCleanUp_->setEnabled(false); maxNewsCleanUp_->setRange(0, 9999); connect(newsCleanUpOn_, SIGNAL(toggled(bool)), maxNewsCleanUp_, SLOT(setEnabled(bool))); readCleanUp_ = new QCheckBox(tr("Delete read news")); neverUnreadCleanUp_ = new QCheckBox(tr("Never delete unread news")); neverStarCleanUp_ = new QCheckBox(tr("Never delete starred news")); neverLabelCleanUp_ = new QCheckBox(tr("Never delete labeled news")); QGridLayout *cleanUpFeedsLayout = new QGridLayout(); cleanUpFeedsLayout->setColumnStretch(1, 1); cleanUpFeedsLayout->addWidget(dayCleanUpOn_, 0, 0, 1, 1); cleanUpFeedsLayout->addWidget(maxDayCleanUp_, 0, 1, 1, 1, Qt::AlignLeft); cleanUpFeedsLayout->addWidget(newsCleanUpOn_, 1, 0, 1, 1); cleanUpFeedsLayout->addWidget(maxNewsCleanUp_, 1, 1, 1, 1, Qt::AlignLeft); cleanUpFeedsLayout->addWidget(readCleanUp_, 2, 0, 1, 1); cleanUpFeedsLayout->addWidget(neverUnreadCleanUp_, 3, 0, 1, 1); cleanUpFeedsLayout->addWidget(neverStarCleanUp_, 4, 0, 1, 1); cleanUpFeedsLayout->addWidget(neverLabelCleanUp_, 5, 0, 1, 1); cleanUpDeleted_ = new QCheckBox(tr("Clean up 'Deleted'")); fullCleanUp_ = new QCheckBox(tr("Purge DB")); QVBoxLayout *fullCleanUpDescriptionLayout = new QVBoxLayout; fullCleanUpDescriptionLayout->setContentsMargins(15, 0, 0, 0); fullCleanUpDescriptionLayout->addWidget( new QLabel(tr("Totally remove records that had marked 'deleted' from DB.\n" "Ancient news could reappear"))); progressBar_ = new QProgressBar(this); progressBar_->setObjectName("progressBar_"); progressBar_->setTextVisible(false); progressBar_->setFixedHeight(15); progressBar_->setMinimum(0); progressBar_->setMaximum(0); progressBar_->setVisible(false); Settings settings; settings.beginGroup("CleanUpWizard"); maxDayCleanUp_->setValue(settings.value("maxDay", 30).toInt()); maxNewsCleanUp_->setValue(settings.value("maxNews", 200).toInt()); dayCleanUpOn_->setChecked(settings.value("maxDayOn", true).toBool()); newsCleanUpOn_->setChecked(settings.value("maxNewsOn", true).toBool()); readCleanUp_->setChecked(settings.value("readCleanUp", false).toBool()); neverUnreadCleanUp_->setChecked(settings.value("neverUnread", true).toBool()); neverStarCleanUp_->setChecked(settings.value("neverStar", true).toBool()); neverLabelCleanUp_->setChecked(settings.value("neverLabel", true).toBool()); cleanUpDeleted_->setChecked(settings.value("cleanUpDeleted", true).toBool()); fullCleanUp_->setChecked(settings.value("fullCleanUp", false).toBool()); settings.endGroup(); QVBoxLayout *layout = new QVBoxLayout(page); layout->addLayout(cleanUpFeedsLayout); layout->addSpacing(10); layout->addWidget(cleanUpDeleted_); layout->addSpacing(10); layout->addWidget(fullCleanUp_); layout->addLayout(fullCleanUpDescriptionLayout); layout->addStretch(1); layout->addWidget(progressBar_); return page; } /*virtual*/ bool CleanUpWizard::validateCurrentPage() { if (!selectedPage_) { return false; } return true; } void CleanUpWizard::feedItemChanged(QTreeWidgetItem *item, int column) { if ((column != 0) || itemNotChecked_) return; itemNotChecked_ = true; if (item->checkState(0) == Qt::Unchecked) { setCheckStateItem(item, Qt::Unchecked); QTreeWidgetItem *parentItem = item->parent(); while (parentItem) { parentItem->setCheckState(0, Qt::Unchecked); parentItem = parentItem->parent(); } } else { setCheckStateItem(item, Qt::Checked); } itemNotChecked_ = false; } void CleanUpWizard::setCheckStateItem(QTreeWidgetItem *item, Qt::CheckState state) { for(int i = 0; i < item->childCount(); ++i) { QTreeWidgetItem *childItem = item->child(i); childItem->setCheckState(0, state); setCheckStateItem(childItem, state); } } void CleanUpWizard::currentIdChanged(int idPage) { if (idPage == 1) selectedPage_ = false; else selectedPage_ = true; } void CleanUpWizard::finishButtonClicked() { button(QWizard::BackButton)->setEnabled(false); button(QWizard::CancelButton)->setEnabled(false); button(QWizard::FinishButton)->setEnabled(false); page(1)->setEnabled(false); progressBar_->show(); qApp->processEvents(); feedsTree_->expandAll(); QStringList feedsIdList; QList foldersIdList; QTreeWidgetItem *treeItem = feedsTree_->itemBelow(feedsTree_->topLevelItem(0)); while (treeItem) { if (treeItem->checkState(0) == Qt::Checked) feedsIdList << treeItem->text(1); if (treeItem->text(2).toInt() == 0) foldersIdList << treeItem->text(1).toInt(); treeItem = feedsTree_->itemBelow(treeItem); } cleanUpThread_->maxDayCleanUp_ = maxDayCleanUp_->value(); cleanUpThread_->maxNewsCleanUp_ = maxNewsCleanUp_->value(); cleanUpThread_->dayCleanUpOn_ = dayCleanUpOn_->isChecked(); cleanUpThread_->newsCleanUpOn_ = newsCleanUpOn_->isChecked(); cleanUpThread_->readCleanUp_ = readCleanUp_->isChecked(); cleanUpThread_->neverUnreadCleanUp_ = neverUnreadCleanUp_->isChecked(); cleanUpThread_->neverStarCleanUp_ = neverStarCleanUp_->isChecked(); cleanUpThread_->neverLabelCleanUp_ = neverLabelCleanUp_->isChecked(); cleanUpThread_->cleanUpDeleted_ = cleanUpDeleted_->isChecked(); cleanUpThread_->fullCleanUp_ = fullCleanUp_->isChecked(); cleanUpThread_->feedsIdList_ = feedsIdList; cleanUpThread_->foldersIdList_ = foldersIdList; connect(cleanUpThread_, SIGNAL(finished()), this, SLOT(finishCleanUp())); cleanUpThread_->start(); } void CleanUpWizard::finishCleanUp() { int feedId = -1; MainWindow *mainWindow = mainApp->mainWindow(); feedsTree_->expandAll(); QTreeWidgetItem *treeItem = feedsTree_->itemBelow(feedsTree_->topLevelItem(0)); while (treeItem) { if (treeItem->checkState(0) == Qt::Checked) { if (mainWindow->currentNewsTab->feedId_ == treeItem->text(1).toInt()) feedId = treeItem->text(1).toInt(); } treeItem = feedsTree_->itemBelow(treeItem); } if (feedId != -1) mainWindow->slotUpdateNews(NewsTabWidget::RefreshAll); mainWindow->slotUpdateStatus(feedId, false); mainWindow->feedsModelReload(); mainWindow->recountCategoryCounts(); Settings settings; settings.beginGroup("CleanUpWizard"); settings.setValue("feedsIdList", cleanUpThread_->feedsIdList_); settings.setValue("maxDay", maxDayCleanUp_->value()); settings.setValue("maxNews", maxNewsCleanUp_->value()); settings.setValue("maxDayOn", dayCleanUpOn_->isChecked()); settings.setValue("maxNewsOn", newsCleanUpOn_->isChecked()); settings.setValue("readCleanUp", readCleanUp_->isChecked()); settings.setValue("neverUnread", neverUnreadCleanUp_->isChecked()); settings.setValue("neverStar", neverStarCleanUp_->isChecked()); settings.setValue("neverLabel", neverLabelCleanUp_->isChecked()); settings.setValue("cleanUpDeleted", cleanUpDeleted_->isChecked()); settings.setValue("fullCleanUp", fullCleanUp_->isChecked()); settings.endGroup(); selectedPage_ = true; accept(); QMessageBox::information(0, tr("Information"), tr("Clean Up wizard deleted %1 news"). arg(cleanUpThread_->countDeleted)); } quiterss-0.18.3/src/cleanupwizard.h000066400000000000000000000050071265173051100172750ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef CLEANUPWIZARD_H #define CLEANUPWIZARD_H #ifdef HAVE_QT5 #include #else #include #endif #include #include class CleanUpThread; class CleanUpThread : public QThread { Q_OBJECT public: explicit CleanUpThread(QObject *parent); ~CleanUpThread(); int maxDayCleanUp_; int maxNewsCleanUp_; bool dayCleanUpOn_; bool newsCleanUpOn_; bool readCleanUp_; bool neverUnreadCleanUp_; bool neverStarCleanUp_; bool neverLabelCleanUp_; bool cleanUpDeleted_; bool fullCleanUp_; QStringList feedsIdList_; QList foldersIdList_; int countDeleted; protected: virtual void run(); }; class CleanUpWizard : public QWizard { Q_OBJECT public: explicit CleanUpWizard(QWidget *parent); ~CleanUpWizard(); public slots: void finishCleanUp(); protected: virtual void closeEvent(QCloseEvent*); virtual bool validateCurrentPage(); private slots: void currentIdChanged(int); void finishButtonClicked(); void feedItemChanged(QTreeWidgetItem *item, int column); void setCheckStateItem(QTreeWidgetItem *item, Qt::CheckState state); private: QWizardPage *createChooseFeedsPage(); QWizardPage *createCleanUpOptionsPage(); bool selectedPage_; bool itemNotChecked_; QTreeWidget *feedsTree_; QCheckBox *dayCleanUpOn_; QSpinBox *maxDayCleanUp_; QCheckBox *newsCleanUpOn_; QSpinBox *maxNewsCleanUp_; QCheckBox *readCleanUp_; QCheckBox *neverUnreadCleanUp_; QCheckBox *neverStarCleanUp_; QCheckBox *neverLabelCleanUp_; QCheckBox *cleanUpDeleted_; QCheckBox *fullCleanUp_; QProgressBar *progressBar_; CleanUpThread *cleanUpThread_; }; #endif // CLEANUPWIZARD_H quiterss-0.18.3/src/common/000077500000000000000000000000001265173051100155425ustar00rootroot00000000000000quiterss-0.18.3/src/common/common.cpp000066400000000000000000000114161265173051100175410ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "common.h" #include #if defined Q_OS_WIN #include #else #include #include #endif bool Common::removePath(const QString &path) { bool result = true; QFileInfo info(path); if (info.isDir()) { QDir dir(path); foreach (const QString &entry, dir.entryList(QDir::AllDirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot)) { result &= removePath(dir.absoluteFilePath(entry)); } if (!info.dir().rmdir(info.fileName())) return false; } else { result = QFile::remove(path); } return result; } /** @brief Matches domain (assumes both pattern and domain not starting with dot) * @param pattern = domain to be matched * @param domain = site domain *----------------------------------------------------------------------------*/ bool Common::matchDomain(const QString &pattern, const QString &domain) { if (pattern == domain) { return true; } if (!domain.endsWith(pattern)) { return false; } int index = domain.indexOf(pattern); return index > 0 && domain[index - 1] == QLatin1Char('.'); } QString Common::filterCharsFromFilename(const QString &name) { QString value = name; value.replace(QLatin1Char('/'), QLatin1Char('-')); value.remove(QLatin1Char('\\')); value.remove(QLatin1Char(':')); value.remove(QLatin1Char('*')); value.remove(QLatin1Char('?')); value.remove(QLatin1Char('"')); value.remove(QLatin1Char('<')); value.remove(QLatin1Char('>')); value.remove(QLatin1Char('|')); return value; } QString Common::ensureUniqueFilename(const QString &name, const QString &appendFormat) { if (!QFile::exists(name)) { return name; } QString tmpFileName = name; int i = 1; while (QFile::exists(tmpFileName)) { tmpFileName = name; int index = tmpFileName.lastIndexOf(QLatin1Char('.')); QString appendString = appendFormat.arg(i); if (index == -1) { tmpFileName.append(appendString); } else { tmpFileName = tmpFileName.left(index) + appendString + tmpFileName.mid(index); } i++; } return tmpFileName; } /** Create backup copy of file * * Backup filename format: * __.bak * @param oldFilename absolute path of file to backup * @param oldVersion version of file to backup *----------------------------------------------------------------------------*/ void Common::createFileBackup(const QString &oldFilename, const QString &oldVersion) { QFileInfo fileInfo(oldFilename); // Create backup folder inside DB-file folder QDir backupDir(fileInfo.absoluteDir()); if (!backupDir.exists("backup")) backupDir.mkpath("backup"); backupDir.cd("backup"); // Delete old files QStringList fileNameList = backupDir.entryList(QStringList(QString("%1*").arg(fileInfo.fileName())), QDir::Files, QDir::Time); int count = 0; foreach (QString fileName, fileNameList) { count++; if (count >= 4) { QFile::remove(backupDir.absolutePath() + '/' + fileName); } } // Create backup QString backupFilename(backupDir.absolutePath() + '/' + fileInfo.fileName()); backupFilename.append(QString("_%1_%2.bak") .arg(oldVersion) .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd_hh-mm-ss"))); QFile::copy(oldFilename, backupFilename); } QString Common::readAllFileContents(const QString &filename) { return QString::fromUtf8(readAllFileByteContents(filename)); } QByteArray Common::readAllFileByteContents(const QString &filename) { QFile file(filename); if (!filename.isEmpty() && file.open(QFile::ReadOnly)) { const QByteArray a = file.readAll(); file.close(); return a; } return QByteArray(); } void Common::sleep(int ms) { #if defined(Q_OS_WIN) Sleep(DWORD(ms)); #else struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; nanosleep(&ts, NULL); #endif } quiterss-0.18.3/src/common/common.h000066400000000000000000000037401265173051100172070ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef COMMON_H #define COMMON_H #include #include #define ADBLOCK_EASYLIST_URL "https://easylist-downloads.adblockplus.org/easylist.txt" #ifndef Q_UNLIKELY #define Q_UNLIKELY(x) x #endif #ifndef QSL #if QT_VERSION >= 0x050000 #define QSL(x) QStringLiteral(x) #else #define QSL(x) QLatin1String(x) #endif #endif #ifndef QL1S #define QL1S(x) QLatin1String(x) #endif #ifndef QL1C #define QL1C(x) QLatin1Char(x) #endif namespace Common { #if defined(Q_OS_WIN) || defined(Q_OS_OS2) static const QString Qz_RAWVCS = "https://raw.githubusercontent.com/QupZilla/qupzilla/v1.8"; #endif bool removePath(const QString &path); bool matchDomain(const QString &pattern, const QString &domain); QString filterCharsFromFilename(const QString &name); QString ensureUniqueFilename(const QString &name, const QString &appendFormat = QString("(%1)")); void createFileBackup(const QString &oldFilename, const QString &oldVersion); QString readAllFileContents(const QString &filename); QByteArray readAllFileByteContents(const QString &filename); void sleep(int ms); } #endif // COMMON_H quiterss-0.18.3/src/common/delegatewithoutfocus.cpp000066400000000000000000000025071265173051100225100ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "delegatewithoutfocus.h" DelegateWithoutFocus::DelegateWithoutFocus(QObject *parent) :QStyledItemDelegate(parent) { } void DelegateWithoutFocus::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItemV4 opt = option; opt.state &= ~QStyle::State_HasFocus; QStyledItemDelegate::paint(painter,opt,index); } quiterss-0.18.3/src/common/delegatewithoutfocus.h000066400000000000000000000023501265173051100221510ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef DELEGATEWITHOUTFOCUS_H #define DELEGATEWITHOUTFOCUS_H #include class DelegateWithoutFocus: public QStyledItemDelegate { void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; public: DelegateWithoutFocus(QObject *parent); }; #endif // DELEGATEWITHOUTFOCUS_H quiterss-0.18.3/src/common/dialog.cpp000066400000000000000000000031571265173051100175130ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "dialog.h" Dialog::Dialog(QWidget *parent, Qt::WindowFlags flag) : QDialog(parent, flag) { pageLayout = new QVBoxLayout(); pageLayout->setContentsMargins(10, 10, 10, 5); pageLayout->setSpacing(5); buttonBox = new QDialogButtonBox(); buttonsLayout = new QHBoxLayout(); buttonsLayout->setMargin(10); buttonsLayout->addWidget(buttonBox); QFrame *line = new QFrame(); line->setFrameStyle(QFrame::HLine | QFrame::Sunken); mainLayout = new QVBoxLayout(); mainLayout->setMargin(0); mainLayout->setSpacing(0); mainLayout->addLayout(pageLayout, 1); mainLayout->addWidget(line); mainLayout->addLayout(buttonsLayout); setLayout(mainLayout); connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); } quiterss-0.18.3/src/common/dialog.h000066400000000000000000000023531265173051100171550ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef DIALOG_H #define DIALOG_H #ifdef HAVE_QT5 #include #else #include #endif class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent, Qt::WindowFlags flag = 0); QVBoxLayout *mainLayout; QVBoxLayout *pageLayout; QHBoxLayout *buttonsLayout; QDialogButtonBox *buttonBox; }; #endif // DIALOG_H quiterss-0.18.3/src/common/lineedit.cpp000066400000000000000000000065321265173051100200510ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /**************************************************************************** ** ** Copyright (c) 2007 Trolltech ASA ** ** Use, modification and distribution is allowed without limitation, ** warranty, liability or support of any kind. ** ****************************************************************************/ #include "lineedit.h" #include #include LineEdit::LineEdit(QWidget *parent, const QString &text) : QLineEdit(parent) , textLabel_(0) { clearButton = new QToolButton(this); clearButton->setFocusPolicy(Qt::NoFocus); QPixmap pixmap(":/images/editClear"); clearButton->setIcon(QIcon(pixmap)); clearButton->setIconSize(pixmap.size()); clearButton->setCursor(Qt::ArrowCursor); clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clearButton->hide(); if (!text.isEmpty()) { textLabel_ = new QLabel(this); textLabel_->setStyleSheet("QLabel { color: gray; }"); textLabel_->setText(text); } connect(clearButton, SIGNAL(clicked()), this, SLOT(slotClear())); connect(this, SIGNAL(textChanged(const QString&)), SLOT(updateClearButton(const QString&))); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); setStyleSheet(QString("QLineEdit { padding-right: %1px; }"). arg(clearButton->sizeHint().width() + frameWidth + 1)); QSize msz = minimumSizeHint(); setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2)); } void LineEdit::resizeEvent(QResizeEvent *) { QSize sz; int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); if (textLabel_) { sz = textLabel_->sizeHint(); textLabel_->move(frameWidth+3, (rect().bottom() + 1 - sz.height())/2); } sz = clearButton->sizeHint(); clearButton->move(rect().right() - frameWidth - sz.width(), (rect().bottom() + 1 - sz.height())/2); } void LineEdit::focusInEvent(QFocusEvent *event) { if (textLabel_) textLabel_->setVisible(false); QLineEdit::focusInEvent(event); } void LineEdit::focusOutEvent(QFocusEvent *event) { if (text().isEmpty() && textLabel_) textLabel_->setVisible(true); QLineEdit::focusOutEvent(event); } void LineEdit::updateClearButton(const QString& text) { clearButton->setVisible(!text.isEmpty()); } void LineEdit::slotClear() { clear(); emit signalClear(); } quiterss-0.18.3/src/common/lineedit.h000066400000000000000000000033721265173051100175150ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /**************************************************************************** ** ** Copyright (c) 2007 Trolltech ASA ** ** Use, modification and distribution is allowed without limitation, ** warranty, liability or support of any kind. ** ****************************************************************************/ #ifndef LINEEDIT_H #define LINEEDIT_H #include #include class QToolButton; class LineEdit : public QLineEdit { Q_OBJECT public: LineEdit(QWidget *parent = 0, const QString &text = ""); QLabel *textLabel_; signals: void signalClear(); protected: void resizeEvent(QResizeEvent *); void focusInEvent(QFocusEvent *event); void focusOutEvent(QFocusEvent *event); private slots: void updateClearButton(const QString &text); void slotClear(); private: QToolButton *clearButton; }; #endif // LIENEDIT_H quiterss-0.18.3/src/common/toolbutton.cpp000066400000000000000000000011251265173051100204560ustar00rootroot00000000000000#include "toolbutton.h" #ifdef Q_OS_MAC ToolButton::ToolButton(QWidget *parent) : QPushButton(parent) , autoRise_(false) , buttonFixedSize_(18, 18) { } void ToolButton::setIconSize(const QSize &size) { QPushButton::setIconSize(size); buttonFixedSize_ = QSize(size.width() + 2, size.height() + 2); } void ToolButton::setAutoRaise(bool enable) { autoRise_ = enable; setFlat(enable); if (enable) { setFixedSize(buttonFixedSize_); } } bool ToolButton::autoRaise() const { return autoRise_; } #else ToolButton::ToolButton(QWidget *parent) : QToolButton(parent) { } #endif quiterss-0.18.3/src/common/toolbutton.h000066400000000000000000000010001265173051100201130ustar00rootroot00000000000000#ifndef TOOLBUTTON_H #define TOOLBUTTON_H #include #include #ifdef Q_OS_MAC class ToolButton : public QPushButton { Q_OBJECT public: explicit ToolButton(QWidget *parent = 0); void setIconSize(const QSize &size); void setAutoRaise(bool enable); bool autoRaise() const; private: bool autoRise_; QSize buttonFixedSize_; }; #else class ToolButton : public QToolButton { Q_OBJECT public: explicit ToolButton(QWidget *parent = 0); }; #endif #endif // TOOLBUTTON_H quiterss-0.18.3/src/customizetoolbardialog.cpp000066400000000000000000000430471265173051100215530ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "customizetoolbardialog.h" #include "mainapplication.h" #include "settings.h" CustomizeToolbarDialog::CustomizeToolbarDialog(QWidget *parent, QToolBar *toolbar) : Dialog(parent), toolbar_(toolbar) { setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setMinimumWidth(400); setMinimumHeight(400); Settings settings; QString iconStr; if (toolbar_->objectName() == "ToolBar_General") { setWindowTitle(tr("Customize Main Toolbar")); iconStr = settings.value("Settings/toolBarIconSize", "toolBarIconNormal_").toString(); } else if (toolbar_->objectName() == "feedsToolBar") { setWindowTitle(tr("Customize Feeds Toolbar")); iconStr = settings.value("Settings/feedsToolBarIconSize", "toolBarIconSmall_").toString(); } else if (toolbar_->objectName() == "newsToolBar") { setWindowTitle(tr("Customize News Toolbar")); iconStr = settings.value("Settings/newsToolBarIconSize", "toolBarIconSmall_").toString(); } shortcutTree_ = new QTreeWidget(this); shortcutTree_->setObjectName("actionTree"); shortcutTree_->setIndentation(0); shortcutTree_->setColumnCount(2); shortcutTree_->setColumnHidden(1, true); shortcutTree_->setSortingEnabled(false); shortcutTree_->setHeaderHidden(true); #ifdef HAVE_QT5 shortcutTree_->header()->setSectionResizeMode(0, QHeaderView::Stretch); #else shortcutTree_->header()->setResizeMode(0, QHeaderView::Stretch); #endif QStringList treeItem; treeItem << "Action" << "ObjectName"; shortcutTree_->setHeaderLabels(treeItem); QListIterator iter(toolbar_->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if ((pAction->objectName() == "restoreNewsAct") || (pAction->objectName() == "separatorRAct")) { continue; } treeItem.clear(); treeItem << pAction->text().remove("&") << pAction->objectName(); QTreeWidgetItem *item = new QTreeWidgetItem(treeItem); if (pAction->icon().isNull()) item->setIcon(0, QIcon(":/images/images/noicon.png")); else { if (pAction->objectName() == "autoLoadImagesToggle") { item->setIcon(0, QIcon(":/images/imagesOn")); item->setText(0, tr("Load images")); } else if ((pAction->objectName() == "feedsFilter") || (pAction->objectName() == "newsFilter")) { item->setIcon(0, QIcon(":/images/filterOn")); } else item->setIcon(0, pAction->icon()); } if (pAction->objectName().isEmpty()) { item->setText(0, tr("Separator")); item->setText(1, "Separator"); item->setBackground(0, qApp->palette().brush(QPalette::Midlight)); } shortcutTree_->addTopLevelItem(item); } styleBox_ = new QComboBox(this); treeItem.clear(); treeItem << tr("Icon") << tr("Text") << tr("Text Beside Icon") << tr("Text Under Icon"); styleBox_->addItems(treeItem); QString styleStr = settings.value("Settings/toolBarStyle", "toolBarStyleTuI_").toString(); if (styleStr == "toolBarStyleI_") { styleBox_->setCurrentIndex(0); } else if (styleStr == "toolBarStyleT_") { styleBox_->setCurrentIndex(1); } else if (styleStr == "toolBarStyleTbI_") { styleBox_->setCurrentIndex(2); } else { styleBox_->setCurrentIndex(3); } iconBox_ = new QComboBox(this); treeItem.clear(); treeItem << tr("Big") << tr("Normal") << tr("Small"); iconBox_->addItems(treeItem); if (iconStr == "toolBarIconBig_") { iconBox_->setCurrentIndex(0); } else if (iconStr == "toolBarIconSmall_") { iconBox_->setCurrentIndex(2); } else { iconBox_->setCurrentIndex(1); } QHBoxLayout *iconLayout = new QHBoxLayout(); iconLayout->addWidget(new QLabel(tr("Icon Size:"))); iconLayout->addWidget(iconBox_); QWidget *iconWidget = new QWidget(this); iconWidget->setLayout(iconLayout); QHBoxLayout *styleLayout = new QHBoxLayout(); styleLayout->addWidget(new QLabel(tr("Style:"))); styleLayout->addWidget(styleBox_); QWidget *styleWidget = new QWidget(this); styleWidget->setLayout(styleLayout); QHBoxLayout *settingsLayout = new QHBoxLayout(); settingsLayout->setMargin(0); settingsLayout->addWidget(iconWidget); settingsLayout->addSpacing(10); settingsLayout->addWidget(styleWidget); settingsLayout->addStretch(); if (toolbar_->objectName() != "ToolBar_General") { styleWidget->hide(); } QVBoxLayout *mainVLayout = new QVBoxLayout(); mainVLayout->addWidget(shortcutTree_, 1); mainVLayout->addLayout(settingsLayout); addButtonMenu_ = new QMenu(this); addButton_ = new QPushButton(tr("Add")); addButton_->setMenu(addButtonMenu_); connect(addButtonMenu_, SIGNAL(aboutToShow()), this, SLOT(showMenuAddButton())); connect(addButtonMenu_, SIGNAL(triggered(QAction*)), this, SLOT(addShortcut(QAction*))); removeButton_ = new QPushButton(tr("Remove")); removeButton_->setEnabled(false); connect(removeButton_, SIGNAL(clicked()), this, SLOT(removeShortcut())); moveUpButton_ = new QPushButton(tr("Move up")); moveUpButton_->setEnabled(false); connect(moveUpButton_, SIGNAL(clicked()), this, SLOT(moveUpShortcut())); moveDownButton_ = new QPushButton(tr("Move down")); moveDownButton_->setEnabled(false); connect(moveDownButton_, SIGNAL(clicked()), this, SLOT(moveDownShortcut())); QPushButton *defaultButton = new QPushButton(tr("Default")); connect(defaultButton, SIGNAL(clicked()), this, SLOT(defaultShortcut())); QVBoxLayout *buttonsVLayout = new QVBoxLayout(); buttonsVLayout->addWidget(addButton_); buttonsVLayout->addWidget(removeButton_); buttonsVLayout->addSpacing(10); buttonsVLayout->addWidget(moveUpButton_); buttonsVLayout->addWidget(moveDownButton_); buttonsVLayout->addStretch(); QHBoxLayout *mainlayout = new QHBoxLayout(); mainlayout->setMargin(0); mainlayout->addLayout(mainVLayout); mainlayout->addLayout(buttonsVLayout); pageLayout->addLayout(mainlayout); buttonsLayout->insertWidget(0, defaultButton); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(acceptDialog())); connect(shortcutTree_, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotCurrentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*))); connect(this, SIGNAL(finished(int)), this, SLOT(closeDialog())); restoreGeometry(settings.value("customizeToolbarDlg/geometry").toByteArray()); } void CustomizeToolbarDialog::acceptDialog() { Settings settings; MainWindow *mainWindow = mainApp->mainWindow(); if (toolbar_->objectName() == "newsToolBar") { for (int i = 0; i < mainWindow->stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)mainWindow->stackedWidget_->widget(i); QListIterator iter(widget->newsToolBar_->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) { delete pAction; } } widget->newsToolBar_->clear(); } } else { QListIterator iter(toolbar_->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (pAction->objectName().isEmpty()) { delete pAction; } } toolbar_->clear(); } QString str; for (int i = 0; i < shortcutTree_->topLevelItemCount(); i++) { if (!str.isEmpty()) str.append(","); if (shortcutTree_->topLevelItem(i)->text(1) == "Separator") { str.append("Separator"); continue; } QListIterator iter(mainWindow->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (!pAction->icon().isNull()) { if (pAction->objectName() == shortcutTree_->topLevelItem(i)->text(1)) { str.append(pAction->objectName()); break; } } } } if (toolbar_->objectName() != "newsToolBar") { foreach (QString actionStr, str.split(",", QString::SkipEmptyParts)) { if (actionStr == "Separator") { toolbar_->addSeparator(); } else { QListIterator iter(mainWindow->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (!pAction->icon().isNull()) { if (pAction->objectName() == actionStr) { toolbar_->addAction(pAction); break; } } } } } } if (toolbar_->objectName() == "ToolBar_General") { settings.setValue("Settings/mainToolBar", str); switch (styleBox_->currentIndex()) { case 0: str = "toolBarStyleI_"; break; case 1: str = "toolBarStyleT_"; break; case 2: str = "toolBarStyleTbI_"; break; default: str = "toolBarStyleTuI_"; } settings.setValue("Settings/toolBarStyle", str); mainWindow->setToolBarStyle(str); switch (iconBox_->currentIndex()) { case 0: str = "toolBarIconBig_"; break; case 2: str = "toolBarIconSmall_"; break; default: str = "toolBarIconNormal_"; } settings.setValue("Settings/toolBarIconSize", str); mainWindow->setToolBarIconSize(toolbar_, str); } else if (toolbar_->objectName() == "feedsToolBar") { settings.setValue("Settings/feedsToolBar2", str); switch (iconBox_->currentIndex()) { case 0: str = "toolBarIconBig_"; break; case 2: str = "toolBarIconSmall_"; break; default: str = "toolBarIconNormal_"; } settings.setValue("Settings/feedsToolBarIconSize", str); mainWindow->setToolBarIconSize(toolbar_, str); } else if (toolbar_->objectName() == "newsToolBar") { settings.setValue("Settings/newsToolBar", str); for (int i = 0; i < mainWindow->stackedWidget_->count(); i++) { NewsTabWidget *widget = (NewsTabWidget*)mainWindow->stackedWidget_->widget(i); foreach (QString actionStr, str.split(",", QString::SkipEmptyParts)) { if (actionStr == "Separator") { widget->newsToolBar_->addSeparator(); } else { QListIterator iter(mainWindow->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (!pAction->icon().isNull()) { if (pAction->objectName() == actionStr) { widget->newsToolBar_->addAction(pAction); break; } } } } } widget->newsToolBar_->addAction(widget->separatorRAct_); widget->newsToolBar_->addAction(mainWindow->restoreNewsAct_); switch (iconBox_->currentIndex()) { case 0: str = "toolBarIconBig_"; break; case 2: str = "toolBarIconSmall_"; break; default: str = "toolBarIconNormal_"; } settings.setValue("Settings/newsToolBarIconSize", str); mainWindow->setToolBarIconSize(widget->newsToolBar_, str); } } accept(); } void CustomizeToolbarDialog::closeDialog() { Settings settings; settings.setValue("customizeToolbarDlg/geometry", saveGeometry()); } void CustomizeToolbarDialog::slotCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *) { if (shortcutTree_->indexOfTopLevelItem(current) == 0) moveUpButton_->setEnabled(false); else moveUpButton_->setEnabled(true); if (shortcutTree_->indexOfTopLevelItem(current) == (shortcutTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); else moveDownButton_->setEnabled(true); if (shortcutTree_->indexOfTopLevelItem(current) < 0) { removeButton_->setEnabled(false); moveUpButton_->setEnabled(false); moveDownButton_->setEnabled(false); } else { removeButton_->setEnabled(true); } } void CustomizeToolbarDialog::showMenuAddButton() { addButtonMenu_->clear(); QListIterator iter(mainApp->mainWindow()->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if ((pAction->objectName() == "restoreNewsAct") || pAction->objectName().contains("labelAction_")) continue; if (!pAction->icon().isNull()) { QList treeItems = shortcutTree_->findItems(pAction->objectName(), Qt::MatchFixedString, 1); if (!treeItems.count()) { QAction *action = addButtonMenu_->addAction(pAction->icon(), pAction->text()); action->setObjectName(pAction->objectName()); if (pAction->objectName() == "autoLoadImagesToggle") { action->setIcon(QIcon(":/images/imagesOn")); action->setText(tr("Load images")); } else if ((pAction->objectName() == "feedsFilter") || (pAction->objectName() == "newsFilter")) { action->setIcon(QIcon(":/images/filterOn")); } else action->setIcon(pAction->icon()); } } } addButtonMenu_->addSeparator(); QAction *action = addButtonMenu_->addAction(QIcon(":/images/images/noicon.png"), tr("Separator")); action->setObjectName("Separator"); } void CustomizeToolbarDialog::addShortcut(QAction *action) { QStringList treeItem; treeItem << action->text().remove("&") << action->objectName(); QTreeWidgetItem *item = new QTreeWidgetItem(treeItem); item->setIcon(0, action->icon()); if (action->objectName() == "Separator") item->setBackground(0, qApp->palette().brush(QPalette::Midlight)); shortcutTree_->addTopLevelItem(item); } void CustomizeToolbarDialog::removeShortcut() { int row = shortcutTree_->currentIndex().row(); shortcutTree_->takeTopLevelItem(row); if (shortcutTree_->currentIndex().row() == 0) moveUpButton_->setEnabled(false); if (shortcutTree_->currentIndex().row() == (shortcutTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); } void CustomizeToolbarDialog::moveUpShortcut() { int row = shortcutTree_->currentIndex().row(); QTreeWidgetItem *treeWidgetItem = shortcutTree_->takeTopLevelItem(row-1); shortcutTree_->insertTopLevelItem(row, treeWidgetItem); if (shortcutTree_->currentIndex().row() == 0) moveUpButton_->setEnabled(false); if (shortcutTree_->currentIndex().row() != (shortcutTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(true); } void CustomizeToolbarDialog::moveDownShortcut() { int row = shortcutTree_->currentIndex().row(); QTreeWidgetItem *treeWidgetItem = shortcutTree_->takeTopLevelItem(row+1); shortcutTree_->insertTopLevelItem(row, treeWidgetItem); if (shortcutTree_->currentIndex().row() != 0) moveUpButton_->setEnabled(true); if (shortcutTree_->currentIndex().row() == (shortcutTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); } void CustomizeToolbarDialog::defaultShortcut() { shortcutTree_->clear(); QString actionListStr; if (toolbar_->objectName() == "ToolBar_General") { actionListStr = "newAct,Separator,updateFeedAct,updateAllFeedsAct," "Separator,markFeedRead,Separator,autoLoadImagesToggle"; } else if (toolbar_->objectName() == "feedsToolBar") { actionListStr = "findFeedAct,feedsFilter"; } else if (toolbar_->objectName() == "newsToolBar") { actionListStr = "markNewsRead,markAllNewsRead,Separator,markStarAct," "newsLabelAction,shareMenuAct,openInExternalBrowserAct,Separator," "nextUnreadNewsAct,prevUnreadNewsAct,Separator," "newsFilter,Separator,deleteNewsAct"; } foreach (QString actionStr, actionListStr.split(",", QString::SkipEmptyParts)) { QStringList treeItem; if (actionStr == "Separator") { QTreeWidgetItem *item = new QTreeWidgetItem(treeItem); item->setText(0, tr("Separator")); item->setText(1, "Separator"); item->setIcon(0, QIcon(":/images/images/noicon.png")); item->setBackground(0, qApp->palette().brush(QPalette::Midlight)); shortcutTree_->addTopLevelItem(item); } else { QListIterator iter(mainApp->mainWindow()->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (!pAction->icon().isNull()) { if (pAction->objectName() == actionStr) { treeItem << pAction->text().remove("&") << pAction->objectName(); QTreeWidgetItem *item = new QTreeWidgetItem(treeItem); if (pAction->icon().isNull()) item->setIcon(0, QIcon(":/images/images/noicon.png")); else { if (pAction->objectName() == "autoLoadImagesToggle") { item->setIcon(0, QIcon(":/images/imagesOn")); item->setText(0, tr("Load images")); } else if ((pAction->objectName() == "feedsFilter") || (pAction->objectName() == "newsFilter")) { item->setIcon(0, QIcon(":/images/filterOn")); } else item->setIcon(0, pAction->icon()); } shortcutTree_->addTopLevelItem(item); break; } } } } } styleBox_->setCurrentIndex(3); iconBox_->setCurrentIndex(1); } quiterss-0.18.3/src/customizetoolbardialog.h000066400000000000000000000033021265173051100212060ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef CUSTOMIZETOOLBARDIALOG_H #define CUSTOMIZETOOLBARDIALOG_H #include "dialog.h" class CustomizeToolbarDialog : public Dialog { Q_OBJECT public: explicit CustomizeToolbarDialog(QWidget *parent, QToolBar *toolbar); private slots: void acceptDialog(); void closeDialog(); void showMenuAddButton(); void addShortcut(QAction *action); void removeShortcut(); void moveUpShortcut(); void moveDownShortcut(); void defaultShortcut(); void slotCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *); private: QToolBar *toolbar_; QTreeWidget *shortcutTree_; QComboBox *styleBox_; QComboBox *iconBox_; QMenu *addButtonMenu_; QPushButton *addButton_; QPushButton *removeButton_; QPushButton *moveUpButton_; QPushButton *moveDownButton_; }; #endif // CUSTOMIZETOOLBARDIALOG_H quiterss-0.18.3/src/database/000077500000000000000000000000001265173051100160165ustar00rootroot00000000000000quiterss-0.18.3/src/database/database.cpp000066400000000000000000000527441265173051100203020ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "database.h" #include "common.h" #include "mainapplication.h" #include "mainwindow.h" #include "settings.h" #include "VersionNo.h" #include "sqlitedriver.h" #include const int versionDB = 17; const QString kCreateFeedsTableQuery( "CREATE TABLE feeds(" "id integer primary key, " "text varchar, " // Feed text (replaces title at the moment) "title varchar, " // Feed title "description varchar, " // Feed description "xmlUrl varchar, " // URL-link of the feed "htmlUrl varchar, " // URL-link site, that contains the feed "language varchar, " // Feed language "copyrights varchar, " // Feed copyrights "author_name varchar, " // Feed author: name "author_email varchar, " // e-mail "author_uri varchar, " // personal web page "webMaster varchar, " // e-mail of feed's technical support "pubdate varchar, " // Feed publication timestamp "lastBuildDate varchar, " // Timestamp of last modification of the feed "category varchar, " // Categories of content of the feed "contributor varchar, " // Feed contributors (tab separated) "generator varchar, " // Application has used to generate the feed "docs varchar, " // URL-link to document describing RSS-standart "cloud_domain varchar, " // Web-service providing rssCloud interface "cloud_port varchar, " // . "cloud_path varchar, " // . "cloud_procedure varchar, " // . "cloud_protocal varchar, " // . "ttl integer, " // Time in minutes the feed can be cached "skipHours varchar, " // Tip for aggregators, not to update the feed (specify hours of the day that can be skipped) "skipDays varchar, " // Tip for aggregators, not to update the feed (specify day of the week that can be skipped) "image blob, " // gif, jpeg, png picture, that can be associated with the feed "unread integer, " // number of unread news "newCount integer, " // number of new news "currentNews integer, " // current displayed news "label varchar, " // user purpose label(s) "undeleteCount integer, " // number of all news (not marked deleted) "tags varchar, " // user purpose tags // --- Categories --- "hasChildren integer default 0, " // Children presence. Default - none "parentId integer default 0, " // parent id of the feed. Default - tree root "rowToParent integer, " // sequence number relative to parent // --- General --- "updateIntervalEnable int, " // auto update enable flag "updateInterval int, " // auto update interval "updateIntervalType varchar, " // auto update interval type(minutes, hours,...) "updateOnStartup int, " // update the feed on application startup "displayOnStartup int, " // show the feed in separate tab in application startup // --- Reading --- "markReadAfterSecondsEnable int, " // Enable "Read" timer "markReadAfterSeconds int, " // Number of seconds that must elapse to mark news "Read" "markReadInNewspaper int, " // mark Read when Newspaper layout "markDisplayedOnSwitchingFeed int, " // mark Read on switching to another feed "markDisplayedOnClosingTab int, " // mark Read on tab closing "markDisplayedOnMinimize int, " // mark Read on minimizing to tray // --- Display --- "layout text, " // news display layout "filter text, " // news display filter "groupBy int, " // column number to sort by "displayNews int, " // 0 - display content from news; 1 - download content from link "displayEmbeddedImages integer default 1, " // display images embedded in news "loadTypes text, " // type of content to load ("images" or "images sounds" - images only or images and sound) "openLinkOnEmptyContent int, " // load link, if content is empty // --- Columns --- "columns text, " // columns list and order of the news displayed in list "sort text, " // column name to sort by "sortType int, " // sort type (ascend, descend) // --- Clean Up --- "maximumToKeep int, " // maximum number of news to keep "maximumToKeepEnable int, " // enable limitation "maximumAgeOfNews int, " // maximum store time of the news "maximumAgoOfNewEnable int, " // enable limitation "deleteReadNews int, " // delete read news "neverDeleteUnreadNews int, " // don't delete unread news "neverDeleteStarredNews int, " // don't delete starred news "neverDeleteLabeledNews int, " // don't delete labeled news // --- Status --- "status text, " // last update result "created text, " // feed creation timestamp "updated text, " // last update timestamp "lastDisplayed text, " // last display timestamp "f_Expanded integer default 1, " // expand folder flag "flags text, " // more flags (example "focused", "hidden") "authentication integer default 0, " // enable authentification, sets on feed creation "duplicateNewsMode integer default 0, " // news duplicates process mode "typeFeed integer default 0, " // reserved for future purposes "showNotification integer default 0, " // "disableUpdate integer default 0, " // disable update feed "javaScriptEnable integer default 1, " // // version 16 "layoutDirection integer default 0, " // 0 - ltr; 1 - rtl // Version 17 "SingleClickAction integer default 0, " // ENewsClickAction "DoubleClickAction integer default 0, " // ENewsClickAction "MiddleClickAction integer default 0 " // ENewsClickAction ")"); const QString kCreateNewsTableQuery( "CREATE TABLE news(" "id integer primary key, " "feedId integer, " // feed id from feed table "guid varchar, " // news unique number "guidislink varchar default 'true', " // flag shows that news unique number is URL-link to news "description varchar, " // brief description "content varchar, " // full content (atom) "title varchar, " // title "published varchar, " // publish timestamp "modified varchar, " // modification timestamp "received varchar, " // receive news timestamp (set on receive) "author_name varchar, " // author name "author_uri varchar, " // author web page (atom) "author_email varchar, " // author e-mail (atom) "category varchar, " // category. May be several item tabs separated "label varchar, " // label (user purpose label(s)) "new integer default 1, " // Flag "new". Set on receive, reset on application close "read integer default 0, " // Flag "read". Set after news has been focused "starred integer default 0, " // Flag "sticky". Set by user "deleted integer default 0, " // Flag "deleted". News is marked deleted by remains in DB, // for purpose not to display after next update. // News are deleted by cleanup process only "attachment varchar, " // Links to attachments (tabs separated) "comments varchar, " // News comments page URL-link "enclosure_length, " // Media-object, associated to news: "enclosure_type, " // length, type, "enclosure_url, " // URL-address "source varchar, " // source, incese of republication (atom: ) "link_href varchar, " // URL-link to news (atom: ) "link_enclosure varchar, " // URL-link to huge amoun of data, // that can't be received in the news "link_related varchar, " // URL-link for related data of the news (atom) "link_alternate varchar, " // URL-link to alternative news representation "contributor varchar, " // contributors (tabs separated) "rights varchar, " // copyrights "deleteDate varchar, " // news delete timestamp "feedParentId integer default 0 " // parent feed id from feed table ")"); const QString kCreateFiltersTable( "CREATE TABLE filters(" "id integer primary key, " "name varchar, " // filter name "type integer, " // filter type (and, or, for all) "feeds varchar, " // feed list, that are using the filter "enable integer default 1, " // 1 - filter used; 0 - filter not used "num integer " // Sequence number. Used to sort filters ")"); const QString kCreateFilterConditionsTable( "CREATE TABLE filterConditions(" "id integer primary key, " "idFilter int, " // filter Id "field varchar, " // field to filter by "condition varchar, " // condition has applied to filed "content varchar " // field content that is used by filter ")"); const QString kCreateFilterActionsTable( "CREATE TABLE filterActions(" "id integer primary key, " "idFilter int, " // filter Id "action varchar, " // action that has appled for filter "params varchar " // action parameters ")"); const QString kCreateLabelsTable( "CREATE TABLE labels(" "id integer primary key, " "name varchar, " // label name "image blob, " // label image "color_text varchar, " // news text color displayed in news list "color_bg varchar, " // news background color displayed in news list "num integer, " // sequence number to sort with "currentNews integer " // current displayed news ")"); const QString kCreatePasswordsTable( "CREATE TABLE passwords(" "id integer primary key, " "server varchar, " // server "username varchar, " // username "password varchar " // password ")"); int Database::version() { return versionDB; } void Database::initialization() { prepareDatabase(); SQLiteDriver *driver = new SQLiteDriver(); QSqlDatabase db = QSqlDatabase::addDatabase(driver); if (mainApp->storeDBMemory()) db.setDatabaseName(":memory:"); else db.setDatabaseName(mainApp->dbFileName()); if (db.open()) { setPragma(db); if (mainApp->storeDBMemory()) { sqliteDBMemFile(false); } } } void Database::setPragma(QSqlDatabase &db) { QSqlQuery q(db); q.setForwardOnly(true); q.exec("PRAGMA encoding = \"UTF-8\""); // q.exec("PRAGMA synchronous = FULL"); // q.exec("PRAGMA journal_mode = MEMORY"); // q.exec("PRAGMA temp_store = MEMORY"); q.exec("PRAGMA page_size = 4096"); q.exec("PRAGMA cache_size = 16384"); q.finish(); } void Database::prepareDatabase() { { QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "initialization"); db.setDatabaseName(mainApp->dbFileName()); if (!db.open()) { QString message = QString("Cannot open SQLite database! \n" "Error: %1").arg(db.lastError().text()); qCritical() << message; QMessageBox::critical(0, QObject::tr("Error"), message); } else { setPragma(db); QSqlQuery q(db); q.setForwardOnly(true); if (!mainApp->dbFileExists()) { qWarning() << "Creating database"; createTables(db); createLabels(db); q.prepare("INSERT INTO info(name, value) VALUES ('version', :version)"); q.bindValue(":version", version()); q.exec(); q.prepare("INSERT INTO info(name, value) VALUES('appVersion', :appVersion)"); q.bindValue(":appVersion", STRPRODUCTVER); q.exec(); } else { qWarning() << "Preparation database"; // Version DB > 0.12.1 Settings settings; int dbVersion = -1; q.exec("SELECT value FROM info WHERE name='version'"); if (q.first()) { dbVersion = q.value(0).toInt(); } QString appVersion = QString(); q.exec("SELECT value FROM info WHERE name='appVersion'"); if (q.first()) { appVersion = q.value(0).toString(); } // Create backups for DB and Settings if (appVersion != STRPRODUCTVER) { Common::createFileBackup(mainApp->dbFileName(), appVersion); Common::createFileBackup(settings.fileName(), appVersion); } if (dbVersion < 14) { q.exec("ALTER TABLE feeds ADD COLUMN showNotification integer default 0"); q.exec("ALTER TABLE feeds ADD COLUMN disableUpdate integer default 0"); q.exec("ALTER TABLE feeds ADD COLUMN javaScriptEnable integer default 1"); } if (dbVersion < 16) { q.exec("ALTER TABLE feeds ADD COLUMN layoutDirection integer default 0"); } if (dbVersion < 17) { q.exec("ALTER table feeds ADD COLUMN SingleClickAction integer default 0"); q.exec("ALTER table feeds ADD COLUMN DoubleClickAction integer default 0"); q.exec("ALTER table feeds ADD COLUMN MiddleClickAction integer default 0"); } // Update appVersion anyway if (appVersion.isEmpty()) { q.prepare("INSERT INTO info(name, value) VALUES('appVersion', :appVersion)"); q.bindValue(":appVersion", STRPRODUCTVER); q.exec(); } else if (appVersion != STRPRODUCTVER) { q.prepare("UPDATE info SET value=:appVersion WHERE name='appVersion'"); q.bindValue(":appVersion", STRPRODUCTVER); q.exec(); } if (dbVersion == -1) { q.prepare("INSERT INTO info(name, value) VALUES('version', :version)"); q.bindValue(":version", version()); q.exec(); } else if (dbVersion < version()) { q.prepare("UPDATE info SET value=:version WHERE name='version'"); q.bindValue(":version", version()); q.exec(); } settings.setValue("VersionDB", version()); } q.finish(); db.close(); } } QSqlDatabase::removeDatabase("initialization"); } void Database::createTables(QSqlDatabase &db) { db.transaction(); db.exec(kCreateFeedsTableQuery); db.exec(kCreateNewsTableQuery); // Create index for feedId field db.exec("CREATE INDEX feedId ON news(feedId)"); // Create extra feeds table just in case db.exec("CREATE TABLE feeds_ex(id integer primary key, " "feedId integer, " // feed Id "name varchar, " // parameter name "value varchar " // parameter value ")"); // Create extra news table just in case db.exec("CREATE TABLE news_ex(id integer primary key, " "feedId integer, " // feed Id "newsId integer, " // news Id "name varchar, " // parameter name "value varchar " // parameter value ")"); // Create filters table db.exec(kCreateFiltersTable); db.exec(kCreateFilterConditionsTable); db.exec(kCreateFilterActionsTable); // Create extra filters just in case db.exec("CREATE TABLE filters_ex(id integer primary key, " "idFilter integer, " // filter Id "name text, " // parameter name "value text" // parameter value ")"); // Create labels table db.exec(kCreateLabelsTable); // Create password table db.exec(kCreatePasswordsTable); // db.exec("CREATE TABLE info(id integer primary key, name varchar, value varchar)"); db.commit(); } void Database::createLabels(QSqlDatabase &db) { QSqlQuery q(db); for (int i = 0; i < 6; i++) { q.prepare("INSERT INTO labels(name, image) " "VALUES (:name, :image)"); q.bindValue(":name", MainWindow::nameLabels().at(i)); QFile file(QString(":/images/label_%1").arg(i+1)); file.open(QFile::ReadOnly); q.bindValue(":image", file.readAll()); file.close(); q.exec(); int labelId = q.lastInsertId().toInt(); q.exec(QString("UPDATE labels SET num='%1' WHERE id=='%1'").arg(labelId)); } } QSqlDatabase Database::connection(const QString &connectionName) { QSqlDatabase db; if (mainApp->storeDBMemory()) { db = QSqlDatabase::database(); } else { db = QSqlDatabase::database(connectionName, true); if (!db.isValid()) { SQLiteDriver *driver = new SQLiteDriver(); db = QSqlDatabase::addDatabase(driver, connectionName); db.setDatabaseName(mainApp->dbFileName()); db.open(); setPragma(db); } } return db; } void Database::sqliteDBMemFile(bool save) { if (save) qWarning() << "sqliteDBMemFile(): from memory to file..."; else qWarning() << "sqliteDBMemFile(): from file to memory..."; int rc = -1; /* Function return code */ QVariant v = QSqlDatabase::database().driver()->handle(); if (v.isValid() && qstrcmp(v.typeName(),"sqlite3*") == 0) { // v.data() returns a pointer to the handle sqlite3 *handle = *static_cast(v.data()); if (handle != 0) { // check that it is not NULL sqlite3 *pInMemory = handle; sqlite3 *pFile; /* Database connection opened on zFilename */ sqlite3_backup *pBackup; /* Backup object used to copy data */ sqlite3 *pTo; /* Database to copy to (pFile or pInMemory) */ sqlite3 *pFrom; /* Database to copy from (pFile or pInMemory) */ /* Open the database file identified by zFilename. Exit early if this fails ** for any reason. */ rc = sqlite3_open(mainApp->dbFileName().toUtf8().data(), &pFile); if (rc == SQLITE_OK) { /* If this is a 'load' operation (isSave==0), then data is copied ** from the database file just opened to database pInMemory. ** Otherwise, if this is a 'save' operation (isSave==1), then data ** is copied from pInMemory to pFile. Set the variables pFrom and ** pTo accordingly. */ pFrom = (save ? pInMemory : pFile); pTo = (save ? pFile : pInMemory); /* Set up the backup procedure to copy from the "main" database of ** connection pFile to the main database of connection pInMemory. ** If something goes wrong, pBackup will be set to NULL and an error ** code and message left in connection pTo. ** ** If the backup object is successfully created, call backup_step() ** to copy data from pFile to pInMemory. Then call backup_finish() ** to release resources associated with the pBackup object. If an ** error occurred, then an error code and message will be left in ** connection pTo. If no error occurred, then the error code belonging ** to pTo is set to SQLITE_OK. */ pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main"); /* Each iteration of this loop copies 5 database pages from database ** pDb to the backup database. If the return value of backup_step() ** indicates that there are still further pages to copy, sleep for ** 250 ms before repeating. */ do { rc = sqlite3_backup_step(pBackup, 10000); if (!mainApp->isNoDebugOutput()) { int remaining = sqlite3_backup_remaining(pBackup); int pagecount = sqlite3_backup_pagecount(pBackup); qDebug() << rc << "backup" << pagecount << "remain" << remaining; } if((rc == SQLITE_OK) || (rc == SQLITE_BUSY) || (rc == SQLITE_LOCKED)) sqlite3_sleep(100); } while((rc == SQLITE_OK) || (rc == SQLITE_BUSY) || (rc == SQLITE_LOCKED)); /* Release resources allocated by backup_init(). */ (void)sqlite3_backup_finish(pBackup); if (rc != SQLITE_DONE) qCritical() << "sqliteDBMemFile(): return code =" << rc; } else { qCritical() << "sqliteDBMemFile(): error open =" << rc; } /* Close the database connection opened on database file zFilename ** and return the result of this function. */ (void)sqlite3_close(pFile); } } qWarning() << "sqliteDBMemFile(): finished!"; } void Database::setVacuum() { { QSqlDatabase dbFile = QSqlDatabase::addDatabase("QSQLITE", "vacuum"); dbFile.setDatabaseName(mainApp->dbFileName()); dbFile.open(); setPragma(dbFile); dbFile.exec("VACUUM"); dbFile.close(); } QSqlDatabase::removeDatabase("vacuum"); } quiterss-0.18.3/src/database/database.h000066400000000000000000000032771265173051100177440ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef DATABASE_H #define DATABASE_H #include #include class Database : public QObject { Q_OBJECT public: static int version(); static void initialization(); static QSqlDatabase connection(const QString &connectionName = QString()); static void sqliteDBMemFile(bool save = true); static void setVacuum(); private: static void setPragma(QSqlDatabase &db); static void createTables(QSqlDatabase &db); static void prepareDatabase(); static void createLabels(QSqlDatabase &db); static QStringList tablesList() { QStringList tables; tables << "feeds" << "news" << "feeds_ex" << "news_ex" << "filters" << "filterConditions" << "filterActions" << "filters_ex" << "labels" << "passwords" << "info"; return tables; } }; #endif // DATABASE_H quiterss-0.18.3/src/downloads/000077500000000000000000000000001265173051100162445ustar00rootroot00000000000000quiterss-0.18.3/src/downloads/downloaditem.cpp000066400000000000000000000371101265173051100214400ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2013 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "downloaditem.h" #include "mainapplication.h" #include "networkmanager.h" #include "webpage.h" #if defined(Q_OS_WIN) #include #endif DownloadItem::DownloadItem(QListWidgetItem *item, QNetworkReply *reply, const QString &fileName, bool openAfterDownload) : QWidget() , item_(item) , reply_(reply) , ftpDownloader_(0) , fileName_(fileName) , downloadUrl_(reply->url()) , downloading_(false) , openAfterFinish_(openAfterDownload) , downloadStopped_(false) , received_(0) , total_(0) { downloadTimer_.start(); if (QFile::exists(fileName)) { QFile::remove(fileName); } qApp->processEvents(); outputFile_.setFileName(fileName); qint64 total = reply->header(QNetworkRequest::ContentLengthHeader).toLongLong(); if (total > 0) total_ = total; fileNameLabel_ = new QLabel(); QFileInfo info(fileName); fileNameLabel_->setText(info.fileName()); QFont font = fileNameLabel_->font(); font.setBold(true); fileNameLabel_->setFont(font); progressBar_ = new QProgressBar(); progressBar_->setObjectName("progressBar_"); progressBar_->setTextVisible(false); progressBar_->setFixedHeight(10); progressBar_->setFixedWidth(300); progressBar_->setMinimum(0); progressBar_->setMaximum(0); progressBar_->setValue(0); QHBoxLayout *progressLayout = new QHBoxLayout(); progressLayout->setMargin(0); progressLayout->addWidget(progressBar_); progressLayout->addStretch(); progressFrame_ = new QFrame(); progressFrame_->setLayout(progressLayout); downloadInfo_ = new QLabel(); downloadInfo_->setText(tr("Remaining time unavailable")); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->setMargin(5); mainLayout->setSpacing(5); mainLayout->addWidget(fileNameLabel_); mainLayout->addWidget(downloadInfo_); mainLayout->addWidget(progressFrame_); setLayout(mainLayout); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenuRequested(QPoint))); connect(&updateInfoTimer_, SIGNAL(timeout()), this, SLOT(updateInfo())); } DownloadItem::~DownloadItem() { delete item_; } void DownloadItem::startDownloading() { QUrl locationHeader = reply_->header(QNetworkRequest::LocationHeader).toUrl(); bool hasFtpUrlInHeader = locationHeader.isValid() && (locationHeader.scheme() == "ftp"); if (reply_->url().scheme() == "ftp" || hasFtpUrlInHeader) { QUrl url = hasFtpUrlInHeader ? locationHeader : reply_->url(); reply_->abort(); reply_->deleteLater(); reply_ = 0; startDownloadingFromFtp(url); return; } else if (locationHeader.isValid()) { reply_->abort(); reply_->deleteLater(); reply_ = mainApp->networkManager()->get(QNetworkRequest(locationHeader)); } reply_->setParent(this); connect(reply_, SIGNAL(readyRead()), this, SLOT(readyRead())); connect(reply_, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(downloadProgress(qint64,qint64))); connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(error())); connect(reply_, SIGNAL(metaDataChanged()), this, SLOT(metaDataChanged())); connect(reply_, SIGNAL(finished()), this, SLOT(finished())); downloading_ = true; updateInfoTimer_.start(1000); readyRead(); QTimer::singleShot(200, this, SLOT(updateDownload())); if (reply_->error() != QNetworkReply::NoError) { stop(false); error(); } } void DownloadItem::startDownloadingFromFtp(const QUrl &url) { if (!outputFile_.isOpen() && !outputFile_.open(QIODevice::WriteOnly)) { stop(false); downloadInfo_->setText(tr("Error: Cannot write to file!")); return; } ftpDownloader_ = new FtpDownloader(this); connect(ftpDownloader_, SIGNAL(finished()), this, SLOT(finished())); connect(ftpDownloader_, SIGNAL(dataTransferProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64))); connect(ftpDownloader_, SIGNAL(errorOccured(QFtp::Error)), this, SLOT(error())); connect(ftpDownloader_, SIGNAL(ftpAuthenticationRequierd(const QUrl &, QAuthenticator*)), mainApp->networkManager(), SLOT(ftpAuthentication(const QUrl &, QAuthenticator*))); ftpDownloader_->download(url, &outputFile_); downloading_ = true; updateInfoTimer_.start(1000); QTimer::singleShot(200, this, SLOT(updateDownload())); if (ftpDownloader_->error() != QFtp::NoError) { error(); } } void DownloadItem::readyRead() { if (!outputFile_.isOpen() && !outputFile_.open(QIODevice::WriteOnly)) { stop(false); downloadInfo_->setText(tr("Error: Cannot write to file!")); return; } outputFile_.write(reply_->readAll()); } void DownloadItem::downloadProgress(qint64 received, qint64 total) { qint64 currentValue = 0; qint64 totalValue = 0; if (total > 0) { currentValue = received * 100 / total; totalValue = 100; total_ = total; } progressBar_->setValue(currentValue); progressBar_->setMaximum(totalValue); curSpeed_ = received * 1000.0 / downloadTimer_.elapsed(); received_ = received; if (reply_->isFinished()) finished(); } void DownloadItem::metaDataChanged() { QUrl locationHeader = reply_->header(QNetworkRequest::LocationHeader).toUrl(); if (locationHeader.isValid()) { reply_->close(); reply_->deleteLater(); reply_ = mainApp->networkManager()->get(QNetworkRequest(locationHeader)); startDownloading(); } } void DownloadItem::error() { if (reply_ && reply_->error() != QNetworkReply::NoError) { stop(false); downloadInfo_->setText(tr("Error: ") + reply_->errorString()); } } void DownloadItem::finished() { updateInfoTimer_.stop(); QString host = downloadUrl_.host(); QString fileSize = fileSizeToString(total_); if (fileSize == tr("Unknown size")) { fileSize = fileSizeToString(received_); } downloadInfo_->setText(QString("%1 - %2 - %3").arg(fileSize, host, QDateTime::currentDateTime().time().toString())); progressFrame_->hide(); item_->setSizeHint(sizeHint()); outputFile_.close(); reply_->deleteLater(); downloading_ = false; if (openAfterFinish_) { openFile(); } emit downloadFinished(true); } QString DownloadItem::remaingTimeToString(QTime time) { if (time < QTime(0, 0, 10)) { return tr("few seconds"); } else if (time < QTime(0, 1)) { return time.toString("s") + " " + tr("seconds"); } else if (time < QTime(1, 0)) { return time.toString("m") + " " + tr("minutes"); } else { return time.toString("h") + " " + tr("hours"); } } QString DownloadItem::fileSizeToString(qint64 size) { if (size < 0) { return tr("Unknown size"); } double correctSize = size / 1024.0; // KB if (correctSize < 1000) { return QString::number(correctSize > 1 ? correctSize : 1, 'f', 0) + " KB"; } correctSize /= 1024; // MB if (correctSize < 1000) { return QString::number(correctSize, 'f', 1) + " MB"; } correctSize /= 1024; // GB return QString::number(correctSize, 'f', 2) + " GB"; } QString DownloadItem::currentSpeedToString(double speed) { if (speed < 0) { return tr("Unknown speed"); } speed /= 1024; // kB if (speed < 1000) { return QString::number(speed, 'f', 0) + " kB/s"; } speed /= 1024; //MB if (speed < 1000) { return QString::number(speed, 'f', 2) + " MB/s"; } speed /= 1024; //GB return QString::number(speed, 'f', 2) + " GB/s"; } void DownloadItem::updateInfo() { int estimatedTime = ((total_ - received_) / 1024) / (curSpeed_ / 1024); QString speed = currentSpeedToString(curSpeed_); QTime time; time = time.addSecs(estimatedTime); QString remTime = remaingTimeToString(time); remTime_ = time; QString curSize = fileSizeToString(received_); QString fileSize = fileSizeToString(total_); if (fileSize == tr("Unknown size")) { downloadInfo_->setText(tr("%2 - unknown size (%3)").arg(curSize, speed)); } else { downloadInfo_->setText(tr("Remaining %1 - %2 of %3 (%4)").arg(remTime, curSize, fileSize, speed)); } } void DownloadItem::stop(bool askForDeleteFile) { if (downloadStopped_) return; downloadStopped_ = true; QString host = downloadUrl_.host(); openAfterFinish_ = false; updateInfoTimer_.stop(); reply_->abort(); reply_->deleteLater(); outputFile_.close(); QString outputfile = QFileInfo(outputFile_).absoluteFilePath(); downloadInfo_->setText(tr("Cancelled - %1").arg(host)); progressFrame_->hide(); item_->setSizeHint(sizeHint()); downloading_ = false; emit downloadFinished(false); if (askForDeleteFile) { QMessageBox::StandardButton button = QMessageBox::question(item_->listWidget()->parentWidget(), tr("Delete file"), tr("Do you want to also delete downloaded file?"), QMessageBox::Yes | QMessageBox::No); if (button == QMessageBox::Yes) { QFile::remove(outputfile); } } } /*virtual*/ void DownloadItem::mouseDoubleClickEvent(QMouseEvent* event) { openFile(); event->accept(); } void DownloadItem::customContextMenuRequested(const QPoint &pos) { QMenu menu; menu.addAction( tr("Open File"), this, SLOT(openFile())); menu.addAction(tr("Open Folder"), this, SLOT(openFolder())); menu.addSeparator(); menu.addAction(tr("Copy Download Link"), this, SLOT(copyDownloadLink())); menu.addSeparator(); menu.addAction(tr("Cancel Downloading"), this, SLOT(stop()))->setEnabled(downloading_); menu.addAction(tr("Remove"), this, SLOT(clear()))->setEnabled(!downloading_); if (downloading_ || downloadInfo_->text().startsWith(tr("Cancelled")) || downloadInfo_->text().startsWith(tr("Error"))) { menu.actions().at(0)->setEnabled(false); } menu.exec(mapToGlobal(pos)); } void DownloadItem::copyDownloadLink() { QApplication::clipboard()->setText(downloadUrl_.toString()); } void DownloadItem::clear() { emit deleteItem(this); } void DownloadItem::openFile() { if (downloading_) { return; } QFileInfo info(fileName_); if (info.exists()) { QDesktopServices::openUrl(QUrl::fromLocalFile(info.absoluteFilePath())); } else { QMessageBox::warning(item_->listWidget()->parentWidget(), tr("Not found"), tr("Sorry, the file \n %1 \n was not found!").arg(info.absoluteFilePath())); } } void DownloadItem::openFolder() { #ifdef Q_OS_WIN QString winFileName = fileName_; winFileName.replace(QLatin1Char('/'), "\\"); QString shExArg = "/e,/select,\"" + winFileName + "\""; ShellExecute(NULL, NULL, TEXT("explorer.exe"), (wchar_t*)shExArg.utf16(), NULL, SW_SHOW); #else QFileInfo info(fileName_); QDesktopServices::openUrl(QUrl::fromLocalFile(info.path())); #endif } void DownloadItem::updateDownload() { if ((progressBar_->maximum() == 0) && outputFile_.isOpen() && (reply_ && reply_->isFinished())) { downloadProgress(0, 0); finished(); } } QHash FtpDownloader::ftpAuthenticatorsCache_ = QHash(); FtpDownloader::FtpDownloader(QObject* parent) : QFtp(parent) , ftpLoginId_(-1) , anonymousLoginChecked_(false) , isFinished_(false) , url_(QUrl()) , dev_(0) , lastError_(QFtp::NoError) { connect(this, SIGNAL(commandFinished(int, bool)), this, SLOT(processCommand(int, bool))); connect(this, SIGNAL(done(bool)), this, SLOT(onDone(bool))); } void FtpDownloader::download(const QUrl &url, QIODevice* dev) { url_ = url; dev_ = dev; QString server = url_.host(); if (server.isEmpty()) { server = url_.toString(); } int port = 21; if (url_.port() != -1) { port = url_.port(); } connectToHost(server, port); } void FtpDownloader::setError(QFtp::Error err, const QString &errStr) { lastError_ = err; lastErrorString_ = errStr; } void FtpDownloader::abort() { setError(QFtp::UnknownError, tr("Canceled!")); QFtp::abort(); } QFtp::Error FtpDownloader::error() { if (lastError_ != QFtp::NoError && QFtp::error() == QFtp::NoError) { return lastError_; } else { return QFtp::error(); } } QString FtpDownloader::errorString() const { if (!lastErrorString_.isEmpty() && lastError_ != QFtp::NoError && QFtp::error() == QFtp::NoError) { return lastErrorString_; } else { return QFtp::errorString(); } } void FtpDownloader::processCommand(int id, bool err) { if (!url_.isValid() || url_.isEmpty() || !dev_) { abort(); return; } if (err) { if (ftpLoginId_ == id) { if (!anonymousLoginChecked_) { anonymousLoginChecked_ = true; ftpAuthenticator(url_)->setUser(QString()); ftpAuthenticator(url_)->setPassword(QString()); ftpLoginId_ = login(); return; } emit ftpAuthenticationRequierd(url_, ftpAuthenticator(url_)); ftpLoginId_ = login(ftpAuthenticator(url_)->user(), ftpAuthenticator(url_)->password()); return; } abort(); return; } switch (currentCommand()) { case QFtp::ConnectToHost: if (!anonymousLoginChecked_) { anonymousLoginChecked_ = ftpAuthenticator(url_)->user().isEmpty() && ftpAuthenticator(url_)->password().isEmpty(); } ftpLoginId_ = login(ftpAuthenticator(url_)->user(), ftpAuthenticator(url_)->password()); break; case QFtp::Login: get(url_.path(), dev_); break; default: ; } } void FtpDownloader::onDone(bool err) { disconnect(this, SIGNAL(done(bool)), this, SLOT(onDone(bool))); close(); ftpLoginId_ = -1; if (err || lastError_ != QFtp::NoError) { emit errorOccured(error()); } else { isFinished_ = true; emit finished(); } } QAuthenticator *FtpDownloader::ftpAuthenticator(const QUrl &url) { QString key = url.host(); if (key.isEmpty()) { key = url.toString(); } if (!ftpAuthenticatorsCache_.contains(key) || !ftpAuthenticatorsCache_.value(key, 0)) { QAuthenticator* auth = new QAuthenticator(); auth->setUser(url.userName()); auth->setPassword(url.password()); ftpAuthenticatorsCache_.insert(key, auth); } return ftpAuthenticatorsCache_.value(key); } quiterss-0.18.3/src/downloads/downloaditem.h000066400000000000000000000106201265173051100211020ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2013 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef DOWNLOADITEM_H #define DOWNLOADITEM_H #ifdef HAVE_QT5 #include #include "qftp.h" #else #include #include #endif #include #include #include class QListWidgetItem; class FtpDownloader; class DownloadItem : public QWidget { Q_OBJECT public: explicit DownloadItem(QListWidgetItem *item, QNetworkReply *reply, const QString &fileName, bool openAfterDownload); ~DownloadItem(); void startDownloading(); void startDownloadingFromFtp(const QUrl &url); bool isDownloading() { return downloading_; } QTime remainingTime() { return remTime_; } static QString remaingTimeToString(QTime time); static QString currentSpeedToString(double speed); signals: void deleteItem(DownloadItem*); void downloadFinished(bool success); protected: virtual void mouseDoubleClickEvent(QMouseEvent*); private slots: void finished(); void metaDataChanged(); void updateInfo(); void downloadProgress(qint64 received, qint64 total); void stop(bool askForDeleteFile = true); void openFile(); void openFolder(); void readyRead(); void error(); void updateDownload(); void customContextMenuRequested(const QPoint &pos); void clear(); void copyDownloadLink(); private: QString fileSizeToString(qint64 size); QListWidgetItem *item_; QNetworkReply *reply_; FtpDownloader *ftpDownloader_; QString fileName_; QTime downloadTimer_; QTime remTime_; QTimer updateInfoTimer_; QFile outputFile_; QUrl downloadUrl_; bool downloading_; bool openAfterFinish_; bool downloadStopped_; double curSpeed_; qint64 received_; qint64 total_; QLabel *fileNameLabel_; QProgressBar *progressBar_; QFrame *progressFrame_; QLabel *downloadInfo_; }; class FtpDownloader : public QFtp { Q_OBJECT public: FtpDownloader(QObject* parent = 0); void download(const QUrl &url, QIODevice* dev); inline bool isFinished() {return isFinished_;} inline QUrl url() const {return url_;} inline QIODevice* device() const {return dev_;} void setError(QFtp::Error err, const QString &errStr); void abort(); QFtp::Error error(); QString errorString() const; private slots: void processCommand(int id, bool err); void onDone(bool err); private: int ftpLoginId_; bool anonymousLoginChecked_; bool isFinished_; QUrl url_; QIODevice* dev_; QFtp::Error lastError_; QString lastErrorString_; static QAuthenticator *ftpAuthenticator(const QUrl &url); static QHash ftpAuthenticatorsCache_; signals: void ftpAuthenticationRequierd(const QUrl &, QAuthenticator*); void finished(); void errorOccured(QFtp::Error); }; #endif // DOWNLOADITEM_H quiterss-0.18.3/src/downloads/downloadmanager.cpp000066400000000000000000000175451265173051100221260ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "downloadmanager.h" #include "mainapplication.h" #include "networkmanager.h" #include "authenticationdialog.h" #include "downloaditem.h" #include "settings.h" #include "common.h" #include DownloadManager::DownloadManager(QWidget *parent) : QWidget(parent) { listWidget_ = new QListWidget(); listWidget_->setFrameStyle(QFrame::NoFrame); listClaerAct_ = new QAction(QIcon(":/images/list_clear"), tr("Clear"), this); QToolBar *toolBar = new QToolBar(this); toolBar->setObjectName("newsToolBar"); toolBar->setStyleSheet("QToolBar { border: none; padding: 0px; }"); toolBar->setIconSize(QSize(18, 18)); toolBar->addAction(listClaerAct_); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout->setMargin(2); buttonLayout->addWidget(toolBar); QWidget *buttonPanelWidget = new QWidget(this); buttonPanelWidget->setObjectName("buttonPanelWidget"); buttonPanelWidget->setStyleSheet( QString("#buttonPanelWidget {border-bottom: 1px solid %1;}"). arg(qApp->palette().color(QPalette::Dark).name())); buttonPanelWidget->setLayout(buttonLayout); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->setMargin(0); mainLayout->setSpacing(0); mainLayout->addWidget(buttonPanelWidget); mainLayout->addWidget(listWidget_); setLayout(mainLayout); connect(listClaerAct_, SIGNAL(triggered()), this, SLOT(clearList())); connect(this, SIGNAL(signalItemCreated(QListWidgetItem*,DownloadItem*)), this, SLOT(itemCreated(QListWidgetItem*,DownloadItem*))); connect(&updateInfoTimer_, SIGNAL(timeout()), this, SLOT(updateInfo())); updateInfoTimer_.start(2000); hide(); } DownloadManager::~DownloadManager() { } void DownloadManager::download(const QNetworkRequest &request) { handleUnsupportedContent(mainApp->networkManager()->get(request), true); } void DownloadManager::handleUnsupportedContent(QNetworkReply* reply, bool askDownloadLocation) { Settings settings; QString downloadLocation = mainApp->mainWindow()->downloadLocation_; if (askDownloadLocation || !QFile::exists(downloadLocation)) downloadLocation = settings.value("Settings/curDownloadLocation", downloadLocation).toString(); QString fileName(getFileName(reply)); fileName = Common::ensureUniqueFilename(downloadLocation + "/" + fileName); QFileInfo fileInfo(fileName); if (askDownloadLocation || fileInfo.exists() || !QFile::exists(downloadLocation)) { QString filter = QString(tr("File %1 (*.%2)") + ";;" + tr("All Files (*.*)")). arg(fileInfo.suffix().toUpper()). arg(fileInfo.suffix().toLower()); fileName = QFileDialog::getSaveFileName(mainApp->mainWindow(), tr("Save As..."), fileName, filter); fileInfo.setFile(fileName); if (!fileName.isEmpty()) settings.setValue("Settings/curDownloadLocation", fileInfo.absolutePath()); } if (fileName.isNull()) { reply->abort(); reply->deleteLater(); return; } reply->setProperty("downloadReply", QVariant(true)); QListWidgetItem *item = new QListWidgetItem(listWidget_); DownloadItem *downItem = new DownloadItem(item, reply, fileName, false); emit signalItemCreated(item, downItem); } QString DownloadManager::getFileName(QNetworkReply* reply) { QString path; if (reply->hasRawHeader("Content-Disposition")) { QString value = QString::fromUtf8(reply->rawHeader("Content-Disposition")); if (value.contains(QzRegExp("filename\\s*\\*\\s*=\\s*UTF-8", Qt::CaseInsensitive))) { QzRegExp reg("filename\\s*\\*\\s*=\\s*UTF-8''([^;]*)", Qt::CaseInsensitive); reg.indexIn(value); path = QUrl::fromPercentEncoding(reg.cap(1).toUtf8()).trimmed(); } else if (value.contains(QzRegExp("filename\\s*=", Qt::CaseInsensitive))) { QzRegExp reg("filename\\s*=([^;]*)", Qt::CaseInsensitive); reg.indexIn(value); path = QUrl::fromPercentEncoding(reg.cap(1).toUtf8()).trimmed(); if (path.startsWith(QLatin1Char('"')) && path.endsWith(QLatin1Char('"'))) { path = path.mid(1, path.length() - 2); } else if (path.startsWith(QLatin1Char('"'))) { path = path.right(path.length() - 1); } } } if (path.isEmpty()) { path = reply->url().path(); } QFileInfo info(path); QString baseName = info.completeBaseName(); QString endName = info.suffix(); if (baseName.isEmpty()) { baseName = "no_name"; } if (!endName.isEmpty()) { endName.prepend(QLatin1Char('.')); } QString name = baseName + endName; name.replace(QzRegExp("[;:<>?\"]"), "_"); return name; } void DownloadManager::startExternalApp(const QString &executable, const QUrl &url) { QStringList arguments; arguments.append(url.toEncoded()); bool success = QProcess::startDetached(executable, arguments); if (!success) { QString info = "
  • %1%2
  • %3%4
"; info = info.arg(tr("Executable: "), executable, tr("Arguments: "), arguments.join(QLatin1String(" "))); QMessageBox::critical(0, QObject::tr("Cannot start external program"), QObject::tr("Cannot start external program! %1").arg(info)); } } void DownloadManager::itemCreated(QListWidgetItem* item, DownloadItem* downItem) { connect(downItem, SIGNAL(deleteItem(DownloadItem*)), this, SLOT(deleteItem(DownloadItem*))); listWidget_->setItemWidget(item, downItem); item->setSizeHint(downItem->sizeHint()); downItem->show(); emit signalShowDownloads(false); downItem->startDownloading(); updateInfo(); } void DownloadManager::deleteItem(DownloadItem* item) { if (item && !item->isDownloading()) { delete item; } } void DownloadManager::clearList() { QList items; for (int i = 0; i < listWidget_->count(); i++) { DownloadItem* downItem = qobject_cast(listWidget_->itemWidget(listWidget_->item(i))); if (!downItem) { continue; } if (downItem->isDownloading()) { continue; } items.append(downItem); } qDeleteAll(items); } void DownloadManager::updateInfo() { QVector remTimes; for (int i = 0; i < listWidget_->count(); i++) { DownloadItem* downItem = qobject_cast(listWidget_->itemWidget(listWidget_->item(i))); if (!downItem || !downItem->isDownloading()) { continue; } remTimes.append(downItem->remainingTime()); } QTime remaining; foreach (const QTime &time, remTimes) { if (time > remaining) { remaining = time; } } QString info; if (remTimes.count()) info = QString("%1 (%2)").arg(remaining.toString("mm:ss")).arg(remTimes.count()); emit signalUpdateInfo(info); } void DownloadManager::ftpAuthentication(const QUrl &url, QAuthenticator *auth) { AuthenticationDialog *authenticationDialog = new AuthenticationDialog(url, auth); if (!authenticationDialog->save_->isChecked()) authenticationDialog->exec(); delete authenticationDialog; } void DownloadManager::retranslateStrings() { listClaerAct_->setText(tr("Clear")); } quiterss-0.18.3/src/downloads/downloadmanager.h000066400000000000000000000037461265173051100215710ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef DOWNLOADMANAGER_H #define DOWNLOADMANAGER_H #ifdef HAVE_QT5 #include #else #include #endif #include class DownloadItem; class DownloadManager : public QWidget { Q_OBJECT public: explicit DownloadManager(QWidget *parent = 0); ~DownloadManager(); void download(const QNetworkRequest &request); void handleUnsupportedContent(QNetworkReply *reply, bool askDownloadLocation); void startExternalApp(const QString &executable, const QUrl &url); void retranslateStrings(); public slots: void ftpAuthentication(const QUrl &url, QAuthenticator *auth); signals: void signalItemCreated(QListWidgetItem* item, DownloadItem* downItem); void signalShowDownloads(bool activate); void signalUpdateInfo(const QString &text); private slots: QString getFileName(QNetworkReply* reply); void itemCreated(QListWidgetItem* item, DownloadItem* downItem); void clearList(); void deleteItem(DownloadItem* item); void updateInfo(); private: QListWidget *listWidget_; QAction *listClaerAct_; QTimer updateInfoTimer_; }; #endif // DOWNLOADMANAGER_H quiterss-0.18.3/src/faviconobject.cpp000066400000000000000000000216551265173051100176030ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "faviconobject.h" #include "VersionNo.h" #include "mainapplication.h" #include #include #ifdef HAVE_QT5 #include #else #include #endif #include #define REPLY_MAX_COUNT 4 #define REQUEST_TIMEOUT 30 FaviconObject::FaviconObject(QObject *parent) : QObject(parent) { setObjectName("faviconObject_"); timeout_ = new QTimer(this); timeout_->setInterval(1000); connect(timeout_, SIGNAL(timeout()), this, SLOT(slotRequestTimeout())); getUrlTimer_ = new QTimer(this); getUrlTimer_->setSingleShot(true); getUrlTimer_->setInterval(20); connect(getUrlTimer_, SIGNAL(timeout()), this, SLOT(getQueuedUrl())); connect(this, SIGNAL(signalGet(QUrl,QString,int)), SLOT(slotGet(QUrl,QString,int))); networkManager_ = new NetworkManager(true, this); connect(networkManager_, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*))); } void FaviconObject::disconnectObjects() { disconnect(this); networkManager_->disconnect(networkManager_); } /** @brief Put requested URL in request queue *----------------------------------------------------------------------------*/ void FaviconObject::requestUrl(QString urlString, QString feedUrl) { if (!timeout_->isActive()) timeout_->start(); urlsQueue_.enqueue(urlString); feedsQueue_.enqueue(feedUrl); if (!getUrlTimer_->isActive()) getUrlTimer_->start(); } /** @brief Process request queue by timer *----------------------------------------------------------------------------*/ void FaviconObject::getQueuedUrl() { if (currentFeeds_.size() >= REPLY_MAX_COUNT) { getUrlTimer_->start(); return; } if (!urlsQueue_.isEmpty()) { getUrlTimer_->start(); QString feedUrl = feedsQueue_.head(); if (hostList_.contains(QUrl(feedUrl).host())) { foreach (QString url, currentFeeds_) { if (QUrl(url).host() == QUrl(feedUrl).host()) { return; } } } QString urlString = urlsQueue_.dequeue(); feedUrl = feedsQueue_.dequeue(); QUrl url = QUrl::fromEncoded(urlString.toUtf8()); if (!url.isValid()) { url = QUrl::fromEncoded(feedUrl.toUtf8()); url.setUrl(QString("%1://%2").arg(url.scheme()).arg(url.host())); } emit signalGet(url, feedUrl, 0); } } /** @brief Prepare and send network request to receive all data *----------------------------------------------------------------------------*/ void FaviconObject::slotGet(const QUrl &getUrl, const QString &feedUrl, const int &cnt) { QNetworkRequest request(getUrl); QString userAgent = QString("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/%1 (KHTML, like Gecko) QuiteRSS/%2 Safari/%1"). arg(qWebKitVersion()).arg(STRPRODUCTVER); request.setRawHeader("User-Agent", userAgent.toUtf8()); request.setRawHeader("Accept-Language", "en-us,en"); currentUrls_.append(getUrl); currentFeeds_.append(feedUrl); currentCntRequests_.append(cnt); currentTime_.append(REQUEST_TIMEOUT); QNetworkReply *reply = networkManager_->get(request); reply->setProperty("feedReply", QVariant(true)); requestUrl_.append(reply->url()); networkReply_.append(reply); } /** @brief Finish network request processing *----------------------------------------------------------------------------*/ void FaviconObject::finished(QNetworkReply *reply) { int currentReplyIndex = currentUrls_.indexOf(reply->url()); if (currentReplyIndex >= 0) { currentTime_.removeAt(currentReplyIndex); QUrl url = currentUrls_.takeAt(currentReplyIndex); QString feedUrl = currentFeeds_.takeAt(currentReplyIndex); int cntRequests = currentCntRequests_.takeAt(currentReplyIndex); if((reply->error() == QNetworkReply::NoError) || (reply->error() == QNetworkReply::UnknownContentError)) { QUrl redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (redirectionTarget.isValid()) { if ((cntRequests == 0) || (cntRequests == 1)) { if (redirectionTarget.host().isNull()) redirectionTarget.setUrl("http://"+url.host()+"/"+redirectionTarget.toString()); emit signalGet(redirectionTarget, feedUrl, cntRequests+2); } } else { QByteArray data = reply->readAll(); if (!data.isNull()) { if ((cntRequests == 0) || (cntRequests == 2)) { QString linkFavicon; QString str = QString::fromUtf8(data); if (str.contains("]+rel=['\"]icon['\"][^>]+>", Qt::CaseInsensitive); int pos = rx.indexIn(str); if (pos == -1) { rx = QzRegExp("]+rel=['\"]shortcut icon['\"][^>]+>", Qt::CaseInsensitive); pos = rx.indexIn(str); } if (pos > -1) { str = rx.cap(0); rx.setPattern("href=\"([^\"]+)"); pos = rx.indexIn(str); if (pos == -1) { rx.setPattern("href='([^']+)"); pos = rx.indexIn(str); } if (pos > -1) { linkFavicon = rx.cap(1).simplified(); QUrl urlFavicon(linkFavicon); if (urlFavicon.host().isEmpty()) { urlFavicon.setHost(url.host()); } if (urlFavicon.scheme().isEmpty()) { urlFavicon.setScheme(url.scheme()); } linkFavicon = urlFavicon.toString().simplified(); qDebug() << "Favicon URL:" << linkFavicon; emit signalGet(linkFavicon, feedUrl, cntRequests+1); } } } if (linkFavicon.isEmpty()) { if ((cntRequests == 0) || (cntRequests == 2)) { QString link = QString("%1://%2/favicon.ico").arg(url.scheme()).arg(url.host()); emit signalGet(link, feedUrl, cntRequests+1); } } } else { // Emit receiced data in main thread QFileInfo info(url.path()); emit signalIconRecived(feedUrl, data, info.suffix()); } } else { if ((cntRequests == 0) || (cntRequests == 2)) { QString link = QString("%1://%2/favicon.ico").arg(url.scheme()).arg(url.host()); emit signalGet(link, feedUrl, cntRequests+1); } } } } else { if (reply->errorString().contains("Service Temporarily Unavailable")) { if (!hostList_.contains(QUrl(feedUrl).host())) { hostList_.append(QUrl(feedUrl).host()); } } if ((cntRequests == 0) || (cntRequests == 1)) { QString link = QString("%1://%2").arg(url.scheme()).arg(url.host()); emit signalGet(link, feedUrl, 2); qDebug() << "Request Url error: " << reply->url().toString() << reply->errorString(); } } } else { qCritical() << "Request Url error: " << reply->url().toString() << reply->errorString(); } int replyIndex = requestUrl_.indexOf(reply->url()); if (replyIndex >= 0) { requestUrl_.removeAt(replyIndex); networkReply_.removeAt(replyIndex); } reply->abort(); reply->deleteLater(); } /** @brief Timeout to delete requests without answer from server *----------------------------------------------------------------------------*/ void FaviconObject::slotRequestTimeout() { for (int i = currentTime_.count() - 1; i >= 0; i--) { int time = currentTime_.at(i) - 1; if (time <= 0) { QUrl url = currentUrls_.takeAt(i); QString feedUrl = currentFeeds_.takeAt(i); int cntRequests = currentCntRequests_.takeAt(i); currentTime_.removeAt(i); int replyIndex = requestUrl_.indexOf(url); if (replyIndex >= 0) { requestUrl_.removeAt(replyIndex); QNetworkReply *reply = networkReply_.takeAt(replyIndex); reply->deleteLater(); if (cntRequests == 0) { emit signalGet(url, feedUrl, 2); } } } else { currentTime_.replace(i, time); } } } quiterss-0.18.3/src/faviconobject.h000066400000000000000000000040121265173051100172340ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FAVICONOBJECT_H #define FAVICONOBJECT_H #include #include #include #include #include #include "networkmanager.h" class FaviconObject : public QObject { Q_OBJECT public: explicit FaviconObject(QObject *parent = 0); void disconnectObjects(); public slots: void requestUrl(QString urlString, QString feedUrl); void slotGet(const QUrl &getUrl, const QString &feedUrl, const int &cnt); signals: void startTimer(); void signalGet(const QUrl &getUrl, const QString &feedUrl, const int &cnt); void signalIconRecived(QString feedUrl, QByteArray byteArray, QString format); private slots: void getQueuedUrl(); void finished(QNetworkReply *reply); void slotRequestTimeout(); private: NetworkManager *networkManager_; QQueue urlsQueue_; QQueue feedsQueue_; QTimer *timeout_; QTimer *getUrlTimer_; QList currentUrls_; QList currentFeeds_; QList currentCntRequests_; QList currentTime_; QList requestUrl_; QList networkReply_; QList hostList_; }; #endif // FAVICONOBJECT_H quiterss-0.18.3/src/feedpropertiesdialog.cpp000066400000000000000000000633261265173051100211700ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /*This file is prepared for Doxygen automatic documentation generation.*/ #include "feedpropertiesdialog.h" FeedPropertiesDialog::FeedPropertiesDialog(bool isFeed, QWidget *parent) : Dialog(parent) , isFeed_(isFeed) { setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Properties")); setMinimumWidth(500); setMinimumHeight(400); tabWidget = new QTabWidget(); tabWidget->addTab(createGeneralTab(), tr("General")); tabWidget->addTab(createDisplayTab(), tr("Display")); tabWidget->addTab(createReadingTab(), tr("Reading")); tabWidget->addTab(createColumnsTab(), tr("Columns")); tabWidget->addTab(createAuthenticationTab(), tr("Authentication")); tabWidget->addTab(createStatusTab(), tr("Status")); pageLayout->addWidget(tabWidget); if (!isFeed_) { tabWidget->removeTab(3); } buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(this, SIGNAL(signalLoadIcon(QString,QString)), parent, SIGNAL(faviconRequestUrl(QString,QString))); connect(parent, SIGNAL(signalIconFeedReady(QString,QByteArray)), this, SLOT(slotFaviconUpdate(QString,QByteArray))); } //------------------------------------------------------------------------------ QWidget *FeedPropertiesDialog::createGeneralTab() { QWidget *tab = new QWidget(); QGridLayout *layoutGeneralGrid = new QGridLayout(); QLabel *labelTitleCapt = new QLabel(tr("Title:")); QLabel *labelHomepageCapt = new QLabel(tr("Homepage:")); QLabel *labelURLCapt = new QLabel(tr("Feed URL:")); QHBoxLayout *layoutGeneralTitle = new QHBoxLayout(); editTitle = new LineEdit(); ToolButton *loadTitleButton = new ToolButton(); loadTitleButton->setIcon(QIcon(":/images/updateFeed")); loadTitleButton->setIconSize(QSize(16, 16)); loadTitleButton->setToolTip(tr("Load Title")); loadTitleButton->setFocusPolicy(Qt::NoFocus); QMenu *selectIconMenu = new QMenu(); selectIconMenu->addAction(tr("Load Favicon")); selectIconMenu->addSeparator(); selectIconMenu->addAction(tr("Select Icon...")); selectIconButton_ = new QToolButton(this); selectIconButton_->setIconSize(QSize(16, 16)); selectIconButton_->setToolTip(tr("Select Icon")); selectIconButton_->setFocusPolicy(Qt::NoFocus); selectIconButton_->setPopupMode(QToolButton::MenuButtonPopup); selectIconButton_->setMenu(selectIconMenu); layoutGeneralTitle->addWidget(editTitle, 1); layoutGeneralTitle->addWidget(loadTitleButton); layoutGeneralTitle->addWidget(selectIconButton_); editURL = new LineEdit(); disableUpdate_ = new QCheckBox(tr("Disable update")); disableUpdate_->setChecked(false); updateEnable_ = new QCheckBox(tr("Automatically update every")); updateInterval_ = new QSpinBox(); updateInterval_->setEnabled(false); updateInterval_->setRange(1, 9999); connect(updateEnable_, SIGNAL(toggled(bool)), updateInterval_, SLOT(setEnabled(bool))); updateIntervalType_ = new QComboBox(this); updateIntervalType_->setEnabled(false); QStringList intervalTypeList; intervalTypeList << tr("seconds") << tr("minutes") << tr("hours"); updateIntervalType_->addItems(intervalTypeList); connect(updateEnable_, SIGNAL(toggled(bool)), updateIntervalType_, SLOT(setEnabled(bool))); QHBoxLayout *updateFeedsLayout = new QHBoxLayout(); updateFeedsLayout->setMargin(0); updateFeedsLayout->addWidget(updateEnable_); updateFeedsLayout->addWidget(updateInterval_); updateFeedsLayout->addWidget(updateIntervalType_); updateFeedsLayout->addStretch(); connect(disableUpdate_, SIGNAL(toggled(bool)), updateEnable_, SLOT(setDisabled(bool))); connect(disableUpdate_, SIGNAL(toggled(bool)), updateInterval_, SLOT(setDisabled(bool))); connect(disableUpdate_, SIGNAL(toggled(bool)), updateIntervalType_, SLOT(setDisabled(bool))); starredOn_ = new QCheckBox(tr("Starred")); displayOnStartup = new QCheckBox(tr("Display in new tab on startup")); QHBoxLayout *layoutGeneralHomepage = new QHBoxLayout(); labelHomepage = new QLabel(); labelHomepage->setOpenExternalLinks(true); layoutGeneralHomepage->addWidget(labelHomepageCapt); layoutGeneralHomepage->addWidget(labelHomepage, 1); layoutGeneralGrid->addWidget(labelTitleCapt, 0, 0); layoutGeneralGrid->addLayout(layoutGeneralTitle, 0 ,1); layoutGeneralGrid->addWidget(labelURLCapt, 1, 0); layoutGeneralGrid->addWidget(editURL, 1, 1); duplicateNewsMode_ = new QCheckBox(tr("Automatically delete duplicate news")); QVBoxLayout *tabLayout = new QVBoxLayout(tab); tabLayout->setMargin(10); tabLayout->setSpacing(5); tabLayout->addLayout(layoutGeneralGrid); tabLayout->addLayout(layoutGeneralHomepage); tabLayout->addSpacing(15); tabLayout->addWidget(disableUpdate_); tabLayout->addLayout(updateFeedsLayout); tabLayout->addSpacing(15); tabLayout->addWidget(starredOn_); tabLayout->addWidget(displayOnStartup); tabLayout->addWidget(duplicateNewsMode_); tabLayout->addStretch(); connect(loadTitleButton, SIGNAL(clicked()), this, SLOT(setDefaultTitle())); connect(selectIconButton_, SIGNAL(clicked()), this, SLOT(selectIcon())); connect(selectIconMenu->actions().at(0), SIGNAL(triggered()), this, SLOT(loadDefaultIcon())); connect(selectIconMenu->actions().at(2), SIGNAL(triggered()), this, SLOT(selectIcon())); if (!isFeed_) { loadTitleButton->hide(); selectIconButton_->hide(); labelURLCapt->hide(); editURL->hide(); labelHomepageCapt->hide(); labelHomepage->hide(); starredOn_->hide(); duplicateNewsMode_->hide(); } return tab; } //------------------------------------------------------------------------------ QWidget* FeedPropertiesDialog::createReadingTab() { QWidget* returnVal = new QWidget(); QVBoxLayout* tabLayout = new QVBoxLayout(returnVal); tabLayout->setMargin(10); tabLayout->setSpacing(5); QWidget* clickActionWidgets = OptionsDialog::createClickActionWidgets(singleClickAction, doubleClickAction, middleClickAction, true); tabLayout->addWidget(clickActionWidgets); tabLayout->addStretch(); return returnVal; } //------------------------------------------------------------------------------ QWidget *FeedPropertiesDialog::createDisplayTab() { QWidget* returnVal = new QWidget(); QVBoxLayout* tabLayout = new QVBoxLayout(returnVal); { tabLayout->setMargin(10); tabLayout->setSpacing(5); loadImagesOn_ = new QCheckBox(tr("Load images")); loadImagesOn_->setTristate(true); javaScriptEnable_ = new QCheckBox(tr("Enable JavaScript")); javaScriptEnable_->setTristate(true); showDescriptionNews_ = new QCheckBox(tr("Show news' description instead of loading web page")); layoutDirection_ = new QCheckBox(tr("Right-to-left layout")); tabLayout->addWidget(loadImagesOn_); tabLayout->addWidget(javaScriptEnable_); tabLayout->addWidget(showDescriptionNews_); tabLayout->addWidget(layoutDirection_); tabLayout->addStretch(); } return returnVal; } //------------------------------------------------------------------------------ QWidget *FeedPropertiesDialog::createColumnsTab() { QWidget *tab = new QWidget(); columnsTree_ = new QTreeWidget(this); columnsTree_->setObjectName("columnsTree"); columnsTree_->setIndentation(0); columnsTree_->setColumnCount(2); columnsTree_->setColumnHidden(1, true); columnsTree_->setSortingEnabled(false); columnsTree_->setHeaderHidden(true); #ifdef HAVE_QT5 columnsTree_->header()->setSectionResizeMode(0, QHeaderView::Stretch); #else columnsTree_->header()->setResizeMode(0, QHeaderView::Stretch); #endif QStringList treeItem; treeItem << "Name" << "Index"; columnsTree_->setHeaderLabels(treeItem); sortByColumnBox_ = new QComboBox(this); sortOrderBox_ = new QComboBox(this); treeItem.clear(); treeItem << tr("Ascending") << tr("Descending"); sortOrderBox_->addItems(treeItem); QHBoxLayout *styleLayout = new QHBoxLayout(); styleLayout->setMargin(0); styleLayout->addWidget(new QLabel(tr("Sort by:"))); styleLayout->addWidget(sortByColumnBox_); styleLayout->addSpacing(10); styleLayout->addWidget(sortOrderBox_); styleLayout->addStretch(); QWidget *styleWidget = new QWidget(this); styleWidget->setLayout(styleLayout); QVBoxLayout *mainVLayout = new QVBoxLayout(); mainVLayout->addWidget(columnsTree_, 1); mainVLayout->addWidget(styleWidget); addButtonMenu_ = new QMenu(this); addButton_ = new QPushButton(tr("Add")); addButton_->setMenu(addButtonMenu_); connect(addButtonMenu_, SIGNAL(aboutToShow()), this, SLOT(showMenuAddButton())); connect(addButtonMenu_, SIGNAL(triggered(QAction*)), this, SLOT(addColumn(QAction*))); removeButton_ = new QPushButton(tr("Remove")); removeButton_->setEnabled(false); connect(removeButton_, SIGNAL(clicked()), this, SLOT(removeColumn())); moveUpButton_ = new QPushButton(tr("Move up")); moveUpButton_->setEnabled(false); connect(moveUpButton_, SIGNAL(clicked()), this, SLOT(moveUpColumn())); moveDownButton_ = new QPushButton(tr("Move down")); moveDownButton_->setEnabled(false); connect(moveDownButton_, SIGNAL(clicked()), this, SLOT(moveDownColumn())); QPushButton *defaultButton = new QPushButton(tr("Default")); connect(defaultButton, SIGNAL(clicked()), this, SLOT(defaultColumns())); QVBoxLayout *buttonsVLayout = new QVBoxLayout(); buttonsVLayout->addWidget(addButton_); buttonsVLayout->addWidget(removeButton_); buttonsVLayout->addSpacing(10); buttonsVLayout->addWidget(moveUpButton_); buttonsVLayout->addWidget(moveDownButton_); buttonsVLayout->addSpacing(10); buttonsVLayout->addWidget(defaultButton); buttonsVLayout->addStretch(); QHBoxLayout *tabLayout = new QHBoxLayout(tab); tabLayout->setMargin(10); tabLayout->setSpacing(5); tabLayout->addLayout(mainVLayout); tabLayout->addLayout(buttonsVLayout); connect(columnsTree_, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotCurrentColumnChanged(QTreeWidgetItem*,QTreeWidgetItem*))); return tab; } //------------------------------------------------------------------------------ QWidget *FeedPropertiesDialog::createAuthenticationTab() { QWidget *tab = new QWidget(); authentication_ = new QGroupBox(this); authentication_->setTitle(tr("Server requires authentication:")); authentication_->setCheckable(true); authentication_->setChecked(false); user_ = new LineEdit(this); pass_ = new LineEdit(this); pass_->setEchoMode(QLineEdit::Password); QGridLayout *authenticationLayout = new QGridLayout(); authenticationLayout->addWidget(new QLabel(tr("Username:")), 2, 0); authenticationLayout->addWidget(user_, 2, 1); authenticationLayout->addWidget(new QLabel(tr("Password:")), 3, 0); authenticationLayout->addWidget(pass_, 3, 1); authentication_->setLayout(authenticationLayout); QVBoxLayout *tabLayout = new QVBoxLayout(tab); tabLayout->setMargin(10); tabLayout->setSpacing(5); tabLayout->addWidget(authentication_); tabLayout->addStretch(1); return tab; } //------------------------------------------------------------------------------ QWidget *FeedPropertiesDialog::createStatusTab() { QWidget *tab = new QWidget(); statusFeed_ = new QLabel(); statusFeed_->setWordWrap(true); createdFeed_ = new QLabel(); lastUpdateFeed_ = new QLabel(); newsCount_ = new QLabel(); QLabel *feedsCountLabel = new QLabel(tr("Feeds count:")); feedsCount_ = new QLabel(); QLabel *descriptionLabel = new QLabel(tr("Description:")); descriptionText_ = new QTextEdit(); descriptionText_->setReadOnly(true); QGridLayout *layoutGrid = new QGridLayout(); layoutGrid->setColumnStretch(1,1); layoutGrid->addWidget(new QLabel(tr("Status:")), 0, 0); layoutGrid->addWidget(statusFeed_, 0, 1); layoutGrid->addWidget(new QLabel(tr("Created:")), 1, 0); layoutGrid->addWidget(createdFeed_, 1, 1); layoutGrid->addWidget(new QLabel(tr("Last update:")), 2, 0); layoutGrid->addWidget(lastUpdateFeed_, 2, 1); layoutGrid->addWidget(new QLabel(tr("News count:")), 3, 0); layoutGrid->addWidget(newsCount_, 3, 1); layoutGrid->addWidget(feedsCountLabel, 4, 0); layoutGrid->addWidget(feedsCount_, 4, 1); layoutGrid->addWidget(descriptionLabel, 5, 0, 1, 1, Qt::AlignTop); layoutGrid->addWidget(descriptionText_, 5, 1, 1, 1, Qt::AlignTop); QVBoxLayout *tabLayout = new QVBoxLayout(tab); tabLayout->setMargin(10); tabLayout->setSpacing(5); tabLayout->addLayout(layoutGrid); tabLayout->addStretch(1); if (!isFeed_) { descriptionLabel->hide(); descriptionText_->hide(); } else { feedsCountLabel->hide(); feedsCount_->hide(); } return tab; } //------------------------------------------------------------------------------ /*virtual*/ void FeedPropertiesDialog::showEvent(QShowEvent *) { editTitle->setText(feedProperties.general.text); editURL->setText(feedProperties.general.url); editURL->selectAll(); editURL->setFocus(); labelHomepage->setText(QString("%1").arg(feedProperties.general.homepage)); selectIconButton_->setIcon(windowIcon()); updateEnable_->setChecked(feedProperties.general.updateEnable); updateInterval_->setValue(feedProperties.general.updateInterval); updateIntervalType_->setCurrentIndex(feedProperties.general.intervalType + 1); disableUpdate_->setChecked(feedProperties.general.disableUpdate); displayOnStartup->setChecked(feedProperties.general.displayOnStartup); starredOn_->setChecked(feedProperties.general.starred); duplicateNewsMode_->setChecked(feedProperties.general.duplicateNewsMode); int curClickValIdx = singleClickAction->findData((int)feedProperties.mouse.singleClickAction); singleClickAction->setCurrentIndex(curClickValIdx); curClickValIdx = singleClickAction->findData((int)feedProperties.mouse.doubleClickAction); doubleClickAction->setCurrentIndex(curClickValIdx); curClickValIdx = singleClickAction->findData((int)feedProperties.mouse.middleClickAction); middleClickAction->setCurrentIndex(curClickValIdx); loadImagesOn_->setCheckState((Qt::CheckState)feedProperties.display.displayEmbeddedImages); javaScriptEnable_->setCheckState((Qt::CheckState)feedProperties.display.javaScriptEnable); showDescriptionNews_->setChecked(!feedProperties.display.displayNews); layoutDirection_->setChecked(feedProperties.display.layoutDirection); for (int i = 0; i < feedProperties.column.columns.count(); ++i) { int index = feedProperties.column.indexList.indexOf(feedProperties.column.columns.at(i)); QString name = feedProperties.column.nameList.at(index); QStringList treeItem; treeItem << name << QString::number(feedProperties.column.columns.at(i)); QTreeWidgetItem *item = new QTreeWidgetItem(treeItem); columnsTree_->addTopLevelItem(item); } for (int i = 0; i < feedProperties.column.indexList.count(); ++i) { sortByColumnBox_->addItem(feedProperties.column.nameList.at(i), feedProperties.column.indexList.at(i)); if (feedProperties.column.sortBy == feedProperties.column.indexList.at(i)) sortByColumnBox_->setCurrentIndex(i); } sortOrderBox_->setCurrentIndex(feedProperties.column.sortType); authentication_->setChecked(feedProperties.authentication.on); user_->setText(feedProperties.authentication.user); pass_->setText(feedProperties.authentication.pass); QString status = feedProperties.status.feedStatus; if (status.isEmpty() || (status == "0")) statusFeed_->setText(tr("Good")); else statusFeed_->setText(status.section(" ", 1)); descriptionText_->setText(feedProperties.status.description); if (feedProperties.status.createdTime.isValid()) createdFeed_->setText(feedProperties.status.createdTime.toString("dd.MM.yy hh:mm")); else createdFeed_->setText(tr("Long ago ;-)")); QString lastBuildDate = feedProperties.status.lastBuildDate.toString("dd.MM.yy hh:mm"); if (!lastBuildDate.isEmpty()) lastBuildDate = QString(" (%1)").arg(lastBuildDate); lastUpdateFeed_->setText(QString("%1%2"). arg(feedProperties.status.lastUpdate.toString("dd.MM.yy hh:mm")). arg(lastBuildDate) ); newsCount_->setText(QString("%1 (%2 %3, %4 %5)"). arg(feedProperties.status.undeleteCount). arg(feedProperties.status.newCount). arg(tr("new")). arg(feedProperties.status.unreadCount). arg(tr("unread"))); feedsCount_->setText(QString("%1").arg(feedProperties.status.feedsCount)); } //------------------------------------------------------------------------------ void FeedPropertiesDialog::setDefaultTitle() { editTitle->setText(feedProperties.general.title); } void FeedPropertiesDialog::loadDefaultIcon() { emit signalLoadIcon(feedProperties.general.homepage, feedProperties.general.url); } void FeedPropertiesDialog::selectIcon() { QString filter; foreach (QByteArray imageFormat, QImageReader::supportedImageFormats()) { if (!filter.isEmpty()) filter.append(" "); filter.append("*.").append(imageFormat); } filter = tr("Image files") + QString(" (%1)").arg(filter); QString fileName = QFileDialog::getOpenFileName(this, tr("Select Image"), QDir::homePath(), filter); if (fileName.isNull()) return; QMessageBox msgBox; msgBox.setText(tr("Load icon: can't open a file!")); msgBox.setIcon(QMessageBox::Warning); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { msgBox.exec(); return; } QPixmap pixmap; if (pixmap.loadFromData(file.readAll())) { pixmap = pixmap.scaled(16, 16, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); QByteArray faviconData; QBuffer buffer(&faviconData); buffer.open(QIODevice::WriteOnly); if (pixmap.save(&buffer, "ICO")) { slotFaviconUpdate(feedProperties.general.url, faviconData); } } else { msgBox.exec(); } file.close(); } void FeedPropertiesDialog::slotFaviconUpdate(const QString &feedUrl, const QByteArray &faviconData) { if (feedUrl == feedProperties.general.url) { feedProperties.general.image = faviconData; if (!faviconData.isNull()) { QPixmap icon; icon.loadFromData(faviconData); setWindowIcon(icon); } else if (isFeed_) { setWindowIcon(QPixmap(":/images/feed")); } else { setWindowIcon(QPixmap(":/images/folder")); } selectIconButton_->setIcon(windowIcon()); } } //------------------------------------------------------------------------------ FEED_PROPERTIES FeedPropertiesDialog::getFeedProperties() { feedProperties = feedProperties; feedProperties.general.text = editTitle->text(); feedProperties.general.url = editURL->text(); feedProperties.general.disableUpdate = disableUpdate_->isChecked(); feedProperties.general.updateEnable = updateEnable_->isChecked(); feedProperties.general.updateInterval = updateInterval_->value(); feedProperties.general.intervalType = updateIntervalType_->currentIndex() - 1; feedProperties.mouse.singleClickAction = (ENewsClickAction::Type)singleClickAction->itemData(singleClickAction->currentIndex()).toInt(); feedProperties.mouse.doubleClickAction = (ENewsClickAction::Type)doubleClickAction->itemData(doubleClickAction->currentIndex()).toInt(); feedProperties.mouse.middleClickAction = (ENewsClickAction::Type)middleClickAction->itemData(middleClickAction->currentIndex()).toInt(); feedProperties.general.displayOnStartup = displayOnStartup->isChecked(); feedProperties.general.starred = starredOn_->isChecked(); feedProperties.display.displayEmbeddedImages = loadImagesOn_->checkState(); feedProperties.display.javaScriptEnable = javaScriptEnable_->checkState(); feedProperties.display.displayNews = !showDescriptionNews_->isChecked(); feedProperties.general.duplicateNewsMode = duplicateNewsMode_->isChecked(); feedProperties.display.layoutDirection = layoutDirection_->isChecked(); feedProperties.column.columns.clear(); for (int i = 0; i < columnsTree_->topLevelItemCount(); ++i) { int index = columnsTree_->topLevelItem(i)->text(1).toInt(); feedProperties.column.columns.append(index); } feedProperties.column.sortBy = sortByColumnBox_->itemData(sortByColumnBox_->currentIndex()).toInt(); feedProperties.column.sortType = sortOrderBox_->currentIndex(); feedProperties.authentication.on = authentication_->isChecked(); feedProperties.authentication.user = user_->text(); feedProperties.authentication.pass = pass_->text(); return(feedProperties); } //------------------------------------------------------------------------------ void FeedPropertiesDialog::setFeedProperties(FEED_PROPERTIES properties) { feedProperties = properties; } //------------------------------------------------------------------------------ void FeedPropertiesDialog::slotCurrentColumnChanged(QTreeWidgetItem *current, QTreeWidgetItem *) { if (columnsTree_->indexOfTopLevelItem(current) == 0) moveUpButton_->setEnabled(false); else moveUpButton_->setEnabled(true); if (columnsTree_->indexOfTopLevelItem(current) == (columnsTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); else moveDownButton_->setEnabled(true); if (columnsTree_->indexOfTopLevelItem(current) < 0) { removeButton_->setEnabled(false); moveUpButton_->setEnabled(false); moveDownButton_->setEnabled(false); } else { removeButton_->setEnabled(true); } } //------------------------------------------------------------------------------ void FeedPropertiesDialog::showMenuAddButton() { QListIterator iter(addButtonMenu_->actions()); while (iter.hasNext()) { QAction *nextAction = iter.next(); delete nextAction; } for (int i = 0; i < feedProperties.column.indexList.count(); ++i) { int index = feedProperties.column.indexList.at(i); QList treeItems = columnsTree_->findItems(QString::number(index), Qt::MatchFixedString, 1); if (!treeItems.count()) { QAction *action = addButtonMenu_->addAction(feedProperties.column.nameList.at(i)); action->setData(index); } } } //------------------------------------------------------------------------------ void FeedPropertiesDialog::addColumn(QAction *action) { QStringList treeItem; treeItem << action->text() << action->data().toString(); QTreeWidgetItem *item = new QTreeWidgetItem(treeItem); columnsTree_->addTopLevelItem(item); } //------------------------------------------------------------------------------ void FeedPropertiesDialog::removeColumn() { int row = columnsTree_->currentIndex().row(); columnsTree_->takeTopLevelItem(row); if (columnsTree_->currentIndex().row() == 0) moveUpButton_->setEnabled(false); if (columnsTree_->currentIndex().row() == (columnsTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); } //------------------------------------------------------------------------------ void FeedPropertiesDialog::moveUpColumn() { int row = columnsTree_->currentIndex().row(); QTreeWidgetItem *treeWidgetItem = columnsTree_->takeTopLevelItem(row-1); columnsTree_->insertTopLevelItem(row, treeWidgetItem); if (columnsTree_->currentIndex().row() == 0) moveUpButton_->setEnabled(false); if (columnsTree_->currentIndex().row() != (columnsTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(true); } //------------------------------------------------------------------------------ void FeedPropertiesDialog::moveDownColumn() { int row = columnsTree_->currentIndex().row(); QTreeWidgetItem *treeWidgetItem = columnsTree_->takeTopLevelItem(row+1); columnsTree_->insertTopLevelItem(row, treeWidgetItem); if (columnsTree_->currentIndex().row() != 0) moveUpButton_->setEnabled(true); if (columnsTree_->currentIndex().row() == (columnsTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); } //------------------------------------------------------------------------------ void FeedPropertiesDialog::defaultColumns() { columnsTree_->clear(); for (int i = 0; i < feedProperties.columnDefault.columns.count(); ++i) { int index = feedProperties.column.indexList.indexOf(feedProperties.columnDefault.columns.at(i)); QString name = feedProperties.column.nameList.at(index); QStringList treeItem; treeItem << name << QString::number(feedProperties.columnDefault.columns.at(i)); QTreeWidgetItem *item = new QTreeWidgetItem(treeItem); columnsTree_->addTopLevelItem(item); } for (int i = 0; i < feedProperties.column.indexList.count(); ++i) { if (feedProperties.columnDefault.sortBy == feedProperties.column.indexList.at(i)) sortByColumnBox_->setCurrentIndex(i); } sortOrderBox_->setCurrentIndex(feedProperties.columnDefault.sortType); } quiterss-0.18.3/src/feedpropertiesdialog.h000066400000000000000000000163161265173051100206320ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FEEDPROPERTIESDIALOG_H #define FEEDPROPERTIESDIALOG_H #include "dialog.h" #include "lineedit.h" #include "toolbutton.h" #include "optionsdialog.h" //! Feed properties structure typedef struct { //! General properties struct general{ QString text; //!< Text field from feed-xml QString title; //!< Title field from feed-xml QString url; //!< URL field from feed-xml QString homepage; //!< Homepage field from feed-xml QByteArray image; bool disableUpdate; bool updateEnable; //!< Flag enabling autoupdate int updateInterval; //!< Update interval int intervalType; //!< Update interval type (sec, min, day) bool updateOnStartup; //!< Flag to update feed on startup int displayOnStartup; //!< Flag to display feed on startup in sepatare tab bool starred; //!< Starred feed (favourite) bool duplicateNewsMode; //!< Automatically delete news duplicates } general; //! Autthentication properties struct authentication{ bool on; //!< Enabling flag QString user; //!< Username QString pass; //!< User password } authentication; //! Reading properties struct reading{ bool markSelectedAsRead; //!< Mark focused news as Read quint32 markSelectedTime; //!< Mark focused news as Read after elapsed time (sec) bool markReadWhileReading; //!< Mark news as Read while reading in newspaper layout bool markDisplayedAsReadWhenSwitch; //!< Mark displayed news as Read on switching feed bool markDisplayedAsReadWhenClose; //!< Mark displayed news as Read on closing tab bool markDisplayedAsReadOnMin; //!< Mark displayed news as Read on minimize } reading ; //! Display properties struct display { quint16 layoutType; //!< display layout quint16 filterType; //!< Filter mode quint16 groupType; //!< Group mode int displayNews; //!< Display news mode int displayEmbeddedImages; //!< Display embedded images bool loadMoviesAndOtherContent; //!< Flag to load media content bool openLink; //!< Flag to open news link int layoutDirection; //!< LTR or RTL layout int javaScriptEnable; } display; //! Columns properties struct column { QList columns; //!< Indexes list of columns to display int sortBy; //!< Index of column to sort by int sortType; //!< Type of sort (ascending|descending - 0|1) QList indexList; //!< Indexes list of all columns QStringList nameList; //!< Names list of all columns } column; //! Columns default properties struct columnDefault { QList columns; //!< List of column to display int sortBy; //!< Name of column to sort by int sortType; //!< Type of sort (ascending|descending) } columnDefault; //! Cleaup properties struct cleanup { bool enableMaxNews; //!< Enable flag for \a maxNewsToKeep quint32 maxNewsToKeep; //!< Maximum number of news to keep in DB bool enableAgeNews; //!< Enable flag for \a ageOfNewsToKeep quint32 ageOfNewsToKeep; //!< Time to keep news (days) bool deleteReadNews; //!< Flag to delete already read news bool neverDeleteUnread; //!< Flag to never delete unread news bool neverDeleteLabeled; //!< Flag to never delete labeled news } cleanup; //! Status properties struct status { QString feedStatus; //!< Feed status QString description; //!< Feed description QDateTime createdTime; //!< Time when feed created QDateTime lastDisplayed; //!< Last time that feed displayed QDateTime lastUpdate; //!< Time of feed last update QDateTime lastBuildDate; int undeleteCount; //!< Number of all news int newCount; //!< Number of new news int unreadCount; //!< Number of unread news int feedsCount; //!< Number of feeds } status; //! Mouse properties struct mouse { ENewsClickAction::Type singleClickAction; //!< Action to take on single click ENewsClickAction::Type doubleClickAction; //!< Action to take on double click ENewsClickAction::Type middleClickAction; //!< Action to take on middle click } mouse; } FEED_PROPERTIES; //! Feed properties dialog class FeedPropertiesDialog : public Dialog { Q_OBJECT public: explicit FeedPropertiesDialog(bool isFeed, QWidget *parent); FEED_PROPERTIES getFeedProperties(); //!< Get feed properties from dialog void setFeedProperties(FEED_PROPERTIES properties); //!< Set feed properties into dialog public slots: void slotFaviconUpdate(const QString &feedUrl, const QByteArray &faviconData); signals: void signalLoadIcon(const QString &urlString, const QString &feedUrl); protected: virtual void showEvent(QShowEvent *); private slots: void setDefaultTitle(); void loadDefaultIcon(); void selectIcon(); void slotCurrentColumnChanged(QTreeWidgetItem *current, QTreeWidgetItem *); void showMenuAddButton(); void addColumn(QAction *action); void removeColumn(); void moveUpColumn(); void moveDownColumn(); void defaultColumns(); private: QTabWidget *tabWidget; // Tab "General" LineEdit *editURL; //!< Feed URL LineEdit *editTitle; //!< Feed title QLabel *labelHomepage; //!< Link to feed's homepage QToolButton *selectIconButton_; QCheckBox *disableUpdate_; QCheckBox *updateEnable_; QSpinBox *updateInterval_; QComboBox *updateIntervalType_; QCheckBox *displayOnStartup; QCheckBox *starredOn_; QCheckBox *duplicateNewsMode_; QWidget *createGeneralTab(); // Tab "Mouse" QComboBox* singleClickAction; QComboBox* doubleClickAction; QComboBox* middleClickAction; QWidget* createReadingTab(); // Tab "Display" QCheckBox *showDescriptionNews_; QCheckBox *loadImagesOn_; QCheckBox *javaScriptEnable_; QCheckBox *layoutDirection_; QWidget *createDisplayTab(); // Tab "Columns" QTreeWidget *columnsTree_; QComboBox *sortByColumnBox_; QComboBox *sortOrderBox_; QMenu *addButtonMenu_; QPushButton *addButton_; QPushButton *removeButton_; QPushButton *moveUpButton_; QPushButton *moveDownButton_; QWidget *createColumnsTab(); // Tab "Authentication" QGroupBox *authentication_; LineEdit *user_; LineEdit *pass_; QWidget *createAuthenticationTab(); // Tab "Status" QLabel *statusFeed_; QTextEdit *descriptionText_; QLabel *createdFeed_; QLabel *lastUpdateFeed_; QLabel *newsCount_; QLabel *feedsCount_; QWidget *createStatusTab(); FEED_PROPERTIES feedProperties; bool isFeed_; }; #endif // FEEDPROPERTIESDIALOG_H quiterss-0.18.3/src/feedsview/000077500000000000000000000000001265173051100162335ustar00rootroot00000000000000quiterss-0.18.3/src/feedsview/feedsmodel.cpp000066400000000000000000000270061265173051100210530ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "feedsmodel.h" #include "feedsproxymodel.h" #include #include FeedsModel::FeedsModel(QObject *parent) : QAbstractItemModel(parent) , defaultIconFeeds_(false) , view_(0) , rootParentId_(0) { setObjectName("FeedsModel"); refresh(); } FeedsModel::~FeedsModel() { clear(); } void FeedsModel::clear() { id2RowList_.clear(); parid2RowList_.clear(); columnsList_.clear(); qDeleteAll(userDataList_); userDataList_.clear(); } void FeedsModel::refresh() { #ifdef HAVE_QT5 beginResetModel(); clear(); endResetModel(); #else reset(); clear(); #endif queryModel_.setQuery("SELECT * FROM feeds ORDER BY parentId, rowToParent"); while (queryModel_.canFetchMore()) queryModel_.fetchMore(); indexId_ = queryModel_.record().indexOf("id"); indexParid_ = queryModel_.record().indexOf("parentId"); for (int i = 0; i < queryModel_.record().count(); i++) { columnsList_[i] = i; } columnsList_[0] = queryModel_.record().indexOf("text"); columnsList_[queryModel_.record().indexOf("text")] = 0; for (int i = 0; i < queryModel_.rowCount(); i++) { int id = queryModel_.record(i).value(indexId_).toInt(); id2RowList_[id] = i; int parid = queryModel_.record(i).value(indexParid_).toInt(); parid2RowList_[i] = parid; userDataList_[id] = new UserData(id, parid, queryModel_.record(i)); } } UserData * FeedsModel::userDataById(int id) const { return userDataList_.value(id, 0); } int FeedsModel::rowById(int id) const { return id2RowList_.value(id, -1); } int FeedsModel::rowByParid(int parid) const { return parid2RowList_.key(parid, -1); } int FeedsModel::rowCount(const QModelIndex &parent) const { if (parent.isValid()) return parid2RowList_.keys(idByIndex(parent)).count(); else return parid2RowList_.keys(rootParentId_).count(); } int FeedsModel::columnCount(const QModelIndex&) const { return queryModel_.record().count(); } QModelIndex FeedsModel::index(int row, int column, const QModelIndex &parent) const { if (row == -1) return QModelIndex(); int id = 0; if (parent.isValid()) id = id2RowList_.key(row + rowByParid(idByIndex(parent)), 0); else id = id2RowList_.key(row, 0); UserData *userData = userDataById(id); if (userData) return createIndex(row, column, userData); else return QModelIndex(); } QModelIndex FeedsModel::parent(const QModelIndex &index) const { if (!index.isValid()) return QModelIndex(); int parid = paridByIndex(index); if (parid == rootParentId_) return QModelIndex(); UserData *userData = userDataById(parid); if (userData) { int row = rowById(parid) - rowByParid(userData->parid); return createIndex(row, 0, userData); } else { return QModelIndex(); } } QVariant FeedsModel::data(const QModelIndex &index, int role) const { if (role == Qt::FontRole) { QFont font = font_; if (indexColumnOf("text") == index.column()) { if (0 < indexSibling(index, "unread").data(Qt::EditRole).toInt()) font.setBold(true); } return font; } else if (role == Qt::DisplayRole){ if (indexColumnOf("unread") == index.column()) { int unread = indexSibling(index, "unread").data(Qt::EditRole).toInt(); if (0 == unread) { return QVariant(); } else { QString qStr = QString("(%1)").arg(unread); return qStr; } } else if (indexColumnOf("undeleteCount") == index.column()) { QString qStr = QString("(%1)"). arg(indexSibling(index, "undeleteCount").data(Qt::EditRole).toInt()); return qStr; } else if (indexColumnOf("updated") == index.column()) { QDateTime dtLocal; QString strDate = indexSibling(index, "updated").data(Qt::EditRole).toString(); if (!strDate.isNull()) { QDateTime dtLocalTime = QDateTime::currentDateTime(); QDateTime dtUTC = QDateTime(dtLocalTime.date(), dtLocalTime.time(), Qt::UTC); int nTimeShift = dtLocalTime.secsTo(dtUTC); QDateTime dt = QDateTime::fromString(strDate, Qt::ISODate); dtLocal = dt.addSecs(nTimeShift); QString strResult; if (QDateTime::currentDateTime().date() <= dtLocal.date()) strResult = dtLocal.toString(formatTime_); else strResult = dtLocal.toString(formatDate_); return strResult; } else { return QVariant(); } } } else if (role == Qt::TextColorRole) { if (indexColumnOf("unread") == index.column()) { return QColor(countNewsUnreadColor_); } QModelIndex currentIndex = ((FeedsProxyModel*)view_->model())->mapToSource(view_->currentIndex()); if ((index.row() == currentIndex.row()) && (index.parent() == currentIndex.parent()) && view_->selectionModel()->selectedRows(0).count()) { return QColor(focusedFeedTextColor_); } if (indexColumnOf("text") == index.column()) { if (indexSibling(index, "newCount").data(Qt::EditRole).toInt() > 0) { return QColor(feedWithNewNewsColor_); } } if (indexColumnOf("text") == index.column()) { if (indexSibling(index, "disableUpdate").data(Qt::EditRole).toBool()) { return QColor(feedDisabledUpdateColor_); } } return QColor(textColor_); } else if (role == Qt::BackgroundRole) { QModelIndex currentIndex = ((FeedsProxyModel*)view_->model())->mapToSource(view_->currentIndex()); if ((index.row() == currentIndex.row()) && (index.parent() == currentIndex.parent()) && view_->selectionModel()->selectedRows(0).count()) { if (!focusedFeedBGColor_.isEmpty()) return QColor(focusedFeedBGColor_); } } else if (role == Qt::DecorationRole) { if (indexColumnOf("text") == index.column()) { if (isFolder(index)) { return QPixmap(":/images/folder"); } else { if (!defaultIconFeeds_) { QByteArray byteArray = indexSibling(index, "image").data(Qt::EditRole).toByteArray(); if (!byteArray.isNull()) { QImage resultImage; if (resultImage.loadFromData(QByteArray::fromBase64(byteArray))) { QString strStatus = indexSibling(index, "status").data(Qt::EditRole).toString(); if (strStatus.section(" ", 0, 0).toInt() != 0) { QImage image; if (strStatus.section(" ", 0, 0).toInt() < 0) image.load(":/images/bulletError"); else if (strStatus.section(" ", 0, 0).toInt() == 1) image.load(":/images/bulletUpdate"); QPainter resultPainter(&resultImage); resultPainter.setCompositionMode(QPainter::CompositionMode_SourceOver); resultPainter.drawImage(0, 0, image); resultPainter.end(); } return resultImage; } } } QImage resultImage(":/images/feed"); QString strStatus = indexSibling(index, "status").data(Qt::EditRole).toString(); if (strStatus.section(" ", 0, 0).toInt() != 0) { QImage image; if (strStatus.section(" ", 0, 0).toInt() < 0) image.load(":/images/bulletError"); else if (strStatus.section(" ", 0, 0).toInt() == 1) image.load(":/images/bulletUpdate"); QPainter resultPainter(&resultImage); resultPainter.setCompositionMode(QPainter::CompositionMode_SourceOver); resultPainter.drawImage(0, 0, image); resultPainter.end(); } return resultImage; } } } else if (role == Qt::TextAlignmentRole) { if (indexColumnOf("id") == index.column()) { int flag = Qt::AlignRight|Qt::AlignVCenter; return flag; } } else if (role == Qt::ToolTipRole) { if (indexColumnOf("text") == index.column()) { QString title = index.data(Qt::EditRole).toString(); QRect rectText = view_->visualRect(index); int width = rectText.width() - 16 - 12; QFont font = font_; if (0 < indexSibling(index, "unread").data(Qt::EditRole).toInt()) font.setBold(true); QFontMetrics fontMetrics(font); if (width < fontMetrics.width(title)) return title; } return QString(""); } if (!((role == Qt::EditRole) || (role == Qt::DisplayRole))) return QVariant(); QSqlRecord record = static_cast(index.internalPointer())->record; return record.value(indexColumnOf(index.column())); } bool FeedsModel::setData(const QModelIndex &index, const QVariant &value, int) { if (!index.isValid()) return false; QSqlRecord *record = &static_cast(index.internalPointer())->record; record->setValue(indexColumnOf(index.column()), value); return true; } Qt::ItemFlags FeedsModel::flags(const QModelIndex &index) const { Qt::ItemFlags defaultFlags = QAbstractItemModel::flags(index); if (index.isValid()) return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags; else return Qt::ItemIsDropEnabled | defaultFlags; } Qt::DropActions FeedsModel::supportedDropActions() const { return Qt::MoveAction; } QModelIndex FeedsModel::indexById(int id) const { QModelIndex parentIndex = QModelIndex(); UserData *userData = userDataById(id); if (userData) parentIndex = indexById(userData->parid); for (int i = 0; i < rowCount(parentIndex); i++) { if (idByIndex(index(i, 0, parentIndex)) == id) return index(i,0,parentIndex); } return QModelIndex(); } int FeedsModel::idByIndex(const QModelIndex &index) const { if (index.isValid()) return static_cast(index.internalPointer())->id; return 0; } int FeedsModel::paridByIndex(const QModelIndex &index) const { if (index.isValid()) return static_cast(index.internalPointer())->parid; return 0; } int FeedsModel::indexColumnOf(int column) const { return columnsList_.value(column, column); } int FeedsModel::indexColumnOf(const QString &name) const { return indexColumnOf(queryModel_.record().indexOf(name)); } void FeedsModel::setView(QTreeView *view) { view_ = view; } QVariant FeedsModel::dataField(const QModelIndex &index, const QString &fieldName) const { return indexSibling(index, fieldName).data(Qt::EditRole); } /** @brief Check if item is folder * * If xmlUrl field is empty, than item is considered folder * @param index Item to check * @return Is folder sign * @retval true Index item is category * @retval false Index item is feed *---------------------------------------------------------------------------*/ bool FeedsModel::isFolder(const QModelIndex &index) const { return indexSibling(index, "xmlUrl").data(Qt::EditRole).toString().isEmpty(); } QModelIndex FeedsModel::indexSibling(const QModelIndex &index, const QString &fieldName) const { return this->index(index.row(), indexColumnOf(fieldName), index.parent()); } quiterss-0.18.3/src/feedsview/feedsmodel.h000066400000000000000000000060211265173051100205120ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FEEDSMODEL_H #define FEEDSMODEL_H #include #include #include struct UserData { UserData(int id, int parid, const QSqlRecord &record) : id(id) , parid(parid), record(record) { } ~UserData() { } int id; int parid; QSqlRecord record; }; class FeedsModel : public QAbstractItemModel { Q_OBJECT public: explicit FeedsModel(QObject *parent = 0); ~FeedsModel(); void setView(QTreeView *view); QVariant dataField(const QModelIndex &index, const QString &fieldName) const; bool isFolder(const QModelIndex &index) const; QModelIndex indexSibling(const QModelIndex &index, const QString &fieldName) const; int rowCount(const QModelIndex &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const; QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; QModelIndex parent(const QModelIndex &index) const; QVariant data(const QModelIndex &index, int role) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); Qt::ItemFlags flags(const QModelIndex &index) const; Qt::DropActions supportedDropActions() const; int idByIndex(const QModelIndex &index) const; QModelIndex indexById(int id) const; int paridByIndex(const QModelIndex &index) const; int indexColumnOf(int column) const; int indexColumnOf(const QString &name) const; QFont font_; QString formatDate_; QString formatTime_; bool defaultIconFeeds_; QString textColor_; QString backgroundColor_; QString feedWithNewNewsColor_; QString countNewsUnreadColor_; QString focusedFeedTextColor_; QString focusedFeedBGColor_; QString feedDisabledUpdateColor_; public slots: void refresh(); private: void clear(); int rowById(int id) const; int rowByParid(int parid) const; UserData * userDataById(int id) const; QTreeView *view_; QSqlQueryModel queryModel_; int rootParentId_; int indexId_; int indexParid_; QMap id2RowList_; QMap parid2RowList_; QMap userDataList_; QHash columnsList_; }; #endif // FEEDSMODEL_H quiterss-0.18.3/src/feedsview/feedsproxymodel.cpp000066400000000000000000000061551265173051100221570ustar00rootroot00000000000000#include "feedsproxymodel.h" #include "feedsmodel.h" FeedsProxyModel::FeedsProxyModel(QObject *parent) : QSortFilterProxyModel(parent) , filterAct_("filterFeedsAll_") { setObjectName("FeedsProxyModel"); } FeedsProxyModel::~FeedsProxyModel() { } void FeedsProxyModel::reset() { #ifdef HAVE_QT5 QSortFilterProxyModel::beginResetModel(); QSortFilterProxyModel::endResetModel(); #else QSortFilterProxyModel::reset(); #endif } void FeedsProxyModel::setFilter(const QString &filterAct, const QList &idList, const QString &findAct, const QString &findText) { if ((filterAct_ != filterAct) || (filterAct != "filterFeedsAll_") || (findAct_ != findAct) || (findText_ != findText) || (idList_ != idList)) { filterAct_ = filterAct; findAct_ = findAct; findText_ = findText; idList_ = idList; invalidateFilter(); } } bool FeedsProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { bool accept = false; QModelIndex index; if (filterAct_ == "filterFeedsAll_") { accept = true; } else if (filterAct_ == "filterFeedsNew_") { index = sourceModel()->index(sourceRow, ((FeedsModel*)sourceModel())->indexColumnOf("newCount"), sourceParent); if (sourceModel()->data(index, Qt::EditRole).toInt() > 0) accept = true; } else if (filterAct_ == "filterFeedsUnread_") { index = sourceModel()->index(sourceRow, ((FeedsModel*)sourceModel())->indexColumnOf("unread"), sourceParent); if (sourceModel()->data(index, Qt::EditRole).toInt() > 0) accept = true; } if (idList_.count()) { index = sourceModel()->index(sourceRow, ((FeedsModel*)sourceModel())->indexColumnOf("id"), sourceParent); if (idList_.contains(sourceModel()->data(index, Qt::EditRole).toInt())) accept = true; } if (accept && !findText_.isEmpty()) { index = sourceModel()->index(sourceRow, ((FeedsModel*)sourceModel())->indexColumnOf("xmlUrl"), sourceParent); if (!sourceModel()->data(index, Qt::EditRole).toString().isEmpty()) { if (findAct_ == "findLinkAct") { accept = sourceModel()->data(index, Qt::EditRole).toString().contains(findText_, Qt::CaseInsensitive); } else { index = sourceModel()->index(sourceRow, ((FeedsModel*)sourceModel())->indexColumnOf("text"), sourceParent); accept = sourceModel()->data(index, Qt::EditRole).toString().contains(findText_, Qt::CaseInsensitive); } } } return accept; } QModelIndex FeedsProxyModel::mapFromSource(const QModelIndex & sourceIndex) const { return QSortFilterProxyModel::mapFromSource(sourceIndex); } QModelIndex FeedsProxyModel::mapFromSource(int id) const { return QSortFilterProxyModel::mapFromSource(((FeedsModel*)sourceModel())->indexById(id)); } QModelIndex FeedsProxyModel::index(int row, int column, const QModelIndex & parent) const { return QSortFilterProxyModel::index(row, column, parent); } QModelIndex FeedsProxyModel::index(int row, const QString& fieldName, const QModelIndex & parent) const { int column = ((FeedsModel*)sourceModel())->indexColumnOf(fieldName); return QSortFilterProxyModel::index(row, column, parent); } quiterss-0.18.3/src/feedsview/feedsproxymodel.h000066400000000000000000000015751265173051100216250ustar00rootroot00000000000000#ifndef FEEDSPROXYMODEL_H #define FEEDSPROXYMODEL_H #include class FeedsProxyModel : public QSortFilterProxyModel { Q_OBJECT public: FeedsProxyModel(QObject *parent = 0); ~FeedsProxyModel(); void reset(); void setFilter(const QString &filterAct, const QList &idList, const QString &findAct, const QString &findText); QModelIndex mapFromSource(const QModelIndex & sourceIndex) const; QModelIndex mapFromSource(int id) const; QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const; QModelIndex index(int row, const QString &fieldName, const QModelIndex & parent = QModelIndex()) const; private: bool filterAcceptsRow(int source_row, const QModelIndex &sourceParent) const; QString filterAct_; QList idList_; QString findAct_; QString findText_; }; #endif // FEEDSPROXYMODEL_H quiterss-0.18.3/src/feedsview/feedsview.cpp000066400000000000000000000527501265173051100207310ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "feedsview.h" #include "mainapplication.h" #include "feedsmodel.h" #include "delegatewithoutfocus.h" #include #include // ---------------------------------------------------------------------------- FeedsView::FeedsView(QWidget * parent) : QTreeView(parent) , selectIdEn_(true) , autocollapseFolder_(false) , sourceModel_(0) , dragPos_(QPoint()) , dragStartPos_(QPoint()) , expandedOldId_(-1) { setObjectName("feedsView_"); setFrameStyle(QFrame::NoFrame); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setEditTriggers(QAbstractItemView::NoEditTriggers); setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::ExtendedSelection); setUniformRowHeights(true); header()->setStretchLastSection(false); header()->setVisible(false); DelegateWithoutFocus *itemDelegate = new DelegateWithoutFocus(this); setItemDelegate(itemDelegate); setContextMenuPolicy(Qt::CustomContextMenu); setDragDropMode(QAbstractItemView::InternalMove); setDragEnabled(true); setAcceptDrops(true); setDropIndicatorShown(true); connect(this, SIGNAL(expanded(QModelIndex)), SLOT(slotExpanded(QModelIndex))); connect(this, SIGNAL(collapsed(QModelIndex)), SLOT(slotCollapsed(QModelIndex))); } void FeedsView::setSourceModel(FeedsModel *sourceModel) { sourceModel_ = sourceModel; QSqlQuery q; q.exec("SELECT id FROM feeds WHERE f_Expanded=1 AND (xmlUrl='' OR xmlUrl IS NULL)"); while (q.next()) { int feedId = q.value(0).toInt(); expandedList.append(feedId); } } void FeedsView::refresh() { sourceModel_->refresh(); ((FeedsProxyModel*)model())->reset(); restoreExpanded(); } void FeedsView::setColumnHidden(const QString& column, bool hide) { QTreeView::setColumnHidden(columnIndex(column),hide); } int FeedsView::columnIndex(const QString& fieldName) const { return sourceModel_->indexColumnOf(fieldName); } bool FeedsView::isFolder(const QModelIndex &index) const { if (!index.isValid()) return false; return sourceModel_->isFolder(((FeedsProxyModel*)model())->mapToSource(index)); } void FeedsView::restoreExpanded() { foreach (int id, expandedList) { QModelIndex index = ((FeedsProxyModel*)model())->mapFromSource(id); if (!isExpanded(index)) setExpanded(index, true); } } /** @brief Process item expanding *----------------------------------------------------------------------------*/ void FeedsView::slotExpanded(const QModelIndex &index) { int feedId = sourceModel_->idByIndex(((FeedsProxyModel*)model())->mapToSource(index)); if (!expandedList.contains(feedId)) { expandedList.append(feedId); mainApp->sqlQueryExec(QString("UPDATE feeds SET f_Expanded=1 WHERE id=='%1'").arg(feedId)); } if (!autocollapseFolder_ || (feedId == expandedOldId_)) return; QModelIndex indexCollapsed = ((FeedsProxyModel*)model())->mapFromSource(expandedOldId_); expandedOldId_ = feedId; if (index.parent() != indexCollapsed) collapse(indexCollapsed); int value = index.row(); QModelIndex parent = index.parent(); if (parent.isValid()) value = value + 1; while (parent.isValid()) { value = value + parent.row(); parent = parent.parent(); } verticalScrollBar()->setValue(value); } /** @brief Process item collapsing *----------------------------------------------------------------------------*/ void FeedsView::slotCollapsed(const QModelIndex &index) { int feedId = sourceModel_->idByIndex(((FeedsProxyModel*)model())->mapToSource(index)); expandedList.removeOne(feedId); mainApp->sqlQueryExec(QString("UPDATE feeds SET f_Expanded=0 WHERE id=='%1'").arg(feedId)); } void FeedsView::expandAll() { expandedList.clear(); QTreeView::expandAll(); QSqlQuery q; q.exec("SELECT id FROM feeds WHERE (xmlUrl='' OR xmlUrl IS NULL)"); while (q.next()) { int feedId = q.value(0).toInt(); expandedList.append(feedId); } mainApp->sqlQueryExec("UPDATE feeds SET f_Expanded=1 WHERE (xmlUrl='' OR xmlUrl IS NULL)"); } void FeedsView::collapseAll() { expandedList.clear(); QTreeView::collapseAll(); mainApp->sqlQueryExec("UPDATE feeds SET f_Expanded=0 WHERE (xmlUrl='' OR xmlUrl IS NULL)"); } /** @brief Find index of next unread (by meaning) feed * @details Find unread feed with condition. * @param indexCur Index to start search from * @param nextCondition Find condition: * 2 - find previous, * 1 - find next, * 0 - find next. If fails, find previous (default) * @return finded index or QModelIndex() *---------------------------------------------------------------------------*/ QModelIndex FeedsView::indexNextUnread(const QModelIndex &indexCur, int nextCondition) { if (nextCondition != 2) { // find next QModelIndex index = indexNext(indexCur); while (index.isValid()) { int feedUnreadCount = sourceModel_->dataField(((FeedsProxyModel*)model())->mapToSource(index), "unread").toInt(); if (0 < feedUnreadCount) return index; // ok index = indexNext(index); } } if (nextCondition != 1) { // find previous QModelIndex index = indexPrevious(indexCur); while (index.isValid()) { int feedUnreadCount = sourceModel_->dataField(((FeedsProxyModel*)model())->mapToSource(index), "unread").toInt(); if (0 < feedUnreadCount) return index; // ok index = indexPrevious(index); } } // find next. If fails, find previous (default) return QModelIndex(); } // ---------------------------------------------------------------------------- QModelIndex FeedsView::lastFeedInFolder(const QModelIndex &indexFolder) { QModelIndex index = QModelIndex(); for(int i = model()->rowCount(indexFolder)-1; i >= 0; --i) { index = indexFolder.child(i, columnIndex("text")); if (isFolder(index)) index = lastFeedInFolder(index); if (index.isValid()) break; } return index; } /** @brief Find index of previous feed * @param indexCur Index to start search from * @param isParent Start search from parent excluding him * @return finded index or QModelIndex() *---------------------------------------------------------------------------*/ QModelIndex FeedsView::indexPrevious(const QModelIndex &indexCur, bool isParent) { QModelIndex index = QModelIndex(); if (isFolder(indexCur) && !isParent) { index = lastFeedInFolder(indexCur); if (index.isValid()) return index; } for(int i = indexCur.row()-1; i >= 0; --i) { index = model()->index(i, columnIndex("text"), indexCur.parent()); if (isFolder(index)) index = lastFeedInFolder(index); if (index.isValid()) return index; } index = indexCur.parent(); if (index.isValid()) return indexPrevious(index, true); return QModelIndex(); } // ---------------------------------------------------------------------------- QModelIndex FeedsView::firstFeedInFolder(const QModelIndex &indexFolder) { QModelIndex index = QModelIndex(); for(int i = 0; i < model()->rowCount(indexFolder); i++) { index = indexFolder.child(i, columnIndex("text")); if (isFolder(index)) index = firstFeedInFolder(index); if (index.isValid()) break; } return index; } /** @brief Find index of next feed * @param indexCur Index to start search from * @param isParent Start search from parent excluding him * @return finded index or QModelIndex() ******************************************************************************/ QModelIndex FeedsView::indexNext(const QModelIndex &indexCur, bool isParent) { QModelIndex index = QModelIndex(); if (isFolder(indexCur) && !isParent) { index = firstFeedInFolder(indexCur); if (index.isValid()) return index; } int rowCount = model()->rowCount(indexCur.parent()); for(int i = indexCur.row()+1; i < rowCount; i++) { index = model()->index(i, columnIndex("text"), indexCur.parent()); if (isFolder(index)) index = firstFeedInFolder(index); if (index.isValid()) return index; } index = indexCur.parent(); if (index.isValid()) return indexNext(index, true); return QModelIndex(); } // ---------------------------------------------------------------------------- QModelIndex FeedsView::lastFolderInFolder(const QModelIndex &indexFolder) { if (indexFolder.isValid()) { for(int i = model()->rowCount(indexFolder)-1; i >= 0; --i) { QModelIndex index = indexFolder.child(i, columnIndex("text")); if (isFolder(index)) { return index; } } } else { for(int i = model()->rowCount(indexFolder)-1; i >= 0; --i) { QModelIndex index = model()->index(i, columnIndex("text")); if (isFolder(index)) return index; } } return QModelIndex(); } // ----------------------------------------------------------------------------- QModelIndex FeedsView::indexPreviousFolder(const QModelIndex &indexCur) { QModelIndex index = QModelIndex(); for(int i = indexCur.row()-1; i >= 0; --i) { index = model()->index(i, columnIndex("text"), indexCur.parent()); if (isFolder(index)) return index; } index = indexCur.parent(); if (index.isValid()) return index; return QModelIndex(); } // ----------------------------------------------------------------------------- QModelIndex FeedsView::firstFolderInFolder(const QModelIndex &indexFolder) { if (indexFolder.isValid()) { for(int i = 0; i < model()->rowCount(indexFolder); i++) { QModelIndex index = indexFolder.child(i, columnIndex("text")); if (isFolder(index)) { return index; } } } else { for(int i = 0; i < model()->rowCount(indexFolder); i++) { QModelIndex index = model()->index(i, columnIndex("text")); if (isFolder(index)) return index; } } return QModelIndex(); } // ----------------------------------------------------------------------------- QModelIndex FeedsView::indexNextFolder(const QModelIndex &indexCur, bool isParent) { QModelIndex index = QModelIndex(); if ((isFolder(indexCur) && !isParent)) { index = firstFolderInFolder(indexCur); if (index.isValid()) { return index; } } int rowCount = model()->rowCount(indexCur.parent()); for(int i = indexCur.row()+1; i < rowCount; i++) { index = model()->index(i, columnIndex("text"), indexCur.parent()); if (isFolder(index)) return index; } index = indexCur.parent(); if (index.isValid()) { return indexNextFolder(index, true); } return QModelIndex(); } /** @brief Own process mouse press event * @details Remember pressed index to selectedIndex_, * process middle mouse button clicks, * ignore right mouse button clicks, * call standart handler for left mouse button clicks * @param event Event data structure * @sa selectedIndex_ *---------------------------------------------------------------------------*/ void FeedsView::mousePressEvent(QMouseEvent *event) { QModelIndex index = indexAt(event->pos()); QRect rectText = visualRect(index); if (event->buttons() & Qt::RightButton) { if (event->pos().x() >= rectText.x()) { index = ((FeedsProxyModel*)model())->mapToSource(index); selectId_ = sourceModel_->idByIndex(index); } return; } if (!index.isValid()) return; if (!(event->pos().x() >= rectText.x())) { QTreeView::mousePressEvent(event); return; } indexClicked_ = index; index = ((FeedsProxyModel*)model())->mapToSource(index); selectId_ = sourceModel_->idByIndex(index); if ((event->buttons() & Qt::MiddleButton)) { emit signalMiddleClicked(); } else if (event->buttons() & Qt::LeftButton) { dragStartPos_ = event->pos(); QTreeView::mousePressEvent(event); } } // ---------------------------------------------------------------------------- void FeedsView::mouseReleaseEvent(QMouseEvent *event) { dragStartPos_ = QPoint(); QTreeView::mouseReleaseEvent(event); } // ---------------------------------------------------------------------------- /*virtual*/ void FeedsView::mouseMoveEvent(QMouseEvent *event) { if (dragStartPos_.isNull()) return; if ((event->pos() - dragStartPos_).manhattanLength() < qApp->startDragDistance()) return; event->accept(); dragPos_ = event->pos(); QMimeData *mimeData = new QMimeData; // mimeData->setText("MovingItem"); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setHotSpot(event->pos() + QPoint(10,10)); drag->exec(); } // ---------------------------------------------------------------------------- /*virtual*/ void FeedsView::mouseDoubleClickEvent(QMouseEvent *event) { QModelIndex index = indexAt(event->pos()); QRect rectText = visualRect(index); if (!index.isValid()) return; if (!(event->pos().x() >= rectText.x()) || (isFolder(index))) { QTreeView::mouseDoubleClickEvent(event); return; } if (indexClicked_ == indexAt(event->pos())) emit signalDoubleClicked(); else mousePressEvent(event); } // ---------------------------------------------------------------------------- /*virtual*/ void FeedsView::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Up) emit pressKeyUp(); else if (event->key() == Qt::Key_Down) emit pressKeyDown(); else if (event->key() == Qt::Key_Home) emit pressKeyHome(); else if (event->key() == Qt::Key_End) emit pressKeyEnd(); } // ---------------------------------------------------------------------------- /*virtual*/ void FeedsView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { if (selectIdEn_) { QModelIndex index = ((FeedsProxyModel*)model())->mapToSource(current); selectId_ = sourceModel_->idByIndex(index); } selectIdEn_ = true; QTreeView::currentChanged(current, previous); } // ---------------------------------------------------------------------------- void FeedsView::dragEnterEvent(QDragEnterEvent *event) { event->accept(); dragPos_ = event->pos(); viewport()->update(); } // ---------------------------------------------------------------------------- void FeedsView::dragLeaveEvent(QDragLeaveEvent *event) { event->accept(); dragPos_ = QPoint(); viewport()->update(); } // ---------------------------------------------------------------------------- void FeedsView::dragMoveEvent(QDragMoveEvent *event) { if (dragPos_.isNull()) { event->ignore(); viewport()->update(); return; } dragPos_ = event->pos(); QModelIndex dragIndex = indexAt(dragPos_); // Process categories if (isFolder(dragIndex)) { if (dragIndex == currentIndex().parent()) event->ignore(); // drag-to-category is parent already dragged one else if ((dragIndex.row() == currentIndex().row()) && (dragIndex.parent() == currentIndex().parent())) event->ignore(); // don't move category to itself else { bool ignore = false; QModelIndex child = dragIndex.parent(); while (child.isValid()) { if ((child.row() == currentIndex().row()) && (child.parent() == currentIndex().parent())) { event->ignore(); // don't move category inside itself ignore = true; break; } child = child.parent(); } if (!ignore) event->accept(); } } // Process feeds else { if ((dragIndex.row() == currentIndex().row()) && (dragIndex.parent() == currentIndex().parent())) event->ignore(); // don't move feed to itseelf else if (dragIndex.parent() == currentIndex()) event->ignore(); // don't move feed to same parent else { bool ignore = false; QModelIndex child = dragIndex.parent(); while (child.isValid()) { if ((child.row() == currentIndex().row()) && (child.parent() == currentIndex().parent())) { event->ignore(); // don't move feed inside itself ignore = true; break; } child = child.parent(); } if (!ignore) event->accept(); } } viewport()->update(); if (shouldAutoScroll(event->pos())) startAutoScroll(); } // ---------------------------------------------------------------------------- bool FeedsView::shouldAutoScroll(const QPoint &pos) const { if (!hasAutoScroll()) return false; QRect area = viewport()->rect(); return (pos.y() - area.top() < autoScrollMargin()) || (area.bottom() - pos.y() < autoScrollMargin()) || (pos.x() - area.left() < autoScrollMargin()) || (area.right() - pos.x() < autoScrollMargin()); } // ---------------------------------------------------------------------------- void FeedsView::dropEvent(QDropEvent *event) { dragPos_ = QPoint(); viewport()->update(); event->setDropAction(Qt::MoveAction); event->accept(); handleDrop(event); } // ---------------------------------------------------------------------------- void FeedsView::paintEvent(QPaintEvent *event) { QTreeView::paintEvent(event); if (dragPos_.isNull()) return; QModelIndex dragIndex = indexAt(dragPos_); // Process folders if (isFolder(dragIndex)) { if ((dragIndex == currentIndex().parent()) || ((dragIndex.row() == currentIndex().row()) && (dragIndex.parent() == currentIndex().parent()))) return; QModelIndex child = dragIndex.parent(); while (child.isValid()) { if ((child.row() == currentIndex().row()) && (child.parent() == currentIndex().parent())) return; child = child.parent(); } } // Process feeds else { if ((dragIndex.parent() == currentIndex()) || ((dragIndex.row() == currentIndex().row()) && (dragIndex.parent() == currentIndex().parent()))) return; QModelIndex child = dragIndex.parent(); while (child.isValid()) { if ((child.row() == currentIndex().row()) && (child.parent() == currentIndex().parent())) return; child = child.parent(); } } QModelIndex indexText = model()->index(dragIndex.row(), columnIndex("text"), dragIndex.parent()); QRect rectText = visualRect(indexText); rectText.setRight(viewport()->width()-2); QBrush brush = qApp->palette().brush(QPalette::Highlight); QPainter painter; if (qAbs(rectText.top() - dragPos_.y()) < 3) { painter.begin(this->viewport()); painter.setPen(QPen(brush, 2)); painter.drawLine(rectText.topLeft().x()-2, rectText.top(), viewport()->width()-2, rectText.top()); painter.drawLine(rectText.topLeft().x()-2, rectText.top()-2, rectText.topLeft().x()-2, rectText.top()+2); painter.drawLine(viewport()->width()-2, rectText.top()-2, viewport()->width()-2, rectText.top()+2); } else if (qAbs(rectText.bottom() - dragPos_.y()) < 3) { painter.begin(this->viewport()); painter.setPen(QPen(brush, 2)); painter.drawLine(rectText.bottomLeft().x()-2, rectText.bottom(), viewport()->width()-2, rectText.bottom()); painter.drawLine(rectText.topLeft().x()-2, rectText.bottom()-2, rectText.topLeft().x()-2, rectText.bottom()+2); painter.drawLine(viewport()->width()-2, rectText.bottom()-2, viewport()->width()-2, rectText.bottom()+2); } else { if (!isFolder(dragIndex)) return; painter.begin(this->viewport()); painter.setPen(QPen(brush, 1, Qt::DashLine)); painter.setOpacity(0.5); painter.drawRect(rectText); painter.setPen(QPen()); painter.setBrush(brush); painter.setOpacity(0.1); painter.drawRect(rectText); } painter.end(); } // ---------------------------------------------------------------------------- QPersistentModelIndex FeedsView::selectIndex() { return sourceModel_->indexById(selectId_); } /** @brief Update cursor without list scrolling *---------------------------------------------------------------------------*/ void FeedsView::updateCurrentIndex(const QModelIndex &index) { setUpdatesEnabled(false); int topRow = verticalScrollBar()->value(); setCurrentIndex(index); verticalScrollBar()->setValue(topRow); setUpdatesEnabled(true); } // ---------------------------------------------------------------------------- void FeedsView::handleDrop(QDropEvent *e) { QModelIndex dropIndex = indexAt(e->pos()); QModelIndex indexWhere = dropIndex; int how = 0; QRect rectText = visualRect(dropIndex); if (qAbs(rectText.top() - e->pos().y()) < 3) { how = 0; } else if (qAbs(rectText.bottom() - e->pos().y()) < 3) { how = 1; } else { if (isFolder(dropIndex)) { how = 2; } else { dropIndex = model()->index(dropIndex.row()+1, columnIndex("text"), dropIndex.parent()); if (!dropIndex.isValid()) how = 1; } } indexWhere = ((FeedsProxyModel*)model())->mapToSource(indexWhere); emit signalDropped(indexWhere, how); } quiterss-0.18.3/src/feedsview/feedsview.h000066400000000000000000000065451265173051100203770ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FEEDSVIEW_H #define FEEDSVIEW_H #ifdef HAVE_QT5 #include #else #include #endif #include class FeedsView : public QTreeView { Q_OBJECT public: explicit FeedsView(QWidget * parent = 0); int selectId_; bool selectIdEn_; bool autocollapseFolder_; void setSourceModel(FeedsModel *sourceModel); void refresh(); void setColumnHidden(const QString& column, bool hide); int columnIndex(const QString& fieldName) const; bool isFolder(const QModelIndex &index) const; QModelIndex indexNextUnread(const QModelIndex &indexCur, int nextCondition = 0); QModelIndex firstFeedInFolder(const QModelIndex &indexFolder); QModelIndex lastFeedInFolder(const QModelIndex &indexFolder); QModelIndex indexPrevious(const QModelIndex &indexCur, bool isParent = false); QModelIndex indexNext(const QModelIndex &indexCur, bool isParent = false); QModelIndex lastFolderInFolder(const QModelIndex &indexFolder); QModelIndex indexPreviousFolder(const QModelIndex &indexCur); QModelIndex firstFolderInFolder(const QModelIndex &indexFolder); QModelIndex indexNextFolder(const QModelIndex &indexCur, bool isParent = false); public slots: void restoreExpanded(); void expandAll(); void collapseAll(); QPersistentModelIndex selectIndex(); void updateCurrentIndex(const QModelIndex &index); signals: void signalDoubleClicked(); void signalMiddleClicked(); void pressKeyUp(); void pressKeyDown(); void pressKeyHome(); void pressKeyEnd(); void signalDropped(const QModelIndex &where, int how); protected: virtual void mousePressEvent(QMouseEvent*); virtual void mouseReleaseEvent(QMouseEvent*event); virtual void mouseMoveEvent(QMouseEvent*); virtual void mouseDoubleClickEvent(QMouseEvent*); virtual void keyPressEvent(QKeyEvent*); virtual void currentChanged(const QModelIndex ¤t, const QModelIndex &previous); void dragEnterEvent(QDragEnterEvent *event); void dragLeaveEvent(QDragLeaveEvent *event); void dragMoveEvent(QDragMoveEvent *event); void dropEvent(QDropEvent *event); void paintEvent(QPaintEvent *event); private slots: void slotExpanded(const QModelIndex&index); void slotCollapsed(const QModelIndex&index); private: FeedsModel *sourceModel_; QPoint dragPos_; QPoint dragStartPos_; QList expandedList; int expandedOldId_; QModelIndex indexClicked_; void handleDrop(QDropEvent *e); bool shouldAutoScroll(const QPoint &pos) const; }; #endif // FEEDSVIEW_H quiterss-0.18.3/src/findfeed.cpp000066400000000000000000000111151265173051100165210ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "findfeed.h" FindFeed::FindFeed(QWidget *parent) : QLineEdit(parent) { findNameAct_ = new QAction(this); findNameAct_->setObjectName("findNameAct"); findNameAct_->setCheckable(true); findNameAct_->setChecked(true); findLinkAct_ = new QAction(this); findLinkAct_->setObjectName("findLinkAct"); findLinkAct_->setCheckable(true); findButton_ = new QToolButton(this); findButton_->setFocusPolicy(Qt::NoFocus); QPixmap findPixmap(":/images/selectFindInBrowser"); findButton_->setIcon(QIcon(findPixmap)); findButton_->setIconSize(findPixmap.size()); findButton_->setCursor(Qt::ArrowCursor); findButton_->setStyleSheet("QToolButton { border: none; padding: 0px; }"); findGroup_ = new QActionGroup(this); findGroup_->setExclusive(true); findMenu_ = new QMenu(this); findMenu_->addAction(findNameAct_); findMenu_->addAction(findLinkAct_); findGroup_->addAction(findNameAct_); findGroup_->addAction(findLinkAct_); connect(findButton_, SIGNAL(clicked()), this, SLOT(slotMenuFind())); connect(findGroup_, SIGNAL(triggered(QAction*)), this, SLOT(slotSelectFind(QAction*))); clearButton_ = new QToolButton(this); clearButton_->setFocusPolicy(Qt::NoFocus); QPixmap pixmap(":/images/editClear"); clearButton_->setIcon(QIcon(pixmap)); clearButton_->setIconSize(pixmap.size()); clearButton_->setCursor(Qt::ArrowCursor); clearButton_->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clearButton_->hide(); connect(clearButton_, SIGNAL(clicked()), this, SLOT(slotClear())); connect(this, SIGNAL(textChanged(const QString&)), SLOT(updateClearButton(const QString&))); findLabel_ = new QLabel(this); findLabel_->setStyleSheet("QLabel { color: gray; }"); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); setStyleSheet(QString("QLineEdit { padding-right: %1px; padding-left: %2px; }"). arg(clearButton_->sizeHint().width() + frameWidth + 1). arg(findButton_->sizeHint().width() + frameWidth + 1)); QSize msz = minimumSizeHint(); setMinimumSize( qMax(msz.width(), clearButton_->sizeHint().height() + findButton_->sizeHint().height() + frameWidth * 2 + 2), qMax(msz.height(), clearButton_->sizeHint().height() + frameWidth * 2 + 2)); } void FindFeed::retranslateStrings() { findNameAct_->setText(tr("Find Name")); findLinkAct_->setText(tr("Find Link")); findLabel_->setText(findGroup_->checkedAction()->text()); if (findLabel_->isVisible()) { findLabel_->hide(); findLabel_->show(); } } void FindFeed::resizeEvent(QResizeEvent *) { int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); QSize sz = findButton_->sizeHint(); findButton_->move(frameWidth+3, (rect().bottom() + 1 - sz.height())/2); sz = findLabel_->sizeHint(); findLabel_->move(frameWidth+findButton_->sizeHint().width()+5, (rect().bottom() + 1 - sz.height())/2); sz = clearButton_->sizeHint(); clearButton_->move(rect().right() - frameWidth - sz.width(), (rect().bottom() + 1 - sz.height())/2); } void FindFeed::focusInEvent(QFocusEvent *event) { findLabel_->setVisible(false); QLineEdit::focusInEvent(event); } void FindFeed::focusOutEvent(QFocusEvent *event) { if (text().isEmpty()) findLabel_->setVisible(true); QLineEdit::focusOutEvent(event); } void FindFeed::updateClearButton(const QString& text) { clearButton_->setVisible(!text.isEmpty()); } void FindFeed::slotClear() { clear(); emit signalClear(); } void FindFeed::slotMenuFind() { findMenu_->popup(mapToGlobal(QPoint(0, height()-1))); } void FindFeed::slotSelectFind(QAction *act) { findLabel_->setText(act->text()); emit signalSelectFind(); } quiterss-0.18.3/src/findfeed.h000066400000000000000000000032121265173051100161650ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FINDFEED_H #define FINDFEED_H #ifdef HAVE_QT5 #include #else #include #endif class FindFeed : public QLineEdit { Q_OBJECT public: FindFeed(QWidget *parent = 0); void retranslateStrings(); QActionGroup *findGroup_; signals: void signalClear(); void signalSelectFind(); protected: void resizeEvent(QResizeEvent *); void focusInEvent(QFocusEvent *event); void focusOutEvent(QFocusEvent *event); private slots: void updateClearButton(const QString &text); void slotClear(); void slotMenuFind(); void slotSelectFind(QAction *act); private: QMenu *findMenu_; QAction *findNameAct_; QAction *findLinkAct_; QLabel *findLabel_; QToolButton *findButton_; QToolButton *clearButton_; }; #endif // FINDFEED_H quiterss-0.18.3/src/findtext.cpp000066400000000000000000000147421265173051100166130ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "findtext.h" FindTextContent::FindTextContent(QWidget *parent) : QLineEdit(parent) { findInNewsAct_ = new QAction(this); findInNewsAct_->setObjectName("findInNewsAct"); findInNewsAct_->setIcon(QIcon(":/images/findInNews")); findInNewsAct_->setCheckable(true); findInNewsAct_->setChecked(true); findTitleAct_ = new QAction(this); findTitleAct_->setObjectName("findTitleAct"); findTitleAct_->setIcon(QIcon(":/images/findInNews")); findTitleAct_->setCheckable(true); findAuthorAct_ = new QAction(this); findAuthorAct_->setObjectName("findAuthorAct"); findAuthorAct_->setIcon(QIcon(":/images/findInNews")); findAuthorAct_->setCheckable(true); findCategoryAct_ = new QAction(this); findCategoryAct_->setObjectName("findCategoryAct"); findCategoryAct_->setIcon(QIcon(":/images/findInNews")); findCategoryAct_->setCheckable(true); findContentAct_ = new QAction(this); findContentAct_->setObjectName("findContentAct"); findContentAct_->setIcon(QIcon(":/images/findInNews")); findContentAct_->setCheckable(true); findLinkAct_ = new QAction(this); findLinkAct_->setObjectName("findLinkAct"); findLinkAct_->setIcon(QIcon(":/images/findInNews")); findLinkAct_->setCheckable(true); findInBrowserAct_ = new QAction(this); findInBrowserAct_->setObjectName("findInBrowserAct"); findInBrowserAct_->setIcon(QIcon(":/images/findText")); findInBrowserAct_->setCheckable(true); findGroup_ = new QActionGroup(this); findGroup_->setExclusive(true); findGroup_->addAction(findInNewsAct_); findGroup_->addAction(findTitleAct_); findGroup_->addAction(findAuthorAct_); findGroup_->addAction(findCategoryAct_); findGroup_->addAction(findContentAct_); findGroup_->addAction(findLinkAct_); findGroup_->addAction(findInBrowserAct_); findMenu_ = new QMenu(this); findMenu_->addActions(findGroup_->actions()); findMenu_->insertSeparator(findTitleAct_); findMenu_->insertSeparator(findInBrowserAct_); findButton_ = new QToolButton(this); findButton_->setFocusPolicy(Qt::NoFocus); QPixmap findPixmap(":/images/selectFindInNews"); findButton_->setIcon(QIcon(findPixmap)); findButton_->setIconSize(findPixmap.size()); findButton_->setCursor(Qt::ArrowCursor); findButton_->setStyleSheet("QToolButton { border: none; padding: 0px; }"); connect(findButton_, SIGNAL(clicked()), this, SLOT(slotMenuFind())); connect(findGroup_, SIGNAL(triggered(QAction*)), this, SLOT(slotSelectFind(QAction*))); clearButton_ = new QToolButton(this); clearButton_->setFocusPolicy(Qt::NoFocus); QPixmap pixmap(":/images/editClear"); clearButton_->setIcon(QIcon(pixmap)); clearButton_->setIconSize(pixmap.size()); clearButton_->setCursor(Qt::ArrowCursor); clearButton_->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clearButton_->hide(); connect(clearButton_, SIGNAL(clicked()), this, SLOT(slotClear())); connect(this, SIGNAL(textChanged(const QString&)), SLOT(updateClearButton(const QString&))); findLabel_ = new QLabel(tr("Find in News"), this); findLabel_->setStyleSheet("QLabel { color: gray; }"); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); setStyleSheet(QString("QLineEdit { padding-right: %1px; padding-left: %2px; }"). arg(clearButton_->sizeHint().width() + frameWidth + 1). arg(findButton_->sizeHint().width() + frameWidth + 1)); QSize msz = minimumSizeHint(); setMinimumSize( qMax(msz.width(), clearButton_->sizeHint().height() + findButton_->sizeHint().height() + frameWidth * 2 + 2), qMax(msz.height(), clearButton_->sizeHint().height() + frameWidth * 2 + 2)); } void FindTextContent::retranslateStrings() { findInNewsAct_->setText(tr("Find in News")); findTitleAct_->setText(tr("Find in Titles")); findAuthorAct_->setText(tr("Find in Authors")); findCategoryAct_->setText(tr("Find in Categories")); findContentAct_->setText(tr("Find in Descriptions")); findLinkAct_->setText(tr("Find in Links")); findInBrowserAct_->setText(tr("Find in Browser")); findLabel_->setText(findGroup_->checkedAction()->text()); if (findLabel_->isVisible()) { findLabel_->hide(); findLabel_->show(); } } void FindTextContent::resizeEvent(QResizeEvent *) { int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); QSize sz = findButton_->sizeHint(); findButton_->move(frameWidth+3, (rect().bottom() + 1 - sz.height())/2); sz = findLabel_->sizeHint(); findLabel_->move(frameWidth+findButton_->sizeHint().width()+5, (rect().bottom() + 1 - sz.height())/2); sz = clearButton_->sizeHint(); clearButton_->move(rect().right() - frameWidth - sz.width(), (rect().bottom() + 1 - sz.height())/2); } void FindTextContent::focusInEvent(QFocusEvent *event) { findLabel_->setVisible(false); QLineEdit::focusInEvent(event); } void FindTextContent::focusOutEvent(QFocusEvent *event) { if (text().isEmpty()) findLabel_->setVisible(true); QLineEdit::focusOutEvent(event); } void FindTextContent::updateClearButton(const QString& text) { clearButton_->setVisible(!text.isEmpty()); if (!hasFocus()) findLabel_->setVisible(true); } void FindTextContent::slotClear() { clear(); emit signalClear(); } void FindTextContent::slotMenuFind() { findMenu_->popup(mapToGlobal(QPoint(0, height()-1))); } void FindTextContent::slotSelectFind(QAction *act) { if (act->objectName() == "findInBrowserAct") { findButton_->setIcon(QIcon(":/images/selectFindInBrowser")); } else { findButton_->setIcon(QIcon(":/images/selectFindInNews")); } findLabel_->setText(act->text()); emit signalSelectFind(); } quiterss-0.18.3/src/findtext.h000066400000000000000000000034461265173051100162570ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FINDTEXT_H #define FINDTEXT_H #ifdef HAVE_QT5 #include #else #include #endif class FindTextContent : public QLineEdit { Q_OBJECT public: FindTextContent(QWidget *parent = 0); void retranslateStrings(); QActionGroup *findGroup_; signals: void signalClear(); void signalSelectFind(); protected: void resizeEvent(QResizeEvent *); void focusInEvent(QFocusEvent *event); void focusOutEvent(QFocusEvent *event); private slots: void updateClearButton(const QString &text); void slotClear(); void slotMenuFind(); void slotSelectFind(QAction *act); private: QMenu *findMenu_; QAction *findInNewsAct_; QAction *findTitleAct_; QAction *findAuthorAct_; QAction *findCategoryAct_; QAction *findContentAct_; QAction *findLinkAct_; QAction *findInBrowserAct_; QLabel *findLabel_; QToolButton *findButton_; QToolButton *clearButton_; }; #endif // FINDTEXT_H quiterss-0.18.3/src/labeldialog.cpp000066400000000000000000000153671265173051100172310ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "labeldialog.h" #include "mainwindow.h" LabelDialog::LabelDialog(QWidget *parent) : Dialog(parent, Qt::MSWindowsFixedSizeDialogHint) { setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("New Label")); nameEdit_ = new LineEdit(this); QMenu *iconMenu = new QMenu(); for (int i = 0; i < 6; i++) { iconMenu->addAction(QIcon(QString(":/images/label_%1").arg(i+1)), MainWindow::trNameLabels().at(i)); } iconMenu->addSeparator(); QAction *newIcon = new QAction(tr("Load icon..."), this); iconMenu->addAction(newIcon); iconButton_ = new QToolButton(this); iconButton_->setIconSize(QSize(16, 16)); iconButton_->setPopupMode(QToolButton::MenuButtonPopup); iconButton_->setMenu(iconMenu); QMenu *colorTextMenu = new QMenu(); colorTextMenu->addAction(tr("Default")); colorTextMenu->addSeparator(); colorTextMenu->addAction(tr("Select color...")); colorTextButton_ = new QToolButton(this); colorTextButton_->setIconSize(QSize(16, 16)); colorTextButton_->setPopupMode(QToolButton::MenuButtonPopup); colorTextButton_->setMenu(colorTextMenu); QMenu *colorBgMenu = new QMenu(); colorBgMenu->addAction(tr("Default")); colorBgMenu->addSeparator(); colorBgMenu->addAction(tr("Select color...")); colorBgButton_ = new QToolButton(this); colorBgButton_->setIconSize(QSize(16, 16)); colorBgButton_->setPopupMode(QToolButton::MenuButtonPopup); colorBgButton_->setMenu(colorBgMenu); QHBoxLayout *layoutH1 = new QHBoxLayout(); layoutH1->addWidget(new QLabel(tr("Name:"))); layoutH1->addWidget(nameEdit_, 1); QHBoxLayout *layoutH2 = new QHBoxLayout(); layoutH2->addWidget(new QLabel(tr("Icon:"))); layoutH2->addWidget(iconButton_); layoutH2->addSpacing(10); layoutH2->addWidget(new QLabel(tr("Color text:"))); layoutH2->addWidget(colorTextButton_); layoutH2->addSpacing(10); layoutH2->addWidget(new QLabel(tr("Color background:"))); layoutH2->addWidget(colorBgButton_); layoutH2->addStretch(1); pageLayout->addLayout(layoutH1); pageLayout->addLayout(layoutH2); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); connect(nameEdit_, SIGNAL(textChanged(const QString&)), this, SLOT(nameEditChanged(const QString&))); connect(iconButton_, SIGNAL(clicked()), iconButton_, SLOT(showMenu())); connect(iconMenu, SIGNAL(triggered(QAction*)), this, SLOT(selectIcon(QAction*))); connect(newIcon, SIGNAL(triggered()), this, SLOT(loadIcon())); connect(colorTextButton_, SIGNAL(clicked()), colorTextButton_, SLOT(showMenu())); connect(colorTextMenu->actions().at(0), SIGNAL(triggered()), this, SLOT(defaultColorText())); connect(colorTextMenu->actions().at(2), SIGNAL(triggered()), this, SLOT(selectColorText())); connect(colorBgButton_, SIGNAL(clicked()), colorBgButton_, SLOT(showMenu())); connect(colorBgMenu->actions().at(0), SIGNAL(triggered()), this, SLOT(defaultColorBg())); connect(colorBgMenu->actions().at(2), SIGNAL(triggered()), this, SLOT(selectColorBg())); } void LabelDialog::loadData() { iconButton_->setIcon(icon_); QPixmap pixmap(14, 14); if (!colorTextStr_.isEmpty()) pixmap.fill(QColor(colorTextStr_)); else pixmap.fill(QColor(0, 0, 0, 0)); colorTextButton_->setIcon(pixmap); if (!colorBgStr_.isEmpty()) pixmap.fill(QColor(colorBgStr_)); else pixmap.fill(QColor(0, 0, 0, 0)); colorBgButton_->setIcon(pixmap); } void LabelDialog::nameEditChanged(const QString& text) { buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!text.isEmpty()); } void LabelDialog::selectIcon(QAction *action) { icon_ = action->icon(); iconButton_->setIcon(action->icon()); } void LabelDialog::loadIcon() { QString filter; foreach (QByteArray imageFormat, QImageReader::supportedImageFormats()) { if (!filter.isEmpty()) filter.append(" "); filter.append("*.").append(imageFormat); } filter = tr("Image files") + QString(" (%1)").arg(filter); QString fileName = QFileDialog::getOpenFileName(this, tr("Select Image"), QDir::homePath(), filter); if (fileName.isNull()) return; QMessageBox msgBox; msgBox.setText(tr("Load icon: can't open a file!")); msgBox.setIcon(QMessageBox::Warning); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { msgBox.exec(); return; } QPixmap pixmap; if (pixmap.loadFromData(file.readAll())) { pixmap = pixmap.scaled(16, 16, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); } else { msgBox.exec(); } icon_.addPixmap(pixmap); iconButton_->setIcon(icon_); file.close(); } void LabelDialog::defaultColorText() { colorTextStr_ = ""; QPixmap pixmap(14, 14); pixmap.fill(QColor(0, 0, 0, 0)); colorTextButton_->setIcon(pixmap); } void LabelDialog::selectColorText() { QColorDialog *colorDialog = new QColorDialog(this); if (colorDialog->exec() == QDialog::Rejected) { delete colorDialog; return; } QColor color = colorDialog->selectedColor(); delete colorDialog; colorTextStr_ = color.name(); QPixmap pixmap(14, 14); pixmap.fill(color); colorTextButton_->setIcon(pixmap); } void LabelDialog::defaultColorBg() { colorBgStr_ = ""; QPixmap pixmap(14, 14); pixmap.fill(QColor(0, 0, 0, 0)); colorBgButton_->setIcon(pixmap); } void LabelDialog::selectColorBg() { QColorDialog *colorDialog = new QColorDialog(this); if (colorDialog->exec() == QDialog::Rejected) { delete colorDialog; return; } QColor color = colorDialog->selectedColor(); delete colorDialog; colorBgStr_ = color.name(); QPixmap pixmap(14, 14); pixmap.fill(color); colorBgButton_->setIcon(pixmap); } quiterss-0.18.3/src/labeldialog.h000066400000000000000000000030151265173051100166610ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NEWSLABELDIALOG_H #define NEWSLABELDIALOG_H #include "dialog.h" #include "lineedit.h" class LabelDialog : public Dialog { Q_OBJECT public: explicit LabelDialog(QWidget *parent); void loadData(); LineEdit *nameEdit_; QIcon icon_; QString colorTextStr_; QString colorBgStr_; private slots: void nameEditChanged(const QString&); void selectIcon(QAction *action); void loadIcon(); void defaultColorText(); void selectColorText(); void defaultColorBg(); void selectColorBg(); private: QToolButton *iconButton_; QToolButton *colorTextButton_; QToolButton *colorBgButton_; }; #endif // NEWSLABELDIALOG_H quiterss-0.18.3/src/main/000077500000000000000000000000001265173051100151765ustar00rootroot00000000000000quiterss-0.18.3/src/main/main.cpp000066400000000000000000000023701265173051100166300ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "mainapplication.h" #include "logfile.h" const bool logFileOutput = 1; int main(int argc, char **argv) { if (logFileOutput) { #if defined(HAVE_QT5) qInstallMessageHandler(LogFile::msgHandler); #else qInstallMsgHandler(LogFile::msgHandler); #endif } MainApplication app(argc, argv); if (app.isClosing()) return 0; return app.exec(); } quiterss-0.18.3/src/network/000077500000000000000000000000001265173051100157435ustar00rootroot00000000000000quiterss-0.18.3/src/network/authenticationdialog.cpp000066400000000000000000000061721265173051100226540ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "authenticationdialog.h" #include AuthenticationDialog::AuthenticationDialog(const QUrl &url, QAuthenticator *auth, QWidget *parent) : Dialog(parent, Qt::MSWindowsFixedSizeDialogHint), auth_(auth) { save_ = new QCheckBox(tr("Save password"), this); save_->setChecked(false); server_ = url.host(); if (server_.isEmpty()) { server_ = url.toString(); } QSqlQuery q; q.prepare("SELECT username, password FROM passwords WHERE server=?"); q.addBindValue(server_); q.exec(); if (q.next()) { auth_->setUser(q.value(0).toString()); auth_->setPassword(QString::fromUtf8(QByteArray::fromBase64(q.value(1).toByteArray()))); save_->setChecked(true); } else { setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Authorization required")); setMinimumWidth(400); user_ = new LineEdit(this); user_->setText(auth->user()); pass_ = new LineEdit(this); pass_->setEchoMode(QLineEdit::Password); QGridLayout *layout = new QGridLayout(); layout->addWidget(new QLabel(tr("Server:")), 0, 0); layout->addWidget(new QLabel(server_), 0, 1); layout->addWidget(new QLabel(tr("Message:")), 1, 0); layout->addWidget(new QLabel(auth->realm()), 1, 1); layout->addWidget(new QLabel(tr("Username:")), 2, 0); layout->addWidget(user_, 2, 1); layout->addWidget(new QLabel(tr("Password:")), 3, 0); layout->addWidget(pass_, 3, 1); pageLayout->addLayout(layout); pageLayout->addSpacing(10); pageLayout->addWidget(save_); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(acceptDialog())); } } void AuthenticationDialog::acceptDialog() { auth_->setUser(user_->text()); auth_->setPassword(pass_->text()); if (save_->isChecked()) { QSqlQuery q; q.prepare("INSERT INTO passwords (server, username, password) " "VALUES (:server, :username, :password)"); q.bindValue(":server", server_); q.bindValue(":username", user_->text()); q.bindValue(":password", pass_->text().toUtf8().toBase64()); q.exec(); } accept(); } quiterss-0.18.3/src/network/authenticationdialog.h000066400000000000000000000027001265173051100223120ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef AUTHENTICATIONDIALOG_H #define AUTHENTICATIONDIALOG_H #include #include #include "dialog.h" #include "lineedit.h" class AuthenticationDialog : public Dialog { Q_OBJECT public: explicit AuthenticationDialog(const QUrl &url, QAuthenticator *auth, QWidget *parent = 0); QCheckBox* save_; private slots: void acceptDialog(); private: QAuthenticator *auth_; QString server_; LineEdit *user_; LineEdit *pass_; }; #endif // AUTHENTICATIONDIALOG_H quiterss-0.18.3/src/network/cabundleupdater.cpp000066400000000000000000000123101265173051100216060ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "cabundleupdater.h" #include "mainapplication.h" #include "networkmanager.h" #include "common.h" #include #include #include #include #include CaBundleUpdater::CaBundleUpdater(NetworkManager* manager, QObject* parent) : QObject(parent) , m_manager(manager) , m_progress(Start) , m_reply(0) , m_latestBundleVersion(0) { m_bundleVersionFileName = mainApp->dataDir() + "/certificates/bundle_version"; m_bundleFileName = mainApp->dataDir() + "/certificates/ca-bundle.crt"; m_lastUpdateFileName = mainApp->dataDir() + "/certificates/last_update"; int updateTime = 30 * 1000; // Check immediately on first run if (!QFile(m_lastUpdateFileName).exists()) { updateTime = 0; } QTimer::singleShot(updateTime, this, SLOT(start())); } void CaBundleUpdater::start() { QFile updateFile(m_lastUpdateFileName); bool updateNow = false; if (updateFile.exists()) { if (!updateFile.open(QFile::ReadOnly)) { qWarning() << "CaBundleUpdater::start cannot open file for reading" << m_lastUpdateFileName; } else { QDateTime updateTime = QDateTime::fromString(updateFile.readAll()); updateNow = updateTime.addDays(5) < QDateTime::currentDateTime(); } } else { updateNow = true; } if (updateNow) { m_progress = CheckLastUpdate; QUrl url = QUrl::fromEncoded(QString(Common::Qz_RAWVCS + "/src/lib/data/data/bundle_version").toUtf8()); m_reply = m_manager->get(QNetworkRequest(url)); connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished())); } } void CaBundleUpdater::replyFinished() { if (m_progress == CheckLastUpdate) { QByteArray response = m_reply->readAll().trimmed(); m_reply->close(); m_reply->deleteLater(); if (m_reply->error() != QNetworkReply::NoError || response.isEmpty()) { return; } m_latestBundleVersion = response.toInt(); int currentBundleVersion = Common::readAllFileContents(m_bundleVersionFileName).trimmed().toInt(); if (m_latestBundleVersion == 0) { return; } if (m_latestBundleVersion > currentBundleVersion) { m_progress = LoadBundle; QUrl url = QUrl::fromEncoded(QString(Common::Qz_RAWVCS + "/src/lib/data/data/ca-bundle.crt").toUtf8()); m_reply = m_manager->get(QNetworkRequest(url)); connect(m_reply, SIGNAL(finished()), this, SLOT(replyFinished())); } QFile file(m_lastUpdateFileName); if (!file.open(QFile::WriteOnly | QFile::Truncate)) { qWarning() << "CaBundleUpdater::replyFinished cannot open file for writing" << m_lastUpdateFileName; } file.write(QDateTime::currentDateTime().toString().toUtf8()); } else if (m_progress == LoadBundle) { QByteArray response = m_reply->readAll(); m_reply->close(); m_reply->deleteLater(); if (m_reply->error() != QNetworkReply::NoError || response.isEmpty()) { return; } QFile file(m_bundleVersionFileName); if (!file.open(QFile::WriteOnly | QFile::Truncate)) { qWarning() << "CaBundleUpdater::replyFinished cannot open file for writing" << m_bundleVersionFileName; } file.write(QByteArray::number(m_latestBundleVersion)); file.close(); file.setFileName(m_bundleFileName); if (!file.open(QFile::WriteOnly | QFile::Truncate)) { qWarning() << "CaBundleUpdater::replyFinished cannot open file for writing" << m_bundleFileName; } file.write(response); // Reload newly downloaded certificates mainApp->networkManager()->loadSettings(); } } quiterss-0.18.3/src/network/cabundleupdater.h000066400000000000000000000045351265173051100212650ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef CABUNDLEUPDATER_H #define CABUNDLEUPDATER_H #include class QNetworkReply; class NetworkManager; class CaBundleUpdater : public QObject { Q_OBJECT public: explicit CaBundleUpdater(NetworkManager* manager, QObject* parent = 0); signals: public slots: private slots: void start(); void replyFinished(); private: enum Progress { Start, CheckLastUpdate, LoadBundle }; NetworkManager* m_manager; Progress m_progress; QNetworkReply* m_reply; QString m_bundleVersionFileName; QString m_bundleFileName; QString m_lastUpdateFileName; int m_latestBundleVersion; }; #endif // CABUNDLEUPDATER_H quiterss-0.18.3/src/network/cookiejar.cpp000066400000000000000000000074321265173051100204230ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "cookiejar.h" #include "mainapplication.h" #include "settings.h" #include #include #include CookieJar::CookieJar(QObject *parent) : QNetworkCookieJar(parent) { loadCookies(); } /** @brief Load cookies from file *----------------------------------------------------------------------------*/ void CookieJar::loadCookies() { Settings settings; useCookies_ = (UseCookies)settings.value("Settings/saveCookies", SaveCookies).toInt(); if (useCookies_ != SaveCookies) return; if (!QFile::exists(mainApp->dataDir() + "/cookies.dat")) { return; } QDateTime now = QDateTime::currentDateTime(); QList loadedCookies; QFile file(mainApp->dataDir() + "/cookies.dat"); file.open(QIODevice::ReadOnly); QDataStream stream(&file); int count; stream >> count; for (int i = 0; i < count; i++) { QByteArray rawForm; stream >> rawForm; const QList &cookieList = QNetworkCookie::parseCookies(rawForm); if (cookieList.isEmpty()) { continue; } const QNetworkCookie &cookie = cookieList.at(0); if (cookie.expirationDate() < now) { continue; } loadedCookies.append(cookie); } file.close(); setAllCookies(loadedCookies); } /** @brief Save cookies to file *----------------------------------------------------------------------------*/ void CookieJar::saveCookies() { Settings settings; settings.setValue("Settings/saveCookies", useCookies_); if (useCookies_ != SaveCookies) return; QList allCookies = getAllCookies(); QFile file(mainApp->dataDir() + "/cookies.dat"); file.open(QIODevice::WriteOnly); QDataStream stream(&file); int count = allCookies.count(); stream << count; for (int i = 0; i < count; i++) { const QNetworkCookie &cookie = allCookies.at(i); if (cookie.isSessionCookie()) { continue; } stream << cookie.toRawForm(); } file.close(); } bool CookieJar::setCookiesFromUrl(const QList &cookieList, const QUrl &url) { if (useCookies_ == BlockCookies) return false; return QNetworkCookieJar::setCookiesFromUrl(cookieList, url); } /** @brief Clear all cookies *----------------------------------------------------------------------------*/ void CookieJar::clearCookies() { setAllCookies(QList()); } /** @brief Retrive all cookies *----------------------------------------------------------------------------*/ QList CookieJar::getAllCookies() { return QNetworkCookieJar::allCookies(); } /** @brief Setup cookies from list *----------------------------------------------------------------------------*/ void CookieJar::setAllCookies(const QList &cookieList) { QNetworkCookieJar::setAllCookies(cookieList); } UseCookies CookieJar::useCookies() const { return useCookies_; } void CookieJar::setUseCookies(UseCookies value) { useCookies_ = value; } quiterss-0.18.3/src/network/cookiejar.h000066400000000000000000000031021265173051100200560ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef COOKIEJAR_H #define COOKIEJAR_H #include #include #include enum UseCookies { BlockCookies, SaveCookies, DeleteCookiesOnClose }; class CookieJar : public QNetworkCookieJar { Q_OBJECT public: explicit CookieJar(QObject *parent); bool setCookiesFromUrl(const QList &cookieList, const QUrl &url); QList getAllCookies(); void setAllCookies(const QList &cookieList); void saveCookies(); void loadCookies(); UseCookies useCookies() const; void setUseCookies(UseCookies value); public slots: void clearCookies(); private: UseCookies useCookies_; }; #endif // COOKIEJAR_H quiterss-0.18.3/src/network/networkmanager.cpp000066400000000000000000000305301265173051100214740ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "networkmanager.h" #include "mainapplication.h" #include "common.h" #include "settings.h" #include "authenticationdialog.h" #include "adblockmanager.h" #include "webpage.h" #include "sslerrordialog.h" #include "cabundleupdater.h" #include #include #include static QString fileNameForCert(const QSslCertificate &cert) { QString certFileName = SslErrorDialog::certificateItemText(cert); certFileName.remove(QLatin1Char(' ')); certFileName.append(QLatin1String(".crt")); certFileName = Common::filterCharsFromFilename(certFileName); while (certFileName.startsWith(QLatin1Char('.'))) { certFileName = certFileName.mid(1); } return certFileName; } NetworkManager::NetworkManager(bool isThread, QObject* parent) : QNetworkAccessManager(parent) , ignoreAllWarnings_(false) , adblockManager_(0) { setCookieJar(mainApp->cookieJar()); // CookieJar is shared between NetworkManagers mainApp->cookieJar()->setParent(0); #ifndef QT_NO_NETWORKPROXY qRegisterMetaType("QNetworkProxy"); qRegisterMetaType >("QList"); #endif if (isThread) { connect(this, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), mainApp->networkManager(), SLOT(slotAuthentication(QNetworkReply*,QAuthenticator*)), Qt::BlockingQueuedConnection); connect(this, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), mainApp->networkManager(), SLOT(slotProxyAuthentication(QNetworkProxy,QAuthenticator*)), Qt::BlockingQueuedConnection); connect(this, SIGNAL(sslErrors(QNetworkReply*, QList)), mainApp->networkManager(), SLOT(slotSslError(QNetworkReply*, QList)), Qt::BlockingQueuedConnection); } else { connect(this, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), SLOT(slotAuthentication(QNetworkReply*,QAuthenticator*))); connect(this, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), SLOT(slotProxyAuthentication(QNetworkProxy,QAuthenticator*))); connect(this, SIGNAL(sslErrors(QNetworkReply*, QList)), SLOT(slotSslError(QNetworkReply*, QList))); loadSettings(); } } NetworkManager::~NetworkManager() { } void NetworkManager::loadSettings() { #if defined(Q_OS_WIN) || defined(Q_OS_OS2) QString certDir = mainApp->dataDir() + "/certificates"; QString bundlePath = certDir + "/ca-bundle.crt"; QString bundleVersionPath = certDir + "/bundle_version"; if (!QDir(certDir).exists()) { QDir dir; dir.mkdir(certDir); } if (!QFile::exists(bundlePath)) { QFile(":data/ca-bundle.crt").copy(bundlePath); QFile(bundlePath).setPermissions(QFile::ReadUser | QFile::WriteUser); QFile(":data/bundle_version").copy(bundleVersionPath); QFile(bundleVersionPath).setPermissions(QFile::ReadUser | QFile::WriteUser); } QSslSocket::setDefaultCaCertificates(QSslCertificate::fromPath(bundlePath)); #else QSslSocket::setDefaultCaCertificates(QSslSocket::systemCaCertificates()); #endif loadCertificates(); } void NetworkManager::loadCertificates() { Settings settings; settings.beginGroup("SSL-Configuration"); certPaths_ = settings.value("CACertPaths", QStringList()).toStringList(); ignoreAllWarnings_ = settings.value("IgnoreAllSSLWarnings", false).toBool(); settings.endGroup(); // CA Certificates caCerts_ = QSslSocket::defaultCaCertificates(); foreach (const QString &path, certPaths_) { #ifdef Q_OS_WIN // Used from Qt 4.7.4 qsslcertificate.cpp and modified because QSslCertificate::fromPath // is kind of a bugged on Windows, it does work only with full path to cert file QDirIterator it(path, QDir::Files, QDirIterator::FollowSymlinks | QDirIterator::Subdirectories); while (it.hasNext()) { QString filePath = it.next(); if (!filePath.endsWith(QLatin1String(".crt"))) { continue; } QFile file(filePath); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { caCerts_ += QSslCertificate::fromData(file.readAll(), QSsl::Pem); } } #else caCerts_ += QSslCertificate::fromPath(path + "/*.crt", QSsl::Pem, QRegExp::Wildcard); #endif } // Local Certificates #ifdef Q_OS_WIN QDirIterator it_(mainApp->dataDir() + "/certificates", QDir::Files, QDirIterator::FollowSymlinks | QDirIterator::Subdirectories); while (it_.hasNext()) { QString filePath = it_.next(); if (!filePath.endsWith(QLatin1String(".crt"))) { continue; } QFile file(filePath); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { localCerts_ += QSslCertificate::fromData(file.readAll(), QSsl::Pem); } } #else localCerts_ = QSslCertificate::fromPath(mainApp->dataDir() + "/certificates/*.crt", QSsl::Pem, QRegExp::Wildcard); #endif QSslSocket::setDefaultCaCertificates(caCerts_ + localCerts_); #if defined(Q_OS_WIN) || defined(Q_OS_OS2) new CaBundleUpdater(this, this); #endif } /** @brief Request authentification *---------------------------------------------------------------------------*/ void NetworkManager::slotAuthentication(QNetworkReply *reply, QAuthenticator *auth) { AuthenticationDialog *authenticationDialog = new AuthenticationDialog(reply->url(), auth); if (!authenticationDialog->save_->isChecked()) authenticationDialog->exec(); delete authenticationDialog; } /** @brief Request proxy authentification *---------------------------------------------------------------------------*/ void NetworkManager::slotProxyAuthentication(const QNetworkProxy &proxy, QAuthenticator *auth) { AuthenticationDialog *authenticationDialog = new AuthenticationDialog(proxy.hostName(), auth); if (!authenticationDialog->save_->isChecked()) authenticationDialog->exec(); delete authenticationDialog; } static inline uint qHash(const QSslCertificate &cert) { return qHash(cert.toPem()); } void NetworkManager::slotSslError(QNetworkReply *reply, QList errors) { if (ignoreAllWarnings_ || reply->property("downloadReply").toBool()) { reply->ignoreSslErrors(errors); return; } QHash errorHash; foreach (const QSslError &error, errors) { // Weird behavior on Windows if (error.error() == QSslError::NoError) { continue; } QSslCertificate cert = error.certificate(); if (errorHash.contains(cert)) { errorHash[cert].append(error.errorString()); } else { errorHash.insert(cert, QStringList(error.errorString())); } } // User already rejected those certs if (containsRejectedCerts(errorHash.keys())) { return; } QString title = tr("SSL Certificate Error!"); QString text1 = QString(tr("The \"%1\" server has the following errors in the SSL certificate:")). arg(reply->url().host()); QString certs; QHash::const_iterator i = errorHash.constBegin(); while (i != errorHash.constEnd()) { const QSslCertificate cert = i.key(); const QStringList errors = i.value(); if (localCerts_.contains(cert) || tempAllowedCerts_.contains(cert) || errors.isEmpty()) { ++i; continue; } certs += "
  • "; certs += tr("Organization: ") + SslErrorDialog::clearCertSpecialSymbols(cert.subjectInfo(QSslCertificate::Organization)); certs += "
  • "; certs += tr("Domain Name: ") + SslErrorDialog::clearCertSpecialSymbols(cert.subjectInfo(QSslCertificate::CommonName)); certs += "
  • "; certs += tr("Expiration Date: ") + cert.expiryDate().toString("hh:mm:ss dddd d. MMMM yyyy"); certs += "
"; certs += "
    "; foreach (const QString &error, errors) { certs += "
  • "; certs += tr("Error: ") + error; certs += "
  • "; } certs += "
"; ++i; } QString text2 = tr("Would you like to make an exception for this certificate?"); QString message = QString("%1

%2

%3

%4


").arg(title, text1, certs, text2); if (!certs.isEmpty()) { SslErrorDialog dialog(mainApp->mainWindow()); dialog.setText(message); dialog.exec(); switch (dialog.result()) { case SslErrorDialog::Yes: foreach (const QSslCertificate &cert, errorHash.keys()) { if (!localCerts_.contains(cert)) { addLocalCertificate(cert); } } break; case SslErrorDialog::OnlyForThisSession: foreach (const QSslCertificate &cert, errorHash.keys()) { if (!tempAllowedCerts_.contains(cert)) { tempAllowedCerts_.append(cert); } } break; default: // To prevent asking user more than once for the same certificate addRejectedCerts(errorHash.keys()); return; } } reply->ignoreSslErrors(errors); } QNetworkReply *NetworkManager::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData) { if (mainApp->networkManager() == this) { QNetworkReply *reply = 0; // Adblock if (op == QNetworkAccessManager::GetOperation) { if (!adblockManager_) { adblockManager_ = AdBlockManager::instance(); } reply = adblockManager_->block(request); if (reply) { return reply; } } } return QNetworkAccessManager::createRequest(op, request, outgoingData); } void NetworkManager::addRejectedCerts(const QList &certs) { foreach (const QSslCertificate &cert, certs) { if (!rejectedSslCerts_.contains(cert)) { rejectedSslCerts_.append(cert); } } } bool NetworkManager::containsRejectedCerts(const QList &certs) { int matches = 0; foreach (const QSslCertificate &cert, certs) { if (rejectedSslCerts_.contains(cert)) { ++matches; } } return matches == certs.count(); } void NetworkManager::addLocalCertificate(const QSslCertificate &cert) { localCerts_.append(cert); QSslSocket::addDefaultCaCertificate(cert); QDir dir(mainApp->dataDir()); if (!dir.exists("certificates")) { dir.mkdir("certificates"); } QString certFileName = fileNameForCert(cert); QString fileName = Common::ensureUniqueFilename(mainApp->dataDir() + "/certificates/" + certFileName); QFile file(fileName); if (file.open(QFile::WriteOnly)) { file.write(cert.toPem()); file.close(); } else { qWarning() << "NetworkManager::addLocalCertificate cannot write to file: " << fileName; } } void NetworkManager::removeLocalCertificate(const QSslCertificate &cert) { localCerts_.removeOne(cert); QList certs = QSslSocket::defaultCaCertificates(); certs.removeOne(cert); QSslSocket::setDefaultCaCertificates(certs); // Delete cert file from profile bool deleted = false; QDirIterator it(mainApp->dataDir() + "/certificates", QDir::Files, QDirIterator::FollowSymlinks | QDirIterator::Subdirectories); while (it.hasNext()) { const QString filePath = it.next(); const QList &certs = QSslCertificate::fromPath(filePath); if (certs.isEmpty()) { continue; } const QSslCertificate cert_ = certs.at(0); if (cert == cert_) { QFile file(filePath); if (!file.remove()) { qWarning() << "NetworkManager::removeLocalCertificate cannot remove file" << filePath; } deleted = true; break; } } if (!deleted) { qWarning() << "NetworkManager::removeLocalCertificate cannot remove certificate"; } } quiterss-0.18.3/src/network/networkmanager.h000066400000000000000000000042631265173051100211450ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NETWORKMANAGER_H #define NETWORKMANAGER_H #include #include #include class AdBlockManager; class NetworkManager : public QNetworkAccessManager { Q_OBJECT public: explicit NetworkManager(bool isThread, QObject *parent = 0); ~NetworkManager(); QNetworkReply *createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice *outgoingData); void loadSettings(); void loadCertificates(); private slots: void slotAuthentication(QNetworkReply *reply, QAuthenticator *auth); void slotProxyAuthentication(const QNetworkProxy &proxy, QAuthenticator *auth); void slotSslError(QNetworkReply *reply, QList errors); private: void addRejectedCerts(const QList &certs); bool containsRejectedCerts(const QList &certs); void addLocalCertificate(const QSslCertificate &cert); void removeLocalCertificate(const QSslCertificate &cert); QStringList certPaths_; QList caCerts_; QList localCerts_; QList tempAllowedCerts_; bool ignoreAllWarnings_; QList rejectedSslCerts_; AdBlockManager *adblockManager_; }; #endif // NETWORKMANAGER_H quiterss-0.18.3/src/network/networkmanagerproxy.cpp000066400000000000000000000074621265173051100226060ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "networkmanagerproxy.h" #include "webpage.h" #include "cookiejar.h" #include "mainapplication.h" #include NetworkManagerProxy::NetworkManagerProxy(WebPage *page, QObject* parent) : QNetworkAccessManager(parent) , page_(page) { setCookieJar(mainApp->cookieJar()); // CookieJar is shared between NetworkManagers mainApp->cookieJar()->setParent(0); #ifndef QT_NO_NETWORKPROXY qRegisterMetaType("QNetworkProxy"); qRegisterMetaType >("QList"); #endif connect(this, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), mainApp->networkManager(), SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*))); connect(this, SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)), mainApp->networkManager(), SIGNAL(proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*))); connect(this, SIGNAL(finished(QNetworkReply*)), mainApp->networkManager(), SIGNAL(finished(QNetworkReply*))); if (page_) { connect(this, SIGNAL(sslErrors(QNetworkReply*,QList)), mainApp->networkManager(), SIGNAL(sslErrors(QNetworkReply*,QList))); } else { connect(this, SIGNAL(sslErrors(QNetworkReply*, QList)), SLOT(slotSslError(QNetworkReply*, QList))); } } QNetworkReply* NetworkManagerProxy::createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice* outgoingData) { if (page_) { QNetworkRequest pageRequest = request; page_->populateNetworkRequest(pageRequest); return mainApp->networkManager()->createRequest(op, pageRequest, outgoingData); } return QNetworkAccessManager::createRequest(op, request, outgoingData); } void NetworkManagerProxy::slotSslError(QNetworkReply *reply, QList errors) { reply->ignoreSslErrors(errors); } void NetworkManagerProxy::disconnectObjects() { page_ = 0; disconnect(this); disconnect(mainApp->networkManager()); } quiterss-0.18.3/src/network/networkmanagerproxy.h000066400000000000000000000044601265173051100222460ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NETWORKMANAGERPROXY_H #define NETWORKMANAGERPROXY_H #include #include "networkmanager.h" class WebPage; class NetworkManagerProxy : public QNetworkAccessManager { Q_OBJECT public: explicit NetworkManagerProxy(WebPage* page, QObject* parent = 0); QNetworkReply* createRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QIODevice* outgoingData); void disconnectObjects(); private slots: void slotSslError(QNetworkReply *reply, QList errors); private: WebPage* page_; }; #endif // NETWORKMANAGERPROXY_H quiterss-0.18.3/src/network/sslerrordialog.cpp000066400000000000000000000442041265173051100215060ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "sslerrordialog.h" SslErrorDialog::SslErrorDialog(QWidget* parent) : Dialog(parent, Qt::MSWindowsFixedSizeDialogHint) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("SSL Certificate Error!")); setMinimumWidth(400); setMinimumHeight(200); errorLabel_ = new QLabel(); pageLayout->addWidget(errorLabel_); buttonBox->addButton(QDialogButtonBox::Yes); buttonBox->addButton(QDialogButtonBox::No); buttonBox->addButton(tr("Only for this session"), QDialogButtonBox::ApplyRole); buttonBox->button(QDialogButtonBox::No)->setFocus(); connect(buttonBox, SIGNAL(clicked(QAbstractButton*)), this, SLOT(buttonClicked(QAbstractButton*))); } SslErrorDialog::~SslErrorDialog() { } void SslErrorDialog::setText(const QString &text) { errorLabel_->setText(text); } SslErrorDialog::Result SslErrorDialog::result() { return result_; } void SslErrorDialog::buttonClicked(QAbstractButton* button) { switch (buttonBox->buttonRole(button)) { case QDialogButtonBox::YesRole: result_ = Yes; accept(); break; case QDialogButtonBox::ApplyRole: result_ = OnlyForThisSession; accept(); break; default: result_ = No; reject(); break; } } QString SslErrorDialog::certificateItemText(const QSslCertificate &cert) { #if QT_VERSION >= 0x050000 QString commonName = cert.subjectInfo(QSslCertificate::CommonName).isEmpty() ? QString() : cert.subjectInfo(QSslCertificate::CommonName).at(0); QString organization = cert.subjectInfo(QSslCertificate::Organization).isEmpty() ? QString() : cert.subjectInfo(QSslCertificate::Organization).at(0); #else QString commonName = cert.subjectInfo(QSslCertificate::CommonName); QString organization = cert.subjectInfo(QSslCertificate::Organization); #endif if (commonName.isEmpty()) { return clearCertSpecialSymbols(organization); } return clearCertSpecialSymbols(commonName); } QString SslErrorDialog::clearCertSpecialSymbols(const QString &string) { #if QT_VERSION >= 0x050000 QString n = string.toHtmlEscaped(); #else QString n = Qt::escape(string); #endif if (!n.contains(QLatin1String("\\"))) { return n; } // Credits to http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/176679?help-en n.replace(QLatin1String("\\xC3\\x80"), QLatin1String("A")); n.replace(QLatin1String("\\xC3\\x81"), QLatin1String("A")); n.replace(QLatin1String("\\xC3\\x82"), QLatin1String("A")); n.replace(QLatin1String("\\xC3\\x83"), QLatin1String("A")); n.replace(QLatin1String("\\xC3\\x84"), QLatin1String("A")); n.replace(QLatin1String("\\xC3\\x85"), QLatin1String("A")); n.replace(QLatin1String("\\xC3\\x86"), QLatin1String("AE")); n.replace(QLatin1String("\\xC3\\x87"), QLatin1String("C")); n.replace(QLatin1String("\\xC3\\x88"), QLatin1String("E")); n.replace(QLatin1String("\\xC3\\x89"), QLatin1String("E")); n.replace(QLatin1String("\\xC3\\x8A"), QLatin1String("E")); n.replace(QLatin1String("\\xC3\\x8B"), QLatin1String("E")); n.replace(QLatin1String("\\xC3\\x8C"), QLatin1String("I")); n.replace(QLatin1String("\\xC3\\x8D"), QLatin1String("I")); n.replace(QLatin1String("\\xC3\\x8E"), QLatin1String("I")); n.replace(QLatin1String("\\xC3\\x8F"), QLatin1String("I")); n.replace(QLatin1String("\\xC3\\x90"), QLatin1String("D")); n.replace(QLatin1String("\\xC3\\x91"), QLatin1String("N")); n.replace(QLatin1String("\\xC3\\x92"), QLatin1String("O")); n.replace(QLatin1String("\\xC3\\x93"), QLatin1String("O")); n.replace(QLatin1String("\\xC3\\x94"), QLatin1String("O")); n.replace(QLatin1String("\\xC3\\x95"), QLatin1String("O")); n.replace(QLatin1String("\\xC3\\x96"), QLatin1String("O")); n.replace(QLatin1String("\\xC3\\x98"), QLatin1String("O")); n.replace(QLatin1String("\\xC3\\x99"), QLatin1String("U")); n.replace(QLatin1String("\\xC3\\x9A"), QLatin1String("U")); n.replace(QLatin1String("\\xC3\\x9B"), QLatin1String("U")); n.replace(QLatin1String("\\xC3\\x9C"), QLatin1String("U")); n.replace(QLatin1String("\\xC3\\x9D"), QLatin1String("Y")); n.replace(QLatin1String("\\xC3\\x9E"), QLatin1String("P")); n.replace(QLatin1String("\\xC3\\x9F"), QLatin1String("ss")); n.replace(QLatin1String("\\xC9\\x99"), QLatin1String("e")); n.replace(QLatin1String("\\xC3\\xA0"), QLatin1String("a")); n.replace(QLatin1String("\\xC3\\xA1"), QLatin1String("a")); n.replace(QLatin1String("\\xC3\\xA2"), QLatin1String("a")); n.replace(QLatin1String("\\xC3\\xA3"), QLatin1String("a")); n.replace(QLatin1String("\\xC3\\xA4"), QLatin1String("a")); n.replace(QLatin1String("\\xC3\\xA5"), QLatin1String("a")); n.replace(QLatin1String("\\xC3\\xA6"), QLatin1String("ae")); n.replace(QLatin1String("\\xC3\\xA7"), QLatin1String("c")); n.replace(QLatin1String("\\xC3\\xA8"), QLatin1String("e")); n.replace(QLatin1String("\\xC3\\xA9"), QLatin1String("e")); n.replace(QLatin1String("\\xC3\\xAA"), QLatin1String("e")); n.replace(QLatin1String("\\xC3\\xAB"), QLatin1String("e")); n.replace(QLatin1String("\\xC3\\xAC"), QLatin1String("i")); n.replace(QLatin1String("\\xC3\\xAD"), QLatin1String("i")); n.replace(QLatin1String("\\xC3\\xAE"), QLatin1String("i")); n.replace(QLatin1String("\\xC3\\xAF"), QLatin1String("i")); n.replace(QLatin1String("\\xC3\\xB0"), QLatin1String("o")); n.replace(QLatin1String("\\xC3\\xB1"), QLatin1String("n")); n.replace(QLatin1String("\\xC3\\xB2"), QLatin1String("o")); n.replace(QLatin1String("\\xC3\\xB3"), QLatin1String("o")); n.replace(QLatin1String("\\xC3\\xB4"), QLatin1String("o")); n.replace(QLatin1String("\\xC3\\xB5"), QLatin1String("o")); n.replace(QLatin1String("\\xC3\\xB6"), QLatin1String("o")); n.replace(QLatin1String("\\xC3\\xB8"), QLatin1String("o")); n.replace(QLatin1String("\\xC3\\xB9"), QLatin1String("u")); n.replace(QLatin1String("\\xC3\\xBA"), QLatin1String("u")); n.replace(QLatin1String("\\xC3\\xBB"), QLatin1String("u")); n.replace(QLatin1String("\\xC3\\xBC"), QLatin1String("u")); n.replace(QLatin1String("\\xC3\\xBD"), QLatin1String("y")); n.replace(QLatin1String("\\xC3\\xBE"), QLatin1String("p")); n.replace(QLatin1String("\\xC3\\xBF"), QLatin1String("y")); n.replace(QLatin1String("\\xC7\\xBF"), QLatin1String("o")); n.replace(QLatin1String("\\xC4\\x80"), QLatin1String("A")); n.replace(QLatin1String("\\xC4\\x81"), QLatin1String("a")); n.replace(QLatin1String("\\xC4\\x82"), QLatin1String("A")); n.replace(QLatin1String("\\xC4\\x83"), QLatin1String("a")); n.replace(QLatin1String("\\xC4\\x84"), QLatin1String("A")); n.replace(QLatin1String("\\xC4\\x85"), QLatin1String("a")); n.replace(QLatin1String("\\xC4\\x86"), QLatin1String("C")); n.replace(QLatin1String("\\xC4\\x87"), QLatin1String("c")); n.replace(QLatin1String("\\xC4\\x88"), QLatin1String("C")); n.replace(QLatin1String("\\xC4\\x89"), QLatin1String("c")); n.replace(QLatin1String("\\xC4\\x8A"), QLatin1String("C")); n.replace(QLatin1String("\\xC4\\x8B"), QLatin1String("c")); n.replace(QLatin1String("\\xC4\\x8C"), QLatin1String("C")); n.replace(QLatin1String("\\xC4\\x8D"), QLatin1String("c")); n.replace(QLatin1String("\\xC4\\x8E"), QLatin1String("D")); n.replace(QLatin1String("\\xC4\\x8F"), QLatin1String("d")); n.replace(QLatin1String("\\xC4\\x90"), QLatin1String("D")); n.replace(QLatin1String("\\xC4\\x91"), QLatin1String("d")); n.replace(QLatin1String("\\xC4\\x92"), QLatin1String("E")); n.replace(QLatin1String("\\xC4\\x93"), QLatin1String("e")); n.replace(QLatin1String("\\xC4\\x94"), QLatin1String("E")); n.replace(QLatin1String("\\xC4\\x95"), QLatin1String("e")); n.replace(QLatin1String("\\xC4\\x96"), QLatin1String("E")); n.replace(QLatin1String("\\xC4\\x97"), QLatin1String("e")); n.replace(QLatin1String("\\xC4\\x98"), QLatin1String("E")); n.replace(QLatin1String("\\xC4\\x99"), QLatin1String("e")); n.replace(QLatin1String("\\xC4\\x9A"), QLatin1String("E")); n.replace(QLatin1String("\\xC4\\x9B"), QLatin1String("e")); n.replace(QLatin1String("\\xC4\\x9C"), QLatin1String("G")); n.replace(QLatin1String("\\xC4\\x9D"), QLatin1String("g")); n.replace(QLatin1String("\\xC4\\x9E"), QLatin1String("G")); n.replace(QLatin1String("\\xC4\\x9F"), QLatin1String("g")); n.replace(QLatin1String("\\xC4\\xA0"), QLatin1String("G")); n.replace(QLatin1String("\\xC4\\xA1"), QLatin1String("g")); n.replace(QLatin1String("\\xC4\\xA2"), QLatin1String("G")); n.replace(QLatin1String("\\xC4\\xA3"), QLatin1String("g")); n.replace(QLatin1String("\\xC4\\xA4"), QLatin1String("H")); n.replace(QLatin1String("\\xC4\\xA5"), QLatin1String("h")); n.replace(QLatin1String("\\xC4\\xA6"), QLatin1String("H")); n.replace(QLatin1String("\\xC4\\xA7"), QLatin1String("h")); n.replace(QLatin1String("\\xC4\\xA8"), QLatin1String("I")); n.replace(QLatin1String("\\xC4\\xA9"), QLatin1String("i")); n.replace(QLatin1String("\\xC4\\xAA"), QLatin1String("I")); n.replace(QLatin1String("\\xC4\\xAB"), QLatin1String("i")); n.replace(QLatin1String("\\xC4\\xAC"), QLatin1String("I")); n.replace(QLatin1String("\\xC4\\xAD"), QLatin1String("i")); n.replace(QLatin1String("\\xC4\\xAE"), QLatin1String("I")); n.replace(QLatin1String("\\xC4\\xAF"), QLatin1String("i")); n.replace(QLatin1String("\\xC4\\xB0"), QLatin1String("I")); n.replace(QLatin1String("\\xC4\\xB1"), QLatin1String("i")); n.replace(QLatin1String("\\xC4\\xB2"), QLatin1String("IJ")); n.replace(QLatin1String("\\xC4\\xB3"), QLatin1String("ij")); n.replace(QLatin1String("\\xC4\\xB4"), QLatin1String("J")); n.replace(QLatin1String("\\xC4\\xB5"), QLatin1String("j")); n.replace(QLatin1String("\\xC4\\xB6"), QLatin1String("K")); n.replace(QLatin1String("\\xC4\\xB7"), QLatin1String("k")); n.replace(QLatin1String("\\xC4\\xB8"), QLatin1String("k")); n.replace(QLatin1String("\\xC4\\xB9"), QLatin1String("L")); n.replace(QLatin1String("\\xC4\\xBA"), QLatin1String("l")); n.replace(QLatin1String("\\xC4\\xBB"), QLatin1String("L")); n.replace(QLatin1String("\\xC4\\xBC"), QLatin1String("l")); n.replace(QLatin1String("\\xC4\\xBD"), QLatin1String("L")); n.replace(QLatin1String("\\xC4\\xBE"), QLatin1String("l")); n.replace(QLatin1String("\\xC4\\xBF"), QLatin1String("L")); n.replace(QLatin1String("\\xC5\\x80"), QLatin1String("l")); n.replace(QLatin1String("\\xC5\\x81"), QLatin1String("L")); n.replace(QLatin1String("\\xC5\\x82"), QLatin1String("l")); n.replace(QLatin1String("\\xC5\\x83"), QLatin1String("N")); n.replace(QLatin1String("\\xC5\\x84"), QLatin1String("n")); n.replace(QLatin1String("\\xC5\\x85"), QLatin1String("N")); n.replace(QLatin1String("\\xC5\\x86"), QLatin1String("n")); n.replace(QLatin1String("\\xC5\\x87"), QLatin1String("N")); n.replace(QLatin1String("\\xC5\\x88"), QLatin1String("n")); n.replace(QLatin1String("\\xC5\\x89"), QLatin1String("n")); n.replace(QLatin1String("\\xC5\\x8A"), QLatin1String("N")); n.replace(QLatin1String("\\xC5\\x8B"), QLatin1String("n")); n.replace(QLatin1String("\\xC5\\x8C"), QLatin1String("O")); n.replace(QLatin1String("\\xC5\\x8D"), QLatin1String("o")); n.replace(QLatin1String("\\xC5\\x8E"), QLatin1String("O")); n.replace(QLatin1String("\\xC5\\x8F"), QLatin1String("o")); n.replace(QLatin1String("\\xC5\\x90"), QLatin1String("O")); n.replace(QLatin1String("\\xC5\\x91"), QLatin1String("o")); n.replace(QLatin1String("\\xC5\\x92"), QLatin1String("CE")); n.replace(QLatin1String("\\xC5\\x93"), QLatin1String("ce")); n.replace(QLatin1String("\\xC5\\x94"), QLatin1String("R")); n.replace(QLatin1String("\\xC5\\x95"), QLatin1String("r")); n.replace(QLatin1String("\\xC5\\x96"), QLatin1String("R")); n.replace(QLatin1String("\\xC5\\x97"), QLatin1String("r")); n.replace(QLatin1String("\\xC5\\x98"), QLatin1String("R")); n.replace(QLatin1String("\\xC5\\x99"), QLatin1String("r")); n.replace(QLatin1String("\\xC5\\x9A"), QLatin1String("S")); n.replace(QLatin1String("\\xC5\\x9B"), QLatin1String("s")); n.replace(QLatin1String("\\xC5\\x9C"), QLatin1String("S")); n.replace(QLatin1String("\\xC5\\x9D"), QLatin1String("s")); n.replace(QLatin1String("\\xC5\\x9E"), QLatin1String("S")); n.replace(QLatin1String("\\xC5\\x9F"), QLatin1String("s")); n.replace(QLatin1String("\\xC5\\xA0"), QLatin1String("S")); n.replace(QLatin1String("\\xC5\\xA1"), QLatin1String("s")); n.replace(QLatin1String("\\xC5\\xA2"), QLatin1String("T")); n.replace(QLatin1String("\\xC5\\xA3"), QLatin1String("t")); n.replace(QLatin1String("\\xC5\\xA4"), QLatin1String("T")); n.replace(QLatin1String("\\xC5\\xA5"), QLatin1String("t")); n.replace(QLatin1String("\\xC5\\xA6"), QLatin1String("T")); n.replace(QLatin1String("\\xC5\\xA7"), QLatin1String("t")); n.replace(QLatin1String("\\xC5\\xA8"), QLatin1String("U")); n.replace(QLatin1String("\\xC5\\xA9"), QLatin1String("u")); n.replace(QLatin1String("\\xC5\\xAA"), QLatin1String("U")); n.replace(QLatin1String("\\xC5\\xAB"), QLatin1String("u")); n.replace(QLatin1String("\\xC5\\xAC"), QLatin1String("U")); n.replace(QLatin1String("\\xC5\\xAD"), QLatin1String("u")); n.replace(QLatin1String("\\xC5\\xAE"), QLatin1String("U")); n.replace(QLatin1String("\\xC5\\xAF"), QLatin1String("u")); n.replace(QLatin1String("\\xC5\\xB0"), QLatin1String("U")); n.replace(QLatin1String("\\xC5\\xB1"), QLatin1String("u")); n.replace(QLatin1String("\\xC5\\xB2"), QLatin1String("U")); n.replace(QLatin1String("\\xC5\\xB3"), QLatin1String("u")); n.replace(QLatin1String("\\xC5\\xB4"), QLatin1String("W")); n.replace(QLatin1String("\\xC5\\xB5"), QLatin1String("w")); n.replace(QLatin1String("\\xC5\\xB6"), QLatin1String("Y")); n.replace(QLatin1String("\\xC5\\xB7"), QLatin1String("y")); n.replace(QLatin1String("\\xC5\\xB8"), QLatin1String("Y")); n.replace(QLatin1String("\\xC5\\xB9"), QLatin1String("Z")); n.replace(QLatin1String("\\xC5\\xBA"), QLatin1String("z")); n.replace(QLatin1String("\\xC5\\xBB"), QLatin1String("Z")); n.replace(QLatin1String("\\xC5\\xBC"), QLatin1String("z")); n.replace(QLatin1String("\\xC5\\xBD"), QLatin1String("Z")); n.replace(QLatin1String("\\xC5\\xBE"), QLatin1String("z")); n.replace(QLatin1String("\\xC6\\x8F"), QLatin1String("E")); n.replace(QLatin1String("\\xC6\\xA0"), QLatin1String("O")); n.replace(QLatin1String("\\xC6\\xA1"), QLatin1String("o")); n.replace(QLatin1String("\\xC6\\xAF"), QLatin1String("U")); n.replace(QLatin1String("\\xC6\\xB0"), QLatin1String("u")); n.replace(QLatin1String("\\xC7\\x8D"), QLatin1String("A")); n.replace(QLatin1String("\\xC7\\x8E"), QLatin1String("a")); n.replace(QLatin1String("\\xC7\\x8F"), QLatin1String("I")); n.replace(QLatin1String("\\xC7\\x93"), QLatin1String("U")); n.replace(QLatin1String("\\xC7\\x90"), QLatin1String("i")); n.replace(QLatin1String("\\xC7\\x91"), QLatin1String("O")); n.replace(QLatin1String("\\xC7\\x92"), QLatin1String("o")); n.replace(QLatin1String("\\xC7\\x97"), QLatin1String("U")); n.replace(QLatin1String("\\xC7\\x94"), QLatin1String("u")); n.replace(QLatin1String("\\xC7\\x95"), QLatin1String("U")); n.replace(QLatin1String("\\xC7\\x96"), QLatin1String("u")); n.replace(QLatin1String("\\xC7\\x9B"), QLatin1String("U")); n.replace(QLatin1String("\\xC7\\x98"), QLatin1String("u")); n.replace(QLatin1String("\\xC7\\x99"), QLatin1String("U")); n.replace(QLatin1String("\\xC7\\x9A"), QLatin1String("u")); n.replace(QLatin1String("\\xC7\\xBD"), QLatin1String("ae")); n.replace(QLatin1String("\\xC7\\x9C"), QLatin1String("u")); n.replace(QLatin1String("\\xC7\\xBB"), QLatin1String("a")); n.replace(QLatin1String("\\xC7\\xBC"), QLatin1String("AE")); n.replace(QLatin1String("\\xC7\\xBE"), QLatin1String("O")); n.replace(QLatin1String("\\xC7\\xBA"), QLatin1String("A")); n.replace(QLatin1String("\\xC2\\x82"), QLatin1String(",")); // High code comma n.replace(QLatin1String("\\xC2\\x84"), QLatin1String(",,")); // High code double comma n.replace(QLatin1String("\\xC2\\x85"), QLatin1String("...")); // Tripple dot n.replace(QLatin1String("\\xC2\\x88"), QLatin1String("^")); // High carat n.replace(QLatin1String("\\xC2\\x91"), QLatin1String("\\x27")); // Forward single quote n.replace(QLatin1String("\\xC2\\x92"), QLatin1String("\\x27")); // Reverse single quote n.replace(QLatin1String("\\xC2\\x93"), QLatin1String("\\x22")); // Forward double quote n.replace(QLatin1String("\\xC2\\x94"), QLatin1String("\\x22")); // Reverse double quote n.replace(QLatin1String("\\xC2\\x96"), QLatin1String("-")); // High hyphen n.replace(QLatin1String("\\xC2\\x97"), QLatin1String("--")); // Double hyphen n.replace(QLatin1String("\\xC2\\xA6"), QLatin1String("|")); // Split vertical bar n.replace(QLatin1String("\\xC2\\xAB"), QLatin1String("<<")); // Double less than n.replace(QLatin1String("\\xC2\\xBB"), QLatin1String(">>")); // Double greater than n.replace(QLatin1String("\\xC2\\xBC"), QLatin1String("1/4")); // one quarter n.replace(QLatin1String("\\xC2\\xBD"), QLatin1String("1/2")); // one half n.replace(QLatin1String("\\xC2\\xBE"), QLatin1String("3/4")); // three quarters n.replace(QLatin1String("\\xCA\\xBF"), QLatin1String("\\x27")); // c-single quote n.replace(QLatin1String("\\xCC\\xA8"), QString()); // modifier - under curve n.replace(QLatin1String("\\xCC\\xB1"), QString()); // modifier - under line return n; } QString SslErrorDialog::clearCertSpecialSymbols(const QStringList &stringList) { if (stringList.isEmpty()) { return QString(); } return clearCertSpecialSymbols(stringList.at(0)); } quiterss-0.18.3/src/network/sslerrordialog.h000066400000000000000000000030631265173051100211510ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef SSLERRORDIALOG_H #define SSLERRORDIALOG_H #include "dialog.h" #include class SslErrorDialog : public Dialog { Q_OBJECT public: enum Result { Yes, No, OnlyForThisSession }; explicit SslErrorDialog(QWidget* parent = 0); ~SslErrorDialog(); void setText(const QString &text); Result result(); static QString certificateItemText(const QSslCertificate &cert); static QString clearCertSpecialSymbols(const QString &string); static QString clearCertSpecialSymbols(const QStringList &stringList); private slots: void buttonClicked(QAbstractButton* button); private: QLabel *errorLabel_; Result result_; }; #endif // SSLERRORDIALOG_H quiterss-0.18.3/src/newsfilters/000077500000000000000000000000001265173051100166175ustar00rootroot00000000000000quiterss-0.18.3/src/newsfilters/filterrulesdialog.cpp000066400000000000000000000464061265173051100230550ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "filterrulesdialog.h" #include "mainapplication.h" #include "settings.h" FilterRulesDialog::FilterRulesDialog(QWidget *parent, int filterId, int feedId) : Dialog(parent, Qt::WindowMinMaxButtonsHint) , filterId_(filterId) { setWindowTitle(tr("Filter Rules")); setMinimumHeight(300); feedsTree_ = new QTreeWidget(this); feedsTree_->setObjectName("feedsTreeFR"); feedsTree_->setColumnCount(2); feedsTree_->setColumnHidden(1, true); #ifdef HAVE_QT5 feedsTree_->header()->setSectionsMovable(false); #else feedsTree_->header()->setMovable(false); #endif itemNotChecked_ = false; QStringList treeItem; treeItem << tr("Feeds") << "Id"; feedsTree_->setHeaderLabels(treeItem); treeItem.clear(); treeItem << tr("All Feeds") << "0"; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setCheckState(0, Qt::Unchecked); feedsTree_->addTopLevelItem(treeWidgetItem); QSqlQuery q; QQueue parentIds; parentIds.enqueue(0); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); QString qStr = QString("SELECT text, id, image, xmlUrl FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(parentId); q.exec(qStr); while (q.next()) { QString feedText = q.value(0).toString(); QString feedIdT = q.value(1).toString(); QByteArray byteArray = q.value(2).toByteArray(); QString xmlUrl = q.value(3).toString(); treeItem.clear(); treeItem << feedText << feedIdT; treeWidgetItem = new QTreeWidgetItem(treeItem); if ((feedId == feedIdT.toInt()) || (feedId == parentId)) treeWidgetItem->setCheckState(0, Qt::Checked); else treeWidgetItem->setCheckState(0, Qt::Unchecked); QPixmap iconItem; if (xmlUrl.isEmpty()) { iconItem.load(":/images/folder"); } else { if (byteArray.isNull() || mainApp->mainWindow()->defaultIconFeeds_) { iconItem.load(":/images/feed"); } else { iconItem.loadFromData(QByteArray::fromBase64(byteArray)); } } treeWidgetItem->setIcon(0, iconItem); QList treeItems = feedsTree_->findItems(QString::number(parentId), Qt::MatchFixedString | Qt::MatchRecursive, 1); treeItems.at(0)->addChild(treeWidgetItem); if (xmlUrl.isEmpty()) parentIds.enqueue(feedIdT.toInt()); } } feedsTree_->expandAll(); if (feedId != -1) { int rowCount = 0; QTreeWidgetItem *childItem = feedsTree_->topLevelItem(0); while (childItem) { if (childItem->text(1).toInt() == feedId) break; rowCount++; childItem = feedsTree_->itemBelow(childItem); } feedsTree_->verticalScrollBar()->setValue(rowCount); feedsTree_->topLevelItem(0)->setCheckState(0, Qt::Unchecked); } connect(feedsTree_, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(feedItemChanged(QTreeWidgetItem*,int))); filterName_ = new LineEdit(this); QHBoxLayout *filterNamelayout = new QHBoxLayout(); filterNamelayout->addWidget(new QLabel(tr("Filter name:"))); filterNamelayout->addWidget(filterName_); matchComboBox_ = new QComboBox(this); QStringList itemList; itemList << tr("Match all news") << tr("Match all conditions") << tr("Match any condition"); matchComboBox_->addItems(itemList); matchComboBox_->setCurrentIndex(1); connect(matchComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(selectMatch(int))); QHBoxLayout *matchLayout = new QHBoxLayout(); matchLayout->addWidget(matchComboBox_); matchLayout->addStretch(); conditionScrollArea_ = new QScrollArea(this); conditionScrollArea_->setFocusPolicy(Qt::NoFocus); conditionScrollArea_->setWidgetResizable(true); conditionLayout_ = new QVBoxLayout(); conditionLayout_->setMargin(1); conditionLayout_->setSpacing(1); if (filterId_ == -1) addCondition(); conditionWidget_ = new QWidget(this); conditionWidget_->setObjectName("infoWidgetFR"); conditionWidget_->setLayout(conditionLayout_); conditionScrollArea_->setWidget(conditionWidget_); QVBoxLayout *splitterLayoutV1 = new QVBoxLayout(); splitterLayoutV1->setMargin(0); splitterLayoutV1->addLayout(matchLayout); splitterLayoutV1->addWidget(conditionScrollArea_, 1); QWidget *splitterWidget1 = new QWidget(this); splitterWidget1->setMinimumWidth(400); splitterWidget1->setLayout(splitterLayoutV1); actionsScrollArea_ = new QScrollArea(this); actionsScrollArea_->setWidgetResizable(true); actionsScrollArea_->setFocusPolicy(Qt::NoFocus); actionsLayout_ = new QVBoxLayout(); actionsLayout_->setMargin(1); actionsLayout_->setSpacing(1); if (filterId_ == -1) addAction(); actionsWidget_ = new QWidget(this); actionsWidget_->setObjectName("actionsWidgetFR"); actionsWidget_->setLayout(actionsLayout_); actionsScrollArea_->setWidget(actionsWidget_); QVBoxLayout *splitterLayoutV2 = new QVBoxLayout(); splitterLayoutV2->setMargin(0); splitterLayoutV2->addWidget(new QLabel(tr("Perform these actions:"))); splitterLayoutV2->addWidget(actionsScrollArea_, 1); QWidget *splitterWidget2 = new QWidget(this); splitterWidget2->setLayout(splitterLayoutV2); QSplitter *spliter = new QSplitter(Qt::Vertical, this); spliter->setChildrenCollapsible(false); spliter->addWidget(splitterWidget1); spliter->addWidget(splitterWidget2); QVBoxLayout *rulesLayout = new QVBoxLayout(); rulesLayout->setMargin(0); rulesLayout->addLayout(filterNamelayout); rulesLayout->addWidget(spliter); QWidget *rulesWidget = new QWidget(this); rulesWidget->setLayout(rulesLayout); QSplitter *mainSpliter = new QSplitter(this); mainSpliter->setChildrenCollapsible(false); mainSpliter->addWidget(rulesWidget); mainSpliter->addWidget(feedsTree_); QLabel *iconWarning = new QLabel(this); iconWarning->setPixmap(QPixmap(":/images/warning")); textWarning_ = new QLabel(this); QFont font = textWarning_->font(); font.setBold(true); textWarning_->setFont(font); QHBoxLayout *warningLayout = new QHBoxLayout(); warningLayout->setMargin(0); warningLayout->addWidget(iconWarning); warningLayout->addWidget(textWarning_, 1); warningWidget_ = new QWidget(this); warningWidget_->setLayout(warningLayout); warningWidget_->setVisible(false); buttonsLayout->insertWidget(0, warningWidget_, 1); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(acceptDialog())); pageLayout->addWidget(mainSpliter); setData(); filterName_->setFocus(); filterName_->selectAll(); Settings settings; restoreGeometry(settings.value("filterRulesDlg/geometry").toByteArray()); connect(filterName_, SIGNAL(textChanged(QString)), this, SLOT(filterNameChanged(QString))); connect(this, SIGNAL(finished(int)), this, SLOT(closeDialog())); } void FilterRulesDialog::setData() { if (filterId_ == -1) return; QSqlQuery q; QString qStr = QString("SELECT name, type, feeds FROM filters WHERE id=='%1'"). arg(filterId_); q.exec(qStr); if (q.next()) { filterName_->setText(q.value(0).toString()); matchComboBox_->setCurrentIndex(q.value(1).toInt()); itemNotChecked_ = true; QStringList strIdFeeds = q.value(2).toString().split(",", QString::SkipEmptyParts); foreach (QString strIdFeed, strIdFeeds) { QList treeItems = feedsTree_->findItems(strIdFeed, Qt::MatchFixedString | Qt::MatchRecursive, 1); if (treeItems.count()) treeItems.at(0)->setCheckState(0, Qt::Checked); } QTreeWidgetItem *treeItem = feedsTree_->itemBelow(feedsTree_->topLevelItem(0)); while (treeItem) { if (treeItem->checkState(0) == Qt::Unchecked) { feedsTree_->topLevelItem(0)->setCheckState(0, Qt::Unchecked); break; } treeItem = feedsTree_->itemBelow(treeItem); } itemNotChecked_ = false; qStr = QString("SELECT field, condition, content " "FROM filterConditions WHERE idFilter=='%1' ORDER BY content"). arg(filterId_); q.exec(qStr); while (q.next()) { ItemCondition *itemCondition = addCondition(); itemCondition->comboBox1_->setCurrentIndex(q.value(0).toInt()); itemCondition->comboBox2_->setCurrentIndex(q.value(1).toInt()); if (q.value(0).toInt() == 4) itemCondition->comboBox3_->setCurrentIndex(q.value(2).toInt()); else itemCondition->lineEdit_->setText(q.value(2).toString()); } if (conditionLayout_->count() == 0) addCondition(); qStr = QString("SELECT action, params " "FROM filterActions WHERE idFilter=='%1'"). arg(filterId_); q.exec(qStr); while (q.next()) { ItemAction *itemAction = addAction(); int action = q.value(0).toInt(); itemAction->comboBox1_->setCurrentIndex(action); if (action == 3) { int index = itemAction->comboBox2_->findData(q.value(1).toInt()); itemAction->comboBox2_->setCurrentIndex(index); } else if (action == 4) { itemAction->soundPathEdit_->setText(q.value(1).toString()); } else if (action == 5) { itemAction->colorButton_->setToolTip(q.value(1).toString()); QPixmap pixmap(14, 14); pixmap.fill(QColor(q.value(1).toString())); itemAction->colorButton_->setIcon(pixmap); } } if (actionsLayout_->count() == 0) addAction(); } } void FilterRulesDialog::closeDialog() { Settings settings; settings.setValue("filterRulesDlg/geometry", saveGeometry()); } void FilterRulesDialog::acceptDialog() { if (filterName_->text().isEmpty()) { filterName_->setFocus(); textWarning_->setText(tr("Please enter name for the filter.")); warningWidget_->setVisible(true); return; } if (matchComboBox_->currentIndex() != 0) { for (int i = 0; i < conditionLayout_->count()-2; i++) { ItemCondition *itemCondition = qobject_cast(conditionLayout_->itemAt(i)->widget()); if ((itemCondition->comboBox1_->currentIndex() != 4) && itemCondition->lineEdit_->text().isEmpty()) { itemCondition->lineEdit_->setFocus(); textWarning_->setText(tr("Please enter search condition for the news filter.")); warningWidget_->setVisible(true); return; } } } feedsTree_->expandAll(); QString strIdFeeds; QTreeWidgetItem *treeItem = feedsTree_->itemBelow(feedsTree_->topLevelItem(0)); while (treeItem) { if (treeItem->checkState(0) == Qt::Checked) { strIdFeeds.append(","); strIdFeeds.append(treeItem->text(1)); } treeItem = feedsTree_->itemBelow(treeItem); } strIdFeeds.append(","); QSqlQuery q; if (filterId_ == -1) { QString qStr = QString("INSERT INTO filters (name, type, feeds) " "VALUES (?, ?, ?)"); q.prepare(qStr); q.addBindValue(filterName_->text()); q.addBindValue(matchComboBox_->currentIndex()); q.addBindValue(strIdFeeds); q.exec(); filterId_ = q.lastInsertId().toInt(); qStr = QString("UPDATE filters SET num='%1' WHERE id=='%1'"). arg(filterId_); q.exec(qStr); for (int i = 0; i < conditionLayout_->count()-2; i++) { ItemCondition *itemCondition = qobject_cast(conditionLayout_->itemAt(i)->widget()); qStr = QString("INSERT INTO filterConditions " "(idFilter, field, condition, content) " "VALUES (?, ?, ?, ?)"); q.prepare(qStr); q.addBindValue(filterId_); q.addBindValue(itemCondition->comboBox1_->currentIndex()); q.addBindValue(itemCondition->comboBox2_->currentIndex()); if (itemCondition->comboBox1_->currentIndex() == 4) q.addBindValue(itemCondition->comboBox3_->currentIndex()); else q.addBindValue(itemCondition->lineEdit_->text()); q.exec(); } for (int i = 0; i < actionsLayout_->count()-2; i++) { ItemAction *itemAction = qobject_cast(actionsLayout_->itemAt(i)->widget()); qStr = QString("INSERT INTO filterActions " "(idFilter, action, params) " "VALUES (?, ?, ?)"); q.prepare(qStr); q.addBindValue(filterId_); q.addBindValue(itemAction->comboBox1_->currentIndex()); if (itemAction->comboBox1_->currentIndex() == 3) q.addBindValue(itemAction->comboBox2_->itemData(itemAction->comboBox2_->currentIndex())); else if (itemAction->comboBox1_->currentIndex() == 4) q.addBindValue(itemAction->soundPathEdit_->text()); else if (itemAction->comboBox1_->currentIndex() == 5) q.addBindValue(itemAction->colorButton_->toolTip()); else q.addBindValue(0); q.exec(); } } else { q.prepare("UPDATE filters SET name=?, type=?, feeds=? WHERE id=?"); q.addBindValue(filterName_->text()); q.addBindValue(matchComboBox_->currentIndex()); q.addBindValue(strIdFeeds); q.addBindValue(filterId_); q.exec(); q.exec(QString("DELETE FROM filterConditions WHERE idFilter='%1'").arg(filterId_)); q.exec(QString("DELETE FROM filterActions WHERE idFilter='%1'").arg(filterId_)); for (int i = 0; i < conditionLayout_->count()-2; i++) { ItemCondition *itemCondition = qobject_cast(conditionLayout_->itemAt(i)->widget()); QString qStr = QString("INSERT INTO filterConditions " "(idFilter, field, condition, content) " "VALUES (?, ?, ?, ?)"); q.prepare(qStr); q.addBindValue(filterId_); q.addBindValue(itemCondition->comboBox1_->currentIndex()); q.addBindValue(itemCondition->comboBox2_->currentIndex()); if (itemCondition->comboBox1_->currentIndex() == 4) q.addBindValue(itemCondition->comboBox3_->currentIndex()); else q.addBindValue(itemCondition->lineEdit_->text()); q.exec(); } for (int i = 0; i < actionsLayout_->count()-2; i++) { ItemAction *itemAction = qobject_cast(actionsLayout_->itemAt(i)->widget()); QString qStr = QString("INSERT INTO filterActions " "(idFilter, action, params) " "VALUES (?, ?, ?)"); q.prepare(qStr); q.addBindValue(filterId_); q.addBindValue(itemAction->comboBox1_->currentIndex()); if (itemAction->comboBox1_->currentIndex() == 3) q.addBindValue(itemAction->comboBox2_->itemData(itemAction->comboBox2_->currentIndex())); else if (itemAction->comboBox1_->currentIndex() == 4) q.addBindValue(itemAction->soundPathEdit_->text()); else if (itemAction->comboBox1_->currentIndex() == 5) q.addBindValue(itemAction->colorButton_->toolTip()); else q.addBindValue(0); q.exec(); } } accept(); } void FilterRulesDialog::filterNameChanged(const QString &) { warningWidget_->setVisible(false); } void FilterRulesDialog::selectMatch(int index) { if (index == 0) { conditionWidget_->setEnabled(false); } else { conditionWidget_->setEnabled(true); } } void FilterRulesDialog::feedItemChanged(QTreeWidgetItem *item, int column) { if ((column != 0) || itemNotChecked_) return; itemNotChecked_ = true; if (item->checkState(0) == Qt::Unchecked) { setCheckStateItem(item, Qt::Unchecked); QTreeWidgetItem *parentItem = item->parent(); while (parentItem) { parentItem->setCheckState(0, Qt::Unchecked); parentItem = parentItem->parent(); } } else { setCheckStateItem(item, Qt::Checked); } itemNotChecked_ = false; } void FilterRulesDialog::setCheckStateItem(QTreeWidgetItem *item, Qt::CheckState state) { for(int i = 0; i < item->childCount(); ++i) { QTreeWidgetItem *childItem = item->child(i); childItem->setCheckState(0, state); setCheckStateItem(childItem, state); } } ItemCondition *FilterRulesDialog::addCondition() { conditionLayout_->removeItem(conditionLayout_->itemAt(conditionLayout_->count()-1)); conditionLayout_->removeItem(conditionLayout_->itemAt(conditionLayout_->count()-1)); ItemCondition *itemCondition = new ItemCondition(this); conditionLayout_->addWidget(itemCondition); conditionLayout_->addStretch(); conditionLayout_->addSpacing(25); connect(itemCondition->addButton_, SIGNAL(clicked()), this, SLOT(addCondition())); connect(itemCondition, SIGNAL(signalDeleteCondition(ItemCondition*)), this, SLOT(deleteCondition(ItemCondition*))); QScrollBar *scrollBar = conditionScrollArea_->verticalScrollBar(); scrollBar->setValue(scrollBar->maximum() - scrollBar->minimum() + scrollBar->pageStep()); itemCondition->lineEdit_->setFocus(); connect(itemCondition->lineEdit_, SIGNAL(textChanged(QString)), this, SLOT(filterNameChanged(QString))); connect(itemCondition->comboBox1_, SIGNAL(currentIndexChanged(QString)), this, SLOT(filterNameChanged(QString))); return itemCondition; } void FilterRulesDialog::deleteCondition(ItemCondition *item) { delete item; if (conditionLayout_->count() == 2) { addCondition(); } } ItemAction *FilterRulesDialog::addAction() { actionsLayout_->removeItem(actionsLayout_->itemAt(actionsLayout_->count()-1)); actionsLayout_->removeItem(actionsLayout_->itemAt(actionsLayout_->count()-1)); ItemAction *itemAction = new ItemAction(this); QSqlQuery q; q.exec("SELECT id, name, image FROM labels ORDER BY num"); while (q.next()) { int idLabel = q.value(0).toInt(); QString nameLabel = q.value(1).toString(); if ((idLabel <= 6) && (MainWindow::nameLabels().at(idLabel-1) == nameLabel)) { nameLabel = MainWindow::trNameLabels().at(idLabel-1); } QByteArray byteArray = q.value(2).toByteArray(); QPixmap imageLabel; if (!byteArray.isNull()) imageLabel.loadFromData(byteArray); itemAction->comboBox2_->addItem(QIcon(imageLabel), nameLabel, idLabel); } actionsLayout_->addWidget(itemAction); actionsLayout_->addStretch(); actionsLayout_->addSpacing(25); connect(itemAction, SIGNAL(signalPlaySound(QString)), parent(), SLOT(slotPlaySound(QString))); connect(itemAction->addButton_, SIGNAL(clicked()), this, SLOT(addAction())); connect(itemAction, SIGNAL(signalDeleteAction(ItemAction*)), this, SLOT(deleteAction(ItemAction*))); return itemAction; } void FilterRulesDialog::deleteAction(ItemAction *item) { delete item; if (actionsLayout_->count() == 2) { addAction(); } } quiterss-0.18.3/src/newsfilters/filterrulesdialog.h000066400000000000000000000037231265173051100225150ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef FILTERRULES_H #define FILTERRULES_H #include "dialog.h" #include "itemcondition.h" #include "itemaction.h" class FilterRulesDialog : public Dialog { Q_OBJECT public: explicit FilterRulesDialog(QWidget *parent, int filterId, int feedId = -1); LineEdit *filterName_; int filterId_; bool itemNotChecked_; private slots: void feedItemChanged(QTreeWidgetItem *item, int column); void setCheckStateItem(QTreeWidgetItem *item, Qt::CheckState state); void closeDialog(); void acceptDialog(); void filterNameChanged(const QString &text); ItemCondition *addCondition(); void deleteCondition(ItemCondition *item); ItemAction *addAction(); void deleteAction(ItemAction *item); void selectMatch(int index); private: void setData(); QTreeWidget *feedsTree_; QComboBox *matchComboBox_; QScrollArea *conditionScrollArea_; QVBoxLayout *conditionLayout_; QWidget *conditionWidget_; QScrollArea *actionsScrollArea_; QVBoxLayout *actionsLayout_; QWidget *actionsWidget_; QLabel *textWarning_; QWidget *warningWidget_; }; #endif // FILTERRULES_H quiterss-0.18.3/src/newsfilters/itemaction.cpp000066400000000000000000000114231265173051100214600ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "itemaction.h" ItemAction::ItemAction(QWidget * parent) : QWidget(parent) { QStringList itemList; comboBox1_ = new QComboBox(this); itemList /*<< tr("Move News to") << tr("Copy News to")*/ << tr("Mark News as Read") << tr("Add Star") << tr("Delete") << tr("Add Label") << tr("Play a Sound") << tr("Show News in Notifier"); comboBox1_->addItems(itemList); comboBox2_ = new QComboBox(this); comboBox2_->setVisible(false); soundPathEdit_ = new QLineEdit(this); selectionSound_ = new ToolButton(this); selectionSound_->setText("..."); selectionSound_->setToolTip(tr("Browse")); selectionSound_->setAutoRaise(true); playSound_ = new ToolButton(this); playSound_->setIcon(QIcon(":/images/play")); playSound_->setToolTip(tr("Play")); playSound_->setAutoRaise(true); QHBoxLayout *soundLayout = new QHBoxLayout(); soundLayout->setMargin(0); soundLayout->setSpacing(1); soundLayout->addWidget(soundPathEdit_, 1); soundLayout->addWidget(selectionSound_); soundLayout->addWidget(playSound_); soundWidget_ = new QWidget(this); soundWidget_->setLayout(soundLayout); soundWidget_->setVisible(false); colorButton_ = new ToolButton(this); colorButton_->setIconSize(QSize(16, 16)); colorButton_->setToolTip("#000000"); QPixmap pixmap(14, 14); pixmap.fill(QColor("#000000")); colorButton_->setIcon(pixmap); colorButton_->setVisible(false); addButton_ = new ToolButton(this); addButton_->setIcon(QIcon(":/images/addT")); addButton_->setToolTip(tr("Add Action")); addButton_->setAutoRaise(true); deleteButton_ = new ToolButton(this); deleteButton_->setIcon(QIcon(":/images/deleteT")); deleteButton_->setToolTip(tr("Delete Action")); deleteButton_->setAutoRaise(true); QHBoxLayout *buttonsLayout = new QHBoxLayout(); buttonsLayout->setAlignment(Qt::AlignCenter); buttonsLayout->setMargin(0); buttonsLayout->setSpacing(5); buttonsLayout->addWidget(comboBox1_); buttonsLayout->addWidget(comboBox2_); buttonsLayout->addWidget(soundWidget_, 1); buttonsLayout->addWidget(colorButton_); buttonsLayout->addStretch(); buttonsLayout->addWidget(addButton_); buttonsLayout->addWidget(deleteButton_); setLayout(buttonsLayout); connect(playSound_, SIGNAL(clicked()), this, SLOT(slotPlaySound())); connect(deleteButton_, SIGNAL(clicked()), this, SLOT(deleteFilterAction())); connect(comboBox1_, SIGNAL(currentIndexChanged(int)), this, SLOT(currentIndexChanged(int))); connect(selectionSound_, SIGNAL(clicked()), this, SLOT(selectionSound())); connect(colorButton_, SIGNAL(clicked()), this, SLOT(selectColorText())); } void ItemAction::deleteFilterAction() { emit signalDeleteAction(this); } void ItemAction::currentIndexChanged(int index) { if (index == 3) comboBox2_->setVisible(true); else comboBox2_->setVisible(false); if (index == 4) soundWidget_->setVisible(true); else soundWidget_->setVisible(false); if (index == 5) colorButton_->setVisible(true); else colorButton_->setVisible(false); } void ItemAction::selectionSound() { QString path; QFileInfo file(soundPathEdit_->text()); if (file.isFile()) path = soundPathEdit_->text(); else path = file.path(); QString fileName = QFileDialog::getOpenFileName(this, tr("Open File..."), path, "*.wav"); if (!fileName.isEmpty()) soundPathEdit_->setText(fileName); } void ItemAction::slotPlaySound() { if (!soundPathEdit_->text().isEmpty()) emit signalPlaySound(soundPathEdit_->text()); } void ItemAction::selectColorText() { QColorDialog *colorDialog = new QColorDialog(this); if (colorDialog->exec() == QDialog::Rejected) { delete colorDialog; return; } QColor color = colorDialog->selectedColor(); delete colorDialog; colorButton_->setToolTip(color.name()); QPixmap pixmap(14, 14); pixmap.fill(color); colorButton_->setIcon(pixmap); } quiterss-0.18.3/src/newsfilters/itemaction.h000066400000000000000000000032541265173051100211300ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ITEMACTION_H #define ITEMACTION_H #ifdef HAVE_QT5 #include #else #include #endif #include "lineedit.h" #include "toolbutton.h" class ItemAction : public QWidget { Q_OBJECT public: explicit ItemAction(QWidget * parent = 0); QComboBox *comboBox1_; QComboBox *comboBox2_; QWidget *soundWidget_; QLineEdit *soundPathEdit_; ToolButton *selectionSound_; ToolButton *playSound_; ToolButton *colorButton_; ToolButton *addButton_; signals: void signalDeleteAction(ItemAction *item); void signalPlaySound(const QString &soundPath); private slots: void deleteFilterAction(); void currentIndexChanged(int index); void selectionSound(); void slotPlaySound(); void selectColorText(); private: ToolButton *deleteButton_; }; #endif // ITEMACTION_H quiterss-0.18.3/src/newsfilters/itemcondition.cpp000066400000000000000000000110461265173051100221720ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "itemcondition.h" ItemCondition::ItemCondition(QWidget * parent) : QWidget(parent) { comboBox1_ = new QComboBox(this); comboBox2_ = new QComboBox(this); comboBox3_ = new QComboBox(this); lineEdit_ = new LineEdit(this); QStringList itemList; itemList << tr("Title") << tr("Description") << tr("Author") << tr("Category") << tr("State") << tr("Link") << tr("News") /*<< tr("Published") << tr("Received")*/; comboBox1_->addItems(itemList); itemList.clear(); itemList << tr("New") << tr("Read") << tr("Starred"); comboBox3_->addItems(itemList); currentIndexChanged(tr("Title")); addButton_ = new ToolButton(this); addButton_->setIcon(QIcon(":/images/addT")); addButton_->setToolTip(tr("Add Condition")); addButton_->setAutoRaise(true); deleteButton_ = new ToolButton(this); deleteButton_->setIcon(QIcon(":/images/deleteT")); deleteButton_->setToolTip(tr("Delete Condition")); deleteButton_->setAutoRaise(true); QHBoxLayout *buttonsLayout = new QHBoxLayout(); buttonsLayout->setAlignment(Qt::AlignCenter); buttonsLayout->setMargin(0); buttonsLayout->setSpacing(5); buttonsLayout->addWidget(comboBox1_); buttonsLayout->addWidget(comboBox2_); buttonsLayout->addWidget(comboBox3_, 1); buttonsLayout->addWidget(lineEdit_, 1); buttonsLayout->addWidget(addButton_); buttonsLayout->addWidget(deleteButton_); setLayout(buttonsLayout); connect(deleteButton_, SIGNAL(clicked()), this, SLOT(deleteFilterRules())); connect(comboBox1_, SIGNAL(currentIndexChanged(QString)), this, SLOT(currentIndexChanged(QString))); } void ItemCondition::deleteFilterRules() { emit signalDeleteCondition(this); } void ItemCondition::currentIndexChanged(const QString &str) { QStringList itemList; comboBox2_->clear(); comboBox3_->setVisible(false); lineEdit_->setVisible(true); if (str == tr("Title")) { itemList << tr("contains") << tr("doesn't contains") << tr("is") << tr("isn't") << tr("begins with") << tr("ends with") << tr("Regular expressions"); comboBox2_->addItems(itemList); } else if (str == tr("Description")) { itemList << tr("contains") << tr("doesn't contains") << tr("Regular expressions"); comboBox2_->addItems(itemList); } else if (str == tr("Author")) { itemList << tr("contains") << tr("doesn't contains") << tr("is") << tr("isn't") << tr("Regular expressions"); comboBox2_->addItems(itemList); } else if (str == tr("Category")) { itemList << tr("contains") << tr("doesn't contains") << tr("is") << tr("isn't") << tr("begins with") << tr("ends with") << tr("Regular expressions"); comboBox2_->addItems(itemList); } else if (str == tr("State")) { itemList << tr("is") << tr("isn't"); comboBox2_->addItems(itemList); comboBox3_->setVisible(true); lineEdit_->setVisible(false); } else if (str == tr("Link")) { itemList << tr("contains") << tr("doesn't contains") << tr("is") << tr("isn't") << tr("begins with") << tr("ends with") << tr("Regular expressions"); comboBox2_->addItems(itemList); } else if (str == tr("News")) { itemList << tr("contains") << tr("doesn't contains") << tr("Regular expressions"); comboBox2_->addItems(itemList); } /*else if (str == "Published") { itemList << tr("is") << tr("isn't") << tr("is before") << tr("is after"); comboBox2->addItems(itemList); } else if (str == "Received") { itemList << tr("is") << tr("isn't") << tr("is before") << tr("is after"); comboBox2->addItems(itemList); }*/ } quiterss-0.18.3/src/newsfilters/itemcondition.h000066400000000000000000000027611265173051100216430ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef ITEMCONDITION_H #define ITEMCONDITION_H #ifdef HAVE_QT5 #include #else #include #endif #include "lineedit.h" #include "toolbutton.h" class ItemCondition : public QWidget { Q_OBJECT public: explicit ItemCondition(QWidget * parent = 0); QComboBox *comboBox1_; QComboBox *comboBox2_; QComboBox *comboBox3_; LineEdit *lineEdit_; ToolButton *addButton_; signals: void signalDeleteCondition(ItemCondition *item); private slots: void deleteFilterRules(); void currentIndexChanged(const QString &str); private: ToolButton *deleteButton_; }; #endif // ITEMCONDITION_H quiterss-0.18.3/src/newsfilters/newsfiltersdialog.cpp000066400000000000000000000345461265173051100230640ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "newsfiltersdialog.h" #include "mainapplication.h" #include "filterrulesdialog.h" #include "parseobject.h" #include "settings.h" NewsFiltersDialog::NewsFiltersDialog(QWidget *parent) : Dialog(parent, Qt::WindowMinMaxButtonsHint) { setWindowTitle(tr("News Filters")); setMinimumWidth(500); setMinimumHeight(300); filtersTree_ = new QTreeWidget(this); filtersTree_->setObjectName("filtersTree"); filtersTree_->setColumnCount(4); filtersTree_->setColumnHidden(0, true); filtersTree_->setColumnHidden(3, true); filtersTree_->setSortingEnabled(false); filtersTree_->header()->resizeSection(1, 150); #ifdef HAVE_QT5 filtersTree_->header()->setSectionsMovable(false); #else filtersTree_->header()->setMovable(false); #endif QStringList treeItem; treeItem << "Id" << tr("Filter Name") << tr("Feeds") << "Num"; filtersTree_->setHeaderLabels(treeItem); QSqlQuery q; QString qStr = QString("SELECT id, name, feeds, enable, num FROM filters ORDER BY num"); q.exec(qStr); while (q.next()) { QSqlQuery q1; bool isFolder = false; QString strNameFeeds; QStringList strIdFeeds = q.value(2).toString().split(",", QString::SkipEmptyParts); foreach (QString strIdFeed, strIdFeeds) { if (isFolder) strNameFeeds.append("; "); qStr = QString("SELECT text FROM feeds WHERE id==%1 AND xmlUrl!=''"). arg(strIdFeed); q1.exec(qStr); if (q1.next()) { strNameFeeds.append(q1.value(0).toString()); isFolder = true; } else { isFolder = false; } } treeItem.clear(); treeItem << q.value(0).toString() << q.value(1).toString() << strNameFeeds << q.value(4).toString(); QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); if (q.value(3).toInt() == 1) treeWidgetItem->setCheckState(1, Qt::Checked); else treeWidgetItem->setCheckState(1, Qt::Unchecked); treeWidgetItem->setToolTip(2, strNameFeeds); filtersTree_->addTopLevelItem(treeWidgetItem); if (q.value(4).toInt() == 0) { qStr = QString("UPDATE filters SET num='%1' WHERE id=='%1'"). arg(q.value(0).toInt()); q1.exec(qStr); treeWidgetItem->setText(3, q.value(0).toString()); } } QPushButton *newButton = new QPushButton(tr("New..."), this); connect(newButton, SIGNAL(clicked()), this, SLOT(newFilter())); editButton_ = new QPushButton(tr("Edit..."), this); editButton_->setEnabled(false); connect(editButton_, SIGNAL(clicked()), this, SLOT(editFilter())); deleteButton_ = new QPushButton(tr("Delete..."), this); deleteButton_->setEnabled(false); connect(deleteButton_, SIGNAL(clicked()), this, SLOT(deleteFilter())); moveUpButton_ = new QPushButton(tr("Move up"), this); moveUpButton_->setEnabled(false); connect(moveUpButton_, SIGNAL(clicked()), this, SLOT(moveUpFilter())); moveDownButton_ = new QPushButton(tr("Move down"), this); moveDownButton_->setEnabled(false); connect(moveDownButton_, SIGNAL(clicked()), this, SLOT(moveDownFilter())); runFilterButton_ = new QPushButton(tr("Run Filter"), this); runFilterButton_->setEnabled(false); buttonsLayout->insertWidget(0, runFilterButton_); connect(runFilterButton_, SIGNAL(clicked()), SLOT(applyFilter())); QVBoxLayout *buttonsVLayout = new QVBoxLayout(); buttonsVLayout->addWidget(newButton); buttonsVLayout->addWidget(editButton_); buttonsVLayout->addWidget(deleteButton_); buttonsVLayout->addSpacing(10); buttonsVLayout->addWidget(moveUpButton_); buttonsVLayout->addWidget(moveDownButton_); buttonsVLayout->addStretch(); buttonsVLayout->addWidget(runFilterButton_); QHBoxLayout *mainlayout = new QHBoxLayout(); mainlayout->setMargin(0); mainlayout->addWidget(filtersTree_); mainlayout->addLayout(buttonsVLayout); pageLayout->addLayout(mainlayout); buttonBox->addButton(QDialogButtonBox::Close); filtersTree_->setCurrentIndex(QModelIndex()); connect(filtersTree_, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotCurrentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*))); connect(filtersTree_, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editFilter())); connect(filtersTree_, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(slotItemChanged(QTreeWidgetItem*,int))); connect(this, SIGNAL(finished(int)), this, SLOT(closeDialog())); Settings settings; restoreGeometry(settings.value("newsFiltersDlg/geometry").toByteArray()); } void NewsFiltersDialog::closeDialog() { Settings settings; settings.setValue("newsFiltersDlg/geometry", saveGeometry()); } void NewsFiltersDialog::newFilter() { FilterRulesDialog *filterRulesDialog = new FilterRulesDialog( parentWidget(), -1); int result = filterRulesDialog->exec(); if (result == QDialog::Rejected) { delete filterRulesDialog; return; } int filterId = filterRulesDialog->filterId_; delete filterRulesDialog; QSqlQuery q; QString qStr = QString("SELECT name, feeds, enable FROM filters WHERE id=='%1'"). arg(filterId); q.exec(qStr); if (q.next()) { QSqlQuery q1; bool isFolder = false; QString strNameFeeds; QStringList strIdFeeds = q.value(1).toString().split(",", QString::SkipEmptyParts); foreach (QString strIdFeed, strIdFeeds) { if (isFolder) strNameFeeds.append("; "); qStr = QString("SELECT text FROM feeds WHERE id==%1 AND xmlUrl!=''"). arg(strIdFeed); q1.exec(qStr); if (q1.next()) { strNameFeeds.append(q1.value(0).toString()); isFolder = true; } else { isFolder = false; } } QStringList treeItem; treeItem << QString::number(filterId) << q.value(0).toString() << strNameFeeds; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); if (q.value(2).toInt() == 1) treeWidgetItem->setCheckState(1, Qt::Checked); else treeWidgetItem->setCheckState(1, Qt::Unchecked); treeWidgetItem->setToolTip(2, strNameFeeds); filtersTree_->addTopLevelItem(treeWidgetItem); treeWidgetItem->setText(3, q.value(0).toString()); } if (((filtersTree_->currentIndex().row() != (filtersTree_->topLevelItemCount()-1))) && filtersTree_->currentIndex().isValid()) moveDownButton_->setEnabled(true); filtersTree_->setCurrentItem( filtersTree_->topLevelItem(filtersTree_->topLevelItemCount()-1)); } void NewsFiltersDialog::editFilter() { int filterRow = filtersTree_->currentIndex().row(); int filterId = filtersTree_->topLevelItem(filterRow)->text(0).toInt(); FilterRulesDialog *filterRulesDialog = new FilterRulesDialog( parentWidget(), filterId); int result = filterRulesDialog->exec(); if (result == QDialog::Rejected) { delete filterRulesDialog; return; } delete filterRulesDialog; QSqlQuery q; QString qStr = QString("SELECT name, feeds FROM filters WHERE id=='%1'"). arg(filterId); q.exec(qStr); if (q.next()) { QSqlQuery q1; bool isFolder = false; QString strNameFeeds; QStringList strIdFeeds = q.value(1).toString().split(",", QString::SkipEmptyParts); foreach (QString strIdFeed, strIdFeeds) { if (isFolder) strNameFeeds.append("; "); qStr = QString("SELECT text FROM feeds WHERE id==%1 AND xmlUrl!=''"). arg(strIdFeed); q1.exec(qStr); if (q1.next()) { strNameFeeds.append(q1.value(0).toString()); isFolder = true; } else { isFolder = false; } } filtersTree_->topLevelItem(filterRow)->setText(0, QString::number(filterId)); filtersTree_->topLevelItem(filterRow)->setText(1, q.value(0).toString()); filtersTree_->topLevelItem(filterRow)->setText(2, strNameFeeds); filtersTree_->topLevelItem(filterRow)->setToolTip(2, strNameFeeds); } } void NewsFiltersDialog::deleteFilter() { QMessageBox msgBox; msgBox.setIcon(QMessageBox::Question); msgBox.setWindowTitle(tr("Delete Filter")); msgBox.setText(QString(tr("Are you sure you want to delete the filter '%1'?")). arg(filtersTree_->currentItem()->text(1))); msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); if (msgBox.exec() == QMessageBox::No) return; int filterRow = filtersTree_->currentIndex().row(); int filterId = filtersTree_->topLevelItem(filterRow)->text(0).toInt(); QSqlQuery q; q.exec(QString("DELETE FROM filters WHERE id='%1'").arg(filterId)); q.exec(QString("DELETE FROM filterConditions WHERE idFilter='%1'").arg(filterId)); q.exec(QString("DELETE FROM filterActions WHERE idFilter='%1'").arg(filterId)); q.finish(); filtersTree_->takeTopLevelItem(filterRow); if (filtersTree_->currentIndex().row() == 0) moveUpButton_->setEnabled(false); if (filtersTree_->currentIndex().row() == (filtersTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); } void NewsFiltersDialog::moveUpFilter() { int filterRow = filtersTree_->currentIndex().row(); int num1 = filtersTree_->topLevelItem(filterRow)->text(3).toInt(); int num2 = filtersTree_->topLevelItem(filterRow-1)->text(3).toInt(); filtersTree_->topLevelItem(filterRow-1)->setText(3, QString::number(num1)); filtersTree_->topLevelItem(filterRow)->setText(3, QString::number(num2)); QTreeWidgetItem *treeWidgetItem = filtersTree_->takeTopLevelItem(filterRow-1); filtersTree_->insertTopLevelItem(filterRow, treeWidgetItem); if (filtersTree_->currentIndex().row() == 0) moveUpButton_->setEnabled(false); if (filtersTree_->currentIndex().row() != (filtersTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(true); QSqlQuery q; int filterId = filtersTree_->topLevelItem(filterRow)->text(0).toInt(); int filterNum = filtersTree_->topLevelItem(filterRow)->text(3).toInt(); QString qStr = QString("UPDATE filters SET num='%1' WHERE id=='%2'"). arg(filterNum).arg(filterId); q.exec(qStr); filterId = filtersTree_->topLevelItem(filterRow-1)->text(0).toInt(); filterNum = filtersTree_->topLevelItem(filterRow-1)->text(3).toInt(); qStr = QString("UPDATE filters SET num='%1' WHERE id=='%2'"). arg(filterNum).arg(filterId); q.exec(qStr); } void NewsFiltersDialog::moveDownFilter() { int filterRow = filtersTree_->currentIndex().row(); int num1 = filtersTree_->topLevelItem(filterRow)->text(3).toInt(); int num2 = filtersTree_->topLevelItem(filterRow+1)->text(3).toInt(); filtersTree_->topLevelItem(filterRow+1)->setText(3, QString::number(num1)); filtersTree_->topLevelItem(filterRow)->setText(3, QString::number(num2)); QTreeWidgetItem *treeWidgetItem = filtersTree_->takeTopLevelItem(filterRow+1); filtersTree_->insertTopLevelItem(filterRow, treeWidgetItem); if (filtersTree_->currentIndex().row() == (filtersTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); if (filtersTree_->currentIndex().row() != 0) moveUpButton_->setEnabled(true); QSqlQuery q; int filterId = filtersTree_->topLevelItem(filterRow)->text(0).toInt(); int filterNum = filtersTree_->topLevelItem(filterRow)->text(3).toInt(); QString qStr = QString("UPDATE filters SET num='%1' WHERE id=='%2'"). arg(filterNum).arg(filterId); q.exec(qStr); filterId = filtersTree_->topLevelItem(filterRow+1)->text(0).toInt(); filterNum = filtersTree_->topLevelItem(filterRow+1)->text(3).toInt(); qStr = QString("UPDATE filters SET num='%1' WHERE id=='%2'"). arg(filterNum).arg(filterId); q.exec(qStr); } void NewsFiltersDialog::slotCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *) { if (filtersTree_->indexOfTopLevelItem(current) == 0) moveUpButton_->setEnabled(false); else moveUpButton_->setEnabled(true); if (filtersTree_->indexOfTopLevelItem(current) == (filtersTree_->topLevelItemCount()-1)) moveDownButton_->setEnabled(false); else moveDownButton_->setEnabled(true); if (filtersTree_->indexOfTopLevelItem(current) < 0) { editButton_->setEnabled(false); deleteButton_->setEnabled(false); moveUpButton_->setEnabled(false); moveDownButton_->setEnabled(false); runFilterButton_->setEnabled(false); } else { editButton_->setEnabled(true); deleteButton_->setEnabled(true); runFilterButton_->setEnabled(true); } } void NewsFiltersDialog::applyFilter() { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); int filterRow = filtersTree_->currentIndex().row(); int filterId = filtersTree_->topLevelItem(filterRow)->text(0).toInt(); int feedId = -1; MainWindow *mainWindow = mainApp->mainWindow(); QSqlQuery q; QString qStr = QString("SELECT feeds FROM filters WHERE id='%1'"). arg(filterId); q.exec(qStr); if (q.first()) { QStringList strIdFeeds = q.value(0).toString().split(",", QString::SkipEmptyParts); q.finish(); foreach (QString strIdFeed, strIdFeeds) { mainApp->runUserFilter(strIdFeed.toInt(), filterId); NewsTabWidget *widget = qobject_cast(mainWindow->stackedWidget_->currentWidget()); if (widget->feedId_ == strIdFeed.toInt()) feedId = strIdFeed.toInt(); } } if (feedId != -1) mainWindow->slotUpdateNews(NewsTabWidget::RefreshAll); mainWindow->slotUpdateStatus(feedId); mainWindow->recountCategoryCounts(); QApplication::restoreOverrideCursor(); } void NewsFiltersDialog::slotItemChanged(QTreeWidgetItem *item, int column) { if (column == 1) { int enable = 0; if (item->checkState(1) == Qt::Checked) enable = 1; QSqlQuery q; QString qStr = QString("UPDATE filters SET enable='%1' WHERE id=='%2'"). arg(enable).arg(item->text(0).toInt()); q.exec(qStr); } } quiterss-0.18.3/src/newsfilters/newsfiltersdialog.h000066400000000000000000000031601265173051100225150ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NEWSFILTERSDIALOG_H #define NEWSFILTERSDIALOG_H #include #include "dialog.h" class NewsFiltersDialog : public Dialog { Q_OBJECT public: explicit NewsFiltersDialog(QWidget *parent); QTreeWidget *filtersTree_; private slots: void closeDialog(); void newFilter(); void editFilter(); void deleteFilter(); void moveUpFilter(); void moveDownFilter(); void slotCurrentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *); void slotItemChanged(QTreeWidgetItem *item,int column); void applyFilter(); private: QPushButton *editButton_; QPushButton *deleteButton_; QPushButton *moveUpButton_; QPushButton *moveDownButton_; QPushButton *runFilterButton_; }; #endif // NEWSFILTERSDIALOG_H quiterss-0.18.3/src/newstabwidget.cpp000066400000000000000000003260521265173051100176350ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "newstabwidget.h" #include "mainapplication.h" #include "adblockicon.h" #include "settings.h" #include "webpage.h" #if defined(Q_OS_WIN) #include #endif #include NewsTabWidget::NewsTabWidget(QWidget *parent, TabType type, int feedId, int feedParId) : QWidget(parent) , type_(type) , feedId_(feedId) , feedParId_(feedParId) , currentNewsIdOld(-1) , autoLoadImages_(true) { mainWindow_ = mainApp->mainWindow(); db_ = QSqlDatabase::database(); feedsView_ = mainWindow_->feedsView_; feedsModel_ = mainWindow_->feedsModel_; feedsProxyModel_ = mainWindow_->feedsProxyModel_; newsIconTitle_ = new QLabel(); newsIconMovie_ = new QMovie(":/images/loading"); newsIconTitle_->setMovie(newsIconMovie_); newsTextTitle_ = new QLabel(); newsTextTitle_->setObjectName("newsTextTitle_"); closeButton_ = new QToolButton(); closeButton_->setFixedSize(15, 15); closeButton_->setCursor(Qt::ArrowCursor); closeButton_->setStyleSheet( "QToolButton { background-color: transparent;" "border: none; padding: 0px;" "image: url(:/images/close); }" "QToolButton:hover {" "image: url(:/images/closeHover); }" ); connect(closeButton_, SIGNAL(clicked()), this, SLOT(slotTabClose())); QHBoxLayout *newsTitleLayout = new QHBoxLayout(); newsTitleLayout->setMargin(0); newsTitleLayout->setSpacing(0); newsTitleLayout->addWidget(newsIconTitle_); newsTitleLayout->addSpacing(3); newsTitleLayout->addWidget(newsTextTitle_, 1); newsTitleLayout->addWidget(closeButton_); newsTitleLabel_ = new QWidget(); newsTitleLabel_->setObjectName("newsTitleLabel_"); newsTitleLabel_->setMinimumHeight(16); newsTitleLabel_->setLayout(newsTitleLayout); newsTitleLabel_->setVisible(false); Settings settings; bool showCloseButtonTab = settings.value("Settings/showCloseButtonTab", true).toBool(); if (!showCloseButtonTab) { closeButton_->hide(); newsTitleLabel_->setFixedWidth(MAX_TAB_WIDTH-15); } else { newsTitleLabel_->setFixedWidth(MAX_TAB_WIDTH); } if (type_ != TabTypeDownloads) { if (type_ != TabTypeWeb) { createNewsList(); } else { autoLoadImages_ = mainWindow_->autoLoadImages_; } createWebWidget(); if (type_ != TabTypeWeb) { newsTabWidgetSplitter_ = new QSplitter(this); newsTabWidgetSplitter_->setObjectName("newsTabWidgetSplitter"); if ((mainWindow_->browserPosition_ == TOP_POSITION) || (mainWindow_->browserPosition_ == LEFT_POSITION)) { newsTabWidgetSplitter_->addWidget(webWidget_); newsTabWidgetSplitter_->addWidget(newsWidget_); } else { newsTabWidgetSplitter_->addWidget(newsWidget_); newsTabWidgetSplitter_->addWidget(webWidget_); } } } QVBoxLayout *layout = new QVBoxLayout(); layout->setMargin(0); layout->setSpacing(0); if (type_ == TabTypeDownloads) layout->addWidget(mainApp->downloadManager()); else if (type_ != TabTypeWeb) layout->addWidget(newsTabWidgetSplitter_); else layout->addWidget(webWidget_); setLayout(layout); if (type_ < TabTypeWeb) { newsTabWidgetSplitter_->setHandleWidth(1); if ((mainWindow_->browserPosition_ == RIGHT_POSITION) || (mainWindow_->browserPosition_ == LEFT_POSITION)) { newsTabWidgetSplitter_->setOrientation(Qt::Horizontal); newsTabWidgetSplitter_->setStyleSheet( QString("QSplitter::handle {background: qlineargradient(" "x1: 0, y1: 0, x2: 0, y2: 1," "stop: 0 %1, stop: 0.07 %2);}"). arg(newsPanelWidget_->palette().background().color().name()). arg(qApp->palette().color(QPalette::Dark).name())); } else { newsTabWidgetSplitter_->setOrientation(Qt::Vertical); newsTabWidgetSplitter_->setStyleSheet( QString("QSplitter::handle {background: %1; margin-top: 1px; margin-bottom: 1px;}"). arg(qApp->palette().color(QPalette::Dark).name())); } } connect(this, SIGNAL(signalSetTextTab(QString,NewsTabWidget*)), mainWindow_, SLOT(setTextTitle(QString,NewsTabWidget*))); connect(&timerMouseClick, SIGNAL(timeout()), this, SLOT(slotMouseClickTimeout())); timerMouseClick.setSingleShot(true); } NewsTabWidget::~NewsTabWidget() { if (type_ == TabTypeDownloads) { mainApp->downloadManager()->hide(); mainApp->downloadManager()->setParent(mainWindow_); } } void NewsTabWidget::disconnectObjects() { disconnect(this); if (type_ != TabTypeDownloads) { webView_->disconnect(this); webView_->disconnectObjects(); qobject_cast(webView_->page())->disconnectObjects(); } } /** @brief Create news list with all related panels *----------------------------------------------------------------------------*/ void NewsTabWidget::createNewsList() { newsView_ = new NewsView(this); newsView_->setFrameStyle(QFrame::NoFrame); newsModel_ = new NewsModel(this, newsView_); newsModel_->setTable("news"); newsModel_->setFilter("feedId=-1"); newsHeader_ = new NewsHeader(newsModel_, newsView_); newsView_->setModel(newsModel_); newsView_->setHeader(newsHeader_); newsHeader_->init(); newsToolBar_ = new QToolBar(this); newsToolBar_->setObjectName("newsToolBar"); newsToolBar_->setStyleSheet("QToolBar { border: none; padding: 0px; }"); Settings settings; QString actionListStr = "markNewsRead,markAllNewsRead,Separator,markStarAct," "newsLabelAction,shareMenuAct,openInExternalBrowserAct,Separator," "nextUnreadNewsAct,prevUnreadNewsAct,Separator," "newsFilter,Separator,deleteNewsAct"; QString str = settings.value("Settings/newsToolBar", actionListStr).toString(); foreach (QString actionStr, str.split(",", QString::SkipEmptyParts)) { if (actionStr == "Separator") { newsToolBar_->addSeparator(); } else { QListIterator iter(mainWindow_->actions()); while (iter.hasNext()) { QAction *pAction = iter.next(); if (!pAction->icon().isNull()) { if (pAction->objectName() == actionStr) { newsToolBar_->addAction(pAction); break; } } } } } separatorRAct_ = newsToolBar_->addSeparator(); separatorRAct_->setObjectName("separatorRAct"); newsToolBar_->addAction(mainWindow_->restoreNewsAct_); findText_ = new FindTextContent(this); findText_->setFixedWidth(200); QHBoxLayout *newsPanelLayout = new QHBoxLayout(); newsPanelLayout->setMargin(2); newsPanelLayout->setSpacing(2); newsPanelLayout->addWidget(newsToolBar_); newsPanelLayout->addStretch(1); newsPanelLayout->addWidget(findText_); newsPanelWidget_ = new QWidget(this); newsPanelWidget_->setObjectName("newsPanelWidget_"); newsPanelWidget_->setStyleSheet( QString("#newsPanelWidget_ {border-bottom: 1px solid %1;}"). arg(qApp->palette().color(QPalette::Dark).name())); newsPanelWidget_->setLayout(newsPanelLayout); if (!mainWindow_->newsToolbarToggle_->isChecked()) newsPanelWidget_->hide(); QVBoxLayout *newsLayout = new QVBoxLayout(); newsLayout->setMargin(0); newsLayout->setSpacing(0); newsLayout->addWidget(newsPanelWidget_); newsLayout->addWidget(newsView_); newsWidget_ = new QWidget(this); newsWidget_->setLayout(newsLayout); markNewsReadTimer_ = new QTimer(this); QFile htmlFile; htmlFile.setFileName(":/html/newspaper_head"); htmlFile.open(QFile::ReadOnly); newspaperHeadHtml_ = QString::fromUtf8(htmlFile.readAll()); htmlFile.close(); htmlFile.setFileName(":/html/newspaper_description"); htmlFile.open(QFile::ReadOnly); newspaperHtml_ = QString::fromUtf8(htmlFile.readAll()); htmlFile.close(); htmlFile.setFileName(":/html/newspaper_description_rtl"); htmlFile.open(QFile::ReadOnly); newspaperHtmlRtl_ = QString::fromUtf8(htmlFile.readAll()); htmlFile.close(); htmlFile.setFileName(":/html/description"); htmlFile.open(QFile::ReadOnly); htmlString_ = QString::fromUtf8(htmlFile.readAll()); htmlFile.close(); htmlFile.setFileName(":/html/description_rtl"); htmlFile.open(QFile::ReadOnly); htmlRtlString_ = QString::fromUtf8(htmlFile.readAll()); htmlFile.close(); connect(newsView_, SIGNAL(pressed(QModelIndex)), this, SLOT(slotNewsViewClicked(QModelIndex))); connect(newsView_, SIGNAL(pressKeyUp(QModelIndex)), this, SLOT(slotNewsUpPressed(QModelIndex))); connect(newsView_, SIGNAL(pressKeyDown(QModelIndex)), this, SLOT(slotNewsDownPressed(QModelIndex))); connect(newsView_, SIGNAL(pressKeyHome(QModelIndex)), this, SLOT(slotNewsHomePressed(QModelIndex))); connect(newsView_, SIGNAL(pressKeyEnd(QModelIndex)), this, SLOT(slotNewsEndPressed(QModelIndex))); connect(newsView_, SIGNAL(pressKeyPageUp(QModelIndex)), this, SLOT(slotNewsPageUpPressed(QModelIndex))); connect(newsView_, SIGNAL(pressKeyPageDown(QModelIndex)), this, SLOT(slotNewsPageDownPressed(QModelIndex))); connect(newsView_, SIGNAL(signalSetItemRead(QModelIndex, int)), this, SLOT(slotSetItemRead(QModelIndex, int))); connect(newsView_, SIGNAL(signalSetItemStar(QModelIndex,int)), this, SLOT(slotSetItemStar(QModelIndex,int))); connect(newsView_, SIGNAL(signalDoubleClicked(QModelIndex)), this, SLOT(slotNewsViewDoubleClicked(QModelIndex))); connect(newsView_, SIGNAL(signalMiddleClicked(QModelIndex)), this, SLOT(slotNewsMiddleClicked(QModelIndex))); connect(newsView_, SIGNAL(signaNewslLabelClicked(QModelIndex)), this, SLOT(slotNewslLabelClicked(QModelIndex))); connect(markNewsReadTimer_, SIGNAL(timeout()), this, SLOT(slotMarkReadTimeout())); connect(newsView_, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenuNews(const QPoint &))); connect(newsModel_, SIGNAL(signalSort(int,int)), this, SLOT(slotSort(int,int))); connect(findText_, SIGNAL(textChanged(QString)), this, SLOT(slotFindText(QString))); connect(findText_, SIGNAL(signalSelectFind()), this, SLOT(slotSelectFind())); connect(findText_, SIGNAL(returnPressed()), this, SLOT(slotSelectFind())); connect(mainWindow_->newsToolbarToggle_, SIGNAL(toggled(bool)), newsPanelWidget_, SLOT(setVisible(bool))); } /** @brief Call context menu of selected news in news list *----------------------------------------------------------------------------*/ void NewsTabWidget::showContextMenuNews(const QPoint &pos) { if (!newsView_->currentIndex().isValid()) return; QMenu menu; menu.addAction(mainWindow_->restoreNewsAct_); menu.addSeparator(); menu.addAction(mainWindow_->openInBrowserAct_); menu.addAction(mainWindow_->openInExternalBrowserAct_); menu.addAction(mainWindow_->openNewsNewTabAct_); menu.addSeparator(); menu.addAction(mainWindow_->markNewsRead_); menu.addAction(mainWindow_->markAllNewsRead_); menu.addSeparator(); menu.addAction(mainWindow_->markStarAct_); menu.addAction(mainWindow_->newsLabelMenuAction_); menu.addAction(mainWindow_->shareMenuAct_); menu.addAction(mainWindow_->copyLinkAct_); menu.addSeparator(); menu.addAction(mainWindow_->updateFeedAct_); menu.addSeparator(); menu.addAction(mainWindow_->deleteNewsAct_); menu.addAction(mainWindow_->deleteAllNewsAct_); menu.exec(newsView_->viewport()->mapToGlobal(pos)); } /** @brief Create web-widget and control panel *----------------------------------------------------------------------------*/ void NewsTabWidget::createWebWidget() { webView_ = new WebView(this); webViewProgress_ = new QProgressBar(this); webViewProgress_->setObjectName("webViewProgress_"); webViewProgress_->setFixedHeight(15); webViewProgress_->setMinimum(0); webViewProgress_->setMaximum(100); webViewProgress_->setVisible(true); connect(this, SIGNAL(loadProgress(int)), webViewProgress_, SLOT(setValue(int)), Qt::QueuedConnection); webViewProgressLabel_ = new QLabel(this); QHBoxLayout *progressLayout = new QHBoxLayout(); progressLayout->setMargin(0); progressLayout->addWidget(webViewProgressLabel_, 0, Qt::AlignLeft|Qt::AlignVCenter); webViewProgress_->setLayout(progressLayout); //! Create web control panel webToolBar_ = new QToolBar(this); webToolBar_->setStyleSheet("QToolBar { border: none; padding: 0px; }"); webToolBar_->setIconSize(QSize(18, 18)); webHomePageAct_ = new QAction(this); webHomePageAct_->setIcon(QIcon(":/images/homePage")); webToolBar_->addAction(webHomePageAct_); QAction *webAction = webView_->pageAction(QWebPage::Back); webToolBar_->addAction(webAction); webAction = webView_->pageAction(QWebPage::Forward); webToolBar_->addAction(webAction); webAction = webView_->pageAction(QWebPage::Reload); webToolBar_->addAction(webAction); webAction = webView_->pageAction(QWebPage::Stop); webToolBar_->addAction(webAction); webToolBar_->addSeparator(); webToolBar_->addAction(mainApp->mainWindow()->shareMenuAct_); webExternalBrowserAct_ = new QAction(this); webExternalBrowserAct_->setIcon(QIcon(":/images/openBrowser")); webToolBar_->addAction(webExternalBrowserAct_); locationBar_ = new LocationBar(webView_, this); QHBoxLayout *webControlPanelLayout = new QHBoxLayout(); webControlPanelLayout->setMargin(2); webControlPanelLayout->setSpacing(2); webControlPanelLayout->addWidget(webToolBar_); webControlPanelLayout->addWidget(locationBar_, 1); webControlPanel_ = new QWidget(this); webControlPanel_->setObjectName("webControlPanel_"); webControlPanel_->setStyleSheet( QString("#webControlPanel_ {border-bottom: 1px solid %1;}"). arg(qApp->palette().color(QPalette::Dark).name())); webControlPanel_->setLayout(webControlPanelLayout); if (type_ != TabTypeWeb) setWebToolbarVisible(false, false); else setWebToolbarVisible(true, false); //! Create web layout QVBoxLayout *webLayout = new QVBoxLayout(); webLayout->setMargin(0); webLayout->setSpacing(0); webLayout->addWidget(webControlPanel_); webLayout->addWidget(webView_, 1); webLayout->addWidget(webViewProgress_); webWidget_ = new QWidget(this); webWidget_->setObjectName("webWidget_"); webWidget_->setLayout(webLayout); webWidget_->setMinimumWidth(400); webView_->page()->action(QWebPage::OpenLink)->disconnect(); webView_->page()->action(QWebPage::OpenLinkInNewWindow)->disconnect(); urlExternalBrowserAct_ = new QAction(this); urlExternalBrowserAct_->setIcon(QIcon(":/images/openBrowser")); connect(webHomePageAct_, SIGNAL(triggered()), this, SLOT(webHomePage())); connect(webExternalBrowserAct_, SIGNAL(triggered()), this, SLOT(openPageInExternalBrowser())); connect(urlExternalBrowserAct_, SIGNAL(triggered()), this, SLOT(openUrlInExternalBrowser())); connect(this, SIGNAL(signalSetHtmlWebView(QString,QUrl)), SLOT(slotSetHtmlWebView(QString,QUrl)), Qt::QueuedConnection); connect(webView_, SIGNAL(loadStarted()), this, SLOT(slotLoadStarted())); connect(webView_, SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool))); connect(webView_, SIGNAL(linkClicked(QUrl)), this, SLOT(slotLinkClicked(QUrl))); connect(webView_->page(), SIGNAL(linkHovered(QString,QString,QString)), this, SLOT(slotLinkHovered(QString,QString,QString))); connect(webView_, SIGNAL(loadProgress(int)), this, SLOT(slotSetValue(int)), Qt::QueuedConnection); connect(webView_, SIGNAL(titleChanged(QString)), this, SLOT(webTitleChanged(QString))); connect(webView_->page()->action(QWebPage::OpenLink), SIGNAL(triggered()), this, SLOT(openLink())); connect(webView_->page()->action(QWebPage::OpenLinkInNewWindow), SIGNAL(triggered()), this, SLOT(openLinkInNewTab())); connect(webView_, SIGNAL(showContextMenu(QPoint)), this, SLOT(showContextWebPage(QPoint)), Qt::QueuedConnection); connect(webView_, SIGNAL(signalGoHome()), this, SLOT(webHomePage())); connect(mainWindow_->autoLoadImagesToggle_, SIGNAL(triggered()), this, SLOT(setAutoLoadImages())); connect(mainWindow_->browserToolbarToggle_, SIGNAL(triggered()), this, SLOT(setWebToolbarVisible())); connect(locationBar_, SIGNAL(returnPressed()),this, SLOT(slotUrlEnter())); connect(webView_, SIGNAL(rssChanged(bool)), locationBar_, SLOT(showRssIcon(bool))); connect(webView_, SIGNAL(urlChanged(QUrl)), this, SLOT(slotUrlChanged(QUrl)), Qt::QueuedConnection); } /** @brief Read settings from ini-file *----------------------------------------------------------------------------*/ void NewsTabWidget::setSettings(bool init, bool newTab) { Settings settings; if (type_ == TabTypeDownloads) return; if (newTab) { if (type_ < TabTypeWeb) { newsTabWidgetSplitter_->restoreState(settings.value("NewsTabSplitterState").toByteArray()); QString iconStr = settings.value("Settings/newsToolBarIconSize", "toolBarIconSmall_").toString(); mainWindow_->setToolBarIconSize(newsToolBar_, iconStr); newsView_->setFont( QFont(mainWindow_->newsListFontFamily_, mainWindow_->newsListFontSize_)); newsModel_->formatDate_ = mainWindow_->formatDate_; newsModel_->formatTime_ = mainWindow_->formatTime_; newsModel_->simplifiedDateTime_ = mainWindow_->simplifiedDateTime_; newsModel_->textColor_ = mainWindow_->newsListTextColor_; newsView_->setStyleSheet(QString("#newsView_ {background: %1;}").arg(mainWindow_->newsListBackgroundColor_)); newsModel_->newNewsTextColor_ = mainWindow_->newNewsTextColor_; newsModel_->unreadNewsTextColor_ = mainWindow_->unreadNewsTextColor_; newsModel_->focusedNewsTextColor_ = mainWindow_->focusedNewsTextColor_; newsModel_->focusedNewsBGColor_ = mainWindow_->focusedNewsBGColor_; QString styleSheetNews = settings.value("Settings/styleSheetNews", mainApp->styleSheetNewsDefaultFile()).toString(); QFile file(styleSheetNews); if (!file.open(QFile::ReadOnly)) { file.setFileName(":/style/newsStyle"); file.open(QFile::ReadOnly); } cssString_ = QString::fromUtf8(file.readAll()). arg(mainWindow_->newsTextFontFamily_). arg(mainWindow_->newsTextFontSize_). arg(mainWindow_->newsTitleFontFamily_). arg(mainWindow_->newsTitleFontSize_). arg(0). arg(qApp->palette().color(QPalette::Dark).name()). // color separator arg(mainWindow_->newsBackgroundColor_). // news background arg(mainWindow_->newsTitleBackgroundColor_). // title background arg(mainWindow_->linkColor_). // link color arg(mainWindow_->titleColor_). // title color arg(mainWindow_->dateColor_). // date color arg(mainWindow_->authorColor_). // author color arg(mainWindow_->newsTextColor_); // text color file.close(); file.setFileName(":/html/audioplayer"); file.open(QFile::ReadOnly); audioPlayerHtml_ = QString::fromUtf8(file.readAll()); file.close(); file.setFileName(":/html/videoplayer"); file.open(QFile::ReadOnly); videoPlayerHtml_ = QString::fromUtf8(file.readAll()); file.close(); } if (mainWindow_->externalBrowserOn_ <= 0) { webView_->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); } else { webView_->page()->setLinkDelegationPolicy(QWebPage::DelegateExternalLinks); } webView_->page()->action(QWebPage::Back)->setShortcut(mainWindow_->backWebPageAct_->shortcut()); webView_->page()->action(QWebPage::Forward)->setShortcut(mainWindow_->forwardWebPageAct_->shortcut()); webView_->page()->action(QWebPage::Reload)->setShortcut(mainWindow_->reloadWebPageAct_->shortcut()); QWebSettings::setObjectCacheCapacities(0, 0, 0); } QModelIndex feedIndex = feedsModel_->indexById(feedId_); if (init) { QWebSettings::clearMemoryCaches(); if (type_ == TabTypeFeed) { int displayEmbeddedImages = feedsModel_->dataField(feedIndex, "displayEmbeddedImages").toInt(); if (displayEmbeddedImages == 2) { autoLoadImages_ = true; } else if (displayEmbeddedImages == 1) { autoLoadImages_ = mainWindow_->autoLoadImages_; } else { autoLoadImages_ = false; } } else { autoLoadImages_ = mainWindow_->autoLoadImages_; } webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, autoLoadImages_); webView_->setZoomFactor(qreal(mainWindow_->defaultZoomPages_)/100.0); } setAutoLoadImages(false); if (type_ == TabTypeFeed) { int javaScriptEnable = feedsModel_->dataField(feedIndex, "javaScriptEnable").toInt(); if (javaScriptEnable == 2) { webView_->settings()->setAttribute(QWebSettings::JavascriptEnabled, true); } else if (javaScriptEnable == 1) { webView_->settings()->setAttribute(QWebSettings::JavascriptEnabled, mainWindow_->javaScriptEnable_); } else if (javaScriptEnable == 0) { webView_->settings()->setAttribute(QWebSettings::JavascriptEnabled, false); } int layoutDirection = feedsModel_->dataField(feedIndex, "layoutDirection").toInt(); if (!layoutDirection) { newsView_->setLayoutDirection(Qt::LeftToRight); } else { newsView_->setLayoutDirection(Qt::RightToLeft); } } else { webView_->settings()->setAttribute(QWebSettings::JavascriptEnabled, mainWindow_->javaScriptEnable_); } if (type_ < TabTypeWeb) { newsView_->setAlternatingRowColors(mainWindow_->alternatingRowColorsNews_); QPalette palette = newsView_->palette(); palette.setColor(QPalette::AlternateBase, mainWindow_->alternatingRowColors_); newsView_->setPalette(palette); if (!newTab) newsModel_->setFilter("feedId=-1"); newsHeader_->setColumns(feedIndex); mainWindow_->slotUpdateStatus(feedId_, false); mainWindow_->newsFilter_->setEnabled(type_ == TabTypeFeed); separatorRAct_->setVisible(type_ == TabTypeDel); mainWindow_->restoreNewsAct_->setVisible(type_ == TabTypeDel); switch (mainWindow_->newsLayout_) { case 1: newsWidget_->setVisible(false); break; default: newsWidget_->setVisible(true); } } } /** @brief Reload translation *----------------------------------------------------------------------------*/ void NewsTabWidget::retranslateStrings() { if (type_ != TabTypeDownloads) { webViewProgress_->setFormat(tr("Loading... (%p%)")); webHomePageAct_->setText(tr("Home")); webExternalBrowserAct_->setText(tr("Open Page in External Browser")); urlExternalBrowserAct_->setText(tr("Open Link in External Browser")); if (type_ != TabTypeWeb) { findText_->retranslateStrings(); newsHeader_->retranslateStrings(); } if (mainWindow_->currentNewsTab == this) { if (autoLoadImages_) { mainWindow_->autoLoadImagesToggle_->setText(tr("Load Images")); mainWindow_->autoLoadImagesToggle_->setToolTip(tr("Auto Load Images to News View")); } else { mainWindow_->autoLoadImagesToggle_->setText(tr("No Load Images")); mainWindow_->autoLoadImagesToggle_->setToolTip(tr("No Load Images to News View")); } } } closeButton_->setToolTip(tr("Close Tab")); } void NewsTabWidget::setAutoLoadImages(bool apply) { if (type_ == NewsTabWidget::TabTypeDownloads) return; if (mainWindow_->currentNewsTab != this) return; if (apply) autoLoadImages_ = !autoLoadImages_; if (autoLoadImages_) { mainWindow_->autoLoadImagesToggle_->setText(tr("Load Images")); mainWindow_->autoLoadImagesToggle_->setToolTip(tr("Auto Load Images in News View")); mainWindow_->autoLoadImagesToggle_->setIcon(QIcon(":/images/imagesOn")); } else { mainWindow_->autoLoadImagesToggle_->setText(tr("Don't Load Images")); mainWindow_->autoLoadImagesToggle_->setToolTip(tr("Don't Load Images in News View")); mainWindow_->autoLoadImagesToggle_->setIcon(QIcon(":/images/imagesOff")); } if (apply) { webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, autoLoadImages_); if (autoLoadImages_) { if ((webView_->title() == "news_descriptions") && (type_ == NewsTabWidget::TabTypeFeed)) { switch (mainWindow_->newsLayout_) { case 1: loadNewspaper(); break; default: updateWebView(newsView_->currentIndex()); } } else { webView_->reload(); } } } } /** @brief Process mouse click in news list *----------------------------------------------------------------------------*/ void NewsTabWidget::slotNewsViewClicked(QModelIndex index) { handleMouseClick(index, Qt::LeftButton); } // ---------------------------------------------------------------------------- void NewsTabWidget::slotNewsViewSelected(QModelIndex index, bool clicked, bool bUpdateWebView/*=true*/) { if (mainWindow_->newsLayout_ == 1) return; int newsId = newsModel_->dataField(index.row(), "id").toInt(); if (mainWindow_->markNewsReadOn_ && mainWindow_->markPrevNewsRead_ && (newsId != currentNewsIdOld)) { QModelIndex startIndex = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(startIndex, Qt::EditRole, currentNewsIdOld); if (!indexList.isEmpty()) { slotSetItemRead(indexList.first(), 1); } } if (!index.isValid()) { hideWebContent(); currentNewsIdOld = newsId; return; } if (!((newsId == currentNewsIdOld) && newsModel_->dataField(index.row(), "read").toInt() >= 1) || clicked) { markNewsReadTimer_->stop(); if (mainWindow_->markNewsReadOn_ && mainWindow_->markCurNewsRead_) { if (mainWindow_->markNewsReadTime_ == 0) { slotSetItemRead(index, 1); } else { markNewsReadTimer_->start(mainWindow_->markNewsReadTime_*1000); } } if (type_ == TabTypeFeed) { // Write current news to feed QString qStr = QString("UPDATE feeds SET currentNews='%1' WHERE id=='%2'"). arg(newsId).arg(feedId_); mainApp->sqlQueryExec(qStr); QModelIndex feedIndex = feedsModel_->indexById(feedId_); feedsModel_->setData(feedsModel_->indexSibling(feedIndex, "currentNews"), newsId); } else if (type_ == TabTypeLabel) { QString qStr = QString("UPDATE labels SET currentNews='%1' WHERE id=='%2'"). arg(newsId). arg(mainWindow_->categoriesTree_->currentItem()->text(2).toInt()); mainApp->sqlQueryExec(qStr); mainWindow_->categoriesTree_->currentItem()->setText(3, QString::number(newsId)); } if (bUpdateWebView) { updateWebView(index); mainWindow_->statusBar()->showMessage(linkNewsString_, 3000); } } currentNewsIdOld = newsId; } // ---------------------------------------------------------------------------- void NewsTabWidget::slotNewsViewDoubleClicked(QModelIndex index) { handleMouseClick(index, Qt::LeftButton, true); } // ---------------------------------------------------------------------------- void NewsTabWidget::slotNewsMiddleClicked(QModelIndex index) { handleMouseClick(index, Qt::MiddleButton); } /** @brief Process pressing UP-key *----------------------------------------------------------------------------*/ void NewsTabWidget::slotNewsUpPressed(QModelIndex index) { if (type_ >= TabTypeWeb) return; int row; if (!index.isValid()) { if (!newsView_->currentIndex().isValid()) row = 0; else row = newsView_->currentIndex().row() - 1; if (row < 0) return; index = newsModel_->index(row, newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(index); } else { row = index.row(); } int value = newsView_->verticalScrollBar()->value(); int pageStep = newsView_->verticalScrollBar()->pageStep(); if (row < (value + pageStep/2)) newsView_->verticalScrollBar()->setValue(row - pageStep/2); slotNewsViewSelected(index); } /** @brief Process pressing DOWN-key *----------------------------------------------------------------------------*/ void NewsTabWidget::slotNewsDownPressed(QModelIndex index) { if (type_ >= TabTypeWeb) return; int row; if (!index.isValid()) { if (!newsView_->currentIndex().isValid()) row = 0; else row = newsView_->currentIndex().row() + 1; if (row >= newsModel_->rowCount()) return; index = newsModel_->index(row, newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(index); } else { row = index.row(); } int value = newsView_->verticalScrollBar()->value(); int pageStep = newsView_->verticalScrollBar()->pageStep(); if (row > (value + pageStep/2)) newsView_->verticalScrollBar()->setValue(row - pageStep/2); slotNewsViewSelected(index); } /** @brief Process pressing HOME-key *----------------------------------------------------------------------------*/ void NewsTabWidget::slotNewsHomePressed(QModelIndex index) { slotNewsViewSelected(index); } /** @brief Process pressing END-key *----------------------------------------------------------------------------*/ void NewsTabWidget::slotNewsEndPressed(QModelIndex index) { slotNewsViewSelected(index); } /** @brief Process pressing PageUp-key *----------------------------------------------------------------------------*/ void NewsTabWidget::slotNewsPageUpPressed(QModelIndex index) { int row; if (!index.isValid()) { if (!newsView_->currentIndex().isValid()) row = 0; else row = newsView_->currentIndex().row() - newsView_->verticalScrollBar()->pageStep(); if (row < 0) row = 0; index = newsModel_->index(row, newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(index); } slotNewsViewSelected(index); } /** @brief Process pressing PageDown-key *----------------------------------------------------------------------------*/ void NewsTabWidget::slotNewsPageDownPressed(QModelIndex index) { int row; if (!index.isValid()) { if (!newsView_->currentIndex().isValid()) row = 0; else row = newsView_->currentIndex().row() + newsView_->verticalScrollBar()->pageStep(); if (row >= newsModel_->rowCount()) row = newsModel_->rowCount()-1; index = newsModel_->index(row, newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(index); } slotNewsViewSelected(index); } /** @brief Mark news Read *----------------------------------------------------------------------------*/ void NewsTabWidget::slotSetItemRead(QModelIndex index, int read) { markNewsReadTimer_->stop(); if (!index.isValid() || (newsModel_->rowCount() == 0)) return; bool changed = false; int newsId = newsModel_->dataField(index.row(), "id").toInt(); if (read == 1) { if (newsModel_->dataField(index.row(), "new").toInt() == 1) { newsModel_->setData( newsModel_->index(index.row(), newsModel_->fieldIndex("new")), 0); mainApp->sqlQueryExec(QString("UPDATE news SET new=0 WHERE id=='%1'").arg(newsId)); } if (newsModel_->dataField(index.row(), "read").toInt() == 0) { newsModel_->setData( newsModel_->index(index.row(), newsModel_->fieldIndex("read")), 1); mainApp->sqlQueryExec(QString("UPDATE news SET read=1 WHERE id=='%1'").arg(newsId)); changed = true; } } else { if (newsModel_->dataField(index.row(), "read").toInt() != 0) { newsModel_->setData( newsModel_->index(index.row(), newsModel_->fieldIndex("read")), 0); mainApp->sqlQueryExec(QString("UPDATE news SET read=0 WHERE id=='%1'").arg(newsId)); changed = true; } } if (changed) { newsView_->viewport()->update(); int feedId = newsModel_->dataField(index.row(), "feedId").toInt(); mainWindow_->slotUpdateStatus(feedId); mainWindow_->recountCategoryCounts(); } } /** @brief Mark news Star *----------------------------------------------------------------------------*/ void NewsTabWidget::slotSetItemStar(QModelIndex index, int starred) { if (!index.isValid()) return; newsModel_->setData(index, starred); int newsId = newsModel_->dataField(index.row(), "id").toInt(); mainApp->sqlQueryExec(QString("UPDATE news SET starred='%1' WHERE id=='%2'"). arg(starred).arg(newsId)); mainWindow_->recountCategoryCounts(); } void NewsTabWidget::slotMarkReadTimeout() { slotSetItemRead(newsView_->currentIndex(), 1); } /** @brief Mark selected news Read *----------------------------------------------------------------------------*/ void NewsTabWidget::markNewsRead() { if (type_ >= TabTypeWeb) return; markNewsReadTimer_->stop(); QModelIndex curIndex; QList indexes = newsView_->selectionModel()->selectedRows(0); int cnt = indexes.count(); if (cnt == 0) return; if (cnt == 1) { curIndex = indexes.at(0); if (newsModel_->dataField(curIndex.row(), "read").toInt() == 0) { slotSetItemRead(curIndex, 1); } else { slotSetItemRead(curIndex, 0); } } else { QStringList feedIdList; bool markRead = false; for (int i = cnt-1; i >= 0; --i) { curIndex = indexes.at(i); if (newsModel_->dataField(curIndex.row(), "read").toInt() == 0) { markRead = true; break; } } db_.transaction(); QSqlQuery q; for (int i = cnt-1; i >= 0; --i) { curIndex = indexes.at(i); newsModel_->setData( newsModel_->index(curIndex.row(), newsModel_->fieldIndex("new")), 0); newsModel_->setData( newsModel_->index(curIndex.row(), newsModel_->fieldIndex("read")), markRead); int newsId = newsModel_->dataField(curIndex.row(), "id").toInt(); q.exec(QString("UPDATE news SET new=0, read='%1' WHERE id=='%2'"). arg(markRead).arg(newsId)); QString feedId = newsModel_->dataField(curIndex.row(), "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } db_.commit(); foreach (QString feedId, feedIdList) { mainWindow_->slotUpdateStatus(feedId.toInt()); } mainWindow_->recountCategoryCounts(); newsView_->viewport()->update(); } } /** @brief Mark all news of the feed Read *----------------------------------------------------------------------------*/ void NewsTabWidget::markAllNewsRead() { if (type_ >= TabTypeWeb) return; markNewsReadTimer_->stop(); int cnt = newsModel_->rowCount(); if (cnt == 0) return; QStringList feedIdList; db_.transaction(); QSqlQuery q; for (int i = cnt-1; i >= 0; --i) { int newsId = newsModel_->dataField(i, "id").toInt(); q.exec(QString("UPDATE news SET read=1 WHERE id=='%1' AND read=0").arg(newsId)); q.exec(QString("UPDATE news SET new=0 WHERE id=='%1' AND new=1").arg(newsId)); QString feedId = newsModel_->dataField(i, "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } db_.commit(); int currentRow = newsView_->currentIndex().row(); newsModel_->select(); while (newsModel_->canFetchMore()) newsModel_->fetchMore(); loadNewspaper(RefreshWithPos); newsView_->setCurrentIndex(newsModel_->index(currentRow, newsModel_->fieldIndex("title"))); foreach (QString feedId, feedIdList) { mainWindow_->slotUpdateStatus(feedId.toInt()); } mainWindow_->recountCategoryCounts(); } /** @brief Mark selected news Starred *----------------------------------------------------------------------------*/ void NewsTabWidget::markNewsStar() { if (type_ >= TabTypeWeb) return; QModelIndex curIndex; QList indexes = newsView_->selectionModel()->selectedRows( newsModel_->fieldIndex("starred")); int cnt = indexes.count(); if (cnt == 0) return; if (cnt == 1) { curIndex = indexes.at(0); if (curIndex.data(Qt::EditRole).toInt() == 0) { slotSetItemStar(curIndex, 1); } else { slotSetItemStar(curIndex, 0); } } else { bool markStar = false; for (int i = cnt-1; i >= 0; --i) { curIndex = indexes.at(i); if (curIndex.data(Qt::EditRole).toInt() == 0) { markStar = true; break; } } db_.transaction(); for (int i = cnt-1; i >= 0; --i) { curIndex = indexes.at(i); newsModel_->setData(curIndex, markStar); int newsId = newsModel_->dataField(curIndex.row(), "id").toInt(); QSqlQuery q; q.exec(QString("UPDATE news SET starred='%1' WHERE id=='%2'"). arg(markStar).arg(newsId)); } db_.commit(); mainWindow_->recountCategoryCounts(); } } /** @brief Delete selected news *----------------------------------------------------------------------------*/ void NewsTabWidget::deleteNews() { if (type_ >= TabTypeWeb) return; QModelIndex curIndex; QList indexes = newsView_->selectionModel()->selectedRows(newsModel_->fieldIndex("deleted")); int cnt = indexes.count(); if (cnt == 0) return; QStringList feedIdList; if (type_ != TabTypeDel) { if (cnt == 1) { curIndex = indexes.at(0); if (newsModel_->dataField(curIndex.row(), "starred").toInt() && mainWindow_->notDeleteStarred_) return; QString labelStr = newsModel_->dataField(curIndex.row(), "label").toString(); if (!(labelStr.isEmpty() || (labelStr == ",")) && mainWindow_->notDeleteLabeled_) return; slotSetItemRead(curIndex, 1); newsModel_->setData(curIndex, 1); newsModel_->setData(newsModel_->index(curIndex.row(), newsModel_->fieldIndex("deleteDate")), QDateTime::currentDateTime().toString(Qt::ISODate)); QString feedId = newsModel_->dataField(curIndex.row(), "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); newsModel_->submitAll(); } else { db_.transaction(); QSqlQuery q; for (int i = cnt-1; i >= 0; --i) { curIndex = indexes.at(i); if (newsModel_->dataField(curIndex.row(), "starred").toInt() && mainWindow_->notDeleteStarred_) continue; QString labelStr = newsModel_->dataField(curIndex.row(), "label").toString(); if (!(labelStr.isEmpty() || (labelStr == ",")) && mainWindow_->notDeleteLabeled_) continue; int newsId = newsModel_->dataField(curIndex.row(), "id").toInt(); q.exec(QString("UPDATE news SET new=0, read=2, deleted=1, deleteDate='%1' WHERE id=='%2'"). arg(QDateTime::currentDateTime().toString(Qt::ISODate)). arg(newsId)); QString feedId = newsModel_->dataField(curIndex.row(), "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } db_.commit(); newsModel_->select(); } } else { db_.transaction(); QSqlQuery q; for (int i = cnt-1; i >= 0; --i) { curIndex = indexes.at(i); int newsId = newsModel_->dataField(curIndex.row(), "id").toInt(); q.exec(QString("UPDATE news SET description='', content='', received='', " "author_name='', author_uri='', author_email='', " "category='', new='', read='', starred='', label='', " "deleteDate='', feedParentId='', deleted=2 WHERE id=='%1'"). arg(newsId)); QString feedId = newsModel_->dataField(curIndex.row(), "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } db_.commit(); newsModel_->select(); } while (newsModel_->canFetchMore()) newsModel_->fetchMore(); if (curIndex.row() == newsModel_->rowCount()) curIndex = newsModel_->index(curIndex.row()-1, newsModel_->fieldIndex("title")); else if (curIndex.row() > newsModel_->rowCount()) curIndex = newsModel_->index(newsModel_->rowCount()-1, newsModel_->fieldIndex("title")); else curIndex = newsModel_->index(curIndex.row(), newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(curIndex); slotNewsViewSelected(curIndex); foreach (QString feedId, feedIdList) { mainWindow_->slotUpdateStatus(feedId.toInt()); } mainWindow_->recountCategoryCounts(); } /** @brief Delete all news of the feed *----------------------------------------------------------------------------*/ void NewsTabWidget::deleteAllNewsList() { if (type_ >= TabTypeWeb) return; int cnt = newsModel_->rowCount(); if (cnt == 0) return; QStringList feedIdList; db_.transaction(); QSqlQuery q; for (int i = cnt-1; i >= 0; --i) { int newsId = newsModel_->dataField(i, "id").toInt(); if (type_ != TabTypeDel) { if (newsModel_->dataField(i, "starred").toInt() && mainWindow_->notDeleteStarred_) continue; QString labelStr = newsModel_->dataField(i, "label").toString(); if (!(labelStr.isEmpty() || (labelStr == ",")) && mainWindow_->notDeleteLabeled_) continue; q.exec(QString("UPDATE news SET new=0, read=2, deleted=1, deleteDate='%1' WHERE id=='%2'"). arg(QDateTime::currentDateTime().toString(Qt::ISODate)). arg(newsId)); } else { q.exec(QString("UPDATE news SET description='', content='', received='', " "author_name='', author_uri='', author_email='', " "category='', new='', read='', starred='', label='', " "deleteDate='', feedParentId='', deleted=2 WHERE id=='%1'"). arg(newsId)); } QString feedId = newsModel_->dataField(i, "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } db_.commit(); newsModel_->select(); slotNewsViewSelected(QModelIndex()); foreach (QString feedId, feedIdList) { mainWindow_->slotUpdateStatus(feedId.toInt()); } mainWindow_->recountCategoryCounts(); } /** @brief Restore deleted news *----------------------------------------------------------------------------*/ void NewsTabWidget::restoreNews() { if (type_ >= TabTypeWeb) return; QModelIndex curIndex; QList indexes = newsView_->selectionModel()->selectedRows(newsModel_->fieldIndex("deleted")); int cnt = indexes.count(); if (cnt == 0) return; QStringList feedIdList; if (cnt == 1) { curIndex = indexes.at(0); newsModel_->setData(curIndex, 0); newsModel_->setData(newsModel_->index(curIndex.row(), newsModel_->fieldIndex("deleteDate")), ""); newsModel_->submitAll(); QString feedId = newsModel_->dataField(curIndex.row(), "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } else { db_.transaction(); QSqlQuery q; for (int i = cnt-1; i >= 0; --i) { curIndex = indexes.at(i); int newsId = newsModel_->dataField(curIndex.row(), "id").toInt(); q.exec(QString("UPDATE news SET deleted=0, deleteDate='' WHERE id=='%1'"). arg(newsId)); QString feedId = newsModel_->dataField(curIndex.row(), "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } db_.commit(); newsModel_->select(); } while (newsModel_->canFetchMore()) newsModel_->fetchMore(); loadNewspaper(RefreshWithPos); if (curIndex.row() == newsModel_->rowCount()) curIndex = newsModel_->index(curIndex.row()-1, newsModel_->fieldIndex("title")); else if (curIndex.row() > newsModel_->rowCount()) curIndex = newsModel_->index(newsModel_->rowCount()-1, newsModel_->fieldIndex("title")); else curIndex = newsModel_->index(curIndex.row(), newsModel_->fieldIndex("title")); newsView_->setCurrentIndex(curIndex); slotNewsViewSelected(curIndex); mainWindow_->slotUpdateStatus(feedId_); mainWindow_->recountCategoryCounts(); foreach (QString feedId, feedIdList) { mainWindow_->slotUpdateStatus(feedId.toInt()); } mainWindow_->recountCategoryCounts(); } /** @brief Copy news link *----------------------------------------------------------------------------*/ void NewsTabWidget::slotCopyLinkNews() { if (type_ >= TabTypeWeb) return; QList indexes = newsView_->selectionModel()->selectedRows(0); int cnt = indexes.count(); if (cnt == 0) return; QString copyStr; for (int i = cnt-1; i >= 0; --i) { if (!copyStr.isEmpty()) copyStr.append("\n"); copyStr.append(getLinkNews(indexes.at(i).row())); } QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(copyStr); } /** @brief Sort news by Star or Read column *----------------------------------------------------------------------------*/ void NewsTabWidget::slotSort(int column, int/* order*/) { QString strId; if (feedsModel_->isFolder(feedsModel_->indexById(feedId_))) { strId = QString("(%1)").arg(mainWindow_->getIdFeedsString(feedId_)); } else { strId = QString("feedId='%1'").arg(feedId_); } QString qStr; if (column == newsModel_->fieldIndex("read")) { qStr = QString("UPDATE news SET rights=read WHERE %1").arg(strId); } else if (column == newsModel_->fieldIndex("starred")) { qStr = QString("UPDATE news SET rights=starred WHERE %1").arg(strId); } else if (column == newsModel_->fieldIndex("rights")) { qStr = QString("UPDATE news SET rights = (SELECT text from feeds where id = news.feedId) WHERE %1").arg(strId); } QSqlQuery q; q.exec(qStr); } /** @brief Load/Update browser contents *----------------------------------------------------------------------------*/ void NewsTabWidget::updateWebView(QModelIndex index) { if (!index.isValid()) { hideWebContent(); return; } bool showDescriptionNews_ = mainWindow_->showDescriptionNews_; QModelIndex currentIndex = feedsProxyModel_->mapToSource(feedsView_->currentIndex()); QVariant displayNews = feedsModel_->dataField(currentIndex, "displayNews"); if (!displayNews.toString().isEmpty()) { showDescriptionNews_ = !displayNews.toInt(); } if (showDescriptionNews_) { updateWebView_Description(index); } else { updateWebView_Link(index, (mainWindow_->externalBrowserOn_ > 0)); } } void NewsTabWidget::updateWebView_Link(QModelIndex index, bool bExternalLink/*=false*/, QString overrideURL/*=""*/) { if (!index.isValid()) { hideWebContent(); return; } linkNewsString_ = getLinkNews(index.row()); QUrl newsUrl = QUrl::fromEncoded((overrideURL.isEmpty() ? linkNewsString_ : overrideURL).toUtf8()); if (bExternalLink) { openUrl(newsUrl); } else { locationBar_->setText(newsUrl.toString()); setWebToolbarVisible(true, false); webView_->history()->setMaximumItemCount(0); webView_->load(newsUrl); webView_->history()->setMaximumItemCount(100); } } void NewsTabWidget::updateWebView_Description(QModelIndex index) { if (!index.isValid()) { hideWebContent(); return; } setWebToolbarVisible(false, false); linkNewsString_ = getLinkNews(index.row()); QString htmlString = ""; QUrl url; generateDescriptionHtml(index, htmlString, url); emit signalSetHtmlWebView(htmlString, url); } void NewsTabWidget::generateDescriptionHtml(QModelIndex index, QString& outHtml, QUrl& outURL) { QString linkString = getLinkNews(index.row()); QUrl newsUrl = QUrl::fromEncoded(linkString.toUtf8()); outURL.setScheme(newsUrl.scheme()); outURL.setHost(newsUrl.host()); QString newsId = newsModel_->dataField(index.row(), "id").toString(); QString content = newsModel_->dataField(index.row(), "content").toString(); if (!content.contains(QzRegExp("", Qt::CaseInsensitive))) { QString description = newsModel_->dataField(index.row(), "description").toString(); if (content.isEmpty() || (description.length() > content.length())) { content = description; } QString feedId = newsModel_->dataField(index.row(), "feedId").toString(); QModelIndex feedIndex = feedsModel_->indexById(feedId.toInt()); QString titleString = newsModel_->dataField(index.row(), "title").toString(); if (!linkString.isEmpty()) { titleString = QString("%2").arg(linkString, titleString); } QDateTime dtLocal; QString dateString = newsModel_->dataField(index.row(), "published").toString(); if (!dateString.isNull()) { QDateTime dtLocalTime = QDateTime::currentDateTime(); QDateTime dtUTC = QDateTime(dtLocalTime.date(), dtLocalTime.time(), Qt::UTC); int nTimeShift = dtLocalTime.secsTo(dtUTC); QDateTime dt = QDateTime::fromString(dateString, Qt::ISODate); dtLocal = dt.addSecs(nTimeShift); } else { dtLocal = QDateTime::fromString(newsModel_->dataField(index.row(), "received").toString(), Qt::ISODate); } if (QDateTime::currentDateTime().date() <= dtLocal.date()) { dateString = dtLocal.toString(mainWindow_->formatTime_); } else { dateString = dtLocal.toString(mainWindow_->formatDate_ + " " + mainWindow_->formatTime_); } // Create author panel from news author QString authorString; QString authorName = newsModel_->dataField(index.row(), "author_name").toString(); QString authorEmail = newsModel_->dataField(index.row(), "author_email").toString(); QString authorUri = newsModel_->dataField(index.row(), "author_uri").toString(); QzRegExp reg("(^\\S+@\\S+\\.\\S+)", Qt::CaseInsensitive); int pos = reg.indexIn(authorName); if (pos > -1) { authorName.replace(reg.cap(1), QString(" %1").arg(reg.cap(1))); } authorString = authorName; if (!authorEmail.isEmpty()) { authorString.append(QString(" e-mail").arg(authorEmail)); } if (!authorUri.isEmpty()) { authorString.append(QString(" page"). arg(authorUri)); } // If news author is absent, create author panel from feed author // @note(arhohryakov:2012.01.03) Author is got from current feed, because // news is belong to it if (authorString.isEmpty()) { authorName = feedsModel_->dataField(feedIndex, "author_name").toString(); authorEmail = feedsModel_->dataField(feedIndex, "author_email").toString(); authorUri = feedsModel_->dataField(feedIndex, "author_uri").toString(); authorString = authorName; if (!authorEmail.isEmpty()) { authorString.append(QString(" e-mail").arg(authorEmail)); } if (!authorUri.isEmpty()) { authorString.append(QString(" page").arg(authorUri)); } } QString commentsStr; QString commentsUrl = newsModel_->dataField(index.row(), "comments").toString(); if (!commentsUrl.isEmpty()) { commentsStr = QString(" %2").arg(commentsUrl, tr("Comments")); } QString category = newsModel_->dataField(index.row(), "category").toString(); if (!authorString.isEmpty()) { authorString = QString(tr("Author: %1")).arg(authorString); if (!commentsStr.isEmpty()) { authorString.append(QString(" | %1").arg(commentsStr)); } if (!category.isEmpty()) { authorString.append(QString(" | %1").arg(category)); } } else { if (!commentsStr.isEmpty()) { authorString.append(commentsStr); } if (!category.isEmpty()) { if (!commentsStr.isEmpty()) { authorString.append(QString(" | %1").arg(category)); } else { authorString.append(category); } } } QString labelsString = getHtmlLabels(index.row()); authorString.append(QString("%2
"). arg(newsId).arg(labelsString)); QString enclosureStr; QString enclosureUrl = newsModel_->dataField(index.row(), "enclosure_url").toString(); if (!enclosureUrl.isEmpty()) { QString type = newsModel_->dataField(index.row(), "enclosure_type").toString(); if (type.contains("image")) { if (!content.contains(enclosureUrl) && autoLoadImages_) { enclosureStr = QString("

").arg(enclosureUrl); } } else { if (type.contains("audio")) { type = tr("audio"); enclosureStr = audioPlayerHtml_.arg(enclosureUrl); enclosureStr.append("

"); } else if (type.contains("video")) { type = tr("video"); enclosureStr = videoPlayerHtml_.arg(enclosureUrl); enclosureStr.append("

"); } else { type = tr("media"); } enclosureStr.append(QString(" %2 %3

"). arg(enclosureUrl, tr("Link to"), type)); } } content = enclosureStr + content; bool ltr = !feedsModel_->dataField(feedIndex, "layoutDirection").toInt(); QString cssStr = cssString_. arg(ltr ? "left" : "right"). // text-align arg(ltr ? "ltr" : "rtl"). // direction arg(ltr ? "right" : "left"); // "Date" text-align if (!autoLoadImages_) { QzRegExp reg("]+>", Qt::CaseInsensitive); content = content.remove(reg); } if (ltr) { outHtml = htmlString_.arg(cssStr, titleString, dateString, authorString, content); } else { outHtml = htmlRtlString_.arg(cssStr, titleString, dateString, authorString, content); } } else { if (!autoLoadImages_) { content = content.remove(QzRegExp("]+>", Qt::CaseInsensitive)); } outHtml = content; } outHtml = outHtml.replace("src=\"//", "src=\"http://"); } void NewsTabWidget::loadNewspaper(int refresh) { if (mainWindow_->newsLayout_ != 1) return; setWebToolbarVisible(false, false); webView_->setUpdatesEnabled(false); int sortOrder = newsHeader_->sortIndicatorOrder(); int scrollBarValue = 0; int height = 0; if (refresh != RefreshAll) { scrollBarValue = webView_->page()->mainFrame()->scrollBarValue(Qt::Vertical); height = webView_->page()->mainFrame()->contentsSize().height(); } webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, true); QString htmlStr; QUrl hostUrl; bool ltr = true; if (type_ == TabTypeFeed) { QModelIndex feedIndex = feedsProxyModel_->mapToSource(feedsView_->currentIndex()); hostUrl = feedsModel_->dataField(feedIndex, "htmlUrl").toString(); ltr = !feedsModel_->dataField(feedIndex, "layoutDirection").toInt(); } if ((refresh == RefreshAll) || (refresh == RefreshWithPos)) { QString cssStr = cssString_. arg(ltr ? "left" : "right"). // text-align arg(ltr ? "ltr" : "rtl"). // direction arg(ltr ? "right" : "left"); // "Date" text-align htmlStr = newspaperHeadHtml_.arg(cssStr); webView_->setHtml(htmlStr, hostUrl); } int idx = -1; if ((refresh == RefreshInsert) && (sortOrder == Qt::DescendingOrder)) idx = newsModel_->rowCount(); while (1) { if ((refresh == RefreshInsert) && (sortOrder == Qt::DescendingOrder)) { idx--; if (idx < 0) break; } else { idx++; if (idx >= newsModel_->rowCount()) break; } QModelIndex index = newsModel_->index(idx, newsModel_->fieldIndex("id")); QString newsId = newsModel_->dataField(index.row(), "id").toString(); if (refresh == RefreshInsert) { QWebElement document = webView_->page()->mainFrame()->documentElement(); QWebElement element = document.findFirst(QString("div[id=newsItem%1]").arg(newsId)); if (!element.isNull()) { continue; } } linkNewsString_ = getLinkNews(index.row()); QString linkString = linkNewsString_; QString content = newsModel_->dataField(index.row(), "content").toString(); if (!content.contains(QzRegExp("", Qt::CaseInsensitive))) { QString description = newsModel_->dataField(index.row(), "description").toString(); if (content.isEmpty() || (description.length() > content.length())) { content = description; } // QTextDocumentFragment textDocument = QTextDocumentFragment::fromHtml(content); // content = textDocument.toPlainText(); // content = webView_->fontMetrics().elidedText( // content, Qt::ElideRight, 1500); QString feedId = newsModel_->dataField(index.row(), "feedId").toString(); QModelIndex feedIndex = feedsModel_->indexById(feedId.toInt()); QString iconStr = "qrc:/images/bulletRead"; QString titleStyle = "read"; if (newsModel_->dataField(index.row(), "new").toInt() == 1) { iconStr = "qrc:/images/bulletNew"; titleStyle = "unread"; } else if (newsModel_->dataField(index.row(), "read").toInt() == 0) { iconStr = "qrc:/images/bulletUnread"; titleStyle = "unread"; } QString readImg = QString("" ""). arg(newsId).arg(iconStr).arg(tr("Mark Read/Unread")); QString feedImg; QByteArray byteArray = feedsModel_->dataField(feedIndex, "image").toByteArray(); if (!byteArray.isEmpty()) feedImg = QString(""; else feedImg = QString(""); QString titleString = newsModel_->dataField(index.row(), "title").toString(); if (!linkString.isEmpty()) { titleString = QString("%4"). arg(linkString, titleStyle, newsId, titleString); } QDateTime dtLocal; QString dateString = newsModel_->dataField(index.row(), "published").toString(); if (!dateString.isNull()) { QDateTime dtLocalTime = QDateTime::currentDateTime(); QDateTime dtUTC = QDateTime(dtLocalTime.date(), dtLocalTime.time(), Qt::UTC); int nTimeShift = dtLocalTime.secsTo(dtUTC); QDateTime dt = QDateTime::fromString(dateString, Qt::ISODate); dtLocal = dt.addSecs(nTimeShift); } else { dtLocal = QDateTime::fromString( newsModel_->dataField(index.row(), "received").toString(), Qt::ISODate); } if (QDateTime::currentDateTime().date() <= dtLocal.date()) dateString = dtLocal.toString(mainWindow_->formatTime_); else dateString = dtLocal.toString(mainWindow_->formatDate_ + " " + mainWindow_->formatTime_); // Create author panel from news author QString authorString; QString authorName = newsModel_->dataField(index.row(), "author_name").toString(); QString authorEmail = newsModel_->dataField(index.row(), "author_email").toString(); QString authorUri = newsModel_->dataField(index.row(), "author_uri").toString(); QzRegExp reg("(^\\S+@\\S+\\.\\S+)", Qt::CaseInsensitive); int pos = reg.indexIn(authorName); if (pos > -1) { authorName.replace(reg.cap(1), QString(" %1").arg(reg.cap(1))); } authorString = authorName; if (!authorEmail.isEmpty()) authorString.append(QString(" e-mail").arg(authorEmail)); if (!authorUri.isEmpty()) authorString.append(QString(" page"). arg(authorUri)); // If news author is absent, create author panel from feed author // @note(arhohryakov:2012.01.03) Author is got from current feed, because // news is belong to it if (authorString.isEmpty()) { authorName = feedsModel_->dataField(feedIndex, "author_name").toString(); authorEmail = feedsModel_->dataField(feedIndex, "author_email").toString(); authorUri = feedsModel_->dataField(feedIndex, "author_uri").toString(); authorString = authorName; if (!authorEmail.isEmpty()) authorString.append(QString(" e-mail").arg(authorEmail)); if (!authorUri.isEmpty()) authorString.append(QString(" page").arg(authorUri)); } QString commentsStr; QString commentsUrl = newsModel_->dataField(index.row(), "comments").toString(); if (!commentsUrl.isEmpty()) { commentsStr = QString(" %2").arg(commentsUrl, tr("Comments")); } QString category = newsModel_->dataField(index.row(), "category").toString(); if (!authorString.isEmpty()) { authorString = QString(tr("Author: %1")).arg(authorString); if (!commentsStr.isEmpty()) authorString.append(QString(" | %1").arg(commentsStr)); if (!category.isEmpty()) authorString.append(QString(" | %1").arg(category)); } else { if (!commentsStr.isEmpty()) authorString.append(commentsStr); if (!category.isEmpty()) { if (!commentsStr.isEmpty()) authorString.append(QString(" | %1").arg(category)); else authorString.append(category); } } QString labelsString = getHtmlLabels(index.row()); authorString.append(QString("%2
"). arg(newsId).arg(labelsString)); QString enclosureStr; QString enclosureUrl = newsModel_->dataField(index.row(), "enclosure_url").toString(); if (!enclosureUrl.isEmpty()) { QString type = newsModel_->dataField(index.row(), "enclosure_type").toString(); if (type.contains("image")) { if (!content.contains(enclosureUrl) && autoLoadImages_) { enclosureStr = QString("

"). arg(enclosureUrl); } } else { if (type.contains("audio")) { type = tr("audio"); enclosureStr = audioPlayerHtml_.arg(enclosureUrl); enclosureStr.append("

"); } else if (type.contains("video")) { type = tr("video"); enclosureStr = videoPlayerHtml_.arg(enclosureUrl); enclosureStr.append("

"); } else type = tr("media"); enclosureStr.append(QString(" %2 %3

"). arg(enclosureUrl, tr("Link to"), type)); } } content = enclosureStr + content; if (!autoLoadImages_) { QzRegExp reg("]+>", Qt::CaseInsensitive); content = content.remove(reg); } iconStr = "qrc:/images/starOff"; if (newsModel_->dataField(index.row(), "starred").toInt() == 1) { iconStr = "qrc:/images/starOn"; } QString starAction = QString("

" "" "
"). arg(newsId).arg(iconStr).arg(tr("Mark News Star")); QString labelsMenu = QString("
" "" "
"). arg(newsId).arg(tr("Label")); QString shareMenu = QString("
" "" "
"). arg(newsId).arg(tr("Share")); QString openBrowserAction = QString("
" "" "
"). arg(newsId).arg(tr("Open News in External Browser")); QString deleteAction = QString("
" "" "
"). arg(newsId).arg(tr("Delete")); QString actionNews = starAction % labelsMenu % shareMenu % openBrowserAction % deleteAction; QString border = "0"; if (idx != 0) border = "1"; if (ltr) { htmlStr = newspaperHtml_.arg(newsId, border, readImg, feedImg, titleString, dateString, authorString, content, actionNews); } else { htmlStr = newspaperHtmlRtl_.arg(newsId, border, readImg, feedImg, titleString, dateString, authorString, content, actionNews); } } else { if (!autoLoadImages_) { content = content.remove(QzRegExp("]+>", Qt::CaseInsensitive)); } htmlStr = content; } htmlStr = htmlStr.replace("src=\"//", "src=\"http://"); QWebElement document = webView_->page()->mainFrame()->documentElement(); QWebElement element = document.findFirst("body"); if ((refresh == RefreshInsert) && (sortOrder == Qt::DescendingOrder)) element.prependInside(htmlStr); else element.appendInside(htmlStr); qApp->processEvents(); } webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, autoLoadImages_); if ((refresh == RefreshInsert) && (sortOrder == Qt::DescendingOrder)) scrollBarValue += webView_->page()->mainFrame()->contentsSize().height() - height; if (refresh != RefreshAll) webView_->page()->mainFrame()->setScrollBarValue(Qt::Vertical, scrollBarValue); webView_->setUpdatesEnabled(true); } void NewsTabWidget::setHtmlWebView(const QString &html, const QUrl &baseUrl) { emit signalSetHtmlWebView(html, baseUrl); } /** @brief Asynchorous update web view *----------------------------------------------------------------------------*/ void NewsTabWidget::slotSetHtmlWebView(const QString &html, const QUrl &baseUrl) { webView_->history()->setMaximumItemCount(0); webView_->setHtml(html, baseUrl); webView_->history()->setMaximumItemCount(100); } void NewsTabWidget::hideWebContent() { if (mainWindow_->newsLayout_ == 1) return; emit signalSetHtmlWebView(); setWebToolbarVisible(false, false); } void NewsTabWidget::slotLinkClicked(QUrl url, bool bForceNewTab/*=false*/, bool bForceNewBkgTab/*=false*/, const QString &overrideHtml/*=""*/) { if (url.scheme() == QLatin1String("quiterss")) { actionNewspaper(url); return; } if (url.scheme() == QLatin1String("mailto")) { QDesktopServices::openUrl(url); return; } if (type_ != TabTypeWeb) { if (url.host().isEmpty() && newsView_->currentIndex().isValid()) { int row = newsView_->currentIndex().row(); int feedId = newsModel_->dataField(row, "feedId").toInt(); QModelIndex feedIndex = feedsModel_->indexById(feedId); QUrl hostUrl = feedsModel_->dataField(feedIndex, "htmlUrl").toString(); url.setScheme(hostUrl.scheme()); url.setHost(hostUrl.host()); } } bool bLoadWebView = false; bool bLoadNewTab = false; if (bForceNewTab) { mainWindow_->openNewsTab_ = NEW_TAB_FOREGROUND; bLoadNewTab = true; } else if (bForceNewBkgTab) { mainWindow_->openNewsTab_ = NEW_TAB_BACKGROUND; bLoadNewTab = true; } else if ((mainWindow_->externalBrowserOn_ <= 0) && (webView_->buttonClick_ != LEFT_BUTTON_ALT)) { if (webView_->buttonClick_ == LEFT_BUTTON) { bLoadWebView = true; } else { if ((webView_->buttonClick_ == MIDDLE_BUTTON) || (webView_->buttonClick_ == LEFT_BUTTON_CTRL)) { mainWindow_->openNewsTab_ = NEW_TAB_BACKGROUND; } else { mainWindow_->openNewsTab_ = NEW_TAB_FOREGROUND; } if (!mainWindow_->openLinkInBackgroundEmbedded_) { if (mainWindow_->openNewsTab_ == NEW_TAB_BACKGROUND) { mainWindow_->openNewsTab_ = NEW_TAB_FOREGROUND; } else { mainWindow_->openNewsTab_ = NEW_TAB_BACKGROUND; } } bLoadNewTab = true; } } if (bLoadWebView) { if (!webControlPanel_->isVisible()) { locationBar_->setText(url.toString()); setWebToolbarVisible(true, false); } webView_->load(url); } else if (bLoadNewTab) { mainWindow_->createWebTab(url, overrideHtml); } else // if (bLoadExternal) { openUrl(url); } webView_->buttonClick_ = 0; } //---------------------------------------------------------------------------- void NewsTabWidget::slotLinkHovered(const QString &link, const QString &, const QString &) { if (QUrl(link).scheme() == QLatin1String("quiterss")) return; mainWindow_->statusBar()->showMessage(link.simplified(), 3000); } //---------------------------------------------------------------------------- void NewsTabWidget::slotSetValue(int value) { emit loadProgress(value); QString str = QString(" %1 kB / %2 kB"). arg(webView_->page()->bytesReceived()/1000). arg(webView_->page()->totalBytes()/1000); webViewProgressLabel_->setText(str); } //---------------------------------------------------------------------------- void NewsTabWidget::slotLoadStarted() { if (type_ == TabTypeWeb) { newsIconTitle_->setMovie(newsIconMovie_); newsIconMovie_->start(); } webViewProgress_->setValue(0); webViewProgress_->show(); } //---------------------------------------------------------------------------- void NewsTabWidget::slotLoadFinished(bool) { if (type_ == TabTypeWeb) { newsIconMovie_->stop(); QPixmap iconTab; iconTab.load(":/images/webPage"); newsIconTitle_->setPixmap(iconTab); } webViewProgress_->hide(); } void NewsTabWidget::slotUrlEnter() { webView_->setFocus(); if (!locationBar_->text().startsWith("http://") && !locationBar_->text().startsWith("https://")) { locationBar_->setText("http://" + locationBar_->text()); } locationBar_->setCursorPosition(0); webView_->load(QUrl(locationBar_->text())); } void NewsTabWidget::slotUrlChanged(const QUrl &url) { locationBar_->setText(url.toString()); locationBar_->setCursorPosition(0); } /** @brief Go to short news content *----------------------------------------------------------------------------*/ void NewsTabWidget::webHomePage() { if (type_ != TabTypeWeb) { switch (mainWindow_->newsLayout_) { case 1: loadNewspaper(); break; default: updateWebView(newsView_->currentIndex()); } } else { webView_->history()->goToItem(webView_->history()->itemAt(0)); } } /** @brief Open current web page in external browser *----------------------------------------------------------------------------*/ void NewsTabWidget::openPageInExternalBrowser() { openUrl(webView_->url()); } /** @brief Open news in browser *----------------------------------------------------------------------------*/ void NewsTabWidget::openInBrowserNews() { if (type_ >= TabTypeWeb) return; int externalBrowserOn_ = mainWindow_->externalBrowserOn_; mainWindow_->externalBrowserOn_ = 0; slotNewsViewDoubleClicked(newsView_->currentIndex()); mainWindow_->externalBrowserOn_ = externalBrowserOn_; } /** @brief Open news in external browser *----------------------------------------------------------------------------*/ void NewsTabWidget::openInExternalBrowserNews() { if (type_ == TabTypeDownloads) return; if (type_ != TabTypeWeb) { QList indexes = newsView_->selectionModel()->selectedRows(0); QStringList feedIdList; int cnt = indexes.count(); if (cnt == 0) return; for (int i = cnt-1; i >= 0; --i) { QSqlQuery q; QModelIndex curIndex = indexes.at(i); if (newsModel_->dataField(curIndex.row(), "read").toInt() == 0) { newsModel_->setData( newsModel_->index(curIndex.row(), newsModel_->fieldIndex("new")), 0); newsModel_->setData( newsModel_->index(curIndex.row(), newsModel_->fieldIndex("read")), 1); int newsId = newsModel_->dataField(curIndex.row(), "id").toInt(); q.exec(QString("UPDATE news SET new=0, read=1 WHERE id=='%2'").arg(newsId)); QString feedId = newsModel_->dataField(curIndex.row(), "feedId").toString(); if (!feedIdList.contains(feedId)) feedIdList.append(feedId); } QUrl url = QUrl::fromEncoded(getLinkNews(indexes.at(i).row()).toUtf8()); if (url.host().isEmpty()) { QString feedId = newsModel_->dataField(indexes.at(i).row(), "feedId").toString(); QModelIndex feedIndex = feedsModel_->indexById(feedId.toInt()); QUrl hostUrl = feedsModel_->dataField(feedIndex, "htmlUrl").toString(); url.setScheme(hostUrl.scheme()); url.setHost(hostUrl.host()); } openUrl(url); } if (!feedIdList.isEmpty()) { foreach (QString feedId, feedIdList) { mainWindow_->slotUpdateStatus(feedId.toInt()); } mainWindow_->recountCategoryCounts(); newsView_->viewport()->update(); } } else { openUrl(webView_->url()); } } void NewsTabWidget::setNewsLayout() { if (type_ == TabTypeDownloads) return; switch (mainWindow_->newsLayout_) { case 1: newsWidget_->setVisible(false); loadNewspaper(); break; default: newsWidget_->setVisible(true); updateWebView(newsView_->currentIndex()); } } /** @brief Set browser position *----------------------------------------------------------------------------*/ void NewsTabWidget::setBrowserPosition() { if (type_ == TabTypeDownloads) return; int idx = newsTabWidgetSplitter_->indexOf(webWidget_); switch (mainWindow_->browserPosition_) { case TOP_POSITION: case LEFT_POSITION: newsTabWidgetSplitter_->insertWidget(0, newsTabWidgetSplitter_->widget(idx)); break; default: newsTabWidgetSplitter_->insertWidget(1, newsTabWidgetSplitter_->widget(idx)); } switch (mainWindow_->browserPosition_) { case RIGHT_POSITION: case LEFT_POSITION: newsTabWidgetSplitter_->setOrientation(Qt::Horizontal); newsTabWidgetSplitter_->setStyleSheet( QString("QSplitter::handle {background: qlineargradient(" "x1: 0, y1: 0, x2: 0, y2: 1," "stop: 0 %1, stop: 0.07 %2);}"). arg(newsPanelWidget_->palette().background().color().name()). arg(qApp->palette().color(QPalette::Dark).name())); break; default: newsTabWidgetSplitter_->setOrientation(Qt::Vertical); newsTabWidgetSplitter_->setStyleSheet( QString("QSplitter::handle {background: %1; margin-top: 1px; margin-bottom: 1px;}"). arg(qApp->palette().color(QPalette::Dark).name())); } } /** @brief Close tab while press X-button *----------------------------------------------------------------------------*/ void NewsTabWidget::slotTabClose() { mainWindow_->slotCloseTab(mainWindow_->stackedWidget_->indexOf(this)); } /** @brief Display browser open page title on tab *----------------------------------------------------------------------------*/ void NewsTabWidget::webTitleChanged(QString title) { if ((type_ == TabTypeWeb) && !title.isEmpty()) { setTextTab(title); } } /** @brief Open news in new tab *----------------------------------------------------------------------------*/ void NewsTabWidget::openNewsNewTab() { if (type_ >= TabTypeWeb) return; QList indexes = newsView_->selectionModel()->selectedRows(0); int cnt = indexes.count(); if (cnt == 0) return; for (int i = cnt-1; i >= 0; --i) { QModelIndex index = indexes.at(i); int row = index.row(); if (mainWindow_->markNewsReadOn_ && mainWindow_->markCurNewsRead_) slotSetItemRead(index, 1); QUrl url = QUrl::fromEncoded(getLinkNews(row).toUtf8()); if (url.host().isEmpty()) { int feedId = newsModel_->dataField(row, "feedId").toInt(); QModelIndex feedIndex = feedsModel_->indexById(feedId); QUrl hostUrl = feedsModel_->dataField(feedIndex, "htmlUrl").toString(); url.setScheme(hostUrl.scheme()); url.setHost(hostUrl.host()); } mainWindow_->createWebTab(url); } } /** @brief Open link *----------------------------------------------------------------------------*/ void NewsTabWidget::openLink() { slotLinkClicked(linkUrl_); } /** @brief Open link in new tab *----------------------------------------------------------------------------*/ void NewsTabWidget::openLinkInNewTab() { int externalBrowserOn_ = mainWindow_->externalBrowserOn_; mainWindow_->externalBrowserOn_ = 0; if (QApplication::keyboardModifiers() == Qt::NoModifier) { webView_->buttonClick_ = MIDDLE_BUTTON; } else { webView_->buttonClick_ = MIDDLE_BUTTON_MOD; } slotLinkClicked(linkUrl_); mainWindow_->externalBrowserOn_ = externalBrowserOn_; } /** @brief Open link in browser *----------------------------------------------------------------------------*/ bool NewsTabWidget::openUrl(const QUrl &url) { if (!url.isValid()) return false; if (url.scheme() == QLatin1String("mailto")) return QDesktopServices::openUrl(url); mainWindow_->isOpeningLink_ = true; if ((mainWindow_->externalBrowserOn_ == 2) || (mainWindow_->externalBrowserOn_ == -1)) { #if defined(Q_OS_WIN) quintptr returnValue = (quintptr)ShellExecute( 0, 0, (wchar_t *)QString::fromUtf8(mainWindow_->externalBrowser_.toUtf8()).utf16(), (wchar_t *)QString::fromUtf8(url.toEncoded().constData()).utf16(), 0, SW_SHOWNORMAL); if (returnValue > 32) return true; #elif defined(Q_OS_MAC) return (QProcess::startDetached("open", QStringList() << "-a" << QString::fromUtf8(mainWindow_->externalBrowser_.toUtf8()) << QString::fromUtf8(url.toEncoded().constData()))); #else return (QProcess::startDetached(QString::fromUtf8(mainWindow_->externalBrowser_.toUtf8()) + QLatin1Char(' ') + QString::fromUtf8(url.toEncoded().constData()))); #endif } return QDesktopServices::openUrl(url); } //---------------------------------------------------------------------------- void NewsTabWidget::slotFindText(const QString &text) { QString objectName = findText_->findGroup_->checkedAction()->objectName(); if (objectName == "findInBrowserAct") { webView_->findText("", QWebPage::HighlightAllOccurrences); webView_->findText(text, QWebPage::HighlightAllOccurrences); } else { int newsId = newsModel_->dataField(newsView_->currentIndex().row(), "id").toInt(); QString filterStr; switch (type_) { case TabTypeUnread: case TabTypeStar: case TabTypeDel: case TabTypeLabel: filterStr = categoryFilterStr_; break; default: filterStr = mainWindow_->newsFilterStr; } if (!text.isEmpty()) { QString findText = text; findText = findText.replace("'", "''").toUpper(); if (objectName == "findTitleAct") { filterStr.append( QString(" AND UPPER(title) LIKE '%%1%'").arg(findText)); } else if (objectName == "findAuthorAct") { filterStr.append( QString(" AND UPPER(author_name) LIKE '%%1%'").arg(findText)); } else if (objectName == "findCategoryAct") { filterStr.append( QString(" AND UPPER(category) LIKE '%%1%'").arg(findText)); } else if (objectName == "findContentAct") { filterStr.append( QString(" AND (UPPER(content) LIKE '%%1%' OR UPPER(description) LIKE '%%1%')"). arg(findText)); } else if (objectName == "findLinkAct") { filterStr.append( QString(" AND link_href LIKE '%%1%'"). arg(findText)); } else { filterStr.append( QString(" AND (UPPER(title) LIKE '%%1%' OR UPPER(author_name) LIKE '%%1%' " "OR UPPER(category) LIKE '%%1%' OR UPPER(content) LIKE '%%1%' " "OR UPPER(description) LIKE '%%1%')"). arg(findText)); } } newsModel_->setFilter(filterStr); QModelIndex index = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(index, Qt::EditRole, newsId); if (indexList.count()) { int newsRow = indexList.first().row(); newsView_->setCurrentIndex(newsModel_->index(newsRow, newsModel_->fieldIndex("title"))); } else { currentNewsIdOld = newsId; hideWebContent(); } } } //---------------------------------------------------------------------------- void NewsTabWidget::slotSelectFind() { webView_->findText("", QWebPage::HighlightAllOccurrences); slotFindText(findText_->text()); } //---------------------------------------------------------------------------- void NewsTabWidget::showContextWebPage(const QPoint &p) { QMenu menu; QMenu *pageMenu = webView_->page()->createStandardContextMenu(); if (pageMenu) { menu.addActions(pageMenu->actions()); webView_->page()->action(QWebPage::OpenLink)->setText(tr("Open Link")); webView_->page()->action(QWebPage::OpenLinkInNewWindow)->setText(tr("Open in New Tab")); webView_->page()->action(QWebPage::DownloadLinkToDisk)->setText(tr("Save Link...")); webView_->page()->action(QWebPage::DownloadImageToDisk)->setText(tr("Save Image...")); webView_->page()->action(QWebPage::CopyLinkToClipboard)->setText(tr("Copy Link")); webView_->page()->action(QWebPage::Copy)->setText(tr("Copy")); webView_->page()->action(QWebPage::Back)->setText(tr("Go Back")); webView_->page()->action(QWebPage::Forward)->setText(tr("Go Forward")); webView_->page()->action(QWebPage::Stop)->setText(tr("Stop")); webView_->page()->action(QWebPage::Reload)->setText(tr("Reload")); webView_->page()->action(QWebPage::CopyImageToClipboard)->setText(tr("Copy Image")); #if QT_VERSION >= 0x040800 webView_->page()->action(QWebPage::CopyImageUrlToClipboard)->setText(tr("Copy Image Address")); #endif const QWebHitTestResult &hitTest = webView_->page()->mainFrame()->hitTestContent(p); if (!hitTest.linkUrl().isEmpty() && hitTest.linkUrl().scheme() != "javascript") { linkUrl_ = hitTest.linkUrl(); if (mainWindow_->externalBrowserOn_ <= 0) { menu.addSeparator(); menu.addAction(urlExternalBrowserAct_); } } else if (pageMenu->actions().indexOf(webView_->pageAction(QWebPage::Reload)) >= 0) { if (webView_->title() == "news_descriptions") { webView_->pageAction(QWebPage::Reload)->setVisible(false); } else { webView_->pageAction(QWebPage::Reload)->setVisible(true); menu.addSeparator(); } menu.addAction(mainWindow_->autoLoadImagesToggle_); menu.addSeparator(); menu.addAction(mainWindow_->printAct_); menu.addAction(mainWindow_->printPreviewAct_); menu.addSeparator(); menu.addAction(mainWindow_->savePageAsAct_); } else if (hitTest.isContentEditable()) { for (int i = 0; i < menu.actions().count(); i++) { if ((i <= 1) && (menu.actions().at(i)->text() == "Direction")) { menu.actions().at(i)->setVisible(false); break; } } menu.insertSeparator(menu.actions().at(0)); menu.insertAction(menu.actions().at(0), webView_->pageAction(QWebPage::Redo)); menu.insertAction(menu.actions().at(0), webView_->pageAction(QWebPage::Undo)); } if (!hitTest.isContentEditable() && !hitTest.isContentSelected()) { menu.addSeparator(); menu.addAction(mainWindow_->adBlockIcon()->menuAction()); } menu.exec(webView_->mapToGlobal(p)); } } /** @brief Open link in external browser *----------------------------------------------------------------------------*/ void NewsTabWidget::openUrlInExternalBrowser() { if (linkUrl_.scheme() == QLatin1String("mailto")) { QDesktopServices::openUrl(linkUrl_); return; } if (type_ != TabTypeWeb) { if (linkUrl_.host().isEmpty() && newsView_->currentIndex().isValid()) { int row = newsView_->currentIndex().row(); int feedId = newsModel_->dataField(row, "feedId").toInt(); QModelIndex feedIndex = feedsModel_->indexById(feedId); QUrl hostUrl = feedsModel_->dataField(feedIndex, "htmlUrl").toString(); linkUrl_.setScheme(hostUrl.scheme()); linkUrl_.setHost(hostUrl.host()); } } openUrl(linkUrl_); } void NewsTabWidget::setWebToolbarVisible(bool show, bool checked) { if (!checked) webToolbarShow_ = show; webControlPanel_->setVisible(webToolbarShow_ & mainWindow_->browserToolbarToggle_->isChecked()); } /** @brief Set label for selected news *----------------------------------------------------------------------------*/ void NewsTabWidget::setLabelNews(int labelId) { if (type_ >= TabTypeWeb) return; QList indexes = newsView_->selectionModel()->selectedRows( newsModel_->fieldIndex("label")); int cnt = indexes.count(); if (cnt == 0) return; if (cnt == 1) { QModelIndex index = indexes.at(0); QString strIdLabels = index.data(Qt::EditRole).toString(); if (!strIdLabels.contains(QString(",%1,").arg(labelId))) { if (strIdLabels.isEmpty()) strIdLabels.append(","); strIdLabels.append(QString::number(labelId)); strIdLabels.append(","); } else { strIdLabels.replace(QString(",%1,").arg(labelId), ","); } newsModel_->setData(index, strIdLabels); int newsId = newsModel_->dataField(index.row(), "id").toInt(); if ((newsId == currentNewsIdOld) && (webView_->title() == "news_descriptions")) { QWebFrame *frame = webView_->page()->mainFrame(); QWebElement document = frame->documentElement(); QWebElement element = document.findFirst(QString("table[id=labels%1]").arg(newsId)); if (!element.isNull()) { webView_->settings()->setAttribute(QWebSettings::AutoLoadImages,true); element.removeAllChildren(); QString labelsString = getHtmlLabels(index.row()); element.appendInside(labelsString); webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, autoLoadImages_); } } QSqlQuery q; q.exec(QString("UPDATE news SET label='%1' WHERE id=='%2'"). arg(strIdLabels).arg(newsId)); if (newsId != currentNewsIdOld) { newsView_->selectionModel()->select( index, QItemSelectionModel::Deselect|QItemSelectionModel::Rows); } } else { bool setLabel = false; for (int i = cnt-1; i >= 0; --i) { QModelIndex index = indexes.at(i); QString strIdLabels = index.data(Qt::EditRole).toString(); if (!strIdLabels.contains(QString(",%1,").arg(labelId))) { setLabel = true; break; } } db_.transaction(); for (int i = cnt-1; i >= 0; --i) { QModelIndex index = indexes.at(i); QString strIdLabels = index.data(Qt::EditRole).toString(); if (setLabel) { if (strIdLabels.contains(QString(",%1,").arg(labelId))) continue; if (strIdLabels.isEmpty()) strIdLabels.append(","); strIdLabels.append(QString::number(labelId)); strIdLabels.append(","); } else { strIdLabels.replace(QString(",%1,").arg(labelId), ","); } newsModel_->setData(index, strIdLabels); int newsId = newsModel_->dataField(index.row(), "id").toInt(); if ((newsId == currentNewsIdOld) && (webView_->title() == "news_descriptions")) { QWebFrame *frame = webView_->page()->mainFrame(); QWebElement document = frame->documentElement(); QWebElement element = document.findFirst(QString("table[id=labels%1]").arg(newsId)); if (!element.isNull()) { element.removeAllChildren(); QString labelsString = getHtmlLabels(index.row()); element.appendInside(labelsString); } } QSqlQuery q; q.exec(QString("UPDATE news SET label='%1' WHERE id=='%2'"). arg(strIdLabels).arg(newsId)); if (newsId != currentNewsIdOld) { newsView_->selectionModel()->select( index, QItemSelectionModel::Deselect|QItemSelectionModel::Rows); } } db_.commit(); } newsView_->viewport()->update(); mainWindow_->recountCategoryCounts(); } void NewsTabWidget::slotNewslLabelClicked(QModelIndex index) { if (!newsView_->selectionModel()->isSelected(index)) { newsView_->selectionModel()->clearSelection(); newsView_->selectionModel()->select( index, QItemSelectionModel::Select|QItemSelectionModel::Rows); } mainWindow_->newsLabelMenu_->popup( newsView_->viewport()->mapToGlobal(newsView_->visualRect(index).bottomLeft())); } void NewsTabWidget::showLabelsMenu() { if (type_ >= TabTypeWeb) return; if (!newsView_->currentIndex().isValid()) return; for (int i = newsHeader_->count()-1; i >= 0; i--) { int lIdx = newsHeader_->logicalIndex(i); if (!newsHeader_->isSectionHidden(lIdx)) { int row = newsView_->currentIndex().row(); slotNewslLabelClicked(newsModel_->index(row, lIdx)); break; } } } void NewsTabWidget::reduceNewsList() { if (type_ >= TabTypeWeb) return; QList sizes = newsTabWidgetSplitter_->sizes(); sizes.insert(0, sizes.takeAt(0) - RESIZESTEP); newsTabWidgetSplitter_->setSizes(sizes); } void NewsTabWidget::increaseNewsList() { if (type_ >= TabTypeWeb) return; QList sizes = newsTabWidgetSplitter_->sizes(); sizes.insert(0, sizes.takeAt(0) + RESIZESTEP); newsTabWidgetSplitter_->setSizes(sizes); } /** @brief Search unread news * @param next search condition: true - search next, else - previous *----------------------------------------------------------------------------*/ int NewsTabWidget::findUnreadNews(bool next) { int newsRow = -1; int newsRowCur = newsView_->currentIndex().row(); QModelIndex index; QModelIndexList indexList; if (next) { index = newsModel_->index(newsRowCur+1, newsModel_->fieldIndex("read")); indexList = newsModel_->match(index, Qt::EditRole, 0); if (indexList.isEmpty()) { index = newsModel_->index(0, newsModel_->fieldIndex("read")); indexList = newsModel_->match(index, Qt::EditRole, 0); } } else { index = newsModel_->index(newsRowCur, newsModel_->fieldIndex("read")); indexList = newsModel_->match(index, Qt::EditRole, 0, -1); } if (!indexList.isEmpty()) newsRow = indexList.last().row(); return newsRow; } /** @brief Set tab title *----------------------------------------------------------------------------*/ void NewsTabWidget::setTextTab(const QString &text) { int padding = 15; if (closeButton_->isHidden()) padding = 0; QString textTab = newsTextTitle_->fontMetrics().elidedText( text, Qt::ElideRight, newsTitleLabel_->width() - 16 - 3 - padding); newsTextTitle_->setText(textTab); newsTitleLabel_->setToolTip(text); emit signalSetTextTab(text, this); } /** @brief Share news *----------------------------------------------------------------------------*/ void NewsTabWidget::slotShareNews(QAction *action) { QList indexes; int cnt = 0; if (type_ < TabTypeWeb) { indexes = newsView_->selectionModel()->selectedRows(0); cnt = indexes.count(); } else if (type_ == TabTypeWeb) { cnt = 1; } if (cnt == 0) return; for (int i = cnt-1; i >= 0; --i) { QString title; QString linkString; QString content; if (type_ < TabTypeWeb) { title = newsModel_->dataField(indexes.at(i).row(), "title").toString(); linkString = getLinkNews(indexes.at(i).row()); content = newsModel_->dataField(indexes.at(i).row(), "content").toString(); QString description = newsModel_->dataField(indexes.at(i).row(), "description").toString(); if (content.isEmpty() || (description.length() > content.length())) { content = description; } QTextDocumentFragment textDocument = QTextDocumentFragment::fromHtml(content); content = textDocument.toPlainText(); } else { title = webView_->title(); linkString = webView_->url().toString(); content = webView_->page()->mainFrame()->toPlainText(); } content = content.replace("\n", "%0A"); content = content.replace("\"", "%22"); QUrl url; if (action->objectName() == "emailShareAct") { url.setUrl("mailto:"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("subject", title); urlQuery.addQueryItem("body", linkString); url.setQuery(urlQuery); #else url.addQueryItem("subject", title); url.addQueryItem("body", linkString + "%0A%0A" + content); #endif openUrl(url); } else { if (action->objectName() == "evernoteShareAct") { url.setUrl("https://www.evernote.com/clip.action"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("url", linkString); urlQuery.addQueryItem("title", title); url.setQuery(urlQuery); #else url.addQueryItem("url", linkString); url.addQueryItem("title", title); #endif } else if (action->objectName() == "gplusShareAct") { url.setUrl("https://plus.google.com/share"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("url", linkString); url.setQuery(urlQuery); #else url.addQueryItem("url", linkString); #endif } else if (action->objectName() == "facebookShareAct") { url.setUrl("https://www.facebook.com/sharer.php"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("u", linkString); urlQuery.addQueryItem("t", title); url.setQuery(urlQuery); #else url.addQueryItem("u", linkString); url.addQueryItem("t", title); #endif } else if (action->objectName() == "livejournalShareAct") { url.setUrl("http://www.livejournal.com/update.bml"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("event", linkString); urlQuery.addQueryItem("subject", title); url.setQuery(urlQuery); #else url.addQueryItem("event", linkString); url.addQueryItem("subject", title); #endif } else if (action->objectName() == "pocketShareAct") { url.setUrl("https://getpocket.com/save"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("url", linkString); urlQuery.addQueryItem("title", title); url.setQuery(urlQuery); #else url.addQueryItem("url", linkString); url.addQueryItem("title", title); #endif } else if (action->objectName() == "twitterShareAct") { url.setUrl("https://twitter.com/share"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("url", linkString); urlQuery.addQueryItem("text", title); url.setQuery(urlQuery); #else url.addQueryItem("url", linkString); url.addQueryItem("text", title); #endif } else if (action->objectName() == "vkShareAct") { url.setUrl("https://vk.com/share.php"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("url", linkString); urlQuery.addQueryItem("title", title); urlQuery.addQueryItem("description", ""); urlQuery.addQueryItem("image", ""); url.setQuery(urlQuery); #else url.addQueryItem("url", linkString); url.addQueryItem("title", title); url.addQueryItem("description", ""); url.addQueryItem("image", ""); #endif } else if (action->objectName() == "linkedinShareAct") { url.setUrl("https://www.linkedin.com/shareArticle?mini=true"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("url", linkString); urlQuery.addQueryItem("title", title); url.setQuery(urlQuery); #else url.addQueryItem("url", linkString); url.addQueryItem("title", title); #endif } else if (action->objectName() == "bloggerShareAct") { url.setUrl("https://www.blogger.com/blog_this.pyra?t"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("u", linkString); urlQuery.addQueryItem("n", title); url.setQuery(urlQuery); #else url.addQueryItem("u", linkString); url.addQueryItem("n", title); #endif } else if (action->objectName() == "printfriendlyShareAct") { url.setUrl("https://www.printfriendly.com/print"); #ifdef HAVE_QT5 QUrlQuery urlQuery; urlQuery.addQueryItem("url", linkString); url.setQuery(urlQuery); #else url.addQueryItem("url", linkString); #endif } if (mainWindow_->externalBrowserOn_ <= 0) { mainWindow_->openNewsTab_ = NEW_TAB_FOREGROUND; mainWindow_->createWebTab(url); } else openUrl(url); } } } //----------------------------------------------------------------------------- int NewsTabWidget::getUnreadCount(QString countString) { if (countString.isEmpty()) return 0; countString.remove(QzRegExp("[()]")); switch (type_) { case TabTypeUnread: return countString.toInt(); case TabTypeStar: case TabTypeLabel: return countString.section("/", 0, 0).toInt(); default: return 0; } } QString NewsTabWidget::getLinkNews(int row) { QString linkString = newsModel_->dataField(row, "link_href").toString(); if (linkString.isEmpty()) linkString = newsModel_->dataField(row, "link_alternate").toString(); return linkString.simplified(); } void NewsTabWidget::savePageAsDescript() { if (type_ >= TabTypeWeb) return; QModelIndex curIndex = newsView_->currentIndex(); if (!curIndex.isValid()) return; QString html = webView_->page()->currentFrame()->toHtml().replace("'", "''"); newsModel_->setData( newsModel_->index(curIndex.row(), newsModel_->fieldIndex("content")), html); int newsId = newsModel_->dataField(curIndex.row(), "id").toInt(); QString qStr = QString("UPDATE news SET content='%1' WHERE id=='%2'"). arg(html).arg(newsId); mainApp->sqlQueryExec(qStr); } QString NewsTabWidget::getHtmlLabels(int row) { QStringList strLabelIdList = newsModel_->dataField(row, "label").toString(). split(",", QString::SkipEmptyParts); QString labelsString; QList labelListItems = mainWindow_->categoriesTree_->getLabelListItems(); foreach (QTreeWidgetItem *item, labelListItems) { if (strLabelIdList.contains(item->text(2))) { strLabelIdList.removeOne(item->text(2)); QByteArray byteArray = item->data(0, CategoriesTreeWidget::ImageRole).toByteArray(); labelsString.append(QString(""); labelsString.append("" % item->text(0)); if (strLabelIdList.count()) labelsString.append(","); labelsString.append(""); } } return labelsString; } void NewsTabWidget::actionNewspaper(QUrl url) { QString newsId = url.fragment(); QModelIndex startIndex = newsModel_->index(0, newsModel_->fieldIndex("id")); QModelIndexList indexList = newsModel_->match(startIndex, Qt::EditRole, newsId); if (!indexList.isEmpty()) { QString iconStr; if (url.host() == "read.action.ui") { QString titleStyle; if (newsModel_->dataField(indexList.first().row(), "read").toInt() == 0) { slotSetItemRead(indexList.first(), 1); iconStr = "qrc:/images/bulletRead"; titleStyle = "read"; } else { slotSetItemRead(indexList.first(), 0); iconStr = "qrc:/images/bulletUnread"; titleStyle = "unread"; } QWebElement document = webView_->page()->mainFrame()->documentElement(); QWebElement newsItem = document.findFirst(QString("div[id=newsItem%1]").arg(newsId)); if (!newsItem.isNull()) { webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, true); QWebElement element = newsItem.findFirst(QString("img[id=readAction%1]").arg(newsId)); if (!element.isNull()) element.setAttribute("src", iconStr); element = newsItem.findFirst(QString("a[id=title%1]").arg(newsId)); if (!element.isNull()) element.setAttribute("class", titleStyle); webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, autoLoadImages_); } } else if (url.host() == "star.action.ui") { int row = indexList.first().row(); if (newsModel_->dataField(row, "starred").toInt() == 0) { slotSetItemStar(newsModel_->index(row, newsModel_->fieldIndex("starred")), 1); iconStr = "qrc:/images/starOn"; } else { slotSetItemStar(newsModel_->index(row, newsModel_->fieldIndex("starred")), 0); iconStr = "qrc:/images/starOff"; } QWebElement document = webView_->page()->mainFrame()->documentElement(); QWebElement newsItem = document.findFirst(QString("div[id=newsItem%1]").arg(newsId)); if (!newsItem.isNull()) { QWebElement element = newsItem.findFirst(QString("img[id=starAction%1]").arg(newsId)); if (!element.isNull()) { webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, true); element.setAttribute("src", iconStr); webView_->settings()->setAttribute(QWebSettings::AutoLoadImages, autoLoadImages_); } } } else if (url.host() == "labels.menu.ui") { newsView_->selectionModel()->clearSelection(); newsView_->selectionModel()->select( indexList.first(), QItemSelectionModel::Select|QItemSelectionModel::Rows); currentNewsIdOld = newsId.toInt(); mainWindow_->newsLabelMenu_->popup(QCursor::pos()); } else if (url.host() == "share.menu.ui") { newsView_->selectionModel()->clearSelection(); newsView_->selectionModel()->select( indexList.first(), QItemSelectionModel::Select|QItemSelectionModel::Rows); currentNewsIdOld = newsId.toInt(); mainWindow_->shareMenu_->popup(QCursor::pos()); } else if (url.host() == "open.browser.ui") { QUrl url = QUrl::fromEncoded(getLinkNews(indexList.first().row()).toUtf8()); if (url.host().isEmpty()) { QString feedId = newsModel_->dataField(indexList.first().row(), "feedId").toString(); QModelIndex feedIndex = feedsModel_->indexById(feedId.toInt()); QUrl hostUrl = feedsModel_->dataField(feedIndex, "htmlUrl").toString(); url.setScheme(hostUrl.scheme()); url.setHost(hostUrl.host()); } openUrl(url); } else if (url.host() == "delete.action.ui") { newsView_->selectionModel()->clearSelection(); newsView_->selectionModel()->select( indexList.first(), QItemSelectionModel::Select|QItemSelectionModel::Rows); deleteNews(); QWebElement document = webView_->page()->mainFrame()->documentElement(); QWebElement newsItem = document.findFirst(QString("div[id=newsItem%1]").arg(newsId)); if (!newsItem.isNull()) { newsItem.removeFromDocument(); } } } } void NewsTabWidget::handleMouseClick(QModelIndex index, Qt::MouseButton button, bool bDoubleClick/*=false*/) { QModelIndex feedIndex = feedsModel_->indexById(feedId_); ENewsClickAction::Type singleClickAction = (ENewsClickAction::Type)feedsModel_->dataField(feedIndex, "SingleClickAction").toInt(); ENewsClickAction::Type doubleClickAction = (ENewsClickAction::Type)feedsModel_->dataField(feedIndex, "DoubleClickAction").toInt(); ENewsClickAction::Type middleClickAction = (ENewsClickAction::Type)feedsModel_->dataField(feedIndex, "MiddleClickAction").toInt(); singleClickAction = (singleClickAction == ENewsClickAction::NCA_Default ? mainWindow_->newsSingleClickAction : singleClickAction); doubleClickAction = (doubleClickAction == ENewsClickAction::NCA_Default ? mainWindow_->newsDoubleClickAction : doubleClickAction); middleClickAction = (middleClickAction == ENewsClickAction::NCA_Default ? mainWindow_->newsMiddleClickAction : middleClickAction); if (button == Qt::LeftButton && !bDoubleClick) { if (singleClickAction != ENewsClickAction::NCA_Nothing && !timerMouseClick.isActive()) { // We do not know if this click, is the first click of a double click, so we don't want to do anything disruptive to the UI, // until we know one way or the other - this means some single-click settings are safe to execute immediately, // and some have to be delayed to rule-out a double-click (e.g. immediately showing news description is safe, // but opening a new tab will have to be delayed) bool bDelayAction = false; if (singleClickAction != doubleClickAction && doubleClickAction != ENewsClickAction::NCA_Nothing) { bDelayAction = true; if (singleClickAction == ENewsClickAction::NCA_Description || singleClickAction == ENewsClickAction::NCA_WebPage) { bDelayAction = false; } } if (bDelayAction) { pendingClickIndex = index; timerMouseClick.start(400); } else { performNewsClickAction(index, singleClickAction); } } } else if (button == Qt::LeftButton && bDoubleClick) { timerMouseClick.stop(); if (doubleClickAction != ENewsClickAction::NCA_Nothing) { performNewsClickAction(index, doubleClickAction); } } else if (button == Qt::MiddleButton) { if (QApplication::keyboardModifiers() == Qt::NoModifier) { if (middleClickAction != ENewsClickAction::NCA_Nothing) { performNewsClickAction(index, middleClickAction); } } else if (QApplication::keyboardModifiers() == Qt::AltModifier) { performNewsClickAction(index, ENewsClickAction::NCA_ExternalBrowser); } else { performNewsClickAction(index, ENewsClickAction::NCA_WebPageBkgTab); } } } void NewsTabWidget::slotMouseClickTimeout() { if (pendingClickIndex.isValid()) { QModelIndex feedIndex = feedsModel_->indexById(feedId_); ENewsClickAction::Type singleClickAction = (ENewsClickAction::Type)feedsModel_->dataField(feedIndex, "SingleClickAction").toInt(); singleClickAction = (singleClickAction == ENewsClickAction::NCA_Default ? mainWindow_->newsSingleClickAction : singleClickAction); performNewsClickAction(pendingClickIndex, singleClickAction); } } void NewsTabWidget::performNewsClickAction(QModelIndex index, ENewsClickAction::Type action) { if (index.isValid()) { switch (action) { case ENewsClickAction::NCA_Description: { slotNewsViewSelected(index, false, false); updateWebView_Description(index); break; } case ENewsClickAction::NCA_DescriptionNewTab: case ENewsClickAction::NCA_DescriptionBkgTab: { slotNewsViewSelected(index, false, false); bool bForegroundTab = action == ENewsClickAction::NCA_DescriptionNewTab; QString htmlString = ""; QUrl url; generateDescriptionHtml(index, htmlString, url); slotLinkClicked(url, bForegroundTab, !bForegroundTab, htmlString); break; } case ENewsClickAction::NCA_WebPage: case ENewsClickAction::NCA_ExternalBrowser: { bool bExternalLink = action == ENewsClickAction::NCA_ExternalBrowser; slotNewsViewSelected(index, false, false); updateWebView_Link(index, bExternalLink); break; } case ENewsClickAction::NCA_WebPageNewTab: case ENewsClickAction::NCA_WebPageBkgTab: { slotNewsViewSelected(index, false, false); bool bForegroundTab = action == ENewsClickAction::NCA_WebPageNewTab; QUrl url = QUrl::fromEncoded(getLinkNews(index.row()).toUtf8()); slotLinkClicked(url, bForegroundTab, !bForegroundTab); break; } default: { break; } } mainWindow_->statusBar()->showMessage(linkNewsString_, 3000); } } quiterss-0.18.3/src/newstabwidget.h000066400000000000000000000156601265173051100173020ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NEWSTABWIDGET_H #define NEWSTABWIDGET_H #ifdef HAVE_QT5 #include #else #include #endif #include #include #include "feedsproxymodel.h" #include "feedsmodel.h" #include "feedsview.h" #include "findtext.h" #include "lineedit.h" #include "locationbar.h" #include "newsheader.h" #include "newsmodel.h" #include "newsview.h" #include "webview.h" #include "optionsdialog.h" class MainWindow; #define TOP_POSITION 0 #define BOTTOM_POSITION 1 #define RIGHT_POSITION 2 #define LEFT_POSITION 3 #define RESIZESTEP 25 // News list/browser size step class NewsTabWidget : public QWidget { Q_OBJECT public: enum TabType { TabTypeFeed, TabTypeUnread, TabTypeStar, TabTypeDel, TabTypeLabel, TabTypeWeb, TabTypeDownloads }; enum RefreshNewspaper { RefreshAll, RefreshInsert, RefreshWithPos }; explicit NewsTabWidget(QWidget *parent, TabType type, int feedId = -1, int feedParId = -1); ~NewsTabWidget(); void disconnectObjects(); void retranslateStrings(); void setSettings(bool init = true, bool newTab = true); void setNewsLayout(); void setBrowserPosition(); void markNewsRead(); void markAllNewsRead(); void markNewsStar(); void setLabelNews(int labelId); void deleteNews(); void deleteAllNewsList(); void restoreNews(); void slotCopyLinkNews(); void showLabelsMenu(); void savePageAsDescript(); bool openUrl(const QUrl &url); void openInBrowserNews(); void openInExternalBrowserNews(); void openNewsNewTab(); void updateWebView(QModelIndex index); void updateWebView_Link(QModelIndex index, bool bExternalLink=false, QString overrideURL=""); void updateWebView_Description(QModelIndex index); void generateDescriptionHtml(QModelIndex index, QString& outHtml, QUrl& outURL); void loadNewspaper(int refresh = RefreshAll); void hideWebContent(); QString getLinkNews(int row); void setHtmlWebView(const QString &html, const QUrl &baseUrl=QUrl()); void reduceNewsList(); void increaseNewsList(); int findUnreadNews(bool next); void setTextTab(const QString &text); void slotShareNews(QAction *action); /*! \brief Convert \a countString to unreadCount depending on \a type_ * \param countString from categories tree * \return unreadCount for displaying in status */ int getUnreadCount(QString countString); TabType type_; int feedId_; int feedParId_; int currentNewsIdOld; bool autoLoadImages_; int labelId_; QString categoryFilterStr_; FindTextContent *findText_; NewsModel *newsModel_; NewsView *newsView_; NewsHeader *newsHeader_; QToolBar *newsToolBar_; QSplitter *newsTabWidgetSplitter_; WebView *webView_; QToolBar *webToolBar_; LocationBar *locationBar_; QWidget *webControlPanel_; QLabel *newsIconTitle_; QMovie *newsIconMovie_; QLabel *newsTextTitle_; QWidget *newsTitleLabel_; QToolButton *closeButton_; QAction *separatorRAct_; public slots: void setAutoLoadImages(bool apply = true); void slotNewsViewClicked(QModelIndex index); void slotNewsViewSelected(QModelIndex index, bool clicked=false, bool bUpdateWebView=true); void slotNewsViewDoubleClicked(QModelIndex index); void slotNewsMiddleClicked(QModelIndex index); void slotNewsUpPressed(QModelIndex index=QModelIndex()); void slotNewsDownPressed(QModelIndex index=QModelIndex()); void slotNewsHomePressed(QModelIndex index=QModelIndex()); void slotNewsEndPressed(QModelIndex index=QModelIndex()); void slotNewsPageUpPressed(QModelIndex index=QModelIndex()); void slotNewsPageDownPressed(QModelIndex index=QModelIndex()); void slotSort(int column, int order); signals: void signalSetHtmlWebView(const QString &html = "", const QUrl &baseUrl = QUrl()); void signalSetTextTab(const QString &text, NewsTabWidget *widget); void loadProgress(int); private slots: void showContextMenuNews(const QPoint &pos); void slotSetItemRead(QModelIndex index, int read); void slotSetItemStar(QModelIndex index, int starred); void slotMarkReadTimeout(); void slotSetHtmlWebView(const QString &html, const QUrl &baseUrl); void webHomePage(); void openPageInExternalBrowser(); void slotLinkClicked(QUrl url, bool bForceNewTab=false, bool bForceNewBkgTab=false, const QString &overrideHtml=""); void slotLinkHovered(const QString &link, const QString &str1="", const QString &str2=""); void slotSetValue(int value); void slotLoadStarted(); void slotLoadFinished(bool); void slotUrlEnter(); void slotUrlChanged(const QUrl &url); void showContextWebPage(const QPoint &p); void openUrlInExternalBrowser(); void slotTabClose(); void webTitleChanged(QString title); void openLink(); void openLinkInNewTab(); void slotFindText(const QString& text); void slotSelectFind(); void setWebToolbarVisible(bool show = true, bool checked = true); void slotNewslLabelClicked(QModelIndex index); void slotMouseClickTimeout(); private: void createNewsList(); void createWebWidget(); QString getHtmlLabels(int row); void actionNewspaper(QUrl url); void handleMouseClick(QModelIndex index, Qt::MouseButton button, bool bDoubleClick=false); void performNewsClickAction(QModelIndex index, ENewsClickAction::Type action); MainWindow *mainWindow_; QSqlDatabase db_; QWidget *newsWidget_; FeedsModel *feedsModel_; FeedsProxyModel *feedsProxyModel_; FeedsView *feedsView_; QFrame *lineWebWidget; QWidget *webWidget_; QProgressBar *webViewProgress_; QLabel *webViewProgressLabel_; QAction *webHomePageAct_; QAction *webExternalBrowserAct_; QAction *urlExternalBrowserAct_; QTimer *markNewsReadTimer_; int webDefaultFontSize_; int webDefaultFixedFontSize_; QUrl linkUrl_; QString linkNewsString_; QWidget *newsPanelWidget_; bool webToolbarShow_; QString newspaperHeadHtml_; QString newspaperHtml_; QString newspaperHtmlRtl_; QString htmlString_; QString htmlRtlString_; QString cssString_; QString audioPlayerHtml_; QString videoPlayerHtml_; QTimer timerMouseClick; QPersistentModelIndex pendingClickIndex; }; #endif // NEWSTABWIDGET_H quiterss-0.18.3/src/newsview/000077500000000000000000000000001265173051100161215ustar00rootroot00000000000000quiterss-0.18.3/src/newsview/newsheader.cpp000066400000000000000000000441601265173051100207570ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "newsheader.h" #include "mainapplication.h" #include "settings.h" NewsHeader::NewsHeader(NewsModel *model, QWidget *parent) : QHeaderView(Qt::Horizontal, parent) , model_(model) , move_(false) { setObjectName("newsHeader"); setContextMenuPolicy(Qt::CustomContextMenu); #ifdef HAVE_QT5 setSectionsMovable(true); #else setMovable(true); #endif setDefaultAlignment(Qt::AlignLeft|Qt::AlignVCenter); setMinimumSectionSize(22); setStretchLastSection(false); viewMenu_ = new QMenu(this); columnVisibleActGroup_ = new QActionGroup(this); columnVisibleActGroup_->setExclusive(false); connect(columnVisibleActGroup_, SIGNAL(triggered(QAction*)), this, SLOT(slotColumnVisible(QAction*))); buttonColumnView_ = new QPushButton(this); buttonColumnView_->setIcon(QIcon(":/images/images/column.png")); buttonColumnView_->setObjectName("buttonColumnView"); buttonColumnView_->setFlat(true); buttonColumnView_->setCursor(Qt::ArrowCursor); buttonColumnView_->setFocusPolicy(Qt::NoFocus); buttonColumnView_->setMaximumWidth(30); connect(buttonColumnView_, SIGNAL(clicked()), this, SLOT(slotButtonColumnView())); QHBoxLayout *buttonLayout = new QHBoxLayout(); buttonLayout->setMargin(0); buttonLayout->addWidget(buttonColumnView_, 0, Qt::AlignRight|Qt::AlignVCenter); setLayout(buttonLayout); connect(this, SIGNAL(sectionMoved(int,int,int)), SLOT(slotSectionMoved(int, int, int))); this->installEventFilter(this); } void NewsHeader::init() { if (count() == 0) return; for (int i = 0; i < count(); ++i) hideSection(i); showSection(model_->fieldIndex("feedId")); showSection(model_->fieldIndex("title")); showSection(model_->fieldIndex("published")); showSection(model_->fieldIndex("author_name")); showSection(model_->fieldIndex("read")); showSection(model_->fieldIndex("starred")); showSection(model_->fieldIndex("category")); for (int i = 0; i < count(); i++) { model_->setHeaderData(i, Qt::Horizontal, model_->headerData(i, Qt::Horizontal, Qt::DisplayRole), Qt::EditRole); } model_->setHeaderData(model_->fieldIndex("feedId"), Qt::Horizontal, "", Qt::DisplayRole); model_->setHeaderData(model_->fieldIndex("read"), Qt::Horizontal, "", Qt::DisplayRole); model_->setHeaderData(model_->fieldIndex("read"), Qt::Horizontal, QPixmap(":/images/readSection"), Qt::DecorationRole); model_->setHeaderData(model_->fieldIndex("starred"), Qt::Horizontal, "", Qt::DisplayRole); model_->setHeaderData(model_->fieldIndex("starred"), Qt::Horizontal, QPixmap(":/images/starSection"), Qt::DecorationRole); moveSection(visualIndex(model_->fieldIndex("starred")), 0); moveSection(visualIndex(model_->fieldIndex("read")), 1); moveSection(visualIndex(model_->fieldIndex("feedId")), 2); resizeSection(model_->fieldIndex("feedId"), 22); moveSection(visualIndex(model_->fieldIndex("title")), 3); moveSection(visualIndex(model_->fieldIndex("author_name")), 4); resizeSection(model_->fieldIndex("author_name"), 100); moveSection(visualIndex(model_->fieldIndex("category")), 5); resizeSection(model_->fieldIndex("title"), 200); resizeSection(model_->fieldIndex("starred"), 22); resizeSection(model_->fieldIndex("feedId"), 22); resizeSection(model_->fieldIndex("read"), 22); #ifdef HAVE_QT5 setSectionResizeMode(model_->fieldIndex("starred"), QHeaderView::Fixed); setSectionResizeMode(model_->fieldIndex("feedId"), QHeaderView::Fixed); setSectionResizeMode(model_->fieldIndex("read"), QHeaderView::Fixed); #else setResizeMode(model_->fieldIndex("starred"), QHeaderView::Fixed); setResizeMode(model_->fieldIndex("feedId"), QHeaderView::Fixed); setResizeMode(model_->fieldIndex("read"), QHeaderView::Fixed); #endif move_ = true; } void NewsHeader::createMenu() { QListIterator iter(columnVisibleActGroup_->actions()); while (iter.hasNext()) { QAction *action = iter.next(); delete action; } for (int i = 0; i < count(); i++) { int lIdx = logicalIndex(i); if ((lIdx == model_->fieldIndex("feedId")) || (lIdx == model_->fieldIndex("title")) || (lIdx == model_->fieldIndex("published")) || (lIdx == model_->fieldIndex("received")) || (lIdx == model_->fieldIndex("author_name")) || (lIdx == model_->fieldIndex("category")) || (lIdx == model_->fieldIndex("read")) || (lIdx == model_->fieldIndex("starred")) || (lIdx == model_->fieldIndex("label")) || (lIdx == model_->fieldIndex("rights")) || (lIdx == model_->fieldIndex("link_href"))) { QAction *action = columnVisibleActGroup_->addAction( model_->headerData(lIdx, Qt::Horizontal, Qt::EditRole).toString()); action->setData(lIdx); action->setCheckable(true); action->setChecked(!isSectionHidden(lIdx)); } } viewMenu_->addActions(columnVisibleActGroup_->actions()); } bool NewsHeader::eventFilter(QObject *obj, QEvent *event) { Q_UNUSED(obj) if (event->type() == QEvent::Resize) { if ((count() == 0) || !isVisible()) return false; if (buttonColumnView_->height() != height()) buttonColumnView_->setFixedHeight(height()); QResizeEvent *resizeEvent = static_cast(event); adjustAllColumnsWidths(resizeEvent->size().width()); event->ignore(); return true; } else if ((event->type() == QEvent::HoverMove) || (event->type() == QEvent::HoverEnter) || (event->type() == QEvent::HoverLeave)) { QHoverEvent *hoverEvent = static_cast(event); if (hoverEvent->pos().x() >= width() - buttonColumnView_->width()) { if ((event->type() == QEvent::HoverMove) && !(QApplication::mouseButtons() & Qt::LeftButton)) { QHoverEvent* pe = new QHoverEvent(QEvent::HoverLeave, hoverEvent->oldPos(), hoverEvent->pos()); QApplication::sendEvent(this, pe); } return true; } else { return false; } } else { return false; } } /*virtual*/ void NewsHeader::mousePressEvent(QMouseEvent *event) { QPoint nPos = event->pos(); nPos.setX(nPos.x() + 5); idxCol_ = visualIndex(logicalIndexAt(nPos)); posX_ = event->pos().x(); nPos = event->pos(); nPos.setX(nPos.x() - 5); QHeaderView::mousePressEvent(event); } /*virtual*/ void NewsHeader::mouseMoveEvent(QMouseEvent *event) { bool sizeMin = false; if ((event->buttons() & Qt::LeftButton) && cursor().shape() == Qt::SplitHCursor) { int oldWidth = width(); int newWidth = 0; for (int i = 0; i < count(); i++) newWidth += sectionSize(i); if (posX_ > event->pos().x()) sizeMin = true; if (!sizeMin) { if (event->pos().x() < oldWidth) { for (int i = count()-1; i >= 0; i--) { int lIdx = logicalIndex(i); if (!isSectionHidden(lIdx)) { if (!((model_->fieldIndex("read") == lIdx) || (model_->fieldIndex("starred") == lIdx) || (model_->fieldIndex("feedId") == lIdx))) { int sectionWidth = sectionSize(lIdx) + oldWidth - newWidth; if (sectionWidth > 40) { if (i >= idxCol_) { resizeSection(lIdx, sectionWidth); sizeMin = true; break; } } } } } } int tWidth = 0; for (int i = idxCol_; i < count(); i++) { if (!isSectionHidden(logicalIndex(i))) { tWidth += 40; } } if (event->pos().x()+tWidth > oldWidth) { sizeMin = false; } } else { int stopColFix = 0; for (int i = count()-1; i >= 0; i--) { int lIdx = logicalIndex(i); if (!isSectionHidden(lIdx)) { if (!((model_->fieldIndex("read") == lIdx) || (model_->fieldIndex("starred") == lIdx) || (model_->fieldIndex("feedId") == lIdx))) { stopColFix = i; break; } } } int sectionWidth = sectionSize(logicalIndex(stopColFix)) + oldWidth - newWidth; if ((sectionWidth > 40)) { if (!((model_->fieldIndex("read") == logicalIndex(idxCol_)) || (model_->fieldIndex("starred") == logicalIndex(idxCol_)) || (model_->fieldIndex("feedId") == logicalIndex(idxCol_))) || idxCol_ < stopColFix) { resizeSection(logicalIndex(stopColFix), sectionWidth); } else sizeMin = false; } } if (!sizeMin) { if (posX_ > event->pos().x()) posX_ = event->pos().x(); event->ignore(); return; } } if (posX_ > event->pos().x()) posX_ = event->pos().x(); QHeaderView::mouseMoveEvent(event); } /*virtual*/ void NewsHeader::mouseDoubleClickEvent(QMouseEvent*) { } void NewsHeader::adjustAllColumnsWidths(int newWidth) { bool minSize = false; int size = 0; QVector widthCol(count(), 0); static int idxColSize = count()-1; int tWidth = 0; for (int i = 0; i < count(); i++) tWidth += sectionSize(i); if (tWidth > newWidth) { minSize = true; size = tWidth - newWidth; int titleSectionSize = sectionSize(model_->fieldIndex("title")); if ((titleSectionSize - size) >= 40) { widthCol[visualIndex(model_->fieldIndex("title"))] = size; size = 0; } else { widthCol[visualIndex(model_->fieldIndex("title"))] = titleSectionSize - 40; size = size + 40 - titleSectionSize; } } else { size = newWidth - tWidth; widthCol[visualIndex(model_->fieldIndex("title"))] = size; size = 0; } int countCol = 0; bool sizeOne = false; while (size) { int lIdx = logicalIndex(idxColSize); if (!isSectionHidden(lIdx)) { if (!((model_->fieldIndex("read") == lIdx) || (model_->fieldIndex("starred") == lIdx) || (model_->fieldIndex("feedId") == lIdx) || (model_->fieldIndex("title") == lIdx))) { if (((sectionSize(lIdx) >= 40) && !minSize) || ((sectionSize(lIdx) - widthCol[idxColSize] > 40) && minSize)) { widthCol[idxColSize]++; size--; sizeOne = true; } } } if (idxColSize == 0) idxColSize = count()-1; else idxColSize--; if (++countCol == count()) { if (!sizeOne) break; sizeOne = false; countCol = 0; } } for (int i = count()-1; i >= 0; i--) { int lIdx = logicalIndex(i); if ((!isSectionHidden(lIdx) && (sectionSize(lIdx) >= 40)) || (model_->fieldIndex("title") == lIdx)) { if (!minSize) { resizeSection(lIdx, sectionSize(lIdx) + widthCol[i]); } else { resizeSection(lIdx, sectionSize(lIdx) - widthCol[i]); } } } } void NewsHeader::slotButtonColumnView() { viewMenu_->setFocus(); viewMenu_->show(); QPoint pPoint; pPoint.setX(mapToGlobal(QPoint(0,0)).x() + width() - viewMenu_->width() - 1); pPoint.setY(mapToGlobal(QPoint(0,0)).y() + height() + 1); viewMenu_->popup(pPoint); } void NewsHeader::slotColumnVisible(QAction *action) { int columnShowCount = 0; for (int i = 0; i < count(); i++) { if (!isSectionHidden(i)) columnShowCount++; } if ((columnShowCount == 1) && !action->isChecked()) { action->setChecked(true); return; } int idx = action->data().toInt(); setSectionHidden(idx, !isSectionHidden(idx)); if (!isSectionHidden(idx)) { if ((model_->fieldIndex("starred") == idx) || (model_->fieldIndex("read") == idx) || (model_->fieldIndex("feedId") == idx)) resizeSection(idx, 22); else resizeSection(idx, 60); } adjustAllColumnsWidths(size().width()+1); } void NewsHeader::slotSectionMoved(int lIdx, int oldVIdx, int newVIdx) { Q_UNUSED(oldVIdx) if (!move_) return; if ((model_->fieldIndex("read") == lIdx) || (model_->fieldIndex("starred") == lIdx) || (model_->fieldIndex("feedId") == lIdx)) { for (int i = count()-1; i >= 0; i--) { if (!isSectionHidden(logicalIndex(i))) { if (i == newVIdx) { resizeSection(lIdx, 45); break; } else { resizeSection(lIdx, 22); break; } } } adjustAllColumnsWidths(size().width()+1); } createMenu(); } void NewsHeader::retranslateStrings() { if (count() == 0) return; model_->setHeaderData(model_->fieldIndex("feedId"), Qt::Horizontal, tr("Icon Feed")); model_->setHeaderData(model_->fieldIndex("title"), Qt::Horizontal, tr("Title")); model_->setHeaderData(model_->fieldIndex("published"), Qt::Horizontal, tr("Published")); model_->setHeaderData(model_->fieldIndex("received"), Qt::Horizontal, tr("Received")); model_->setHeaderData(model_->fieldIndex("author_name"), Qt::Horizontal, tr("Author")); model_->setHeaderData(model_->fieldIndex("category"), Qt::Horizontal, tr("Category")); model_->setHeaderData(model_->fieldIndex("read"), Qt::Horizontal, tr("Read")); model_->setHeaderData(model_->fieldIndex("starred"), Qt::Horizontal, tr("Star")); model_->setHeaderData(model_->fieldIndex("label"), Qt::Horizontal, tr("Label")); model_->setHeaderData(model_->fieldIndex("rights"), Qt::Horizontal, tr("Feed Title")); model_->setHeaderData(model_->fieldIndex("link_href"), Qt::Horizontal, tr("Link")); createMenu(); model_->setHeaderData(model_->fieldIndex("feedId"), Qt::Horizontal, "", Qt::DisplayRole); model_->setHeaderData(model_->fieldIndex("read"), Qt::Horizontal, "", Qt::DisplayRole); model_->setHeaderData(model_->fieldIndex("read"), Qt::Horizontal, QPixmap(":/images/readSection"), Qt::DecorationRole); model_->setHeaderData(model_->fieldIndex("starred"), Qt::Horizontal, "", Qt::DisplayRole); model_->setHeaderData(model_->fieldIndex("starred"), Qt::Horizontal, QPixmap(":/images/starSection"), Qt::DecorationRole); } void NewsHeader::setColumns(const QModelIndex &indexFeed) { if (count() == 0) return; move_ = false; Settings settings; settings.beginGroup("NewsHeader"); QByteArray state = settings.value("state").toByteArray(); QString indexColumnsStr = settings.value("columns").toString(); if (indexColumnsStr.isEmpty()) { settings.setValue("state", saveState()); settings.setValue("columns", columnsList()); settings.setValue("sortBy", model_->fieldIndex("published")); settings.setValue("sortOrder", Qt::DescendingOrder); } else if (state != saveState()) { restoreState(state); } int sortBy = 0; int sortType = 0; MainWindow *mainWindow = mainApp->mainWindow(); indexColumnsStr = mainWindow->feedsModel_->dataField(indexFeed, "columns").toString(); if (!indexColumnsStr.isEmpty()) { QStringList indexColumnsList = indexColumnsStr.split(",", QString::SkipEmptyParts); if (indexColumnsList.count()) { for (int i = 0; i < count(); ++i) { bool show = indexColumnsList.contains(QString::number(logicalIndex(i))); setSectionHidden(logicalIndex(i),!show); } } for (int i = 0; i < indexColumnsList.count(); ++i) { QString indexStr = indexColumnsList.at(i); moveSection(visualIndex(indexStr.toInt()), i); } sortBy = mainWindow->feedsModel_->dataField(indexFeed, "sort").toInt(); sortType = mainWindow->feedsModel_->dataField(indexFeed, "sortType").toInt(); } else { indexColumnsStr = settings.value("columns").toString(); QStringList indexColumnsList = indexColumnsStr.split(",", QString::SkipEmptyParts); if (indexColumnsList.count()) { for (int i = 0; i < count(); ++i) { bool show = indexColumnsList.contains(QString::number(logicalIndex(i))); setSectionHidden(logicalIndex(i),!show); } } for (int i = 0; i < indexColumnsList.count(); ++i) { QString indexStr = indexColumnsList.at(i); moveSection(visualIndex(indexStr.toInt()), i); } sortBy = settings.value("sortBy", model_->fieldIndex("published")).toInt(); sortType = settings.value("sortOrder", Qt::DescendingOrder).toInt(); } settings.endGroup(); if ((sortBy != sortIndicatorSection()) || (sortType != sortIndicatorOrder())) setSortIndicator(sortBy, Qt::SortOrder(sortType)); createMenu(); moveSection(visualIndex(model_->fieldIndex("id")), 0); int tWidth = 0; for (int i = 0; i < count(); i++) tWidth += sectionSize(i); if (((state != saveState()) || (tWidth != size().width())) && isVisible()) adjustAllColumnsWidths(size().width()+1); move_ = true; } QString NewsHeader::columnsList() { QString indexColumnsStr; int columnShowCount = 0; for (int i = 0; i < count(); ++i) { if (!isSectionHidden(logicalIndex(i))) { columnShowCount++; indexColumnsStr.append(","); indexColumnsStr.append(QString::number(logicalIndex(i))); } } indexColumnsStr.append(","); if (columnShowCount > columnVisibleActGroup_->actions().count()) indexColumnsStr.clear(); return indexColumnsStr; } void NewsHeader::saveStateColumns(NewsTabWidget *newsTabWidget) { if (newsTabWidget->type_ == NewsTabWidget::TabTypeDel) return; int feedId = newsTabWidget->feedId_; MainWindow *mainWindow = mainApp->mainWindow(); QModelIndex indexOld = mainWindow->feedsModel_->indexById(feedId); Settings settings; settings.beginGroup("NewsHeader"); settings.setValue("state", saveState()); if (mainWindow->feedsModel_->dataField(indexOld, "columns").toString().isEmpty()) { settings.setValue("columns", columnsList()); settings.setValue("sortBy", sortIndicatorSection()); settings.setValue("sortOrder", sortIndicatorOrder()); } settings.endGroup(); } quiterss-0.18.3/src/newsview/newsheader.h000066400000000000000000000040241265173051100204170ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NEWSHEADER_H #define NEWSHEADER_H #ifdef HAVE_QT5 #include #else #include #endif #include #include "newsmodel.h" class NewsTabWidget; class NewsHeader : public QHeaderView { Q_OBJECT public: NewsHeader(NewsModel *model, QWidget *parent); void init(); void retranslateStrings(); void setColumns(const QModelIndex &indexFeed = QModelIndex()); void saveStateColumns(NewsTabWidget *newsTabWidget); QMenu *viewMenu_; protected: bool eventFilter(QObject *, QEvent *); virtual void mousePressEvent(QMouseEvent*); virtual void mouseMoveEvent(QMouseEvent*); virtual void mouseDoubleClickEvent(QMouseEvent*); private slots: void slotButtonColumnView(); void slotColumnVisible(QAction*); void slotSectionMoved(int, int, int); private: void createMenu(); /** * @brief Adjust width for all columns * @param newWidth Widget's width for adjustment */ void adjustAllColumnsWidths(int newWidth); QString columnsList(); NewsModel *model_; QActionGroup *columnVisibleActGroup_; QPushButton *buttonColumnView_; bool move_; int idxCol_; int posX_; }; #endif // NEWSHEADER_H quiterss-0.18.3/src/newsview/newsmodel.cpp000066400000000000000000000274161265173051100206340ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "newsmodel.h" #include "mainapplication.h" NewsModel::NewsModel(QObject *parent, QTreeView *view) : QSqlTableModel(parent) , simplifiedDateTime_(true) , view_(view) { setEditStrategy(QSqlTableModel::OnManualSubmit); } QVariant NewsModel::data(const QModelIndex &index, int role) const { if (index.row() > (view_->verticalScrollBar()->value() + view_->verticalScrollBar()->pageStep())) return QSqlTableModel::data(index, role); MainWindow *mainWindow = mainApp->mainWindow(); if (role == Qt::DecorationRole) { if (QSqlTableModel::fieldIndex("read") == index.column()) { QPixmap icon; if (1 == QSqlTableModel::index(index.row(), fieldIndex("new")).data(Qt::EditRole).toInt()) icon.load(":/images/bulletNew"); else if (0 == index.data(Qt::EditRole).toInt()) icon.load(":/images/bulletUnread"); else icon.load(":/images/bulletRead"); return icon; } else if (QSqlTableModel::fieldIndex("starred") == index.column()) { QPixmap icon; if (0 == index.data(Qt::EditRole).toInt()) icon.load(":/images/starOff"); else icon.load(":/images/starOn"); return icon; } else if (QSqlTableModel::fieldIndex("feedId") == index.column()) { QPixmap icon; int feedId = QSqlTableModel::index(index.row(), fieldIndex("feedId")).data(Qt::EditRole).toInt(); QModelIndex feedIndex = mainWindow->feedsModel_->indexById(feedId); bool isFeed = (feedIndex.isValid() && mainWindow->feedsModel_->isFolder(feedIndex)) ? false : true; if (feedIndex.isValid()) { QByteArray byteArray = mainWindow->feedsModel_->dataField(feedIndex, "image").toByteArray(); if (!byteArray.isNull()) { icon.loadFromData(QByteArray::fromBase64(byteArray)); } else if (isFeed) { icon.load(":/images/feed"); } else { icon.load(":/images/folder"); } } return icon; } else if (QSqlTableModel::fieldIndex("label") == index.column()) { QIcon icon; QString strIdLabels = index.data(Qt::EditRole).toString(); QList labelListItems = mainApp->mainWindow()-> categoriesTree_->getLabelListItems(); foreach (QTreeWidgetItem *item, labelListItems) { if (strIdLabels.contains(QString(",%1,").arg(item->text(2)))) { icon = item->icon(0); break; } } return icon; } } else if (role == Qt::ToolTipRole) { if (QSqlTableModel::fieldIndex("feedId") == index.column()) { int feedId = QSqlTableModel::index(index.row(), fieldIndex("feedId")).data(Qt::EditRole).toInt(); QModelIndex feedIndex = mainWindow->feedsModel_->indexById(feedId); return mainWindow->feedsModel_->dataField(feedIndex, "text").toString(); } else if (QSqlTableModel::fieldIndex("title") == index.column()) { QString title = index.data(Qt::EditRole).toString(); if ((view_->header()->sectionSize(index.column()) - 14) < view_->header()->fontMetrics().width(title)) return title; } return QString(""); } else if (role == Qt::DisplayRole) { if (QSqlTableModel::fieldIndex("read") == index.column()) { return QVariant(); } else if (QSqlTableModel::fieldIndex("starred") == index.column()) { return QVariant(); } else if (QSqlTableModel::fieldIndex("feedId") == index.column()) { return QVariant(); } else if (QSqlTableModel::fieldIndex("rights") == index.column()) { int feedId = QSqlTableModel::index(index.row(), fieldIndex("feedId")).data(Qt::EditRole).toInt(); QModelIndex feedIndex = mainWindow->feedsModel_->indexById(feedId); return mainWindow->feedsModel_->dataField(feedIndex, "text").toString(); } else if (QSqlTableModel::fieldIndex("published") == index.column()) { QDateTime dtLocal; QString strDate = index.data(Qt::EditRole).toString(); if (!strDate.isNull()) { QDateTime dtLocalTime = QDateTime::currentDateTime(); QDateTime dtUTC = QDateTime(dtLocalTime.date(), dtLocalTime.time(), Qt::UTC); int nTimeShift = dtLocalTime.secsTo(dtUTC); QDateTime dt = QDateTime::fromString(strDate, Qt::ISODate); dtLocal = dt.addSecs(nTimeShift); } else { dtLocal = QDateTime::fromString( QSqlTableModel::index(index.row(), fieldIndex("received")).data(Qt::EditRole).toString(), Qt::ISODate); } if (simplifiedDateTime_) { if (QDateTime::currentDateTime().date() <= dtLocal.date()) return dtLocal.toString(formatTime_); else return dtLocal.toString(formatDate_); } else { return dtLocal.toString(formatDate_ + " " + formatTime_); } } else if (QSqlTableModel::fieldIndex("received") == index.column()) { QDateTime dateTime = QDateTime::fromString( index.data(Qt::EditRole).toString(), Qt::ISODate); if (simplifiedDateTime_) { if (QDateTime::currentDateTime().date() == dateTime.date()) { return dateTime.toString(formatTime_); } else return dateTime.toString(formatDate_); } else { return dateTime.toString(formatDate_ + " " + formatTime_); } } else if (QSqlTableModel::fieldIndex("label") == index.column()) { QStringList nameLabelList; QString strIdLabels = index.data(Qt::EditRole).toString(); QList labelListItems = mainApp->mainWindow()-> categoriesTree_->getLabelListItems(); foreach (QTreeWidgetItem *item, labelListItems) { if (strIdLabels.contains(QString(",%1,").arg(item->text(2)))) { nameLabelList << item->text(0); } } return nameLabelList.join(", "); } else if (QSqlTableModel::fieldIndex("link_href") == index.column()) { QString linkStr = index.data(Qt::EditRole).toString(); if (linkStr.isEmpty()) { linkStr = QSqlTableModel::index(index.row(), fieldIndex("link_alternate")). data(Qt::EditRole).toString(); } linkStr = linkStr.simplified(); linkStr = linkStr.remove("http://"); linkStr = linkStr.remove("https://"); return linkStr; } } else if (role == Qt::FontRole) { QFont font = view_->font(); if (0 == QSqlTableModel::index(index.row(), fieldIndex("read")).data(Qt::EditRole).toInt()) font.setBold(true); return font; } else if (role == Qt::BackgroundRole) { if (index.row() == view_->currentIndex().row()) { if (!focusedNewsBGColor_.isEmpty()) return QColor(focusedNewsBGColor_); } if (QSqlTableModel::index(index.row(), fieldIndex("label")).data(Qt::EditRole).isValid()) { QString strIdLabels = QSqlTableModel::index(index.row(), fieldIndex("label")).data(Qt::EditRole).toString(); QList labelListItems = mainApp->mainWindow()-> categoriesTree_->getLabelListItems(); foreach (QTreeWidgetItem *item, labelListItems) { if (strIdLabels.contains(QString(",%1,").arg(item->text(2)))) { QString strColor = item->data(0, CategoriesTreeWidget::colorBgRole).toString(); if (!strColor.isEmpty()) return QColor(strColor); break; } } } } else if (role == Qt::TextColorRole) { if (index.row() == view_->currentIndex().row()) { return QColor(focusedNewsTextColor_); } if (QSqlTableModel::index(index.row(), fieldIndex("label")).data(Qt::EditRole).isValid()) { QString strIdLabels = QSqlTableModel::index(index.row(), fieldIndex("label")).data(Qt::EditRole).toString(); QList labelListItems = mainApp->mainWindow()-> categoriesTree_->getLabelListItems(); foreach (QTreeWidgetItem *item, labelListItems) { if (strIdLabels.contains(QString(",%1,").arg(item->text(2)))) { QString strColor = item->data(0, CategoriesTreeWidget::colorTextRole).toString(); if (!strColor.isEmpty()) return QColor(strColor); break; } } } if (1 == QSqlTableModel::index(index.row(), fieldIndex("new")).data(Qt::EditRole).toInt()) return QColor(newNewsTextColor_); if (0 == QSqlTableModel::index(index.row(), fieldIndex("read")).data(Qt::EditRole).toInt()) return QColor(unreadNewsTextColor_); return QColor(textColor_); } return QSqlTableModel::data(index, role); } /*virtual*/ QVariant NewsModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role == Qt::DisplayRole) { QString text = QSqlTableModel::headerData(section, orientation, role).toString(); if (text.isEmpty()) return QVariant(); int stopColFix = 0; for (int i = view_->header()->count()-1; i >= 0; i--) { int lIdx = view_->header()->logicalIndex(i); if (!view_->header()->isSectionHidden(lIdx)) { stopColFix = lIdx; break; } } int padding = 8; if (stopColFix == section) padding = padding + 20; text = view_->header()->fontMetrics().elidedText( text, Qt::ElideRight, view_->header()->sectionSize(section)-padding); return text; } return QSqlTableModel::headerData(section, orientation, role); } /*virtual*/ bool NewsModel::setData(const QModelIndex &index, const QVariant &value, int role) { return QSqlTableModel::setData(index, value, role); } /*virtual*/ void NewsModel::sort(int column, Qt::SortOrder order) { int newsId = index(view_->currentIndex().row(), fieldIndex("id")).data().toInt(); if ((column == fieldIndex("read")) || (column == fieldIndex("starred")) || (column == fieldIndex("rights"))) { emit signalSort(column, order); column = fieldIndex("rights"); } QSqlTableModel::sort(column, order); while (canFetchMore()) fetchMore(); if (newsId > 0) { QModelIndex startIndex = index(0, fieldIndex("id")); QModelIndexList indexList = match(startIndex, Qt::EditRole, newsId); if (indexList.count()) { int newsRow = indexList.first().row(); view_->setCurrentIndex(index(newsRow, fieldIndex("title"))); } } } /*virtual*/ QModelIndexList NewsModel::match( const QModelIndex &start, int role, const QVariant &value, int hits, Qt::MatchFlags flags) const { return QSqlTableModel::match(start, role, value, hits, flags); } // ---------------------------------------------------------------------------- QVariant NewsModel::dataField(int row, const QString &fieldName) const { return index(row, fieldIndex(fieldName)).data(Qt::EditRole); } void NewsModel::setFilter(const QString &filter) { QPalette palette = view_->palette(); palette.setColor(QPalette::AlternateBase, mainApp->mainWindow()->alternatingRowColors_); view_->setPalette(palette); QSqlTableModel::setFilter(filter); } bool NewsModel::select() { QPalette palette = view_->palette(); palette.setColor(QPalette::AlternateBase, mainApp->mainWindow()->alternatingRowColors_); view_->setPalette(palette); return QSqlTableModel::select(); } quiterss-0.18.3/src/newsview/newsmodel.h000066400000000000000000000041351265173051100202720ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NEWSMODEL_H #define NEWSMODEL_H #ifdef HAVE_QT5 #include #else #include #endif #include class NewsModel : public QSqlTableModel { Q_OBJECT public: NewsModel(QObject *parent, QTreeView *view); virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); virtual void sort(int column, Qt::SortOrder order); virtual QModelIndexList match( const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchExactly|Qt::MatchWrap) ) const; QVariant dataField(int row, const QString &fieldName) const; void setFilter(const QString &filter); bool select(); QString formatDate_; QString formatTime_; bool simplifiedDateTime_; QString textColor_; QString newNewsTextColor_; QString unreadNewsTextColor_; QString focusedNewsTextColor_; QString focusedNewsBGColor_; signals: void signalSort(int column, int order); private: QTreeView *view_; }; #endif // NEWSMODEL_H quiterss-0.18.3/src/newsview/newsview.cpp000066400000000000000000000073261265173051100205040ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "newsview.h" #include "delegatewithoutfocus.h" NewsView::NewsView(QWidget * parent) : QTreeView(parent) { setObjectName("newsView_"); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setEditTriggers(QAbstractItemView::NoEditTriggers); setMinimumWidth(120); setSortingEnabled(true); setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::ExtendedSelection); DelegateWithoutFocus *itemDelegate = new DelegateWithoutFocus(this); setItemDelegate(itemDelegate); setContextMenuPolicy(Qt::CustomContextMenu); } /*virtual*/ void NewsView::mousePressEvent(QMouseEvent *event) { if (!indexAt(event->pos()).isValid()) return; indexClicked_ = indexAt(event->pos()); QModelIndex index = indexAt(event->pos()); QSqlTableModel *model_ = (QSqlTableModel*)model(); if (event->buttons() & Qt::LeftButton) { if (index.column() == model_->fieldIndex("starred")) { if (index.data(Qt::EditRole).toInt() == 0) { emit signalSetItemStar(index, 1); } else { emit signalSetItemStar(index, 0); } event->ignore(); return; } else if (index.column() == model_->fieldIndex("read")) { if (index.data(Qt::EditRole).toInt() == 0) { emit signalSetItemRead(index, 1); } else { emit signalSetItemRead(index, 0); } event->ignore(); return; } else if (index.column() == model_->fieldIndex("label")) { if (QApplication::keyboardModifiers() == Qt::NoModifier) { emit signaNewslLabelClicked(index); event->ignore(); return; } } if (QApplication::keyboardModifiers() == Qt::AltModifier) { emit signalMiddleClicked(index); event->ignore(); return; } } else if ((event->buttons() & Qt::MiddleButton)) { emit signalMiddleClicked(index); return; } else { if (selectionModel()->selectedRows(0).count() > 1) return; } QTreeView::mousePressEvent(event); } /*virtual*/ void NewsView::mouseMoveEvent(QMouseEvent *event) { Q_UNUSED(event) } /*virtual*/ void NewsView::mouseDoubleClickEvent(QMouseEvent *event) { if (!indexAt(event->pos()).isValid()) return; if (indexClicked_ == indexAt(event->pos())) emit signalDoubleClicked(indexAt(event->pos())); else mousePressEvent(event); } /*virtual*/ void NewsView::keyPressEvent(QKeyEvent *event) { QTreeView::keyPressEvent(event); if (event->key() == Qt::Key_Up) emit pressKeyUp(currentIndex()); else if (event->key() == Qt::Key_Down) emit pressKeyDown(currentIndex()); else if (event->key() == Qt::Key_Home) emit pressKeyHome(currentIndex()); else if (event->key() == Qt::Key_End) emit pressKeyEnd(currentIndex()); else if (event->key() == Qt::Key_PageUp) emit pressKeyPageUp(currentIndex()); else if (event->key() == Qt::Key_PageDown) emit pressKeyPageDown(currentIndex()); } quiterss-0.18.3/src/newsview/newsview.h000066400000000000000000000036201265173051100201420ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NEWSVIEW_H #define NEWSVIEW_H #ifdef HAVE_QT5 #include #else #include #endif #include "newsmodel.h" class NewsView : public QTreeView { Q_OBJECT public: NewsView(QWidget * parent = 0); signals: void signalSetItemRead(QModelIndex index, int read); void signalSetItemStar(QModelIndex index, int starred); void signalDoubleClicked(QModelIndex index); void signalMiddleClicked(QModelIndex index); void signaNewslLabelClicked(QModelIndex index); void pressKeyUp(const QModelIndex &index); void pressKeyDown(const QModelIndex &index); void pressKeyHome(const QModelIndex &index); void pressKeyEnd(const QModelIndex &index); void pressKeyPageUp(const QModelIndex &index); void pressKeyPageDown(const QModelIndex &index); protected: virtual void mousePressEvent(QMouseEvent*); virtual void mouseMoveEvent(QMouseEvent*); virtual void mouseDoubleClickEvent(QMouseEvent*); virtual void keyPressEvent(QKeyEvent*); private: QModelIndex indexClicked_; }; #endif // NEWSVIEW_H quiterss-0.18.3/src/notifications/000077500000000000000000000000001265173051100171235ustar00rootroot00000000000000quiterss-0.18.3/src/notifications/notificationsfeeditem.cpp000066400000000000000000000042521265173051100242060ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "notificationsfeeditem.h" FeedItem::FeedItem(int width, QWidget * parent) : QWidget(parent) { iconLabel_ = new QLabel(this); titleLabel_ = new QLabel(this); titleLabel_->setFixedWidth(width + 21*1); QWidget *mainWidget = new QWidget(this); mainWidget->setObjectName("feedItemNotification"); QHBoxLayout *layout = new QHBoxLayout(mainWidget); layout->setMargin(4); layout->setSpacing(5); layout->addWidget(iconLabel_); layout->addWidget(titleLabel_); layout->addStretch(); QHBoxLayout *mainLayout = new QHBoxLayout(); mainLayout->setMargin(0); mainLayout->addWidget(mainWidget); setLayout(mainLayout); } FeedItem::~FeedItem() { } void FeedItem::setIcon(const QPixmap &icon) { iconLabel_->setPixmap(icon); } void FeedItem::setTitle(const QString &text, int cntNews) { int wight = titleLabel_->fontMetrics().width(QString(" (%1)").arg(cntNews)); QString titleStr = titleLabel_->fontMetrics().elidedText( text, Qt::ElideRight, titleLabel_->sizeHint().width() - wight); titleLabel_->setText(QString("%1 (%2)").arg(titleStr).arg(cntNews)); } void FeedItem::setFontTitle(const QFont &font) { titleLabel_->setFont(font); } void FeedItem::setColorText(const QColor &color) { titleLabel_->setStyleSheet(QString("QLabel {color: %1;}").arg(color.name())); } quiterss-0.18.3/src/notifications/notificationsfeeditem.h000066400000000000000000000026051265173051100236530ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NOTIFICATIONSFEEDITEM_H #define NOTIFICATIONSFEEDITEM_H #ifdef HAVE_QT5 #include #else #include #endif class FeedItem : public QWidget { Q_OBJECT public: FeedItem(int width, QWidget * parent = 0); ~FeedItem(); void setIcon(const QPixmap &icon); void setTitle(const QString &text, int cntNews); void setFontTitle(const QFont &font); void setColorText(const QColor &color); private: QLabel *iconLabel_; QLabel *titleLabel_; }; #endif // NOTIFICATIONSFEEDITEM_H quiterss-0.18.3/src/notifications/notificationsnewsitem.cpp000066400000000000000000000110421265173051100242520ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "notificationsnewsitem.h" NewsItem::NewsItem(int idFeed, int idNews, int width, QWidget * parent) : QWidget(parent) , feedId_(idFeed) , newsId_(idNews) , read_(false) { setCursor(Qt::PointingHandCursor); iconLabel_ = new QLabel(this); iconLabel_->setFixedWidth(19); textLabel_ = new QLabel(this); textLabel_->setFixedWidth(width); textLabel_->setStyleSheet("QLabel:hover {color: #1155CC;}"); readButton_ = new ToolButton(this); readButton_->setIcon(QIcon(":/images/bulletUnread")); readButton_->setToolTip(tr("Mark Read/Unread")); readButton_->setAutoRaise(true); openExternalBrowserButton_ = new ToolButton(this); openExternalBrowserButton_->setIcon(QIcon(":/images/openBrowser")); openExternalBrowserButton_->setAutoRaise(true); deleteButton_ = new ToolButton(this); deleteButton_->setIcon(QIcon(":/images/editClear")); deleteButton_->setToolTip(tr("Delete News")); deleteButton_->setAutoRaise(true); QHBoxLayout *mainLayout = new QHBoxLayout(); mainLayout->setMargin(0); mainLayout->setSpacing(1); mainLayout->addWidget(readButton_); mainLayout->addWidget(iconLabel_); mainLayout->addWidget(textLabel_, 1); mainLayout->addStretch(0); mainLayout->addWidget(openExternalBrowserButton_); mainLayout->addWidget(deleteButton_); setLayout(mainLayout); connect(readButton_, SIGNAL(clicked()), this, SLOT(markRead())); connect(openExternalBrowserButton_, SIGNAL(clicked()), this, SLOT(openExternalBrowser())); connect(deleteButton_, SIGNAL(clicked()), this, SLOT(deleteNews())); installEventFilter(this); } NewsItem::~NewsItem() { } void NewsItem::setText(const QString &text) { QString titleStr = textLabel_->fontMetrics().elidedText( text, Qt::ElideRight, textLabel_->sizeHint().width()); textLabel_->setText(titleStr); textLabel_->setToolTip(text); } void NewsItem::setFontText(const QFont & font) { textLabel_->setFont(font); } void NewsItem::setColorText(const QString &color, const QString &linkColor) { textLabel_->setStyleSheet(QString( "QLabel {color: %1;}" "QLabel:hover {color: %2;}"). arg(color).arg(linkColor)); } bool NewsItem::eventFilter(QObject *obj, QEvent *event) { if((event->type() == QEvent::MouseButtonPress) && isEnabled()) { read_ = 1; readButton_->setIcon(QIcon(":/images/bulletRead")); QFont font = textLabel_->font(); font.setBold(false); textLabel_->setFont(font); emit signalTitleClicked(feedId_, newsId_); return true; } return QObject::eventFilter(obj, event); } void NewsItem::openExternalBrowser() { read_ = 1; readButton_->setIcon(QIcon(":/images/bulletRead")); QFont font = textLabel_->font(); font.setBold(false); textLabel_->setFont(font); emit signalMarkRead(feedId_, newsId_, read_); QString linkString; QSqlQuery q; q.exec(QString("SELECT link_href, link_alternate FROM news WHERE id=='%1'").arg(newsId_)); if (q.next()) { linkString = q.value(0).toString(); if (linkString.isEmpty()) { linkString = q.value(1).toString(); } } emit signalOpenExternalBrowser(linkString.simplified()); } void NewsItem::markRead() { QFont font = textLabel_->font(); read_ = !read_; if (read_) { readButton_->setIcon(QIcon(":/images/bulletRead")); font.setBold(false); } else { readButton_->setIcon(QIcon(":/images/bulletUnread")); font.setBold(true); } textLabel_->setFont(font); emit signalMarkRead(feedId_, newsId_, read_); } void NewsItem::deleteNews() { QFont font = textLabel_->font(); font.setBold(false); textLabel_->setFont(font); setDisabled(true); emit signalDeleteNews(feedId_, newsId_); } quiterss-0.18.3/src/notifications/notificationsnewsitem.h000066400000000000000000000036531265173051100237300ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NOTIFICATIONSNEWSITEM_H #define NOTIFICATIONSNEWSITEM_H #ifdef HAVE_QT5 #include #else #include #endif #include #include "toolbutton.h" class NewsItem : public QWidget { Q_OBJECT public: NewsItem(int idFeed, int idNews, int width, QWidget * parent = 0); ~NewsItem(); void setText(const QString &text); void setFontText(const QFont & font); void setColorText(const QString &color, const QString &linkColor); QLabel *iconLabel_; ToolButton *readButton_; ToolButton *openExternalBrowserButton_; ToolButton *deleteButton_; signals: void signalOpenExternalBrowser(const QUrl &url); void signalMarkRead(int feedId, int newsId, int read); void signalTitleClicked(int feedId, int newsId); void signalDeleteNews(int feedId, int newsId); protected: bool eventFilter(QObject *obj, QEvent *event); private slots: void openExternalBrowser(); void markRead(); void deleteNews(); private: int feedId_; int newsId_; bool read_; QLabel *textLabel_; }; #endif // NOTIFICATIONSNEWSITEM_H quiterss-0.18.3/src/notifications/notificationswidget.cpp000066400000000000000000000431321265173051100237070ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "notificationswidget.h" #include "mainapplication.h" #include "notificationsfeeditem.h" #include "notificationsnewsitem.h" #include "optionsdialog.h" NotificationWidget::NotificationWidget(QList idFeedList, QList cntNewNewsList, QList idColorList, QStringList colorList, QWidget *parentWidget, QWidget *parent) : QWidget(parent) , idFeedList_(idFeedList) , cntAllNews_(0) , cntReadNews_(0) { Qt::WindowFlags flags; #ifdef Q_OS_MAC flags = Qt::FramelessWindowHint | Qt::SplashScreen | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint; #else flags = Qt::FramelessWindowHint | Qt::Tool | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint; #endif setWindowFlags(flags); setAttribute(Qt::WA_TranslucentBackground); setFocusPolicy(Qt::NoFocus); setAttribute(Qt::WA_AlwaysShowToolTips); int numberItems; int widthList; QString fontFamily; int fontSize; QString textColor; QString backgroundColor; QString linkColor; bool showTitlesFeedsNotify; bool showIconFeedNotify; bool showButtonMarkAllNotify; bool showButtonMarkReadNotify; bool showButtonExBrowserNotify; bool showButtonDeleteNotify; if (idFeedList.count()) { screen_ = mainApp->mainWindow()->screenNotify_; position_ = mainApp->mainWindow()->positionNotify_; transparency_ = mainApp->mainWindow()->transparencyNotify_; timeShowNews_ = mainApp->mainWindow()->timeShowNewsNotify_; numberItems = mainApp->mainWindow()->countShowNewsNotify_; widthList = mainApp->mainWindow()->widthTitleNewsNotify_; fontFamily = mainApp->mainWindow()->notificationFontFamily_; fontSize = mainApp->mainWindow()->notificationFontSize_; textColor = mainApp->mainWindow()->notifierTextColor_; backgroundColor = mainApp->mainWindow()->notifierBackgroundColor_; linkColor = mainApp->mainWindow()->linkColor_; showTitlesFeedsNotify = mainApp->mainWindow()->showTitlesFeedsNotify_; showIconFeedNotify = mainApp->mainWindow()->showIconFeedNotify_; showButtonMarkAllNotify = mainApp->mainWindow()->showButtonMarkAllNotify_; showButtonMarkReadNotify = mainApp->mainWindow()->showButtonMarkReadNotify_; showButtonExBrowserNotify = mainApp->mainWindow()->showButtonExBrowserNotify_; showButtonDeleteNotify = mainApp->mainWindow()->showButtonDeleteNotify_; } else { OptionsDialog *options = qobject_cast(parentWidget); screen_ = options->screenNotify_->currentIndex()-1; position_ = options->positionNotify_->currentIndex(); transparency_ = options->transparencyNotify_->value(); timeShowNews_ = options->timeShowNewsNotify_->value(); numberItems = options->countShowNewsNotify_->value(); widthList = options->widthTitleNewsNotify_->value(); fontFamily = options->fontsTree_->topLevelItem(4)->text(2).section(", ", 0, 0); fontSize = options->fontsTree_->topLevelItem(4)->text(2).section(", ", 1).toInt(); textColor = options->colorsTree_->topLevelItem(21)->text(1); backgroundColor = options->colorsTree_->topLevelItem(22)->text(1); linkColor = options->colorsTree_->topLevelItem(6)->text(1); showTitlesFeedsNotify = options->showTitlesFeedsNotify_->isChecked(); showIconFeedNotify = options->showIconFeedNotify_->isChecked(); showButtonMarkAllNotify = options->showButtonMarkAllNotify_->isChecked(); showButtonMarkReadNotify = options->showButtonMarkReadNotify_->isChecked(); showButtonExBrowserNotify = options->showButtonExBrowserNotify_->isChecked(); showButtonDeleteNotify = options->showButtonDeleteNotify_->isChecked(); for (int i = 0; i < 10; i++) { cntNewNewsList << 9; } } if (screen_ == -1) { screen_ = QApplication::desktop()->screenNumber(mainApp->mainWindow()); } int transparency = 255*(100-transparency_)/100; QColor color(backgroundColor); int redColor = color.red()-20; if (redColor < 0) redColor = 0; int greenColor = color.green()-20; if (greenColor < 0) greenColor = 0; int blueColor = color.blue()-20; if (blueColor < 0) blueColor = 0; iconTitle_ = new QLabel(this); iconTitle_->setPixmap(QPixmap(":/images/quiterss16")); textTitle_ = new QLabel(this); closeButton_ = new QToolButton(this); closeButton_->setToolTip(tr("Close")); closeButton_->setStyleSheet( "QToolButton { border: none; padding: 0px; " "image: url(:/images/close); }" "QToolButton:hover {" "image: url(:/images/closeHover); }"); QHBoxLayout *titleLayout = new QHBoxLayout(); titleLayout->setMargin(4); titleLayout->setSpacing(5); titleLayout->addWidget(iconTitle_); titleLayout->addWidget(textTitle_, 1); titleLayout->addWidget(closeButton_); QWidget *titlePanel_ = new QWidget(this); titlePanel_->setCursor(Qt::PointingHandCursor); titlePanel_->setObjectName("titleNotification"); titlePanel_->setLayout(titleLayout); titlePanel_->installEventFilter(this); titlePanel_->setStyleSheet(QString("#titleNotification { background: rgba(%1, %2, %3, %4); }"). arg(redColor).arg(greenColor). arg(blueColor).arg(transparency)); numPage_ = new QLabel(this); ToolButton *markAllReadButton_ = new ToolButton(this); markAllReadButton_->setToolTip(tr("Mark All News Read")); markAllReadButton_->setIcon(QIcon(":/images/markReadAll")); markAllReadButton_->setAutoRaise(true); prevButton_ = new ToolButton(this); prevButton_->setIcon(QIcon(":/images/moveLeft")); prevButton_->setToolTip(tr("Previous Page")); prevButton_->setEnabled(false); prevButton_->setAutoRaise(true); nextButton_ = new ToolButton(this); nextButton_->setIcon(QIcon(":/images/moveRight")); nextButton_->setToolTip(tr("Next Page")); nextButton_->setAutoRaise(true); QHBoxLayout *bottomLayout = new QHBoxLayout(); bottomLayout->setMargin(2); bottomLayout->setSpacing(1); bottomLayout->addSpacing(3); bottomLayout->addWidget(numPage_); bottomLayout->addStretch(1); if (showButtonMarkAllNotify) { bottomLayout->addWidget(markAllReadButton_); bottomLayout->addSpacing(5); } bottomLayout->addWidget(prevButton_); bottomLayout->addWidget(nextButton_); bottomLayout->addSpacing(3); QWidget *bottomPanel_ = new QWidget(this); bottomPanel_->setObjectName("bottomNotification"); bottomPanel_->setLayout(bottomLayout); bottomPanel_->setStyleSheet(QString("#bottomNotification { background: rgba(%1, %2, %3, %4); }"). arg(redColor).arg(greenColor). arg(blueColor).arg(transparency)); stackedWidget_ = new QStackedWidget(this); QVBoxLayout *mainLayout = new QVBoxLayout(); mainLayout->setMargin(1); mainLayout->setSpacing(0); mainLayout->addWidget(titlePanel_); mainLayout->addWidget(stackedWidget_); mainLayout->addWidget(bottomPanel_); QWidget *mainWidget = new QWidget(this); mainWidget->setObjectName("notificationWidget"); mainWidget->setLayout(mainLayout); mainWidget->setMouseTracking(true); mainWidget->setStyleSheet(QString("#notificationWidget { background: rgba(%1, %2, %3, %4); }"). arg(color.red()).arg(color.green()). arg(color.blue()).arg(transparency)); QVBoxLayout *layout = new QVBoxLayout(); layout->setMargin(0); layout->addWidget(mainWidget); setLayout(layout); foreach (int cntNews, cntNewNewsList) { cntAllNews_ = cntAllNews_ + cntNews; } textTitle_->setText(QString(tr("Incoming News: %1")).arg(cntAllNews_)); if ((cntAllNews_ + idFeedList.count()) > numberItems) nextButton_->setEnabled(true); else nextButton_->setEnabled(false); addPage(false); if (!idFeedList.isEmpty()) { int countItems = 0; for (int i = 0; i < idFeedList.count(); i++) { QSqlQuery q; QString qStr; QString titleFeed; QPixmap icon; int idFeed = idFeedList[i]; qStr = QString("SELECT text, image FROM feeds WHERE id=='%1'"). arg(idFeed); q.exec(qStr); if (q.next()) { titleFeed = q.value(0).toString(); QByteArray byteArray = q.value(1).toByteArray(); if (!byteArray.isNull()) { icon.loadFromData(QByteArray::fromBase64(byteArray)); } else { icon.load(":/images/feed"); } } if (showTitlesFeedsNotify) { if (countItems >= (numberItems - 1)) { countItems = 1; addPage(); } else countItems++; FeedItem *feedItem = new FeedItem(widthList, this); feedItem->setIcon(icon); feedItem->setFontTitle(QFont(fontFamily, fontSize, -1, true)); feedItem->setColorText(textColor); feedItem->setTitle(titleFeed, cntNewNewsList[i]); pageLayout_->addWidget(feedItem); } int cntNewNews = 0; qStr = QString("SELECT id, title FROM news WHERE new=1 AND feedId=='%1'"). arg(idFeed); q.exec(qStr); while (q.next()) { if (cntNewNews >= cntNewNewsList[i]) break; else cntNewNews++; if (countItems >= numberItems) { addPage(); if (showTitlesFeedsNotify) { countItems = 2; FeedItem *feedItem = new FeedItem(widthList, this); feedItem->setIcon(icon); feedItem->setFontTitle(QFont(fontFamily, fontSize, -1, true)); feedItem->setColorText(textColor); feedItem->setTitle(titleFeed, cntNewNewsList[i]); pageLayout_->addWidget(feedItem); } else { countItems = 1; } } else countItems++; int idNews = q.value(0).toInt(); idNewsList_.append(idNews); NewsItem *newsItem = new NewsItem(idFeed, idNews, widthList, this); newsItem->setFontText(QFont(fontFamily, fontSize, QFont::Bold)); newsItem->setText(q.value(1).toString()); int index = idColorList.indexOf(idNews); if (index != -1) newsItem->setColorText(colorList.at(index), linkColor); else newsItem->setColorText(textColor, linkColor); newsItem->iconLabel_->setPixmap(icon); newsItem->iconLabel_->setToolTip(titleFeed); newsItem->readButton_->setVisible(showButtonMarkReadNotify); newsItem->iconLabel_->setVisible(showIconFeedNotify); newsItem->openExternalBrowserButton_->setVisible(showButtonExBrowserNotify); newsItem->deleteButton_->setVisible(showButtonDeleteNotify); pageLayout_->addWidget(newsItem); connect(newsItem, SIGNAL(signalMarkRead(int, int, int)), this, SLOT(slotMarkRead(int, int, int))); connect(newsItem, SIGNAL(signalTitleClicked(int, int)), this, SIGNAL(signalOpenNews(int, int))); connect(newsItem, SIGNAL(signalOpenExternalBrowser(QUrl)), this, SIGNAL(signalOpenExternalBrowser(QUrl))); connect(newsItem, SIGNAL(signalDeleteNews(int,int)), this, SLOT(slotDeleteNews(int, int))); } } } // Review else { int countItems = 0; for (int i = 0; i < 10; i++) { if (showTitlesFeedsNotify) { if (countItems >= (numberItems - 1)) { countItems = 1; addPage(); } else countItems++; FeedItem *feedItem = new FeedItem(widthList, this); feedItem->setIcon(QPixmap(":/images/feed")); feedItem->setFontTitle(QFont(fontFamily, fontSize, -1, true)); feedItem->setColorText(textColor); feedItem->setTitle(QString("Title Feed %1").arg(i+1), 9); pageLayout_->addWidget(feedItem); } for (int y = 0; y < cntNewNewsList.at(i); y++) { if (countItems >= numberItems) { addPage(); if (showTitlesFeedsNotify) { countItems = 2; FeedItem *feedItem = new FeedItem(widthList, this); feedItem->setIcon(QPixmap(":/images/feed")); feedItem->setFontTitle(QFont(fontFamily, fontSize, -1, true)); feedItem->setColorText(textColor); feedItem->setTitle(QString("Title Feed %1").arg(i+1), 9); pageLayout_->addWidget(feedItem); } else { countItems = 1; } } else countItems++; NewsItem *newsItem = new NewsItem(0, 0, widthList, this); newsItem->setFontText(QFont(fontFamily, fontSize, QFont::Bold)); newsItem->setColorText(textColor, linkColor); newsItem->setText("Test News Test News Test News Test News Test News"); newsItem->iconLabel_->setPixmap(QPixmap(":/images/feed")); newsItem->iconLabel_->setToolTip(QString("Title Feed %1").arg(i+1)); newsItem->readButton_->setVisible(showButtonMarkReadNotify); newsItem->iconLabel_->setVisible(showIconFeedNotify); newsItem->openExternalBrowserButton_->setVisible(showButtonExBrowserNotify); newsItem->deleteButton_->setVisible(showButtonDeleteNotify); pageLayout_->addWidget(newsItem); } } } pageLayout_->addStretch(); numPage_->setText(QString(tr("Page %1 of %2").arg("1").arg(stackedWidget_->count()))); showTimer_ = new QTimer(this); connect(showTimer_, SIGNAL(timeout()), this, SIGNAL(signalClose())); connect(closeButton_, SIGNAL(clicked()), this, SIGNAL(signalClose())); connect(prevButton_, SIGNAL(clicked()), this, SLOT(previousPage())); connect(nextButton_, SIGNAL(clicked()), this, SLOT(nextPage())); connect(markAllReadButton_, SIGNAL(clicked()), this, SIGNAL(signalMarkAllRead())); connect(markAllReadButton_, SIGNAL(clicked()), this, SIGNAL(signalClose())); if (timeShowNews_ != 0) showTimer_->start(timeShowNews_*1000); } NotificationWidget::~NotificationWidget() { } void NotificationWidget::showEvent(QShowEvent*) { QPoint point; switch(position_) { case 0: point = QPoint(QApplication::desktop()->availableGeometry(screen_).topLeft().x(), QApplication::desktop()->availableGeometry(screen_).topLeft().y()); break; case 1: point = QPoint(QApplication::desktop()->availableGeometry(screen_).topRight().x()-width(), QApplication::desktop()->availableGeometry(screen_).topRight().y()); break; case 2: point = QPoint(QApplication::desktop()->availableGeometry(screen_).bottomLeft().x(), QApplication::desktop()->availableGeometry(screen_).bottomLeft().y()-height()); break; default: point = QPoint(QApplication::desktop()->availableGeometry(screen_).bottomRight().x()-width(), QApplication::desktop()->availableGeometry(screen_).bottomRight().y()-height()); break; } move(point); } bool NotificationWidget::eventFilter(QObject *obj, QEvent *event) { if(event->type() == QEvent::MouseButtonPress) { emit signalShow(); emit signalClose(); return true; } else { return QObject::eventFilter(obj, event); } } void NotificationWidget::enterEvent(QEvent*) { showTimer_->stop(); } void NotificationWidget::leaveEvent(QEvent*) { if (timeShowNews_ != 0) showTimer_->start(timeShowNews_*1000); } void NotificationWidget::addPage(bool next) { if (next) pageLayout_->addStretch(); pageLayout_ = new QVBoxLayout(); pageLayout_->setMargin(5); pageLayout_->setSpacing(0); QWidget *pageWidget = new QWidget(this); pageWidget->setLayout(pageLayout_); stackedWidget_->addWidget(pageWidget); } void NotificationWidget::nextPage() { stackedWidget_->setCurrentIndex(stackedWidget_->currentIndex()+1); if (stackedWidget_->currentIndex()+1 == stackedWidget_->count()) nextButton_->setEnabled(false); if (stackedWidget_->currentIndex() != 0) prevButton_->setEnabled(true); numPage_->setText(QString(tr("Page %1 of %2"). arg(stackedWidget_->currentIndex()+1). arg(stackedWidget_->count()))); } void NotificationWidget::previousPage() { stackedWidget_->setCurrentIndex(stackedWidget_->currentIndex()-1); if (stackedWidget_->currentIndex() == 0) prevButton_->setEnabled(false); if (stackedWidget_->currentIndex()+1 != stackedWidget_->count()) nextButton_->setEnabled(true); numPage_->setText(QString(tr("Page %1 of %2"). arg(stackedWidget_->currentIndex()+1). arg(stackedWidget_->count()))); } void NotificationWidget::slotMarkRead(int feedId, int newsId, int read) { if (read) cntReadNews_++; else cntReadNews_--; if (cntReadNews_ == cntAllNews_) { emit signalClose(); } emit signalMarkRead(feedId, newsId, read); } void NotificationWidget::slotDeleteNews(int feedId, int newsId) { cntReadNews_++; if (cntReadNews_ == cntAllNews_) { emit signalClose(); } idNewsList_.removeOne(newsId); emit signalDeleteNews(feedId, newsId); } void NotificationWidget::slotMarkAllRead() { } quiterss-0.18.3/src/notifications/notificationswidget.h000066400000000000000000000051041265173051100233510ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef NOTIFICATIONSWIDGET_H #define NOTIFICATIONSWIDGET_H #ifdef HAVE_QT5 #include #else #include #endif #include #include "toolbutton.h" class NotificationWidget : public QWidget { Q_OBJECT public: NotificationWidget(QList idFeedList, QList cntNewNewsList, QList idColorList, QStringList colorList, QWidget *parentWidget, QWidget *parent = 0); ~NotificationWidget(); QList idFeedList() { return idFeedList_; } QList idNewsList() { return idNewsList_; } signals: void signalShow(); void signalClose(); void signalOpenNews(int feedId, int newsId); void signalOpenExternalBrowser(const QUrl &url); void signalMarkRead(int feedId, int newsId, int read); void signalDeleteNews(int feedId, int newsId); void signalMarkAllRead(); protected: void showEvent(QShowEvent*); bool eventFilter(QObject *obj, QEvent *event); void enterEvent(QEvent*); void leaveEvent(QEvent*); private slots: void nextPage(); void previousPage(); void slotMarkRead(int feedId, int newsId, int read); void slotDeleteNews(int feedId, int newsId); void slotMarkAllRead(); private: void addPage(bool next = true); QLabel *iconTitle_; QLabel *textTitle_; QToolButton *closeButton_; QStackedWidget *stackedWidget_; QVBoxLayout *pageLayout_; QLabel *numPage_; ToolButton *prevButton_; ToolButton *nextButton_; QList idFeedList_; QList idNewsList_; QTimer *showTimer_; int timeShowNews_; int screen_; int position_; int transparency_; int cntAllNews_; int cntReadNews_; }; #endif // NOTIFICATIONSWIDGET_H quiterss-0.18.3/src/optionsdialog.cpp000066400000000000000000003430451265173051100176420ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "optionsdialog.h" #include "mainapplication.h" #include "labeldialog.h" #include "settings.h" #include "VersionNo.h" OptionsDialog::OptionsDialog(QWidget *parent) : Dialog(parent) , notificationWidget_(NULL) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); setWindowTitle(tr("Options")); db_ = QSqlDatabase::database(); contentLabel_ = new QLabel(); contentLabel_->setObjectName("contentLabel_"); contentLabel_->setAlignment(Qt::AlignCenter); contentLabel_->setStyleSheet( QString("#contentLabel_ {border-bottom: 1px solid %1;}"). arg(qApp->palette().color(QPalette::Dark).name())); contentLabel_->setMinimumHeight(36); contentLabel_->setMargin(4); QFont fontContentLabel = contentLabel_->font(); fontContentLabel.setBold(true); fontContentLabel.setPointSize(fontContentLabel.pointSize()+2); contentLabel_->setFont(fontContentLabel); mainLayout->insertWidget(0, contentLabel_); categoriesTree_ = new QTreeWidget(); categoriesTree_->setObjectName("categoriesTree"); categoriesTree_->setStyleSheet("QTreeWidget::item { min-height: 20px; }" "QTreeWidget { padding: 1px; }"); categoriesTree_->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); categoriesTree_->setHeaderHidden(true); categoriesTree_->setColumnCount(3); categoriesTree_->setColumnHidden(0, true); categoriesTree_->header()->setStretchLastSection(false); categoriesTree_->header()->resizeSection(2, 5); #ifdef HAVE_QT5 categoriesTree_->header()->setSectionResizeMode(1, QHeaderView::Stretch); #else categoriesTree_->header()->setResizeMode(1, QHeaderView::Stretch); #endif categoriesTree_->setMinimumWidth(150); QStringList treeItem; treeItem << "0" << tr("General"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "1" << tr("System Tray"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "2" << tr("Network Connections"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "3" << tr("Browser"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "4" << tr("Feeds"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "5" << tr("Labels"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "6" << tr("Notifications"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "7" << tr("Passwords"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "8" << tr("Language"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "9" << tr("Fonts & Colors"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "10" << tr("Keyboard Shortcuts"); categoriesTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); createGeneralWidget(); createTraySystemWidget(); createNetworkConnectionsWidget(); createBrowserWidget(); createFeedsWidget(); createLabelsWidget(); createNotifierWidget(); createPasswordsWidget(); createLanguageWidget(); createFontsColorsWidget(); createShortcutWidget(); contentStack_ = new QStackedWidget(); contentStack_->setObjectName("contentStack_"); contentStack_->addWidget(generalWidget_); contentStack_->addWidget(traySystemWidget_); contentStack_->addWidget(networkConnectionsWidget_); contentStack_->addWidget(browserWidget_); contentStack_->addWidget(feedsWidget_); contentStack_->addWidget(labelsWidget_); contentStack_->addWidget(notifierWidget_); contentStack_->addWidget(passwordsWidget_); contentStack_->addWidget(languageWidget_); contentStack_->addWidget(fontsColorsWidget_); contentStack_->addWidget(shortcutWidget_); scrollArea_ = new QScrollArea(this); scrollArea_->setWidgetResizable(true); scrollArea_->setFrameStyle(QFrame::NoFrame); scrollArea_->setWidget(contentStack_); QSplitter *splitter = new QSplitter(); splitter->setChildrenCollapsible(false); splitter->addWidget(categoriesTree_); splitter->addWidget(scrollArea_); QList sizes; sizes << 150 << 600; splitter->setSizes(sizes); pageLayout->addWidget(splitter, 1); pageLayout->setContentsMargins(10, 5, 10, 5); buttonBox->addButton(QDialogButtonBox::Ok); buttonBox->addButton(QDialogButtonBox::Cancel); connect(buttonBox, SIGNAL(accepted()), this, SLOT(acceptDialog())); connect(this, SIGNAL(finished(int)), this, SLOT(closeDialog())); connect(categoriesTree_, SIGNAL(itemPressed(QTreeWidgetItem*,int)), this, SLOT(slotCategoriesItemClicked(QTreeWidgetItem*,int))); connect(this, SIGNAL(signalCategoriesTreeKeyUpDownPressed()), SLOT(slotCategoriesTreeKeyUpDownPressed()), Qt::QueuedConnection); categoriesTree_->installEventFilter(this); setMinimumSize(500, 400); resize(700, 560); Settings settings; restoreGeometry(settings.value("options/geometry").toByteArray()); } void OptionsDialog::showEvent(QShowEvent*event) { int desktopWidth = QApplication::desktop()->availableGeometry().width(); int desktopHeight = QApplication::desktop()->availableGeometry().height(); int maxWidth = desktopWidth - (frameSize().width() - width()); int maxHeight = desktopHeight - (frameSize().height() - height()); setMaximumSize(maxWidth, maxHeight); if (frameSize().height() >= desktopHeight) { QPoint point = QPoint(QApplication::desktop()->availableGeometry().topLeft().x(), QApplication::desktop()->availableGeometry().topLeft().y()); move(point); } Dialog::showEvent(event); } void OptionsDialog::acceptDialog() { #if defined(Q_OS_WIN) if (mainApp->isPortableAppsCom()) { if (autoRunEnabled_->isChecked()) { QFileInfo file(QCoreApplication::applicationDirPath() % "/../../QuiteRSSPortable.exe"); autoRunSettings_->setValue("QuiteRSSPortable", QDir::toNativeSeparators(file.absoluteFilePath())); } else { autoRunSettings_->remove("QuiteRSSPortable"); } } else { if (autoRunEnabled_->isChecked()) autoRunSettings_->setValue("QuiteRSS", QDir::toNativeSeparators(QCoreApplication::applicationFilePath())); else autoRunSettings_->remove("QuiteRSS"); } #endif applyProxy(); applyWhitelist(); applyLabels(); applyNotifier(); applyPass(); accept(); } void OptionsDialog::closeDialog() { Settings settings; settings.setValue("options/geometry", saveGeometry()); } bool OptionsDialog::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast(event); if (obj != editShortcut_) { if ((keyEvent->key() == Qt::Key_Up) || (keyEvent->key() == Qt::Key_Down)) { if (obj == categoriesTree_) emit signalCategoriesTreeKeyUpDownPressed(); else if (obj == shortcutTree_) emit signalShortcutTreeUpDownPressed(); } } else { if ((keyEvent->key() < Qt::Key_Shift) || (keyEvent->key() > Qt::Key_Alt)) { QString str; if ((keyEvent->modifiers() & Qt::ShiftModifier) || (keyEvent->modifiers() & Qt::ControlModifier) || (keyEvent->modifiers() & Qt::AltModifier)) str.append(QKeySequence(keyEvent->modifiers()).toString()); if (keyEvent->key() == Qt::Key_Backtab) str.append(QKeySequence(Qt::Key_Tab).toString()); else str.append(QKeySequence(keyEvent->key()).toString()); editShortcut_->setText(str); QModelIndex index = shortcutProxyModel_->mapToSource(shortcutTree_->currentIndex()); int row = index.row(); QString shortcutStr = shortcutModel_->item(row, 2)->text(); QList treeItems; treeItems = shortcutModel_->findItems(shortcutStr, Qt::MatchFixedString, 2); if (!shortcutStr.isEmpty()) { for (int i = 0; i < treeItems.count(); i++) { if ((treeItems.count() == 2) || (treeItems.at(i)->row() == row)) { treeItems.at(i)->setData(shortcutModel_->item(0, 1)->data(Qt::TextColorRole), Qt::TextColorRole); } } } shortcutModel_->item(row, 2)->setText(str); shortcutModel_->item(row, 2)->setData(str); if (!str.isEmpty()) { treeItems = shortcutModel_->findItems(str, Qt::MatchFixedString, 2); if (treeItems.count() > 1) { for (int i = 0; i < treeItems.count(); i++) { if (treeItems.at(i)->row() != row) { warningShortcut_->setText(tr("Warning: key is already assigned to") + " '" + shortcutModel_->item(treeItems.at(i)->row(), 0)->text() + "'"); } treeItems.at(i)->setData(QColor(Qt::red), Qt::TextColorRole); } } else { warningShortcut_->clear(); } } } return true; } return false; } else { return QDialog::eventFilter(obj, event); } } /** @brief Create windget "General" *----------------------------------------------------------------------------*/ void OptionsDialog::createGeneralWidget() { showSplashScreen_ = new QCheckBox(tr("Show splash screen on startup")); reopenFeedStartup_ = new QCheckBox(tr("Reopen last opened feeds on startup")); openNewTabNextToActive_ = new QCheckBox(tr("Open new tab next to active")); hideFeedsOpenTab_ = new QCheckBox(tr("Hide feeds tree when opening tabs")); showToggleFeedsTree_ = new QCheckBox(tr("Show feeds tree toggle")); defaultIconFeeds_ = new QCheckBox(tr("Show default rss-icon instead of favourite one")); autocollapseFolder_ = new QCheckBox(tr("Automatically collapse folders")); showCloseButtonTab_ = new QCheckBox(tr("Show close button on tab")); updateCheckEnabled_ = new QCheckBox(tr("Automatically check for updates")); statisticsEnabled_ = new QCheckBox(tr("Help improve QuiteRSS by sending usage information")); storeDBMemory_ = new QCheckBox(tr("Store a DB in memory (requires program restart)")); storeDBMemory_->setChecked(false); saveDBMemFileInterval_ = new QSpinBox(); saveDBMemFileInterval_->setRange(1, 999); QHBoxLayout *saveDBMemFileLayout = new QHBoxLayout(); saveDBMemFileLayout->setContentsMargins(15, 0, 0, 0); saveDBMemFileLayout->addWidget(new QLabel(tr("Save DB stored in memory to file every"))); saveDBMemFileLayout->addWidget(saveDBMemFileInterval_); saveDBMemFileLayout->addWidget(new QLabel(tr("minutes"))); saveDBMemFileLayout->addStretch(); QWidget *saveDBMemFileWidget = new QWidget(); saveDBMemFileWidget->setEnabled(false); saveDBMemFileWidget->setLayout(saveDBMemFileLayout); connect(storeDBMemory_, SIGNAL(toggled(bool)), saveDBMemFileWidget, SLOT(setEnabled(bool))); QVBoxLayout *generalLayout = new QVBoxLayout(); generalLayout->addWidget(showSplashScreen_); generalLayout->addWidget(reopenFeedStartup_); generalLayout->addWidget(openNewTabNextToActive_); generalLayout->addWidget(hideFeedsOpenTab_); generalLayout->addWidget(showToggleFeedsTree_); generalLayout->addWidget(defaultIconFeeds_); generalLayout->addWidget(autocollapseFolder_); generalLayout->addWidget(showCloseButtonTab_); generalLayout->addSpacing(20); #if defined(Q_OS_WIN) autoRunEnabled_ = new QCheckBox(tr("Run QuiteRSS at Windows startup")); autoRunSettings_ = new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); bool isAutoRun; if (mainApp->isPortableAppsCom()) isAutoRun = autoRunSettings_->value("QuiteRSSPortable", false).toBool(); else isAutoRun = autoRunSettings_->value("QuiteRSS", false).toBool(); autoRunEnabled_->setChecked(isAutoRun); generalLayout->addWidget(autoRunEnabled_); #endif generalLayout->addWidget(updateCheckEnabled_); generalLayout->addWidget(statisticsEnabled_); generalLayout->addWidget(storeDBMemory_); generalLayout->addWidget(saveDBMemFileWidget); generalLayout->addStretch(1); generalWidget_ = new QFrame(); generalWidget_->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); generalWidget_->setLayout(generalLayout); } /** @brief Create widget "System tray" *----------------------------------------------------------------------------*/ void OptionsDialog::createTraySystemWidget() { showTrayIconBox_ = new QGroupBox(tr("Show system tray icon")); showTrayIconBox_->setCheckable(true); startingTray_ = new QCheckBox(tr("starting QuiteRSS")); minimizingTray_ = new QCheckBox(tr("minimizing QuiteRSS")); closingTray_ = new QCheckBox(tr("closing QuiteRSS")); QVBoxLayout *moveTrayLayout = new QVBoxLayout(); moveTrayLayout->setContentsMargins(15, 0, 5, 10); moveTrayLayout->addWidget(startingTray_); moveTrayLayout->addWidget(minimizingTray_); moveTrayLayout->addWidget(closingTray_); staticIconTray_ = new QRadioButton(tr("Show static icon")); changeIconTray_ = new QRadioButton(tr("Change icon for incoming new news")); newCountTray_ = new QRadioButton(tr("Show count of new news")); unreadCountTray_ = new QRadioButton(tr("Show count of unread news")); QVBoxLayout *behaviorLayout = new QVBoxLayout(); behaviorLayout->setContentsMargins(15, 0, 5, 10); behaviorLayout->addWidget(staticIconTray_); behaviorLayout->addWidget(changeIconTray_); behaviorLayout->addWidget(newCountTray_); behaviorLayout->addWidget(unreadCountTray_); singleClickTray_ = new QCheckBox( tr("Single click instead of double click for show window")); clearStatusNew_ = new QCheckBox(tr("Clear new status when minimize to tray")); emptyWorking_ = new QCheckBox(tr("Empty working set on minimize to tray")); QVBoxLayout *trayLayout = new QVBoxLayout(showTrayIconBox_); #ifndef Q_OS_MAC trayLayout->addWidget(new QLabel(tr("Move to the system tray when:"))); trayLayout->addLayout(moveTrayLayout); #endif trayLayout->addWidget(new QLabel(tr("Tray icon behavior:"))); trayLayout->addLayout(behaviorLayout); #ifndef Q_OS_MAC trayLayout->addWidget(singleClickTray_); trayLayout->addWidget(clearStatusNew_); #endif #if defined(Q_OS_WIN) trayLayout->addWidget(emptyWorking_); #endif trayLayout->addStretch(1); QVBoxLayout *boxTrayLayout = new QVBoxLayout(); boxTrayLayout->addWidget(showTrayIconBox_); traySystemWidget_ = new QFrame(); traySystemWidget_->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); traySystemWidget_->setLayout(boxTrayLayout); } /** @brief Create widget "Network connections" *----------------------------------------------------------------------------*/ void OptionsDialog::createNetworkConnectionsWidget() { directConnectionButton_ = new QRadioButton( tr("Direct connection to the Internet")); systemProxyButton_ = new QRadioButton( tr("System proxy configuration (if available)")); manualProxyButton_ = new QRadioButton(tr("Manual proxy configuration:")); QVBoxLayout *networkConnectionsLayout = new QVBoxLayout(); networkConnectionsLayout->addWidget(directConnectionButton_); networkConnectionsLayout->addWidget(systemProxyButton_); networkConnectionsLayout->addWidget(manualProxyButton_); typeProxy_ = new QComboBox(); typeProxy_->addItems(QStringList() << "HTTP" << "SOCKS5"); editHost_ = new LineEdit(); editPort_ = new LineEdit(); editPort_->setFixedWidth(60); editUser_ = new LineEdit(); editPassword_ = new LineEdit(); editPassword_->setEchoMode(QLineEdit::Password); QHBoxLayout *addrPortLayout = new QHBoxLayout(); addrPortLayout->setMargin(0); addrPortLayout->addWidget(typeProxy_); addrPortLayout->addWidget(new QLabel(tr("Proxy server:"))); addrPortLayout->addWidget(editHost_); addrPortLayout->addWidget(new QLabel(tr("Port:"))); addrPortLayout->addWidget(editPort_); QWidget *addrPortWidget = new QWidget(); addrPortWidget->setLayout(addrPortLayout); QHBoxLayout *userPasswordLayout = new QHBoxLayout(); userPasswordLayout->setMargin(0); userPasswordLayout->addWidget(new QLabel(tr("Username:"))); userPasswordLayout->addWidget(editUser_); userPasswordLayout->addWidget(new QLabel(tr("Password:"))); userPasswordLayout->addWidget(editPassword_); QWidget *userPasswordWidget = new QWidget(); userPasswordWidget->setLayout(userPasswordLayout); QVBoxLayout *manualLayout = new QVBoxLayout(); manualLayout->setMargin(0); manualLayout->addWidget(addrPortWidget); manualLayout->addWidget(userPasswordWidget); manualLayout->addStretch(); manualWidget_ = new QWidget(); manualWidget_->setEnabled(false); // cause proper radio-button isn't set on creation manualWidget_->setLayout(manualLayout); networkConnectionsLayout->addWidget(manualWidget_); networkConnectionsLayout->addSpacing(20); timeoutRequest_ = new QSpinBox(); timeoutRequest_->setRange(0, 300); numberRequests_ = new QSpinBox(); numberRequests_->setRange(1, 10); numberRepeats_ = new QSpinBox(); numberRepeats_->setRange(1, 10); QGridLayout *requestLayout = new QGridLayout(); requestLayout->setColumnStretch(1, 1); requestLayout->setContentsMargins(15, 0, 5, 0); requestLayout->addWidget(new QLabel(tr("Request timeout:")), 0, 0); requestLayout->addWidget(timeoutRequest_, 0, 1, 1, 1, Qt::AlignLeft); requestLayout->addWidget(new QLabel(tr("Number of requests:")), 1, 0); requestLayout->addWidget(numberRequests_, 1, 1, 1, 1, Qt::AlignLeft); requestLayout->addWidget(new QLabel(tr("Number of retries:")), 2, 0); requestLayout->addWidget(numberRepeats_, 2, 1, 1, 1, Qt::AlignLeft); networkConnectionsLayout->addWidget(new QLabel(tr("Options network requests when updating feeds (requires program restart):"))); networkConnectionsLayout->addLayout(requestLayout); networkConnectionsLayout->addStretch(1); networkConnectionsWidget_ = new QFrame(); networkConnectionsWidget_->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); networkConnectionsWidget_->setLayout(networkConnectionsLayout); connect(manualProxyButton_, SIGNAL(toggled(bool)), this, SLOT(manualProxyToggle(bool))); } /** @brief Create widget "Browser" *----------------------------------------------------------------------------*/ void OptionsDialog::createBrowserWidget() { //! tab "General" embeddedBrowserOn_ = new QRadioButton(tr("Use embedded browser")); externalBrowserOn_ = new QRadioButton(tr("Use external browser")); defaultExternalBrowserOn_ = new QRadioButton(tr("Default external browser")); otherExternalBrowserOn_ = new QRadioButton(tr("Following external browser:")); otherExternalBrowserEdit_ = new LineEdit(); otherExternalBrowserButton_ = new QPushButton(tr("Browse...")); autoLoadImages_ = new QCheckBox(tr("Load images")); javaScriptEnable_ = new QCheckBox(tr("Enable JavaScript")); pluginsEnable_ = new QCheckBox(tr("Enable plug-ins")); defaultZoomPages_ = new QSpinBox(); defaultZoomPages_->setMaximum(300); defaultZoomPages_->setMinimum(30); defaultZoomPages_->setSuffix(" %"); openLinkInBackgroundEmbedded_ = new QCheckBox(tr("Open links in embedded browser in background")); openLinkInBackground_ = new QCheckBox(tr("Open links in external browser in background (experimental)")); userStyleBrowserEdit_ = new LineEdit(); QPushButton *userStyleBrowserButton = new QPushButton(tr("Browse...")); connect(userStyleBrowserButton, SIGNAL(clicked()), this, SLOT(selectionUserStyleBrowser())); QGridLayout *browserSelectionLayout = new QGridLayout(); browserSelectionLayout->setContentsMargins(15, 0, 5, 10); browserSelectionLayout->addWidget(embeddedBrowserOn_, 0, 0); browserSelectionLayout->addWidget(externalBrowserOn_, 1, 0); QButtonGroup *browserSelectionBox = new QButtonGroup(); browserSelectionBox->addButton(embeddedBrowserOn_); browserSelectionBox->addButton(externalBrowserOn_); QGridLayout *externalBrowserLayout = new QGridLayout(); externalBrowserLayout->setContentsMargins(15, 0, 5, 10); externalBrowserLayout->addWidget(defaultExternalBrowserOn_, 0, 0); externalBrowserLayout->addWidget(otherExternalBrowserOn_, 1, 0); externalBrowserLayout->addWidget(otherExternalBrowserEdit_, 2, 0); externalBrowserLayout->addWidget(otherExternalBrowserButton_, 2, 1, Qt::AlignRight); QButtonGroup *externalBrowserBox = new QButtonGroup(); externalBrowserBox->addButton(defaultExternalBrowserOn_); externalBrowserBox->addButton(otherExternalBrowserOn_); QHBoxLayout *zoomLayout = new QHBoxLayout(); zoomLayout->addWidget(new QLabel(tr("Default zoom on pages:"))); zoomLayout->addWidget(defaultZoomPages_); zoomLayout->addStretch(); QVBoxLayout *contentBrowserLayout = new QVBoxLayout(); contentBrowserLayout->setContentsMargins(15, 0, 5, 10); contentBrowserLayout->addWidget(autoLoadImages_); contentBrowserLayout->addWidget(javaScriptEnable_); contentBrowserLayout->addWidget(pluginsEnable_); contentBrowserLayout->addLayout(zoomLayout); QGridLayout *userStyleBrowserLayout = new QGridLayout(); userStyleBrowserLayout->setContentsMargins(15, 0, 5, 10); userStyleBrowserLayout->addWidget(userStyleBrowserEdit_, 0, 0); userStyleBrowserLayout->addWidget(userStyleBrowserButton, 0, 1, Qt::AlignRight); QVBoxLayout *browserLayoutV = new QVBoxLayout(); browserLayoutV->setMargin(10); browserLayoutV->addWidget(new QLabel(tr("Browser selection:"))); browserLayoutV->addLayout(browserSelectionLayout); browserLayoutV->addWidget(new QLabel(tr("External browser:"))); browserLayoutV->addLayout(externalBrowserLayout); browserLayoutV->addWidget(new QLabel(tr("Content:"))); browserLayoutV->addLayout(contentBrowserLayout); browserLayoutV->addWidget(new QLabel(tr("User style sheet:"))); browserLayoutV->addLayout(userStyleBrowserLayout); browserLayoutV->addWidget(openLinkInBackgroundEmbedded_); browserLayoutV->addWidget(openLinkInBackground_); browserLayoutV->addStretch(); QWidget *generalBrowserWidget = new QWidget(); generalBrowserWidget->setLayout(browserLayoutV); connect(otherExternalBrowserOn_, SIGNAL(toggled(bool)), otherExternalBrowserEdit_, SLOT(setEnabled(bool))); connect(otherExternalBrowserOn_, SIGNAL(toggled(bool)), otherExternalBrowserButton_, SLOT(setEnabled(bool))); otherExternalBrowserOn_->setChecked(true); connect(otherExternalBrowserButton_, SIGNAL(clicked()), this, SLOT(selectionBrowser())); #if defined(Q_OS_OS2) otherExternalBrowserOn_->setVisible(false); otherExternalBrowserEdit_->setVisible(false); otherExternalBrowserButton_->setVisible(false); #endif //! tab "History" maxPagesInCache_ = new QSpinBox(); maxPagesInCache_->setRange(0, 20); QHBoxLayout *historyLayout1 = new QHBoxLayout(); historyLayout1->addWidget(new QLabel(tr("Maximum pages in cache"))); historyLayout1->addWidget(maxPagesInCache_); historyLayout1->addStretch(); dirDiskCacheEdit_ = new LineEdit(); dirDiskCacheButton_ = new QPushButton(tr("Browse...")); connect(dirDiskCacheButton_, SIGNAL(clicked()), this, SLOT(selectionDirDiskCache())); QHBoxLayout *historyLayout2 = new QHBoxLayout(); historyLayout2->addWidget(new QLabel(tr("Store cache in:"))); historyLayout2->addWidget(dirDiskCacheEdit_, 1); historyLayout2->addWidget(dirDiskCacheButton_); maxDiskCache_ = new QSpinBox(); maxDiskCache_->setRange(10, 300); QHBoxLayout *historyLayout3 = new QHBoxLayout(); historyLayout3->addWidget(new QLabel(tr("Maximum size of disk cache"))); historyLayout3->addWidget(maxDiskCache_); historyLayout3->addWidget(new QLabel(tr("MB")), 1); QVBoxLayout *historyLayout4 = new QVBoxLayout(); historyLayout4->addLayout(historyLayout2); historyLayout4->addLayout(historyLayout3); diskCacheOn_ = new QGroupBox(tr("Use disk cache")); diskCacheOn_->setCheckable(true); diskCacheOn_->setChecked(false); diskCacheOn_->setLayout(historyLayout4); saveCookies_ = new QRadioButton(tr("Allow local data to be set")); deleteCookiesOnClose_ = new QRadioButton(tr("Keep local data only until quit application")); blockCookies_ = new QRadioButton(tr("Block sites from setting any data")); clearCookies_ = new QPushButton(tr("Clear")); connect(clearCookies_, SIGNAL(clicked()), mainApp->cookieJar(), SLOT(clearCookies())); QGridLayout *cookiesLayout = new QGridLayout(); cookiesLayout->setContentsMargins(15, 0, 5, 10); cookiesLayout->addWidget(saveCookies_, 0, 0); cookiesLayout->addWidget(deleteCookiesOnClose_, 1, 0); cookiesLayout->addWidget(blockCookies_, 2, 0); cookiesLayout->addWidget(clearCookies_, 3, 0, Qt::AlignLeft); QButtonGroup *cookiesBox = new QButtonGroup(); cookiesBox->addButton(saveCookies_); cookiesBox->addButton(deleteCookiesOnClose_); cookiesBox->addButton(blockCookies_); QVBoxLayout *historyMainLayout = new QVBoxLayout(); historyMainLayout->setMargin(10); historyMainLayout->addLayout(historyLayout1); historyMainLayout->addWidget(diskCacheOn_); historyMainLayout->addSpacing(10); historyMainLayout->addWidget(new QLabel(tr("Cookies:"))); historyMainLayout->addLayout(cookiesLayout); historyMainLayout->addStretch(); QWidget *historyBrowserWidget_ = new QWidget(); historyBrowserWidget_->setLayout(historyMainLayout); //! tab "Click to Flash" QLabel *c2fInfo = new QLabel(tr("Click To Flash is a plugin which blocks auto loading of " "Flash content at page. You can always load it manually " "by clicking on the Flash play icon.")); c2fInfo->setWordWrap(true); c2fEnabled_ = new QCheckBox(tr("Use Click to Flash")); c2fEnabled_->setChecked(false); c2fWhitelist_ = new QTreeWidget(this); c2fWhitelist_->setObjectName("c2fWhiteList_"); c2fWhitelist_->setRootIsDecorated(false); c2fWhitelist_->setColumnCount(1); QStringList treeItem; treeItem << "Whitelist"; c2fWhitelist_->setHeaderLabels(treeItem); QPushButton *addButton = new QPushButton(tr("Add..."), this); connect(addButton, SIGNAL(clicked()), this, SLOT(addWhitelist())); QPushButton *removeButton = new QPushButton(tr("Remove..."), this); connect(removeButton, SIGNAL(clicked()), this, SLOT(removeWhitelist())); QVBoxLayout *click2FlashLayout1 = new QVBoxLayout(); click2FlashLayout1->addWidget(addButton); click2FlashLayout1->addWidget(removeButton); click2FlashLayout1->addStretch(1); QHBoxLayout *click2FlashLayout2 = new QHBoxLayout(); click2FlashLayout2->setMargin(0); click2FlashLayout2->addWidget(c2fWhitelist_, 1); click2FlashLayout2->addLayout(click2FlashLayout1); QWidget *c2fWhitelistWidget = new QWidget(this); c2fWhitelistWidget->setLayout(click2FlashLayout2); c2fWhitelistWidget->setEnabled(false); connect(c2fEnabled_, SIGNAL(toggled(bool)), c2fWhitelistWidget, SLOT(setEnabled(bool))); QVBoxLayout *click2FlashLayout = new QVBoxLayout(); click2FlashLayout->setMargin(10); click2FlashLayout->addWidget(c2fInfo); click2FlashLayout->addWidget(c2fEnabled_); click2FlashLayout->addWidget(c2fWhitelistWidget, 1); QWidget *click2FlashWidget_ = new QWidget(this); click2FlashWidget_->setLayout(click2FlashLayout); c2fEnabled_->setChecked(mainApp->c2fIsEnabled()); foreach(const QString & site, mainApp->c2fGetWhitelist()) { QTreeWidgetItem* item = new QTreeWidgetItem(c2fWhitelist_); item->setText(0, site); } //! tab "Downloads" downloadLocationEdit_ = new LineEdit(); QPushButton *downloadLocationButton = new QPushButton(tr("Browse...")); connect(downloadLocationButton, SIGNAL(clicked()), this, SLOT(selectionDownloadLocation())); askDownloadLocation_ = new QCheckBox(tr("Ask where to save each file before downloading")); QGridLayout *downLocationLayout = new QGridLayout(); downLocationLayout->setContentsMargins(15, 0, 5, 10); downLocationLayout->addWidget(downloadLocationEdit_, 0, 0); downLocationLayout->addWidget(downloadLocationButton, 0, 1, Qt::AlignRight); downLocationLayout->addWidget(askDownloadLocation_, 1, 0); QVBoxLayout *downloadsLayout = new QVBoxLayout(); downloadsLayout->setMargin(10); downloadsLayout->addWidget(new QLabel(tr("Download location:"))); downloadsLayout->addLayout(downLocationLayout); downloadsLayout->addStretch(); QWidget *downloadsWidget = new QWidget(this); downloadsWidget->setLayout(downloadsLayout); browserWidget_ = new QTabWidget(); browserWidget_->addTab(generalBrowserWidget, tr("General")); browserWidget_->addTab(historyBrowserWidget_, tr("History")); browserWidget_->addTab(click2FlashWidget_, tr("Click to Flash")); browserWidget_->addTab(downloadsWidget, tr("Downloads")); } /** @brief Create windet "Feeds" *----------------------------------------------------------------------------*/ void OptionsDialog::createFeedsWidget() { //! tab "General" updateFeedsStartUp_ = new QCheckBox( tr("Automatically update the feeds on startup")); updateFeedsEnable_ = new QCheckBox(tr("Automatically update the feeds every")); updateFeedsInterval_ = new QSpinBox(); updateFeedsInterval_->setEnabled(false); updateFeedsInterval_->setRange(1, 9999); connect(updateFeedsEnable_, SIGNAL(toggled(bool)), updateFeedsInterval_, SLOT(setEnabled(bool))); updateIntervalType_ = new QComboBox(this); updateIntervalType_->setEnabled(false); QStringList intervalList; intervalList << tr("seconds") << tr("minutes") << tr("hours"); updateIntervalType_->addItems(intervalList); connect(updateFeedsEnable_, SIGNAL(toggled(bool)), updateIntervalType_, SLOT(setEnabled(bool))); QHBoxLayout *updateFeedsLayout = new QHBoxLayout(); updateFeedsLayout->setMargin(0); updateFeedsLayout->addWidget(updateFeedsEnable_); updateFeedsLayout->addWidget(updateFeedsInterval_); updateFeedsLayout->addWidget(updateIntervalType_); updateFeedsLayout->addStretch(); positionLastNews_ = new QRadioButton(tr("Set focus on the last opened news")); positionFirstNews_ = new QRadioButton(tr("Set focus at the top of news list")); positionUnreadNews_ = new QRadioButton(tr("Set focus on the unread news")); openNewsWebViewOn_ = new QCheckBox(tr("Open the news")); nottoOpenNews_ = new QRadioButton(tr("Nothing to do")); connect(nottoOpenNews_, SIGNAL(toggled(bool)), openNewsWebViewOn_, SLOT(setDisabled(bool))); QGridLayout *openingFeedsLayout = new QGridLayout(); openingFeedsLayout->setContentsMargins(15, 0, 0, 10); openingFeedsLayout->setColumnStretch(1, 1); openingFeedsLayout->addWidget(positionLastNews_, 0, 0, 1, 1); openingFeedsLayout->addWidget(openNewsWebViewOn_, 0, 1, 1, 1); openingFeedsLayout->addWidget(positionFirstNews_, 1, 0, 1, 1); openingFeedsLayout->addWidget(positionUnreadNews_, 2, 0, 1, 1); openingFeedsLayout->addWidget(nottoOpenNews_, 3, 0, 1, 1); markIdenticalNewsRead_ = new QCheckBox(tr("Automatically mark identical news as read")); QVBoxLayout *generalFeedsLayout = new QVBoxLayout(); generalFeedsLayout->addWidget(updateFeedsStartUp_); generalFeedsLayout->addLayout(updateFeedsLayout); generalFeedsLayout->addSpacing(10); generalFeedsLayout->addWidget(new QLabel(tr("Action on feed opening:"))); generalFeedsLayout->addLayout(openingFeedsLayout); generalFeedsLayout->addWidget(markIdenticalNewsRead_); generalFeedsLayout->addStretch(); QWidget *generalFeedsWidget = new QWidget(); generalFeedsWidget->setLayout(generalFeedsLayout); //! tab "Display" QStringList itemList; itemList << "31.12.99" << "31.12.1999" << QString("31. %1. 1999").arg(tr("Dec")) << QString("31. %1 1999").arg(tr("December")) << "99-12-31" << "1999-12-31" << "12/31/1999"; formatDate_ = new QComboBox(this); formatDate_->addItems(itemList); formatDate_->setItemData(0, "dd.MM.yy"); formatDate_->setItemData(1, "dd.MM.yyyy"); formatDate_->setItemData(2, "dd. MMM. yyyy"); formatDate_->setItemData(3, "dd. MMMM yyyy"); formatDate_->setItemData(4, "yy-MM-dd"); formatDate_->setItemData(5, "yyyy-MM-dd"); formatDate_->setItemData(6, "MM/dd/yyyy"); itemList.clear(); itemList << "13:37" << "13:37:09" << "01:37 PM"<< "01:37:09 PM"; formatTime_ = new QComboBox(this); formatTime_->addItems(itemList); formatTime_->setItemData(0, "hh:mm"); formatTime_->setItemData(1, "hh:mm:ss"); formatTime_->setItemData(2, "hh:mm AP"); formatTime_->setItemData(3, "hh:mm:ss AP"); QHBoxLayout *formatDateLayout = new QHBoxLayout(); formatDateLayout->setMargin(0); formatDateLayout->addWidget(new QLabel(tr("Display format for date:"))); formatDateLayout->addWidget(formatDate_); formatDateLayout->addSpacing(10); formatDateLayout->addWidget(new QLabel(tr("time:"))); formatDateLayout->addWidget(formatTime_); formatDateLayout->addStretch(); alternatingRowColorsNews_ = new QCheckBox(tr("Alternating row background colors")); simplifiedDateTime_ = new QCheckBox(tr("Simplified representation of date and time")); itemList.clear(); itemList << tr("Show All") << tr("Show New") << tr("Show Unread") << tr("Show Starred") << tr("Show Not Starred") << tr("Show Unread or Starred") << tr("Show Last Day") << tr("Show Last 7 Days"); mainNewsFilter_ = new QComboBox(this); mainNewsFilter_->addItems(itemList); mainNewsFilter_->setItemData(0, "filterNewsAll_"); mainNewsFilter_->setItemData(1, "filterNewsNew_"); mainNewsFilter_->setItemData(2, "filterNewsUnread_"); mainNewsFilter_->setItemData(3, "filterNewsStar_"); mainNewsFilter_->setItemData(4, "filterNewsNotStarred_"); mainNewsFilter_->setItemData(5, "filterNewsUnreadStar_"); mainNewsFilter_->setItemData(6, "filterNewsLastDay_"); mainNewsFilter_->setItemData(7, "filterNewsLastWeek_"); QHBoxLayout *mainNewsFilterLayout = new QHBoxLayout(); mainNewsFilterLayout->setMargin(0); mainNewsFilterLayout->addWidget(new QLabel(tr("Default news filter:"))); mainNewsFilterLayout->addWidget(mainNewsFilter_); mainNewsFilterLayout->addStretch(); styleSheetNewsEdit_ = new LineEdit(); QPushButton *styleSheetNewsButton = new QPushButton(tr("Browse...")); connect(styleSheetNewsButton, SIGNAL(clicked()), this, SLOT(selectionUserStyleNews())); QGridLayout *styleSheetNewsLayout = new QGridLayout(); styleSheetNewsLayout->setContentsMargins(15, 0, 5, 10); styleSheetNewsLayout->addWidget(styleSheetNewsEdit_, 0, 0); styleSheetNewsLayout->addWidget(styleSheetNewsButton, 0, 1, Qt::AlignRight); showDescriptionNews_ = new QCheckBox(tr("Show news description instead of loading web page")); QVBoxLayout *displayFeedsLayout = new QVBoxLayout(); displayFeedsLayout->addWidget(alternatingRowColorsNews_); displayFeedsLayout->addSpacing(10); displayFeedsLayout->addWidget(simplifiedDateTime_); displayFeedsLayout->addLayout(formatDateLayout); displayFeedsLayout->addSpacing(10); displayFeedsLayout->addLayout(mainNewsFilterLayout); displayFeedsLayout->addSpacing(10); displayFeedsLayout->addWidget(new QLabel(tr("Style sheet for news:"))); displayFeedsLayout->addLayout(styleSheetNewsLayout); displayFeedsLayout->addWidget(showDescriptionNews_); displayFeedsLayout->addStretch(); QWidget *displayFeedsWidget = new QWidget(); displayFeedsWidget->setLayout(displayFeedsLayout); //! tab "Reading" QVBoxLayout* readingMainLayout = new QVBoxLayout(); { markNewsReadOn_ = new QGroupBox(tr("Mark news as read:")); markNewsReadOn_->setCheckable(true); { QVBoxLayout* radioLayout = new QVBoxLayout(); { QHBoxLayout* curLayout = new QHBoxLayout(); markCurNewsRead_ = new QRadioButton(tr("on selecting. With timeout")); markNewsReadTime_ = new QSpinBox(); markNewsReadTime_->setEnabled(false); markNewsReadTime_->setRange(0, 100); connect(markCurNewsRead_, SIGNAL(toggled(bool)), markNewsReadTime_, SLOT(setEnabled(bool))); curLayout->setMargin(0); curLayout->addWidget(markCurNewsRead_); curLayout->addWidget(markNewsReadTime_); curLayout->addWidget(new QLabel(tr("seconds"))); curLayout->addStretch(); radioLayout->addLayout(curLayout); } markPrevNewsRead_ = new QRadioButton(tr("after switching to another news")); radioLayout->addWidget(markPrevNewsRead_); markNewsReadOn_->setLayout(radioLayout); } markReadSwitchingFeed_ = new QCheckBox(tr("Mark displayed news as read when switching feeds")); markReadClosingTab_ = new QCheckBox(tr("Mark displayed news as read when closing tab")); markReadMinimize_ = new QCheckBox(tr("Mark displayed news as read on minimize")); QGridLayout* curLayout = new QGridLayout(); notDeleteStarred_ = new QCheckBox(tr("starred news")); notDeleteLabeled_ = new QCheckBox(tr("labeled news")); curLayout->setContentsMargins(15, 0, 0, 10); curLayout->addWidget(notDeleteStarred_, 0, 0, 1, 1); curLayout->addWidget(notDeleteLabeled_, 1, 0, 1, 1); changeBehaviorActionNUN_ = new QCheckBox(tr("Change behavior of action 'Next Unread News'")); QWidget* clickActionWidgets = createClickActionWidgets(singleClickAction, doubleClickAction, middleClickAction); readingMainLayout->addWidget(markNewsReadOn_); readingMainLayout->addWidget(markReadSwitchingFeed_); readingMainLayout->addWidget(markReadClosingTab_); readingMainLayout->addWidget(markReadMinimize_); readingMainLayout->addSpacing(10); readingMainLayout->addWidget(new QLabel(tr("Prevent accidental deletion of:"))); readingMainLayout->addLayout(curLayout); readingMainLayout->addWidget(changeBehaviorActionNUN_); readingMainLayout->addSpacing(10); readingMainLayout->addWidget(clickActionWidgets); readingMainLayout->addStretch(); } QWidget* readingFeedsWidget = new QWidget(); readingFeedsWidget->setLayout(readingMainLayout); //! tab "Clean Up" QWidget *cleanUpFeedsWidget = new QWidget(); cleanupOnShutdownBox_ = new QGroupBox(tr("Enable cleanup on shutdown")); cleanupOnShutdownBox_->setCheckable(true); dayCleanUpOn_ = new QCheckBox(tr("Maximum age of news in days to keep:")); maxDayCleanUp_ = new QSpinBox(); maxDayCleanUp_->setEnabled(false); maxDayCleanUp_->setRange(0, 9999); connect(dayCleanUpOn_, SIGNAL(toggled(bool)), maxDayCleanUp_, SLOT(setEnabled(bool))); newsCleanUpOn_ = new QCheckBox(tr("Maximum number of news to keep:")); maxNewsCleanUp_ = new QSpinBox(); maxNewsCleanUp_->setEnabled(false); maxNewsCleanUp_->setRange(0, 9999); connect(newsCleanUpOn_, SIGNAL(toggled(bool)), maxNewsCleanUp_, SLOT(setEnabled(bool))); readCleanUp_ = new QCheckBox(tr("Delete read news")); neverUnreadCleanUp_ = new QCheckBox(tr("Never delete unread news")); neverStarCleanUp_ = new QCheckBox(tr("Never delete starred news")); neverLabelCleanUp_ = new QCheckBox(tr("Never delete labeled news")); cleanUpDeleted_ = new QCheckBox(tr("Clean up 'Deleted'")); optimizeDB_ = new QCheckBox(tr("Enable DB optimization (slower shutdown)")); QGridLayout *cleanUpFeedsLayout = new QGridLayout(); cleanUpFeedsLayout->setColumnStretch(1, 1); cleanUpFeedsLayout->addWidget(dayCleanUpOn_, 0, 0, 1, 1); cleanUpFeedsLayout->addWidget(maxDayCleanUp_, 0, 1, 1, 1, Qt::AlignLeft); cleanUpFeedsLayout->addWidget(newsCleanUpOn_, 1, 0, 1, 1); cleanUpFeedsLayout->addWidget(maxNewsCleanUp_, 1, 1, 1, 1, Qt::AlignLeft); cleanUpFeedsLayout->addWidget(readCleanUp_, 2, 0, 1, 1); cleanUpFeedsLayout->addWidget(neverUnreadCleanUp_, 3, 0, 1, 1); cleanUpFeedsLayout->addWidget(neverStarCleanUp_, 4, 0, 1, 1); cleanUpFeedsLayout->addWidget(neverLabelCleanUp_, 5, 0, 1, 1); QVBoxLayout *cleanUpFeedsLayout2 = new QVBoxLayout(); cleanUpFeedsLayout2->addWidget(cleanUpDeleted_); cleanUpFeedsLayout2->addWidget(optimizeDB_); QVBoxLayout *cleanUpFeedsLayout3 = new QVBoxLayout(cleanupOnShutdownBox_); cleanUpFeedsLayout3->addLayout(cleanUpFeedsLayout); cleanUpFeedsLayout3->addSpacing(10); cleanUpFeedsLayout3->addLayout(cleanUpFeedsLayout2); cleanUpFeedsLayout3->addStretch(); QVBoxLayout *boxCleanUpFeedsLayout = new QVBoxLayout(cleanUpFeedsWidget); boxCleanUpFeedsLayout->addWidget(cleanupOnShutdownBox_); feedsWidget_ = new QTabWidget(); feedsWidget_->addTab(generalFeedsWidget, tr("General")); feedsWidget_->addTab(displayFeedsWidget, tr("Display")); feedsWidget_->addTab(readingFeedsWidget, tr("Reading")); feedsWidget_->addTab(cleanUpFeedsWidget, tr("Clean Up")); } QWidget* OptionsDialog::createClickActionWidgets(QComboBox*& outSingleClickAction, QComboBox*& outDoubleClickAction, QComboBox*& outMiddleClickAction, bool bAddDefaultValue/*=false*/) { QGroupBox* returnVal = new QGroupBox(tr("Action mouse on news opening:")); { QHBoxLayout* actionLayoutLeft = new QHBoxLayout(); QHBoxLayout* actionLayoutRight = new QHBoxLayout(); { QVBoxLayout* namesLayout = new QVBoxLayout(); QVBoxLayout* valuesLayout = new QVBoxLayout(); { struct Local { static void setupCombo(QComboBox*& outCombo, bool bAddDefaultValue) { outCombo = new QComboBox(); if (bAddDefaultValue) { outCombo->addItem("Default", (int)ENewsClickAction::NCA_Default); outCombo->insertSeparator(outCombo->count()); } outCombo->addItem("Nothing", (int)ENewsClickAction::NCA_Nothing); outCombo->insertSeparator(outCombo->count()); outCombo->addItem("Show News Description", (int)ENewsClickAction::NCA_Description); outCombo->addItem("Show News Description in New Tab", (int)ENewsClickAction::NCA_DescriptionNewTab); outCombo->addItem("Show News Description in New Tab (Background)", (int)ENewsClickAction::NCA_DescriptionBkgTab); outCombo->insertSeparator(outCombo->count()); outCombo->addItem("Load Web Page", (int)ENewsClickAction::NCA_WebPage); outCombo->addItem("Load Web Page in New Tab", (int)ENewsClickAction::NCA_WebPageNewTab); outCombo->addItem("Load Web Page in New Tab (Background)", (int)ENewsClickAction::NCA_WebPageBkgTab); outCombo->insertSeparator(outCombo->count()); outCombo->addItem("Open in External Browser", (int)ENewsClickAction::NCA_ExternalBrowser); } }; Local::setupCombo(outSingleClickAction, bAddDefaultValue); Local::setupCombo(outDoubleClickAction, bAddDefaultValue); Local::setupCombo(outMiddleClickAction, bAddDefaultValue); namesLayout->addWidget(new QLabel(tr("Single Click:"))); valuesLayout->addWidget(outSingleClickAction); namesLayout->addWidget(new QLabel(tr("Double Click:"))); valuesLayout->addWidget(outDoubleClickAction); namesLayout->addWidget(new QLabel(tr("Middle Click:"))); valuesLayout->addWidget(outMiddleClickAction); } actionLayoutLeft->addLayout(namesLayout); actionLayoutRight->addLayout(valuesLayout); } actionLayoutRight->addStretch(); actionLayoutLeft->addLayout(actionLayoutRight); returnVal->setLayout(actionLayoutLeft); } return returnVal; } /** @brief Create widget "Labels" *----------------------------------------------------------------------------*/ void OptionsDialog::createLabelsWidget() { labelsTree_ = new QTreeWidget(this); labelsTree_->setObjectName("labelsTree_"); labelsTree_->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); labelsTree_->setColumnCount(5); labelsTree_->setColumnHidden(0, true); labelsTree_->setColumnHidden(2, true); labelsTree_->setColumnHidden(3, true); labelsTree_->setColumnHidden(4, true); labelsTree_->header()->hide(); newLabelButton_ = new QPushButton(tr("New..."), this); connect(newLabelButton_, SIGNAL(clicked()), this, SLOT(newLabel())); editLabelButton_ = new QPushButton(tr("Edit..."), this); editLabelButton_->setEnabled(false); connect(editLabelButton_, SIGNAL(clicked()), this, SLOT(editLabel())); deleteLabelButton_ = new QPushButton(tr("Delete..."), this); deleteLabelButton_->setEnabled(false); connect(deleteLabelButton_, SIGNAL(clicked()), this, SLOT(deleteLabel())); moveUpLabelButton_ = new QPushButton(tr("Move up"), this); moveUpLabelButton_->setEnabled(false); connect(moveUpLabelButton_, SIGNAL(clicked()), this, SLOT(moveUpLabel())); moveDownLabelButton_ = new QPushButton(tr("Move down"), this); moveDownLabelButton_->setEnabled(false); connect(moveDownLabelButton_, SIGNAL(clicked()), this, SLOT(moveDownLabel())); QVBoxLayout *buttonsLayout = new QVBoxLayout(); buttonsLayout->addWidget(newLabelButton_); buttonsLayout->addWidget(editLabelButton_); buttonsLayout->addWidget(deleteLabelButton_); buttonsLayout->addSpacing(10); buttonsLayout->addWidget(moveUpLabelButton_); buttonsLayout->addWidget(moveDownLabelButton_); buttonsLayout->addStretch(); QHBoxLayout *labelsLayout = new QHBoxLayout(); labelsLayout->setMargin(0); labelsLayout->addWidget(labelsTree_); labelsLayout->addLayout(buttonsLayout); labelsWidget_ = new QWidget(this); labelsWidget_->setLayout(labelsLayout); connect(labelsTree_, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(slotCurrentLabelChanged(QTreeWidgetItem*,QTreeWidgetItem*))); connect(labelsTree_, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(editLabel())); loadLabelsOk_ = false; } /** @brief Create widget "Notifier" *----------------------------------------------------------------------------*/ void OptionsDialog::createNotifierWidget() { showNotifyOn_ = new QGroupBox(tr("Display notification for incoming news")); showNotifyOn_->setCheckable(true); showNotifyOn_->setChecked(false); screenNotify_ = new QComboBox(); screenNotify_->addItem("-1"); for (int i = 0; i < QApplication::desktop()->screenCount(); ++i) { screenNotify_->addItem(QString::number(i)); } screenNotify_->setCurrentIndex(1); positionNotify_ = new QComboBox(); QStringList positionList; positionList << tr("Top Left") << tr("Top Right") << tr("Bottom Left") << tr("Bottom Right"); positionNotify_->addItems(positionList); fullscreenModeNotify_ = new QCheckBox(tr("Do not show notification in fullscreen mode")); #if !defined(Q_OS_WIN) fullscreenModeNotify_->hide(); #endif showNotifyInactiveApp_ = new QCheckBox(tr("Show when inactive main window")); transparencyNotify_ = new QSpinBox(); transparencyNotify_->setRange(0, 100); countShowNewsNotify_ = new QSpinBox(); countShowNewsNotify_->setRange(1, 30); widthTitleNewsNotify_ = new QSpinBox(); widthTitleNewsNotify_->setRange(50, 500); timeShowNewsNotify_ = new QSpinBox(); timeShowNewsNotify_->setRange(0, 99999); QPushButton *showNotifer = new QPushButton(tr("Review")); connect(showNotifer, SIGNAL(clicked()), this, SLOT(showNotification())); QHBoxLayout *notifierLayout1 = new QHBoxLayout(); notifierLayout1->addWidget(new QLabel(tr("Screen"))); notifierLayout1->addWidget(screenNotify_); notifierLayout1->addSpacing(10); notifierLayout1->addWidget(new QLabel(tr("Position"))); notifierLayout1->addWidget(positionNotify_); notifierLayout1->addStretch(1); notifierLayout1->addWidget(showNotifer); QGridLayout *notifierLayout2 = new QGridLayout(); notifierLayout2->setColumnStretch(2, 1); notifierLayout2->addWidget(new QLabel(tr("Transparency")), 0, 0); notifierLayout2->addWidget(transparencyNotify_, 0, 1); notifierLayout2->addWidget(new QLabel("%"), 0, 2); notifierLayout2->addWidget(new QLabel(tr("Show maximum of")), 1, 0); notifierLayout2->addWidget(countShowNewsNotify_, 1, 1); notifierLayout2->addWidget(new QLabel(tr("item on page notification")), 1, 2); notifierLayout2->addWidget(new QLabel(tr("Width list items")), 2, 0); notifierLayout2->addWidget(widthTitleNewsNotify_, 2, 1); notifierLayout2->addWidget(new QLabel(tr("pixels")), 2, 2); notifierLayout2->addWidget(new QLabel(tr("Close notification after")), 3, 0); notifierLayout2->addWidget(timeShowNewsNotify_, 3, 1); notifierLayout2->addWidget(new QLabel(tr("seconds")), 3, 2); showTitlesFeedsNotify_ = new QCheckBox(tr("Show titles feeds")); showIconFeedNotify_ = new QCheckBox(tr("Show icon feed")); showButtonMarkAllNotify_ = new QCheckBox(tr("Show button 'Mark All News Read'")); showButtonMarkReadNotify_ = new QCheckBox(tr("Show button 'Mark Read/Unread'")); showButtonExBrowserNotify_ = new QCheckBox(tr("Show button 'Open in External Browser'")); showButtonDeleteNotify_ = new QCheckBox(tr("Show button 'Delete News'")); QVBoxLayout *notifierLayout3 = new QVBoxLayout(); notifierLayout3->addWidget(showTitlesFeedsNotify_); notifierLayout3->addWidget(showIconFeedNotify_); notifierLayout3->addWidget(showButtonMarkAllNotify_); notifierLayout3->addWidget(showButtonMarkReadNotify_); notifierLayout3->addWidget(showButtonExBrowserNotify_); notifierLayout3->addWidget(showButtonDeleteNotify_); onlySelectedFeeds_ = new QCheckBox(tr("Only show selected feeds:")); QPushButton *feedsNotiferButton = new QPushButton(tr("Feeds")); feedsNotiferButton->setEnabled(false); QHBoxLayout *onlySelectedFeedsLayout = new QHBoxLayout(); onlySelectedFeedsLayout->addWidget(onlySelectedFeeds_); onlySelectedFeedsLayout->addWidget(feedsNotiferButton); onlySelectedFeedsLayout->addStretch(1); createFeedsNotifierDlg(); connect(onlySelectedFeeds_, SIGNAL(toggled(bool)), feedsNotiferButton, SLOT(setEnabled(bool))); connect(feedsNotiferButton, SIGNAL(clicked()), feedsNotifierDlg_, SLOT(exec())); QVBoxLayout *notificationLayoutV = new QVBoxLayout(); notificationLayoutV->setMargin(10); notificationLayoutV->addLayout(notifierLayout1); notificationLayoutV->addWidget(fullscreenModeNotify_); notificationLayoutV->addWidget(showNotifyInactiveApp_); notificationLayoutV->addSpacing(10); notificationLayoutV->addLayout(notifierLayout2); notificationLayoutV->addSpacing(10); notificationLayoutV->addLayout(notifierLayout3); notificationLayoutV->addSpacing(10); notificationLayoutV->addLayout(onlySelectedFeedsLayout); notificationLayoutV->addStretch(1); showNotifyOn_->setLayout(notificationLayoutV); QWidget *notificationWidget = new QWidget(); QVBoxLayout *notificationLayout = new QVBoxLayout(notificationWidget); notificationLayout->addWidget(showNotifyOn_); soundNotifyBox_ = new QGroupBox(tr("Play sound for incoming new news")); soundNotifyBox_->setCheckable(true); soundNotifyBox_->setChecked(false); editSoundNotifer_ = new LineEdit(); selectionSoundNotifer_ = new QPushButton(tr("Browse...")); playSoundNotifer_ = new QPushButton(tr("Play")); connect(selectionSoundNotifer_, SIGNAL(clicked()), this, SLOT(selectionSoundNotifer())); connect(playSoundNotifer_, SIGNAL(clicked()), this, SLOT(slotPlaySoundNotifer())); connect(this, SIGNAL(signalPlaySound(QString)), parent(), SLOT(slotPlaySound(QString))); QHBoxLayout *soundNotifyLayoutH = new QHBoxLayout(); soundNotifyLayoutH->addWidget(editSoundNotifer_, 1); soundNotifyLayoutH->addWidget(selectionSoundNotifer_); soundNotifyLayoutH->addWidget(playSoundNotifer_); QVBoxLayout *soundNotifyLayout = new QVBoxLayout(soundNotifyBox_); soundNotifyLayout->setMargin(10); soundNotifyLayout->addLayout(soundNotifyLayoutH); soundNotifyLayout->addStretch(1); QWidget *soundNotifyWidget = new QWidget(); QVBoxLayout *boxCleanUpFeedsLayout = new QVBoxLayout(soundNotifyWidget); boxCleanUpFeedsLayout->addWidget(soundNotifyBox_); notifierWidget_ = new QTabWidget(); notifierWidget_->addTab(notificationWidget, tr("Notification")); notifierWidget_->addTab(soundNotifyWidget, tr("Sound")); loadNotifierOk_ = false; } /** @brief Create dialog "Feeds" for Notifier *----------------------------------------------------------------------------*/ void OptionsDialog::createFeedsNotifierDlg() { feedsNotifierDlg_ = new Dialog(this); feedsNotifierDlg_->setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); feedsNotifierDlg_->setWindowTitle(tr("Selection of feeds")); feedsNotifierDlg_->setMinimumSize(300, 300); feedsTreeNotify_ = new QTreeWidget(this); feedsTreeNotify_->setObjectName("feedsTreeNotify_"); feedsTreeNotify_->setColumnCount(2); feedsTreeNotify_->setColumnHidden(1, true); feedsTreeNotify_->header()->hide(); itemNotChecked_ = false; QStringList treeItem; treeItem << "Feeds" << "Id"; feedsTreeNotify_->setHeaderLabels(treeItem); treeItem.clear(); treeItem << tr("All Feeds") << "0"; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setCheckState(0, Qt::Checked); feedsTreeNotify_->addTopLevelItem(treeWidgetItem); feedsNotifierDlg_->pageLayout->addWidget(feedsTreeNotify_); feedsNotifierDlg_->buttonBox->addButton(QDialogButtonBox::Close); connect(feedsTreeNotify_, SIGNAL(itemChanged(QTreeWidgetItem*,int)), this, SLOT(feedsTreeNotifyItemChanged(QTreeWidgetItem*,int))); } /** @brief Create widget "Passwords" *----------------------------------------------------------------------------*/ void OptionsDialog::createPasswordsWidget() { passTree_ = new QTreeWidget(this); passTree_->setObjectName("labelsTree_"); passTree_->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); passTree_->setColumnCount(4); passTree_->setColumnHidden(0, true); passTree_->setColumnHidden(3, true); passTree_->setColumnWidth(1, 250); passTree_->header()->setMinimumSectionSize(22); QStringList strTreeItem; strTreeItem.clear(); strTreeItem << "Id" << tr("Site") << tr("User") << tr("Password"); passTree_->setHeaderLabels(strTreeItem); QSqlQuery q; q.exec("SELECT id, server, username, password FROM passwords"); while (q.next()) { QString id = q.value(0).toString(); QString server = q.value(1).toString(); QString user = q.value(2).toString(); QString pass = QString::fromUtf8(QByteArray::fromBase64(q.value(3).toByteArray())); strTreeItem.clear(); strTreeItem << id << server << user << pass; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(strTreeItem); passTree_->addTopLevelItem(treeWidgetItem); } QPushButton *deletePass = new QPushButton(tr("Delete")); connect(deletePass, SIGNAL(clicked()), this, SLOT(slotDeletePass())); QPushButton *deleteAllPass = new QPushButton(tr("Delete All")); connect(deleteAllPass, SIGNAL(clicked()), this, SLOT(slotDeleteAllPass())); QPushButton *showPass = new QPushButton(tr("Show Passwords")); connect(showPass, SIGNAL(clicked()), this, SLOT(slotShowPass())); QVBoxLayout *passButtonLayout = new QVBoxLayout(); passButtonLayout->addWidget(deletePass); passButtonLayout->addWidget(deleteAllPass); passButtonLayout->addSpacing(10); passButtonLayout->addWidget(showPass); passButtonLayout->addStretch(1); QHBoxLayout *passLayout = new QHBoxLayout(); passLayout->setMargin(0); passLayout->addWidget(passTree_); passLayout->addLayout(passButtonLayout); passwordsWidget_ = new QWidget(); passwordsWidget_->setLayout(passLayout); } /** @brief Create widget "Language" *----------------------------------------------------------------------------*/ void OptionsDialog::createLanguageWidget() { languageFileList_ = new QTreeWidget(); languageFileList_->setObjectName("languageFileList_"); languageFileList_->setColumnCount(5); languageFileList_->setColumnHidden(0, true); languageFileList_->setColumnWidth(1, 180); languageFileList_->setColumnWidth(2, 60); languageFileList_->setColumnWidth(3, 120); QStringList treeItem; treeItem.clear(); treeItem << "Id" << tr("Language") << tr("Version") << tr("Author") << tr("Contact"); languageFileList_->setHeaderLabels(treeItem); treeItem.clear(); treeItem << "en" << QString::fromUtf8("English [EN]") << QString(STRPRODUCTVER) << "QuiteRSS Team" << ""; QTreeWidgetItem *languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_EN")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "ar" << QString::fromUtf8("العربية [AR]") << "0.15.2" << "ahmadzxc" << "ahmad.almomani5@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_AR")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "bg" << QString::fromUtf8("БългарÑки [BG]") << "0.18.3" << QString::fromUtf8("Nikolai Tsvetkov") << "koko@cybcom.net"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_BG")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "cs" << QString::fromUtf8("ÄŒeÅ¡tina [CS]") << "0.18.2" << QString::fromUtf8("Matej Szendi") << "matej.szendi@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_CZ")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "de" << QString::fromUtf8("Deutsch [DE]") << QString(STRPRODUCTVER) << "Lyudmila Kremova" << "alis-dcm@yandex.ru"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_DE")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "el_GR" << QString::fromUtf8("Ελληνικά (Greece) [el_GR]") << QString(STRPRODUCTVER) << "Dimitris Siakavelis" << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_GR")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "es" << QString::fromUtf8("Español [ES]") << "0.17.4" << QString::fromUtf8("Cesar Muñoz") << "csarg@live.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_ES")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "fa" << QString::fromUtf8("ÙØ§Ø±Ø³ÛŒ [FA]") << "0.18.3" << "H.Mohamadi" << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_FA")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "fi" << QString::fromUtf8("Suomi [FI]") << "0.14.3" << "J. S. Tuomisto" << "jstuomisto@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_FI")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "fr" << QString::fromUtf8("Français [FR]") << "0.18.3" << "Glad Deschrijver" << "glad.deschrijver@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_FR")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "gl" << QString::fromUtf8("Galego [GL]") << QString(STRPRODUCTVER) << QString::fromUtf8("Xesús M. Mosquera Carregal") << "xesusmosquera@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_GL")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "hi" << QString::fromUtf8("हिनà¥à¤¦à¥€ [HI]") << "0.16.0" << QString::fromUtf8("") << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_HI")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "hu" << QString::fromUtf8("Magyar [HU]") << QString(STRPRODUCTVER) << "ZityiSoft" << "zityisoft@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_HU")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "it" << QString::fromUtf8("Italiano [IT]") << "0.18.3" << "ZeroWis" << "lightflash@hotmail.it"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_IT")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "ja" << QString::fromUtf8("日本語 [JA]") << "0.16.0" << "Masato Hashimoto" << "cabezon.hashimoto@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_JA")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "ko" << QString::fromUtf8("한국어 [KO]") << QString(STRPRODUCTVER) << QString::fromUtf8("Yonghee Lee") << "v4321v@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_KO")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "lt" << QString::fromUtf8("Lietuvių [LT]") << "0.18.2" << QString::fromUtf8("keturidu") << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_LT")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "nl" << QString::fromUtf8("Nederlands [NL]") << "0.18.3" << "TeLLie" << "elbert.pol@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_NL")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "pl" << QString::fromUtf8("Polski [PL]") << "0.18.3" << QString::fromUtf8("Piotr Pecka") << "piotr.pecka@outlook.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_PL")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "pt_BR" << QString::fromUtf8("Português (Brazil) [pt_BR]") << "0.18.3" << QString::fromUtf8("Marcos M. Ribeiro") << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_BR")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "pt_PT" << QString::fromUtf8("Português (Portugal) [pt_PT]") << QString(STRPRODUCTVER) << QString::fromUtf8("Sérgio Marques") << "smarquespt@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_PT")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "ro_RO" << QString::fromUtf8("Limba română [ro_RO]") << "0.18.3" << QString::fromUtf8("Jaff (Oprea Nicolae)") << "Jaff2002@yahoo.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_RO")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "ru" << QString::fromUtf8("РуÑÑкий [RU]") << QString(STRPRODUCTVER) << "QuiteRSS Team" << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_RU")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "sk" << QString::fromUtf8("SlovenÄina [SK]") << "0.18.3" << QString::fromUtf8("DAG Software (ÄŽanovský Ján)") << "dagsoftware@yahoo.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_SK")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "sr" << QString::fromUtf8("СрпÑки [SR]") << QString(STRPRODUCTVER) << "Ozzii" << "ozzii.translate@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_SR")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "sv" << QString::fromUtf8("Svenska [SV]") << QString(STRPRODUCTVER) << QString::fromUtf8("Ã…ke Engelbrektson") << "eson57@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_SV")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "tg_TJ" << QString::fromUtf8("Тоҷикӣ [tg_TJ]") << "0.17.5" << QString::fromUtf8("Kobilov Iskandar") << "kabilov.iskandar@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_TJ")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "tr" << QString::fromUtf8("Türkçe [TR]") << "0.13.3" << QString::fromUtf8("Mert BaÅŸaranoÄŸlu") << "mertbasaranoglu@gmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_TR")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "uk" << QString::fromUtf8("УкраїнÑька [UK]") << "0.18.2" << QString::fromUtf8("Сергій Левицький") << "leon21sl@yandex.ua"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_UK")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "vi" << QString::fromUtf8("Tiếng Việt [VI]") << "0.14.1" << QString::fromUtf8("Phan Anh") << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_VI")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "zh_CN" << QString::fromUtf8("中文 (China) [zh_CN]") << "0.18.2" << QString::fromUtf8("wwj402") << ""; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_CN")); languageFileList_->addTopLevelItem(languageItem); treeItem.clear(); treeItem << "zh_TW" << QString::fromUtf8("中文 (Taiwan) [zh_TW]") << QString(STRPRODUCTVER) << QString::fromUtf8("Hulen (破滅刃)") << "shift0106@hotmail.com"; languageItem = new QTreeWidgetItem(treeItem); languageItem->setIcon(1, QIcon(":/flags/flag_TW")); languageFileList_->addTopLevelItem(languageItem); QString linkWikiStr = QString("Link for translators"); QLabel *linkTranslators = new QLabel(linkWikiStr); linkTranslators->setOpenExternalLinks(true); QVBoxLayout *languageLayout = new QVBoxLayout(); languageLayout->setMargin(0); languageLayout->addWidget(new QLabel(tr("Choose language:"))); languageLayout->addWidget(languageFileList_); languageLayout->addWidget(linkTranslators); languageWidget_ = new QWidget(); languageWidget_->setLayout(languageLayout); } /** @brief Create widget "Fonts and Colors" *----------------------------------------------------------------------------*/ void OptionsDialog::createFontsColorsWidget() { //! tab "Fonts" fontsTree_ = new QTreeWidget(); fontsTree_->setObjectName("fontTree"); fontsTree_->setColumnCount(3); fontsTree_->setColumnHidden(0, true); fontsTree_->setColumnWidth(1, 260); QStringList treeItem; treeItem << "Id" << tr("Type") << tr("Font"); fontsTree_->setHeaderLabels(treeItem); treeItem.clear(); treeItem << "0" << tr("Feeds list font"); fontsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "1" << tr("News list font"); fontsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "2" << tr("News title font"); fontsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "3" << tr("News text font"); fontsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << "4" << tr("Notification font"); fontsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); fontsTree_->setCurrentItem(fontsTree_->topLevelItem(0)); connect(fontsTree_, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotFontChange())); QPushButton *fontChange = new QPushButton(tr("Change...")); connect(fontChange, SIGNAL(clicked()), this, SLOT(slotFontChange())); QPushButton *fontReset = new QPushButton(tr("Reset")); connect(fontReset, SIGNAL(clicked()), this, SLOT(slotFontReset())); QVBoxLayout *fontsButtonLayout = new QVBoxLayout(); fontsButtonLayout->addWidget(fontChange); fontsButtonLayout->addWidget(fontReset); fontsButtonLayout->addStretch(1); QHBoxLayout *mainFontsLayout = new QHBoxLayout(); mainFontsLayout->addWidget(fontsTree_, 1); mainFontsLayout->addLayout(fontsButtonLayout); QWidget *fontsWidget = new QWidget(); fontsWidget->setLayout(mainFontsLayout); //! tab "Colors" colorsTree_ = new QTreeWidget(this); colorsTree_->setObjectName("colorsTree_"); colorsTree_->setFrameStyle(QFrame::StyledPanel | QFrame::Plain); colorsTree_->setRootIsDecorated(false); colorsTree_->setColumnCount(2); colorsTree_->setColumnHidden(1, true); colorsTree_->setHeaderHidden(true); treeItem.clear(); treeItem << tr("Feeds list color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Feeds list background"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("News list color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("News list background"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Focused news color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Focused news background color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Link color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Title color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Date color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Author color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("News text color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("News title background"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("News background"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Feed with new news"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Count of unread news in feeds tree"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Text color of new news"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Text color of unread news"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Focused feed color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Focused feed background color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Disabled feed"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Alternating row colors"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Notification text color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); treeItem.clear(); treeItem << tr("Notification background color"); colorsTree_->addTopLevelItem(new QTreeWidgetItem(treeItem)); colorsTree_->setCurrentItem(colorsTree_->topLevelItem(0)); connect(colorsTree_, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(slotColorChange())); QPushButton *colorChange = new QPushButton(tr("Change...")); connect(colorChange, SIGNAL(clicked()), this, SLOT(slotColorChange())); QPushButton *colorReset = new QPushButton(tr("Reset")); connect(colorReset, SIGNAL(clicked()), this, SLOT(slotColorReset())); QVBoxLayout *colorsButtonLayout = new QVBoxLayout(); colorsButtonLayout->addWidget(colorChange); colorsButtonLayout->addWidget(colorReset); colorsButtonLayout->addStretch(1); QHBoxLayout *colorsLayout = new QHBoxLayout(); colorsLayout->addWidget(colorsTree_); colorsLayout->addLayout(colorsButtonLayout); QWidget *colorsWidget_ = new QWidget(this); colorsWidget_->setLayout(colorsLayout); //! tab "Fonts Browser" browserStandardFont_ = new QFontComboBox(); browserFixedFont_ = new QFontComboBox(); browserSerifFont_ = new QFontComboBox(); browserSansSerifFont_ = new QFontComboBox(); browserCursiveFont_ = new QFontComboBox(); browserFantasyFont_ = new QFontComboBox(); QGridLayout *browserFontFamiliesLayout = new QGridLayout(); browserFontFamiliesLayout->setColumnStretch(2, 1); browserFontFamiliesLayout->setContentsMargins(15, 0, 5, 10); browserFontFamiliesLayout->addWidget(new QLabel(tr("Standard")), 0, 0); browserFontFamiliesLayout->addWidget(browserStandardFont_, 0, 1); browserFontFamiliesLayout->addWidget(new QLabel(tr("Fixed")), 1, 0); browserFontFamiliesLayout->addWidget(browserFixedFont_, 1, 1); browserFontFamiliesLayout->addWidget(new QLabel(tr("Serif")), 2, 0); browserFontFamiliesLayout->addWidget(browserSerifFont_, 2, 1); browserFontFamiliesLayout->addWidget(new QLabel(tr("Sans Serif")), 3, 0); browserFontFamiliesLayout->addWidget(browserSansSerifFont_, 3, 1); browserFontFamiliesLayout->addWidget(new QLabel(tr("Cursive")), 4, 0); browserFontFamiliesLayout->addWidget(browserCursiveFont_, 4, 1); browserFontFamiliesLayout->addWidget(new QLabel(tr("Fantasy")), 5, 0); browserFontFamiliesLayout->addWidget(browserFantasyFont_, 5, 1); browserDefaultFontSize_ = new QSpinBox(); browserDefaultFontSize_->setRange(0, 99); browserFixedFontSize_ = new QSpinBox(); browserFixedFontSize_->setRange(0, 99); browserMinFontSize_ = new QSpinBox(); browserMinFontSize_->setRange(0, 99); browserMinLogFontSize_ = new QSpinBox(); browserMinLogFontSize_->setRange(0, 99); QGridLayout *browserFontSizesLayout = new QGridLayout(); browserFontSizesLayout->setColumnStretch(2, 1); browserFontSizesLayout->setContentsMargins(15, 0, 5, 0); browserFontSizesLayout->addWidget(new QLabel(tr("Default font size")), 0, 0); browserFontSizesLayout->addWidget(browserDefaultFontSize_, 0, 1); browserFontSizesLayout->addWidget(new QLabel(tr("Fixed font size")), 1, 0); browserFontSizesLayout->addWidget(browserFixedFontSize_, 1, 1); browserFontSizesLayout->addWidget(new QLabel(tr("Minimum font size")), 2, 0); browserFontSizesLayout->addWidget(browserMinFontSize_, 2, 1); browserFontSizesLayout->addWidget(new QLabel(tr("Minimum logical font size")), 3, 0); browserFontSizesLayout->addWidget(browserMinLogFontSize_, 3, 1); QVBoxLayout *fontsBrowserLayout = new QVBoxLayout(); fontsBrowserLayout->addWidget(new QLabel(tr("Font families:"))); fontsBrowserLayout->addLayout(browserFontFamiliesLayout); fontsBrowserLayout->addWidget(new QLabel(tr("Font sizes:"))); fontsBrowserLayout->addLayout(browserFontSizesLayout); fontsBrowserLayout->addStretch(); QWidget *fontsBrowserWidget_ = new QWidget(this); fontsBrowserWidget_->setLayout(fontsBrowserLayout); fontsColorsWidget_ = new QTabWidget(); fontsColorsWidget_->addTab(fontsWidget, tr("Fonts")); fontsColorsWidget_->addTab(fontsBrowserWidget_, tr("Fonts Browser")); fontsColorsWidget_->addTab(colorsWidget_, tr("Colors")); } /** @brief Create widget "Shortcuts" *----------------------------------------------------------------------------*/ void OptionsDialog::createShortcutWidget() { filterShortcut_ = new LineEdit(this, tr("Filter")); shortcutTree_ = new QTreeView(this); shortcutTree_->setObjectName("shortcutTree"); shortcutTree_->setSortingEnabled(false); shortcutTree_->setSelectionBehavior(QAbstractItemView::SelectRows); shortcutTree_->setEditTriggers(QAbstractItemView::NoEditTriggers); shortcutTree_->setRootIsDecorated(false); shortcutModel_ = new QStandardItemModel(); shortcutModel_->setColumnCount(5); shortcutProxyModel_ = new QSortFilterProxyModel(); shortcutProxyModel_->setSourceModel(shortcutModel_); shortcutProxyModel_->setFilterKeyColumn(-1); shortcutProxyModel_->setFilterRole(Qt::UserRole + 1); shortcutProxyModel_->setFilterCaseSensitivity(Qt::CaseInsensitive); shortcutTree_->setModel(shortcutProxyModel_); shortcutTree_->hideColumn(3); shortcutTree_->hideColumn(4); shortcutTree_->header()->setStretchLastSection(true); shortcutTree_->setColumnWidth(0, 215); shortcutTree_->setColumnWidth(1, 165); shortcutTree_->setColumnWidth(2, 120); QStringList treeItem; treeItem << tr("Action") << tr("Description") << tr("Shortcut") << "ObjectName" << "Data"; shortcutModel_->setHorizontalHeaderLabels(treeItem); editShortcut_ = new LineEdit(); QPushButton *resetShortcutButton = new QPushButton(tr("Reset")); QHBoxLayout *editShortcutLayout = new QHBoxLayout(); editShortcutLayout->addWidget(new QLabel(tr("Shortcut:"))); editShortcutLayout->addWidget(editShortcut_, 1); editShortcutLayout->addWidget(resetShortcutButton); editShortcutBox = new QGroupBox(); editShortcutBox->setEnabled(false); editShortcutBox->setLayout(editShortcutLayout); warningShortcut_ = new QLabel(); QVBoxLayout *shortcutLayout = new QVBoxLayout(); shortcutLayout->setMargin(0); shortcutLayout->addWidget(filterShortcut_); shortcutLayout->addWidget(shortcutTree_, 1); shortcutLayout->addWidget(warningShortcut_); shortcutLayout->addWidget(editShortcutBox); shortcutWidget_ = new QWidget(); shortcutWidget_->setLayout(shortcutLayout); connect(shortcutTree_, SIGNAL(clicked(QModelIndex)), this, SLOT(shortcutTreeClicked(QModelIndex))); connect(this, SIGNAL(signalShortcutTreeUpDownPressed()), SLOT(slotShortcutTreeUpDownPressed()), Qt::QueuedConnection); connect(editShortcut_, SIGNAL(signalClear()), this, SLOT(slotClearShortcut())); connect(resetShortcutButton, SIGNAL(clicked()), this, SLOT(slotResetShortcut())); connect(filterShortcut_, SIGNAL(textChanged(QString)), this, SLOT(filterShortcutChanged(QString))); editShortcut_->installEventFilter(this); } //---------------------------------------------------------------------------- void OptionsDialog::slotCategoriesTreeKeyUpDownPressed() { slotCategoriesItemClicked(categoriesTree_->currentItem(), 1); } //---------------------------------------------------------------------------- void OptionsDialog::slotCategoriesItemClicked(QTreeWidgetItem* item, int) { contentLabel_->setText(item->data(1, Qt::DisplayRole).toString()); contentStack_->setCurrentIndex(item->data(0, Qt::DisplayRole).toInt()); if (item->data(1, Qt::DisplayRole).toString() == tr("Labels")) { loadLabels(); } else if (item->data(1, Qt::DisplayRole).toString() == tr("Notifications")) { loadNotifier(); } } //---------------------------------------------------------------------------- int OptionsDialog::currentIndex() { return categoriesTree_->currentItem()->text(0).toInt(); } //---------------------------------------------------------------------------- void OptionsDialog::setCurrentItem(int index) { categoriesTree_->setCurrentItem(categoriesTree_->topLevelItem(index), 1); slotCategoriesTreeKeyUpDownPressed(); } //---------------------------------------------------------------------------- void OptionsDialog::manualProxyToggle(bool checked) { manualWidget_->setEnabled(checked); } //---------------------------------------------------------------------------- QNetworkProxy OptionsDialog::proxy() { return networkProxy_; } //---------------------------------------------------------------------------- void OptionsDialog::setProxy(const QNetworkProxy proxy) { networkProxy_ = proxy; updateProxy(); } //---------------------------------------------------------------------------- void OptionsDialog::updateProxy() { switch (networkProxy_.type()) { case QNetworkProxy::HttpProxy: case QNetworkProxy::Socks5Proxy: manualProxyButton_->setChecked(true); if (networkProxy_.type() == QNetworkProxy::Socks5Proxy) typeProxy_->setCurrentIndex(1); break; case QNetworkProxy::NoProxy: directConnectionButton_->setChecked(true); break; case QNetworkProxy::DefaultProxy: default: systemProxyButton_->setChecked(true); } editHost_->setText(networkProxy_.hostName()); editPort_->setText(QVariant(networkProxy_.port()).toString()); editUser_->setText(networkProxy_.user()); editPassword_->setText(networkProxy_.password()); } //---------------------------------------------------------------------------- void OptionsDialog::applyProxy() { if (systemProxyButton_->isChecked()) { networkProxy_.setType(QNetworkProxy::DefaultProxy); } else if (manualProxyButton_->isChecked()) { if (typeProxy_->currentIndex() == 1) networkProxy_.setType(QNetworkProxy::Socks5Proxy); else networkProxy_.setType(QNetworkProxy::HttpProxy); } else { networkProxy_.setType(QNetworkProxy::NoProxy); } networkProxy_.setHostName(editHost_->text()); networkProxy_.setPort(editPort_->text().toInt()); networkProxy_.setUser(editUser_->text()); networkProxy_.setPassword(editPassword_->text()); } //---------------------------------------------------------------------------- QString OptionsDialog::language() { QString langFileName = languageFileList_->currentItem()->data(0, Qt::DisplayRole).toString(); return langFileName; } //---------------------------------------------------------------------------- void OptionsDialog::setLanguage(const QString &langFileName) { // Set focus on selected language-file QList list = languageFileList_->findItems(langFileName, Qt::MatchFixedString, 0); if (list.count()) { languageFileList_->setCurrentItem(list.at(0)); } else { // can't find file, choose english QList list = languageFileList_->findItems("en", Qt::MatchFixedString, 0); languageFileList_->setCurrentItem(list.at(0)); } } //---------------------------------------------------------------------------- void OptionsDialog::slotFontChange() { bool bOk; QFont curFont; curFont.setFamily(fontsTree_->currentItem()->text(2).section(", ", 0, 0)); curFont.setPointSize(fontsTree_->currentItem()->text(2).section(", ", 1).toInt()); QFont font = QFontDialog::getFont(&bOk, curFont); if (bOk) { QString strFont = QString("%1, %2"). arg(font.family()). arg(font.pointSize()); fontsTree_->currentItem()->setText(2, strFont); } } //---------------------------------------------------------------------------- void OptionsDialog::slotFontReset() { switch (fontsTree_->currentItem()->text(0).toInt()) { case 2: case 3: fontsTree_->currentItem()->setText( 2, QString("%1, %2").arg(qApp->font().family()).arg(qApp->font().pointSize()+2)); break; default: fontsTree_->currentItem()->setText( 2, QString("%1, %2").arg(qApp->font().family()).arg(qApp->font().pointSize())); } } //---------------------------------------------------------------------------- void OptionsDialog::slotColorChange() { QString colorStr = colorsTree_->currentItem()->text(1); QColorDialog *colorDialog = new QColorDialog(QColor(colorStr), this); if (colorDialog->exec() == QDialog::Rejected) { delete colorDialog; return; } QColor color = colorDialog->selectedColor(); delete colorDialog; QPixmap pixmapColor(14, 14); pixmapColor.fill(color.name()); colorsTree_->currentItem()->setIcon(0, pixmapColor); colorsTree_->currentItem()->setText(1, color.name()); } //---------------------------------------------------------------------------- void OptionsDialog::slotColorReset() { QString colorName; int row = colorsTree_->currentIndex().row(); switch (row) { case 1: case 3: case 5: case 18: colorName = ""; break; case 6: case 7: colorName = "#0066CC"; break; case 8: case 9: colorName = "#666666"; break; case 10: colorName = "#000000"; break; case 11: case 12: case 22: colorName = "#FFFFFF"; break; case 13: case 14: colorName = qApp->palette().brush(QPalette::Link).color().name(); break; case 19: colorName = "#999999"; break; case 20: colorName = qApp->palette().color(QPalette::AlternateBase).name(); break; default: colorName = qApp->palette().brush(QPalette::WindowText).color().name(); } QPixmap pixmapColor(14, 14); if (colorName.isEmpty()) pixmapColor.fill(QColor(0, 0, 0, 0)); else pixmapColor.fill(colorName); colorsTree_->currentItem()->setIcon(0, pixmapColor); colorsTree_->currentItem()->setText(1, colorName); } //---------------------------------------------------------------------------- void OptionsDialog::setBehaviorIconTray(int behavior) { switch (behavior) { case CHANGE_ICON_TRAY: changeIconTray_->setChecked(true); break; case NEW_COUNT_ICON_TRAY: newCountTray_->setChecked(true); break; case UNREAD_COUNT_ICON_TRAY: unreadCountTray_->setChecked(true); break; default: staticIconTray_->setChecked(true); } } //---------------------------------------------------------------------------- int OptionsDialog::behaviorIconTray() { if (staticIconTray_->isChecked()) return STATIC_ICON_TRAY; else if (changeIconTray_->isChecked()) return CHANGE_ICON_TRAY; else if (newCountTray_->isChecked()) return NEW_COUNT_ICON_TRAY; else if (unreadCountTray_->isChecked()) return UNREAD_COUNT_ICON_TRAY; else return STATIC_ICON_TRAY; } //---------------------------------------------------------------------------- void OptionsDialog::loadActionShortcut(QList actions, QStringList *list) { QListIterator iter(actions); while (iter.hasNext()) { QAction *pAction = iter.next(); QStringList treeItem; treeItem << pAction->text().remove("&") << pAction->toolTip() << pAction->shortcut().toString() << pAction->objectName() << pAction->data().toString(); QList treeItems; for(int i = 0; i < treeItem.count(); i++) { QStandardItem *item = new QStandardItem(treeItem.at(i)); if (i == 0) { if (pAction->icon().isNull()) item->setIcon(QIcon(":/images/images/noicon.png")); else { if (pAction->objectName() == "autoLoadImagesToggle") { item->setIcon(QIcon(":/images/imagesOn")); item->setText(tr("Load images")); } else item->setIcon(pAction->icon()); } } else if (i == 1) { if (pAction->objectName() == "autoLoadImagesToggle") { item->setText(tr("Auto load images in news view")); } } if (i >= 0 && i <= 2) { item->setData(treeItem.at(i)); } treeItems.append(item); } shortcutModel_->appendRow(treeItems); QString str = pAction->shortcut().toString(); treeItems = shortcutModel_->findItems(str, Qt::MatchFixedString, 2); if ((treeItems.count() > 1) && !str.isEmpty()) { for (int i = 0; i < treeItems.count(); i++) { treeItems.at(i)->setData(QColor(Qt::red), Qt::TextColorRole); } } } listDefaultShortcut_ = list; } //---------------------------------------------------------------------------- void OptionsDialog::saveActionShortcut(QList actions, QActionGroup *labelGroup) { for (int i = 0; i < shortcutModel_->rowCount(); i++) { QString objectName = shortcutModel_->item(i, 3)->text(); if (objectName.contains("labelAction_")) { QAction *action = new QAction(parent()); action->setIcon(shortcutModel_->item(i, 0)->icon()); action->setText(shortcutModel_->item(i, 0)->text()); action->setShortcut(QKeySequence(shortcutModel_->item(i, 2)->text())); action->setObjectName(shortcutModel_->item(i, 3)->text()); action->setCheckable(true); action->setData(shortcutModel_->item(i, 4)->text()); labelGroup->addAction(action); actions.append(action); } else { actions.at(i)->setShortcut( QKeySequence(shortcutModel_->item(i, 2)->text())); } } } //---------------------------------------------------------------------------- void OptionsDialog::slotShortcutTreeUpDownPressed() { shortcutTreeClicked(shortcutTree_->currentIndex()); } //---------------------------------------------------------------------------- void OptionsDialog::shortcutTreeClicked(const QModelIndex &index) { QModelIndex indexCur = shortcutProxyModel_->mapToSource(index); editShortcut_->setText(shortcutModel_->item(indexCur.row(), 2)->text()); editShortcutBox->setEnabled(true); editShortcut_->setFocus(); warningShortcut_->clear(); } //---------------------------------------------------------------------------- void OptionsDialog::slotClearShortcut() { QModelIndex index = shortcutProxyModel_->mapToSource(shortcutTree_->currentIndex()); int row = index.row(); QString str = shortcutModel_->item(row, 2)->text(); QList treeItems; treeItems = shortcutModel_->findItems(str, Qt::MatchFixedString, 2); if ((treeItems.count() > 1) && !str.isEmpty()) { for (int i = 0; i < treeItems.count(); i++) { if ((treeItems.count() == 2) || (treeItems.at(i)->row() == row)) { treeItems.at(i)->setData(shortcutModel_->item(0, 1)->data(Qt::TextColorRole), Qt::TextColorRole); } } } editShortcut_->clear(); shortcutModel_->item(row, 2)->setText(""); shortcutModel_->item(row, 2)->setData(""); warningShortcut_->clear(); } //---------------------------------------------------------------------------- void OptionsDialog::slotResetShortcut() { QModelIndex index = shortcutProxyModel_->mapToSource(shortcutTree_->currentIndex()); int row = index.row(); QString objectName = shortcutModel_->item(row, 3)->text(); if (objectName.contains("labelAction_")) return; QString str = shortcutModel_->item(row, 2)->text(); QList treeItems; treeItems = shortcutModel_->findItems(str, Qt::MatchFixedString, 2); if (!str.isEmpty()) { for (int i = 0; i < treeItems.count(); i++) { if ((treeItems.count() == 2) || (treeItems.at(i)->row() == row)) { treeItems.at(i)->setData(shortcutModel_->item(0, 1)->data(Qt::TextColorRole), Qt::TextColorRole); } } } str = listDefaultShortcut_->at(row); editShortcut_->setText(str); shortcutModel_->item(row, 2)->setText(str); shortcutModel_->item(row, 2)->setData(str); warningShortcut_->clear(); if (!str.isEmpty()) { treeItems = shortcutModel_->findItems(str, Qt::MatchFixedString, 2); for (int i = 0; i < treeItems.count(); i++) { if (treeItems.at(i)->row() != row) { warningShortcut_->setText(tr("Warning: key is already assigned to") + " '" + shortcutModel_->item(treeItems.at(i)->row(), 0)->text() + "'"); } if (treeItems.count() > 1) { treeItems.at(i)->setData(QColor(Qt::red), Qt::TextColorRole); } } } } //---------------------------------------------------------------------------- void OptionsDialog::filterShortcutChanged(const QString & text) { shortcutProxyModel_->setFilterFixedString(text); if (shortcutTree_->currentIndex().isValid()) { QModelIndex indexCur = shortcutProxyModel_->mapToSource(shortcutTree_->currentIndex()); editShortcut_->setText(shortcutModel_->item(indexCur.row(), 2)->text()); editShortcutBox->setEnabled(true); } else { editShortcut_->setText(""); editShortcutBox->setEnabled(false); } warningShortcut_->clear(); } //---------------------------------------------------------------------------- void OptionsDialog::setOpeningFeed(int action) { switch (action) { case 1: positionFirstNews_->setChecked(true); break; case 2: nottoOpenNews_->setChecked(true); break; case 3: positionUnreadNews_->setChecked(true); break; default: positionLastNews_->setChecked(true); } } //---------------------------------------------------------------------------- int OptionsDialog::getOpeningFeed() { if (positionLastNews_->isChecked()) return 0; else if (positionFirstNews_->isChecked()) return 1; else if (nottoOpenNews_->isChecked()) return 2; else if (positionUnreadNews_->isChecked()) return 3; else return 0; } //---------------------------------------------------------------------------- void OptionsDialog::selectionBrowser() { QString path; QFileInfo file(otherExternalBrowserEdit_->text()); if (file.isFile()) path = otherExternalBrowserEdit_->text(); else path = file.path(); QString fileName = QFileDialog::getOpenFileName(this, tr("Open File..."), path); if (!fileName.isEmpty()) otherExternalBrowserEdit_->setText(fileName); } //---------------------------------------------------------------------------- void OptionsDialog::applyWhitelist() { mainApp->c2fSetEnabled(c2fEnabled_->isChecked()); QStringList whitelist; for (int i = 0; i < c2fWhitelist_->topLevelItemCount(); i++) { whitelist.append(c2fWhitelist_->topLevelItem(i)->text(0)); } mainApp->c2fSetWhitelist(whitelist); } //---------------------------------------------------------------------------- void OptionsDialog::selectionUserStyleNews() { QString path(mainApp->resourcesDir() % "/style"); QString fileName = QFileDialog::getOpenFileName(this, tr("Select Style Sheet File"), path, "*.css"); if (!fileName.isEmpty()) styleSheetNewsEdit_->setText(fileName); } //---------------------------------------------------------------------------- void OptionsDialog::selectionSoundNotifer() { QString path; QFileInfo file(editSoundNotifer_->text()); if (file.isFile()) path = editSoundNotifer_->text(); else path = file.path(); QString fileName = QFileDialog::getOpenFileName(this, tr("Open File..."), path, "*.wav"); if (!fileName.isEmpty()) editSoundNotifer_->setText(fileName); } void OptionsDialog::slotPlaySoundNotifer() { if (!editSoundNotifer_->text().isEmpty()) emit signalPlaySound(editSoundNotifer_->text()); } //---------------------------------------------------------------------------- void OptionsDialog::feedsTreeNotifyItemChanged(QTreeWidgetItem *item, int column) { if ((column != 0) || itemNotChecked_) return; itemNotChecked_ = true; if (item->checkState(0) == Qt::Unchecked) { setCheckStateItem(item, Qt::Unchecked); QTreeWidgetItem *parentItem = item->parent(); while (parentItem) { parentItem->setCheckState(0, Qt::Unchecked); parentItem = parentItem->parent(); } } else { setCheckStateItem(item, Qt::Checked); } itemNotChecked_ = false; } //---------------------------------------------------------------------------- void OptionsDialog::setCheckStateItem(QTreeWidgetItem *item, Qt::CheckState state) { for(int i = 0; i < item->childCount(); ++i) { QTreeWidgetItem *childItem = item->child(i); childItem->setCheckState(0, state); setCheckStateItem(childItem, state); } } //---------------------------------------------------------------------------- void OptionsDialog::loadLabels() { if (loadLabelsOk_) return; loadLabelsOk_ = true; idLabels_.clear(); QSqlQuery q; q.exec("SELECT id, name, image, color_text, color_bg, num FROM labels ORDER BY num"); while (q.next()) { int idLabel = q.value(0).toInt(); QString nameLabel = q.value(1).toString(); if ((idLabel <= 6) && (MainWindow::nameLabels().at(idLabel-1) == nameLabel)) { nameLabel = MainWindow::trNameLabels().at(idLabel-1); } QByteArray byteArray = q.value(2).toByteArray(); QString colorText = q.value(3).toString(); QString colorBg = q.value(4).toString(); int numLabel = q.value(5).toInt(); QPixmap imageLabel; if (!byteArray.isNull()) imageLabel.loadFromData(byteArray); QStringList strTreeItem; strTreeItem << QString::number(idLabel) << nameLabel << colorText << colorBg << QString::number(numLabel); QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(strTreeItem); treeWidgetItem->setIcon(1, QIcon(imageLabel)); if (!colorText.isEmpty()) treeWidgetItem->setTextColor(1, QColor(colorText)); if (!colorBg.isEmpty()) treeWidgetItem->setBackgroundColor(1, QColor(colorBg)); labelsTree_->addTopLevelItem(treeWidgetItem); } } //---------------------------------------------------------------------------- void OptionsDialog::newLabel() { LabelDialog *labelDialog = new LabelDialog(this); if (labelDialog->exec() == QDialog::Rejected) { delete labelDialog; return; } QString nameLabel = labelDialog->nameEdit_->text(); QString colorText = labelDialog->colorTextStr_; QString colorBg = labelDialog->colorBgStr_; int idLabel = 0; for (int i = 0; i < labelsTree_->topLevelItemCount(); i++) { QString str = labelsTree_->topLevelItem(i)->text(0); if (idLabel < str.toInt()) idLabel = str.toInt(); } idLabel = idLabel + 1; QStringList itemStr; itemStr << QString::number(idLabel) << nameLabel << colorText << colorBg << QString::number(idLabel); QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(itemStr); treeWidgetItem->setIcon(1, labelDialog->icon_); if (!colorText.isEmpty()) treeWidgetItem->setTextColor(1, QColor(colorText)); if (!colorBg.isEmpty()) treeWidgetItem->setBackgroundColor(1, QColor(colorBg)); labelsTree_->addTopLevelItem(treeWidgetItem); addIdLabelList(treeWidgetItem->text(0)); itemStr.clear(); itemStr << nameLabel << nameLabel << "" << QString("labelAction_%1").arg(idLabel) << QString::number(idLabel); QList treeItems; for(int i = 0; i < itemStr.count(); i++) { QStandardItem *item = new QStandardItem(itemStr.at(i)); if (i == 0) { item->setIcon(labelDialog->icon_); } if (i >= 0 && i <= 2) { item->setData(itemStr.at(i)); } treeItems.append(item); } shortcutModel_->appendRow(treeItems); delete labelDialog; } //---------------------------------------------------------------------------- void OptionsDialog::editLabel() { QTreeWidgetItem *treeWidgetItem = labelsTree_->currentItem(); QString idLabelStr = treeWidgetItem->text(0); QString nameLabel = treeWidgetItem->text(1); QString colorText = treeWidgetItem->text(2); QString colorBg = treeWidgetItem->text(3); LabelDialog *labelDialog = new LabelDialog(this); labelDialog->nameEdit_->setText(nameLabel); labelDialog->icon_ = treeWidgetItem->icon(1); labelDialog->colorTextStr_ = colorText; labelDialog->colorBgStr_ = colorBg; labelDialog->loadData(); if (labelDialog->exec() == QDialog::Rejected) { delete labelDialog; return; } nameLabel = labelDialog->nameEdit_->text(); colorText = labelDialog->colorTextStr_; colorBg = labelDialog->colorBgStr_; treeWidgetItem->setText(1, nameLabel); treeWidgetItem->setText(2, colorText); treeWidgetItem->setText(3, colorBg); treeWidgetItem->setIcon(1, labelDialog->icon_); if (!colorText.isEmpty()) treeWidgetItem->setTextColor(1, QColor(colorText)); if (!colorBg.isEmpty()) treeWidgetItem->setBackgroundColor(1, QColor(colorBg)); addIdLabelList(idLabelStr); QList treeItems; treeItems = shortcutModel_->findItems(idLabelStr, Qt::MatchFixedString, 4); QStandardItem *item = treeItems.first(); shortcutModel_->item(item->row(), 0)->setIcon(labelDialog->icon_); shortcutModel_->item(item->row(), 0)->setText(nameLabel); shortcutModel_->item(item->row(), 0)->setData(nameLabel); delete labelDialog; } //---------------------------------------------------------------------------- void OptionsDialog::deleteLabel() { int labelRow = labelsTree_->currentIndex().row(); addIdLabelList(labelsTree_->topLevelItem(labelRow)->text(0)); QString idLabelStr = labelsTree_->topLevelItem(labelRow)->text(0); QList treeItems; treeItems = shortcutModel_->findItems(idLabelStr, Qt::MatchFixedString, 4); QStandardItem *item = treeItems.first(); shortcutModel_->removeRow(item->row()); QTreeWidgetItem *treeItem = labelsTree_->takeTopLevelItem(labelRow); delete treeItem; } //---------------------------------------------------------------------------- void OptionsDialog::moveUpLabel() { int labelRow = labelsTree_->currentIndex().row(); addIdLabelList(labelsTree_->topLevelItem(labelRow)->text(0)); addIdLabelList(labelsTree_->topLevelItem(labelRow-1)->text(0)); QString idLabelStr = labelsTree_->topLevelItem(labelRow)->text(0); QList treeItems; treeItems = shortcutModel_->findItems(idLabelStr, Qt::MatchFixedString, 4); int row = treeItems.first()->row(); treeItems = shortcutModel_->takeRow(row-1); shortcutModel_->insertRow(row, treeItems); int num1 = labelsTree_->topLevelItem(labelRow)->text(4).toInt(); int num2 = labelsTree_->topLevelItem(labelRow-1)->text(4).toInt(); labelsTree_->topLevelItem(labelRow-1)->setText(4, QString::number(num1)); labelsTree_->topLevelItem(labelRow)->setText(4, QString::number(num2)); QTreeWidgetItem *treeItem = labelsTree_->takeTopLevelItem(labelRow-1); labelsTree_->insertTopLevelItem(labelRow, treeItem); if (labelsTree_->currentIndex().row() == 0) moveUpLabelButton_->setEnabled(false); if (labelsTree_->currentIndex().row() != (labelsTree_->topLevelItemCount()-1)) moveDownLabelButton_->setEnabled(true); } //---------------------------------------------------------------------------- void OptionsDialog::moveDownLabel() { int labelRow = labelsTree_->currentIndex().row(); addIdLabelList(labelsTree_->topLevelItem(labelRow)->text(0)); addIdLabelList(labelsTree_->topLevelItem(labelRow+1)->text(0)); QString idLabelStr = labelsTree_->topLevelItem(labelRow)->text(0); QList treeItems; treeItems = shortcutModel_->findItems(idLabelStr, Qt::MatchFixedString, 4); int row = treeItems.first()->row(); treeItems = shortcutModel_->takeRow(row+1); shortcutModel_->insertRow(row, treeItems); int num1 = labelsTree_->topLevelItem(labelRow)->text(4).toInt(); int num2 = labelsTree_->topLevelItem(labelRow+1)->text(4).toInt(); labelsTree_->topLevelItem(labelRow+1)->setText(4, QString::number(num1)); labelsTree_->topLevelItem(labelRow)->setText(4, QString::number(num2)); QTreeWidgetItem *treeItem = labelsTree_->takeTopLevelItem(labelRow+1); labelsTree_->insertTopLevelItem(labelRow, treeItem); if (labelsTree_->currentIndex().row() == (labelsTree_->topLevelItemCount()-1)) moveDownLabelButton_->setEnabled(false); if (labelsTree_->currentIndex().row() != 0) moveUpLabelButton_->setEnabled(true); } //---------------------------------------------------------------------------- void OptionsDialog::slotCurrentLabelChanged(QTreeWidgetItem *current, QTreeWidgetItem *) { if (labelsTree_->indexOfTopLevelItem(current) == 0) moveUpLabelButton_->setEnabled(false); else moveUpLabelButton_->setEnabled(true); if (labelsTree_->indexOfTopLevelItem(current) == (labelsTree_->topLevelItemCount()-1)) moveDownLabelButton_->setEnabled(false); else moveDownLabelButton_->setEnabled(true); if (labelsTree_->indexOfTopLevelItem(current) < 0) { editLabelButton_->setEnabled(false); deleteLabelButton_->setEnabled(false); moveUpLabelButton_->setEnabled(false); moveDownLabelButton_->setEnabled(false); } else { editLabelButton_->setEnabled(true); deleteLabelButton_->setEnabled(true); } } //---------------------------------------------------------------------------- void OptionsDialog::applyLabels() { db_.transaction(); QSqlQuery q; foreach (QString idLabel, idLabels_) { QList treeItems = labelsTree_->findItems(idLabel, Qt::MatchFixedString, 0); if (treeItems.count() == 0) { q.exec(QString("DELETE FROM labels WHERE id=='%1'").arg(idLabel)); q.exec(QString("SELECT id, label FROM news WHERE label LIKE '%,%1,%'").arg(idLabel)); while (q.next()) { QString strIdLabels = q.value(1).toString(); strIdLabels.replace(QString(",%1,").arg(idLabel), ","); QSqlQuery q1; q1.exec(QString("UPDATE news SET label='%1' WHERE id=='%2'"). arg(strIdLabels).arg(q.value(0).toInt())); } } else { QString nameLabel = treeItems.at(0)->text(1); if ((idLabel.toInt() <= 6) && (MainWindow::trNameLabels().at(idLabel.toInt()-1) == nameLabel)) { nameLabel = MainWindow::nameLabels().at(idLabel.toInt()-1); } QPixmap icon = treeItems.at(0)->icon(1).pixmap(16, 16); QByteArray iconData; QBuffer buffer(&iconData); buffer.open(QIODevice::WriteOnly); icon.save(&buffer, "PNG"); buffer.close(); QString colorText = treeItems.at(0)->text(2); QString colorBg = treeItems.at(0)->text(3); int numLabel = treeItems.at(0)->text(4).toInt(); q.exec(QString("SELECT * FROM labels WHERE id=='%1'").arg(idLabel)); if (q.next()) { q.prepare("UPDATE labels SET name=?, image=?, color_text=?, color_bg=?, num=? " "WHERE id=?"); q.addBindValue(nameLabel); q.addBindValue(iconData); q.addBindValue(colorText); q.addBindValue(colorBg); q.addBindValue(numLabel); q.addBindValue(idLabel); q.exec(); } else { q.prepare("INSERT INTO labels(name, image, color_text, color_bg, num) " "VALUES (:name, :image, :color_text, :color_bg, :num)"); q.bindValue(":name", nameLabel); q.bindValue(":image", iconData); q.bindValue(":color_text", colorText); q.bindValue(":color_bg", colorBg); q.bindValue(":num", numLabel); q.exec(); } } } db_.commit(); } /** @brief Add id for editing label * @param idLabel id for label *----------------------------------------------------------------------------*/ void OptionsDialog::addIdLabelList(const QString &idLabel) { if (!idLabels_.contains(idLabel)) idLabels_.append(idLabel); } //---------------------------------------------------------------------------- void OptionsDialog::loadNotifier() { if (loadNotifierOk_) return; loadNotifierOk_ = true; itemNotChecked_ = true; QSqlQuery q; QQueue parentIds; parentIds.enqueue(0); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); QString qStr = QString("SELECT text, id, image, xmlUrl FROM feeds WHERE parentId='%1' ORDER BY rowToParent"). arg(parentId); q.exec(qStr); while (q.next()) { QString feedText = q.value(0).toString(); QString feedId = q.value(1).toString(); QByteArray byteArray = q.value(2).toByteArray(); QString xmlUrl = q.value(3).toString(); QStringList treeItem; treeItem << feedText << feedId; QTreeWidgetItem *treeWidgetItem = new QTreeWidgetItem(treeItem); treeWidgetItem->setCheckState(0, Qt::Unchecked); QSqlQuery q1; qStr = QString("SELECT value FROM feeds_ex WHERE feedId='%1' AND name='showNotification'"). arg(feedId); q1.exec(qStr); if (q1.next()) { if (q1.value(0).toInt() == 1) treeWidgetItem->setCheckState(0, Qt::Checked); } else { qStr = QString("INSERT INTO feeds_ex(feedId, name, value) VALUES ('%1', 'showNotification', '0')"). arg(feedId); q1.exec(qStr); } if (treeWidgetItem->checkState(0) == Qt::Unchecked) feedsTreeNotify_->topLevelItem(0)->setCheckState(0, Qt::Unchecked); QPixmap iconItem; if (xmlUrl.isEmpty()) { iconItem.load(":/images/folder"); } else { if (byteArray.isNull() || mainApp->mainWindow()->defaultIconFeeds_) { iconItem.load(":/images/feed"); } else { iconItem.loadFromData(QByteArray::fromBase64(byteArray)); } } treeWidgetItem->setIcon(0, iconItem); QList treeItems = feedsTreeNotify_->findItems(QString::number(parentId), Qt::MatchFixedString | Qt::MatchRecursive, 1); treeItems.at(0)->addChild(treeWidgetItem); if (xmlUrl.isEmpty()) parentIds.enqueue(feedId.toInt()); } } feedsTreeNotify_->expandAll(); itemNotChecked_ = false; } //---------------------------------------------------------------------------- void OptionsDialog::applyNotifier() { mainApp->mainWindow()->idFeedsNotifyList_.clear(); feedsTreeNotify_->expandAll(); QTreeWidgetItem *treeWidgetItem = feedsTreeNotify_->itemBelow(feedsTreeNotify_->topLevelItem(0)); db_.transaction(); while (treeWidgetItem) { int check = 0; if (treeWidgetItem->checkState(0) == Qt::Checked) check = 1; QSqlQuery q; QString qStr = QString("UPDATE feeds_ex SET value='%1' WHERE feedId='%2' AND name='showNotification'"). arg(check).arg(treeWidgetItem->text(1).toInt()); q.exec(qStr); if (check && onlySelectedFeeds_->isChecked()) mainApp->mainWindow()->idFeedsNotifyList_.append(treeWidgetItem->text(1).toInt()); treeWidgetItem = feedsTreeNotify_->itemBelow(treeWidgetItem); } db_.commit(); } /** @brief Show notifier test window *----------------------------------------------------------------------------*/ void OptionsDialog::showNotification() { if (notificationWidget_) delete notificationWidget_; QList idFeedList; QList cntNewNewsList; QList idColorList; QStringList colorList; notificationWidget_ = new NotificationWidget(idFeedList, cntNewNewsList, idColorList, colorList, this, this); connect(notificationWidget_, SIGNAL(signalClose()), this, SLOT(deleteNotification())); notificationWidget_->show(); } /** @brief Destroy notifier test window *----------------------------------------------------------------------------*/ void OptionsDialog::deleteNotification() { notificationWidget_->deleteLater(); notificationWidget_ = NULL; } //---------------------------------------------------------------------------- void OptionsDialog::slotDeletePass() { if (passTree_->topLevelItemCount()) passTree_->currentItem()->setHidden(true); } //---------------------------------------------------------------------------- void OptionsDialog::slotDeleteAllPass() { for (int i = 0; i < passTree_->topLevelItemCount(); i++) { passTree_->topLevelItem(i)->setHidden(true); } } //---------------------------------------------------------------------------- void OptionsDialog::slotShowPass() { if (passTree_->isColumnHidden(3)) { passTree_->showColumn(3); passTree_->setColumnWidth(1, passTree_->columnWidth(1) - passTree_->columnWidth(3)); } } //---------------------------------------------------------------------------- void OptionsDialog::applyPass() { db_.transaction(); QSqlQuery q; for (int i = 0; i < passTree_->topLevelItemCount(); i++) { if (passTree_->isItemHidden(passTree_->topLevelItem(i))) { QString id = passTree_->topLevelItem(i)->text(0); q.exec(QString("DELETE FROM passwords WHERE id=='%1'").arg(id)); } } db_.commit(); } //---------------------------------------------------------------------------- void OptionsDialog::selectionUserStyleBrowser() { QString path; QFileInfo file(userStyleBrowserEdit_->text()); if (file.isFile()) path = userStyleBrowserEdit_->text(); else path = file.path(); QString fileName = QFileDialog::getOpenFileName(this, tr("Select Style Sheet File"), path, "*.css"); if (!fileName.isEmpty()) userStyleBrowserEdit_->setText(fileName); } //---------------------------------------------------------------------------- void OptionsDialog::selectionDirDiskCache() { QString dirStr = QFileDialog::getExistingDirectory(this, tr("Open Directory..."), dirDiskCacheEdit_->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (!dirStr.isEmpty()) dirDiskCacheEdit_->setText(dirStr); } //---------------------------------------------------------------------------- void OptionsDialog::addWhitelist() { QString site = QInputDialog::getText(this, tr("Add site to whitelist"), tr("Site without 'http://' (ex. youtube.com)")); if (site.isEmpty()) return; c2fWhitelist_->insertTopLevelItem(0, new QTreeWidgetItem(QStringList(site))); } //---------------------------------------------------------------------------- void OptionsDialog::removeWhitelist() { QTreeWidgetItem* item = c2fWhitelist_->currentItem(); if (!item) return; delete item; } //---------------------------------------------------------------------------- void OptionsDialog::selectionDownloadLocation() { QString dirStr = QFileDialog::getExistingDirectory(this, tr("Open Directory..."), downloadLocationEdit_->text(), QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if (!dirStr.isEmpty()) downloadLocationEdit_->setText(dirStr); } quiterss-0.18.3/src/optionsdialog.h000066400000000000000000000261471265173051100173100ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef OPTIONSDIALOG_H #define OPTIONSDIALOG_H #ifdef HAVE_QT5 #include #else #include #endif #include #include #include "dialog.h" #include "lineedit.h" #include "notificationswidget.h" // Forward declarations class FeedPropertiesDialog; #define STATIC_ICON_TRAY 0 #define CHANGE_ICON_TRAY 1 #define NEW_COUNT_ICON_TRAY 2 #define UNREAD_COUNT_ICON_TRAY 3 /** * Action to take upon clicking a news entry * NOTE: Don't change value of 'Default' away from 0 */ namespace ENewsClickAction { enum Type { NCA_Start = 0, NCA_Default = 0, NCA_Nothing = 1, NCA_Description = 2, NCA_DescriptionNewTab = 3, NCA_DescriptionBkgTab = 4, NCA_WebPage = 5, NCA_WebPageNewTab = 6, NCA_WebPageBkgTab = 7, NCA_ExternalBrowser = 8, NCA_Max }; } class OptionsDialog : public Dialog { friend class FeedPropertiesDialog; Q_OBJECT public: explicit OptionsDialog(QWidget *parent); int currentIndex(); void setCurrentItem(int index); // general QCheckBox *showSplashScreen_; QCheckBox *reopenFeedStartup_; QCheckBox *openNewTabNextToActive_; QCheckBox *hideFeedsOpenTab_; QCheckBox *showCloseButtonTab_; QCheckBox *showToggleFeedsTree_; QCheckBox *defaultIconFeeds_; QCheckBox *autocollapseFolder_; QCheckBox *updateCheckEnabled_; QCheckBox *statisticsEnabled_; QCheckBox *storeDBMemory_; QSpinBox *saveDBMemFileInterval_; // systemTray void setBehaviorIconTray(int behavior); int behaviorIconTray(); QGroupBox *showTrayIconBox_; QCheckBox *startingTray_; QCheckBox *minimizingTray_; QCheckBox *closingTray_; QCheckBox *singleClickTray_; QCheckBox *clearStatusNew_; QCheckBox *emptyWorking_; // network connection QNetworkProxy proxy(); void setProxy(const QNetworkProxy proxy); QSpinBox *timeoutRequest_; QSpinBox *numberRequests_; QSpinBox *numberRepeats_; // browser QRadioButton *embeddedBrowserOn_; QRadioButton *externalBrowserOn_; QRadioButton *defaultExternalBrowserOn_; QRadioButton *otherExternalBrowserOn_; LineEdit *otherExternalBrowserEdit_; QPushButton *otherExternalBrowserButton_; QCheckBox *autoLoadImages_; QCheckBox *javaScriptEnable_; QCheckBox *pluginsEnable_; QSpinBox *defaultZoomPages_; QCheckBox *openLinkInBackground_; QCheckBox *openLinkInBackgroundEmbedded_; LineEdit *userStyleBrowserEdit_; QSpinBox *maxPagesInCache_; QGroupBox *diskCacheOn_; QSpinBox *maxDiskCache_; QLineEdit *dirDiskCacheEdit_; QPushButton *dirDiskCacheButton_; QRadioButton *saveCookies_; QRadioButton *deleteCookiesOnClose_; QRadioButton *blockCookies_; QPushButton *clearCookies_; LineEdit *downloadLocationEdit_; QCheckBox *askDownloadLocation_; // feeds void setOpeningFeed(int action); int getOpeningFeed(); QCheckBox *updateFeedsStartUp_; QCheckBox *updateFeedsEnable_; QSpinBox *updateFeedsInterval_; QComboBox *updateIntervalType_; QRadioButton *positionLastNews_; QRadioButton *positionFirstNews_; QRadioButton *positionUnreadNews_; QCheckBox *openNewsWebViewOn_; QRadioButton *nottoOpenNews_; QGroupBox *markNewsReadOn_; QRadioButton *markCurNewsRead_; QRadioButton *markPrevNewsRead_; QSpinBox *markNewsReadTime_; QCheckBox *markReadSwitchingFeed_; QCheckBox *markReadClosingTab_; QCheckBox *markReadMinimize_; QCheckBox *showDescriptionNews_; QComboBox* singleClickAction; QComboBox* doubleClickAction; QComboBox* middleClickAction; QComboBox *formatDate_; QComboBox *formatTime_; QCheckBox *alternatingRowColorsNews_; QCheckBox *simplifiedDateTime_; QComboBox *mainNewsFilter_; LineEdit *styleSheetNewsEdit_; QCheckBox *changeBehaviorActionNUN_; QCheckBox *notDeleteStarred_; QCheckBox *notDeleteLabeled_; QCheckBox *markIdenticalNewsRead_; QGroupBox *cleanupOnShutdownBox_; QCheckBox *dayCleanUpOn_; QSpinBox *maxDayCleanUp_; QCheckBox *newsCleanUpOn_; QSpinBox *maxNewsCleanUp_; QCheckBox *readCleanUp_; QCheckBox *neverUnreadCleanUp_; QCheckBox *neverStarCleanUp_; QCheckBox *neverLabelCleanUp_; QCheckBox *cleanUpDeleted_; QCheckBox *optimizeDB_; // labels QStringList idLabels_; QTreeWidget *labelsTree_; // notifier QGroupBox *soundNotifyBox_; QLineEdit *editSoundNotifer_; QPushButton *selectionSoundNotifer_; QPushButton *playSoundNotifer_; QGroupBox *showNotifyOn_; QComboBox *screenNotify_; QComboBox *positionNotify_; QSpinBox *transparencyNotify_; QSpinBox *countShowNewsNotify_; QSpinBox *timeShowNewsNotify_; QSpinBox *widthTitleNewsNotify_; QCheckBox *showTitlesFeedsNotify_; QCheckBox *showIconFeedNotify_; QCheckBox *showButtonMarkAllNotify_; QCheckBox *showButtonMarkReadNotify_; QCheckBox *showButtonExBrowserNotify_; QCheckBox *showButtonDeleteNotify_; QCheckBox *fullscreenModeNotify_; QCheckBox *showNotifyInactiveApp_; QCheckBox *onlySelectedFeeds_; QTreeWidget *feedsTreeNotify_; bool itemNotChecked_; Dialog *feedsNotifierDlg_; // language QString language(); void setLanguage(const QString &langFileName); // fonts QTreeWidget *fontsTree_; QTreeWidget *colorsTree_; QFontComboBox *browserStandardFont_; QFontComboBox *browserFixedFont_; QFontComboBox *browserSerifFont_; QFontComboBox *browserSansSerifFont_; QFontComboBox *browserCursiveFont_; QFontComboBox *browserFantasyFont_; QSpinBox *browserDefaultFontSize_; QSpinBox *browserFixedFontSize_; QSpinBox *browserMinFontSize_; QSpinBox *browserMinLogFontSize_; // shortcut void loadActionShortcut(QList actions, QStringList *list); void saveActionShortcut(QList actions, QActionGroup *labelGroup); signals: void signalCategoriesTreeKeyUpDownPressed(); void signalShortcutTreeUpDownPressed(); void signalPlaySound(const QString &soundPath); protected: bool eventFilter(QObject *obj, QEvent *event); private slots: void slotCategoriesItemClicked(QTreeWidgetItem* item, int); void slotCategoriesTreeKeyUpDownPressed(); void manualProxyToggle(bool checked); void updateProxy(); void applyProxy(); void acceptDialog(); void closeDialog(); void slotFontChange(); void slotFontReset(); void slotColorChange(); void slotColorReset(); void shortcutTreeClicked(const QModelIndex &index); void slotShortcutTreeUpDownPressed(); void slotClearShortcut(); void slotResetShortcut(); void filterShortcutChanged(const QString &text); void selectionBrowser(); void selectionUserStyleNews(); void selectionSoundNotifer(); void slotPlaySoundNotifer(); void feedsTreeNotifyItemChanged(QTreeWidgetItem* item,int column); void setCheckStateItem(QTreeWidgetItem *item, Qt::CheckState state); void showNotification(); void deleteNotification(); void newLabel(); void editLabel(); void deleteLabel(); void moveUpLabel(); void moveDownLabel(); void slotCurrentLabelChanged(QTreeWidgetItem *current, QTreeWidgetItem *); void slotDeletePass(); void slotDeleteAllPass(); void slotShowPass(); void selectionUserStyleBrowser(); void selectionDirDiskCache(); void addWhitelist(); void removeWhitelist(); void selectionDownloadLocation(); private: void showEvent(QShowEvent*); QSqlDatabase db_; QLabel *contentLabel_; QTreeWidget *categoriesTree_; QStackedWidget *contentStack_; QScrollArea *scrollArea_; //stack widgets QFrame *generalWidget_; QFrame *traySystemWidget_; QFrame *networkConnectionsWidget_; QTabWidget *browserWidget_; QTabWidget *feedsWidget_; QWidget *labelsWidget_; QTabWidget *notifierWidget_; QWidget *passwordsWidget_; QWidget *languageWidget_; QTabWidget *fontsColorsWidget_; QWidget *shortcutWidget_; // general void createGeneralWidget(); QCheckBox *autoRunEnabled_; QSettings *autoRunSettings_; // systemTray void createTraySystemWidget(); QRadioButton *staticIconTray_; QRadioButton *changeIconTray_; QRadioButton *newCountTray_; QRadioButton *unreadCountTray_; // network connection void createNetworkConnectionsWidget(); QRadioButton *systemProxyButton_; QRadioButton *directConnectionButton_; QRadioButton *manualProxyButton_; QWidget *manualWidget_; QComboBox *typeProxy_; LineEdit *editHost_; LineEdit *editPort_; LineEdit *editUser_; LineEdit *editPassword_; QNetworkProxy networkProxy_; // browser void createBrowserWidget(); void applyWhitelist(); QCheckBox *c2fEnabled_; QTreeWidget *c2fWhitelist_; // feeds void createFeedsWidget(); /** * Creates the widgets for configuring news mouse click settings; shared between options dialog and feed properties dialog. * * @param outSingleClickAction Variable storing the single click widget * @param outDoubleClickAction Variable storing the double click widget * @param outMiddleClickAction Variable storing the middle click widget * @param bAddDefaultValue Adds a value marked 'Default' to the combo box (for feed properties) * @return Returns the widget for configuring the mouse settings */ static QWidget* createClickActionWidgets(QComboBox*& outSingleClickAction, QComboBox*& outDoubleClickAction, QComboBox*& outMiddleClickAction, bool bAddDefaultValue=false); // notifier void createNotifierWidget(); void createFeedsNotifierDlg(); void loadNotifier(); void applyNotifier(); bool loadNotifierOk_; NotificationWidget *notificationWidget_; // labels void createLabelsWidget(); void loadLabels(); void applyLabels(); void addIdLabelList(const QString &idLabel); QPushButton *newLabelButton_; QPushButton *editLabelButton_; QPushButton *deleteLabelButton_; QPushButton *moveUpLabelButton_; QPushButton *moveDownLabelButton_; bool loadLabelsOk_; // passwords void createPasswordsWidget(); void applyPass(); QTreeWidget *passTree_; // language void createLanguageWidget(); QTreeWidget *languageFileList_; // fonts void createFontsColorsWidget(); // shortcut void createShortcutWidget(); QStringList *listDefaultShortcut_; LineEdit *filterShortcut_; QTreeView *shortcutTree_; QStandardItemModel *shortcutModel_; QSortFilterProxyModel *shortcutProxyModel_; LineEdit *editShortcut_; QGroupBox *editShortcutBox; QLabel *warningShortcut_; }; #endif // OPTIONSDIALOG_H quiterss-0.18.3/src/parseobject.cpp000066400000000000000000001350721265173051100172670ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "parseobject.h" #include "mainapplication.h" #include "database.h" #include "VersionNo.h" #include "common.h" #include #include #include #if defined(Q_OS_WIN) #include #endif #include ParseObject::ParseObject(QObject *parent) : QObject(parent) , currentFeedId_(0) { setObjectName("parseObject_"); db_ = Database::connection("secondConnection"); parseTimer_ = new QTimer(this); parseTimer_->setSingleShot(true); parseTimer_->setInterval(10); connect(parseTimer_, SIGNAL(timeout()), this, SLOT(getQueuedXml()), Qt::QueuedConnection); connect(this, SIGNAL(signalReadyParse(QByteArray,int,QDateTime,QString)), SLOT(slotParse(QByteArray,int,QDateTime,QString))); } ParseObject::~ParseObject() { } void ParseObject::disconnectObjects() { disconnect(this); } /** @brief Queueing xml-data *----------------------------------------------------------------------------*/ void ParseObject::parseXml(QByteArray data, int feedId, QDateTime dtReply, QString codecName) { idsQueue_.enqueue(feedId); xmlsQueue_.enqueue(data); dtReadyQueue_.enqueue(dtReply); codecNameQueue_.enqueue(codecName); qDebug() << "xmlsQueue_ <<" << feedId << "count=" << xmlsQueue_.count(); if (!parseTimer_->isActive()) parseTimer_->start(); } /** @brief Process xml-data queue *----------------------------------------------------------------------------*/ void ParseObject::getQueuedXml() { if (currentFeedId_) return; if (idsQueue_.count()) { currentFeedId_ = idsQueue_.dequeue(); QByteArray currentXml_ = xmlsQueue_.dequeue(); QDateTime currentDtReady_ = dtReadyQueue_.dequeue(); QString currentCodecName_ = codecNameQueue_.dequeue(); qDebug() << "xmlsQueue_ >>" << currentFeedId_ << "count=" << xmlsQueue_.count(); emit signalReadyParse(currentXml_, currentFeedId_, currentDtReady_, currentCodecName_); currentFeedId_ = 0; parseTimer_->start(); } } /** @brief Parse xml-data *----------------------------------------------------------------------------*/ void ParseObject::slotParse(const QByteArray &xmlData, const int &feedId, const QDateTime &dtReply, const QString &codecName) { if (mainApp->isSaveDataLastFeed()) { QFile file(mainApp->dataDir() + "/lastfeed.dat"); file.open(QIODevice::WriteOnly); file.write(xmlData); file.close(); } qDebug() << "=================== parseXml:start ============================"; db_.transaction(); // extract feed id and duplicate news mode from feed table parseFeedId_ = feedId; QString feedUrl; duplicateNewsMode_ = false; QSqlQuery q(db_); q.setForwardOnly(true); q.exec(QString("SELECT duplicateNewsMode, xmlUrl FROM feeds WHERE id=='%1'").arg(parseFeedId_)); if (q.first()) { duplicateNewsMode_ = q.value(0).toBool(); feedUrl = q.value(1).toString(); } // id not found (ex. feed deleted while updating) if (feedUrl.isEmpty()) { qWarning() << QString("Feed with id = '%1' not found").arg(parseFeedId_); emit signalFinishUpdate(parseFeedId_, false, 0, "0"); db_.commit(); return; } qDebug() << QString("Feed '%1' found with id = %2").arg(feedUrl).arg(parseFeedId_); // actually parsing feedChanged_ = false; bool codecOk = false; QString convertData(xmlData); QString feedType; QDomDocument doc; QString errorStr; int errorLine; int errorColumn; QzRegExp rx("encoding=\"([^\"]+)", Qt::CaseInsensitive); int pos = rx.indexIn(xmlData); if (pos == -1) { rx.setPattern("encoding='([^']+)"); pos = rx.indexIn(xmlData); } if (pos > -1) { QString codecNameT = rx.cap(1); qDebug() << "Codec name (1):" << codecNameT; QTextCodec *codec = QTextCodec::codecForName(codecNameT.toUtf8()); if (codec) { convertData = codec->toUnicode(xmlData); } else { qWarning() << "Codec not found (1): " << codecNameT << feedUrl; if (codecNameT.contains("us-ascii", Qt::CaseInsensitive)) { QString str(xmlData); convertData = str.remove(rx.cap(0)+"\""); } } } else { if (!codecName.isEmpty()) { qDebug() << "Codec name (2):" << codecName; QTextCodec *codec = QTextCodec::codecForName(codecName.toUtf8()); if (codec) { convertData = codec->toUnicode(xmlData); codecOk = true; } else { qWarning() << "Codec not found (2): " << codecName << feedUrl; } } if (!codecOk) { codecOk = false; QStringList codecNameList; codecNameList << "UTF-8" << "Windows-1251" << "KOI8-R" << "KOI8-U" << "ISO 8859-5" << "IBM 866"; foreach (QString codecNameT, codecNameList) { QTextCodec *codec = QTextCodec::codecForName(codecNameT.toUtf8()); if (codec && codec->canEncode(xmlData)) { qDebug() << "Codec name (3):" << codecNameT; convertData = codec->toUnicode(xmlData); codecOk = true; break; } } if (!codecOk) { convertData = QString::fromLocal8Bit(xmlData); } } } if (!doc.setContent(convertData, false, &errorStr, &errorLine, &errorColumn)) { qWarning() << QString("Parse data error (2): url %1, id %2, line %3, column %4: %5"). arg(feedUrl).arg(parseFeedId_). arg(errorLine).arg(errorColumn).arg(errorStr); } else { QDomElement rootElem = doc.documentElement(); feedType = rootElem.tagName(); qDebug() << "Feed type: " << feedType; q.exec(QString("SELECT id, guid, title, published, link_href FROM news WHERE feedId='%1'"). arg(parseFeedId_)); if (q.lastError().isValid()) { qWarning() << __PRETTY_FUNCTION__ << __LINE__ << "q.lastError(): " << q.lastError().text(); } else { while (q.next()) { QString str = q.value(2).toString(); if (!str.isEmpty()) { titleList_.append(str); str = q.value(1).toString(); guidList_.append(str); str = q.value(3).toString(); publishedList_.append(str); str = q.value(4).toString(); linkList_.append(str); } } } q.finish(); if (feedType == "feed") { parseAtom(feedUrl, doc); } else if ((feedType == "rss") || (feedType == "rdf:RDF")) { parseRss(feedUrl, doc); } guidList_.clear(); titleList_.clear(); publishedList_.clear(); linkList_.clear(); } // Set feed update time and receive data from server time QString updated = QLocale::c().toString(QDateTime::currentDateTimeUtc(), "yyyy-MM-ddTHH:mm:ss"); QString lastBuildDate = dtReply.toString(Qt::ISODate); q.prepare("UPDATE feeds SET updated=?, lastBuildDate=?, status=0 WHERE id=?"); q.addBindValue(updated); q.addBindValue(lastBuildDate); q.addBindValue(parseFeedId_); q.exec(); int newCount = 0; if (feedChanged_) { runUserFilter(parseFeedId_); newCount = recountFeedCounts(parseFeedId_, feedUrl, updated, lastBuildDate); } q.finish(); db_.commit(); emit signalFinishUpdate(parseFeedId_, feedChanged_, newCount, "0"); qDebug() << "=================== parseXml:finish ==========================="; } void ParseObject::parseAtom(const QString &feedUrl, const QDomDocument &doc) { QDomElement rootElem = doc.documentElement(); FeedItemStruct feedItem; feedItem.linkBase = rootElem.attribute("xml:base"); feedItem.title = toPlainText(rootElem.namedItem("title").toElement().text()); feedItem.description = rootElem.namedItem("subtitle").toElement().text(); feedItem.updated = rootElem.namedItem("updated").toElement().text(); feedItem.updated = parseDate(feedItem.updated, feedUrl); QDomElement authorElem = rootElem.namedItem("author").toElement(); if (!authorElem.isNull()) { feedItem.author = toPlainText(authorElem.namedItem("name").toElement().text()); if (feedItem.author.isEmpty()) feedItem.author = toPlainText(authorElem.text()); feedItem.authorUri = authorElem.namedItem("uri").toElement().text(); feedItem.authorEmail = authorElem.namedItem("email").toElement().text(); } feedItem.language = rootElem.namedItem("language").toElement().text(); QDomNodeList linksList = rootElem.elementsByTagName("link"); for (int j = 0; j < linksList.size(); j++) { if (linksList.at(j).toElement().attribute("rel") == "alternate") { feedItem.link = linksList.at(j).toElement().attribute("href"); break; } } if (feedItem.link.isEmpty()) { for (int j = 0; j < linksList.size(); j++) { if (!(linksList.at(j).toElement().attribute("rel") == "self")) { feedItem.link = linksList.at(j).toElement().attribute("href"); break; } } } if (QUrl(feedItem.link).host().isEmpty()) { if (!feedItem.linkBase.isEmpty() && !QUrl(feedItem.linkBase).host().isEmpty()) feedItem.link = QUrl(feedItem.linkBase).scheme() % "://" % QUrl(feedItem.linkBase).host(); else feedItem.link = QUrl(feedUrl).scheme() % "://" % QUrl(feedUrl).host(); } if (feedItem.linkBase.isEmpty() && !QUrl(feedItem.link).host().isEmpty()) feedItem.linkBase = QUrl(feedItem.link).scheme() % "://" % QUrl(feedItem.link).host(); if (QUrl(feedItem.link).host().isEmpty()) feedItem.link = feedItem.linkBase + feedItem.link; feedItem.link = toPlainText(feedItem.link); QSqlQuery q(db_); q.setForwardOnly(true); QString qStr ("UPDATE feeds " "SET title=?, description=?, htmlUrl=?, " "author_name=?, author_email=?, " "author_uri=?, pubdate=?, language=? " "WHERE id==?"); q.prepare(qStr); q.addBindValue(feedItem.title); q.addBindValue(feedItem.description); q.addBindValue(feedItem.link); q.addBindValue(feedItem.author); q.addBindValue(feedItem.authorEmail); q.addBindValue(feedItem.authorUri); q.addBindValue(feedItem.updated); q.addBindValue(feedItem.language); q.addBindValue(parseFeedId_); q.exec(); QDomNodeList newsList = doc.elementsByTagName("entry"); for (int i = 0; i < newsList.size(); i++) { NewsItemStruct newsItem; newsItem.id = newsList.item(i).namedItem("id").toElement().text(); newsItem.title = toPlainText(newsList.item(i).namedItem("title").toElement().text()); newsItem.updated = newsList.item(i).namedItem("published").toElement().text(); if (newsItem.updated.isEmpty()) newsItem.updated = newsList.item(i).namedItem("updated").toElement().text(); newsItem.updated = parseDate(newsItem.updated, feedUrl); QDomElement authorElem = newsList.item(i).namedItem("author").toElement(); if (!authorElem.isNull()) { newsItem.author = toPlainText(authorElem.namedItem("name").toElement().text()); if (newsItem.author.isEmpty()) newsItem.author = toPlainText(authorElem.text()); newsItem.authorUri = authorElem.namedItem("uri").toElement().text(); newsItem.authorEmail = authorElem.namedItem("email").toElement().text(); } newsItem.description = newsList.item(i).namedItem("summary").toElement().text(); QDomNode nodeContent = newsList.item(i).namedItem("content"); if (nodeContent.toElement().attribute("type") == "xhtml") { QTextStream in(&newsItem.content); nodeContent.save(in, 0); } else { newsItem.content = nodeContent.toElement().text(); } if (!(newsItem.content.isEmpty() || (newsItem.description.length() > newsItem.content.length()))) { newsItem.description = newsItem.content; } newsItem.content.clear(); QDomNodeList categoryElem = newsList.item(i).toElement().elementsByTagName("category"); for (int j = 0; j < categoryElem.size(); j++) { if (!newsItem.category.isEmpty()) newsItem.category.append(", "); QString category = categoryElem.at(j).toElement().attribute("label"); if (category.isEmpty()) category = categoryElem.at(j).toElement().attribute("term"); newsItem.category.append(toPlainText(category)); } QDomElement enclosureElem = newsList.item(i).namedItem("enclosure").toElement(); newsItem.eUrl = enclosureElem.attribute("url"); newsItem.eType = enclosureElem.attribute("type"); newsItem.eLength = enclosureElem.attribute("length"); QDomNodeList linksList = newsList.item(i).toElement().elementsByTagName("link"); for (int j = 0; j < linksList.size(); j++) { if (linksList.at(j).toElement().attribute("type") == "text/html") { if (linksList.at(j).toElement().attribute("rel") == "self") newsItem.link = linksList.at(j).toElement().attribute("href"); if (linksList.at(j).toElement().attribute("rel") == "alternate") newsItem.linkAlternate = linksList.at(j).toElement().attribute("href"); if (linksList.at(j).toElement().attribute("rel") == "replies") newsItem.comments = linksList.at(j).toElement().attribute("href"); } else if (newsItem.linkAlternate.isEmpty()) { if (linksList.at(j).toElement().attribute("rel") == "alternate") newsItem.linkAlternate = linksList.at(j).toElement().attribute("href"); } } for (int j = 0; j < linksList.size(); j++) { if (newsItem.linkAlternate.isEmpty()) { if (!(linksList.at(j).toElement().attribute("rel") == "self")) { newsItem.linkAlternate = linksList.at(j).toElement().attribute("href"); break; } } } if (!newsItem.link.isEmpty() && QUrl(newsItem.link).host().isEmpty()) newsItem.link = feedItem.linkBase + newsItem.link; newsItem.link = toPlainText(newsItem.link); if (!newsItem.linkAlternate.isEmpty() && QUrl(newsItem.linkAlternate).host().isEmpty()) newsItem.linkAlternate = feedItem.linkBase + newsItem.linkAlternate; newsItem.linkAlternate = toPlainText(newsItem.linkAlternate); if (newsItem.link.isEmpty()) { newsItem.link = newsItem.linkAlternate; newsItem.linkAlternate.clear(); } addAtomNewsIntoBase(&newsItem); } } void ParseObject::addAtomNewsIntoBase(NewsItemStruct *newsItem) { Common::sleep(5); // search news duplicates in base QSqlQuery q(db_); q.setForwardOnly(true); QString qStr; qDebug() << "atomId:" << newsItem->id; qDebug() << "title:" << newsItem->title; qDebug() << "published:" << newsItem->updated; bool isDuplicate = false; for (int i = 0; i < guidList_.count(); ++i) { if (!newsItem->id.isEmpty()) { // search by guid if present if (guidList_.at(i) == newsItem->id) { if (duplicateNewsMode_) { // autodelete duplicate news enabled isDuplicate = true; } else { // autodelete dupl. news disabled if (!newsItem->updated.isEmpty()) { // search by pubDate if present if (publishedList_.at(i) == newsItem->updated) isDuplicate = true; } else { // ... or by title if (titleList_.at(i) == newsItem->title) isDuplicate = true; } } } } else { // guid is absent if (!newsItem->updated.isEmpty()) { // search by pubDate if present if (publishedList_.at(i) == newsItem->updated) isDuplicate = true; } else { // ... or by title if (titleList_.at(i) == newsItem->title) isDuplicate = true; } } if (isDuplicate) break; } // if duplicates not found, add news into base if (!isDuplicate) { bool read = false; if (mainApp->mainWindow()->markIdenticalNewsRead_) { q.prepare("SELECT id FROM news WHERE title LIKE :title AND feedId!=:id"); q.bindValue(":id", parseFeedId_); q.bindValue(":title", newsItem->title); q.exec(); if (q.first()) read = true; } qStr = QString("INSERT INTO news(" "feedId, description, content, guid, title, author_name, " "author_uri, author_email, published, received, " "link_href, link_alternate, category, comments, " "enclosure_url, enclosure_type, enclosure_length, new, read) " "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); q.prepare(qStr); q.addBindValue(parseFeedId_); q.addBindValue(newsItem->description); q.addBindValue(newsItem->content); q.addBindValue(newsItem->id); q.addBindValue(newsItem->title); q.addBindValue(newsItem->author); q.addBindValue(newsItem->authorUri); q.addBindValue(newsItem->authorEmail); QString updated = newsItem->updated; if (updated.isEmpty()) updated = QDateTime::currentDateTimeUtc().toString(Qt::ISODate); q.addBindValue(updated); q.addBindValue(QDateTime::currentDateTime().toString(Qt::ISODate)); q.addBindValue(newsItem->link); q.addBindValue(newsItem->linkAlternate); q.addBindValue(newsItem->category); q.addBindValue(newsItem->comments); q.addBindValue(newsItem->eUrl); q.addBindValue(newsItem->eType); q.addBindValue(newsItem->eLength); q.addBindValue(read ? 0 : 1); q.addBindValue(read ? 2 : 0); if (!q.exec()) { qWarning() << __PRETTY_FUNCTION__ << __LINE__ << "q.lastError(): " << q.lastError().text(); } q.finish(); qDebug() << "q.exec(" << q.lastQuery() << ")"; qDebug() << " " << parseFeedId_; qDebug() << " " << newsItem->description; qDebug() << " " << newsItem->content; qDebug() << " " << newsItem->id; qDebug() << " " << newsItem->title; qDebug() << " " << newsItem->author; qDebug() << " " << newsItem->authorUri; qDebug() << " " << newsItem->authorEmail; qDebug() << " " << newsItem->updated; qDebug() << " " << QDateTime::currentDateTime().toString(); qDebug() << " " << newsItem->link; qDebug() << " " << newsItem->linkAlternate; qDebug() << " " << newsItem->category; qDebug() << " " << newsItem->comments; qDebug() << " " << newsItem->eUrl; qDebug() << " " << newsItem->eType; qDebug() << " " << newsItem->eLength; feedChanged_ = true; } } void ParseObject::parseRss(const QString &feedUrl, const QDomDocument &doc) { QDomNode channel = doc.documentElement().namedItem("channel"); FeedItemStruct feedItem; feedItem.title = toPlainText(channel.namedItem("title").toElement().text()); feedItem.description = channel.namedItem("description").toElement().text(); feedItem.link = toPlainText(channel.namedItem("link").toElement().text()); if (QUrl(feedItem.link).host().isEmpty()) feedItem.link = QUrl(feedUrl).scheme() % "://" % QUrl(feedUrl).host() + feedItem.link; feedItem.updated = channel.namedItem("pubDate").toElement().text(); if (feedItem.updated.isEmpty()) feedItem.updated = channel.namedItem("pubdate").toElement().text(); feedItem.updated = parseDate(feedItem.updated, feedUrl); feedItem.author = toPlainText(channel.namedItem("author").toElement().text()); feedItem.language = channel.namedItem("language").toElement().text(); QSqlQuery q(db_); q.setForwardOnly(true); QString qStr("UPDATE feeds " "SET title=?, description=?, htmlUrl=?, " "author_name=?, pubdate=?, language=? " "WHERE id==?"); q.prepare(qStr); q.addBindValue(feedItem.title); q.addBindValue(feedItem.description); q.addBindValue(feedItem.link); q.addBindValue(feedItem.author); q.addBindValue(feedItem.updated); q.addBindValue(feedItem.language); q.addBindValue(parseFeedId_); q.exec(); QDomNodeList newsList = doc.elementsByTagName("item"); for (int i = 0; i < newsList.size(); i++) { NewsItemStruct newsItem; newsItem.id = newsList.item(i).namedItem("guid").toElement().text(); newsItem.title = toPlainText(newsList.item(i).namedItem("title").toElement().text()); newsItem.updated = newsList.item(i).namedItem("pubDate").toElement().text(); if (newsItem.updated.isEmpty()) newsItem.updated = newsList.item(i).namedItem("pubdate").toElement().text(); if (newsItem.updated.isEmpty()) newsItem.updated = newsList.item(i).namedItem("dc:date").toElement().text(); newsItem.updated = parseDate(newsItem.updated, feedUrl); newsItem.author = toPlainText(newsList.item(i).namedItem("author").toElement().text()); if (newsItem.author.isEmpty()) newsItem.author = toPlainText(newsList.item(i).namedItem("dc:creator").toElement().text()); newsItem.link = toPlainText(newsList.item(i).namedItem("link").toElement().text()); if (newsItem.link.isEmpty()) { if (newsList.item(i).namedItem("guid").toElement().attribute("isPermaLink") == "true") newsItem.link = newsItem.id; } if (QUrl(newsItem.link).host().isEmpty()) newsItem.link = QUrl(feedUrl).scheme() % "://" % QUrl(feedUrl).host() + newsItem.link; newsItem.description = newsList.item(i).namedItem("description").toElement().text(); newsItem.content = newsList.item(i).namedItem("content:encoded").toElement().text(); if (newsItem.content.isEmpty() || (newsItem.description.length() > newsItem.content.length())) { newsItem.content.clear(); } else { newsItem.description = newsItem.content; } QDomNodeList categoryElem = newsList.item(i).toElement().elementsByTagName("category"); for (int j = 0; j < categoryElem.size(); j++) { if (!newsItem.category.isEmpty()) newsItem.category.append(", "); newsItem.category.append(toPlainText(categoryElem.at(j).toElement().text())); } newsItem.comments = newsList.item(i).namedItem("comments").toElement().text(); QDomElement enclosureElem = newsList.item(i).namedItem("enclosure").toElement(); newsItem.eUrl = enclosureElem.attribute("url"); newsItem.eType = enclosureElem.attribute("type"); newsItem.eLength = enclosureElem.attribute("length"); if (newsItem.title.isEmpty()) { newsItem.title = toPlainText(newsItem.description); if (newsItem.title.size() > 50) { newsItem.title.resize(50); newsItem.title = newsItem.title % "..."; } } addRssNewsIntoBase(&newsItem); } } void ParseObject::addRssNewsIntoBase(NewsItemStruct *newsItem) { Common::sleep(5); // search news duplicates in base QSqlQuery q(db_); q.setForwardOnly(true); QString qStr; qDebug() << "guid: " << newsItem->id; qDebug() << "link_href:" << newsItem->link; qDebug() << "title:" << newsItem->title; qDebug() << "published:" << newsItem->updated; bool isDuplicate = false; for (int i = 0; i < guidList_.count(); ++i) { if (!newsItem->id.isEmpty()) { // search by guid if present if (guidList_.at(i) == newsItem->id) { if (!newsItem->updated.isEmpty()) { // search by pubDate if present if (!duplicateNewsMode_) { if (publishedList_.at(i) == newsItem->updated) isDuplicate = true; } else { isDuplicate = true; } } else { // ... or by title if (titleList_.at(i) == newsItem->title) isDuplicate = true; } } if (!isDuplicate) { if (!newsItem->updated.isEmpty()) { if ((publishedList_.at(i) == newsItem->updated) && (titleList_.at(i) == newsItem->title)) { isDuplicate = true; } } } } else if (!newsItem->link.isEmpty()) { // search by link_href if (linkList_.at(i) == newsItem->link) { if (!newsItem->updated.isEmpty()) { // search by pubDate if present if (!duplicateNewsMode_) { if (publishedList_.at(i) == newsItem->updated) isDuplicate = true; } else { isDuplicate = true; } } else { // ... or by title if (titleList_.at(i) == newsItem->title) isDuplicate = true; } } if (!isDuplicate) { if (!newsItem->updated.isEmpty()) { if ((publishedList_.at(i) == newsItem->updated) && (titleList_.at(i) == newsItem->title)) { isDuplicate = true; } } } } else { // guid is absent if (!newsItem->updated.isEmpty()) { // search by pubDate if present if (!duplicateNewsMode_) { if (publishedList_.at(i) == newsItem->updated) isDuplicate = true; } else { isDuplicate = true; } } else { // ... or by title if (titleList_.at(i) == newsItem->title) isDuplicate = true; } if (!isDuplicate) { if (!newsItem->updated.isEmpty()) { if ((publishedList_.at(i) == newsItem->updated) && (titleList_.at(i) == newsItem->title)) { isDuplicate = true; } } } } if (isDuplicate) break; } // if duplicates not found, add news into base if (!isDuplicate) { bool read = false; if (mainApp->mainWindow()->markIdenticalNewsRead_) { q.prepare("SELECT id FROM news WHERE title LIKE :title AND feedId!=:id"); q.bindValue(":id", parseFeedId_); q.bindValue(":title", newsItem->title); q.exec(); if (q.first()) read = true; } qStr = QString("INSERT INTO news(" "feedId, description, content, guid, title, author_name, " "published, received, link_href, category, comments, " "enclosure_url, enclosure_type, enclosure_length, new, read) " "VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); q.prepare(qStr); q.addBindValue(parseFeedId_); q.addBindValue(newsItem->description); q.addBindValue(newsItem->content); q.addBindValue(newsItem->id); q.addBindValue(newsItem->title); q.addBindValue(newsItem->author); QString updated = newsItem->updated; if (updated.isEmpty()) updated = QDateTime::currentDateTimeUtc().toString(Qt::ISODate); q.addBindValue(updated); q.addBindValue(QDateTime::currentDateTime().toString(Qt::ISODate)); q.addBindValue(newsItem->link); q.addBindValue(newsItem->category); q.addBindValue(newsItem->comments); q.addBindValue(newsItem->eUrl); q.addBindValue(newsItem->eType); q.addBindValue(newsItem->eLength); q.addBindValue(read ? 0 : 1); q.addBindValue(read ? 2 : 0); if (!q.exec()) { qWarning() << __PRETTY_FUNCTION__ << __LINE__ << "q.lastError(): " << q.lastError().text(); } q.finish(); qDebug() << "q.exec(" << q.lastQuery() << ")"; qDebug() << " " << parseFeedId_; qDebug() << " " << newsItem->description; qDebug() << " " << newsItem->content; qDebug() << " " << newsItem->id; qDebug() << " " << newsItem->title; qDebug() << " " << newsItem->author; qDebug() << " " << newsItem->updated; qDebug() << " " << QDateTime::currentDateTime().toString(); qDebug() << " " << newsItem->link; qDebug() << " " << newsItem->category; qDebug() << " " << newsItem->comments; qDebug() << " " << newsItem->eUrl; qDebug() << " " << newsItem->eType; qDebug() << " " << newsItem->eLength; feedChanged_ = true; } } QString ParseObject::toPlainText(const QString &text) { return QTextDocumentFragment::fromHtml(text).toPlainText().simplified(); } /** @brief Date/time string parsing *----------------------------------------------------------------------------*/ QString ParseObject::parseDate(const QString &dateString, const QString &urlString) { QDateTime dt; QString temp; QString timeZone; if (dateString.isEmpty()) return QString(); QDateTime dtLocalTime = QDateTime::currentDateTime(); QDateTime dtUTC = QDateTime(dtLocalTime.date(), dtLocalTime.time(), Qt::UTC); int nTimeShift = dtLocalTime.secsTo(dtUTC)/3600; QString ds = dateString.simplified(); QLocale locale(QLocale::C); if (ds.indexOf(',') != -1) { ds = ds.remove(0, ds.indexOf(',')+1).simplified(); } for (int i = 0; i < 2; i++, locale = QLocale::system()) { temp = ds.left(23); timeZone = ds.mid(temp.length(), 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "yyyy-MM-ddTHH:mm:ss.z"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(19); timeZone = ds.mid(temp.length(), 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "yyyy-MM-ddTHH:mm:ss"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(23); timeZone = ds.mid(temp.length()+1, 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "yyyy-MM-dd HH:mm:ss.z"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(19); timeZone = ds.mid(temp.length()+1, 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "yyyy-MM-dd HH:mm:ss"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(20); timeZone = ds.mid(temp.length()+1, 3); if (timeZone.contains("EDT")) timeZone="-4"; if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "dd MMM yyyy HH:mm:ss"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(19); timeZone = ds.mid(temp.length()+1, 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "d MMM yyyy HH:mm:ss"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(11); timeZone = ds.mid(temp.length()+1, 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "dd MMM yyyy"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(10); timeZone = ds.mid(temp.length()+1, 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "d MMM yyyy"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); temp = ds.left(10); timeZone = ds.mid(temp.length(), 3); if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "yyyy-MM-dd"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); // @HACK(arhohryakov:2012.01.01): // "dd MMM yy HH:mm:ss" format doesn/t parse automatically // Reformat it to "dd MMM yyyy HH:mm:ss" QString temp2; temp2 = ds; // save ds for output in case of error if (70 < ds.mid(7, 2).toInt()) temp2.insert(7, "19"); else temp2.insert(7, "20"); temp = temp2.left(20); timeZone = ds.mid(temp.length()+1-2, 3); // "-2", cause 2 symbols inserted if (timeZone.isEmpty()) timeZone = QString::number(nTimeShift); dt = locale.toDateTime(temp, "dd MMM yyyy HH:mm:ss"); if (dt.isValid()) return locale.toString(dt.addSecs(timeZone.toInt() * -3600), "yyyy-MM-ddTHH:mm:ss"); } qDebug() << __LINE__ << "parseDate: error with" << dateString << urlString; return QString(); } /** @brief Apply user filters * @param feedId - Feed Id * @param filterId - Id of particular filter *---------------------------------------------------------------------------*/ void ParseObject::runUserFilter(int feedId, int filterId) { QSqlQuery q(db_); bool onlyNew = true; if (filterId != -1) { onlyNew = false; q.exec(QString("SELECT enable, type FROM filters WHERE id='%1' AND feeds LIKE '%,%2,%'"). arg(filterId).arg(feedId)); } else { q.exec(QString("SELECT enable, type, id FROM filters WHERE feeds LIKE '%,%1,%' ORDER BY num"). arg(feedId)); } while (q.next()) { if ((q.value(0).toInt() == 0) && onlyNew) continue; if (onlyNew) filterId = q.value(2).toInt(); int filterType = q.value(1).toInt(); QString qStr("UPDATE news SET"); QString qStr1; QString qStr2; QString whereStr; QList idLabelsList; QStringList soundList; QStringList colorList; QSqlQuery q1(db_); q1.exec(QString("SELECT action, params FROM filterActions " "WHERE idFilter=='%1'").arg(filterId)); while (q1.next()) { switch (q1.value(0).toInt()) { case 0: // action -> Mark news as read if (!qStr1.isNull()) qStr1.append(","); qStr1.append(" new=0, read=2"); break; case 1: // action -> Add star if (!qStr1.isNull()) qStr1.append(","); qStr1.append(" starred=1"); break; case 2: // action -> Delete if (!qStr1.isNull()) qStr1.append(","); qStr1.append(" new=0, read=2, deleted=1, "); qStr1.append(QString("deleteDate='%1'"). arg(QDateTime::currentDateTime().toString(Qt::ISODate))); break; case 3: // action -> Add Label idLabelsList.append(q1.value(1).toInt()); break; case 4: // action -> Play Sound soundList.append(q1.value(1).toString()); break; case 5: // action -> Show News in Notifier colorList.append(q1.value(1).toString()); break; } } if (qStr1.isEmpty()) qStr.clear(); else qStr.append(qStr1); whereStr = QString(" WHERE feedId='%1' AND deleted=0").arg(feedId); if (onlyNew) whereStr.append(" AND new=1"); qStr2.clear(); switch (filterType) { case 1: // Match all conditions qStr2.append("AND "); break; case 2: // Match any condition qStr2.append("OR "); break; } if ((filterType == 1) || (filterType == 2)) { whereStr.append(" AND ( "); qStr1.clear(); q1.exec(QString("SELECT field, condition, content FROM filterConditions " "WHERE idFilter=='%1'").arg(filterId)); while (q1.next()) { if (!qStr1.isNull()) qStr1.append(qStr2); QString content = q1.value(2).toString().replace("'", "''"); switch (q1.value(0).toInt()) { case 0: // field -> Title switch (q1.value(1).toInt()) { case 0: // condition -> contains qStr1.append(QString("UPPER(title) LIKE '%%1%' ").arg(content.toUpper())); break; case 1: // condition -> doesn't contains qStr1.append(QString("UPPER(title) NOT LIKE '%%1%' ").arg(content.toUpper())); break; case 2: // condition -> is qStr1.append(QString("UPPER(title) LIKE '%1' ").arg(content.toUpper())); break; case 3: // condition -> isn't qStr1.append(QString("UPPER(title) NOT LIKE '%1' ").arg(content.toUpper())); break; case 4: // condition -> begins with qStr1.append(QString("UPPER(title) LIKE '%1%' ").arg(content.toUpper())); break; case 5: // condition -> ends with qStr1.append(QString("UPPER(title) LIKE '%%1' ").arg(content.toUpper())); break; case 6: // condition -> regExp qStr1.append(QString("title REGEXP '%1' ").arg(content)); break; } break; case 1: // field -> Description switch (q1.value(1).toInt()) { case 0: // condition -> contains qStr1.append(QString("UPPER(description) LIKE '%%1%' ").arg(content.toUpper())); break; case 1: // condition -> doesn't contains qStr1.append(QString("UPPER(description) NOT LIKE '%%1%' ").arg(content.toUpper())); break; case 2: // condition -> regExp qStr1.append(QString("description REGEXP '%1' ").arg(content)); break; } break; case 2: // field -> Author switch (q1.value(1).toInt()) { case 0: // condition -> contains qStr1.append(QString("UPPER(author_name) LIKE '%%1%' ").arg(content.toUpper())); break; case 1: // condition -> doesn't contains qStr1.append(QString("UPPER(author_name) NOT LIKE '%%1%' ").arg(content.toUpper())); break; case 2: // condition -> is qStr1.append(QString("UPPER(author_name) LIKE '%1' ").arg(content.toUpper())); break; case 3: // condition -> isn't qStr1.append(QString("UPPER(author_name) NOT LIKE '%1' ").arg(content.toUpper())); break; case 4: // condition -> regExp qStr1.append(QString("author_name REGEXP '%1' ").arg(content)); break; } break; case 3: // field -> Category switch (q1.value(1).toInt()) { case 0: // condition -> contains qStr1.append(QString("UPPER(category) LIKE '%%1%' ").arg(content.toUpper())); break; case 1: // condition -> doesn't contains qStr1.append(QString("UPPER(category) NOT LIKE '%%1%' ").arg(content.toUpper())); break; case 2: // condition -> is qStr1.append(QString("UPPER(category) LIKE '%1' ").arg(content.toUpper())); break; case 3: // condition -> isn't qStr1.append(QString("UPPER(category) NOT LIKE '%1' ").arg(content.toUpper())); break; case 4: // condition -> begins with qStr1.append(QString("UPPER(category) LIKE '%1%' ").arg(content.toUpper())); break; case 5: // condition -> ends with qStr1.append(QString("UPPER(category) LIKE '%%1' ").arg(content.toUpper())); break; case 6: // condition -> regExp qStr1.append(QString("category REGEXP '%1' ").arg(content)); break; } break; case 4: // field -> Status if (q1.value(1).toInt() == 0) { // Status -> is switch (q1.value(2).toInt()) { case 0: qStr1.append("new==1 "); break; case 1: qStr1.append("read>=1 "); break; case 2: qStr1.append("starred==1 "); break; } } else { // Status -> isn't switch (q1.value(2).toInt()) { case 0: qStr1.append("new==0 "); break; case 1: qStr1.append("read==0 "); break; case 2: qStr1.append("starred==0 "); break; } } break; case 5: // field -> Link switch (q1.value(1).toInt()) { case 0: // condition -> contains qStr1.append(QString("link_href LIKE '%%1%' ").arg(content)); break; case 1: // condition -> doesn't contains qStr1.append(QString("link_href NOT LIKE '%%1%' ").arg(content)); break; case 2: // condition -> is qStr1.append(QString("link_href LIKE '%1' ").arg(content)); break; case 3: // condition -> isn't qStr1.append(QString("link_href NOT LIKE '%1' ").arg(content)); break; case 4: // condition -> begins with qStr1.append(QString("link_href LIKE '%1%' ").arg(content)); break; case 5: // condition -> ends with qStr1.append(QString("link_href LIKE '%%1' ").arg(content)); break; case 6: // condition -> regExp qStr1.append(QString("link_href REGEXP '%1' ").arg(content)); break; } break; case 6: // field -> News switch (q1.value(1).toInt()) { case 0: // condition -> contains qStr1.append(QString("(UPPER(title) LIKE '%%1%' OR UPPER(description) LIKE '%%1%') ").arg(content.toUpper())); break; case 1: // condition -> doesn't contains qStr1.append(QString("(UPPER(title) NOT LIKE '%%1%' OR UPPER(description) NOT LIKE '%%1%') ").arg(content.toUpper())); break; case 2: // condition -> regExp qStr1.append(QString("(title REGEXP '%1' OR description REGEXP '%1') ").arg(content)); break; } break; } } whereStr.append(qStr1).append(")"); } if (q1.exec(QString("SELECT id, label FROM news").append(whereStr))) { QSqlQuery q2(db_); bool isPlaySound = false; while (q1.next()) { if (!qStr.isEmpty()) { qStr1 = qStr % QString(" WHERE id='%1'").arg(q1.value(0).toInt()); if (!q2.exec(qStr1)) { qWarning() << __PRETTY_FUNCTION__ << __LINE__ << "q.lastError(): " << q2.lastError().text(); } } if (!idLabelsList.isEmpty()) { QString idLabelsStr = q1.value(1).toString(); foreach (int idLabel, idLabelsList) { if (idLabelsStr.contains(QString(",%1,").arg(idLabel))) continue; if (idLabelsStr.isEmpty()) idLabelsStr.append(","); idLabelsStr.append(QString("%1,").arg(idLabel)); } qStr1 = QString("UPDATE news SET label='%1' WHERE id='%2'").arg(idLabelsStr). arg(q1.value(0).toInt()); if (!q2.exec(qStr1)) { qWarning() << __PRETTY_FUNCTION__ << __LINE__ << "q.lastError(): " << q2.lastError().text(); } } if (!colorList.isEmpty()) { emit signalAddColorList(q1.value(0).toInt(), colorList.at(0)); } isPlaySound = true; } if (isPlaySound && !soundList.isEmpty()) emit signalPlaySound(soundList.at(0)); } else { qWarning() << __PRETTY_FUNCTION__ << __LINE__ << "q.lastError(): " << q1.lastError().text(); } } } /** @brief Update feed counts and all its parent categories * * Update fields: unread news number, * new news number, categories last update date/time * @param feedId - Feed Id * @param feedUrl - Feed URL * @param updated - Time feed updated *----------------------------------------------------------------------------*/ int ParseObject::recountFeedCounts(int feedId, const QString &feedUrl, const QString &updated, const QString &lastBuildDate) { QSqlQuery q(db_); q.setForwardOnly(true); QString qStr; QString htmlUrl; QString title; int feedParId = 0; q.exec(QString("SELECT parentId, htmlUrl, title FROM feeds WHERE id=='%1'").arg(feedId)); if (q.first()) { feedParId = q.value(0).toInt(); htmlUrl = q.value(1).toString(); title = q.value(2).toString(); } FeedCountStruct counts; int undeleteCount = 0; int unreadCount = 0; int newNewsCount = 0; // Count all news (not marked Deleted) qStr = QString("SELECT count(id) FROM news WHERE feedId=='%1' AND deleted==0"). arg(feedId); q.exec(qStr); if (q.first()) undeleteCount = q.value(0).toInt(); // Count unread news qStr = QString("SELECT count(read) FROM news WHERE feedId=='%1' AND read==0 AND deleted==0"). arg(feedId); q.exec(qStr); if (q.first()) unreadCount = q.value(0).toInt(); // Count new news qStr = QString("SELECT count(new) FROM news WHERE feedId=='%1' AND new==1 AND deleted==0"). arg(feedId); q.exec(qStr); if (q.first()) newNewsCount = q.value(0).toInt(); int unreadCountOld = 0; int newCountOld = 0; int undeleteCountOld = 0; qStr = QString("SELECT unread, newCount, undeleteCount FROM feeds WHERE id=='%1'"). arg(feedId); q.exec(qStr); if (q.first()) { unreadCountOld = q.value(0).toInt(); newCountOld = q.value(1).toInt(); undeleteCountOld = q.value(2).toInt(); } if ((unreadCount == unreadCountOld) && (newNewsCount == newCountOld) && (undeleteCount == undeleteCountOld)) { counts.feedId = feedId; counts.unreadCount = unreadCount; counts.newCount = newNewsCount; counts.undeleteCount = undeleteCount; counts.updated = updated; counts.lastBuildDate = lastBuildDate; emit feedCountsUpdate(counts); return 0; } // Set number unread, new and all(undelete) news for feed qStr = QString("UPDATE feeds SET unread='%1', newCount='%2', undeleteCount='%3' " "WHERE id=='%4'"). arg(unreadCount).arg(newNewsCount).arg(undeleteCount).arg(feedId); q.exec(qStr); counts.feedId = feedId; counts.unreadCount = unreadCount; counts.newCount = newNewsCount; counts.undeleteCount = undeleteCount; counts.updated = updated; counts.lastBuildDate = lastBuildDate; counts.htmlUrl = htmlUrl; counts.xmlUrl = feedUrl; counts.title = title; emit feedCountsUpdate(counts); // Recount counters for all feed parents int l_feedParId = feedParId; while (l_feedParId) { QString updatedParent; int newCount = 0; qStr = QString("SELECT sum(unread), sum(newCount), sum(undeleteCount), " "max(updated) FROM feeds WHERE parentId=='%1'"). arg(l_feedParId); q.exec(qStr); if (q.first()) { unreadCount = q.value(0).toInt(); newCount = q.value(1).toInt(); undeleteCount = q.value(2).toInt(); updatedParent = q.value(3).toString(); } qStr = QString("UPDATE feeds SET unread='%1', newCount='%2', undeleteCount='%3', " "updated='%4' WHERE id=='%5'"). arg(unreadCount).arg(newCount).arg(undeleteCount).arg(updatedParent). arg(l_feedParId); q.exec(qStr); FeedCountStruct counts; counts.feedId = l_feedParId; q.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(l_feedParId)); if (q.first()) l_feedParId = q.value(0).toInt(); counts.unreadCount = unreadCount; counts.newCount = newCount; counts.undeleteCount = undeleteCount; counts.updated = updatedParent; emit feedCountsUpdate(counts); } return (newNewsCount - newCountOld); } quiterss-0.18.3/src/parseobject.h000066400000000000000000000070461265173051100167330ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef PARSEOBJECT_H #define PARSEOBJECT_H #include #include #include #include #include #include struct FeedItemStruct { QString title; QString updated; QString link; QString linkBase; QString language; QString author; QString authorUri; QString authorEmail; QString description; }; struct NewsItemStruct { QString id; QString title; QString updated; QString link; QString linkAlternate; QString language; QString author; QString authorUri; QString authorEmail; QString description; QString content; QString category; QString eUrl; QString eType; QString eLength; QString comments; }; struct FeedCountStruct{ int feedId; int unreadCount; int newCount; int undeleteCount; QString updated; QString lastBuildDate; QString htmlUrl; QString xmlUrl; QString title; }; Q_DECLARE_METATYPE(FeedCountStruct) class ParseObject : public QObject { Q_OBJECT public: explicit ParseObject(QObject *parent = 0); ~ParseObject(); void disconnectObjects(); public slots: void parseXml(QByteArray data, int feedId, QDateTime dtReply, QString codecName); void runUserFilter(int feedId, int filterId = -1); signals: void signalReadyParse(const QByteArray &xml, const int &feedId, const QDateTime &dtReply, const QString &codecName); void signalFinishUpdate(int feedId, bool changed, int newCount, QString status); void feedCountsUpdate(FeedCountStruct counts); void signalPlaySound(const QString &soundPath); void signalAddColorList(int id, const QString &color); private slots: void getQueuedXml(); void slotParse(const QByteArray &xmlData, const int &feedId, const QDateTime &dtReply, const QString &codecName); void addAtomNewsIntoBase(NewsItemStruct *newsItem); void addRssNewsIntoBase(NewsItemStruct *newsItem); private: void parseAtom(const QString &feedUrl, const QDomDocument &doc); void parseRss(const QString &feedUrl, const QDomDocument &doc); QString toPlainText(const QString &text); QString parseDate(const QString &dateString, const QString &urlString); int recountFeedCounts(int feedId, const QString &feedUrl, const QString &updated, const QString &lastBuildDate); QSqlDatabase db_; QTimer *parseTimer_; int currentFeedId_; QQueue idsQueue_; QQueue xmlsQueue_; QQueue dtReadyQueue_; QQueue codecNameQueue_; int parseFeedId_; bool duplicateNewsMode_; bool feedChanged_; QStringList guidList_; QStringList linkList_; QStringList titleList_; QStringList publishedList_; }; #endif // PARSEOBJECT_H quiterss-0.18.3/src/plugins/000077500000000000000000000000001265173051100157335ustar00rootroot00000000000000quiterss-0.18.3/src/plugins/clicktoflash.cpp000066400000000000000000000204771265173051100211170ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2014 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * * Copyright (C) 2009 by Benjamin C. Meyer * Copyright (C) 2010 by Matthieu Gicquel * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * ============================================================ */ #include "clicktoflash.h" #include "mainapplication.h" #include "webpage.h" #include #include #include #include #include #include #include #include #include QUrl ClickToFlash::acceptedUrl; QStringList ClickToFlash::acceptedArgNames; QStringList ClickToFlash::acceptedArgValues; ClickToFlash::ClickToFlash(const QUrl &pluginUrl, const QStringList &argumentNames, const QStringList &argumentValues, WebPage *parentPage, QWidget *parent) : QWidget(parent) , argumentNames_(argumentNames) , argumentValues_(argumentValues) , url_(pluginUrl) , page_(parentPage) { frame_ = new QFrame(this); frame_->setObjectName("click2flash-frame"); frame_->setContentsMargins(0, 0, 0, 0); loadButton_ = new QToolButton(this); loadButton_->setObjectName("click2flash-toolbutton"); loadButton_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); loadButton_->setCursor(Qt::PointingHandCursor); QHBoxLayout *layout1 = new QHBoxLayout(this); layout1->setContentsMargins(0, 0, 0, 0); layout1->addWidget(frame_); QHBoxLayout *layout2 = new QHBoxLayout(frame_); layout2->setContentsMargins(0, 0, 0, 0); layout2->addWidget(loadButton_); connect(loadButton_, SIGNAL(clicked()), this, SLOT(load())); setMinimumSize(29, 29); setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenuRequested(QPoint))); QTimer::singleShot(0, this, SLOT(ensurePluginVisible())); } bool ClickToFlash::isAlreadyAccepted(const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) { return (url == acceptedUrl && argumentNames == acceptedArgNames && argumentValues == acceptedArgValues); } void ClickToFlash::ensurePluginVisible() { page_->scheduleAdjustPage(); } void ClickToFlash::customContextMenuRequested(const QPoint &pos) { QMenu menu; menu.addAction(tr("Object blocked by ClickToFlash")); menu.addSeparator(); menu.addAction(tr("Hide object"), this, SLOT(hideObject())); menu.addAction(tr("Add '%1' to whitelist").arg(url_.host()), this, SLOT(toWhitelist())); menu.actions().at(0)->setEnabled(false); menu.exec(mapToGlobal(pos)); } void ClickToFlash::toWhitelist() { mainApp->c2fAddWhitelist(url_.host()); load(); } void ClickToFlash::hideObject() { findElement(); if (!element_.isNull()) { element_.setStyleProperty("visibility", "hidden"); } else { hide(); } } void ClickToFlash::findElement() { if (!loadButton_) return; QPoint objectPos = page_->view()->mapFromGlobal(loadButton_->mapToGlobal(loadButton_->pos())); QWebFrame* objectFrame = page_->frameAt(objectPos); QWebHitTestResult hitResult; QWebElement hitElement; if (objectFrame) { hitResult = objectFrame->hitTestContent(objectPos); hitElement = hitResult.element(); } if (!hitElement.isNull() && (hitElement.tagName().compare("embed", Qt::CaseInsensitive) == 0 || hitElement.tagName().compare("object", Qt::CaseInsensitive) == 0)) { element_ = hitElement; return; } // HitTestResult failed, trying to find element by src // attribute in elements at all frames on page (less accurate) QList frames; frames.append(objectFrame); frames.append(page_->mainFrame()); while (!frames.isEmpty()) { QWebFrame* frame = frames.takeFirst(); if (!frame) { continue; } QWebElement docElement = frame->documentElement(); QWebElementCollection elements; elements.append(docElement.findAll(QLatin1String("embed"))); elements.append(docElement.findAll(QLatin1String("object"))); foreach (const QWebElement &element, elements) { if (!checkElement(element) && !checkUrlOnElement(element)) { continue; } element_ = element; return; } frames += frame->childFrames(); } } void ClickToFlash::load() { findElement(); if (element_.isNull()) { qWarning("Click2Flash: Cannot find Flash object."); } else { acceptedUrl = url_; acceptedArgNames = argumentNames_; acceptedArgValues = argumentValues_; QString js = "var c2f_clone=this.cloneNode(true);var c2f_parentNode=this.parentNode;" "var c2f_substituteElement=document.createElement(this.tagName);" "c2f_substituteElement.width=this.width;c2f_substituteElement.height=this.height;" "c2f_substituteElement.type=\"application/futuresplash\";" "this.parentNode.replaceChild(c2f_substituteElement,this);setTimeout(function(){" "c2f_parentNode.replaceChild(c2f_clone,c2f_substituteElement);},250);"; element_.evaluateJavaScript(js); } } bool ClickToFlash::checkUrlOnElement(QWebElement el) { QString checkString = el.attribute("src"); if (checkString.isEmpty()) { checkString = el.attribute("data"); } if (checkString.isEmpty()) { checkString = el.attribute("value"); } checkString = page_->mainFrame()->url().resolved(QUrl(checkString)).toString(QUrl::RemoveQuery); return url_.toEncoded().contains(checkString.toUtf8()); } bool ClickToFlash::checkElement(QWebElement el) { if (argumentNames_ == el.attributeNames()) { foreach (const QString &name, argumentNames_) { if (argumentValues_.indexOf(el.attribute(name)) == -1) { return false; } } return true; } return false; } quiterss-0.18.3/src/plugins/clicktoflash.h000066400000000000000000000100231265173051100205460ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * QupZilla - WebKit based browser * Copyright (C) 2010-2012 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ /* ============================================================ * * Copyright (C) 2009 by Benjamin C. Meyer * Copyright (C) 2010 by Matthieu Gicquel * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * ============================================================ */ #ifndef CLICKTOFLASH_H #define CLICKTOFLASH_H #include #include #include class QToolButton; class QHBoxLayout; class QFrame; class WebPage; class ClickToFlash : public QWidget { Q_OBJECT public: explicit ClickToFlash(const QUrl &pluginUrl, const QStringList &argumentNames, const QStringList &argumentValues, WebPage *parentPage, QWidget *parent = 0); static bool isAlreadyAccepted(const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues); private slots: void load(); void customContextMenuRequested(const QPoint &pos); void toWhitelist(); void findElement(); void hideObject(); void ensurePluginVisible(); private: bool checkElement(QWebElement el); bool checkUrlOnElement(QWebElement el); QStringList argumentNames_; QStringList argumentValues_; QWebElement element_; QToolButton* loadButton_; QFrame* frame_; /** used to find the right QWebElement between the ones of the different plugins */ const QUrl url_; static QUrl acceptedUrl; static QStringList acceptedArgNames; static QStringList acceptedArgValues; WebPage* page_; }; #endif // CLICKTOFLASH_H quiterss-0.18.3/src/plugins/webpluginfactory.cpp000066400000000000000000000064241265173051100220310ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "webpluginfactory.h" #include "clicktoflash.h" #include "mainapplication.h" #include "adblockmanager.h" #include "webpage.h" #include #include WebPluginFactory::WebPluginFactory(WebPage *page) : QWebPluginFactory(page) , page_(page) { } QObject* WebPluginFactory::create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const { if (url.isEmpty()) { return new QObject(); } // AdBlock AdBlockManager* manager = AdBlockManager::instance(); QNetworkRequest request(url); request.setAttribute(QNetworkRequest::Attribute(QNetworkRequest::User + 150), QString("object")); if (manager->isEnabled() && manager->block(request)) { return new QObject(); } QString mime = mimeType.trimmed(); if (mime.isEmpty()) { if (url.toString().contains(QLatin1String(".swf"))) { mime = "application/x-shockwave-flash"; } else { return 0; } } if (mime != QLatin1String("application/x-shockwave-flash")) { if ((mime != QLatin1String("application/futuresplash")) && (mime != QLatin1String("application/x-java-applet"))) { qDebug() << "WebPluginFactory::create creating object of mimeType : " << mime; } return 0; } if (!mainApp->c2fIsEnabled()) { return 0; } // Click2Flash whitelist QStringList whitelist = mainApp->c2fGetWhitelist(); if (whitelist.contains(url.host()) || whitelist.contains("www." + url.host()) || whitelist.contains(url.host().remove(QLatin1String("www.")))) { return 0; } // Click2Flash already accepted if (ClickToFlash::isAlreadyAccepted(url, argumentNames, argumentValues)) { return 0; } int ctfWidth = 10; int ctfHeight = 10; for (int i = 0; i < argumentNames.count(); i++) { if (argumentNames[i] == "width") { if (!argumentValues[i].contains("%")) ctfWidth = argumentValues[i].toInt(); } if (argumentNames[i] == "height") { if (!argumentValues[i].contains("%")) ctfHeight = argumentValues[i].toInt(); } } if ((ctfWidth < 5) && (ctfHeight < 5)) { return 0; } ClickToFlash* ctf = new ClickToFlash(url, argumentNames, argumentValues, page_); return ctf; } QList WebPluginFactory::plugins() const { QList plugins; return plugins; } quiterss-0.18.3/src/plugins/webpluginfactory.h000066400000000000000000000026061265173051100214740ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef WEB_PLUGIN_FACTORY_H #define WEB_PLUGIN_FACTORY_H #include class WebPage; class WebPluginFactory : public QWebPluginFactory { public: WebPluginFactory(WebPage *page); virtual QObject *create(const QString &mimeType, const QUrl &url, const QStringList &argumentNames, const QStringList &argumentValues) const; QList plugins() const; private: WebPage *page_; }; #endif // WEB_PLUGIN_FACTORY_H quiterss-0.18.3/src/requestfeed.cpp000066400000000000000000000325211265173051100172750ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "requestfeed.h" #include "VersionNo.h" #include "mainapplication.h" #include #ifdef HAVE_QT5 #include #else #include #endif #include #include #define REPLY_MAX_COUNT 10 RequestFeed::RequestFeed(int timeoutRequest, int numberRequests, int numberRepeats, QObject *parent) : QObject(parent) , timeoutRequest_(timeoutRequest) , numberRequests_(numberRequests) , numberRepeats_(numberRepeats) { setObjectName("requestFeed_"); timeout_ = new QTimer(this); timeout_->setInterval(1000); connect(timeout_, SIGNAL(timeout()), this, SLOT(slotRequestTimeout())); getUrlTimer_ = new QTimer(this); getUrlTimer_->setSingleShot(true); getUrlTimer_->setInterval(50); connect(getUrlTimer_, SIGNAL(timeout()), this, SLOT(getQueuedUrl())); networkManager_ = new NetworkManager(true, this); connect(networkManager_, SIGNAL(finished(QNetworkReply*)), this, SLOT(finished(QNetworkReply*))); connect(this, SIGNAL(signalHead(QUrl,int,QString,QDateTime,int)), SLOT(slotHead(QUrl,int,QString,QDateTime,int)), Qt::QueuedConnection); connect(this, SIGNAL(signalGet(QUrl,int,QString,QDateTime,int)), SLOT(slotGet(QUrl,int,QString,QDateTime,int)), Qt::QueuedConnection); } RequestFeed::~RequestFeed() { } void RequestFeed::disconnectObjects() { disconnect(this); networkManager_->disconnect(networkManager_); } /** @brief Put URL in request queue *----------------------------------------------------------------------------*/ void RequestFeed::requestUrl(int id, QString urlString, QDateTime date, QString userInfo) { if (!timeout_->isActive()) timeout_->start(); idsQueue_.enqueue(id); feedsQueue_.enqueue(urlString); dateQueue_.enqueue(date); userInfo_.enqueue(userInfo); if (!getUrlTimer_->isActive()) getUrlTimer_->start(); qDebug() << "urlsQueue_ <<" << urlString << "count=" << feedsQueue_.count(); } void RequestFeed::stopRequest() { while (!feedsQueue_.isEmpty()) { int feedId = idsQueue_.dequeue(); QString feedUrl = feedsQueue_.dequeue(); dateQueue_.clear(); userInfo_.clear(); emit getUrlDone(feedsQueue_.count(), feedId, feedUrl); } } /** @brief Process request queue on timer timeouts *----------------------------------------------------------------------------*/ void RequestFeed::getQueuedUrl() { if ((numberRequests_ <= currentFeeds_.size()) || (REPLY_MAX_COUNT <= currentFeeds_.size())) { getUrlTimer_->start(); return; } if (!feedsQueue_.isEmpty()) { getUrlTimer_->start(); QString feedUrl = feedsQueue_.head(); if (hostList_.contains(QUrl(feedUrl).host())) { foreach (QString url, currentFeeds_) { if (QUrl(url).host() == QUrl(feedUrl).host()) { return; } } } int feedId = idsQueue_.dequeue(); feedUrl = feedsQueue_.dequeue(); emit setStatusFeed(feedId, "1 Update"); QUrl getUrl = QUrl::fromEncoded(feedUrl.toUtf8()); QString userInfo = userInfo_.dequeue(); if (!userInfo.isEmpty()) { getUrl.setUserInfo(userInfo); // getUrl.addQueryItem("auth", getUrl.scheme()); } QDateTime currentDate = dateQueue_.dequeue(); if (currentDate.isValid()) emit signalHead(getUrl, feedId, feedUrl, currentDate); else emit signalGet(getUrl, feedId, feedUrl, currentDate); qDebug() << "urlsQueue_ >>" << feedUrl << "count=" << feedsQueue_.count(); } } /** @brief Prepare and send network request to get head *----------------------------------------------------------------------------*/ void RequestFeed::slotHead(const QUrl &getUrl, const int &id, const QString &feedUrl, const QDateTime &date, const int &count) { qDebug() << objectName() << "::head:" << getUrl.toEncoded() << "feed:" << feedUrl; QNetworkRequest request(getUrl); QString userAgent = QString("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/%1 (KHTML, like Gecko) QuiteRSS/%2 Safari/%1"). arg(qWebKitVersion()).arg(STRPRODUCTVER); request.setRawHeader("User-Agent", userAgent.toUtf8()); request.setRawHeader("Accept-Language", "*,en-us;q=0.8,en;q=0.6"); currentUrls_.append(getUrl); currentIds_.append(id); currentFeeds_.append(feedUrl); currentDates_.append(date); currentCount_.append(count); currentHead_.append(true); currentTime_.append(timeoutRequest_); QNetworkReply *reply = networkManager_->head(request); reply->setProperty("feedReply", QVariant(true)); requestUrl_.append(reply->url()); networkReply_.append(reply); } /** @brief Prepare and send network request to get all data *----------------------------------------------------------------------------*/ void RequestFeed::slotGet(const QUrl &getUrl, const int &id, const QString &feedUrl, const QDateTime &date, const int &count) { qDebug() << objectName() << "::get:" << getUrl.toEncoded() << "feed:" << feedUrl; QNetworkRequest request(getUrl); request.setRawHeader("Accept", "application/atom+xml,application/xml;q=0.9,text/xml;q=0.8,*/*;q=0.7"); request.setRawHeader("Accept-Language", "*,en-us;q=0.8,en;q=0.6"); QString userAgent = QString("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/%1 (KHTML, like Gecko) QuiteRSS/%2 Safari/%1"). arg(qWebKitVersion()).arg(STRPRODUCTVER); request.setRawHeader("User-Agent", userAgent.toUtf8()); currentUrls_.append(getUrl); currentIds_.append(id); currentFeeds_.append(feedUrl); currentDates_.append(date); currentCount_.append(count); currentHead_.append(false); currentTime_.append(timeoutRequest_); QNetworkReply *reply = networkManager_->get(request); reply->setProperty("feedReply", QVariant(true)); requestUrl_.append(reply->url()); networkReply_.append(reply); } /** @brief Process network reply *----------------------------------------------------------------------------*/ void RequestFeed::finished(QNetworkReply *reply) { QUrl replyUrl = reply->url(); qDebug() << "reply.finished():" << replyUrl.toString(); qDebug() << reply->header(QNetworkRequest::ContentTypeHeader); qDebug() << reply->header(QNetworkRequest::ContentLengthHeader); qDebug() << reply->header(QNetworkRequest::LocationHeader); qDebug() << reply->header(QNetworkRequest::LastModifiedHeader); qDebug() << reply->header(QNetworkRequest::CookieHeader); qDebug() << reply->header(QNetworkRequest::SetCookieHeader); int currentReplyIndex = currentUrls_.indexOf(replyUrl); if (currentReplyIndex >= 0) { currentTime_.removeAt(currentReplyIndex); currentUrls_.removeAt(currentReplyIndex); int feedId = currentIds_.takeAt(currentReplyIndex); QString feedUrl = currentFeeds_.takeAt(currentReplyIndex); QDateTime feedDate = currentDates_.takeAt(currentReplyIndex); int count = currentCount_.takeAt(currentReplyIndex) + 1; bool headOk = currentHead_.takeAt(currentReplyIndex); if (reply->error() != QNetworkReply::NoError) { qDebug() << " error retrieving RSS feed:" << reply->error() << reply->errorString(); if (!headOk) { if (reply->error() == QNetworkReply::AuthenticationRequiredError) emit getUrlDone(-2, feedId, feedUrl, tr("Server requires authentication!")); else if (reply->error() == QNetworkReply::ContentNotFoundError) emit getUrlDone(-5, feedId, feedUrl, tr("Server replied: Not Found!")); else { if (reply->errorString().contains("Service Temporarily Unavailable")) { if (!hostList_.contains(QUrl(feedUrl).host())) { hostList_.append(QUrl(feedUrl).host()); count--; } } if (count < numberRepeats_) { emit signalGet(replyUrl, feedId, feedUrl, feedDate, count); } else { emit getUrlDone(-1, feedId, feedUrl, QString("%1 (%2)").arg(reply->errorString()).arg(reply->error())); } } } else { emit signalGet(replyUrl, feedId, feedUrl, feedDate); } } else { QUrl redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl(); if (redirectionTarget.isValid()) { if (count < (numberRepeats_ + 3)) { if (headOk && (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 302)) { emit signalGet(replyUrl, feedId, feedUrl, feedDate); } else { QString host(QUrl::fromEncoded(feedUrl.toUtf8()).host()); if (reply->operation() == QNetworkAccessManager::HeadOperation) { qDebug() << objectName() << " head redirect..."; if (redirectionTarget.host().isEmpty()) redirectionTarget.setUrl("http://" + host + redirectionTarget.toString()); if (redirectionTarget.scheme().isEmpty()) redirectionTarget.setScheme(QUrl(feedUrl).scheme()); emit signalHead(redirectionTarget, feedId, feedUrl, feedDate, count); } else { qDebug() << objectName() << " get redirect..."; if (redirectionTarget.host().isEmpty()) redirectionTarget.setUrl("http://" + host + redirectionTarget.toString()); if (redirectionTarget.scheme().isEmpty()) redirectionTarget.setScheme(QUrl(feedUrl).scheme()); emit signalGet(redirectionTarget, feedId, feedUrl, feedDate, count); } } } else { emit getUrlDone(-4, feedId, feedUrl, tr("Redirect error!")); } } else { QDateTime replyDate = reply->header(QNetworkRequest::LastModifiedHeader).toDateTime(); QDateTime replyLocalDate = QDateTime(replyDate.date(), replyDate.time()); qDebug() << feedDate << replyDate << replyLocalDate; qDebug() << feedDate.toMSecsSinceEpoch() << replyDate.toMSecsSinceEpoch() << replyLocalDate.toMSecsSinceEpoch(); if ((reply->operation() == QNetworkAccessManager::HeadOperation) && ((!feedDate.isValid()) || (!replyLocalDate.isValid()) || (feedDate < replyLocalDate) || !replyDate.toMSecsSinceEpoch())) { emit signalGet(replyUrl, feedId, feedUrl, feedDate); } else { QString codecName; QzRegExp rx("charset=([^\t]+)$", Qt::CaseInsensitive); int pos = rx.indexIn(reply->header(QNetworkRequest::ContentTypeHeader).toString()); if (pos > -1) { codecName = rx.cap(1); } QByteArray data = reply->readAll(); data = data.trimmed(); rx.setPattern("&(?!([a-z0-9#]+;))"); pos = 0; while ((pos = rx.indexIn(QString::fromLatin1(data), pos)) != -1) { data.replace(pos, 1, "&"); pos += 1; } data.replace("
", "
"); if (data.indexOf("") > 0) data.resize(data.indexOf("") + 6); if (data.indexOf("") > 0) data.resize(data.indexOf("") + 7); if (data.indexOf("") > 0) data.resize(data.indexOf("") + 10); emit getUrlDone(feedsQueue_.count(), feedId, feedUrl, "", data, replyLocalDate, codecName); } } } } else { qCritical() << "Request Url error: " << replyUrl.toString() << reply->errorString(); } int replyIndex = requestUrl_.indexOf(replyUrl); if (replyIndex >= 0) { requestUrl_.removeAt(replyIndex); networkReply_.removeAt(replyIndex); } reply->abort(); reply->deleteLater(); } /** @brief Timeout to delete network requests which has no answer *----------------------------------------------------------------------------*/ void RequestFeed::slotRequestTimeout() { for (int i = currentTime_.count() - 1; i >= 0; i--) { int time = currentTime_.at(i) - 1; if (time <= 0) { QUrl url = currentUrls_.takeAt(i); int feedId = currentIds_.takeAt(i); QString feedUrl = currentFeeds_.takeAt(i); QDateTime feedDate = currentDates_.takeAt(i); int count = currentCount_.takeAt(i) + 1; currentTime_.removeAt(i); currentHead_.removeAt(i); int replyIndex = requestUrl_.indexOf(url); if (replyIndex >= 0) { QUrl replyUrl = requestUrl_.takeAt(replyIndex); QNetworkReply *reply = networkReply_.takeAt(replyIndex); reply->deleteLater(); if (count < numberRepeats_) { emit signalGet(replyUrl, feedId, feedUrl, feedDate, count); } else { emit getUrlDone(-3, feedId, feedUrl, tr("Request timeout!")); } } } else { currentTime_.replace(i, time); } } } quiterss-0.18.3/src/requestfeed.h000066400000000000000000000056331265173051100167460ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef REQUESTFEED_H #define REQUESTFEED_H #include #include #include #include #include #include #include "networkmanager.h" class RequestFeed : public QObject { Q_OBJECT public: explicit RequestFeed(int timeoutRequest, int numberRequests, int numberRepeats, QObject *parent = 0); ~RequestFeed(); void disconnectObjects(); public slots: void requestUrl(int id, QString urlString, QDateTime date, QString userInfo = ""); void stopRequest(); void slotHead(const QUrl &getUrl, const int &id, const QString &feedUrl, const QDateTime &date, const int &count); void slotGet(const QUrl &getUrl, const int &id, const QString &feedUrl, const QDateTime &date, const int &count); signals: void getUrlDone(int result, int feedId, QString feedUrl = "", QString error = "", QByteArray data = NULL, QDateTime dtReply = QDateTime(), QString codecName = ""); void signalHead(const QUrl &getUrl, const int &id, const QString &feedUrl, const QDateTime &date, const int &count = 0); void signalGet(const QUrl &getUrl, const int &id, const QString &feedUrl, const QDateTime &date, const int &count = 0); void setStatusFeed(int feedId, QString status); private slots: void getQueuedUrl(); void finished(QNetworkReply *reply); void slotRequestTimeout(); private: NetworkManager *networkManager_; int timeoutRequest_; int numberRequests_; int numberRepeats_; QTimer *timeout_; QTimer *getUrlTimer_; QQueue idsQueue_; QQueue feedsQueue_; QQueue dateQueue_; QQueue userInfo_; QList currentUrls_; QList currentIds_; QList currentFeeds_; QList currentDates_; QList currentCount_; QList currentHead_; QList currentTime_; QList requestUrl_; QList networkReply_; QList hostList_; }; #endif // REQUESTFEED_H quiterss-0.18.3/src/syncrss/000077500000000000000000000000001265173051100157565ustar00rootroot00000000000000quiterss-0.18.3/src/syncrss/googlereader.cpp000066400000000000000000000200261265173051100211210ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2013 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "googlereader.h" #include GoogleReader::GoogleReader(const QString &email, const QString &passwd, QObject *parent) : QObject(parent) , email_(email) , passwd_(passwd) { qCritical() << "GoogleReader init"; sessionTimer_ = new QTimer(this); connect(sessionTimer_, SIGNAL(timeout()), this, SLOT(requestToken())); connect(&managerToken_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyToken(QNetworkReply *))); connect(&managerHttpPost_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyHttpPost(QNetworkReply *))); connect(&managerFeedsList_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFeedsList(QNetworkReply *))); connect(&managerUnreadCount_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyUnreadCount(QNetworkReply*))); connect(&managerFeed_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replyFeed(QNetworkReply *))); requestSidAuth(); } //! Authorization request void GoogleReader::requestSidAuth() { QNetworkRequest request(QUrl("https://www.google.com/accounts/ClientLogin")); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); QSslConfiguration sslconf; sslconf.setPeerVerifyMode(QSslSocket::VerifyNone); request.setSslConfiguration(sslconf); QUrl params; params.addQueryItem("Email", email_); params.addQueryItem("Passwd", passwd_); params.addQueryItem("service", "reader"); connect(&managerAuth_, SIGNAL(finished(QNetworkReply *)), this, SLOT(replySidAuth(QNetworkReply *))); managerAuth_.post(request, params.encodedQuery()); } void GoogleReader::replySidAuth(QNetworkReply *reply) { bool ok = false; if (reply->error() == QNetworkReply::NoError) { QString str = QString::fromUtf8(reply->readAll()); sid_ = QString(str.split("SID=").at(1)).split('\n').at(0); auth_ = QString(str.split("Auth=").at(1)).remove('\n'); sessionTimer_->start(1); ok = true; } else { qCritical() << "Error replySidAuth: " << reply->errorString(); } emit signalReplySidAuth(ok); } //! Session identificator request (session timeout - 30 min, session request - every 20 min) void GoogleReader::requestToken() { sessionTimer_->stop(); sessionTimer_->start(20000); QNetworkRequest request(QUrl("http://www.google.com/reader/api/0/token")); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); request.setRawHeader("Authorization", QString("GoogleLogin auth=%1").arg(auth_).toUtf8()); managerToken_.get(request); } void GoogleReader::replyToken(QNetworkReply *reply) { bool ok = false; if (reply->error() == QNetworkReply::NoError) { QString str = QString::fromUtf8(reply->readAll()); token_ = str; ok = true; } else { qCritical() << "Error requestToken: " << reply->errorString(); } emit signalReplyToken(ok); } //! HTTP POST request void GoogleReader::sendHttpPost(QUrl url, QUrl params) { QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); request.setRawHeader("Authorization", QString("GoogleLogin auth=%1").arg(auth_).toUtf8()); managerHttpPost_.post(request, params.encodedQuery()); } //! Process HTTP POST reply void GoogleReader::replyHttpPost(QNetworkReply *reply) { bool ok = false; if (reply->error() == QNetworkReply::NoError) { QString str = QString::fromUtf8(reply->readAll()); if (str == "OK") ok = true; else qCritical() << "No"; } else { qCritical() << "Error sendHttpPost: " << reply->errorString(); } emit signalReplyHttpPost(ok); } //! HTTP GET request void GoogleReader::sendHttpGet(QUrl url, QNetworkAccessManager *manager) { QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded"); request.setRawHeader("Authorization", QString("GoogleLogin auth=%1").arg(auth_).toUtf8()); manager->get(request); } //! Adding, deleting, renaming feed void GoogleReader::editFeed(const QString &urlFeed, const QString &action, const QString &name) { QUrl params; params.addQueryItem("client", "QuiteRSS"); params.addQueryItem("s", QString("feed/%1").arg(urlFeed)); params.addQueryItem("ac", action); params.addQueryItem("t", name); params.addQueryItem("T", token_); qCritical() << token_; sendHttpPost(QUrl("https://www.google.com/reader/api/0/subscription/edit"), params); } //! Feed list request void GoogleReader::requestFeedsList() { sendHttpGet(QUrl("https://www.google.com/reader/api/0/subscription/list?output=xml"), &managerFeedsList_); } //! Process feed list reply void GoogleReader::replyFeedsList(QNetworkReply *reply) { QString dataStr; if (reply->error() == QNetworkReply::NoError) { dataStr = QString::fromUtf8(reply->readAll()); } else { qCritical() << "Error requestFeedsList: " << reply->errorString(); } } //! News unread number request void GoogleReader::requestUnreadCount() { sendHttpGet(QUrl("https://www.google.com/reader/api/0/unread-count?output=xml"), &managerUnreadCount_); } //! Process news unread number reply void GoogleReader::replyUnreadCount(QNetworkReply *reply) { QString dataStr; if (reply->error() == QNetworkReply::NoError) { dataStr = QString::fromUtf8(reply->readAll()); } else { qCritical() << "Error requestUnreadCount: " << reply->errorString(); } } //! Feed News request void GoogleReader::requestFeed(const QString &urlFeed, int ot) { QUrl params; params.setUrl("http://www.google.com/reader/api/0/stream/contents/" + QString("feed/%1").arg(urlFeed)); QDateTime dtLocalTime = QDateTime::currentDateTime(); QDateTime dt = QDateTime::fromString("1970-01-01T00:00:00", Qt::ISODate); int nTimeShift = dt.secsTo(dtLocalTime); params.addQueryItem("ck", QString::number(nTimeShift)); if (ot) params.addQueryItem("ot", QString::number(ot)); params.addQueryItem("client", "QuiteRSS"); sendHttpGet(params, &managerFeed_); } //! Process feed news reply void GoogleReader::replyFeed(QNetworkReply *reply) { QString dataStr; if (reply->error() == QNetworkReply::NoError) { dataStr = QString::fromUtf8(reply->readAll()); qCritical() << dataStr; } else { qCritical() << "Error requestUnreadCount: " << reply->errorString(); } } //! Mark news read or starred void GoogleReader::editItem(const QString &urlFeed, const QString &itemId, const QString &action) { QUrl params; params.addQueryItem("client", "QuiteRSS"); if (action == "read") params.addQueryItem("a", "user/-/state/com.google/read"); else if (action == "unread") params.addQueryItem("r", "user/-/state/com.google/read"); else if (action == "starred") params.addQueryItem("a", "user/-/state/com.google/starred"); else if (action == "unstarred") params.addQueryItem("r", "user/-/state/com.google/starred"); params.addQueryItem("async", "true"); params.addQueryItem("s", QString("feed/%1").arg(urlFeed)); params.addQueryItem("i", QString("tag:google.com,2005:reader/item/%1").arg(itemId)); params.addQueryItem("T", token_); sendHttpPost(QUrl("http://www.google.com/reader/api/0/edit-tag"), params); } quiterss-0.18.3/src/syncrss/googlereader.h000066400000000000000000000047761265173051100206040ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2013 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef GOOGLEREADER_H #define GOOGLEREADER_H #ifdef HAVE_QT5 #include #else #include #endif #include #define ADDFEED "subscribe" #define REMOVEFEED "unsubscribe" #define RENAMEFEED "edit" class GoogleReader : public QObject { Q_OBJECT public: explicit GoogleReader(const QString &email, const QString &passwd, QObject *parent = 0); void editFeed(const QString &urlFeed, const QString &action, const QString &name = ""); void requestFeedsList(); void requestUnreadCount(); void requestFeed(const QString &urlFeed, int ot = 0); void editItem(const QString &urlFeed, const QString &itemId, const QString &action); QString email_; QString passwd_; signals: void signalReplySidAuth(bool ok); void signalReplyToken(bool ok); void signalReplyHttpPost(bool ok); private slots: void replySidAuth(QNetworkReply *reply); void requestToken(); void replyToken(QNetworkReply *reply); void replyHttpPost(QNetworkReply *reply); void replyFeedsList(QNetworkReply *reply); void replyUnreadCount(QNetworkReply *reply); void replyFeed(QNetworkReply *reply); private: void requestSidAuth(); void sendHttpPost(QUrl url, QUrl params); void sendHttpGet(QUrl url, QNetworkAccessManager *manager); QTimer *sessionTimer_; QNetworkAccessManager managerAuth_; QNetworkAccessManager managerToken_; QNetworkAccessManager managerHttpPost_; QNetworkAccessManager managerFeedsList_; QNetworkAccessManager managerUnreadCount_; QNetworkAccessManager managerFeed_; QString sid_; QString auth_; QString token_; QUrl requestUrl_; QUrl postArgs_; }; #endif // GOOGLEREADER_H quiterss-0.18.3/src/tabbar.cpp000066400000000000000000000077521265173051100162240ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "tabbar.h" #include "mainapplication.h" TabBar::TabBar(QWidget *parent) : QTabBar(parent) , closingTabState_(CloseTabIdle) , indexClickedTab_(-1) , tabFixed_(false) { setObjectName("tabBar_"); setFocusPolicy(Qt::NoFocus); setDocumentMode(true); setMouseTracking(true); setExpanding(false); setMovable(true); setElideMode(Qt::ElideNone); setIconSize(QSize(0, 0)); setContextMenuPolicy(Qt::CustomContextMenu); setStyleSheet(QString("#tabBar_ QToolButton {border: 1px solid %1; border-radius: 2px; background: %2;}"). arg(qApp->palette().color(QPalette::Dark).name()). arg(palette().background().color().name())); addTab(""); connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showContextMenuTabBar(const QPoint &))); installEventFilter(this); } bool TabBar::eventFilter(QObject *obj, QEvent *event) { if (event->type() == QEvent::MouseButtonPress) { QMouseEvent *mouseEvent = static_cast(event); if (tabAt(mouseEvent->pos()) < 0) return false; if (mouseEvent->button() & Qt::MiddleButton) { emit closeTab(tabAt(mouseEvent->pos())); } else if (mouseEvent->button() & Qt::LeftButton) { if (tabAt(QPoint(mouseEvent->pos().x(), 0)) == 0) tabFixed_ = true; else tabFixed_ = false; } } else if (event->type() == QEvent::MouseMove) { QMouseEvent *mouseEvent = static_cast(event); if (mouseEvent->buttons() & Qt::LeftButton) { if ((tabAt(QPoint(mouseEvent->pos().x()-78, 0)) <= 0) || tabFixed_) return true; } } return QTabBar::eventFilter(obj, event); } void TabBar::showContextMenuTabBar(const QPoint &pos) { indexClickedTab_ = tabAt(pos); if (indexClickedTab_ == -1) return; QMenu menu; menu.addAction(mainApp->mainWindow()->closeTabAct_); menu.addAction(mainApp->mainWindow()->closeOtherTabsAct_); menu.addAction(mainApp->mainWindow()->closeAllTabsAct_); menu.exec(mapToGlobal(pos)); indexClickedTab_ = -1; } void TabBar::slotCloseTab() { int index = indexClickedTab_; if (index == -1) index = currentIndex(); emit closeTab(index); } void TabBar::slotCloseOtherTabs() { int index = indexClickedTab_; int curIndex = -1; if (index == -1) index = currentIndex(); else { if (indexClickedTab_ > currentIndex()) { curIndex = currentIndex(); } else if (indexClickedTab_ < currentIndex()){ curIndex = indexClickedTab_ + 1; } } closingTabState_ = CloseTabOtherIndex; for (int i = count()-1; i > 0; i--) { if (i == index) continue; if (i == curIndex) closingTabState_ = CloseTabCurrentIndex; else closingTabState_ = CloseTabOtherIndex; emit closeTab(i); } closingTabState_ = CloseTabIdle; } void TabBar::slotCloseAllTab() { closingTabState_ = CloseTabOtherIndex; for (int i = count()-1; i > 0; i--) { if (i == 1) closingTabState_ = CloseTabCurrentIndex; emit closeTab(i); } closingTabState_ = CloseTabIdle; } void TabBar::slotNextTab() { setCurrentIndex(currentIndex()+1); } void TabBar::slotPrevTab() { setCurrentIndex(currentIndex()-1); } quiterss-0.18.3/src/tabbar.h000066400000000000000000000031071265173051100156570ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef TABBAR_H #define TABBAR_H #ifdef HAVE_QT5 #include #else #include #endif class TabBar : public QTabBar { Q_OBJECT public: explicit TabBar(QWidget *parent = 0); enum CloseTabsState { CloseTabIdle = 0, CloseTabCurrentIndex, CloseTabOtherIndex }; CloseTabsState closingTabState_; public slots: void slotCloseTab(); void slotCloseOtherTabs(); void slotCloseAllTab(); void slotNextTab(); void slotPrevTab(); signals: void closeTab(int index); protected: bool eventFilter(QObject *obj, QEvent *ev); private slots: void showContextMenuTabBar(const QPoint &pos); private: int indexClickedTab_; bool tabFixed_; }; #endif // TABBAR_H quiterss-0.18.3/src/updateappdialog.cpp000066400000000000000000000172111265173051100201230ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "updateappdialog.h" #include "mainapplication.h" #include "VersionNo.h" #include "settings.h" #include #if defined(Q_OS_WIN) #include #endif UpdateAppDialog::UpdateAppDialog(const QString &lang, QWidget *parent, bool show) : Dialog(parent) , lang_(lang) , showDialog_(show) , page_(NULL) { Settings settings; networkManagerProxy_ = new NetworkManagerProxy(0, this); if (showDialog_) { setWindowTitle(tr("Check for Updates")); setWindowFlags (windowFlags() & ~Qt::WindowContextHelpButtonHint); setObjectName("UpdateAppDialog"); resize(450, 350); infoLabel = new QLabel(tr("Checking for updates..."), this); infoLabel->setOpenExternalLinks(true); history_ = new QTextBrowser(this); history_->setObjectName("history_"); history_->setText(tr("Loading history...")); history_->setOpenExternalLinks(true); remindAboutVersion_ = new QCheckBox(tr("Don't remind about this version"), this); remindAboutVersion_->setChecked(settings.value("remindAboutVersion", false).toBool()); remindAboutVersion_->hide(); pageLayout->addWidget(infoLabel, 0); pageLayout->addWidget(history_, 1); pageLayout->addWidget(remindAboutVersion_, 0); installButton_ = new QPushButton(tr("&Install"), this); installButton_->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); installButton_->hide(); buttonsLayout->insertWidget(0, installButton_, 1); connect(installButton_, SIGNAL(clicked()), SLOT(updaterRun())); buttonBox->addButton(QDialogButtonBox::Close); renderStatistics(); QString urlHistory; if (lang_.contains("ru", Qt::CaseInsensitive)) urlHistory = "http://quiterss.org/files/updates_new/HISTORY_RU"; else urlHistory = "http://quiterss.org/files/updates_new/HISTORY_EN"; historyReply_ = networkManagerProxy_->get(QNetworkRequest(QUrl(urlHistory))); connect(historyReply_, SIGNAL(finished()), this, SLOT(slotFinishHistoryReply())); connect(this, SIGNAL(finished(int)), this, SLOT(closeDialog())); restoreGeometry(settings.value("updateAppDlg/geometry").toByteArray()); } else { bool statisticsEnabled = settings.value("Settings/statisticsEnabled", true).toBool(); if (statisticsEnabled) { page_ = new QWebPage(this); page_->setNetworkAccessManager(networkManagerProxy_); page_->mainFrame()->load(QUrl("http://quiterss.org/runAplication")); connect(page_, SIGNAL(loadFinished(bool)), this, SLOT(renderStatistics())); } else { renderStatistics(); } } } UpdateAppDialog::~UpdateAppDialog() { } void UpdateAppDialog::disconnectObjects() { disconnect(this); networkManagerProxy_->disconnectObjects(); if (page_ != NULL) { QWebSettings::clearMemoryCaches(); page_->disconnect(this); delete page_; } delete networkManagerProxy_; } void UpdateAppDialog::closeDialog() { Settings settings; settings.setValue("remindAboutVersion", remindAboutVersion_->isChecked()); settings.setValue("updateAppDlg/geometry", saveGeometry()); } void UpdateAppDialog::finishUpdatesChecking() { reply_->deleteLater(); QString info; QString newVersion = ""; if (reply_->error() == QNetworkReply::NoError) { QString version = STRPRODUCTVER; QString date = STRDATE; QString str = QLatin1String(reply_->readAll()); QString curVersion = str.section('"', 5, 5).section('\\', 0, 0); QString curDate = str.section('"', 3, 3).section('\\', 0, 0); if (version.contains(curVersion)) { str = "" + tr("You already have the latest version") + ""; } else { QString urlDownloads; if (lang_.contains("ru", Qt::CaseInsensitive)) urlDownloads = "http://quiterss.org/ru/download"; else urlDownloads = "http://quiterss.org/en/download"; str = "" + tr("A new version of QuiteRSS is available!") + "" "

" + QString("%2"). arg(urlDownloads). arg(tr("Click here to go to the download page")); newVersion = curVersion; } info = "" "" + "
" + tr("Your version is:") + " " + " " + version + "" + QString(" (%1)").arg(date) + "
" + tr("Current version is:") + " " + "" + curVersion + "" + QString(" (%1)").arg(curDate) + "

" + str + ""; } else { qWarning() << "Error checking updates" << reply_->error() << reply_->errorString(); info = tr("Error checking updates"); if (showDialog_) history_->setText(""); } Settings settings; bool remind = settings.value("remindAboutVersion", false).toBool(); QString currentVersion = settings.value("currentVersionApp", "").toString(); if (!showDialog_) { if (!newVersion.isEmpty()) { if (currentVersion != newVersion) { settings.setValue("currentVersionApp", newVersion); settings.setValue("remindAboutVersion", false); } else if (remind) { newVersion = ""; } } emit signalNewVersion(newVersion); } else { infoLabel->setText(info); #if defined(Q_OS_WIN) if (QFile::exists(QCoreApplication::applicationDirPath() + "/Updater.exe") && !newVersion.isEmpty() && !mainApp->isPortableAppsCom()) installButton_->show(); #endif if (!newVersion.isEmpty()) { if (currentVersion != newVersion) { settings.setValue("currentVersionApp", newVersion); settings.setValue("remindAboutVersion", false); remindAboutVersion_->setChecked(false); remindAboutVersion_->show(); } else if (!remind) { remindAboutVersion_->show(); } } } } void UpdateAppDialog::slotFinishHistoryReply() { historyReply_->deleteLater(); if (historyReply_->error() != QNetworkReply::NoError) { qDebug() << "error retrieving " << historyReply_->url(); return; } QString str = QString::fromUtf8(historyReply_->readAll()); history_->setHtml(str); } void UpdateAppDialog::updaterRun() { close(); #if defined(Q_OS_WIN) QString updaterFile = QCoreApplication::applicationDirPath() + "/Updater.exe"; ShellExecute(0, 0, (wchar_t *)updaterFile.utf16(), 0, 0, SW_SHOWNORMAL); #endif } void UpdateAppDialog::renderStatistics() { Settings settings; bool updateCheckEnabled = settings.value("Settings/updateCheckEnabled", true).toBool(); if (updateCheckEnabled || showDialog_) { QNetworkRequest request(QUrl("http://quiterss.org/files/updates_new/VersionNo.h")); reply_ = networkManagerProxy_->get(request); connect(reply_, SIGNAL(finished()), this, SLOT(finishUpdatesChecking())); } else { emit signalNewVersion(); } } quiterss-0.18.3/src/updateappdialog.h000066400000000000000000000034231265173051100175700ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef UPDATEAPPDIALOG_H #define UPDATEAPPDIALOG_H #include #include #include #include "dialog.h" #include "networkmanagerproxy.h" class UpdateAppDialog : public Dialog { Q_OBJECT public: explicit UpdateAppDialog(const QString &lang, QWidget *parent, bool show = true); ~UpdateAppDialog(); void disconnectObjects(); signals: void signalNewVersion(const QString &newVersion = QString()); private slots: void closeDialog(); void finishUpdatesChecking(); void slotFinishHistoryReply(); void updaterRun(); void renderStatistics(); private: QString lang_; bool showDialog_; QWebPage *page_; NetworkManagerProxy *networkManagerProxy_; QNetworkReply *reply_; QNetworkReply *historyReply_; QLabel *infoLabel; QTextBrowser *history_; QPushButton *installButton_; QCheckBox *remindAboutVersion_; }; #endif // UPDATEAPPDIALOG_H quiterss-0.18.3/src/updatefeeds.cpp000066400000000000000000001344011265173051100172520ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "updatefeeds.h" #include "mainapplication.h" #include "database.h" #include "settings.h" #include #include #define UPDATE_INTERVAL 3000 #define UPDATE_INTERVAL_MIN 500 UpdateFeeds::UpdateFeeds(QObject *parent, bool addFeed) : QObject(parent) , updateObject_(NULL) , requestFeed_(NULL) , parseObject_(NULL) , faviconObject_(NULL) , updateFeedThread_(NULL) , getFaviconThread_(NULL) , addFeed_(addFeed) , saveMemoryDBTimer_(NULL) { getFeedThread_ = new QThread(); getFeedThread_->setObjectName("getFeedThread_"); updateFeedThread_ = new QThread(); updateFeedThread_->setObjectName("updateFeedThread_"); Settings settings; int timeoutRequest = settings.value("Settings/timeoutRequest", 15).toInt(); int numberRequests = settings.value("Settings/numberRequest", 10).toInt(); int numberRepeats = settings.value("Settings/numberRepeats", 2).toInt(); requestFeed_ = new RequestFeed(timeoutRequest, numberRequests, numberRepeats); parseObject_ = new ParseObject(); if (addFeed_) { connect(parent, SIGNAL(signalRequestUrl(int,QString,QDateTime,QString)), requestFeed_, SLOT(requestUrl(int,QString,QDateTime,QString))); connect(requestFeed_, SIGNAL(getUrlDone(int,int,QString,QString,QByteArray,QDateTime,QString)), parent, SLOT(getUrlDone(int,int,QString,QString,QByteArray,QDateTime,QString))); connect(parent, SIGNAL(xmlReadyParse(QByteArray,int,QDateTime,QString)), parseObject_, SLOT(parseXml(QByteArray,int,QDateTime,QString))); connect(parseObject_, SIGNAL(signalFinishUpdate(int,bool,int,QString)), parent, SLOT(slotUpdateFeed(int,bool,int,QString))); } else { getFaviconThread_ = new QThread(); getFaviconThread_->setObjectName("getFaviconThread_"); updateObject_ = new UpdateObject(); faviconObject_ = new FaviconObject(); connect(updateObject_, SIGNAL(signalRequestUrl(int,QString,QDateTime,QString)), requestFeed_, SLOT(requestUrl(int,QString,QDateTime,QString))); connect(requestFeed_, SIGNAL(getUrlDone(int,int,QString,QString,QByteArray,QDateTime,QString)), updateObject_, SLOT(getUrlDone(int,int,QString,QString,QByteArray,QDateTime,QString))); connect(requestFeed_, SIGNAL(setStatusFeed(int,QString)), parent, SLOT(setStatusFeed(int,QString))); connect(parent, SIGNAL(signalStopUpdate()), requestFeed_, SLOT(stopRequest())); connect(parent, SIGNAL(signalGetFeedTimer(int)), updateObject_, SLOT(slotGetFeedTimer(int))); connect(parent, SIGNAL(signalGetAllFeedsTimer()), updateObject_, SLOT(slotGetAllFeedsTimer())); connect(parent, SIGNAL(signalGetAllFeeds()), updateObject_, SLOT(slotGetAllFeeds())); connect(parent, SIGNAL(signalGetFeed(int,QString,QDateTime,int)), updateObject_, SLOT(slotGetFeed(int,QString,QDateTime,int))); connect(parent, SIGNAL(signalGetFeedsFolder(QString)), updateObject_, SLOT(slotGetFeedsFolder(QString))); connect(parent, SIGNAL(signalImportFeeds(QByteArray)), updateObject_, SLOT(slotImportFeeds(QByteArray))); connect(updateObject_, SIGNAL(showProgressBar(int)), parent, SLOT(showProgressBar(int))); connect(updateObject_, SIGNAL(loadProgress(int)), parent, SLOT(slotSetValue(int))); connect(updateObject_, SIGNAL(signalMessageStatusBar(QString,int)), parent, SLOT(showMessageStatusBar(QString,int))); connect(updateObject_, SIGNAL(signalUpdateFeedsModel()), parent, SLOT(feedsModelReload()), Qt::BlockingQueuedConnection); connect(updateObject_, SIGNAL(xmlReadyParse(QByteArray,int,QDateTime,QString)), parseObject_, SLOT(parseXml(QByteArray,int,QDateTime,QString)), Qt::QueuedConnection); connect(parseObject_, SIGNAL(signalFinishUpdate(int,bool,int,QString)), updateObject_, SLOT(finishUpdate(int,bool,int,QString)), Qt::QueuedConnection); connect(updateObject_, SIGNAL(feedUpdated(int,bool,int,bool)), parent, SLOT(slotUpdateFeed(int,bool,int,bool))); connect(updateObject_, SIGNAL(setStatusFeed(int,QString)), parent, SLOT(setStatusFeed(int,QString))); qRegisterMetaType("FeedCountStruct"); connect(parseObject_, SIGNAL(feedCountsUpdate(FeedCountStruct)), parent, SLOT(slotFeedCountsUpdate(FeedCountStruct))); connect(parseObject_, SIGNAL(signalPlaySound(QString)), parent, SLOT(slotPlaySound(QString))); connect(parseObject_, SIGNAL(signalAddColorList(int,QString)), parent, SLOT(slotAddColorList(int,QString))); connect(parent, SIGNAL(signalNextUpdate(bool)), updateObject_, SLOT(slotNextUpdateFeed(bool))); connect(updateObject_, SIGNAL(signalUpdateModel(bool)), parent, SLOT(feedsModelReload(bool))); connect(updateObject_, SIGNAL(signalUpdateNews()), parent, SLOT(slotUpdateNews())); connect(updateObject_, SIGNAL(signalCountsStatusBar(int,int)), parent, SLOT(slotCountsStatusBar(int,int))); connect(parent, SIGNAL(signalRecountCategoryCounts()), updateObject_, SLOT(slotRecountCategoryCounts())); qRegisterMetaType >("QList"); connect(updateObject_, SIGNAL(signalRecountCategoryCounts(QList,QList,QList,QStringList)), parent, SLOT(slotRecountCategoryCounts(QList,QList,QList,QStringList))); connect(parent, SIGNAL(signalRecountFeedCounts(int,bool)), updateObject_, SLOT(slotRecountFeedCounts(int,bool))); connect(updateObject_, SIGNAL(feedCountsUpdate(FeedCountStruct)), parent, SLOT(slotFeedCountsUpdate(FeedCountStruct))); connect(updateObject_, SIGNAL(signalFeedsViewportUpdate()), parent, SLOT(slotFeedsViewportUpdate())); connect(parent, SIGNAL(signalSetFeedRead(int,int,int,QList)), updateObject_, SLOT(slotSetFeedRead(int,int,int,QList))); connect(parent, SIGNAL(signalMarkFeedRead(int,bool,bool)), updateObject_, SLOT(slotMarkFeedRead(int,bool,bool))); connect(parent, SIGNAL(signalRefreshInfoTray()), updateObject_, SLOT(slotRefreshInfoTray())); connect(updateObject_, SIGNAL(signalRefreshInfoTray(int,int)), parent, SLOT(slotRefreshInfoTray(int,int))); connect(parent, SIGNAL(signalUpdateStatus(int,bool)), updateObject_, SLOT(slotUpdateStatus(int,bool))); connect(parent, SIGNAL(signalMarkAllFeedsRead()), updateObject_, SLOT(slotMarkAllFeedsRead())); connect(parent, SIGNAL(signalMarkReadCategory(int,int)), updateObject_, SLOT(slotMarkReadCategory(int,int))); connect(parent, SIGNAL(signalRefreshNewsView(int)), updateObject_, SIGNAL(signalMarkAllFeedsRead(int))); connect(updateObject_, SIGNAL(signalMarkAllFeedsRead(int)), parent, SLOT(slotRefreshNewsView(int))); connect(parent, SIGNAL(signalMarkAllFeedsOld()), updateObject_, SLOT(slotMarkAllFeedsOld())); connect(parent, SIGNAL(signalSetFeedsFilter(bool)), updateObject_, SIGNAL(signalSetFeedsFilter(bool))); connect(updateObject_, SIGNAL(signalSetFeedsFilter(bool)), parent, SLOT(setFeedsFilter(bool))); connect(mainApp, SIGNAL(signalSqlQueryExec(QString)), updateObject_, SLOT(slotSqlQueryExec(QString))); connect(mainApp, SIGNAL(signalRunUserFilter(int, int)), parseObject_, SLOT(runUserFilter(int, int))); // faviconObject_ connect(parent, SIGNAL(faviconRequestUrl(QString,QString)), faviconObject_, SLOT(requestUrl(QString,QString))); connect(faviconObject_, SIGNAL(signalIconRecived(QString,QByteArray,QString)), parent, SLOT(slotIconFeedPreparing(QString,QByteArray,QString))); connect(parent, SIGNAL(signalIconFeedReady(QString,QByteArray)), updateObject_, SLOT(slotIconSave(QString,QByteArray))); connect(updateObject_, SIGNAL(signalIconUpdate(int,QByteArray)), parent, SLOT(slotIconFeedUpdate(int,QByteArray))); updateObject_->moveToThread(updateFeedThread_); faviconObject_->moveToThread(getFaviconThread_); getFaviconThread_->start(QThread::LowPriority); startSaveTimer(); } requestFeed_->moveToThread(getFeedThread_); parseObject_->moveToThread(updateFeedThread_); getFeedThread_->start(QThread::LowPriority); updateFeedThread_->start(QThread::LowPriority); } UpdateFeeds::~UpdateFeeds() { requestFeed_->deleteLater(); parseObject_->deleteLater(); if (!addFeed_) { updateObject_->deleteLater(); faviconObject_->deleteLater(); getFaviconThread_->exit(); getFaviconThread_->wait(); delete getFaviconThread_; } getFeedThread_->exit(); getFeedThread_->wait(); delete getFeedThread_; updateFeedThread_->exit(); updateFeedThread_->wait(); delete updateFeedThread_; } void UpdateFeeds::disconnectObjects() { if (!addFeed_) { updateObject_->disconnect(updateObject_); updateObject_->disconnect(parseObject_); updateObject_->disconnect(requestFeed_); updateObject_->disconnect(parent()); faviconObject_->disconnectObjects(); } requestFeed_->disconnectObjects(); requestFeed_->disconnect(parent()); parseObject_->disconnectObjects(); } void UpdateFeeds::startSaveTimer() { if (!mainApp->storeDBMemory()) return; if (!saveMemoryDBTimer_) { saveMemoryDBTimer_ = new QTimer(this); connect(saveMemoryDBTimer_, SIGNAL(timeout()), this, SLOT(saveMemoryDatabase())); } Settings settings; int saveInterval = settings.value("Settings/saveDBMemFileInterval", 30).toInt(); saveMemoryDBTimer_->start(saveInterval*60*1000); } void UpdateFeeds::saveMemoryDatabase() { if (!mainApp->storeDBMemory()) return; if (updateObject_->isSaveMemoryDatabase) return; QTimer::singleShot(100, updateObject_, SLOT(saveMemoryDatabase())); } void UpdateFeeds::quitApp() { QTimer::singleShot(0, updateObject_, SLOT(quitApp())); } //------------------------------------------------------------------------------ UpdateObject::UpdateObject(QObject *parent) : QObject(parent) , isSaveMemoryDatabase(false) , updateFeedsCount_(0) { setObjectName("updateObject_"); mainWindow_ = mainApp->mainWindow(); db_ = Database::connection("secondConnection"); updateModelTimer_ = new QTimer(this); updateModelTimer_->setSingleShot(true); connect(updateModelTimer_, SIGNAL(timeout()), this, SIGNAL(signalUpdateModel())); timerUpdateNews_ = new QTimer(this); timerUpdateNews_->setSingleShot(true); connect(timerUpdateNews_, SIGNAL(timeout()), this, SIGNAL(signalUpdateNews())); } UpdateObject::~UpdateObject() { } void UpdateObject::slotGetFeedTimer(int feedId) { QSqlQuery q(db_); q.exec(QString("SELECT xmlUrl, lastBuildDate, authentication FROM feeds WHERE id=='%1' AND disableUpdate=0") .arg(feedId)); if (q.next()) { addFeedInQueue(feedId, q.value(0).toString(), q.value(1).toDateTime(), q.value(2).toInt()); } emit showProgressBar(updateFeedsCount_); } void UpdateObject::slotGetAllFeedsTimer() { QSqlQuery q(db_); q.exec("SELECT id, xmlUrl, lastBuildDate, authentication FROM feeds " "WHERE xmlUrl!='' AND disableUpdate=0 " "AND (updateIntervalEnable==-1 OR updateIntervalEnable IS NULL)"); while (q.next()) { addFeedInQueue(q.value(0).toInt(), q.value(1).toString(), q.value(2).toDateTime(), q.value(3).toInt()); } emit showProgressBar(updateFeedsCount_); } /** @brief Process update feed action *---------------------------------------------------------------------------*/ void UpdateObject::slotGetFeed(int feedId, QString feedUrl, QDateTime date, int auth) { addFeedInQueue(feedId, feedUrl, date, auth); emit showProgressBar(updateFeedsCount_); } /** @brief Process update feed in folder action *---------------------------------------------------------------------------*/ void UpdateObject::slotGetFeedsFolder(QString query) { QSqlQuery q(db_); q.exec(query); while (q.next()) { addFeedInQueue(q.value(0).toInt(), q.value(1).toString(), q.value(2).toDateTime(), q.value(3).toInt()); } emit showProgressBar(updateFeedsCount_); } /** @brief Process update all feeds action *---------------------------------------------------------------------------*/ void UpdateObject::slotGetAllFeeds() { QSqlQuery q(db_); q.exec("SELECT id, xmlUrl, lastBuildDate, authentication FROM feeds WHERE xmlUrl!='' AND disableUpdate=0"); while (q.next()) { addFeedInQueue(q.value(0).toInt(), q.value(1).toString(), q.value(2).toDateTime(), q.value(3).toInt()); } emit showProgressBar(updateFeedsCount_); } /** @brief Import feeds from OPML-file * * Calls open file system dialog with filter *.opml. * Adds all feeds to DB include hierarchy, ignore duplicate feeds *---------------------------------------------------------------------------*/ void UpdateObject::slotImportFeeds(QByteArray xmlData) { int elementCount = 0; int outlineCount = 0; QSqlQuery q(db_); QList idsList; QList urlsList; QXmlStreamReader xml; QString convertData; bool codecOk = false; QzRegExp rx("&(?!([a-z0-9#]+;))", Qt::CaseInsensitive); int pos = 0; while ((pos = rx.indexIn(QString::fromLatin1(xmlData), pos)) != -1) { xmlData.replace(pos, 1, "&"); pos += 1; } rx.setPattern("encoding=\"([^\"]+)"); pos = rx.indexIn(xmlData); if (pos == -1) { rx.setPattern("encoding='([^']+)"); pos = rx.indexIn(xmlData); } if (pos == -1) { QStringList codecNameList; codecNameList << "UTF-8" << "Windows-1251" << "KOI8-R" << "KOI8-U" << "ISO 8859-5" << "IBM 866"; foreach (QString codecNameT, codecNameList) { QTextCodec *codec = QTextCodec::codecForName(codecNameT.toUtf8()); if (codec && codec->canEncode(xmlData)) { convertData = codec->toUnicode(xmlData); codecOk = true; break; } } } if (codecOk) { xml.addData(convertData); } else { xml.addData(xmlData); } db_.transaction(); // Store hierarchy of "outline" tags. Next nested outline is pushed to stack. // When it closes, pop it out from stack. Top of stack is the root outline. QStack parentIdsStack; parentIdsStack.push(0); while (!xml.atEnd()) { xml.readNext(); if (xml.isStartElement()) { // Search for "outline" only if (xml.name() == "outline") { qDebug() << outlineCount << "+:" << xml.prefix().toString() << ":" << xml.name().toString(); QString textString(xml.attributes().value("text").toString()); QString titleString(xml.attributes().value("title").toString()); QString xmlUrlString(xml.attributes().value("xmlUrl").toString()); if (textString.isEmpty()) textString = titleString; //Folder finded if (xmlUrlString.isEmpty()) { int rowToParent = 0; q.exec(QString("SELECT count(id) FROM feeds WHERE parentId='%1'"). arg(parentIdsStack.top())); if (q.next()) rowToParent = q.value(0).toInt(); q.prepare("INSERT INTO feeds(text, title, xmlUrl, created, f_Expanded, parentId, rowToParent) " "VALUES (:text, :title, :xmlUrl, :feedCreateTime, 0, :parentId, :rowToParent)"); q.bindValue(":text", textString); q.bindValue(":title", textString); q.bindValue(":xmlUrl", ""); q.bindValue(":feedCreateTime", QDateTime::currentDateTimeUtc().toString(Qt::ISODate)); q.bindValue(":parentId", parentIdsStack.top()); q.bindValue(":rowToParent", rowToParent); q.exec(); parentIdsStack.push(q.lastInsertId().toInt()); } // Feed finded else { if (xmlUrlString.contains("feed:", Qt::CaseInsensitive)) { if (xmlUrlString.contains("https://", Qt::CaseInsensitive)) { xmlUrlString.remove(0, 5); } else { xmlUrlString.remove(0, 7); xmlUrlString = "http://" + xmlUrlString; } } bool isFeedDuplicated = false; q.prepare("SELECT id FROM feeds WHERE xmlUrl LIKE :xmlUrl"); q.bindValue(":xmlUrl", xmlUrlString); q.exec(); if (q.next()) isFeedDuplicated = true; if (isFeedDuplicated) { qDebug() << "duplicate feed:" << xmlUrlString << textString; } else { int rowToParent = 0; q.exec(QString("SELECT count(id) FROM feeds WHERE parentId='%1'"). arg(parentIdsStack.top())); if (q.next()) rowToParent = q.value(0).toInt(); q.prepare("INSERT INTO feeds(text, title, description, xmlUrl, htmlUrl, created, parentId, rowToParent) " "VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); q.addBindValue(textString); q.addBindValue(xml.attributes().value("title").toString()); q.addBindValue(xml.attributes().value("description").toString()); q.addBindValue(xmlUrlString); q.addBindValue(xml.attributes().value("htmlUrl").toString()); q.addBindValue(QDateTime::currentDateTimeUtc().toString(Qt::ISODate)); q.addBindValue(parentIdsStack.top()); q.addBindValue(rowToParent); q.exec(); idsList.append(q.lastInsertId().toInt()); urlsList.append(xmlUrlString); } parentIdsStack.push(q.lastInsertId().toInt()); } } } else if (xml.isEndElement()) { if (xml.name() == "outline") { parentIdsStack.pop(); ++outlineCount; } ++elementCount; } qDebug() << parentIdsStack; } if (xml.error()) { QString error = QString("Import error: Line = %1, Column = %2; Error = %3"). arg(xml.lineNumber()).arg(xml.columnNumber()).arg(xml.errorString()); qCritical() << error; emit signalMessageStatusBar(error, 3000); } else { emit signalMessageStatusBar(QString("Import: file read done"), 3000); } db_.commit(); emit signalUpdateFeedsModel(); for (int i = 0; i < idsList.count(); i++) { updateFeedsCount_ = updateFeedsCount_ + 2; emit signalRequestUrl(idsList.at(i), urlsList.at(i), QDateTime(), ""); } emit showProgressBar(updateFeedsCount_); } // ---------------------------------------------------------------------------- bool UpdateObject::addFeedInQueue(int feedId, const QString &feedUrl, const QDateTime &date, int auth) { int feedIdIndex = feedIdList_.indexOf(feedId); if (feedIdIndex > -1) { return false; } else { feedIdList_.append(feedId); updateFeedsCount_ = updateFeedsCount_ + 2; QString userInfo; if (auth == 1) { QSqlQuery q(db_); QUrl url(feedUrl); q.prepare("SELECT username, password FROM passwords WHERE server=?"); q.addBindValue(url.host()); q.exec(); if (q.next()) { userInfo = QString("%1:%2").arg(q.value(0).toString()). arg(QString::fromUtf8(QByteArray::fromBase64(q.value(1).toByteArray()))); } } emit signalRequestUrl(feedId, feedUrl, date, userInfo); return true; } } /** @brief Process network request completion *---------------------------------------------------------------------------*/ void UpdateObject::getUrlDone(int result, int feedId, QString feedUrlStr, QString error, QByteArray data, QDateTime dtReply, QString codecName) { qDebug() << "getUrl result = " << result << "error: " << error << "url: " << feedUrlStr; if (updateFeedsCount_ > 0) { updateFeedsCount_--; emit loadProgress(updateFeedsCount_); } if (!data.isEmpty()) { emit xmlReadyParse(data, feedId, dtReply, codecName); } else { QString status = "0"; if (result < 0) { status = QString("%1 %2").arg(result).arg(error); qWarning() << QString("Request failed: result = %1, error - %2, url - %3"). arg(result).arg(error).arg(feedUrlStr); } finishUpdate(feedId, false, 0, status); } } void UpdateObject::finishUpdate(int feedId, bool changed, int newCount, QString status) { if (updateFeedsCount_ > 0) { updateFeedsCount_--; emit loadProgress(updateFeedsCount_); } bool finish = false; if (updateFeedsCount_ <= 0) { finish = true; } int feedIdIndex = feedIdList_.indexOf(feedId); if (feedIdIndex > -1) { feedIdList_.takeAt(feedIdIndex); } QSqlQuery q(db_); QString qStr = QString("UPDATE feeds SET status='%1' WHERE id=='%2'"). arg(status).arg(feedId); q.exec(qStr); if (changed) { if (mainWindow_->currentNewsTab->type_ == NewsTabWidget::TabTypeFeed) { bool folderUpdate = false; int feedParentId = 0; QSqlQuery q(db_); q.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(feedId)); if (q.first()) { feedParentId = q.value(0).toInt(); if (feedParentId == mainWindow_->currentNewsTab->feedId_) folderUpdate = true; } while (feedParentId && !folderUpdate) { q.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(feedParentId)); if (q.first()) { feedParentId = q.value(0).toInt(); if (feedParentId == mainWindow_->currentNewsTab->feedId_) folderUpdate = true; } } // Click on feed if it is displayed to update view if ((feedId == mainWindow_->currentNewsTab->feedId_) || folderUpdate) { if (!timerUpdateNews_->isActive()) timerUpdateNews_->start(1000); int unreadCount = 0; int allCount = 0; q.exec(QString("SELECT unread, undeleteCount FROM feeds WHERE id=='%1'"). arg(mainWindow_->currentNewsTab->feedId_)); if (q.first()) { unreadCount = q.value(0).toInt(); allCount = q.value(1).toInt(); } emit signalCountsStatusBar(unreadCount, allCount); } } else if (mainWindow_->currentNewsTab->type_ < NewsTabWidget::TabTypeWeb) { if (!timerUpdateNews_->isActive()) timerUpdateNews_->start(1000); } } emit feedUpdated(feedId, changed, newCount, finish); emit setStatusFeed(feedId, status); } /** @brief Start timer if feed presents in queue *---------------------------------------------------------------------------*/ void UpdateObject::slotNextUpdateFeed(bool finish) { if (!updateModelTimer_->isActive()) { if (finish) updateModelTimer_->start(UPDATE_INTERVAL_MIN); else updateModelTimer_->start(UPDATE_INTERVAL); } } void UpdateObject::slotRecountCategoryCounts() { QList deletedList; QList starredList; QList readList; QStringList labelList; QSqlQuery q(db_); q.exec("SELECT deleted, starred, read, label FROM news WHERE deleted < 2"); while (q.next()) { deletedList.append(q.value(0).toInt()); starredList.append(q.value(1).toInt()); readList.append(q.value(2).toInt()); labelList.append(q.value(3).toString()); } emit signalRecountCategoryCounts(deletedList, starredList, readList, labelList); } /** @brief Update feed counters and all its parents * * Update fields: unread news number, new news number, * last update feed timestamp * Update only feeds, categories are ignored * Update right into DB, update view if feed is visible in feed tree * @param feedId Feed identifier * @param updateViewport Need viewport update flag *----------------------------------------------------------------------------*/ void UpdateObject::slotRecountFeedCounts(int feedId, bool updateViewport) { QSqlQuery q(db_); QString qStr; db_.transaction(); int feedParId = 0; bool isFolder = false; qStr = QString("SELECT parentId, xmlUrl FROM feeds WHERE id=='%1'"). arg(feedId); q.exec(qStr); if (q.next()) { feedParId = q.value(0).toInt(); if (q.value(1).toString().isEmpty()) isFolder = true; } int undeleteCount = 0; int unreadCount = 0; int newCount = 0; if (!isFolder) { // Calculate all news (not mark deleted) qStr = QString("SELECT count(id) FROM news WHERE feedId=='%1' AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) undeleteCount = q.value(0).toInt(); // Calculate unread news qStr = QString("SELECT count(read) FROM news WHERE feedId=='%1' AND read==0 AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) unreadCount = q.value(0).toInt(); // Calculate new news qStr = QString("SELECT count(new) FROM news WHERE feedId=='%1' AND new==1 AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) newCount = q.value(0).toInt(); int unreadCountOld = 0; int newCountOld = 0; int undeleteCountOld = 0; qStr = QString("SELECT unread, newCount, undeleteCount FROM feeds WHERE id=='%1'"). arg(feedId); q.exec(qStr); if (q.next()) { unreadCountOld = q.value(0).toInt(); newCountOld = q.value(1).toInt(); undeleteCountOld = q.value(2).toInt(); } if ((unreadCount == unreadCountOld) && (newCount == newCountOld) && (undeleteCount == undeleteCountOld)) { db_.commit(); return; } // Save unread and new news number for feed qStr = QString("UPDATE feeds SET unread='%1', newCount='%2', undeleteCount='%3' " "WHERE id=='%4'"). arg(unreadCount).arg(newCount).arg(undeleteCount).arg(feedId); q.exec(qStr); // Update view of the feed FeedCountStruct counts; counts.feedId = feedId; counts.unreadCount = unreadCount; counts.newCount = newCount; counts.undeleteCount = undeleteCount; emit feedCountsUpdate(counts); } else { bool changed = false; QList idParList; QList idList = getIdFeedsInList(feedId); if (idList.count()) { foreach (int id, idList) { int parId = 0; q.exec(QString("SELECT parentId FROM feeds WHERE id=='%1'").arg(id)); if (q.next()) parId = q.value(0).toInt(); if (parId) { if (idParList.indexOf(parId) == -1) { idParList.append(parId); } } // Calculate all news (not mark deleted) qStr = QString("SELECT count(id) FROM news WHERE feedId=='%1' AND deleted==0"). arg(id); q.exec(qStr); if (q.next()) undeleteCount = q.value(0).toInt(); // Calculate unread news qStr = QString("SELECT count(read) FROM news WHERE feedId=='%1' AND read==0 AND deleted==0"). arg(id); q.exec(qStr); if (q.next()) unreadCount = q.value(0).toInt(); // Calculate new news qStr = QString("SELECT count(new) FROM news WHERE feedId=='%1' AND new==1 AND deleted==0"). arg(id); q.exec(qStr); if (q.next()) newCount = q.value(0).toInt(); int unreadCountOld = 0; int newCountOld = 0; int undeleteCountOld = 0; qStr = QString("SELECT unread, newCount, undeleteCount FROM feeds WHERE id=='%1'"). arg(id); q.exec(qStr); if (q.next()) { unreadCountOld = q.value(0).toInt(); newCountOld = q.value(1).toInt(); undeleteCountOld = q.value(2).toInt(); } if ((unreadCount == unreadCountOld) && (newCount == newCountOld) && (undeleteCount == undeleteCountOld)) { continue; } changed = true; // Save unread and new news number for parent qStr = QString("UPDATE feeds SET unread='%1', newCount='%2', undeleteCount='%3' " "WHERE id=='%4'"). arg(unreadCount).arg(newCount).arg(undeleteCount).arg(id); q.exec(qStr); // Update view of the parent FeedCountStruct counts; counts.feedId = id; counts.unreadCount = unreadCount; counts.newCount = newCount; counts.undeleteCount = undeleteCount; emit feedCountsUpdate(counts); } if (!changed) { db_.commit(); return; } foreach (int l_feedParId, idParList) { while (l_feedParId) { QString updated; qStr = QString("SELECT sum(unread), sum(newCount), sum(undeleteCount), " "max(updated) FROM feeds WHERE parentId=='%1'"). arg(l_feedParId); q.exec(qStr); if (q.next()) { unreadCount = q.value(0).toInt(); newCount = q.value(1).toInt(); undeleteCount = q.value(2).toInt(); updated = q.value(3).toString(); } qStr = QString("UPDATE feeds SET unread='%1', newCount='%2', undeleteCount='%3', " "updated='%4' WHERE id=='%5'"). arg(unreadCount).arg(newCount).arg(undeleteCount).arg(updated). arg(l_feedParId); q.exec(qStr); // Update view FeedCountStruct counts; counts.feedId = l_feedParId; counts.unreadCount = unreadCount; counts.newCount = newCount; counts.undeleteCount = undeleteCount; counts.updated = updated; emit feedCountsUpdate(counts); if (feedId == l_feedParId) break; q.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(l_feedParId)); if (q.next()) l_feedParId = q.value(0).toInt(); } } } } // Recalculate counters for all parents int l_feedParId = feedParId; while (l_feedParId) { QString updated; qStr = QString("SELECT sum(unread), sum(newCount), sum(undeleteCount), " "max(updated) FROM feeds WHERE parentId=='%1'"). arg(l_feedParId); q.exec(qStr); if (q.next()) { unreadCount = q.value(0).toInt(); newCount = q.value(1).toInt(); undeleteCount = q.value(2).toInt(); updated = q.value(3).toString(); } qStr = QString("UPDATE feeds SET unread='%1', newCount='%2', undeleteCount='%3', " "updated='%4' WHERE id=='%5'"). arg(unreadCount).arg(newCount).arg(undeleteCount).arg(updated). arg(l_feedParId); q.exec(qStr); // Update view FeedCountStruct counts; counts.feedId = l_feedParId; counts.unreadCount = unreadCount; counts.newCount = newCount; counts.undeleteCount = undeleteCount; counts.updated = updated; emit feedCountsUpdate(counts); q.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(l_feedParId)); if (q.next()) l_feedParId = q.value(0).toInt(); } db_.commit(); if (updateViewport) emit signalFeedsViewportUpdate(); } /** @brief Get feeds ids list string of folder \a idFolder *---------------------------------------------------------------------------*/ QString UpdateObject::getIdFeedsString(int idFolder, int idException) { QList idList = getIdFeedsInList(idFolder); if (idList.count()) { QString str; foreach (int id, idList) { if (id == idException) continue; if (!str.isEmpty()) str.append(" OR "); str.append(QString("feedId=%1").arg(id)); } return str; } else { return QString("feedId=-1"); } } /** @brief Get feeds ids list of folder \a idFolder *---------------------------------------------------------------------------*/ QList UpdateObject::getIdFeedsInList(int idFolder) { QList idList; if (idFolder <= 0) return idList; QSqlQuery q; QQueue parentIds; parentIds.enqueue(idFolder); while (!parentIds.empty()) { int parentId = parentIds.dequeue(); QString qStr = QString("SELECT id, xmlUrl FROM feeds WHERE parentId='%1'"). arg(parentId); q.exec(qStr); while (q.next()) { int feedId = q.value(0).toInt(); if (!q.value(1).toString().isEmpty()) idList << feedId; if (q.value(1).toString().isEmpty()) parentIds.enqueue(feedId); } } return idList; } /** @brief Mark feed Read while clicking on unfocused one *---------------------------------------------------------------------------*/ void UpdateObject::slotSetFeedRead(int readType, int feedId, int idException, QList idNewsList) { if (readType != FeedReadSwitchingTab) { db_.transaction(); QSqlQuery q(db_); QString idFeedsStr = getIdFeedsString(feedId, idException); if (((readType == FeedReadSwitchingFeed) && mainWindow_->markReadSwitchingFeed_) || ((readType == FeedReadClosingTab) && mainWindow_->markReadClosingTab_) || ((readType == FeedReadPlaceToTray) && mainWindow_->markReadMinimize_)) { if (idFeedsStr == "feedId=-1") { q.exec(QString("UPDATE news SET read=2 WHERE feedId='%1' AND read!=2").arg(feedId)); } else { q.exec(QString("UPDATE news SET read=2 WHERE (%1) AND read!=2").arg(idFeedsStr)); } } else { if (idFeedsStr == "feedId=-1") { q.exec(QString("UPDATE news SET read=2 WHERE feedId='%1' AND read=1").arg(feedId)); } else { q.exec(QString("UPDATE news SET read=2 WHERE (%1) AND read=1").arg(idFeedsStr)); } } if (idFeedsStr == "feedId=-1") { q.exec(QString("UPDATE news SET new=0 WHERE feedId='%1' AND new=1").arg(feedId)); } else { q.exec(QString("UPDATE news SET new=0 WHERE (%1) AND new=1").arg(idFeedsStr)); } if (mainWindow_->markNewsReadOn_ && mainWindow_->markPrevNewsRead_) q.exec(QString("UPDATE news SET read=2 WHERE id IN (SELECT currentNews FROM feeds WHERE id='%1')").arg(feedId)); db_.commit(); slotRecountFeedCounts(feedId); slotRecountCategoryCounts(); emit signalUpdateNews(); if (readType != FeedReadPlaceToTray) { slotRefreshInfoTray(); } } else { QString idStr; foreach (int newsId, idNewsList) { if (!idStr.isEmpty()) idStr.append(" OR "); idStr.append(QString("id='%1'").arg(newsId)); } db_.transaction(); QSqlQuery q(db_); q.exec(QString("UPDATE news SET read=2 WHERE (%1) AND read==1").arg(idStr)); q.exec(QString("UPDATE news SET new=0 WHERE (%1) AND new==1").arg(idStr)); db_.commit(); if (feedId > -1) slotRecountFeedCounts(feedId, false); } emit signalSetFeedsFilter(); } void UpdateObject::slotMarkFeedRead(int id, bool isFolder, bool openFeed) { db_.transaction(); QSqlQuery q(db_); QString qStr; if (isFolder) { qStr = QString("UPDATE news SET read=2 WHERE read!=2 AND deleted==0 AND (%1)"). arg(getIdFeedsString(id)); q.exec(qStr); qStr = QString("UPDATE news SET new=0 WHERE new==1 AND (%1)"). arg(getIdFeedsString(id)); q.exec(qStr); } else { if (openFeed) { qStr = QString("UPDATE news SET read=2 WHERE feedId=='%1' AND read!=2 AND deleted==0"). arg(id); q.exec(qStr); } else { QString qStr = QString("UPDATE news SET read=1 WHERE feedId=='%1' AND read==0"). arg(id); q.exec(qStr); } qStr = QString("UPDATE news SET new=0 WHERE feedId=='%1' AND new==1"). arg(id); q.exec(qStr); } db_.commit(); if (!openFeed || isFolder) slotUpdateStatus(id, true); } /** @brief Update status of current feed or feed of current tab *---------------------------------------------------------------------------*/ void UpdateObject::slotUpdateStatus(int feedId, bool changed) { if (changed) { slotRecountFeedCounts(feedId); } slotRefreshInfoTray(); if (feedId > 0) { bool folderUpdate = false; int feedParentId = 0; QSqlQuery q(db_); q.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(feedId)); if (q.next()) { feedParentId = q.value(0).toInt(); if (feedParentId == mainWindow_->currentNewsTab->feedId_) folderUpdate = true; } while (feedParentId && !folderUpdate) { q.exec(QString("SELECT parentId FROM feeds WHERE id==%1").arg(feedParentId)); if (q.next()) { feedParentId = q.value(0).toInt(); if (feedParentId == mainWindow_->currentNewsTab->feedId_) folderUpdate = true; } } // Click on feed if it is displayed to update view if ((feedId == mainWindow_->currentNewsTab->feedId_) || folderUpdate) { int unreadCount = 0; int allCount = 0; q.exec(QString("SELECT unread, undeleteCount FROM feeds WHERE id=='%1'"). arg(mainWindow_->currentNewsTab->feedId_)); if (q.next()) { unreadCount = q.value(0).toInt(); allCount = q.value(1).toInt(); } emit signalCountsStatusBar(unreadCount, allCount); } } } void UpdateObject::slotMarkAllFeedsRead() { QSqlQuery q(db_); q.exec("UPDATE news SET read=2 WHERE read!=2 AND deleted==0"); q.exec("UPDATE news SET new=0 WHERE new==1 AND deleted==0"); q.exec("SELECT id FROM feeds WHERE unread!=0"); while (q.next()) { slotRecountFeedCounts(q.value(0).toInt()); } slotRecountCategoryCounts(); slotRefreshInfoTray(); emit signalMarkAllFeedsRead(); } void UpdateObject::slotMarkReadCategory(int type, int idLabel) { QString qStr; switch (type) { case NewsTabWidget::TabTypeUnread: qStr = "feedId > 0 AND deleted = 0 AND read < 2"; break; case NewsTabWidget::TabTypeStar: qStr = "feedId > 0 AND deleted = 0 AND starred = 1"; break; case NewsTabWidget::TabTypeLabel: if (idLabel != 0) { qStr = QString("feedId > 0 AND deleted = 0 AND label LIKE '%,%1,%'"). arg(idLabel); } else { qStr = QString("feedId > 0 AND deleted = 0 AND label!='' AND label!=','"); } break; } QSqlQuery q; q.exec(QString("UPDATE news SET read=1 WHERE %1").arg(qStr)); q.exec(QString("UPDATE news SET new=0 WHERE %1").arg(qStr)); QList idList; q.exec("SELECT id FROM feeds WHERE unread!=0"); while (q.next()) { idList.append(q.value(0).toInt()); } emit signalMarkAllFeedsRead(0); foreach (int id, idList) { slotUpdateStatus(id, true); } } /** @brief Save icon in DB and emit signal to update it *----------------------------------------------------------------------------*/ void UpdateObject::slotIconSave(QString feedUrl, QByteArray faviconData) { int feedId = 0; QSqlQuery q(db_); q.prepare("SELECT id FROM feeds WHERE xmlUrl LIKE :xmlUrl"); q.bindValue(":xmlUrl", feedUrl); q.exec(); if (q.next()) { feedId = q.value(0).toInt(); } q.prepare("UPDATE feeds SET image = ? WHERE id == ?"); q.addBindValue(faviconData.toBase64()); q.addBindValue(feedId); q.exec(); emit signalIconUpdate(feedId, faviconData); } void UpdateObject::slotSqlQueryExec(QString query) { QSqlQuery q(db_); if (!q.exec(query)) { qCritical() << __PRETTY_FUNCTION__ << __LINE__ << "q.lastError(): " << q.lastError().text(); } } /** @brief Mark all feeds Not New *---------------------------------------------------------------------------*/ void UpdateObject::slotMarkAllFeedsOld() { QSqlQuery q(db_); q.exec("UPDATE news SET new=0 WHERE new==1 AND deleted==0"); q.exec("SELECT id FROM feeds WHERE newCount!=0"); while (q.next()) { slotRecountFeedCounts(q.value(0).toInt()); } slotRecountCategoryCounts(); if ((mainWindow_->currentNewsTab != NULL) && (mainWindow_->currentNewsTab->type_ < NewsTabWidget::TabTypeWeb)) { emit signalUpdateNews(); } slotRefreshInfoTray(); } void UpdateObject::slotRefreshInfoTray() { // Calculate new and unread news number int newCount = 0; int unreadCount = 0; QSqlQuery q(db_); q.exec("SELECT sum(newCount), sum(unread) FROM feeds WHERE xmlUrl!=''"); if (q.first()) { newCount = q.value(0).toInt(); unreadCount = q.value(1).toInt(); } emit signalRefreshInfoTray(newCount, unreadCount); } void UpdateObject::saveMemoryDatabase() { isSaveMemoryDatabase = true; Database::sqliteDBMemFile(); isSaveMemoryDatabase = false; } /** @brief Delete news from the feed by criteria *---------------------------------------------------------------------------*/ void UpdateObject::cleanUpShutdown() { Settings settings; settings.beginGroup("Settings"); bool cleanupOnShutdown = settings.value("cleanupOnShutdown", true).toBool(); int maxDayCleanUp = settings.value("maxDayClearUp", 30).toInt(); int maxNewsCleanUp = settings.value("maxNewsClearUp", 200).toInt(); bool dayCleanUpOn = settings.value("dayClearUpOn", true).toBool(); bool newsCleanUpOn = settings.value("newsClearUpOn", true).toBool(); bool readCleanUp = settings.value("readClearUp", false).toBool(); bool neverUnreadCleanUp = settings.value("neverUnreadClearUp", true).toBool(); bool neverStarCleanUp = settings.value("neverStarClearUp", true).toBool(); bool neverLabelCleanUp = settings.value("neverLabelClearUp", true).toBool(); bool cleanUpDeleted = settings.value("cleanUpDeleted", false).toBool(); bool optimizeDB = settings.value("optimizeDB", false).toBool(); settings.endGroup(); QSqlQuery q; QString qStr; if (!mainApp->storeDBMemory()) db_ = QSqlDatabase::database(); db_.transaction(); q.exec("UPDATE news SET new=0 WHERE new==1"); q.exec("UPDATE news SET read=2 WHERE read==1"); q.exec("UPDATE feeds SET newCount=0 WHERE newCount!=0"); if (cleanupOnShutdown) { QList feedsIdList; QList foldersIdList; q.exec("SELECT id, xmlUrl FROM feeds"); while (q.next()) { if (q.value(1).toString().isEmpty()) { foldersIdList << q.value(0).toInt(); } else { feedsIdList << q.value(0).toInt(); } } // Run Cleanup for all feeds, except categories foreach (int feedId, feedsIdList) { int countDelNews = 0; int countAllNews = 0; qStr = QString("SELECT undeleteCount FROM feeds WHERE id=='%1'").arg(feedId); q.exec(qStr); if (q.next()) countAllNews = q.value(0).toInt(); QString qStr1 = QString("UPDATE news SET description='', content='', received='', " "author_name='', author_uri='', author_email='', " "category='', new='', read='', starred='', label='', " "deleteDate='', feedParentId='', deleted=2"); qStr = QString("SELECT id, received FROM news WHERE feedId=='%1' AND deleted == 0"). arg(feedId); if (neverUnreadCleanUp) qStr.append(" AND read!=0"); if (neverStarCleanUp) qStr.append(" AND starred==0"); if (neverLabelCleanUp) qStr.append(" AND (label=='' OR label==',' OR label IS NULL)"); qStr.append(" ORDER BY published"); q.exec(qStr); while (q.next()) { int newsId = q.value(0).toInt(); if (newsCleanUpOn && (countDelNews < (countAllNews - maxNewsCleanUp))) { qStr = QString("%1 WHERE id=='%2'").arg(qStr1).arg(newsId); QSqlQuery qt; qt.exec(qStr); countDelNews++; continue; } QDateTime dateTime = QDateTime::fromString( q.value(1).toString(), Qt::ISODate); if (dayCleanUpOn && (dateTime.daysTo(QDateTime::currentDateTime()) > maxDayCleanUp)) { qStr = QString("%1 WHERE id=='%2'").arg(qStr1).arg(newsId); QSqlQuery qt; qt.exec(qStr); countDelNews++; continue; } if (readCleanUp) { qStr = QString("%1 WHERE read!=0 AND id=='%2'").arg(qStr1).arg(newsId); QSqlQuery qt; qt.exec(qStr); countDelNews++; } } int undeleteCount = 0; qStr = QString("SELECT count(id) FROM news WHERE feedId=='%1' AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) undeleteCount = q.value(0).toInt(); int unreadCount = 0; qStr = QString("SELECT count(read) FROM news WHERE feedId=='%1' AND read==0 AND deleted==0"). arg(feedId); q.exec(qStr); if (q.next()) unreadCount = q.value(0).toInt(); qStr = QString("UPDATE feeds SET unread='%1', undeleteCount='%2' WHERE id=='%3'"). arg(unreadCount).arg(undeleteCount).arg(feedId); q.exec(qStr); } // Run categories recount, because cleanup may change counts foreach (int folderIdStart, foldersIdList) { if (folderIdStart < 1) continue; int folderId = folderIdStart; // Process all parents while (0 < folderId) { int unreadCount = -1; int undeleteCount = -1; // Calculate sum of all feeds with same parent qStr = QString("SELECT sum(unread), sum(undeleteCount) FROM feeds " "WHERE parentId=='%1'").arg(folderId); q.exec(qStr); if (q.next()) { unreadCount = q.value(0).toInt(); undeleteCount = q.value(1).toInt(); } if (unreadCount != -1) { qStr = QString("UPDATE feeds SET unread='%1', undeleteCount='%2' WHERE id=='%3'"). arg(unreadCount).arg(undeleteCount).arg(folderId); q.exec(qStr); } // go to next parent's parent qStr = QString("SELECT parentId FROM feeds WHERE id=='%1'").arg(folderId); folderId = 0; q.exec(qStr); if (q.next()) folderId = q.value(0).toInt(); } } if (cleanUpDeleted) { q.exec("UPDATE news SET description='', content='', received='', " "author_name='', author_uri='', author_email='', " "category='', new='', read='', starred='', label='', " "deleteDate='', feedParentId='', deleted=2 WHERE deleted==1"); } } q.finish(); db_.commit(); if (cleanupOnShutdown && optimizeDB && !mainApp->storeDBMemory()) { db_.exec("VACUUM"); } } void UpdateObject::quitApp() { cleanUpShutdown(); if (mainApp->storeDBMemory()) { saveMemoryDatabase(); Settings settings; settings.beginGroup("Settings"); bool cleanupOnShutdown = settings.value("cleanupOnShutdown", true).toBool(); bool optimizeDB = settings.value("optimizeDB", false).toBool(); settings.endGroup(); if (cleanupOnShutdown && optimizeDB) { Database::setVacuum(); } } QTimer::singleShot(0, mainApp, SLOT(quitApplication())); } quiterss-0.18.3/src/updatefeeds.h000066400000000000000000000107461265173051100167240ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef UPDATEFEEDS_H #define UPDATEFEEDS_H #include #include #include #include "requestfeed.h" #include "parseobject.h" #include "faviconobject.h" class UpdateObject; class MainWindow; class UpdateFeeds : public QObject { Q_OBJECT public: explicit UpdateFeeds(QObject *parent, bool addFeed = false); ~UpdateFeeds(); void disconnectObjects(); void startSaveTimer(); UpdateObject *updateObject_; RequestFeed *requestFeed_; ParseObject *parseObject_; FaviconObject *faviconObject_; QThread *getFeedThread_; QThread *updateFeedThread_; QThread *getFaviconThread_; public slots: void saveMemoryDatabase(); void quitApp(); private: bool addFeed_; QTimer *saveMemoryDBTimer_; }; class UpdateObject : public QObject { Q_OBJECT public: explicit UpdateObject(QObject *parent = 0); ~UpdateObject(); static QList getIdFeedsInList(int idFolder); static QString getIdFeedsString(int idFolder, int idException = -1); bool isSaveMemoryDatabase; public slots: void slotGetFeedTimer(int feedId); void slotGetAllFeedsTimer(); void slotGetFeed(int feedId, QString feedUrl, QDateTime date, int auth); void slotGetFeedsFolder(QString query); void slotGetAllFeeds(); void slotImportFeeds(QByteArray xmlData); void getUrlDone(int result, int feedId, QString feedUrlStr, QString error, QByteArray data, QDateTime dtReply, QString codecName); void finishUpdate(int feedId, bool changed, int newCount, QString status); void slotNextUpdateFeed(bool finish); void slotRecountCategoryCounts(); void slotRecountFeedCounts(int feedId, bool updateViewport = true); void slotSetFeedRead(int readType, int feedId, int idException, QList idNewsList); void slotMarkFeedRead(int id, bool isFolder, bool openFeed); void slotUpdateStatus(int feedId, bool changed); void slotMarkAllFeedsRead(); void slotMarkReadCategory(int type, int idLabel); void slotIconSave(QString feedUrl, QByteArray faviconData); void slotSqlQueryExec(QString query); void slotMarkAllFeedsOld(); void slotRefreshInfoTray(); void saveMemoryDatabase(); void cleanUpShutdown(); void quitApp(); signals: void showProgressBar(int value); void loadProgress(int value, bool clear = false); void signalMessageStatusBar(QString message, int timeout = 0); void signalUpdateFeedsModel(); void signalRequestUrl(int feedId, QString urlString, QDateTime date, QString userInfo); void xmlReadyParse(QByteArray data, int feedId, QDateTime dtReply, QString codecName); void setStatusFeed(int feedId, QString status); void feedUpdated(int feedId, bool changed, int newCount, bool finish); void signalUpdateModel(bool checkFilter = true); void signalUpdateNews(); void signalCountsStatusBar(int unreadCount, int allCount); void signalRecountCategoryCounts(QList deletedList, QList starredList, QList readList, QStringList labelList); void feedCountsUpdate(FeedCountStruct counts); void signalFeedsViewportUpdate(); void signalRefreshInfoTray(int newCount, int unreadCount); void signalMarkAllFeedsRead(int nextUnread = -1); void signalIconUpdate(int feedId, QByteArray faviconData); void signalSetFeedsFilter(bool clicked = false); private slots: bool addFeedInQueue(int feedId, const QString &feedUrl, const QDateTime &date, int auth); private: MainWindow *mainWindow_; QSqlDatabase db_; QList feedIdList_; int updateFeedsCount_; QTimer *updateModelTimer_; QTimer *timerUpdateNews_; }; #endif // UPDATEFEEDS_H quiterss-0.18.3/src/webview/000077500000000000000000000000001265173051100157225ustar00rootroot00000000000000quiterss-0.18.3/src/webview/locationbar.cpp000066400000000000000000000055621265173051100207330ustar00rootroot00000000000000/* ============================================================================= * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * =========================================================================== */ #include "locationbar.h" #include "rssdetectionwidget.h" #include #include LocationBar::LocationBar(WebView *view, QWidget *parent) : QLineEdit(parent) , view_(view) , focus_(false) { setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setStyleSheet("QLineEdit {margin-bottom: 1px; padding: 0px 3px 0px 3px;}"); QHBoxLayout *mainLayout = new QHBoxLayout(this); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setSpacing(0); rightWidget_ = new QWidget(this); rightWidget_->resize(0, 0); QHBoxLayout *rightLayout = new QHBoxLayout(rightWidget_); rightLayout->setContentsMargins(0, 0, 2, 0); rssButton_ = new QToolButton(this); rssButton_->setToolTip("RSS"); rssButton_->setFocusPolicy(Qt::NoFocus); rssButton_->setCursor(Qt::ArrowCursor); rssButton_->setFocusPolicy(Qt::ClickFocus); rssButton_->setStyleSheet("QToolButton { border: none; padding: 0px; }"); QPixmap pixmap(":/images/feed"); rssButton_->setIcon(QIcon(pixmap)); rightLayout->addWidget(rssButton_, 0, Qt::AlignVCenter | Qt::AlignRight); mainLayout->addStretch(1); mainLayout->addWidget(rightWidget_, 0, Qt::AlignVCenter | Qt::AlignRight); rssButton_->hide(); connect(rssButton_, SIGNAL(clicked()), this, SLOT(rssIconClicked())); } void LocationBar::mouseReleaseEvent(QMouseEvent *event) { if (focus_) { selectAll(); focus_ = false; } QLineEdit::mouseReleaseEvent(event); } void LocationBar::focusInEvent(QFocusEvent *event) { focus_ = true; QLineEdit::focusInEvent(event); } void LocationBar::updateTextMargins() { int left = 0; int right = rightWidget_->sizeHint().width(); int top = 0; int bottom = 0; setTextMargins(left, top, right, bottom); } void LocationBar::showRssIcon(bool show) { rssButton_->setVisible(show); updateTextMargins(); } void LocationBar::rssIconClicked() { RSSDetectionWidget *rssWidget = new RSSDetectionWidget(view_, parentWidget()); rssWidget->showAt(parentWidget()); } quiterss-0.18.3/src/webview/locationbar.h000066400000000000000000000026761265173051100204030ustar00rootroot00000000000000/* ============================================================================= * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * =========================================================================== */ #ifndef LOCATIONBAR_H #define LOCATIONBAR_H #include #include class WebView; class LocationBar : public QLineEdit { Q_OBJECT public: LocationBar(WebView *view, QWidget *parent = 0); public slots: void updateTextMargins(); void showRssIcon(bool show); private slots: void rssIconClicked(); private: void mouseReleaseEvent(QMouseEvent*); void focusInEvent(QFocusEvent *event); WebView *view_; bool focus_; QWidget *rightWidget_; QToolButton *rssButton_; }; #endif // LOCATIONBAR_H quiterss-0.18.3/src/webview/rssdetectionwidget.cpp000066400000000000000000000065531265173051100223510ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * Copyright (C) 2010-2013 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "rssdetectionwidget.h" #include "mainapplication.h" #include "webview.h" #include #include #include RSSDetectionWidget::RSSDetectionWidget(WebView* view, QWidget* parent) : QFrame(parent, Qt::Popup) , view_(view) { setAttribute(Qt::WA_DeleteOnClose); setFrameStyle(QFrame::StyledPanel | QFrame::Plain); setLineWidth(1); setMidLineWidth(2); gridLayout_ = new QGridLayout(this); gridLayout_->setMargin(5); gridLayout_->setSpacing(5); QWebFrame* frame = view_->page()->mainFrame(); QWebElementCollection links = frame->findAllElements("link[type=\"application/rss+xml\"]"); int cols = links.count() / 10 == 0 ? 1 : links.count() / 10; int row = 0; for (int i = 0; i < links.count(); i++) { QWebElement element = links.at(i); QString title = element.attribute("title"); const QUrl url = QUrl::fromEncoded(element.attribute("href").toUtf8()); if (url.isEmpty()) { continue; } if (title.isEmpty()) { title = tr("Untitled feed"); } QPushButton* button = new QPushButton(this); button->setStyleSheet("QPushButton {text-align:left; border: none; padding: 0px;}" "QPushButton:hover {color: #1155CC;}"); button->setCursor(Qt::PointingHandCursor); button->setText(title); button->setToolTip(url.toString()); button->setProperty("rss-url", url); button->setProperty("rss-title", title); int pos = i % cols > 0 ? (i % cols) * 2 : 0; gridLayout_->addWidget(button, row, pos); connect(button, SIGNAL(clicked()), this, SLOT(addRss())); if (i % cols == cols - 1) { row++; } } } RSSDetectionWidget::~RSSDetectionWidget() { } void RSSDetectionWidget::showAt(QWidget* parent) { // Calculate sizes before showing layout()->invalidate(); layout()->activate(); QPoint p = parent->mapToGlobal(QPoint(0, 0)); p.setX(p.x() + parent->width() - width()); p.setY(p.y() + parent->height()); move(p); QFrame::show(); } void RSSDetectionWidget::addRss() { if (QPushButton *button = qobject_cast(sender())) { QUrl url = button->property("rss-url").toUrl(); if (url.isRelative()) { url = view_->page()->mainFrame()->baseUrl().resolved(url); } if (!url.isValid()) { return; } QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(url.toString()); mainApp->mainWindow()->addFeed(); close(); } } quiterss-0.18.3/src/webview/rssdetectionwidget.h000066400000000000000000000025731265173051100220140ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * Copyright (C) 2010-2013 David Rosca * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #ifndef RSSDETECTIONWIDGET_H #define RSSDETECTIONWIDGET_H #include #include #include class WebView; class RSSDetectionWidget : public QFrame { Q_OBJECT public: explicit RSSDetectionWidget(WebView* view, QWidget* parent = 0); ~RSSDetectionWidget(); void showAt(QWidget* parent); private slots: void addRss(); private: WebView* view_; QGridLayout* gridLayout_; }; #endif // RSSDETECTIONWIDGET_H quiterss-0.18.3/src/webview/webpage.cpp000066400000000000000000000200751265173051100200440ustar00rootroot00000000000000/* ============================================================ * QuiteRSS is a open-source cross-platform RSS/Atom news feeds reader * Copyright (C) 2011-2016 QuiteRSS Team * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ============================================================ */ #include "webpage.h" #include "mainapplication.h" #include "networkmanagerproxy.h" #include "webpluginfactory.h" #include "adblockicon.h" #include "adblockmanager.h" #include #include #include QList WebPage::livingPages_; WebPage::WebPage(QObject *parent) : QWebPage(parent) , loadProgress_(-1) { networkManagerProxy_ = new NetworkManagerProxy(this, this); setNetworkAccessManager(networkManagerProxy_); setPluginFactory(new WebPluginFactory(this)); setForwardUnsupportedContent(true); action(QWebPage::OpenFrameInNewWindow)->setVisible(false); action(QWebPage::OpenImageInNewWindow)->setVisible(false); connect(this, SIGNAL(loadProgress(int)), this, SLOT(progress(int))); connect(this, SIGNAL(loadFinished(bool)), this, SLOT(finished())); connect(this, SIGNAL(unsupportedContent(QNetworkReply*)), this, SLOT(handleUnsupportedContent(QNetworkReply*))); connect(this, SIGNAL(downloadRequested(QNetworkRequest)), this, SLOT(downloadRequested(QNetworkRequest))); connect(this, SIGNAL(printRequested(QWebFrame*)), mainApp->mainWindow(), SLOT(slotPrint(QWebFrame*))); livingPages_.append(this); } WebPage::~WebPage() { livingPages_.removeOne(this); } void WebPage::disconnectObjects() { livingPages_.removeOne(this); disconnect(this); networkManagerProxy_->disconnectObjects(); } bool WebPage::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, NavigationType type) { lastRequestType_ = type; lastRequestUrl_ = request.url(); return QWebPage::acceptNavigationRequest(frame,request,type); } QWebPage *WebPage::createWindow(WebWindowType type) { Q_UNUSED(type) return mainApp->mainWindow()->createWebTab(); } void WebPage::scheduleAdjustPage() { WebView* webView = qobject_cast(view()); if (!webView) { return; } if (webView->isLoading()) { adjustingScheduled_ = true; } else { const QSize &originalSize = webView->size(); QSize newSize(originalSize.width() - 1, originalSize.height() - 1); webView->resize(newSize); webView->resize(originalSize); } } bool WebPage::isLoading() const { return loadProgress_ < 100; } void WebPage::urlChanged(const QUrl &url) { Q_UNUSED(url) if (isLoading()) { adBlockedEntries_.clear(); } } void WebPage::progress(int prog) { loadProgress_ = prog; } void WebPage::finished() { progress(100); if (adjustingScheduled_) { adjustingScheduled_ = false; WebView* webView = qobject_cast(view()); const QSize &originalSize = webView->size(); QSize newSize(originalSize.width() - 1, originalSize.height() - 1); webView->resize(newSize); webView->resize(originalSize); } // AdBlock cleanBlockedObjects(); } void WebPage::downloadRequested(const QNetworkRequest &request) { mainApp->downloadManager()->download(request); } void WebPage::handleUnsupportedContent(QNetworkReply* reply) { if (!reply) return; const QUrl &url = reply->url(); switch (reply->error()) { case QNetworkReply::NoError: if (reply->header(QNetworkRequest::ContentTypeHeader).isValid()) { QString requestUrl = reply->request().url().toString(QUrl::RemoveFragment | QUrl::RemoveQuery); if (requestUrl.endsWith(QLatin1String(".swf"))) { const QWebElement &docElement = mainFrame()->documentElement(); const QWebElement &object = docElement.findFirst(QString("object[src=\"%1\"]").arg(requestUrl)); const QWebElement &embed = docElement.findFirst(QString("embed[src=\"%1\"]").arg(requestUrl)); if (!object.isNull() || !embed.isNull()) { qDebug() << "WebPage::UnsupportedContent" << url << "Attempt to download flash object on site!"; reply->deleteLater(); return; } } mainApp->downloadManager()->handleUnsupportedContent(reply, mainApp->mainWindow()->askDownloadLocation_); return; } case QNetworkReply::ProtocolUnknownError: { qDebug() << "WebPage::UnsupportedContent" << url << "ProtocolUnknowError"; QDesktopServices::openUrl(url); reply->deleteLater(); return; } default: break; } qDebug() << "WebPage::UnsupportedContent error" << url << reply->errorString(); reply->deleteLater(); } bool WebPage::isPointerSafeToUse(WebPage* page) { // Pointer to WebPage is passed with every QNetworkRequest casted to void* // So there is no way to test whether pointer is still valid or not, except // this hack. return page == 0 ? false : livingPages_.contains(page); } void WebPage::populateNetworkRequest(QNetworkRequest &request) { WebPage* pagePointer = this; QVariant variant = QVariant::fromValue((void*) pagePointer); request.setAttribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 100), variant); if (lastRequestUrl_ == request.url()) { request.setAttribute((QNetworkRequest::Attribute)(QNetworkRequest::User + 101), lastRequestType_); if (lastRequestType_ == NavigationTypeLinkClicked) { request.setRawHeader("X-QuiteRSS-UserLoadAction", QByteArray("1")); } } } void WebPage::addAdBlockRule(const AdBlockRule* rule, const QUrl &url) { AdBlockedEntry entry; entry.rule = rule; entry.url = url; if (!adBlockedEntries_.contains(entry)) { adBlockedEntries_.append(entry); } } QVector WebPage::adBlockedEntries() const { return adBlockedEntries_; } void WebPage::cleanBlockedObjects() { AdBlockManager* manager = AdBlockManager::instance(); if (!manager->isEnabled()) { return; } const QWebElement docElement = mainFrame()->documentElement(); foreach (const AdBlockedEntry &entry, adBlockedEntries_) { const QString urlString = entry.url.toString(); if (urlString.endsWith(QLatin1String(".js")) || urlString.endsWith(QLatin1String(".css"))) { continue; } QString urlEnd; int pos = urlString.lastIndexOf(QLatin1Char('/')); if (pos > 8) { urlEnd = urlString.mid(pos + 1); } if (urlString.endsWith(QLatin1Char('/'))) { urlEnd = urlString.left(urlString.size() - 1); } QString selector("img[src$=\"%1\"], iframe[src$=\"%1\"],embed[src$=\"%1\"]"); QWebElementCollection elements = docElement.findAll(selector.arg(urlEnd)); foreach (QWebElement element, elements) { QString src = element.attribute("src"); src.remove(QLatin1String("../")); if (urlString.contains(src)) { element.setStyleProperty("display", "none"); } } } // Apply domain-specific element hiding rules QString elementHiding = manager->elementHidingRulesForDomain(mainFrame()->url()); if (elementHiding.isEmpty()) { return; } elementHiding.append(QLatin1String("\n")); QWebElement bodyElement = docElement.findFirst("body"); bodyElement.appendInside("