You've already forked qBittorrent
							
							
				mirror of
				https://github.com/qbittorrent/qBittorrent
				synced 2025-10-30 23:30:54 +01:00 
			
		
		
		
	Compare commits
	
		
			54 Commits
		
	
	
		
			release-3.
			...
			release-3.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | bfd864efce | ||
|   | 573b0d921e | ||
|   | 758e357fc5 | ||
|   | 0b235dc968 | ||
|   | 8305d8ff64 | ||
|   | 534a94310d | ||
|   | 26e6787e85 | ||
|   | c659a180d2 | ||
|   | 632faf55be | ||
|   | 5c7bc46451 | ||
|   | 6932c960da | ||
|   | a4d9e65d38 | ||
|   | ab83c2fff5 | ||
|   | 106f5d7cc0 | ||
|   | 11943f6b88 | ||
|   | 665e0967a5 | ||
|   | 85b42fc3cf | ||
|   | 99e6d0010d | ||
|   | b294d89b4f | ||
|   | b78d1a82df | ||
|   | 96644c12ab | ||
|   | 45d10b1398 | ||
|   | ef328f83c5 | ||
|   | 6cf780f57c | ||
|   | 37b048f2ab | ||
|   | 260ed50f10 | ||
|   | 307b5b7091 | ||
|   | 1de9da89c1 | ||
|   | 5fadb0d53e | ||
|   | 49fa853dde | ||
|   | 7555380964 | ||
|   | 36d299f891 | ||
|   | 658cc53f85 | ||
|   | 08f4c0ed12 | ||
|   | 5917b33ec6 | ||
|   | 65ec3d0e0f | ||
|   | 61c0c439f1 | ||
|   | 4cbe3fd6f7 | ||
|   | 94df3f44d7 | ||
|   | 370effd0d3 | ||
|   | ff6e058dea | ||
|   | d3a6bcf7bf | ||
|   | c6a9a94331 | ||
|   | abdcaebc8e | ||
|   | c5a433a71e | ||
|   | 0a10b98975 | ||
|   | 506f933c48 | ||
|   | 1399a9c86a | ||
|   | 1fc916865c | ||
|   | 8790092a81 | ||
|   | 00f9180b81 | ||
|   | 0236b1bd6d | ||
|   | bb61b3c05f | ||
|   | 78469c8faa | 
| @@ -43,7 +43,7 @@ before_install: | ||||
|  | ||||
| install: | ||||
|   - if [[ "$lt_source" == "from_dist" ]]; then sudo apt-get -qq install libtorrent-rasterbar-dev; fi | ||||
|   - if [[ "$lt_source" == "from_svn" ]]; then cd .. && svn co svn://svn.code.sf.net/p/libtorrent/code/branches/RC_0_16 ./libtorrent && (cd libtorrent && ./autotool.sh && ./configure $ltconf && sudo make install) && sudo ldconfig /usr/local/lib && cd $TRAVIS_BUILD_DIR ; fi | ||||
|   - if [[ "$lt_source" == "from_svn" ]]; then cd .. && svn co http://libtorrent.googlecode.com/svn/branches/RC_0_16 ./libtorrent && (cd libtorrent && ./autotool.sh && ./configure $ltconf && sudo make install) && sudo ldconfig /usr/local/lib && cd $TRAVIS_BUILD_DIR ; fi | ||||
|  | ||||
| script: | ||||
|   - qt-qconf | ||||
|   | ||||
							
								
								
									
										40
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								Changelog
									
									
									
									
									
								
							| @@ -1,3 +1,43 @@ | ||||
