1
mirror of https://github.com/qbittorrent/qBittorrent synced 2025-10-09 18:32:15 +02:00

Compare commits

..

66 Commits

Author SHA1 Message Date
Christophe Dumez
cfcc29e25a Tagged v2.6.9 release 2011-03-13 17:58:15 +00:00
Christophe Dumez
09e2dd15e2 Bump to v2.6.9 2011-03-13 17:55:23 +00:00
Christophe Dumez
49fd36aa2c BUGFIX: Fix column hiding/showing in transfer list 2011-03-13 17:53:51 +00:00
Christophe Dumez
f9064d8b00 Improve lists columns state saving 2011-03-13 10:12:55 +00:00
Christophe Dumez
01df76915c Do not report torrent being checked as queued 2011-03-13 09:42:52 +00:00
Christophe Dumez
52f6b008f4 Bump to v2.6.8 2011-03-13 09:32:15 +00:00
Christophe Dumez
abeed2c6f0 Make sure the .unwanted folder is removed on torrent soft deletion 2011-03-13 09:30:35 +00:00
Christophe Dumez
01fcf82b0c BUGFIX: Improve folder removal behavior 2011-03-10 19:08:33 +00:00
Christophe Dumez
92c70bc878 Fix root folder being cut off if the torrent comes from a scanned folder (Christian Kandeler) 2011-03-10 17:49:12 +00:00
Christophe Dumez
1c313c7c06 Fix magnet link association (Fisiu) 2011-03-09 20:13:01 +00:00
Christophe Dumez
ed4ca7b769 Slight window position fix 2011-03-07 17:45:58 +00:00
Christophe Dumez
795a3a01c2 Should fix writing on NTFS when using Linux 2011-03-03 19:11:35 +00:00
Christophe Dumez
f31f067bbf Update changelog 2011-03-03 18:21:28 +00:00
Christophe Dumez
10905eb04b Fix compilation with libtorrent v0.14 2011-03-03 18:21:00 +00:00
Christophe Dumez
8637996a99 Added Magnet mime type to desktop file 2011-02-27 17:49:45 +00:00
Christophe Dumez
39867f4681 Bump to v2.6.7 2011-02-26 15:21:22 +00:00
Christophe Dumez
30659a353d Share ratio can now go over 100 2011-02-24 17:37:55 +00:00
Christophe Dumez
d4b5f68295 Fix crash when adding an ampty tracker URL 2011-02-24 17:29:47 +00:00
Christophe Dumez
01725b1b55 Fix cursor problem in torrent addition dialog 2011-02-24 17:17:30 +00:00
Christophe Dumez
64654705ca BUGFIX: Fix torrent upload from Web UI (Windows) 2011-02-22 18:37:25 +00:00
Christophe Dumez
049b08999a Disable OS disk cache for aligned files to reduce memory consumption 2011-02-22 18:04:24 +00:00
Christophe Dumez
0150a05c68 Updated Norwegian translation 2011-02-13 08:34:15 +00:00
Christophe Dumez
8df71e6c44 Fix append label to save path on Windows 2011-02-12 09:52:43 +00:00
Christophe Dumez
cc53b5bb15 Another encoding fix 2011-02-10 19:01:06 +00:00
Christophe Dumez
e66a956596 Revert wrong encoding changes 2011-02-10 18:51:34 +00:00
Christophe Dumez
799a6f0d85 Bump to v2.6.6 2011-02-08 18:03:37 +00:00
Christophe Dumez
5d4a660631 Fix downloads from URLs on Windows
Fix possible path encoding problems on Windows
2011-02-07 20:21:52 +00:00
Christophe Dumez
a721fd389b Completed Lithuanian integration 2011-02-07 18:58:38 +00:00
Christophe Dumez
5923be57b4 Fix typo in language file 2011-02-07 17:51:22 +00:00
Christophe Dumez
1a9bd1b171 Added Lithuanian translation 2011-02-07 17:34:35 +00:00
Christophe Dumez
4322d38b87 BUGFIX: Fix articles read state reset problem in RSS 2011-02-07 17:19:16 +00:00
Christophe Dumez
f16a7e0088 BUGFIX: Use slashes instead of antislashes in URLs (Windows) 2011-02-07 17:11:38 +00:00
Christophe Dumez
9a24243359 Updated French translation 2011-02-06 08:46:26 +00:00
Christophe Dumez
b5e2058b44 Updated language files 2011-02-06 08:44:39 +00:00
Christophe Dumez
ddc803a250 FEATURE: IP address reported to trackers is now customizable 2011-02-06 08:42:50 +00:00
Christophe Dumez
1fd63f0665 Fix properties buttons text color 2011-02-05 21:51:37 +00:00
Christophe Dumez
2b1399303e Fix layout problems 2011-02-05 21:28:47 +00:00
Christophe Dumez
82e7a2d724 COSMETIC: Display pieces being downloaded in green instead of yellow
COSMETIC: Improve piece availability bar appearance
2011-02-05 19:19:21 +00:00
Christophe Dumez
0dc8773595 Main window cosmetic changes 2011-02-05 19:07:54 +00:00
Christophe Dumez
1d358dc9a7 Fix wrong reference use 2011-02-05 15:14:39 +00:00
Christophe Dumez
1fc0310803 Bump to v2.6.5 2011-02-03 16:49:08 +00:00
Christophe Dumez
3b35050736 Fixes to Norwegian translation 2011-02-03 15:57:03 +00:00
Christophe Dumez
adfdb78821 Updated AUTHOR file 2011-01-29 15:08:15 +00:00
Christophe Dumez
c3e79b843b Fix typo in Norwegian translation 2011-01-29 14:48:50 +00:00
Christophe Dumez
ee83c5490e RSS code clean up 2011-01-29 14:19:51 +00:00
Christophe Dumez
9ccf603c0b RSS code clean up 2011-01-29 14:11:35 +00:00
Christophe Dumez
ae8d92f7d0 RSS code clean up 2011-01-29 13:46:48 +00:00
Christophe Dumez
095c8654e8 RSS code clean up 2011-01-29 13:04:33 +00:00
Christophe Dumez
fae47c8494 Fix compilation error in release mode 2011-01-29 11:57:29 +00:00
Christophe Dumez
65efd657a0 Updated Changelog 2011-01-28 19:10:58 +00:00
Christophe Dumez
552bc3c689 Revert class renaming to avoid breaking translations 2011-01-28 19:00:42 +00:00
Christophe Dumez
8d563f9eb6 Updated Norwegian translation 2011-01-28 18:14:58 +00:00
Christophe Dumez
54cd79201f Fix encoding problem in torrent moving code 2011-01-28 17:08:56 +00:00
Christophe Dumez
9c633b0975 More RSS code clean up 2011-01-27 19:29:10 +00:00
Christophe Dumez
67db694494 More RSS code clean up 2011-01-27 18:05:05 +00:00
Christophe Dumez
a42d4afeb7 Use native file dialogs 2011-01-27 17:33:19 +00:00
Christophe Dumez
a8a42fb8f3 Further RSS code rewrite 2011-01-27 17:31:55 +00:00
Christophe Dumez
2b9692ddde Fix compilation on Windows 2011-01-26 07:39:30 +00:00
Christophe Dumez
4b3c04439e Rss code optimization 2011-01-25 18:54:27 +00:00
Christophe Dumez
f0a2efd481 Code clean up 2011-01-25 17:27:54 +00:00
Christophe Dumez
2a44ec9b91 Performance improvement on ARM 2011-01-25 17:07:15 +00:00
Christophe Dumez
895d5151e1 Do not display 100% unless the torrent is complete 2011-01-25 16:56:57 +00:00
Christophe Dumez
233d6bbb8d Code clean up 2011-01-24 19:07:58 +00:00
Christophe Dumez
66ee39df9a Code clean up 2011-01-24 18:11:25 +00:00
Christophe Dumez
35e36036be Fix memory leak in HTTP torrent downloader
Code clean up
2011-01-24 17:29:09 +00:00
Christophe Dumez
1b0de21b52 Make sure the progress is not 100% unless the file is complete 2011-01-24 16:50:23 +00:00
138 changed files with 17563 additions and 9381 deletions

View File

@@ -89,7 +89,8 @@ Translations authors:
- Italian: Matteo Sechi (bu17714@gmail.com)
- Japanese: Nardog (alphisation@gmail.com)
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
- Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
- Lithuanian: Naglis Jonaitis (njonaitis@gmail.com)
- Norwegian: Tomaso
- Polish: Mariusz Fik (fisiu@opensuse.org)
- Portuguese: Nick Marinho (nickmarinho@gmail.com)
- Romanian: Obada Denis (obadadenis@users.sourceforge.net)

View File

@@ -1,3 +1,47 @@
* Sun Mar 13 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.6.9
- BUGFIX: Fix column hiding/showing in transfer list
* Sun Mar 13 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.6.8
- BUGFIX: Fix compilation with libtorrent v0.14.x
- BUGFIX: Fix issues when writing on NTFS (Linux, Mac)
- BUGFIX: Fix root folder being cut off if the torrent comes from a scanned folder (Christian Kandeler)
- BUGFIX: Improve folder removal behavior
- BUGFIX: Make sure the .unwanted folder is deleted on soft torrent removal
- BUGFIX: Indicate support for Magnet links in desktop file (Fisiu)
- BUGFIX: Do not report torrent being checked as queued
- BUGFIX: Improve lists columns state saving
* Sat Feb 26 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.6.7
- BUGFIX: Encoding fixes (Windows)
- BUGFIX: Fix "append label to save path" (Windows)
- BUGFIX: Disable OS cache for aligned files to reduce memory consumption
- BUGFIX: Fix torrent upload from Web UI (Windows)
- BUGFIX: Fix cursor problem in torrent addition dialog
- BUGFIX: Fix crash when additing an empty tracker URL
- BUGFIX: Share ratio can now go over 100
- BUGFIX: Fix compilation with boost >= v1.46
* Tue Feb 8 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.6.6
- FEATURE: IP address reported to trackers is now customizable
- BUGFIX: Use slashes instead of antislashes in URLs (Windows)
- BUGFIX: Fix articles read state reset problem in RSS
- BUGFIX: Fix possible path encoding issues on Windows
- BUGFIX: Fix downloads from URLs on Windows
- I18N: Added Lithuanian translation
- COSMETIC: Improve main window layout
- COSMETIC: Improve properties buttons style
- COSMETIC: Display pieces being downloaded in green instead of yellow
- COSMETIC: Improve piece availability bar appearance
* Thu Feb 3 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.6.5
- BUGFIX: Make sure the progress is not 100% unless the file is complete
- BUGFIX: Fix memory leak in HTTP torrent downloader
- BUGFIX: Use native file dialogs (by Vladimir Golovnev)
- BUGFIX: Fix encoding problem in torrent moving code (by Vladimir Golovnev)
- BUGFIX: Performance improvement on ARM
- BUGFIX: RSS code rewrite (more cpu/memory efficient)
- I18N: Updated Norwegian translation (Tomaso)
* Sun Jan 23 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.6.4
- BUGFIX: Added unicode support to email notification
- BUGFIX: Improved compatibility with various SMTP servers