| * Sat Mar 01 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.9 | ||||
|     - BUGFIX: Fix nox build. Closes #1368 (bob23450) | ||||
|     - BUGFIX: Fix build with libtorrent 0.15.x (sledgehammer999) | ||||
|     - BUGFIX: Fix missing percentage signs. Closes #1392. (sledgehammer999) | ||||
|     - BUGFIX: Fix queue sorting order. (alfrix) | ||||
|     - BUGFIX: Fix build using qt < 4.7 Closes #1385. (Evgeny Lensky) | ||||
|     - BUGFIX: Fix autoupdater. Send our user-agent to sourceforge.net (sledgehammer999) | ||||
|     - FEATURE: Add button for links in toolbar (alfrix) | ||||
|  | ||||
| * Sun Feb 02 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.8 | ||||
|     - BUGFIX: Really fix build of v3.1.6 | ||||
|  | ||||
| * Sun Feb 02 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.7 | ||||
|     - BUGFIX: Fix build of v3.1.6 | ||||
|  | ||||
| * Sun Feb 02 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.6 | ||||
|     - BUGFIX: Fix 'preview file' regression. Closes #1285. (sledgehammer999) | ||||
|     - BUGFIX: Fix peers and seeds sorting in transfer list. (Angel Alonso) | ||||
|     - BUGFIX: Fix btdigg search engine. (BTDigg research team) | ||||
|     - BUGFIX: Save statistics every 15min and only if there was new traffic. Fixes #1288 and partially #1272. (sledgehammer999) | ||||
|     - BUGFIX: Fix share ratio text in the 'general' tab. (sledgehammer999) | ||||
|     - BUGFIX: Output a more generic message when blocking IPs and don't use italics in the log. (sledgehammer999) | ||||
|     - BUGFIX: Allow 2 decimals when setting the share ratio. Closes #1303. (sledgehammer999) | ||||
|     - BUGFIX: Fix extratorrents search plugin. (sledgehammer999) | ||||
|     - BUGFIX: Use shorter names for amount columns in main UI (Gelmir) | ||||
|     - BUGFIX: Fix overstretched options dialog. Closes #1293. (sledgehammer999) | ||||
|     - BUGFIX: Don't show a popup menu when no torrent is selected. (sledgehammer999) | ||||
|     - BUGFIX: Launch external programs async and don't block. Closes #1252. (sledgehammer999) | ||||
|     - BUGFIX: Don't re-announce to trackers when torrent is paused. Closes #1310. (sledgehammer999) | ||||
|     - BUGFIX: Bring dialog boxes in the front when qbt doesn't have focus. (sledgehammer999) | ||||
|     - BUGFIX: Correctly resize 'name' column of the content tab. Closes #1360. (sledgehammer999) | ||||
|     - BUGFIX: Correctly restore 'name' column width when loading magnet links in the 'Add new torrent dialog'. Closes #1334. (sledgehammer999) | ||||
|     - WEBUI: Fix sorting by size in WebUI when non-default locale used. (Vladimir Golovnev) | ||||
|     - UI: Reposition statistics menu item. (sledgehammer999) | ||||
|     - UI: Convert more accurately decimal numbers to text. (sledgehammer999) | ||||
|     - WINDOWS/OSX: Improvements on the behavior of the program updater(closes #1282) (sledgehammer999) | ||||
|     - LINUX: Explicitle tell that we don't support freedesktop's startup notify standard. Fixes GNOME issues. Closes #1217. (sledgehammer999) | ||||
|     - LINUX: Add our WM_CLASS in the .desktop file so window managers know how to group our windows. (sledgehammer999) | ||||
|     - OTHER: Sync translations from Transifex. | ||||
|  | ||||
| * Thu 16 Jan 2014 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.1.5 | ||||
|     - BUGFIX: Fix compilation with Qt 4.7. Closes #1215. (sledgehammer999) | ||||
|     - BUGFIX: Third attempt at fixing saving settings on OS shutdown. (sledgehammer999) | ||||
|   | ||||
| @@ -8,6 +8,8 @@ MimeType=application/x-bittorrent;x-scheme-handler/magnet; | ||||
| Name=qBittorrent | ||||
| Terminal=false | ||||
| Type=Application | ||||
| StartupNotify=false | ||||
| StartupWMClass=qbittorrent | ||||
|  | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -40,12 +40,12 @@ | ||||
| #include "iconprovider.h" | ||||
| #include "fs_utils.h" | ||||
| #include "autoexpandabledialog.h" | ||||
| #include "messageboxraised.h" | ||||
|  | ||||
| #include <QString> | ||||
| #include <QFile> | ||||
| #include <QUrl> | ||||
| #include <QMenu> | ||||
| #include <QMessageBox> | ||||
| #include <QTimer> | ||||
| #include <QFileDialog> | ||||
| #include <libtorrent/version.hpp> | ||||
| @@ -104,9 +104,7 @@ void AddNewTorrentDialog::loadState() | ||||
| { | ||||
|   QIniSettings settings; | ||||
|   settings.beginGroup(QString::fromUtf8("AddNewTorrentDialog")); | ||||
|   QByteArray state = settings.value("treeHeaderState").toByteArray(); | ||||
|   if (!state.isEmpty()) | ||||
|     ui->content_tree->header()->restoreState(state); | ||||
|   m_headerState = settings.value("treeHeaderState").toByteArray(); | ||||
|   int width = settings.value("width", -1).toInt(); | ||||
|   if (width >= 0) { | ||||
|     QRect geo = geometry(); | ||||
| @@ -185,7 +183,7 @@ bool AddNewTorrentDialog::loadTorrent(const QString& torrent_path, const QString | ||||
|     m_filePath = torrent_path; | ||||
|  | ||||
|   if (!QFile::exists(m_filePath)) { | ||||
|     QMessageBox::critical(0, tr("I/O Error"), tr("The torrent file does not exist.")); | ||||
|     MessageBoxRaised::critical(0, tr("I/O Error"), tr("The torrent file does not exist.")); | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
| @@ -195,72 +193,18 @@ bool AddNewTorrentDialog::loadTorrent(const QString& torrent_path, const QString | ||||
|     m_torrentInfo = new torrent_info(m_filePath.toUtf8().data()); | ||||
|     m_hash = misc::toQString(m_torrentInfo->info_hash()); | ||||
|   } catch(const std::exception& e) { | ||||
|     QMessageBox::critical(0, tr("Invalid torrent"), tr("Failed to load the torrent: %1").arg(e.what())); | ||||
|     MessageBoxRaised::critical(0, tr("Invalid torrent"), tr("Failed to load the torrent: %1").arg(e.what())); | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   // Prevent showing the dialog if download is already present | ||||
|   if (QBtSession::instance()->getTorrentHandle(m_hash).is_valid()) { | ||||
|     QMessageBox::information(0, tr("Already in download list"), tr("Torrent is already in download list. Merging trackers."), QMessageBox::Ok); | ||||
|     MessageBoxRaised::information(0, tr("Already in download list"), tr("Torrent is already in download list. Merging trackers."), QMessageBox::Ok); | ||||
|     QBtSession::instance()->addTorrent(m_filePath, false, m_url);; | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   // Set dialog title | ||||
|   setWindowTitle(misc::toQStringU(m_torrentInfo->name())); | ||||
|  | ||||
|   // Set torrent information | ||||
|   QString comment = misc::toQString(m_torrentInfo->comment()); | ||||
|   ui->comment_lbl->setText(comment.replace('\n', ' ')); | ||||
|   ui->date_lbl->setText(m_torrentInfo->creation_date() ? misc::toQString(*m_torrentInfo->creation_date()) : tr("Not available")); | ||||
|   updateDiskSpaceLabel(); | ||||
|  | ||||
| #if LIBTORRENT_VERSION_NUM >= 1600 | ||||
|   file_storage fs = m_torrentInfo->files(); | ||||
| #endif | ||||
|  | ||||
|   // Populate m_filesList | ||||
|   for (int i = 0; i < m_torrentInfo->num_files(); ++i) { | ||||
| #if LIBTORRENT_VERSION_NUM >= 1600 | ||||
|     m_filesPath << misc::toQStringU(fs.file_path(m_torrentInfo->file_at(i))); | ||||
| #else | ||||
|     m_filesPath << misc::toQStringU(m_torrentInfo->file_at(i).path.string()); | ||||
| #endif | ||||
|   } | ||||
|  | ||||
|   // Prepare content tree | ||||
|   if (m_torrentInfo->num_files() > 1) { | ||||
|     m_contentModel = new TorrentContentFilterModel(this); | ||||
|     connect(m_contentModel->model(), SIGNAL(filteredFilesChanged()), SLOT(updateDiskSpaceLabel())); | ||||
|     ui->content_tree->setModel(m_contentModel); | ||||
|     ui->content_tree->hideColumn(PROGRESS); | ||||
|     m_contentDelegate = new PropListDelegate(); | ||||
|     ui->content_tree->setItemDelegate(m_contentDelegate); | ||||
|     connect(ui->content_tree, SIGNAL(clicked(const QModelIndex&)), ui->content_tree, SLOT(edit(const QModelIndex&))); | ||||
|     connect(ui->content_tree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContentTreeMenu(const QPoint&))); | ||||
|  | ||||
|     // List files in torrent | ||||
|     m_contentModel->model()->setupModelData(*m_torrentInfo); | ||||
|  | ||||
|     // Expand root folder | ||||
|     ui->content_tree->setExpanded(m_contentModel->index(0, 0), true); | ||||
|   } else { | ||||
|     // Update save paths (append file name to them) | ||||
| #if LIBTORRENT_VERSION_NUM >= 1600 | ||||
|     QString single_file_relpath = misc::toQStringU(fs.file_path(m_torrentInfo->file_at(0))); | ||||
| #else | ||||
|     QString single_file_relpath = misc::toQStringU(m_torrentInfo->file_at(0).path.string()); | ||||
| #endif | ||||
|     for (int i=0; i<ui->save_path_combo->count()-1; ++i) { | ||||
|       ui->save_path_combo->setItemText(i, fsutils::toDisplayPath(QDir(ui->save_path_combo->itemText(i)).absoluteFilePath(single_file_relpath))); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   QIniSettings settings; | ||||
|   showAdvancedSettings(settings.value("AddNewTorrentDialog/expanded").toBool()); | ||||
|   // Set dialog position | ||||
|   setdialogPosition(); | ||||
|  | ||||
|   setupTreeview(); | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| @@ -271,13 +215,13 @@ bool AddNewTorrentDialog::loadMagnet(const QString &magnet_uri) | ||||
|   m_url = magnet_uri; | ||||
|   m_hash = misc::magnetUriToHash(m_url); | ||||
|   if (m_hash.isEmpty()) { | ||||
|     QMessageBox::critical(0, tr("Invalid magnet link"), tr("This magnet link was not recognized")); | ||||
|     MessageBoxRaised::critical(0, tr("Invalid magnet link"), tr("This magnet link was not recognized")); | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   // Prevent showing the dialog if download is already present | ||||
|   if (QBtSession::instance()->getTorrentHandle(m_hash).is_valid()) { | ||||
|     QMessageBox::information(0, tr("Already in download list"), tr("Magnet link is already in download list. Merging trackers."), QMessageBox::Ok); | ||||
|     MessageBoxRaised::information(0, tr("Already in download list"), tr("Magnet link is already in download list. Merging trackers."), QMessageBox::Ok); | ||||
|     QBtSession::instance()->addMagnetUri(m_url, false); | ||||
|     return false; | ||||
|   } | ||||
| @@ -442,7 +386,7 @@ void AddNewTorrentDialog::renameSelectedFile() | ||||
|                                                       index.data().toString(), &ok).trimmed(); | ||||
|   if (ok && !new_name_last.isEmpty()) { | ||||
|     if (!fsutils::isValidFileSystemName(new_name_last)) { | ||||
|       QMessageBox::warning(this, tr("The file could not be renamed"), | ||||
|       MessageBoxRaised::warning(this, tr("The file could not be renamed"), | ||||
|                            tr("This file name contains forbidden characters, please choose a different one."), | ||||
|                            QMessageBox::Ok); | ||||
|       return; | ||||
| @@ -468,7 +412,7 @@ void AddNewTorrentDialog::renameSelectedFile() | ||||
|         if (i == file_index) continue; | ||||
|         if (fsutils::sameFileNames(m_filesPath.at(i), new_name)) { | ||||
|           // Display error message | ||||
|           QMessageBox::warning(this, tr("The file could not be renamed"), | ||||
|           MessageBoxRaised::warning(this, tr("The file could not be renamed"), | ||||
|                                tr("This name is already in use in this folder. Please use a different name."), | ||||
|                                QMessageBox::Ok); | ||||
|           return; | ||||
| @@ -503,7 +447,7 @@ void AddNewTorrentDialog::renameSelectedFile() | ||||
| #else | ||||
|         if (current_name.startsWith(new_path, Qt::CaseInsensitive)) { | ||||
| #endif | ||||
|           QMessageBox::warning(this, tr("The folder could not be renamed"), | ||||
|           MessageBoxRaised::warning(this, tr("The folder could not be renamed"), | ||||
|                                tr("This name is already in use in this folder. Please use a different name."), | ||||
|                                QMessageBox::Ok); | ||||
|           return; | ||||
| @@ -666,6 +610,23 @@ void AddNewTorrentDialog::updateMetadata(const QTorrentHandle &h) { | ||||
|     setMetadataProgressIndicator(true, tr("Parsing metadata...")); | ||||
|  | ||||
|     // Update UI | ||||
|     setupTreeview(); | ||||
|     setMetadataProgressIndicator(false, tr("Metadata retrieval complete")); | ||||
|   } catch (invalid_handle&) { | ||||
|     MessageBoxRaised::critical(0, tr("I/O Error"), ("Unknown error.")); | ||||
|     setMetadataProgressIndicator(false, tr("Unknown error")); | ||||
|     return; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void AddNewTorrentDialog::setMetadataProgressIndicator(bool visibleIndicator, const QString &labelText) { | ||||
|   // Always show info label when waiting for metadata | ||||
|   ui->lblMetaLoading->setVisible(true); | ||||
|   ui->lblMetaLoading->setText(labelText); | ||||
|   ui->progMetaLoading->setVisible(visibleIndicator); | ||||
| } | ||||
|  | ||||
| void AddNewTorrentDialog::setupTreeview() { | ||||
|   // Set dialog title | ||||
|   setWindowTitle(misc::toQStringU(m_torrentInfo->name())); | ||||
|  | ||||
| @@ -675,9 +636,7 @@ void AddNewTorrentDialog::updateMetadata(const QTorrentHandle &h) { | ||||
|   ui->date_lbl->setText(m_torrentInfo->creation_date() ? misc::toQString(*m_torrentInfo->creation_date()) : tr("Not available")); | ||||
|   updateDiskSpaceLabel(); | ||||
|  | ||||
| #if LIBTORRENT_VERSION_NUM >= 1600 | ||||
|   file_storage fs = m_torrentInfo->files(); | ||||
| #endif | ||||
|  | ||||
|   // Populate m_filesList | ||||
|     for (int i = 0; i < m_torrentInfo->num_files(); ++i) { | ||||
| @@ -689,7 +648,7 @@ void AddNewTorrentDialog::updateMetadata(const QTorrentHandle &h) { | ||||
|   } | ||||
|  | ||||
|   // Prepare content tree | ||||
|     if (m_torrentInfo->num_files() > 1) { | ||||
|   if (fs.num_files() > 1) { | ||||
|     m_contentModel = new TorrentContentFilterModel(this); | ||||
|     connect(m_contentModel->model(), SIGNAL(filteredFilesChanged()), SLOT(updateDiskSpaceLabel())); | ||||
|     ui->content_tree->setModel(m_contentModel); | ||||
| @@ -701,6 +660,8 @@ void AddNewTorrentDialog::updateMetadata(const QTorrentHandle &h) { | ||||
|  | ||||
|     // List files in torrent | ||||
|     m_contentModel->model()->setupModelData(*m_torrentInfo); | ||||
|     if (!m_headerState.isEmpty()) | ||||
|       ui->content_tree->header()->restoreState(m_headerState); | ||||
|  | ||||
|     // Expand root folder | ||||
|     ui->content_tree->setExpanded(m_contentModel->index(0, 0), true); | ||||
| @@ -720,17 +681,4 @@ void AddNewTorrentDialog::updateMetadata(const QTorrentHandle &h) { | ||||
|   showAdvancedSettings(settings.value("AddNewTorrentDialog/expanded").toBool()); | ||||
|   // Set dialog position | ||||
|   setdialogPosition(); | ||||
|     setMetadataProgressIndicator(false, tr("Metadata retrieval complete")); | ||||
|   } catch (invalid_handle&) { | ||||
|     QMessageBox::critical(0, tr("I/O Error"), ("Unknown error.")); | ||||
|     setMetadataProgressIndicator(false, tr("Unknown error")); | ||||
|     return; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void AddNewTorrentDialog::setMetadataProgressIndicator(bool visibleIndicator, const QString &labelText) { | ||||
|   // Always show info label when waiting for metadata | ||||
|   ui->lblMetaLoading->setVisible(true); | ||||
|   ui->lblMetaLoading->setText(labelText); | ||||
|   ui->progMetaLoading->setVisible(visibleIndicator); | ||||
| } | ||||
|   | ||||
| @@ -84,6 +84,7 @@ private: | ||||
|   void loadState(); | ||||
|   void saveState(); | ||||
|   void setMetadataProgressIndicator(bool visibleIndicator, const QString &labelText = QString()); | ||||
|   void setupTreeview(); | ||||
|  | ||||
| private: | ||||
|   Ui::AddNewTorrentDialog *ui; | ||||
| @@ -98,6 +99,7 @@ private: | ||||
|   QStringList m_filesPath; | ||||
|   bool m_hasRenamedFile; | ||||
|   QShortcut *editHotkey; | ||||
|   QByteArray m_headerState; | ||||
| }; | ||||
|  | ||||
| #endif // ADDNEWTORRENTDIALOG_H | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user