View File

@@ -1,36 +1,37 @@
[Desktop Entry]
Categories=Qt;Network;P2P;
Comment=V2.6.4
Exec=qbittorrent %f
GenericName=Bittorrent client
GenericName[ar]=العميل Bittorrent
Comment=V2.6.9
Exec=qbittorrent %U
GenericName=BitTorrent client
GenericName[ar]=العميل BitTorrent
GenericName[bg]=Торент клиент
GenericName[cs]=Bittorrent klient
GenericName[de]=Bittorren Client
GenericName[el]=Bittorrent πελάτης
GenericName[es]=Cliente Bittorrent
GenericName[fi]=Bittorrent-ohjelma
GenericName[fr]=Client Bittorrent
GenericName[hr]=Bittorrent klijent
GenericName[hu]=Bittorrent kliens
GenericName[it]=Client Bittorrent
GenericName[ja]=Bittorrent クライアント
GenericName[cs]=BitTorrent klient
GenericName[de]=BitTorren Client
GenericName[el]=BitTorrent πελάτης
GenericName[es]=Cliente BitTorrent
GenericName[fi]=BitTorrent-ohjelma
GenericName[fr]=Client BitTorrent
GenericName[hr]=BitTorrent klijent
GenericName[hu]=BitTorrent kliens
GenericName[it]=Client BitTorrent
GenericName[ja]=BitTorrent クライアント
GenericName[ko]=비토렌트 클라이언트
GenericName[nl]=Bittorrent-cliënt
GenericName[pl]=Klient Bittorrent
GenericName[pt]=Cliente Bittorrent
GenericName[pt_BR]=Cliente Bittorrent
GenericName[ro]=Client Bittorrent
GenericName[ru]=клиент Bittorrent
GenericName[sk]=Klient siete Bittorrent
GenericName[sr]=Bittorrent-клијент
GenericName[sv]=Bittorrent-klient
GenericName[tr]=Bittorrent istemcisi
GenericName[uk]=Bittorrent-клієнт
GenericName[zh]=Bittorrent之用户
GenericName[zh_TW]=Bittorrent客戶端
GenericName[lt]=BitTorrent klientas
GenericName[nl]=BitTorrent-cliënt
GenericName[pl]=Klient BitTorrent
GenericName[pt]=Cliente BitTorrent
GenericName[pt_BR]=Cliente BitTorrent
GenericName[ro]=Client BitTorrent
GenericName[ru]=клиент BitTorrent
GenericName[sk]=Klient siete BitTorrent
GenericName[sr]=BitTorrent-клијент
GenericName[sv]=BitTorrent-klient
GenericName[tr]=BitTorrent istemcisi
GenericName[uk]=BitTorrent-клієнт
GenericName[zh]=BitTorrent之用户
GenericName[zh_TW]=BitTorrent客戶端
Icon=qbittorrent
MimeType=application/x-bittorrent;
MimeType=application/x-bittorrent;x-scheme-handler/magnet;
Name=qBittorrent
Name[ko]=큐비토런트
Terminal=false

View File

@@ -47,7 +47,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleGetInfoString</key>
<string>2.6.4</string>
<string>2.6.9</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleExecutable</key>

View File

@@ -78,7 +78,8 @@ class about : public QDialog, private Ui::AboutDlg{
<li><u>Italian:</u> Matteo Sechi (bu17714@gmail.com)</li>\
<li><u>Japanese:</u> Nardog (alphisation@gmail.com)</li>\
<li><u>Korean:</u> Jin Woo Sin (jin828sin@users.sourceforge.net)</li>\
<li><u>Norwegian:</u> Lars-Erik Labori (hamil@users.sourceforge.net)</li>\
<li><u>Lithuanian:</u> Naglis Jonaitis (njonaitis@gmail.com)</li>\
<li><u>Norwegian:</u> Tomaso</li>\
<li><u>Polish:</u> Mariusz Fik (fisiu@opensuse.org)</li>\
<li><u>Portuguese:</u> Nick Marinho (nickmarinho@gmail.com)</li>\
<li><u>Romanian:</u> Obada Denis (obadadenis@users.sourceforge.net)</li>\

View File

@@ -38,7 +38,7 @@
#include "downloadthread.h"
#include "preferences.h"
#ifndef DISABLE_GUI
#include "rsssettings.h"
#include "rsssettings.h"
#endif
#include "qinisettings.h"
@@ -54,48 +54,52 @@ downloadThread::downloadThread(QObject* parent) : QObject(parent) {
void downloadThread::processDlFinished(QNetworkReply* reply) {
QString url = reply->url().toString();
qDebug("Download finished: %s", qPrintable(url));
// Check if the request was successful
if(reply->error() != QNetworkReply::NoError) {
// Failure
qDebug("Download failure (%s), reason: %s", qPrintable(url), qPrintable(errorCodeToString(reply->error())));
emit downloadFailure(url, errorCodeToString(reply->error()));
} else {
QVariant redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if(redirection.isValid()) {
// We should redirect
qDebug("Redirecting from %s to %s", qPrintable(url), qPrintable(redirection.toUrl().toString()));
m_redirectMapping.insert(redirection.toUrl().toString(), url);
downloadUrl(redirection.toUrl().toString());
return;
}
// Checking if it was redirecting, restoring initial URL
if(m_redirectMapping.contains(url)) {
url = m_redirectMapping.take(url);
}
// Success
QString filePath;
QTemporaryFile *tmpfile = new QTemporaryFile;
tmpfile->setAutoRemove(false);
if (tmpfile->open()) {
filePath = tmpfile->fileName();
qDebug("Temporary filename is: %s", qPrintable(filePath));
if(reply->open(QIODevice::ReadOnly)) {
// TODO: Support GZIP compression
tmpfile->write(reply->readAll());
reply->close();
tmpfile->close();
delete tmpfile;
// Send finished signal
emit downloadFinished(url, filePath);
} else {
// Error when reading the request
tmpfile->close();
delete tmpfile;
emit downloadFailure(url, tr("I/O Error"));
}
reply->deleteLater();
return;
}
// Check if the server ask us to redirect somewhere lese
const QVariant redirection = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if(redirection.isValid()) {
// We should redirect
qDebug("Redirecting from %s to %s", qPrintable(url), qPrintable(redirection.toUrl().toString()));
m_redirectMapping.insert(redirection.toUrl().toString(), url);
downloadUrl(redirection.toUrl().toString());
reply->deleteLater();
return;
}
// Checking if it was redirected, restoring initial URL
if(m_redirectMapping.contains(url)) {
url = m_redirectMapping.take(url);
}
// Success
QTemporaryFile *tmpfile = new QTemporaryFile;
tmpfile->setAutoRemove(false);
if (tmpfile->open()) {
QString filePath = tmpfile->fileName();
qDebug("Temporary filename is: %s", qPrintable(filePath));
if(reply->isOpen() || reply->open(QIODevice::ReadOnly)) {
// TODO: Support GZIP compression
tmpfile->write(reply->readAll());
tmpfile->close();
// XXX: For some reason, tmpfile has to be destroyed before
// the signal is sent or the file stays locked on Windows
// for some reason.
delete tmpfile;
// Send finished signal
emit downloadFinished(url, filePath);
} else {
delete tmpfile;
// Error when reading the request
emit downloadFailure(url, tr("I/O Error"));
}
} else {
delete tmpfile;
emit downloadFailure(url, tr("I/O Error"));
}
// Clean up
reply->deleteLater();
@@ -119,30 +123,24 @@ void downloadThread::loadCookies(const QString &host_name, QString url) {
}
#endif
void downloadThread::downloadTorrentUrl(QString url) {
#ifndef DISABLE_GUI
// Load cookies
QString host_name = QUrl::fromEncoded(url.toLocal8Bit()).host();
if(!host_name.isEmpty())
loadCookies(host_name, url);
#endif
void downloadThread::downloadTorrentUrl(const QString &url) {
// Process request
QNetworkReply *reply = downloadUrl(url);
connect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
}
QNetworkReply* downloadThread::downloadUrl(QString url){
QNetworkReply* downloadThread::downloadUrl(const QString &url){
// Update proxy settings
applyProxySettings();
#ifndef DISABLE_GUI
// Load cookies
QString host_name = QUrl::fromEncoded(url.toLocal8Bit()).host();
QString host_name = QUrl::fromEncoded(url.toUtf8()).host();
if(!host_name.isEmpty())
loadCookies(host_name, url);
#endif
// Process download request
qDebug("url is %s", qPrintable(url));
const QUrl qurl = QUrl::fromEncoded(url.toLocal8Bit());
const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
QNetworkRequest request(qurl);
// Spoof Firefox 3.5 user agent to avoid
// Web server banning
@@ -157,20 +155,22 @@ QNetworkReply* downloadThread::downloadUrl(QString url){
}
void downloadThread::checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal) {
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
if(!reply) return;
if(bytesTotal > 0) {
QNetworkReply *reply = static_cast<QNetworkReply*>(sender());
// Total number of bytes is available
if(bytesTotal > 1048576) {
// More than 1MB, this is probably not a torrent file, aborting...
reply->abort();
reply->deleteLater();
} else {
disconnect(reply, SIGNAL(downloadProgress(qint64,qint64)), this, SLOT(checkDownloadSize(qint64,qint64)));
}
} else {
if(bytesReceived > 1048576) {
// More than 1MB, this is probably not a torrent file, aborting...
QNetworkReply *reply = static_cast<QNetworkReply*>(sender());
reply->abort();
reply->deleteLater();
}
}
}
@@ -253,7 +253,7 @@ QString downloadThread::errorCodeToString(QNetworkReply::NetworkError status) {
}
#ifndef QT_NO_OPENSSL
void downloadThread::ignoreSslErrors(QNetworkReply* reply,QList<QSslError> errors) {
void downloadThread::ignoreSslErrors(QNetworkReply* reply, const QList<QSslError> &errors) {
Q_UNUSED(errors)
// Ignore all SSL errors
reply->ignoreSslErrors();

View File

@@ -43,19 +43,19 @@ class downloadThread : public QObject {
public:
downloadThread(QObject* parent = 0);
QNetworkReply* downloadUrl(QString url);
void downloadTorrentUrl(QString url);
QNetworkReply* downloadUrl(const QString &url);
void downloadTorrentUrl(const QString &url);
//void setProxy(QString IP, int port, QString username, QString password);
signals:
void downloadFinished(QString url, QString file_path);
void downloadFailure(QString url, QString reason);
void downloadFinished(const QString &url, const QString &file_path);
void downloadFailure(const QString &url, const QString &reason);
private slots:
void processDlFinished(QNetworkReply* reply);
void checkDownloadSize(qint64 bytesReceived, qint64 bytesTotal);
#ifndef QT_NO_OPENSSL
void ignoreSslErrors(QNetworkReply*,QList<QSslError>);
void ignoreSslErrors(QNetworkReply*,const QList<QSslError>&);
#endif
private:

View File

@@ -15,6 +15,7 @@
<file>lang/qbittorrent_fr.qm</file>
<file>lang/qbittorrent_uk.qm</file>
<file>lang/qbittorrent_zh.qm</file>
<file>lang/qbittorrent_lt.qm</file>
<file>lang/qbittorrent_ko.qm</file>
<file>lang/qbittorrent_nb.qm</file>
<file>lang/qbittorrent_sv.qm</file>
@@ -24,6 +25,7 @@
<file>lang/qbittorrent_pt_BR.qm</file>
<file>lang/qbittorrent_da.qm</file>
<file>lang/qbittorrent_cs.qm</file>
<file>lang/qbittorrent_hy.qm</file>
<file>lang/qbittorrent_pl.qm</file>
<file>lang/qbittorrent_bg.qm</file>
<file>lang/qbittorrent_ar.qm</file>
@@ -31,6 +33,5 @@
<file>lang/qbittorrent_en.qm</file>
<file>lang/qbittorrent_hr.qm</file>
<file>lang/qbittorrent_ro.qm</file>
<file>lang/qbittorrent_hy.qm</file>
</qresource>
</RCC>
</RCC>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More