Merge branch 'master' into random-webseeding

random-webseeding
Tatsuhiro Tsujikawa 2015-10-03 17:59:39 +09:00
commit c81b132112
351 changed files with 4202 additions and 2691 deletions

36
.travis.yml Normal file
View File

@ -0,0 +1,36 @@
language: cpp
compiler:
- clang
- gcc
sudo: false
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.9
- libstdc++-4.9-dev
- autoconf
- automake
- autotools-dev
- autopoint
- libtool
- pkg-config
- libssl-dev
- libc-ares-dev
- libxml2-dev
- zlib1g-dev
- libsqlite3-dev
- libssh2-1-dev
- libcppunit-dev
before_install:
- $CC --version
- if [ "$CXX" = "g++" ]; then export CXX="g++-4.9" CC="gcc-4.9"; fi
- $CC --version
before_script:
- autoreconf -i
- automake
- autoconf
- ./configure
script:
- make check

View File

@ -26,9 +26,10 @@ RUN apt-get install -y make binutils autoconf automake autotools-dev libtool \
RUN curl -L -O https://gmplib.org/download/gmp/gmp-6.0.0a.tar.lz RUN curl -L -O https://gmplib.org/download/gmp/gmp-6.0.0a.tar.lz
RUN curl -L -O http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz RUN curl -L -O http://downloads.sourceforge.net/project/expat/expat/2.1.0/expat-2.1.0.tar.gz
RUN curl -L -O http://www.sqlite.org/2015/sqlite-autoconf-3080802.tar.gz RUN curl -L -O http://www.sqlite.org/2015/sqlite-autoconf-3080803.tar.gz
RUN curl -L -O http://zlib.net/zlib-1.2.8.tar.xz RUN curl -L -O http://zlib.net/zlib-1.2.8.tar.xz
RUN curl -L -O http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz RUN curl -L -O http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
RUN curl -L -O http://libssh2.org/download/libssh2-1.5.0.tar.gz
RUN tar xf gmp-6.0.0a.tar.lz RUN tar xf gmp-6.0.0a.tar.lz
RUN cd gmp-6.0.0 && \ RUN cd gmp-6.0.0 && \
@ -52,8 +53,8 @@ RUN cd expat-2.1.0 && \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` && \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` && \
make install make install
RUN tar xf sqlite-autoconf-3080700.tar.gz RUN tar xf sqlite-autoconf-3080803.tar.gz
RUN cd sqlite-autoconf-3080700 && \ RUN cd sqlite-autoconf-3080803 && \
./configure \ ./configure \
--disable-shared \ --disable-shared \
--enable-static \ --enable-static \
@ -88,6 +89,19 @@ RUN cd c-ares-1.10.0 && \
LIBS="-lws2_32" && \ LIBS="-lws2_32" && \
make install make install
RUN tar xf libssh2-1.5.0.tar.gz
RUN cd libssh2-1.5.0 && \
./configure \
--disable-shared \
--enable-static \
--prefix=/usr/local/$HOST \
--host=$HOST \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--without-openssl \
--with-wincng \
LIBS="-lws2_32" && \
make install
RUN git clone https://github.com/tatsuhiro-t/aria2 RUN git clone https://github.com/tatsuhiro-t/aria2
RUN cd aria2 && autoreconf -i && ./mingw-config && make && \ RUN cd aria2 && autoreconf -i && ./mingw-config && make && \
$HOST-strip src/aria2c.exe $HOST-strip src/aria2c.exe

101
Dockerfile.raspberrypi Normal file
View File

@ -0,0 +1,101 @@
FROM ubuntu:trusty
MAINTAINER Igor Khomyakov
RUN apt-get update && \
apt-get install -y make binutils autoconf automake autotools-dev libtool \
pkg-config git curl dpkg-dev autopoint libcppunit-dev libxml2-dev \
libgcrypt11-dev lzip
RUN git clone https://github.com/raspberrypi/tools.git --depth=1 /tools
ENV ARCH armhf
ENV HOST arm-linux-gnueabihf
ENV LOCAL_DIR /local
ENV TOOL_BIN_DIR /tools/arm-bcm2708/gcc-linaro-$HOST-raspbian-x64/bin
ENV PATH ${TOOL_BIN_DIR}:$PATH
RUN mkdir $LOCAL_DIR && mkdir zlib && cd zlib && \
curl -Ls -o - 'http://prdownloads.sourceforge.net/libpng/zlib-1.2.8.tar.gz?download' | \
tar xzf - --strip-components=1 && \
prefix=${LOCAL_DIR} \
CC=$HOST-gcc \
STRIP=$HOST-strip \
RANLIB=$HOST-ranlib \
AR=$HOST-ar \
LD=$HOST-ld \
./configure --static \
--libdir=$LOCAL_DIR/lib && \
make -s && \
make -s install
RUN mkdir -p expat && cd expat && \
curl -Ls -o - 'http://sourceforge.net/projects/expat/files/latest/download' | \
tar xzf - --strip-components=1 && \
./configure \
--host=$HOST \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--enable-shared=no \
--enable-static=yes \
--prefix=${LOCAL_DIR} && \
make -s && \
make -s install
RUN mkdir c-ares && cd c-ares && \
curl -Ls -o - http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz | \
tar xzf - --strip-components=1 && \
./configure \
--host=$HOST \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--enable-shared=no \
--enable-static=yes \
--prefix=${LOCAL_DIR} && \
make -s && \
make -s install
RUN mkdir gmp && cd gmp && \
curl -Ls -o - 'https://gmplib.org/download/gmp/gmp-6.0.0a.tar.lz' | \
lzip -d | tar xf - --strip-components=1 && \
./configure \
--disable-shared \
--enable-static \
--prefix=$LOCAL_DIR \
--host=$HOST \
--disable-cxx \
--enable-fat && \
make -s && \
make -s install
RUN mkdir sqlite && cd sqlite && \
curl -Ls -o - https://www.sqlite.org/2015/sqlite-autoconf-3080900.tar.gz | \
tar xzf - --strip-components=1 && \
./configure \
--disable-shared \
--enable-static \
--prefix=$LOCAL_DIR \
--host=$HOST \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` && \
make -s && \
make -s install
RUN mkdir aria && cd aria && \
curl -Ls -o - http://sourceforge.net/projects/aria2/files/latest/download | \
tar xjf - --strip-components=1 && \
./configure \
--host=$HOST \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--disable-nls \
--disable-ssl \
--without-gnutls \
--without-libxml2 \
--with-libz --with-libz-prefix=${LOCAL_DIR} \
--with-libexpat --with-libexpat-prefix=${LOCAL_DIR} \
--with-slite3 --with-sqlite3-prefix=${LOCAL_DIR} \
--with-libcares --with-libcares-prefix=${LOCAL_DIR} \
--prefix=${LOCAL_DIR} \
LDFLAGS="-L$LOCAL_DIR/lib" \
PKG_CONFIG_PATH="$LOCAL_DIR/lib/pkgconfig" \
ARIA2_STATIC=yes && \
make -s && \
make -s install-strip

View File

@ -10,6 +10,7 @@ EXTRA_DIST = config.rpath \
android-config android-make \ android-config android-make \
makerelease-osx.mk osx-package/DS_Store osx-package/etc/paths.d/aria2c osx-package/etc/manpaths.d/aria2 \ makerelease-osx.mk osx-package/DS_Store osx-package/etc/paths.d/aria2c osx-package/etc/manpaths.d/aria2 \
Dockerfile.mingw \ Dockerfile.mingw \
Dockerfile.raspberrypi \
examples/libaria2ex.cc examples/libaria2wx.cc examples/libaria2ex.cc examples/libaria2wx.cc
dist_doc_DATA = README README.rst README.html dist_doc_DATA = README README.rst README.html

748
NEWS
View File

@ -1,716 +1,170 @@
aria2 1.18.9 aria2 1.19.1
============ ============
Release Note Release Note
------------ ------------
This releases fixes memory leak with OpenSSL and crash on OSX when This release fixes TLS handshake error with servers which only support
proxy is used. We added several new features. Adler32 checksum is RSA-SHA1 signature algorithm. We removed RSA-SHA1 for enchanced
now available in --checksum option and hash element in Metalink files. security, but many users reported there were servers which could not
We added --bt-detach-seed-only option, which excludes seed-only talk aria2 1.19.0, so added it again for compatibility reasons. For
downloads when counting concurrent active downloads (-j option). We Windows build, we fixed potential infinite loop bug when TLS is used.
disabled SSLv3 by default. If you ever want to enable it or further
tune the TLS protocols to enable, use new --min-tls-version option. We changed the location where dht.dat and aria2.conf are looked up.
--bt-force-encryption option was added to make requiring BitTorrent The aria2 manual page described details. Basically we now follow XDG
full encryption easier. From this release, we build Android binary specification (http://standards.freedesktop.org/basedir-spec/latest/).
using API level 16. For dht.dat, the default location is $XDG_CACHE_HOME/aria2/ directory.
For aria2.conf, the default location is $XDG_CONFIG_HOME/aria2/
directory. To keep the current user configuration working, if aria2
detects dht.dat under $HOME/.aria2/ directory, it is used instead.
Similarly, if aria2.conf exists under $HOME/.aria2/ directory, it is
used instead.
Previously, we return 500 HTTP status if RPC method execution
encountered error. Now it returns with 400 HTTP status with error
code. This is more natural because server processed request and found
an error, and returned error reply correctly. This is not something
server crashed or something. Also, there is RPC libraries which
throws exception if it sees 5XX status code, where 400 is better
because we can examine the error.
Changes Changes
------- -------
* Support HTTP date ending "+0000" as well as "GMT". * Update README.android
Closes GH-330 Providing some workarounds about CA certificates and standard output
* Revise getRandom facilities Patch from amtlib-dot-dll
Use one of the following to provide random bytes: * Return 400 HTTP status code if exception was caught while executing
- Windows CryptGenRandom RPC method
- Linux getrandom (syscall interface to urandom, without nasty
corner cases such as file descriptor exhaustion or re-linked
/dev/urandom)
- std::device_random (C++ random device, which usually will be
urandom)
This also equalizes util::getRandom and SimpleRandomizer (the former Previously, we returned 500 HTTP status code. I think the found in
will now use the latter) instead of having essentially two different RPC level, not in HTTP protocol, so 500 is not appropriate.
PRNG interfaces with potentially different quality.
Closes GH-320 * WinTLS: Fix potential infinite loop
* Added debug log of all Metalink URLs with final priorities * Fix on-download-error is executed even if download succeeded
Patch from Dan Fandrich * Update Dockerfile.mingw
* Use gcc-4.9 and android-16 API level for android build Patch from Adam Baxter
* Add --bt-force-encryption option * Increase --select-file upper bound to 1m for torrent containing lots
of files
This option requires BitTorrent message payload encryption with * Fix busy loop with --dry-run and 4xx response for URI listed in
arc4. This is a shorthand of --bt-requre-crypto metalink
--bt-min-crypto-level=arc4. If true is given, deny legacy
BitTorrent handshake and only use Obfuscation handshake and always
encrypt message payload. This option defaults to false.
* TLS: Fix memory leak with OpenSSL See GH-430
Based on the patch submitted by midnight2k * Update sqlite in OSX build to 3.8.10.2
* Warn about insecure SSL connections. * Make LibuvEventPoll compatible with the latest libuv again
Fixed GH-313 * gnutls: Allow SIGN-RSA-SHA1 for compatibility reason
* Add --min-tls-version option * Make script compatible with both Python 2 and 3
The --min-tls-version option specifies minimum SSL/TLS version to Patch from Vasilij Schneidermann
enable. Possible Values: SSLv3, TLSv1, TLSv1.1, TLSv1.2 Default:
TLSv1
* LibsslTLSContext: Disable SSLv3 and enable ECDHE cipher suites * Make config and cache files conform to XDG
* Add Dockerfile.mingw See http://standards.freedesktop.org/basedir-spec/latest/ for
further details. This implementation decides the default based on
whether a file exists at the legacy location, if it doesn't, it
picks the XDG-conforming location instead.
Dockerfile.mingw builds aria2 Windows binary. It is probably the Patch from Vasilij Schneidermann
easiest way to build the Windows binary.
* Fix crash when JSON batch response vector is empty * ftp, sftp: Fix heap-after-free bug on exception
* Fix doc: Wrong rpc secret token prefix * ftp: Fix timeout when reusing FTP connection
* Add --bt-detach-seed-only option * Various MinGW-w64 build improvements
This option excludes seed only downloads when counting concurrent - Fix detection of localtime_r and asctime_r on MinGW-w64
active downloads (-j option). This means that if -j3 is given and - Fix linking with libintl on MinGW-w64
this option is turned on and 3 downloads are active and one of those
enters seed mode, then it is excluded from active download count
(thus it becomes 2), and the next download waiting in queue gets
started. But be aware that seeding item is still recognized as
active download in RPC method.
* mingw: Use MoveFileExW for better atomic move
* Work around libintl's vprintf macro messing with OutputFile::vprintf
Patch from David Macek Patch from David Macek
* Fix crash on OSX when proxy is used
See GH-275
* Support Adler32 checksum
Adler32 checksum is available for --checksum option and hash element
in Metalink files. Currently, we use Adler32 implementation in
Zlib.
aria2 1.18.8 aria2 1.19.0
============ ============
Release Note Release Note
------------ ------------
This releases fixes the bug that aria2 cannot read piped stdin on This releases adds SFTP support, and fixes several bugs. SFTP support
mingw32. It also fixes busy loop on mingw32 when SSL/TLS is used. We has been implemented using libssh2. We added several new options.
also fixed 2 crashes which can occur on all platforms. --multiple-interface option is like --interface option, but can take
several interfaces. They are used in round-robin manner, and it works
like link aggregation. Previously, .netrc search path is fixed under
$HOME directory, and cannot be changed. In this release, --netrc-path
option has been added to override the search path. The runtime bug
concerning getrandom has been fixed in this release. Previously if
download failed because checksum error, aria2 exited with error code 1
(unknown error). Now it exits with dedicated error code 32. We fixed
long outstanding bug that aria2 crashes when downloading multi-file
torrent.
Changes Changes
------- -------
* WinTLS: Fix abrupt connection closing and closing in general. * android: Build and link with zlib
Fixes GH-277 Previously, we linked with zlib shipped with NDK, but it seems this
is not part of NDK API, and thus could break our app.
* LibsslTLSSession: Treat 0 from readData as EOF * Allow netrc-path to be specified in the config file
* Enable dynamicbase and nxcompat in Windows binaries Adds --netrc-path to override default .netrc search path. Patch
from Ryan Steinmetz
* Fix crash in OpenedFileCounter::ensureMaxOpenFileLimit() * Exit with 32 status code if checksum verification failed
The crash happens if PieceStorage and/or DiskAdaptor are not * Add SFTP support using libssh2
initialized in one of active RequestGroups.
* mingw32: Fix bug that aria2 does not read piped stdin aria2 can now download files via sftp protocol: aria2c sftp://....
--ssh-host-key-md option is added to specify expected server's
fingerprint.
* Fix std::length_error when no_proxy is used * Added Dockerfile to cross complile aria2 for RaspberryPI (armhf)
This is regression introduced in 8cada497. Patch from Igor Khomyakov
* Try to set sane limits for RLIMIT_NO_FILE * multiple interface support for link aggregation
E.g. on OSX the default is 256, which isn't exactly compatible with Adds --multiple-interface option. Patch from Sarim Khan
torrent downloads.
Closes GH-257 * Run on-bt-download-complete command when -V reports download finished
* Delay auth failures instead of PBKDF2 Fixes GH-355
Closes GH-256 * Use dedicated DiskWriter in MultiDiskFileAllocationIterator
We have to use dedicated DiskWriter instead of
(*entryItr_)->getDiskWriter(). This is because
SingleFileAllocationIterator cannot reopen file if file is closed by
OpenedFileCounter. Fixes GH-350
aria2 1.18.7 * Fix getrandom for system with libc not including errno or systems
============
Release Note not supporting ENOSYS in the first place. Fixes GH-347
------------
This release fixes regression which makes 100% CPU utilization in * Don't send back rpc-secret option value in aria2.getGlobalOption RPC
multi-file torrent download with -V option. It also fixes build error method
on big endian platforms.
Changes * Make libuv default off
-------
* Fixed segfault unsupported encodings See GH-241 for discussion
Patch from diadistis * Fixed slow RPC response
* Fix regression 100% CPU utility when -V is used and download is Fxies GH-345
multi-file bittorrent downloads.
This is regression of a3426821c8a7f9cf8d80a81726157d4eb844f661 * Fix getrandom interface detection
* Fix compile error on big endian platform Fixes GH-346
aria2 1.18.6
============
Release Note
------------
This release fixes several bugs reported in github issues and adds a
feature to make RPC authentication more resilient to certain attacks.
New option --pause-metadata is added. The explanation is a bit log,
so check the changelog and manual. The session is now only saved if
there are changes from the last saved state.
From this release, MinGW32 build uses Windows native TLS
implementation and no longer use OpenSSL library.
Changes
-------
* Disard cache when checking checksum
This will slow down checksum checking but does not thrash cache.
* Compat with libuv 0.11 (Unstable)
Fixes #241
* Drop WinMessageDigestImpl.
The algorithms the `CryptProv` on Windows supports does not
currently include SHA-224, so there is a "dark spot" in this
implementation. Also on Win XP < SP3, most of the SHA-2 family is
not actually supported. All other implementation provide support
for MD5, SHA-1 and all of the SHA-2 family, hence drop the
incomplete WinMessageDigest implementation in favor of any other
supported implementation (at least the internal implementation is
always available at compile-time).
* Add --pause-metadata option
This option pauses downloads created as a result of metadata
download. There are 3 types of metadata downloads in aria2: (1)
downloading .torrent file. (2) downloading torrent metadata using
magnet link. (3) downloading metalink file. These metadata
downloads will generate downloads using their metadata. This option
pauses these subsequent downloads.
* Improve compiler/platform/libs information in logs
Add and use usedCompilerAndPlatform(). This adds compiler
information to INFO logs and the --version output, and may be
helpful when trying to diagnose/reproduce user-reported problems.
Also make INFO logs include usedLibs() output.
Closes #235
* Fix use-after-free on exit with multi-file torrent download + DHT
DefaultPieceStorage may be referenced by one of DHT task (e.g.,
DHTPeerLookupTask), after RequestGroup was deleted, and even after
RequestGroupMan was deleted. DefaultPieceStorage has a reference to
MultiDiskAdaptor which calls RequestGroupMan object on destruction.
So when DHT task is destroyed, DefaultPieceStorage is destroyed,
which in turn destroys MultiDiskAdaptor. DHT task is destroyed
after RequestGroupMan was destroyed, MultiDiskAdaptor will use now
freed RequestGroupMan object, this is use-after-free.
* Fix bug that zero length file is not opened when flushing cache
This bug was only seen when MultiDiskAdaptor was used.
* Support PREF_DIR change for Metalink files
Reworked previous commit adeead6f0396e2f8551d1182972e277728fd6c8b,
and now support changing PREF_DIR for Metalink downloads.
* Fix assertion failure when dir option of paused HTTP/FTP download is
changed
When the directory is changed via aria2.changeOption RPC method, we
directly change first FileEntry's path using FileEntry::setPath().
If there is no PREF_OUT option is given, basically file name is
unknown, so we just set empty string and let the next run determine
the correct file name and new directory is applied there. But
previous code does not reset length property of FileEntry, so the
unexpected code path is taken when unpaused and its path expects
path is not empty string. This commit fixes this issue by setting
length to 0 using FileEntry::setLength().
* Save session only when there is change since the last serialization
This is a slight optimization not to cause useless disk access.
This only applies to saving session automatically (see
--save-session-interval). aria2.saveSession and serialization at
the end of the session are always performed as before.
When serialization, we first check that whether there is any change
since the last serialization. To do this, we first calculate hash
value of serialized content without writing into file. Then compare
this value to the value of last serialization. If they do not
match, perform serialization.
* Fix (unknown length) downloads larger than 2GiB
Closes #215
* Fix F_PREALLOC based allocation on some OSX versions
* Use index.html as filename for conditional-get when file is missing
in URI
Previously we disabled conditional-get if file part is missing in
URI. But we use constant string "index.html" in this case, so we
can do the same to determine the modification time. In this patch,
if we have file part in URI, we are not going to set absolute file
path in FileEntry, since it prevents content-disposition from
working.
* Always add README.html to dist_doc_DATA
rst2html is required to produce README.html from README.rst. We
include generated README.html to distribution. And rst2html is not
required when compiling sources in distribution and always
README.html is available.
* Validate token using PBKDF2-HMAC-SHA1.
This change should make token validation more resilient to:
- timing attacks (constant time array compare)
- brute-force/dictionary attacks (PBKDF2)
Closes #220
* Add --disable-websocket configure option
* mingw32: Enable wintls and compile with GMP
By enabling wintls, we can use Windows certificate store to validate
server's certificate. Previously, we built windows build using
openssl and since we don't bundle CA certificates, aria2 fails to
validate server's certificate unless user setups their CA
certificates. GMP provides fast big integer calculations, whic is
used in BitTorrent encryption.
* AppleTLS: Enable BEAST mitigations in ST
Only available in 10.9+, but since we might be building on a
previous version but running on 10.9+, always try to set the option.
* WinTLS: Accept chains with no revocation information.
This is kind what browser do anyway (IE, Firefox, Chrome tested),
what AppleTLS does, what GnuTLS does and what OpenSSL
does. Actually, most browsers will also be OK with the CRL/OCSP
provider being offline. WinTLS will still fail in that case.
Should revocation information be available in the trust chain (CRL
or OCSP) the certificate still will be checked!
"Real" CAs, aka. those provided by the OS or system CA bundle,
usually provide revocation information and are thus still checked.
It should be mostly (only?) custom (organization) CAs that lack
revocation information, but those users might want to use aria2 in
their intranets and VPNs anyway ;)
See #217
* Fix GnuTLS 2.x compatiblity
Closes GH-216
* AppleTLS: Use newer, non-deprecated API in 10.8+
aria2 1.18.5
============
Release Note
------------
This release fixes BitTorrent download failure on Mingw build.
Changes
-------
* Ignore error when setting DSCP value
Setting DSCP is additional feature and failure to enable it should
not abort download entirely. This change fixes the bug that windows
build does not perform bittorrent downloads.
aria2 1.18.4
============
Release Note
------------
This release adds new RPC authorization mechanism using --rpc-secret
option. The existing --rpc-user and --rpc-passwd options are now
deprecated, and all applications using RPC API is strongly encouraged
to migrate to the new mechanism. See RPC INTERFACE section in aria2
manual page for the details. The new RPC method, aria2.saveSession,
was added, which tells aria2 server to save session file immediately.
There are several enhancements and bug fixes. See the changes for the
details.
Changes
-------
* Added support for RPC channel encryption in aria2rpc
Patch from David Macek
* Add aria2.saveSession RPC method
This method saves the current session to a file specified by
--save-session option. This method returns "OK" if it succeeds.
* Add numStoppedTotal key to aria2.getGlobalStat() RPC method response
It shows the number of stopped downloads in the current session and
not capped by --max-download-result option. On the other hand, the
existing numStopped key also shows the number of stopped downloads,
but it is capped by --max-download-result option.
* Better handling of 30x HTTP status codes
Reference: http://greenbytes.de/tech/tc/httpredirects/
* Implement new RPC authorization using --rpc-secret option
Add future deprecation warning to --rpc-user and --rpc-passwd. Warn
if neither --rpc-secret nor a combination of --rpc-user/rpc-passwd
is set.
* Add --enable-color option to enable/disable terminal color output
* Add DSCP support
* gnutls: Don't fail handshake if returned error is not fatal
* Add workaround GnuTLS bug with OCSP status extension and
non-blocking socket
GnuTLS version 3.1.3 - 3.1.18 and 3.2.0 - 3.2.8, inclusive, has this
bug. For these versions, we disable OCSP status extension.
* Make GnuTLS log level dependent on the aria2 ones
aria2 1.18.3
============
Release Note
------------
This release fixes the bug which may cause assertion failure after
multi-file downloads (e.g., multi-file metalink or torrent) are
performed several times due to the bad handling of --bt-max-open-files
option.
Changes
-------
* Fix crash if unpause failed before assigning BtProgressInfoFile
object
* Enable and check PIE in makerelease-osx
* Fix bug that numOpenFile_ is not reduced when MultiDiskAdaptor is
deleted
This bug caused assertion error in
RequestGroupMan::ensureMaxOpenFileLimit
aria2 1.18.2
============
Release Note
------------
This release fixes the wrong handling of return value of fork(), which
leads to high CPU usage. The progress readout has some color output.
Mingw32 build now receives colorized output. Mingw32 build now can
read unicode command-line arguments. The build script of OSX was
rewritten. The --bt-max-open-files now limits the number of opened
file globally for multi-file downloads instead of per download basis.
Changes
-------
* Remove the outdated, broken build_osx_release.sh
* Initial revision of the a new OSX release Makefile
* Allow using libgmp with AppleTLS/WinTLS
* Fix crash when metaurl contains unsupported URI or text
* Fix bad fork() return value handling
* Use some colors in progress reports (where available)
* Implement basic color support for the Windows console
Only \033[*m (SGR) is supported, with a 16+16 color terminal.
* AppleTLS: Implement PKCS12 loading.
* Limit number of opened file globally with --bt-max-open-files option
This change changes the behavior of --bt-max-open-files. Previously,
it specifies the maximum number of opened files for each multi-file
download. Since it is more useful to limit the number globally, the
option now specifies the global limit. This change suggests that
aria2.changeOption() method now ignores --bt-max-open-files and
aria2.changeGlobalOption now reads it and dynamically change the
limit.
* Don't fail multiple concurrent dl same file if auto-file-renaming is
enabled
* mingw32: Use CommandLineToArgvW() and GetCommandLineW() to read
cmd-line args
This change enables aria2 to read unicode characters in
command-line.
aria2 1.18.1
============
Release Note
------------
This release fixes the percent-encoding bug which affects file name
encodings. It adds PKCS12 support in certificate import. It also adds
experimental internal implementation of message digest functions, ARC4
cipher and bignum. It means that no external libraries are required to
build BitTorrent support, but this feature is still marked as
experimental. This release also fixes the android build with NDK r9.
Changes
-------
* LibsslTLSContext: Remove weak cipher suite
* AppleTLS: Enable --certificate
* util::percentEncodeMini: Fix regression bug removed unsignedness
srange-based for around std::string is convenient but several
functions depend unsigned char for correctness and readability.
* Log exception; throw error if loading private key and/or certificate
failed
* Provide internal ARC4 implementation
Now you can build bittorrent support without without external
libraries, meaning you can skip libnettle, libgmp, libgcrypt, GnuTLS
and OpenSSL on OSX (for now).
* Internal implementation of DHKeyExchange
Reusing a bignum (well, unsigned very-long) implementation I had
lying around for years and just cleaned up a bit and brought to
C++11 land.
It might not be the most performant implementation, but it shoud be
fast enough for our purposes and will go a long way of removing
gcrypt, nettle, gmp, openssl dependencies when using AppleTLS and
WinTLS (upcoming).
* PKCS12 support in --certificate and --rpc-certificate options.
* Add --disable-ssl configure option
* Add internal md5 and sha1 message digests
* Fix AppleMessageDigestImpl use with large data
* Set old cookie's creation-time to new cookie on replacement
As described in http://tools.ietf.org/html/rfc6265#section-5.3
* Fix link error with Android NDK r9
Since Android ndk r9, __set_errno is deprecated. It is now defined
as inline function in errno.h. The syscall assembly calls
__set_errno, but since libc.so does not export it, the link
fails. To workaround this, replace all occurrences of __set_errno
with a2_set_errno and define it as normal C function.
aria2 1.18.0
============
Release Note
------------
This release changes the default disk cache size to 16 MiB. To change
the default size, --with-disk-cache configure option was added. Now
used URIs are also saved by --save-session option. The control file is
now always saved if --force-save is given. The ctrl-c handling on
Mingw build was improved. The internal intl library is no longer
supplied. From this release, C++11 compiler is required to build aria2
executable. For gcc, at least 4.6.3 is required.
Changes
-------
* Use AM subdir-objects
Doing so in AM_INIT_AUTOMAKE seems to be the most compatible way of
doing so.
Closes GH-120
* AM_SILENT_RULES([yes]) with backwards-compatiblity
Supported since automake-1.11. There is no point in having the very
verbose compile stuff running about, which cannot even silenced
properly with `make -s` by default. Otherwise, `make V=1` or
`--disable-silent-rules` are your friends
* Fix automake-1.14 am_aux_dir
AC_USE_SYSTEM_EXTENSIONS will cause AC_PROG_CC, which is overridden
by automake-1.14, which will then init (part) of automake, in
particular am_aux_dir expansion, which in turn relies on ac_aux-dir,
which is not initialized at this point, and thus: certain doom (or
fun, depending on your POV and mood :p)
Hence call AC_USE_SYSTEM_EXTENSIONS only after
AM_INIT_AUTOMAKE. This, of course, caused a lot of related macro
shuffling.
Tested against automake-1.10 (OSX Lion/XCode version) and
automake-1.14 (homebrew version)
* Require external gettext for --enable-nls
And stop using the internal flavor with ./intl
* Make AX_CXX_COMPILE_STDCXX_11 test for -stdlib=libc++ via std::shared_ptr
The clang shipped with OSX XCode and clangs not build enabling
libcpp, will default to the libstdc++ headers and lib installed on
the system. In the OSX case, that libstdc++ is the one bundles with
gcc-4.2, which is far too old to provide all required C++11 types,
such as std::shared_ptr. Hence, the C++11 check should try to
compile a program with a C++11 type and try -stdlib=libc++ if the
default lib fails to compile said program.
* Make the configure check for C++11 compiler mandatory
Remove stray "dnl", so that mandatory actually works with (my)
autoreconf.
* Always build doc/manual-src
Should sphinx-build be not available AND the man file not be prsent,
then just "touch" it into existence (and warn about that)
* Win: Use SetConsoleCtrlHandler for SIGINT/SIGTERM
* Implement a simple resource lock (threading)
In this initial implementation Locks are no-ops on platforms other
than Windows.
* Check for sphinx-build during configure
* Add --with-disk-cache configure option
Enables packagers more fine grained control over the default value
without having to mess with config files.
See GH-115
* Change defaults: Enable 16M disk cache by default.
* Always save control file if --force-save is given
* Set log level DEBUG for unittests
* Check that C++ compiler supports override keyword
If the compiler supports override, define CXX11_OVERRIDE as
override, otherwise define it as empty. Use CXX11_OVERRIDE instead
of override.
* AppleTLS: Fix MessageDigestImpl
* AppleTLS: Fix session CFRelease stuff
* Use AX_CXX_COMPILE_STDCXX_11 macro to detect C++0x/C++11 support in
compiler
* Require -std=c++11 and use std::shared_ptr instead of SharedHandle
* Join URI on redirect
* Send HAVE message to the peer which the piece is downloaded from
Historically, aria2 did not send HAVE message to the peer which the
piece is coming from, thinking it is obvious that the peer knows we
have the piece. But it is not obvious if one piece is download from
more than 1 peers (e.g., end game mode). So it is better to send
HAVE to all peers connected.
* Improvements to --follow-torrent=false documentation.
Patch from gt
* SessionSerializer: Truly unique URIs
Before, only spent uris where sanitized not to be contained within
remaining uris. Change this so that each uri in the
union(remaining,spent) get saved once at most. The order of the
uris will won't be changed, with remaining uris going first followed
by spent uris.
Also avoid copying the uri std::strings around during dupe checking,
usually resulting in better performance regarding CPU and space.
* Make getOption RPC method return option for stopped downloads
* SessionSerializer: Save spent URIs as well as remaining ones

View File

@ -38,13 +38,14 @@ See `the online manual
Notes Notes
----- -----
aria2c executable was generated using android-ndk-r10b. aria2c executable was generated using android-ndk-r10d.
The following libraries were statically linked. The following libraries were statically linked.
* openssl 1.0.2 * openssl 1.0.2d
* expat 2.1.0 * expat 2.1.0
* c-ares 1.10.0 * c-ares 1.10.0
* libssh2 1.6.0
Since Android does not have ``/etc/resolv.conf``, c-ares (asynchronous Since Android does not have ``/etc/resolv.conf``, c-ares (asynchronous
DNS resolver) is disabled by default. But name resolution is sometimes DNS resolver) is disabled by default. But name resolution is sometimes
@ -54,11 +55,19 @@ using ``--async-dns`` and specify DNS servers using
--async-dns --async-dns-server=`getprop net.dns1`,`getprop net.dns2` --async-dns --async-dns-server=`getprop net.dns1`,`getprop net.dns2`
Additionally, the CA certificates shipped with Android don't locate in
the same place as those of normal Unix-like systems do, so this
workaround might be useful to securely download files via HTTPS::
cat /etc/security/cacerts/* | aria2c --ca-certificate=/proc/self/fd/0 $@
Because it is tedious to type these long parameters every time you use Because it is tedious to type these long parameters every time you use
aria2c, the following wrapper shell script would be handy:: aria2c, the following wrapper shell script would be handy::
#!/system/bin/sh #!/system/bin/sh
cat /etc/security/cacerts/* | \
/data/data/jackpal.androidterm/aria2c \ /data/data/jackpal.androidterm/aria2c \
--ca-certificate=/proc/self/fd/0 \
--async-dns \ --async-dns \
--async-dns-server=`getprop net.dns1`,`getprop net.dns2` \ --async-dns-server=`getprop net.dns1`,`getprop net.dns2` \
"$@" "$@"
@ -70,6 +79,7 @@ Known Issues
------------ ------------
* Since Android does not have ``/dev/stdout``, ``-l-`` does not work. * Since Android does not have ``/dev/stdout``, ``-l-`` does not work.
``/proc/self/fd/0`` is a workaround for Android.
* Android Terminal Emulator sometimes stops updating console. It looks * Android Terminal Emulator sometimes stops updating console. It looks
like aria2c hangs, but aria2c continues to run. like aria2c hangs, but aria2c continues to run.

View File

@ -5,18 +5,19 @@ aria2 Windows build is provided in 2 flavors: 32bit version and 64bit
version. The executable was compiled using mingw-w64 cross compiler on version. The executable was compiled using mingw-w64 cross compiler on
Debian Linux. Debian Linux.
* gcc-mingw-w64 4.9.0-2+13 * gcc-mingw-w64 4.9.2-21+15.4
* binutils-mingw-w64-i686 2.24-2+3+b1 * binutils-mingw-w64-i686 2.25-8+6.2
* binutils-mingw-w64-x86-64 2.24-2+3+b1 * binutils-mingw-w64-x86-64 2.25-8+6.2
The executable is statically linked, so no extra DLLs are The executable is statically linked, so no extra DLLs are
necessary. The linked libraries are: necessary. The linked libraries are:
* gmp 6.0.0 * gmp 6.0.0
* expat 2.1.0 * expat 2.1.0
* sqlite 3.8.8.2 * sqlite 3.8.11.1
* zlib 1.2.8 * zlib 1.2.8
* c-ares 1.10.0 with the dns.patch [1] applied * c-ares 1.10.0 with the dns.patch [1] applied
* libssh2 1.6.0
[1] http://c-ares.haxx.se/mail/c-ares-archive-2014-05/0008.shtml [1] http://c-ares.haxx.se/mail/c-ares-archive-2014-05/0008.shtml

View File

@ -10,14 +10,15 @@ You must use this program at your own risk.
Introduction Introduction
------------ ------------
aria2 is a utility for downloading files. The supported protocols are aria2 is a utility for downloading files. The supported protocols are
HTTP(S), FTP, BitTorrent, and Metalink. aria2 can download a file from HTTP(S), FTP, SFTP, BitTorrent, and Metalink. aria2 can download a
multiple sources/protocols and tries to utilize your maximum download file from multiple sources/protocols and tries to utilize your maximum
bandwidth. It supports downloading a file from HTTP(S)/FTP and download bandwidth. It supports downloading a file from
BitTorrent at the same time, while the data downloaded from HTTP(S)/FTP/SFTP and BitTorrent at the same time, while the data
HTTP(S)/FTP is uploaded to the BitTorrent swarm. Using Metalink's downloaded from HTTP(S)/FTP/SFTP is uploaded to the BitTorrent
chunk checksums, aria2 automatically validates chunks of data while swarm. Using Metalink's chunk checksums, aria2 automatically validates
downloading a file like BitTorrent. chunks of data while downloading a file like BitTorrent.
The project page is located at http://aria2.sourceforge.net/. The project page is located at http://aria2.sourceforge.net/.
@ -33,10 +34,10 @@ Features
Here is a list of features: Here is a list of features:
* Command-line interface * Command-line interface
* Download files through HTTP(S)/FTP/BitTorrent * Download files through HTTP(S)/FTP/SFTP/BitTorrent
* Segmented downloading * Segmented downloading
* Metalink version 4 (RFC 5854) support(HTTP/FTP/BitTorrent) * Metalink version 4 (RFC 5854) support(HTTP/FTP/SFTP/BitTorrent)
* Metalink version 3.0 support(HTTP/FTP/BitTorrent) * Metalink version 3.0 support(HTTP/FTP/SFTP/BitTorrent)
* Metalink/HTTP (RFC 6249) support * Metalink/HTTP (RFC 6249) support
* HTTP/1.1 implementation * HTTP/1.1 implementation
* HTTP Proxy support * HTTP Proxy support
@ -54,7 +55,7 @@ Here is a list of features:
* Save Cookies in the Mozilla/Firefox (1.x/2.x)/Netscape format. * Save Cookies in the Mozilla/Firefox (1.x/2.x)/Netscape format.
* Custom HTTP Header support * Custom HTTP Header support
* Persistent Connections support * Persistent Connections support
* FTP through HTTP Proxy * FTP/SFTP through HTTP Proxy
* Download/Upload speed throttling * Download/Upload speed throttling
* BitTorrent extensions: Fast extension, DHT, PEX, MSE/PSE, * BitTorrent extensions: Fast extension, DHT, PEX, MSE/PSE,
Multi-Tracker, UDP tracker Multi-Tracker, UDP tracker
@ -98,6 +99,7 @@ Dependency
features dependency features dependency
======================== ======================================== ======================== ========================================
HTTPS OSX or GnuTLS or OpenSSL or Windows HTTPS OSX or GnuTLS or OpenSSL or Windows
SFTP libssh2
BitTorrent None. Optional: libnettle+libgmp or libgcrypt BitTorrent None. Optional: libnettle+libgmp or libgcrypt
or OpenSSL (see note) or OpenSSL (see note)
Metalink libxml2 or Expat. Metalink libxml2 or Expat.
@ -183,6 +185,7 @@ distribution you use):
* libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support) * libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
* nettle-dev (Required for BitTorrent, Checksum support) * nettle-dev (Required for BitTorrent, Checksum support)
* libgmp-dev (Required for BitTorrent) * libgmp-dev (Required for BitTorrent)
* libssh2-1-dev (Required for SFTP support)
* libc-ares-dev (Required for async DNS support) * libc-ares-dev (Required for async DNS support)
* libxml2-dev (Required for Metalink support) * libxml2-dev (Required for Metalink support)
* zlib1g-dev (Required for gzip, deflate decoding support in HTTP) * zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
@ -206,8 +209,13 @@ You can use libexpat1-dev instead of libxml2-dev:
On Fedora you need the following packages: gcc, gcc-c++, kernel-devel, On Fedora you need the following packages: gcc, gcc-c++, kernel-devel,
libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit libgcrypt-devel, libxml2-devel, openssl-devel, gettext-devel, cppunit
If you downloaded source code from git repository, you have to run If you downloaded source code from git repository, you have to install
following command to generate configure script and other files following packages to get autoconf macros:
* libxml2-dev
* libcppunit-dev
And run following command to generate configure script and other files
necessary to build the program:: necessary to build the program::
$ autoreconf -i $ autoreconf -i
@ -301,6 +309,7 @@ following libraries have been built for cross-compile:
* expat * expat
* sqlite3 * sqlite3
* zlib * zlib
* libssh2
* cppunit * cppunit
Some environment variables can be adjusted to change build settings: Some environment variables can be adjusted to change build settings:
@ -341,6 +350,8 @@ assumes the following libraries have been built for cross-compile:
* c-ares * c-ares
* openssl * openssl
* expat * expat
* zlib
* libssh2
When building the above libraries, make sure that disable shared When building the above libraries, make sure that disable shared
library and enable only static library. We are going to link those library and enable only static library. We are going to link those
@ -419,9 +430,11 @@ DHT
~~~ ~~~
aria2 supports mainline compatible DHT. By default, the routing table aria2 supports mainline compatible DHT. By default, the routing table
for IPv4 DHT is saved to ``$HOME/.aria2/dht.dat`` and the routing for IPv4 DHT is saved to ``$XDG_CACHE_HOME/aria2/dht.dat`` and the
table for IPv6 DHT is saved to ``$HOME/.aria2/dht6.dat``. aria2 uses routing table for IPv6 DHT is saved to
same port number to listen on for both IPv4 and IPv6 DHT. ``$XDG_CACHE_HOME/aria2/dht6.dat`` unless files exist at
``$HOME/.aria2/dht.dat`` or ``$HOME/.aria2/dht6.dat``. aria2 uses same
port number to listen on for both IPv4 and IPv6 DHT.
UDP tracker UDP tracker
~~~~~~~~~~~ ~~~~~~~~~~~
@ -449,9 +462,9 @@ Other things should be noted
Metalink Metalink
-------- --------
The current implementation supports HTTP(S)/FTP/BitTorrent. The other The current implementation supports HTTP(S)/FTP/SFTP/BitTorrent. The
P2P protocols are ignored. Both Metalink4 (RFC 5854) and Metalink other P2P protocols are ignored. Both Metalink4 (RFC 5854) and
version 3.0 documents are supported. Metalink version 3.0 documents are supported.
For checksum verification, md5, sha-1, sha-224, sha-256, sha-384 and For checksum verification, md5, sha-1, sha-224, sha-256, sha-384 and
sha-512 are supported. If multiple hash algorithms are provided, aria2 sha-512 are supported. If multiple hash algorithms are provided, aria2
@ -497,9 +510,10 @@ which location you prefer, you can use ``--metalink-location`` option.
netrc netrc
----- -----
netrc support is enabled by default for HTTP(S)/FTP. To disable netrc
support, specify -n command-line option. Your .netrc file should have netrc support is enabled by default for HTTP(S)/FTP/SFTP. To disable
correct permissions(600). netrc support, specify -n command-line option. Your .netrc file
should have correct permissions(600).
WebSocket WebSocket
--------- ---------

View File

@ -44,21 +44,15 @@ PATH=$TOOLCHAIN/bin:$PATH
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \ --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--disable-nls \ --disable-nls \
--without-gnutls \ --without-gnutls \
--with-openssl --with-openssl-prefix=$PREFIX \ --with-openssl \
--without-sqlite3 \ --without-sqlite3 \
--without-libxml2 \ --without-libxml2 \
--with-libexpat --with-libexpat-prefix=$PREFIX \ --with-libexpat \
--with-libcares --with-libcares-prefix=$PREFIX \ --with-libcares \
--with-libz --with-libz-prefix=$PREFIX \ --with-libz \
--with-libssh2 \
CXXFLAGS="-Os -g" \ CXXFLAGS="-Os -g" \
CFLAGS="-Os -g" \ CFLAGS="-Os -g" \
CPPFLAGS="-fPIE" \ CPPFLAGS="-fPIE" \
LDFLAGS="-fPIE -pie -L$PREFIX/lib" \ LDFLAGS="-fPIE -pie -L$PREFIX/lib" \
PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \ PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig"
ZLIB_LIBS="-lz" \
ZLIB_CFLAGS="-I$TOOLCHAIN/sysroot/usr/include"
# ZLIB_LIBS and ZLIB_CFLAGS are needed because aria2 configure script
# checks zlib availability using pkg-config, but android toochain does
# not provide pkg-config file. We need to specify these variables
# manually.

22
android/zlib-config Executable file
View File

@ -0,0 +1,22 @@
#!/bin/sh -e
if [ -z "$ANDROID_HOME" ]; then
echo 'No $ANDROID_HOME specified.'
exit 1
fi
PREFIX=$ANDROID_HOME/usr/local
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH
HOST=arm-linux-androideabi
CC=$HOST-gcc \
AR=$HOST-ar \
LD=$HOST-ld \
RANLIB=$HOST-ranlib \
STRIP=$HOST-strip \
./configure \
--prefix=$PREFIX \
--libdir=$PREFIX/lib \
--includedir=$PREFIX/include \
--static

View File

@ -28,6 +28,10 @@ build()
&& LANG=C make clean \ && LANG=C make clean \
&& LANG=C make -j2 check 2>&1 |tee "$BUILDDIR/aria2c_$2.log" \ && LANG=C make -j2 check 2>&1 |tee "$BUILDDIR/aria2c_$2.log" \
&& cp src/aria2c "$BUILDDIR/aria2c_$2" && cp src/aria2c "$BUILDDIR/aria2c_$2"
if [ -f "test/aria2c.log" ]; then
cat "test/aria2c.log" >> "$BUILDDIR/aria2c_$2.log"
fi
} }
clear() clear()
@ -53,11 +57,13 @@ case "$1" in
build "--without-libxml2 --without-libexpat" "noxml" build "--without-libxml2 --without-libexpat" "noxml"
build "--without-libz" "nozlib" build "--without-libz" "nozlib"
build "--without-sqlite3" "nosqlite3" build "--without-sqlite3" "nosqlite3"
build "--without-libssh2" "nolibssh2"
# Feature combinations # Feature combinations
build "--disable-bittorrent" "nobt" build "--disable-bittorrent" "nobt"
build "--disable-metalink" "noml" build "--disable-metalink" "noml"
build "--disable-bittorrent --disable-metalink" "nobt_noml" build "--disable-bittorrent --disable-metalink" "nobt_noml"
build "--disable-epoll" "noepoll" build "--disable-epoll" "noepoll"
build "--disable-epoll --without-libcares" "noepoll_nocares" build "--disable-epoll --without-libcares" "noepoll_nocares"
build "--enable-libaria2" "libaria2"
;; ;;
esac esac

View File

@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script. # Process this file with autoconf to produce a configure script.
# #
AC_PREREQ([2.67]) AC_PREREQ([2.67])
AC_INIT([aria2],[1.18.9],[https://github.com/tatsuhiro-t/aria2/issues],[aria2],[http://aria2.sourceforge.net/]) AC_INIT([aria2],[1.19.1],[https://github.com/tatsuhiro-t/aria2/issues],[aria2],[http://aria2.sourceforge.net/])
AC_CANONICAL_HOST AC_CANONICAL_HOST
AC_CANONICAL_TARGET AC_CANONICAL_TARGET
@ -29,9 +29,10 @@ case "$host" in
*mingw*) *mingw*)
win_build=yes win_build=yes
LIBS="$LIBS -lws2_32 -lwsock32 -lgdi32 -lwinmm -liphlpapi -lpsapi" LIBS="$LIBS -lws2_32 -lwsock32 -lgdi32 -lwinmm -liphlpapi -lpsapi"
# C++ headers defines __USE_MINGW_ANSI_STDIO to 1 unconditionally. # Define _POSIX_C_SOURCE to 1. This makes {asc,local}time_r available
# We have to use it as well nonetheless. # from <time.h> even without (un)helpful interference from <pthread.h>,
CPPFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $CPPFLAGS" # and also defines __USE_MINGW_ANSI_STDIO.
CPPFLAGS="-D_POSIX_C_SOURCE=1 $CPPFLAGS"
# Build with ASLR (dynamicbase) and NX compatiblity (nxcompat) # Build with ASLR (dynamicbase) and NX compatiblity (nxcompat)
# Enable pie once upstream/binutils gets fixed to produce correct binaries with it. # Enable pie once upstream/binutils gets fixed to produce correct binaries with it.
LDFLAGS="$LDFLAGS -Wl,--dynamicbase -Wl,--nxcompat" LDFLAGS="$LDFLAGS -Wl,--dynamicbase -Wl,--nxcompat"
@ -43,7 +44,7 @@ AC_DEFINE_UNQUOTED([HOST], ["$host"], [Define build-type])
AC_DEFINE_UNQUOTED([TARGET], ["$target"], [Define target-type]) AC_DEFINE_UNQUOTED([TARGET], ["$target"], [Define target-type])
# Checks for arguments. # Checks for arguments.
ARIA2_ARG_WITHOUT([libuv]) ARIA2_ARG_WITH([libuv])
ARIA2_ARG_WITHOUT([appletls]) ARIA2_ARG_WITHOUT([appletls])
ARIA2_ARG_WITHOUT([wintls]) ARIA2_ARG_WITHOUT([wintls])
ARIA2_ARG_WITHOUT([gnutls]) ARIA2_ARG_WITHOUT([gnutls])
@ -58,6 +59,7 @@ ARIA2_ARG_WITHOUT([libcares])
ARIA2_ARG_WITHOUT([libz]) ARIA2_ARG_WITHOUT([libz])
ARIA2_ARG_WITH([tcmalloc]) ARIA2_ARG_WITH([tcmalloc])
ARIA2_ARG_WITH([jemalloc]) ARIA2_ARG_WITH([jemalloc])
ARIA2_ARG_WITHOUT([libssh2])
ARIA2_ARG_DISABLE([ssl]) ARIA2_ARG_DISABLE([ssl])
ARIA2_ARG_DISABLE([bittorrent]) ARIA2_ARG_DISABLE([bittorrent])
@ -106,14 +108,6 @@ if test "x$AR" = "x:"; then
fi fi
AC_SUBST([AR]) AC_SUBST([AR])
AC_PATH_PROG([A2X], [a2x])
AC_SUBST([A2X])
AM_CONDITIONAL([HAVE_A2X], [ test "x$A2X" != "x" ])
AC_PATH_PROG([ASCIIDOC], [asciidoc])
AC_SUBST([ASCIIDOC])
AM_CONDITIONAL([HAVE_ASCIIDOC], [ test "x$ASCIIDOC" != "x" ])
AC_PATH_PROGS([SPHINXBUILD], [sphinx-build]) AC_PATH_PROGS([SPHINXBUILD], [sphinx-build])
AC_SUBST([SPHINXBUILD]) AC_SUBST([SPHINXBUILD])
AM_CONDITIONAL([HAVE_SPHINXBUILD], [ test "x$SPHINXBUILD" != "x" ]) AM_CONDITIONAL([HAVE_SPHINXBUILD], [ test "x$SPHINXBUILD" != "x" ])
@ -131,6 +125,16 @@ PKG_PROG_PKG_CONFIG([0.20])
# Check C++ compiler supports C++0x/C++11 feature # Check C++ compiler supports C++0x/C++11 feature
AX_CXX_COMPILE_STDCXX_11([noext], [mandatory]) AX_CXX_COMPILE_STDCXX_11([noext], [mandatory])
# Check C++ compiler actually supports nullptr
AC_MSG_CHECKING([whether the c++ compiler supports nullptr])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
]],
[[
int *a = nullptr;
]])],
[],
[AC_MSG_FAILURE([C++ compiler does not understand nullptr, perhaps C++ compiler is too old. Try again with new one (gcc >= 4.8.3 or clang >= 3.4)])])
# i686-w64-mingw32-g++ 4.6 does not support override keyword. For # i686-w64-mingw32-g++ 4.6 does not support override keyword. For
# those compilers, define CXX11_OVERRIDE to empty string. Otherwise # those compilers, define CXX11_OVERRIDE to empty string. Otherwise
# define it as override. Use CXX11_OVERRIDE instead of override. # define it as override. Use CXX11_OVERRIDE instead of override.
@ -470,6 +474,20 @@ if test "x$have_openssl" != "xyes"; then
fi fi
fi fi
if test "x$with_libssh2" = "xyes"; then
PKG_CHECK_MODULES([LIBSSH2], [libssh2], [have_libssh2=yes], [have_libssh2=no])
if test "x$have_libssh2" = "xyes"; then
AC_DEFINE([HAVE_LIBSSH2], [1], [Define to 1 if you have libssh2.])
LIBS="$LIBSSH2_LIBS $LIBS"
CPPFLAGS="$LIBSSH2_CFLAGS $CPPFLAGS"
else
AC_MSG_WARN([$LIBSSH2_PKG_ERRORS])
if test "x$with_libssh2_requested" = "xyes"; then
ARIA2_DEP_NOT_MET([libssh2])
fi
fi
fi
if test "x$with_libcares" = "xyes"; then if test "x$with_libcares" = "xyes"; then
PKG_CHECK_MODULES([LIBCARES], [libcares >= 1.7.0], [have_libcares=yes], PKG_CHECK_MODULES([LIBCARES], [libcares >= 1.7.0], [have_libcares=yes],
[have_libcares=no]) [have_libcares=no])
@ -613,6 +631,9 @@ AM_CONDITIONAL([HAVE_ZLIB], [test "x$have_zlib" = "xyes"])
# Set conditional for sqlite3 # Set conditional for sqlite3
AM_CONDITIONAL([HAVE_SQLITE3], [test "x$have_sqlite3" = "xyes"]) AM_CONDITIONAL([HAVE_SQLITE3], [test "x$have_sqlite3" = "xyes"])
# Set conditional for libssh2
AM_CONDITIONAL([HAVE_LIBSSH2], [test "x$have_libssh2" = "xyes"])
AC_SEARCH_LIBS([clock_gettime], [rt]) AC_SEARCH_LIBS([clock_gettime], [rt])
case "$host" in case "$host" in
@ -758,10 +779,12 @@ AC_CHECK_FUNCS([__argz_count \
AC_MSG_CHECKING([for getrandom linux syscall interface]) AC_MSG_CHECKING([for getrandom linux syscall interface])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <sys/syscall.h>
#include <linux/random.h> #include <linux/random.h>
]], ]],
[[ [[
int x = GRND_NONBLOCK; int x = GRND_NONBLOCK;
int y = (int)SYS_getrandom;
]])], ]])],
[have_getrandom_interface=yes [have_getrandom_interface=yes
AC_DEFINE([HAVE_GETRANDOM_INTERFACE], [1], [Define to 1 if getrandom linux syscall interface is available.])], AC_DEFINE([HAVE_GETRANDOM_INTERFACE], [1], [Define to 1 if getrandom linux syscall interface is available.])],
@ -839,10 +862,32 @@ AM_CONDITIONAL([HAVE_SOME_FALLOCATE],
[test "x$have_posix_fallocate" = "xyes" || test "x$have_fallocate" = "xyes" \ [test "x$have_posix_fallocate" = "xyes" || test "x$have_fallocate" = "xyes" \
|| test "x$have_osx" = "xyes" || test "x$win_build" = "xyes"]) || test "x$have_osx" = "xyes" || test "x$win_build" = "xyes"])
AC_MSG_CHECKING([for asctime_r])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <time.h>
]], [[
struct tm r; char *c;
asctime_r(&r, c);
]])],
[AM_CONDITIONAL([HAVE_ASCTIME_R], true)
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_ASCTIME_R], [1], [Define to 1 if you have the `asctime_r' function or macro.])],
[AC_MSG_RESULT([no])
AM_CONDITIONAL([HAVE_ASCTIME_R], false)])
AC_MSG_CHECKING([for localtime_r])
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <time.h>
]], [[
time_t t; struct tm r;
localtime_r(&t, &r);
]])],
[AM_CONDITIONAL([HAVE_LOCALTIME_R], true)
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_LOCALTIME_R], [1], [Define to 1 if you have the `localtime_r' function or macro.])],
[AC_MSG_RESULT([no])
AM_CONDITIONAL([HAVE_LOCALTIME_R], false)])
AC_CHECK_FUNCS([asctime_r],
[AM_CONDITIONAL([HAVE_ASCTIME_R], true)],
[AM_CONDITIONAL([HAVE_ASCTIME_R], false)])
AC_CHECK_FUNCS([basename], AC_CHECK_FUNCS([basename],
[AM_CONDITIONAL([HAVE_BASENAME], true)], [AM_CONDITIONAL([HAVE_BASENAME], true)],
[AM_CONDITIONAL([HAVE_BASENAME], false)]) [AM_CONDITIONAL([HAVE_BASENAME], false)])
@ -855,9 +900,6 @@ AC_CHECK_FUNCS([getaddrinfo],
AC_CHECK_FUNCS([gettimeofday], AC_CHECK_FUNCS([gettimeofday],
[AM_CONDITIONAL([HAVE_GETTIMEOFDAY], true)], [AM_CONDITIONAL([HAVE_GETTIMEOFDAY], true)],
[AM_CONDITIONAL([HAVE_GETTIMEOFDAY], false)]) [AM_CONDITIONAL([HAVE_GETTIMEOFDAY], false)])
AC_CHECK_FUNCS([localtime_r],
[AM_CONDITIONAL([HAVE_LOCALTIME_R], true)],
[AM_CONDITIONAL([HAVE_LOCALTIME_R], false)])
AC_CHECK_FUNCS([strptime], AC_CHECK_FUNCS([strptime],
[AM_CONDITIONAL([HAVE_STRPTIME], true)], [AM_CONDITIONAL([HAVE_STRPTIME], true)],
[AM_CONDITIONAL([HAVE_STRPTIME], false)]) [AM_CONDITIONAL([HAVE_STRPTIME], false)])
@ -867,14 +909,6 @@ AC_CHECK_FUNCS([timegm],
AC_CHECK_FUNCS([daemon], [have_daemon=yes]) AC_CHECK_FUNCS([daemon], [have_daemon=yes])
AM_CONDITIONAL([HAVE_DAEMON], [test "x$have_daemon" = "xyes"]) AM_CONDITIONAL([HAVE_DAEMON], [test "x$have_daemon" = "xyes"])
AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes])
if test "x$have_clock_gettime" != "xyes"; then
AC_CHECK_FUNCS([mach_absolute_time], [have_mach_absolute_time=yes])
fi
AM_CONDITIONAL([HAVE_MACH_ABSOLUTE_TIME],
[test "x$have_mach_absolute_time" = "xyes"])
AC_CHECK_FUNCS([poll], [have_poll=yes]) AC_CHECK_FUNCS([poll], [have_poll=yes])
AM_CONDITIONAL([HAVE_POLL], [test "x$have_poll" = "xyes"]) AM_CONDITIONAL([HAVE_POLL], [test "x$have_poll" = "xyes"])
@ -885,11 +919,9 @@ case "$host" in
AM_CONDITIONAL([HAVE_GETADDRINFO], true) AM_CONDITIONAL([HAVE_GETADDRINFO], true)
dnl defined in ws2tcpip.h, but missing in C:\mingw\lib\libws2_32.a dnl defined in ws2tcpip.h, but missing in C:\mingw\lib\libws2_32.a
AM_CONDITIONAL([HAVE_GAI_STRERROR], false) AM_CONDITIONAL([HAVE_GAI_STRERROR], false)
AM_CONDITIONAL([HAVE_TIMEGETTIME], [test "x$have_clock_gettime" != "xyes"])
;; ;;
*) *)
AM_CONDITIONAL([MINGW_BUILD], false) AM_CONDITIONAL([MINGW_BUILD], false)
AM_CONDITIONAL([HAVE_TIMEGETTIME], false)
;; ;;
esac esac
@ -1060,6 +1092,7 @@ echo "LibXML2: $have_libxml2"
echo "LibExpat: $have_libexpat" echo "LibExpat: $have_libexpat"
echo "LibCares: $have_libcares" echo "LibCares: $have_libcares"
echo "Zlib: $have_zlib" echo "Zlib: $have_zlib"
echo "Libssh2: $have_libssh2"
echo "Epoll: $have_epoll" echo "Epoll: $have_epoll"
echo "Bittorrent: $enable_bittorrent" echo "Bittorrent: $enable_bittorrent"
echo "Metalink: $enable_metalink" echo "Metalink: $enable_metalink"

View File

@ -70,7 +70,7 @@ _aria2c()
esac esac
case $cur in case $cur in
-*) -*)
COMPREPLY=( $( compgen -W '--rpc-save-upload-metadata --rpc-save-upload-metadata=false --on-download-start --metalink-language --rpc-secret --torrent-file --enable-peer-exchange --enable-peer-exchange=false --http-proxy-passwd --bt-tracker-timeout --ftp-type --seed-time --bt-tracker-connect-timeout --bt-max-open-files --no-netrc --no-netrc=false --force-sequential --force-sequential=false --metalink-base-uri --private-key --ftp-passwd --allow-overwrite --allow-overwrite=false --rpc-allow-origin-all --rpc-allow-origin-all=false --bt-detach-seed-only --bt-detach-seed-only=false --summary-interval --lowest-speed-limit --bt-tracker-interval --proxy-method --metalink-preferred-protocol --enable-http-keep-alive --enable-http-keep-alive=false --metalink-version --bt-lpd-interface --force-save --force-save=false --rpc-secure --rpc-secure=false --listen-port --rpc-private-key --server-stat-of --server-stat-timeout --https-proxy-user --piece-length --dry-run --dry-run=false --truncate-console-readout --truncate-console-readout=false --async-dns-server --bt-max-peers --max-overall-upload-limit --rpc-user --dht-entry-point6 --dir --split --on-download-pause --auto-file-renaming --auto-file-renaming=false --http-proxy --save-session-interval --daemon --daemon=false --https-proxy --min-tls-version --save-cookies --out --rlimit-nofile --max-file-not-found --on-download-stop --certificate --bt-min-crypto-level --remove-control-file --remove-control-file=false --enable-dht --enable-dht=false --file-allocation --follow-metalink --on-bt-download-complete --ftp-proxy --show-files --show-files=false --timeout --bt-hash-check-seed --bt-hash-check-seed=false --ftp-pasv --ftp-pasv=false --check-certificate --check-certificate=false --always-resume --always-resume=false --load-cookies --bt-remove-unselected-file --bt-remove-unselected-file=false --bt-stop-timeout --version --max-concurrent-downloads --quiet --quiet=false --max-download-result --max-resume-failure-tries --header --rpc-listen-all --rpc-listen-all=false --all-proxy-user --server-stat-if --dht-file-path6 --save-session --bt-external-ip --max-tries --conditional-get --conditional-get=false --ftp-reuse-connection --ftp-reuse-connection=false --gid --dscp --max-download-limit --bt-prioritize-piece --check-integrity --check-integrity=false --log-level --remote-time --remote-time=false --uri-selector --rpc-listen-port --index-out --bt-tracker --referer --console-log-level --connect-timeout --stream-piece-selector --dht-message-timeout --select-file --download-result --disable-ipv6 --disable-ipv6=false --rpc-max-request-size --rpc-passwd --stop-with-process --https-proxy-passwd --continue --continue=false --no-file-allocation-limit --ftp-proxy-user --enable-color --enable-color=false --metalink-location --allow-piece-length-change --allow-piece-length-change=false --max-connection-per-server --no-conf --no-conf=false --rpc-certificate --metalink-os --enable-http-pipelining --enable-http-pipelining=false --http-passwd --user-agent --enable-dht6 --enable-dht6=false --dht-file-path --http-auth-challenge --http-auth-challenge=false --peer-id-prefix --enable-mmap --enable-mmap=false --use-head --use-head=false --bt-require-crypto --bt-require-crypto=false --show-console-readout --show-console-readout=false --conf-path --log --no-proxy --dht-entry-point --dht-listen-port --http-user --retry-wait --on-download-complete --help --help=#basic --help=#advanced --help=#http --help=#https --help=#ftp --help=#metalink --help=#bittorrent --help=#cookie --help=#hook --help=#file --help=#rpc --help=#checksum --help=#experimental --help=#deprecated --help=#help --help=#all --max-overall-download-limit --event-poll --http-accept-gzip --http-accept-gzip=false --metalink-file --all-proxy --disk-cache --hash-check-only --hash-check-only=false --dht-listen-addr6 --human-readable --human-readable=false --ftp-user --all-proxy-passwd --bt-exclude-tracker --pause-metadata --pause-metadata=false --http-proxy-user --deferred-input --deferred-input=false --metalink-enable-unique-protocol --metalink-enable-unique-protocol=false --stop --max-upload-limit --realtime-chunk-checksum --realtime-chunk-checksum=false --http-no-cache --http-no-cache=false --ca-certificate --bt-force-encryption --bt-force-encryption=false --bt-save-metadata --bt-save-metadata=false --seed-ratio --follow-torrent --pause --pause=false --checksum --auto-save-interval --async-dns --async-dns=false --bt-enable-lpd --bt-enable-lpd=false --parameterized-uri --parameterized-uri=false --ftp-proxy-passwd --enable-rpc --enable-rpc=false --min-split-size --bt-seed-unverified --bt-seed-unverified=false --input-file --interface --enable-async-dns6 --enable-async-dns6=false --reuse-uri --reuse-uri=false --bt-request-peer-speed-limit --on-download-error --bt-metadata-only --bt-metadata-only=false ' -- "$cur" ) ) COMPREPLY=( $( compgen -W '--rpc-save-upload-metadata --rpc-save-upload-metadata=false --on-download-start --metalink-language --rpc-secret --torrent-file --enable-peer-exchange --enable-peer-exchange=false --http-proxy-passwd --bt-tracker-timeout --ftp-type --seed-time --bt-tracker-connect-timeout --bt-max-open-files --no-netrc --no-netrc=false --force-sequential --force-sequential=false --metalink-base-uri --private-key --ftp-passwd --allow-overwrite --allow-overwrite=false --rpc-allow-origin-all --rpc-allow-origin-all=false --bt-detach-seed-only --bt-detach-seed-only=false --summary-interval --lowest-speed-limit --bt-tracker-interval --proxy-method --metalink-preferred-protocol --enable-http-keep-alive --enable-http-keep-alive=false --metalink-version --bt-lpd-interface --force-save --force-save=false --rpc-secure --rpc-secure=false --listen-port --rpc-private-key --server-stat-of --server-stat-timeout --https-proxy-user --piece-length --dry-run --dry-run=false --truncate-console-readout --truncate-console-readout=false --async-dns-server --bt-max-peers --max-overall-upload-limit --rpc-user --dht-entry-point6 --dir --split --on-download-pause --auto-file-renaming --auto-file-renaming=false --http-proxy --save-session-interval --daemon --daemon=false --https-proxy --min-tls-version --save-cookies --out --rlimit-nofile --max-file-not-found --on-download-stop --certificate --bt-min-crypto-level --remove-control-file --remove-control-file=false --enable-dht --enable-dht=false --file-allocation --follow-metalink --on-bt-download-complete --ftp-proxy --show-files --show-files=false --timeout --bt-hash-check-seed --bt-hash-check-seed=false --ftp-pasv --ftp-pasv=false --check-certificate --check-certificate=false --always-resume --always-resume=false --load-cookies --bt-remove-unselected-file --bt-remove-unselected-file=false --bt-stop-timeout --version --max-concurrent-downloads --quiet --quiet=false --max-download-result --max-resume-failure-tries --header --rpc-listen-all --rpc-listen-all=false --all-proxy-user --server-stat-if --dht-file-path6 --save-session --bt-external-ip --max-tries --conditional-get --conditional-get=false --ftp-reuse-connection --ftp-reuse-connection=false --gid --dscp --max-download-limit --bt-prioritize-piece --check-integrity --check-integrity=false --log-level --remote-time --remote-time=false --uri-selector --rpc-listen-port --index-out --bt-tracker --referer --ssh-host-key-md --console-log-level --connect-timeout --stream-piece-selector --dht-message-timeout --select-file --download-result --disable-ipv6 --disable-ipv6=false --rpc-max-request-size --rpc-passwd --stop-with-process --https-proxy-passwd --continue --continue=false --no-file-allocation-limit --netrc-path --ftp-proxy-user --enable-color --enable-color=false --metalink-location --allow-piece-length-change --allow-piece-length-change=false --max-connection-per-server --no-conf --no-conf=false --rpc-certificate --metalink-os --enable-http-pipelining --enable-http-pipelining=false --http-passwd --user-agent --enable-dht6 --enable-dht6=false --dht-file-path --http-auth-challenge --http-auth-challenge=false --peer-id-prefix --enable-mmap --enable-mmap=false --use-head --use-head=false --bt-require-crypto --bt-require-crypto=false --show-console-readout --show-console-readout=false --conf-path --log --no-proxy --dht-entry-point --dht-listen-port --http-user --retry-wait --on-download-complete --help --help=#basic --help=#advanced --help=#http --help=#https --help=#ftp --help=#metalink --help=#bittorrent --help=#cookie --help=#hook --help=#file --help=#rpc --help=#checksum --help=#experimental --help=#deprecated --help=#help --help=#all --max-overall-download-limit --event-poll --http-accept-gzip --http-accept-gzip=false --metalink-file --all-proxy --disk-cache --hash-check-only --hash-check-only=false --dht-listen-addr6 --human-readable --human-readable=false --ftp-user --all-proxy-passwd --bt-exclude-tracker --pause-metadata --pause-metadata=false --http-proxy-user --deferred-input --deferred-input=false --metalink-enable-unique-protocol --metalink-enable-unique-protocol=false --stop --max-upload-limit --multiple-interface --realtime-chunk-checksum --realtime-chunk-checksum=false --http-no-cache --http-no-cache=false --ca-certificate --bt-force-encryption --bt-force-encryption=false --bt-save-metadata --bt-save-metadata=false --seed-ratio --follow-torrent --pause --pause=false --checksum --auto-save-interval --async-dns --async-dns=false --bt-enable-lpd --bt-enable-lpd=false --parameterized-uri --parameterized-uri=false --ftp-proxy-passwd --enable-rpc --enable-rpc=false --min-split-size --bt-seed-unverified --bt-seed-unverified=false --input-file --interface --enable-async-dns6 --enable-async-dns6=false --reuse-uri --reuse-uri=false --bt-request-peer-speed-limit --on-download-error --bt-metadata-only --bt-metadata-only=false ' -- "$cur" ) )
;; ;;
*) *)
_filedir '@(torrent|meta4|metalink|text|txt|list|lst)' _filedir '@(torrent|meta4|metalink|text|txt|list|lst)'

View File

@ -9,17 +9,22 @@ DESCRIPTION
----------- -----------
aria2 is a utility for downloading files. The supported protocols are aria2 is a utility for downloading files. The supported protocols are
HTTP(S), FTP, BitTorrent, and Metalink. aria2 can download a file from HTTP(S), FTP, SFTP, BitTorrent, and Metalink. aria2 can download a
multiple sources/protocols and tries to utilize your maximum download file from multiple sources/protocols and tries to utilize your maximum
bandwidth. It supports downloading a file from HTTP(S)/FTP and download bandwidth. It supports downloading a file from HTTP(S)/FTP
BitTorrent at the same time, while the data downloaded from /SFTP and BitTorrent at the same time, while the data downloaded from
HTTP(S)/FTP is uploaded to the BitTorrent swarm. Using Metalink HTTP(S)/FTP/SFTP is uploaded to the BitTorrent swarm. Using Metalink
chunk checksums, aria2 automatically validates chunks of data while chunk checksums, aria2 automatically validates chunks of data while
downloading a file. downloading a file.
OPTIONS OPTIONS
------- -------
.. note::
Most FTP related options are applicable to SFTP as well.
Some options are not effective against SFTP (e.g., :option:`--ftp-pasv`)
Basic Options Basic Options
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
.. option:: -d, --dir=<DIR> .. option:: -d, --dir=<DIR>
@ -84,8 +89,9 @@ Basic Options
``#checksum``, ``#experimental``, ``#deprecated``, ``#help``, ``#all`` ``#checksum``, ``#experimental``, ``#deprecated``, ``#help``, ``#all``
Default: ``#basic`` Default: ``#basic``
HTTP/FTP Options HTTP/FTP/SFTP Options
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~
.. option:: --all-proxy=<PROXY> .. option:: --all-proxy=<PROXY>
Use a proxy server for all protocols. To override a previously Use a proxy server for all protocols. To override a previously
@ -184,6 +190,17 @@ HTTP/FTP Options
1 source. You can append ``K`` or ``M`` (1K = 1024, 1M = 1024K). 1 source. You can append ``K`` or ``M`` (1K = 1024, 1M = 1024K).
Possible Values: ``1M`` -``1024M`` Default: ``20M`` Possible Values: ``1M`` -``1024M`` Default: ``20M``
.. option:: --netrc-path=<FILE>
Specify the path to the netrc file.
Default: ``$(HOME)/.netrc``
.. note::
Permission of the .netrc file must be 600. Otherwise, the file
will be ignored.
.. option:: -n, --no-netrc[=true|false] .. option:: -n, --no-netrc[=true|false]
Disables netrc support. netrc support is enabled by default. Disables netrc support. netrc support is enabled by default.
@ -520,8 +537,8 @@ HTTP Specific Options
Set user agent for HTTP(S) downloads. Set user agent for HTTP(S) downloads.
Default: ``aria2/$VERSION``, $VERSION is replaced by package version. Default: ``aria2/$VERSION``, $VERSION is replaced by package version.
FTP Specific Options FTP/SFTP Specific Options
~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~
.. option:: --ftp-user=<USER> .. option:: --ftp-user=<USER>
Set FTP user. This affects all URIs. Set FTP user. This affects all URIs.
@ -542,6 +559,10 @@ FTP Specific Options
If ``false`` is given, the active mode will be used. If ``false`` is given, the active mode will be used.
Default: ``true`` Default: ``true``
.. note::
This option is ignored for SFTP transfer.
.. option:: --ftp-proxy=<PROXY> .. option:: --ftp-proxy=<PROXY>
Use a proxy server for FTP. To override a previously defined proxy, Use a proxy server for FTP. To override a previously defined proxy,
@ -562,11 +583,24 @@ FTP Specific Options
Set FTP transfer type. TYPE is either ``binary`` or ``ascii``. Set FTP transfer type. TYPE is either ``binary`` or ``ascii``.
Default: ``binary`` Default: ``binary``
.. note::
This option is ignored for SFTP transfer.
.. option:: --ftp-reuse-connection[=true|false] .. option:: --ftp-reuse-connection[=true|false]
Reuse connection in FTP. Reuse connection in FTP.
Default: ``true`` Default: ``true``
.. option:: --ssh-host-key-md=<TYPE>=<DIGEST>
Set checksum for SSH host public key. TYPE is hash type. The
supported hash type is ``sha-1`` or ``md5``. DIGEST is hex
digest. For example:
``sha-1=b030503d4de4539dc7885e6f0f5e256704edf4c3``. This option can
be used to validate server's public key when SFTP is used. If this
option is not set, which is default, no validation takes place.
BitTorrent/Metalink Options BitTorrent/Metalink Options
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. option:: --select-file=<INDEX>... .. option:: --select-file=<INDEX>...
@ -767,12 +801,14 @@ BitTorrent Specific Options
.. option:: --dht-file-path=<PATH> .. option:: --dht-file-path=<PATH>
Change the IPv4 DHT routing table file to PATH. Change the IPv4 DHT routing table file to PATH.
Default: ``$HOME/.aria2/dht.dat`` Default: ``$HOME/.aria2/dht.dat`` if present, otherwise
``$XDG_CACHE_HOME/aria2/dht.dat``.
.. option:: --dht-file-path6=<PATH> .. option:: --dht-file-path6=<PATH>
Change the IPv6 DHT routing table file to PATH. Change the IPv6 DHT routing table file to PATH.
Default: ``$HOME/.aria2/dht6.dat`` Default: ``$HOME/.aria2/dht6.dat`` if present, otherwise
``$XDG_CACHE_HOME/aria2/dht6.dat``.
.. option:: --dht-listen-addr6=<ADDR> .. option:: --dht-listen-addr6=<ADDR>
@ -1147,7 +1183,8 @@ Advanced Options
.. option:: --conf-path=<PATH> .. option:: --conf-path=<PATH>
Change the configuration file path to PATH. Change the configuration file path to PATH.
Default: ``$HOME/.aria2/aria2.conf`` Default: ``$HOME/.aria2/aria2.conf`` if present, otherwise
``$XDG_CONFIG_HOME/aria2/aria2.conf``.
.. option:: --console-log-level=<LEVEL> .. option:: --console-log-level=<LEVEL>
@ -1336,6 +1373,14 @@ Advanced Options
Possible Values: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2`` Possible Values: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2``
Default: ``TLSv1`` Default: ``TLSv1``
.. option:: --multiple-interface=<INTERFACES>
Comma separated list of interfaces to bind sockets to. Requests will
be splited among the interfaces to achieve link aggregation. You can
specify interface name, IP address and hostname. If
:option:`--interface` is used, this option will be ignored.
Possible Values: interface, IP address, hostname
.. option:: --log-level=<LEVEL> .. option:: --log-level=<LEVEL>
Set log level to output. Set log level to output.
@ -1579,12 +1624,12 @@ treated as a separate download. Both Metalink4 and Metalink version
3.0 are supported. 3.0 are supported.
You can specify both torrent file with -T option and URIs. By doing You can specify both torrent file with -T option and URIs. By doing
this, you can download a file from both torrent swarm and HTTP(S)/FTP this, you can download a file from both torrent swarm and
server at the same time, while the data from HTTP(S)/FTP are uploaded HTTP(S)/FTP/SFTP server at the same time, while the data from
to the torrent swarm. For single file torrents, URI can be a complete HTTP(S)/FTP/SFTP are uploaded to the torrent swarm. For single file
URI pointing to the resource or if URI ends with /, name in torrent torrents, URI can be a complete URI pointing to the resource or if URI
file in torrent is added. For multi-file torrents, name and path are ends with /, name in torrent file in torrent is added. For multi-file
added to form a URI for each file. torrents, name and path are added to form a URI for each file.
.. note:: .. note::
@ -1615,15 +1660,14 @@ occurred. Currently following options are available:
aria2 passes 3 arguments to specified command when it is executed. aria2 passes 3 arguments to specified command when it is executed.
These arguments are: GID, the number of files and file path. For These arguments are: GID, the number of files and file path. For
HTTP, FTP downloads, usually the number of files is 1. BitTorrent HTTP, FTP, and SFTP downloads, usually the number of files is 1.
download can contain multiple files. BitTorrent download can contain multiple files. If number of files is
If number of files is more than one, file path is first one. In more than one, file path is first one. In other words, this is the
other words, this is the value of path key of first struct whose value of path key of first struct whose selected key is true in the
selected key is true in the response of :func:`aria2.getFiles` response of :func:`aria2.getFiles` RPC method. If you want to get all
RPC method. file paths, consider to use JSON-RPC/XML-RPC. Please note that file
If you want to get all file paths, consider to use JSON-RPC/XML-RPC. Please path may change during download in HTTP because of redirection or
note that file path may change during download in HTTP because of Content-Disposition header.
redirection or Content-Disposition header.
Let's see an example of how arguments are passed to command: Let's see an example of how arguments are passed to command:
@ -1746,6 +1790,12 @@ based on the last error encountered.
30 30
If aria2 could not parse JSON-RPC request. If aria2 could not parse JSON-RPC request.
31
Reserved. Not used.
32
If checksum validation failed.
.. note:: .. note::
An error occurred in a finished download will not be reported An error occurred in a finished download will not be reported
@ -1792,10 +1842,12 @@ FILES
aria2.conf aria2.conf
~~~~~~~~~~ ~~~~~~~~~~
By default, aria2 parses ``$HOME/.aria2/aria2.conf`` as a By default, aria2 checks whether the legacy path
configuration file. You can specify the path to configuration file ``$HOME/.aria2/aria2.conf`` is present, otherwise it parses
using :option:`--conf-path` option. If you don't want to use the ``$XDG_CONFIG_HOME/aria2/aria2.conf`` as its configuration file. You
configuration file, use :option:`--no-conf` option. can specify the path to configuration file using :option:`--conf-path`
option. If you don't want to use the configuration file, use
:option:`--no-conf` option.
The configuration file is a text file and has 1 option per each The configuration file is a text file and has 1 option per each
line. In each line, you can specify name-value pair in the format: line. In each line, you can specify name-value pair in the format:
@ -1820,16 +1872,18 @@ lines beginning ``#`` are treated as comments::
dht.dat dht.dat
~~~~~~~~ ~~~~~~~~
By default, the routing table of IPv4 DHT is saved to the path Unless the legacy file paths ``$HOME/.aria2/dht.dat`` and
``$HOME/.aria2/dht.dat`` and the routing table of IPv6 DHT is saved to ``$HOME/.aria2/dht6.dat`` are pointing to existing files, the routing
the path ``$HOME/.aria2/dht6.dat``. table of IPv4 DHT is saved to the path
``$XDG_CACHE_HOME/aria2/dht.dat`` and the routing table of IPv6 DHT is
saved to the path ``$XDG_CACHE_HOME/aria2/dht6.dat``.
Netrc Netrc
~~~~~ ~~~~~
Netrc support is enabled by default for HTTP(S)/FTP. To disable netrc Netrc support is enabled by default for HTTP(S)/FTP/SFTP. To disable
support, specify :option:`--no-netrc <-n>` option. Your .netrc file should have correct netrc support, specify :option:`--no-netrc <-n>` option. Your .netrc
permissions(600). file should have correct permissions(600).
If machine name starts ``.``, aria2 performs domain-match instead of If machine name starts ``.``, aria2 performs domain-match instead of
exact match. This is an extension of aria2. For example of domain exact match. This is an extension of aria2. For example of domain
@ -1992,6 +2046,7 @@ of URIs. These optional lines must start with white space(s).
* :option:`seed-time <--seed-time>` * :option:`seed-time <--seed-time>`
* :option:`select-file <--select-file>` * :option:`select-file <--select-file>`
* :option:`split <-s>` * :option:`split <-s>`
* :option:`ssh-host-key-md <--ssh-host-key-md>`
* :option:`stream-piece-selector <--stream-piece-selector>` * :option:`stream-piece-selector <--stream-piece-selector>`
* :option:`timeout <-t>` * :option:`timeout <-t>`
* :option:`uri-selector <--uri-selector>` * :option:`uri-selector <--uri-selector>`
@ -2156,19 +2211,19 @@ For information on the *secret* parameter, see :ref:`rpc_auth`.
.. function:: aria2.addUri([secret], uris[, options[, position]]) .. function:: aria2.addUri([secret], uris[, options[, position]])
This method adds a new download. *uris* is an array of HTTP/FTP/BitTorrent This method adds a new download. *uris* is an array of
URIs (strings) pointing to the same resource. If you mix URIs pointing to HTTP/FTP/SFTP/BitTorrent URIs (strings) pointing to the same
different resources, then the download may fail or be corrupted without aria2 resource. If you mix URIs pointing to different resources, then the
complaining. download may fail or be corrupted without aria2 complaining. When
When adding BitTorrent Magnet URIs, *uris* must have only one element and it adding BitTorrent Magnet URIs, *uris* must have only one element and
should be BitTorrent Magnet URI. it should be BitTorrent Magnet URI. *options* is a struct and its
*options* is a struct and its members are pairs of option name and value. members are pairs of option name and value. See :ref:`rpc_options`
See :ref:`rpc_options` below for more details. below for more details. If *position* is given, it must be an
If *position* is given, it must be an integer starting from 0. The new integer starting from 0. The new download will be inserted at
download will be inserted at *position* in the waiting queue. If *position* in the waiting queue. If *position* is omitted or
*position* is omitted or *position* is larger than the current size of the *position* is larger than the current size of the queue, the new
queue, the new download is appended to the end of the queue. download is appended to the end of the queue. This method returns
This method returns the GID of the newly registered download. the GID of the newly registered download.
**JSON-RPC Example** **JSON-RPC Example**
@ -2775,9 +2830,9 @@ For information on the *secret* parameter, see :ref:`rpc_auth`.
.. function:: aria2.getServers([secret], gid) .. function:: aria2.getServers([secret], gid)
This method returns currently connected HTTP(S)/FTP servers of the download This method returns currently connected HTTP(S)/FTP/SFTP servers of
denoted by *gid* (string). The response is an array of structs and contains the download denoted by *gid* (string). The response is an array of
the following keys. Values are strings. structs and contains the following keys. Values are strings.
``index`` ``index``
Index of the file, starting at 1, in the same order as files appear in the Index of the file, starting at 1, in the same order as files appear in the
@ -4107,7 +4162,7 @@ The Metalink Download Description Format: :rfc:`5854`
COPYRIGHT COPYRIGHT
--------- ---------
Copyright (C) 2006, 2014 Tatsuhiro Tsujikawa Copyright (C) 2006, 2015 Tatsuhiro Tsujikawa
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

View File

@ -32,6 +32,7 @@
# files in the program, then also delete it here. # files in the program, then also delete it here.
# #
# Generates API reference from C++ source code. # Generates API reference from C++ source code.
from __future__ import print_function
import re, sys, argparse import re, sys, argparse
class FunctionDoc: class FunctionDoc:
@ -41,10 +42,10 @@ class FunctionDoc:
self.domain = domain self.domain = domain
def write(self, out): def write(self, out):
print '''.. {}:: {}'''.format(self.domain, self.name) print('''.. {}:: {}'''.format(self.domain, self.name))
print '' print()
for line in self.content: for line in self.content:
print ' {}'.format(line) print(' {}'.format(line))
class TypedefDoc: class TypedefDoc:
def __init__(self, name, content): def __init__(self, name, content):
@ -52,10 +53,10 @@ class TypedefDoc:
self.content = content self.content = content
def write(self, out): def write(self, out):
print '''.. type:: {}'''.format(self.name) print('''.. type:: {}'''.format(self.name))
print '' print()
for line in self.content: for line in self.content:
print ' {}'.format(line) print(' {}'.format(line))
class StructDoc: class StructDoc:
def __init__(self, name, content, domain, members, member_domain): def __init__(self, name, content, domain, members, member_domain):
@ -67,19 +68,40 @@ class StructDoc:
def write(self, out): def write(self, out):
if self.name: if self.name:
print '''.. {}:: {}'''.format(self.domain, self.name) print('''.. {}:: {}'''.format(self.domain, self.name))
print '' print()
for line in self.content: for line in self.content:
print ' {}'.format(line) print(' {}'.format(line))
print '' print()
for name, content in self.members: for name, content in self.members:
print ''' .. {}:: {}'''.format(\ name = name.strip()
'function' if name.endswith(')') else self.member_domain, # For function (e.g., int foo())
name) m = re.match(r'(.+)\s+([^ ]+\(.*)', name)
print '' if not m:
# For variable (e.g., bool a)
m = re.match(r'(.+)\s+([^ ]+)', name)
if m:
print(''' .. {}:: {} {}::{}'''.format(
'function' if name.endswith(')') else self.member_domain,
m.group(1),
self.name,
m.group(2)))
else:
if name.endswith(')'):
# For function, without return type, like
# constructor
print(''' .. {}:: {}::{}'''.format(
'function' if name.endswith(')') else self.member_domain,
self.name, name))
else:
# enum
print(''' .. {}:: {}'''.format(
'function' if name.endswith(')') else self.member_domain,
name))
print()
for line in content: for line in content:
print ''' {}'''.format(line) print(''' {}'''.format(line))
print '' print()
class MacroDoc: class MacroDoc:
def __init__(self, name, content): def __init__(self, name, content):
@ -87,10 +109,10 @@ class MacroDoc:
self.content = content self.content = content
def write(self, out): def write(self, out):
print '''.. macro:: {}'''.format(self.name) print('''.. macro:: {}'''.format(self.name))
print '' print()
for line in self.content: for line in self.content:
print ' {}'.format(line) print(' {}'.format(line))
def make_api_ref(infiles): def make_api_ref(infiles):
macros = [] macros = []
@ -124,12 +146,12 @@ def make_api_ref(infiles):
for title, docs in alldocs: for title, docs in alldocs:
if not docs: if not docs:
continue continue
print title print(title)
print '-'*len(title) print('-'*len(title))
for doc in docs: for doc in docs:
doc.write(sys.stdout) doc.write(sys.stdout)
print '' print()
print '' print()
def process_macro(infile): def process_macro(infile):
content = read_content(infile) content = read_content(infile)
@ -263,6 +285,6 @@ if __name__ == '__main__':
help='source file') help='source file')
args = parser.parse_args() args = parser.parse_args()
if args.header: if args.header:
print args.header.read() print(args.header.read())
for infile in args.files: for infile in args.files:
make_api_ref(args.files) make_api_ref(args.files)

View File

@ -96,8 +96,10 @@ times.
DHT routing table file format DHT routing table file format
----------------------------- -----------------------------
aria2 saves IPv4 DHT routing table in ``${HOME}/.aria2/dht.dat`` and aria2 saves IPv4 DHT routing table in
IPv6 DHT routing table in ``${HOME}/.aria2/dht6.dat`` by default. ``${XDG_CACHE_HOME}/aria2/dht.dat`` and IPv6 DHT routing table in
``${XDG_CACHE_HOME}/aria2/dht6.dat`` by default unless
``${HOME}/.aria2/dht.dat`` and ``${HOME}/.aria2/dht.dat`` are present.
``dht.dat`` and ``dht6.dat`` files use same binary encoding and have ``dht.dat`` and ``dht6.dat`` files use same binary encoding and have
following fields. All multi byte integers are in network byte following fields. All multi byte integers are in network byte

View File

@ -16,6 +16,12 @@ SINOPSE
DESCRIÇÃO DESCRIÇÃO
--------- ---------
.. warning::
This translation has been outdated quite sometime now, and lacks
many recent changes. Please consult English version manual for
updated information.
Observação: Para executar o aria2 em um terminal ou no prompt da Observação: Para executar o aria2 em um terminal ou no prompt da
linha de comando do windows, utilize o comando aria2c. linha de comando do windows, utilize o comando aria2c.

View File

@ -17,6 +17,12 @@
Manual Aria2 Manual Aria2
============ ============
.. warning::
This translation has been outdated quite sometime now, and lacks
many recent changes. Please consult English version manual for
updated information.
aria2 é um utilitário para download de arquivos, que utiliza protocolos HTTP, aria2 é um utilitário para download de arquivos, que utiliza protocolos HTTP,
HTTPS, FTP, BitTorrent e Metalink. Pode efetuar download de um ou vários HTTPS, FTP, BitTorrent e Metalink. Pode efetuar download de um ou vários
arquivos, a partir de uma ou múltiplas fontes e protocolos, com ou sem arquivos, a partir de uma ou múltiplas fontes e protocolos, com ou sem

View File

@ -126,6 +126,7 @@ text:
man: man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
sed -i -e '1i .\\" -*- mode: troff; coding: utf-8 -*-' $(BUILDDIR)/man/aria2c.1
@echo @echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man." @echo "Build finished. The manual pages are in $(BUILDDIR)/man."

View File

@ -9,17 +9,22 @@ aria2c(1)
-------- --------
aria2 - это утилита для загрузки файлов. Поддерживаемые протоколы: HTTP(S), aria2 - это утилита для загрузки файлов. Поддерживаемые протоколы: HTTP(S),
FTP, BitTorrent и Metalink. aria2 может загрузить файл с разных FTP, SFTP, BitTorrent и Metalink. aria2 может загрузить файл с разных
источников/протоколов и пытается максимально использовать пропускную источников/протоколов и пытается максимально использовать пропускную
способность канала. Есть поддержка загрузки файла по протоколам HTTP(S)/FTP способность канала. Есть поддержка загрузки файла по протоколам
и BitTorrent одновременно, пока данные загружаются по HTTP(S)/FTP, они тут HTTP(S)/FTP/SFTP и BitTorrent одновременно, пока данные загружаются по
же могут выгружаться в BitTorrent-рой. Используя контрольные суммы блока HTTP(S)/FTP, они тут же могут выгружаться в BitTorrent-рой. Используя
данных для Metalink, aria2 автоматически проверяет части данных во время контрольные суммы блока данных для Metalink, aria2 автоматически проверяет
загрузки файла. части данных во время загрузки файла.
ПАРАМЕТРЫ ПАРАМЕТРЫ
--------- ---------
.. note::
Большинство связанных с FTP параметров применимы также к SFTP.
Некоторые параметры не являются эффективными по отношению к SFTP (например, :option:`--ftp-pasv`)
Основные параметры Основные параметры
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
.. option:: -d, --dir=<DIR> .. option:: -d, --dir=<DIR>
@ -89,8 +94,9 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
``#deprecated``, ``#help``, ``#all``. ``#deprecated``, ``#help``, ``#all``.
По умолчанию: ``#basic`` По умолчанию: ``#basic``
Параметры HTTP/FTP Параметры HTTP/FTP/SFTP
~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~
.. option:: --all-proxy=<PROXY> .. option:: --all-proxy=<PROXY>
Использовать указанный прокси-сервер для всех протоколов. Для отмены Использовать указанный прокси-сервер для всех протоколов. Для отмены
@ -197,6 +203,17 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
``1M`` -``1024M``. ``1M`` -``1024M``.
По умолчанию: ``20M`` По умолчанию: ``20M``
.. option:: --netrc-path=<FILE>
Указать путь к файлу .netrc.
По умолчанию: ``$(HOME)/.netrc``
.. note::
Права доступа к файлу .netrc должны быть равны 600. Иначе, файл
будет проигнорирован.
.. option:: -n, --no-netrc[=true|false] .. option:: -n, --no-netrc[=true|false]
Отключить поддержку netrc. Поддержка netrc по умолчанию Отключить поддержку netrc. Поддержка netrc по умолчанию
@ -544,8 +561,8 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
Задать клиентское приложение для HTTP(S)-загрузок. Задать клиентское приложение для HTTP(S)-загрузок.
По умолчанию: ``aria2/$VERSION``, $VERSION заменяется на версию пакета. По умолчанию: ``aria2/$VERSION``, $VERSION заменяется на версию пакета.
Специфические параметры FTP Специфические параметры FTP/SFTP
~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. option:: --ftp-user=<USER> .. option:: --ftp-user=<USER>
Задать пользователя для FTP. Задать пользователя для FTP.
@ -566,6 +583,10 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
то будет использован активный режим. то будет использован активный режим.
По умолчанию: ``true`` По умолчанию: ``true``
.. note::
Этот параметр игнорируется для SFTP-передачи.
.. option:: --ftp-proxy=<PROXY> .. option:: --ftp-proxy=<PROXY>
Использовать указанный прокси-сервер для FTP. Для отмены Использовать указанный прокси-сервер для FTP. Для отмены
@ -587,11 +608,25 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
двух: ``binary`` или ``ascii``. двух: ``binary`` или ``ascii``.
По умолчанию: ``binary`` По умолчанию: ``binary``
.. note::
Этот параметр игнорируется для SFTP-передачи.
.. option:: --ftp-reuse-connection[=true|false] .. option:: --ftp-reuse-connection[=true|false]
Повторно использовать FTP соединение. Повторно использовать FTP соединение.
По умолчанию: ``true`` По умолчанию: ``true``
.. option:: --ssh-host-key-md=<TYPE>=<DIGEST>
Задать контрольную сумму для публичного SSH-ключа хоста. TYPE - тип хэша.
Поддерживаемые типы хэшей - ``sha-1`` или ``md5``.
DIGEST - шестнадцатеричное значение хэша.
Например: ``sha-1=b030503d4de4539dc7885e6f0f5e256704edf4c3``.
Этот параметр может быть использован для проверки публичного ключа сервера
при использовании SFTP. Если параметр не задан (по умолчанию), то никакой
проверки не происходит.
Параметры BitTorrent/Metalink Параметры BitTorrent/Metalink
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. option:: --select-file=<INDEX>... .. option:: --select-file=<INDEX>...
@ -812,13 +847,15 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
.. option:: --dht-file-path=<PATH> .. option:: --dht-file-path=<PATH>
Заменять файл таблицы маршрутизации IPv4 DHT на PATH. Сменить путь к файлу таблицы маршрутизации IPv4 DHT на PATH.
По умолчанию: ``$HOME/.aria2/dht.dat`` По умолчанию: ``$HOME/.aria2/dht.dat`` если существует,
иначе ``$XDG_CACHE_HOME/aria2/dht.dat``.
.. option:: --dht-file-path6=<PATH> .. option:: --dht-file-path6=<PATH>
Заменять файл таблицы маршрутизации IPv6 DHT на PATH. Сменить путь к файлу таблицы маршрутизации IPv6 DHT на PATH.
По умолчанию: ``$HOME/.aria2/dht.dat`` По умолчанию: ``$HOME/.aria2/dht6.dat`` если существует,
иначе ``$XDG_CACHE_HOME/aria2/dht6.dat``.
.. option:: --dht-listen-addr6=<ADDR> .. option:: --dht-listen-addr6=<ADDR>
@ -1220,7 +1257,8 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
.. option:: --conf-path=<PATH> .. option:: --conf-path=<PATH>
Сменить путь к файлу конфигурации на PATH. Сменить путь к файлу конфигурации на PATH.
По умолчанию: ``$HOME/.aria2/aria2.conf`` По умолчанию: ``$HOME/.aria2/aria2.conf`` если существует,
иначе ``$XDG_CACHE_HOME/aria2/aria2.conf``.
.. option:: --console-log-level=<LEVEL> .. option:: --console-log-level=<LEVEL>
@ -1420,6 +1458,15 @@ FTP, BitTorrent и Metalink. aria2 может загрузить файл с р
Возможные значения: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2`` Возможные значения: ``SSLv3``, ``TLSv1``, ``TLSv1.1``, ``TLSv1.2``
По умолчанию: ``TLSv1`` По умолчанию: ``TLSv1``
.. option:: --multiple-interface=<INTERFACES>
Разделенный запятыми список интерфейсов для привязки сокетов.
Запросы будут разделяться между интерфейсами для достижения объединения
каналов. Вы можете указать имя интерфейса (например, eth0),
IP-адрес (например, 192.168.0.12) и имя хоста (например, myhost). Если
используется :option:`--interface`, то этот параметр будет проигнорирован.
Возможные значения: интерфейс, IP-адрес, имя хоста.
.. option:: --log-level=<LEVEL> .. option:: --log-level=<LEVEL>
Задать уровень вывода журнала событий. LEVEL может Задать уровень вывода журнала событий. LEVEL может
@ -1677,13 +1724,14 @@ Metalink-документов, которые хранятся на локаль
что они всегда будут обрабатываться как отдельная загрузка. Поддерживаются что они всегда будут обрабатываться как отдельная загрузка. Поддерживаются
оба формата: Metalink4 и Metalink версии 3.0. оба формата: Metalink4 и Metalink версии 3.0.
Вы можете указать вместе, torrent-файл с параметром -T и URI. Сделав это, вы Вы можете указать вместе, torrent-файл с параметром :option:`--torrent-file
можете загружать файл, используя torrent-рой и HTTP(S)/FTP-сервер <-T>` и URI. Сделав это, вы можете загружать файл, используя torrent-рой и
одновременно, пока данные из HTTP(S)/FTP выгружаются в torrent-рой. Для HTTP(S)/FTP/SFTP-сервер одновременно, пока данные из HTTP(S)/FTP/SFTP
однофайловых торрентов, URI может быть завершенным, который указывает на выгружаются в torrent-рой. Для однофайловых торрентов, URI может быть
ресурс, или же если заканчиваться символом /, тогда name (имя) в завершенным, который указывает на ресурс, или же если заканчиваться символом
torrent-файле будет добавлено. Для многофайловых торрентов, name (имя) и /, тогда name (имя) в torrent-файле будет добавлено. Для многофайловых
path (путь) в torrent-файле будут добавлены из URI для каждого файла. торрентов, name (имя) и path (путь) в torrent-файле будут добавлены из URI
для каждого файла.
.. note:: .. note::
@ -1715,15 +1763,16 @@ aria2 предоставляет параметры, в которых указ
:option:`--on-download-stop`. :option:`--on-download-stop`.
aria2 передает 3 аргумента указанной команды, которая выполняется. Это aria2 передает 3 аргумента указанной команды, которая выполняется. Это
аргументы: GID, количество файлов и путь к файлу. Для HTTP-, FTP-загрузок, аргументы: GID, количество файлов и путь к файлу. Для HTTP-, FTP- и
обычно количество файлов - 1. BitTorrent загрузка может содержать множество SFTP-загрузок, обычно количество файлов - 1. BitTorrent загрузка может
файлов. Если число файлов больше чем один, то путь к файлу будет для содержать множество файлов. Если число файлов больше чем один, то путь к
первого. Другими словами, это значение параметра path в первой структуре, файлу будет для первого. Другими словами, это значение параметра path в
определенный параметр которой имеет значение true (истина), в ответе первой структуре, определенный параметр которой имеет значение true
RPC-метода :func:`aria2.getFiles`. Если вы хотите получить все пути к (истина), в ответе RPC-метода :func:`aria2.getFiles`. Если вы хотите
файлам, то рассмотрите использование JSON-RPC/XML-RPC. Обратите внимание, получить все пути к файлам, то рассмотрите использование
что путь к файлу может меняться в процессе загрузки по HTTP из-за JSON-RPC/XML-RPC. Обратите внимание, что путь к файлу может меняться в
перенаправления или заголовка Content-Disposition. процессе загрузки по HTTP из-за перенаправления или заголовка
Content-Disposition.
Посмотрите пример, как аргументы передаются команде: Посмотрите пример, как аргументы передаются команде:
@ -1848,6 +1897,12 @@ RPC-метода :func:`aria2.getFiles`. Если вы хотите получи
30 30
Если aria2 не смогла проанализировать JSON-RPC-запрос. Если aria2 не смогла проанализировать JSON-RPC-запрос.
31
Зарезервировано. Не используется.
32
Если проверка контрольной суммы не удалась.
.. note:: .. note::
Ошибка, произошедшая в завершенной загрузке, не будет передана как код Ошибка, произошедшая в завершенной загрузке, не будет передана как код
@ -1895,9 +1950,10 @@ aria2 распознает следующие переменные окруже
aria2.conf aria2.conf
~~~~~~~~~~ ~~~~~~~~~~
По умолчанию, aria2 анализирует ``$HOME/.aria2/aria2.conf`` как По умолчанию, aria2 проверяет наличие ``$HOME/.aria2/aria2.conf`` по
конфигурационный файл. Вы можете указать путь к конфигурационному файлу в устаревшему пути, иначе анализируется ``$XDG_CONFIG_HOME/aria2/aria2.conf``
параметре :option:`--conf-path`. Если вы не хотите использовать как конфигурационный файл. Вы можете указать путь к конфигурационному файлу
в параметре :option:`--conf-path`. Если вы не хотите использовать
конфигурационный файл, используйте параметр :option:`--no-conf`. конфигурационный файл, используйте параметр :option:`--no-conf`.
Конфигурационный файл - это текстовый файл, содержащий один параметр в Конфигурационный файл - это текстовый файл, содержащий один параметр в
@ -1924,14 +1980,16 @@ aria2.conf
dht.dat dht.dat
~~~~~~~ ~~~~~~~
By default, the routing table of IPv4 DHT is saved to the path Если устаревшие пути к файлам ``$HOME/.aria2/dht.dat`` и
``$HOME/.aria2/dht.dat`` and the routing table of IPv6 DHT is saved to the ``$HOME/.aria2/dht6.dat`` указывают на несуществующие файлы, то таблица
path ``$HOME/.aria2/dht6.dat``. маршрутизации IPv4 DHT сохраняется в ``$XDG_CACHE_HOME/aria2/dht.dat``, а
таблица маршрутизации IPv6 DHT сохраняется в
``$XDG_CACHE_HOME/aria2/dht6.dat``.
Netrc Netrc
~~~~~ ~~~~~
Поддержка Netrc включена по умолчанию для HTTP(S)/FTP. Для отключения Поддержка Netrc включена по умолчанию для HTTP(S)/FTP/SFTP. Для отключения
поддержки netrc, укажите параметр :option:`--no-netrc <-n>`. Ваш файл .netrc поддержки netrc, укажите параметр :option:`--no-netrc <-n>`. Ваш файл .netrc
должен иметь соответствующие права (600). должен иметь соответствующие права (600).
@ -2098,6 +2156,7 @@ URI. Эти дополнительные строки должны начина
* :option:`seed-time <--seed-time>` * :option:`seed-time <--seed-time>`
* :option:`select-file <--select-file>` * :option:`select-file <--select-file>`
* :option:`split <-s>` * :option:`split <-s>`
* :option:`ssh-host-key-md <--ssh-host-key-md>`
* :option:`stream-piece-selector <--stream-piece-selector>` * :option:`stream-piece-selector <--stream-piece-selector>`
* :option:`timeout <-t>` * :option:`timeout <-t>`
* :option:`uri-selector <--uri-selector>` * :option:`uri-selector <--uri-selector>`
@ -2263,7 +2322,7 @@ RPC-метод `system.multicall` обрабатывается особым об
.. function:: aria2.addUri([secret], uris[, options[, position]]) .. function:: aria2.addUri([secret], uris[, options[, position]])
Этот метод добавляет новую загрузку. Параметр *uris* - это массив Этот метод добавляет новую загрузку. Параметр *uris* - это массив
HTTP(S)/FTP/BitTorrent Magnet URI (строки), указывающие на один и тот же HTTP(S)/FTP/SFTP/BitTorrent Magnet URI (строки), указывающие на один и тот же
ресурс. Если вы смешивайте URI, указывающие на разные ресурсы, то загрузка ресурс. Если вы смешивайте URI, указывающие на разные ресурсы, то загрузка
может неудачно завершиться или быть повреждена без жалоб со стороны aria2. может неудачно завершиться или быть повреждена без жалоб со стороны aria2.
При добавлении BitTorrent Magnet URI, *uris* должен содержать только один При добавлении BitTorrent Magnet URI, *uris* должен содержать только один
@ -2878,7 +2937,7 @@ RPC-метод `system.multicall` обрабатывается особым об
.. function:: aria2.getServers([secret], gid) .. function:: aria2.getServers([secret], gid)
Этот метод возвращает текущие подключенные HTTP(S)/FTP-серверы загрузки, Этот метод возвращает текущие подключенные HTTP(S)/FTP/SFTP-серверы загрузки,
которая обозначена *gid* (строка). Ответ - это массив структур, которые содержат которая обозначена *gid* (строка). Ответ - это массив структур, которые содержат
следующие ключи. Значения являются строками. следующие ключи. Значения являются строками.

View File

@ -5,7 +5,7 @@ From https://github.com/ryan-roemer/sphinx-bootstrap-theme.
""" """
import os import os
VERSION = (0, 1, 5) VERSION = (0, 1, 8)
__version__ = ".".join(str(v) for v in VERSION) __version__ = ".".join(str(v) for v in VERSION)
__version_full__ = __version__ __version_full__ = __version__

View File

@ -1,15 +1,23 @@
<ul class="wy-breadcrumbs"> <div role="navigation" aria-label="breadcrumbs navigation">
<li><a href="{{ pathto(master_doc) }}">Docs</a> &raquo;</li> <ul class="wy-breadcrumbs">
<li><a href="">{{ title }}</a></li> <li><a href="{{ pathto(master_doc) }}">Docs</a> &raquo;</li>
<li class="wy-breadcrumbs-aside"> {% for doc in parents %}
{% if display_github %} <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
<a href="https://github.com/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}.rst" class="icon icon-github"> Edit on GitHub</a> {% endfor %}
{% elif display_bitbucket %} <li>{{ title }}</li>
<a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}.rst'" class="icon icon-bitbucket"> Edit on Bitbucket</a> <li class="wy-breadcrumbs-aside">
{% elif show_source and has_source and sourcename %} {% if pagename != "search" %}
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> View page source</a> {% if display_github %}
{% endif %} <a href="https://{{ github_host|default("github.com") }}/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ source_suffix }}" class="fa fa-github"> Edit on GitHub</a>
</li> {% elif display_bitbucket %}
</ul> <a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ source_suffix }}" class="fa fa-bitbucket"> Edit on Bitbucket</a>
<hr/> {% elif show_source and source_url_prefix %}
<a href="{{ source_url_prefix }}{{ pagename }}{{ source_suffix }}">View page source</a>
{% elif show_source and has_source and sourcename %}
<a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> View page source</a>
{% endif %}
{% endif %}
</li>
</ul>
<hr/>
</div>

View File

@ -1,30 +1,36 @@
<footer> <footer>
{% if next or prev %} {% if next or prev %}
<div class="rst-footer-buttons"> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
{% if next %} {% if next %}
<a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}"/>Next <span class="icon icon-circle-arrow-right"></span></a> <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}" accesskey="n">Next <span class="fa fa-arrow-circle-right"></span></a>
{% endif %} {% endif %}
{% if prev %} {% if prev %}
<a href="{{ prev.link|e }}" class="btn btn-neutral" title="{{ prev.title|striptags|e }}"><span class="icon icon-circle-arrow-left"></span> Previous</a> <a href="{{ prev.link|e }}" class="btn btn-neutral" title="{{ prev.title|striptags|e }}" accesskey="p"><span class="fa fa-arrow-circle-left"></span> Previous</a>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
<hr/> <hr/>
<p> <div role="contentinfo">
{%- if show_copyright %} <p>
{%- if hasdoc('copyright') %} {%- if show_copyright %}
{% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %} {%- if hasdoc('copyright') %}
{%- else %} {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
{% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %} {%- else %}
{% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
{%- endif %}
{%- endif %} {%- endif %}
{%- if last_updated %}
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
{%- endif %}
</p>
</div>
{%- if show_sphinx %}
{% trans %}Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>{% endtrans %}.
{%- endif %} {%- endif %}
{%- if last_updated %}
{% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
{%- endif %}
</p>
{% trans %}<a href="https://www.github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="http://readthedocs.org">Read the Docs</a>{% endtrans %}
</footer> </footer>

View File

@ -12,6 +12,7 @@
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> <!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
{{ metatags }}
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
{% block htmltitle %} {% block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title> <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
@ -23,40 +24,28 @@
{% endif %} {% endif %}
{# CSS #} {# CSS #}
<link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
{# JS #} {# OPENSEARCH #}
{% if not embedded %} {% if not embedded %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }}
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% if use_opensearch %} {% if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/> <link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{% endif %} {% endif %}
{% endif %} {% endif %}
{# RTD hosts these file themselves, so just load on non RTD builds #} {# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %} {% if not READTHEDOCS %}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" /> <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
<script type="text/javascript" src="_static/js/theme.js"></script>
{% endif %} {% endif %}
{% for cssfile in css_files %} {% for cssfile in css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" /> <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %} {% endfor %}
{% for cssfile in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
{%- block linktags %} {%- block linktags %}
{%- if hasdoc('about') %} {%- if hasdoc('about') %}
<link rel="author" title="{{ _('About these documents') }}" <link rel="author" title="{{ _('About these documents') }}"
@ -85,29 +74,47 @@
{%- endblock %} {%- endblock %}
{%- block extrahead %} {% endblock %} {%- block extrahead %} {% endblock %}
<script src="//cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script> {# Keep modernizr in head - http://modernizr.com/docs/#installing #}
<script src="_static/js/modernizr.min.js"></script>
</head> </head>
<body class="wy-body-for-nav"> <body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav"> <div class="wy-grid-for-nav">
{# SIDE NAV, TOGGLES ON MOBILE #} {# SIDE NAV, TOGGLES ON MOBILE #}
<nav data-toggle="wy-nav-shift" class="wy-nav-side"> <nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-nav-search"> <div class="wy-side-nav-search">
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}</a> {% block sidebartitle %}
{% if logo and theme_logo_only %}
<a href="{{ pathto(master_doc) }}">
{% else %}
<a href="{{ pathto(master_doc) }}" class="icon icon-home"> {{ project }}
{% endif %}
{% if logo %}
{# Not strictly valid HTML, but it's the only way to display/scale it properly, without weird scripting or heaps of work #}
<img src="{{ pathto('_static/' + logo, 1) }}" class="logo" />
{% endif %}
</a>
{% include "searchbox.html" %} {% include "searchbox.html" %}
{% endblock %}
</div> </div>
<div class="wy-menu wy-menu-vertical" data-spy="affix"> <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
{% set toctree = toctree(maxdepth=2, collapse=False, includehidden=True) %} {% block menu %}
{% if toctree %} {% set toctree = toctree(maxdepth=4, collapse=False, includehidden=True) %}
{{ toctree }} {% if toctree %}
{% else %} {{ toctree }}
<!-- Local TOC --> {% else %}
<div class="local-toc">{{ toc }}</div> <!-- Local TOC -->
{% endif %} <div class="local-toc">{{ toc }}</div>
{% endif %}
{% endblock %}
</div> </div>
&nbsp; &nbsp;
</nav> </nav>
@ -115,8 +122,8 @@
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
{# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #} {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
<nav class="wy-nav-top"> <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="icon icon-reorder"></i> <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="{{ pathto(master_doc) }}">{{ project }}</a> <a href="{{ pathto(master_doc) }}">{{ project }}</a>
</nav> </nav>
@ -125,7 +132,9 @@
<div class="wy-nav-content"> <div class="wy-nav-content">
<div class="rst-content"> <div class="rst-content">
{% include "breadcrumbs.html" %} {% include "breadcrumbs.html" %}
{% block body %}{% endblock %} <div role="main" class="document">
{% block body %}{% endblock %}
</div>
{% include "footer.html" %} {% include "footer.html" %}
</div> </div>
</div> </div>
@ -134,5 +143,39 @@
</div> </div>
{% include "versions.html" %} {% include "versions.html" %}
{% if not embedded %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }}
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{% endif %}
{# STICKY NAVIGATION #}
{% if theme_sticky_navigation %}
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
{% endif %}
{%- block footer %} {% endblock %}
</body> </body>
</html> </html>

View File

@ -10,7 +10,7 @@
{%- extends "layout.html" %} {%- extends "layout.html" %}
{% set title = _('Search') %} {% set title = _('Search') %}
{% set script_files = script_files + ['_static/searchtools.js'] %} {% set script_files = script_files + ['_static/searchtools.js'] %}
{% block extrahead %} {% block footer %}
<script type="text/javascript"> <script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); }); jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script> </script>

View File

@ -1,5 +1,9 @@
<form id ="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get"> {%- if builder != 'singlehtml' %}
<input type="text" name="q" placeholder="Search docs" /> <div role="search">
<input type="hidden" name="check_keywords" value="yes" /> <form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
<input type="hidden" name="area" value="default" /> <input type="text" name="q" placeholder="Search docs" />
</form> <input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
{%- endif %}

View File

@ -1 +1,2 @@
.font-smooth,.icon:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:fontawesome-webfont;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#fontawesome-webfont") format("svg")}.icon:before{display:inline-block;font-family:fontawesome-webfont;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .icon{display:inline-block;text-decoration:inherit}li .icon{display:inline-block}li .icon-large:before,li .icon-large:before{width:1.875em}ul.icons{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.icons li .icon{width:0.8em}ul.icons li .icon-large:before,ul.icons li .icon-large:before{vertical-align:baseline}.icon-book:before{content:"\f02d"}.icon-caret-down:before{content:"\f0d7"}.icon-caret-up:before{content:"\f0d8"}.icon-caret-left:before{content:"\f0d9"}.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}} .fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}
/*# sourceMappingURL=badge_only.css.map */

View File

@ -0,0 +1,7 @@
{
"version": 3,
"mappings": "CAyDA,SAAY,EACV,qBAAsB,EAAE,UAAW,EAqDrC,QAAS,EARP,IAAK,EAAE,AAAC,EACR,+BAAS,EAEP,MAAO,EAAE,IAAK,EACd,MAAO,EAAE,CAAE,EACb,cAAO,EACL,IAAK,EAAE,GAAI,EC1Gb,SAkBC,EAjBC,UAAW,ECFJ,UAAW,EDGlB,UAAW,EAHqC,KAAM,EAItD,SAAU,EAJsD,KAAM,EAapE,EAAG,EAAE,qCAAwB,EAC7B,EAAG,EAAE,0PAAyE,ECZpF,SAAU,EACR,MAAO,EAAE,WAAY,EACrB,UAAW,EAAE,UAAW,EACxB,SAAU,EAAE,KAAM,EAClB,UAAW,EAAE,KAAM,EACnB,UAAW,EAAE,AAAC,EACd,cAAe,EAAE,MAAO,EAG1B,IAAK,EACH,MAAO,EAAE,WAAY,EACrB,cAAe,EAAE,MAAO,EAIxB,KAAG,EACD,MAAO,EAAE,WAAY,EACvB,sCAAiB,EAGf,IAAK,EAAE,MAAY,EAEvB,KAAM,EACJ,cAAe,EAAE,GAAI,EACrB,UAAW,EAAE,EAAG,EAChB,UAAW,EAAE,KAAM,EAEjB,YAAG,EACD,IAAK,EAAE,IAAI,EACb,oDAAiB,EAGf,aAAc,EAAE,OAAQ,EAG9B,cAAe,EACb,MAAO,EAAE,EAAO,EAElB,gBAAiB,EACf,MAAO,EAAE,EAAO,EAElB,oBAAqB,EACnB,MAAO,EAAE,EAAO,EAElB,sBAAuB,EACrB,MAAO,EAAE,EAAO,EAElB,kBAAmB,EACjB,MAAO,EAAE,EAAO,EAElB,oBAAqB,EACnB,MAAO,EAAE,EAAO,EAElB,oBAAqB,EACnB,MAAO,EAAE,EAAO,EAElB,sBAAuB,EACrB,MAAO,EAAE,EAAO,EAElB,qBAAsB,EACpB,MAAO,EAAE,EAAO,EAElB,uBAAwB,EACtB,MAAO,EAAE,EAAO,ECnElB,YAAa,EACX,OAAQ,EAAE,IAAK,EACf,KAAM,EAAE,AAAC,EACT,GAAI,EAAE,AAAC,EACP,IAAK,EC6E+B,IAAK,ED5EzC,IAAK,ECE+B,MAAyB,EDD7D,SAAU,EAAE,MAAkC,EAC9C,SAAU,EAAE,iBAAiC,EAC7C,UAAW,EEAyB,sDAAM,EFC1C,MAAO,EC+E6B,EAAG,ED9EvC,cAAC,EACC,IAAK,ECqE6B,MAAW,EDpE7C,cAAe,EAAE,GAAI,EACvB,6BAAgB,EACd,MAAO,EAAE,GAAI,EACf,iCAAoB,EAClB,MAAO,EAAE,GAAqB,EAC9B,eAAgB,EAAE,MAAkC,EACpD,MAAO,EAAE,IAAK,EACd,SAAU,EAAE,IAAK,EACjB,QAAS,EAAE,EAAG,EACd,KAAM,EAAE,MAAO,EACf,IAAK,ECiD6B,MAAM,EJgC1C,IAAK,EAAE,AAAC,EACR,iFAAS,EAEP,MAAO,EAAE,IAAK,EACd,MAAO,EAAE,CAAE,EACb,uCAAO,EACL,IAAK,EAAE,GAAI,EGrFX,qCAAG,EACD,IAAK,EClB2B,MAAyB,EDmB3D,0CAAQ,EACN,IAAK,EAAE,GAAI,EACb,4CAAU,EACR,IAAK,EAAE,GAAI,EACb,iDAAiB,EACf,eAAgB,ECQgB,MAAI,EDPpC,IAAK,EC0B2B,GAAM,EDzBxC,wDAAwB,EACtB,eAAgB,ECXgB,MAAO,EDYvC,IAAK,ECzB2B,GAAI,ED0BxC,yCAA8B,EAC5B,MAAO,EAAE,IAAK,EAChB,gCAAmB,EACjB,QAAS,EAAE,EAAG,EACd,MAAO,EAAE,GAAqB,EAC9B,IAAK,ECE6B,GAAwB,EDD1D,MAAO,EAAE,GAAI,EACb,mCAAE,EACA,MAAO,EAAE,IAAK,EACd,KAAM,EAAE,EAAG,EACX,KAAM,EAAE,AAAC,EACT,KAAM,EAAE,KAAM,EACd,MAAO,EAAE,AAAC,EACV,SAAU,EAAE,gBAA6C,EAC3D,mCAAE,EACA,MAAO,EAAE,WAAY,EACrB,KAAM,EAAE,AAAC,EACT,qCAAC,EACC,MAAO,EAAE,WAAY,EACrB,MAAO,EAAE,EAAqB,EAC9B,IAAK,ECjDyB,MAAyB,EDkD7D,sBAAW,EACT,IAAK,EAAE,GAAI,EACX,KAAM,EAAE,GAAI,EACZ,IAAK,EAAE,GAAI,EACX,GAAI,EAAE,GAAI,EACV,KAAM,EAAE,GAAI,EACZ,QAAS,ECkByB,IAAK,EDjBvC,iCAAU,EACR,IAAK,EAAE,GAAI,EACb,+BAAQ,EACN,IAAK,EAAE,GAAI,EACb,oDAA+B,EAC7B,SAAU,EAAE,IAAK,EACjB,6DAAQ,EACN,IAAK,EAAE,GAAI,EACb,+DAAU,EACR,IAAK,EAAE,GAAI,EACf,2CAAoB,EAClB,IAAK,EAAE,GAAI,EACX,KAAM,EAAE,GAAI,EACZ,UAAW,EAAE,GAAI,EACjB,MAAO,EAAE,IAAuB,EAChC,MAAO,EAAE,IAAK,EACd,SAAU,EAAE,KAAM,EGhDpB,mCAAsB,EHmDxB,YAAa,EACX,IAAK,EAAE,EAAG,EACV,MAAO,EAAE,GAAI,EACb,kBAAO,EACL,MAAO,EAAE,IAAK,EAClB,EAAG,EACD,IAAK,EAAE,GAAI,EACX,KAAM,EAAE,GAAI",
"sources": ["../../../bower_components/wyrm/sass/wyrm_core/_mixin.sass","../../../bower_components/bourbon/dist/css3/_font-face.scss","../../../sass/_theme_badge_fa.sass","../../../sass/_theme_badge.sass","../../../bower_components/wyrm/sass/wyrm_core/_wy_variables.sass","../../../sass/_theme_variables.sass","../../../bower_components/neat/app/assets/stylesheets/grid/_media.scss"],
"names": [],
"file": "badge_only.css"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -280,8 +280,8 @@
<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" /> <glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" /> <glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " /> <glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
<glyph unicode="&#xf116;" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" /> <glyph unicode="&#xf116;" horiz-adv-x="1792" />
<glyph unicode="&#xf117;" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" /> <glyph unicode="&#xf117;" horiz-adv-x="1792" />
<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
@ -310,7 +310,7 @@
<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" /> <glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" /> <glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" /> <glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" /> <glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" /> <glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
@ -342,7 +342,7 @@
<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" /> <glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" /> <glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" /> <glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
<glyph unicode="&#xf158;" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" /> <glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" /> <glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" /> <glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" /> <glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
@ -390,10 +390,25 @@
<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" /> <glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" /> <glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" /> <glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
<glyph unicode="&#xf18b;" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" /> <glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
<glyph unicode="&#xf18c;" horiz-adv-x="1792" /> <glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
<glyph unicode="&#xf18d;" horiz-adv-x="1792" /> <glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
<glyph unicode="&#xf18e;" horiz-adv-x="1792" /> <glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
<glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
<glyph unicode="&#xf197;" horiz-adv-x="1792" />
<glyph unicode="&#xf198;" horiz-adv-x="1792" />
<glyph unicode="&#xf199;" horiz-adv-x="1792" />
<glyph unicode="&#xf19a;" horiz-adv-x="1792" />
<glyph unicode="&#xf19b;" horiz-adv-x="1792" />
<glyph unicode="&#xf19c;" horiz-adv-x="1792" />
<glyph unicode="&#xf19d;" horiz-adv-x="1792" />
<glyph unicode="&#xf19e;" horiz-adv-x="1792" />
<glyph unicode="&#xf500;" horiz-adv-x="1792" /> <glyph unicode="&#xf500;" horiz-adv-x="1792" />
</font> </font>
</defs></svg> </defs></svg>

Before

Width:  |  Height:  |  Size: 193 KiB

After

Width:  |  Height:  |  Size: 197 KiB

File diff suppressed because one or more lines are too long

View File

@ -1,16 +1,113 @@
$( document ).ready(function() { function toggleCurrent (elem) {
// Shift nav in mobile when clicking the menu. var parent_li = elem.closest('li');
$("[data-toggle='wy-nav-top']").click(function() { parent_li.siblings('li.current').removeClass('current');
$("[data-toggle='wy-nav-shift']").toggleClass("shift"); parent_li.siblings().find('li.current').removeClass('current');
$("[data-toggle='rst-versions']").toggleClass("shift"); parent_li.find('> ul li.current').removeClass('current');
}); parent_li.toggleClass('current');
// Close menu when you click a link. }
$(".wy-menu-vertical .current ul li a").click(function() {
$("[data-toggle='wy-nav-shift']").removeClass("shift"); $(document).ready(function() {
$("[data-toggle='rst-versions']").toggleClass("shift"); // Shift nav in mobile when clicking the menu.
}); $(document).on('click', "[data-toggle='wy-nav-top']", function() {
$("[data-toggle='rst-current-version']").click(function() { $("[data-toggle='wy-nav-shift']").toggleClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift-up"); $("[data-toggle='rst-versions']").toggleClass("shift");
}); });
$("table.docutils:not(.field-list").wrap("<div class='wy-table-responsive'></div>"); // Nav menu link click operations
$(document).on('click', ".wy-menu-vertical .current ul li a", function() {
var target = $(this);
// Close menu when you click a link.
$("[data-toggle='wy-nav-shift']").removeClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
// Handle dynamic display of l3 and l4 nav lists
toggleCurrent(target);
if (typeof(window.SphinxRtdTheme) != 'undefined') {
window.SphinxRtdTheme.StickyNav.hashChange();
}
});
$(document).on('click', "[data-toggle='rst-current-version']", function() {
$("[data-toggle='rst-versions']").toggleClass("shift-up");
});
// Make tables responsive
$("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
// Add expand links to all parents of nested ul
$('.wy-menu-vertical ul').siblings('a').each(function () {
var link = $(this);
expand = $('<span class="toctree-expand"></span>');
expand.on('click', function (ev) {
toggleCurrent(link);
ev.stopPropagation();
return false;
});
link.prepend(expand);
});
}); });
// Sphinx theme state
window.SphinxRtdTheme = (function (jquery) {
var stickyNav = (function () {
var navBar,
win,
winScroll = false,
linkScroll = false,
winPosition = 0,
enable = function () {
init();
reset();
win.on('hashchange', reset);
// Set scrolling
win.on('scroll', function () {
if (!linkScroll) {
winScroll = true;
}
});
setInterval(function () {
if (winScroll) {
winScroll = false;
var newWinPosition = win.scrollTop(),
navPosition = navBar.scrollTop(),
newNavPosition = navPosition + (newWinPosition - winPosition);
navBar.scrollTop(newNavPosition);
winPosition = newWinPosition;
}
}, 25);
},
init = function () {
navBar = jquery('nav.wy-nav-side:first');
win = jquery(window);
},
reset = function () {
// Get anchor from URL and open up nested nav
var anchor = encodeURI(window.location.hash);
if (anchor) {
try {
var link = $('.wy-menu-vertical')
.find('[href="' + anchor + '"]');
$('.wy-menu-vertical li.toctree-l1 li.current')
.removeClass('current');
link.closest('li.toctree-l2').addClass('current');
link.closest('li.toctree-l3').addClass('current');
link.closest('li.toctree-l4').addClass('current');
}
catch (err) {
console.log("Error expanding nav for anchor", err);
}
}
},
hashChange = function () {
linkScroll = true;
win.one('hashchange', function () {
linkScroll = false;
});
};
jquery(init);
return {
enable: enable,
hashChange: hashChange
};
}());
return {
StickyNav: stickyNav
};
}($));

View File

@ -5,3 +5,5 @@ stylesheet = css/theme.css
[options] [options]
typekit_id = hiw1hhg typekit_id = hiw1hhg
analytics_id = analytics_id =
sticky_navigation = False
logo_only =

View File

@ -1,10 +1,10 @@
{% if READTHEDOCS %} {% if READTHEDOCS %}
{# Add rst-badge after rst-versions for small badge style. #} {# Add rst-badge after rst-versions for small badge style. #}
<div class="rst-versions" data-toggle="rst-versions"> <div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
<span class="rst-current-version" data-toggle="rst-current-version"> <span class="rst-current-version" data-toggle="rst-current-version">
<span class="icon icon-book"> Read the Docs</span> <span class="fa fa-book"> Read the Docs</span>
v: {{ current_version }} v: {{ current_version }}
<span class="icon icon-caret-down"></span> <span class="fa fa-caret-down"></span>
</span> </span>
<div class="rst-other-versions"> <div class="rst-other-versions">
<dl> <dl>

View File

@ -123,9 +123,9 @@ cares_confflags = "--enable-optimize=$(OPTFLAGS)"
cares_cflags=$(LTO_FLAGS) cares_cflags=$(LTO_FLAGS)
cares_ldflags=$(CFLAGS) $(LTO_FLAGS) cares_ldflags=$(CFLAGS) $(LTO_FLAGS)
sqlite_version = autoconf-3080500 sqlite_version = autoconf-3081002
sqlite_hash = 7f667e10ccebc26ab2086b8a30cb0a600ca0acae sqlite_hash = c2f2c17d3dc4c4e179d35cc04e4420636d48a152
sqlite_url = http://sqlite.org/2014/sqlite-$(sqlite_version).tar.gz sqlite_url = http://sqlite.org/2015/sqlite-$(sqlite_version).tar.gz
sqlite_cflags=$(LTO_FLAGS) sqlite_cflags=$(LTO_FLAGS)
sqlite_ldflags=$(CFLAGS) $(LTO_FLAGS) sqlite_ldflags=$(CFLAGS) $(LTO_FLAGS)

View File

@ -53,6 +53,23 @@ HOST=i686-w64-mingw32
HOST=x86_64-w64-mingw32 HOST=x86_64-w64-mingw32
The configure command-line is the same as i686 version. The configure command-line is the same as i686 version.
libssh2
-------
HOST=i686-w64-mingw32
./configure \
--disable-shared \
--enable-static \
--prefix=/usr/local/$HOST \
--host=$HOST \
--build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
--without-openssl \
--with-wincng \
LIBS="-lws2_32"
HOST=x86_64-w64-mingw32
The configure command-line is the same as i686 version.
Zlib Zlib
---- ----

View File

@ -52,6 +52,7 @@
# * expat # * expat
# * sqlite3 # * sqlite3
# * zlib # * zlib
# * libssh2
# * cppunit # * cppunit
test -z "$HOST" && HOST=i686-w64-mingw32 test -z "$HOST" && HOST=i686-w64-mingw32
@ -70,6 +71,7 @@ test -z "$PREFIX" && PREFIX=/usr/local/$HOST
--with-libexpat \ --with-libexpat \
--with-libz \ --with-libz \
--with-libgmp \ --with-libgmp \
--with-libssh2 \
--without-libgcrypt \ --without-libgcrypt \
--without-libnettle \ --without-libnettle \
--with-cppunit-prefix=$PREFIX \ --with-cppunit-prefix=$PREFIX \

View File

@ -237,7 +237,7 @@ bool AbstractCommand::execute()
if (req_ && fileEntry_->getLength() > 0 && if (req_ && fileEntry_->getLength() > 0 &&
e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit() == 0 && e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit() == 0 &&
requestGroup_->getMaxDownloadSpeedLimit() == 0 && requestGroup_->getMaxDownloadSpeedLimit() == 0 &&
serverStatTimer_.difference(global::wallclock()) >= 10) { serverStatTimer_.difference(global::wallclock()) >= 10_s) {
serverStatTimer_ = global::wallclock(); serverStatTimer_ = global::wallclock();
std::vector<std::pair<size_t, std::string>> usedHosts; std::vector<std::pair<size_t, std::string>> usedHosts;
if (getOption()->getAsBool(PREF_SELECT_LEAST_USED_HOST)) { if (getOption()->getAsBool(PREF_SELECT_LEAST_USED_HOST)) {
@ -284,7 +284,7 @@ bool AbstractCommand::execute()
A2_LOG_DEBUG("All segments are ignored."); A2_LOG_DEBUG("All segments are ignored.");
// This will execute other idle Commands and let them // This will execute other idle Commands and let them
// finish quickly. // finish quickly.
e_->setRefreshInterval(0); e_->setRefreshInterval(std::chrono::milliseconds(0));
return true; return true;
} }
@ -386,7 +386,8 @@ bool AbstractCommand::execute()
} }
Timer wakeTime(global::wallclock()); Timer wakeTime(global::wallclock());
wakeTime.advance(getOption()->getAsInt(PREF_RETRY_WAIT)); wakeTime.advance(
std::chrono::seconds(getOption()->getAsInt(PREF_RETRY_WAIT)));
req_->setWakeTime(wakeTime); req_->setWakeTime(wakeTime);
return prepareForRetry(0); return prepareForRetry(0);
} }
@ -401,7 +402,7 @@ bool AbstractCommand::execute()
A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, err); A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, err);
} }
requestGroup_->setHaltRequested(true); requestGroup_->setHaltRequested(true);
getDownloadEngine()->setRefreshInterval(0); getDownloadEngine()->setRefreshInterval(std::chrono::milliseconds(0));
return true; return true;
} }
} }
@ -457,7 +458,7 @@ bool AbstractCommand::prepareForRetry(time_t wait)
} }
else { else {
// We don't use wait so that Command can be executed by // We don't use wait so that Command can be executed by
// DownloadEngine::setRefreshInterval(0). // DownloadEngine::setRefreshInterval(std::chrono::milliseconds(0)).
command->setStatus(Command::STATUS_INACTIVE); command->setStatus(Command::STATUS_INACTIVE);
} }
e_->addCommand(std::move(command)); e_->addCommand(std::move(command));
@ -515,14 +516,12 @@ void AbstractCommand::onAbort()
getPieceStorage()->markPiecesDone(0); getPieceStorage()->markPiecesDone(0);
std::vector<std::string> uris; std::vector<std::string> uris;
uris.reserve(res.size()); uris.reserve(res.size());
std::transform(res.begin(), std::transform(std::begin(res), std::end(res), std::back_inserter(uris),
res.end(),
std::back_inserter(uris),
std::mem_fn(&URIResult::getURI)); std::mem_fn(&URIResult::getURI));
A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - %lu URIs found.", A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - %lu URIs found.",
getCuid(), getCuid(),
static_cast<unsigned long int>(uris.size()))); static_cast<unsigned long int>(uris.size())));
fileEntry_->addUris(uris.begin(), uris.end()); fileEntry_->addUris(std::begin(uris), std::end(uris));
getSegmentMan()->recognizeSegmentFor(fileEntry_); getSegmentMan()->recognizeSegmentFor(fileEntry_);
} }
@ -677,7 +676,7 @@ std::string getProxyUri(const std::string& protocol, const Option* option)
option); option);
} }
if (protocol == "ftp") { if (protocol == "ftp" || protocol == "sftp") {
return getProxyOptionFor return getProxyOptionFor
(PREF_FTP_PROXY, PREF_FTP_PROXY_USER, PREF_FTP_PROXY_PASSWD, option); (PREF_FTP_PROXY, PREF_FTP_PROXY_USER, PREF_FTP_PROXY_PASSWD, option);
} }
@ -700,8 +699,8 @@ namespace {
bool inNoProxy(const std::shared_ptr<Request>& req, const std::string& noProxy) bool inNoProxy(const std::shared_ptr<Request>& req, const std::string& noProxy)
{ {
std::vector<Scip> entries; std::vector<Scip> entries;
util::splitIter util::splitIter(std::begin(noProxy), std::end(noProxy),
(noProxy.begin(), noProxy.end(), std::back_inserter(entries), ',', true); std::back_inserter(entries), ',', true);
if (entries.empty()) { if (entries.empty()) {
return false; return false;
} }
@ -773,10 +772,8 @@ std::string AbstractCommand::resolveHostname(std::vector<std::string>& addrs,
e_->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port); e_->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port);
if (!addrs.empty()) { if (!addrs.empty()) {
auto ipaddr = addrs.front(); auto ipaddr = addrs.front();
A2_LOG_INFO(fmt(MSG_DNS_CACHE_HIT, A2_LOG_INFO(fmt(MSG_DNS_CACHE_HIT, getCuid(), hostname.c_str(),
getCuid(), strjoin(std::begin(addrs), std::end(addrs), ", ").c_str()));
hostname.c_str(),
strjoin(addrs.begin(), addrs.end(), ", ").c_str()));
return ipaddr; return ipaddr;
} }
@ -823,10 +820,8 @@ std::string AbstractCommand::resolveHostname(std::vector<std::string>& addrs,
} }
res.resolve(addrs, hostname); res.resolve(addrs, hostname);
} }
A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE, A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE, getCuid(), hostname.c_str(),
getCuid(), strjoin(std::begin(addrs), std::end(addrs), ", ").c_str()));
hostname.c_str(),
strjoin(addrs.begin(), addrs.end(), ", ").c_str()));
for (const auto& addr : addrs) { for (const auto& addr : addrs) {
e_->cacheIPAddress(hostname, addr, port); e_->cacheIPAddress(hostname, addr, port);
} }
@ -883,7 +878,8 @@ bool AbstractCommand::checkIfConnectionEstablished
const std::string& const std::string&
AbstractCommand::resolveProxyMethod(const std::string& protocol) const AbstractCommand::resolveProxyMethod(const std::string& protocol) const
{ {
if (getOption()->get(PREF_PROXY_METHOD) == V_TUNNEL || protocol == "https") { if (getOption()->get(PREF_PROXY_METHOD) == V_TUNNEL || protocol == "https" ||
protocol == "sftp") {
return V_TUNNEL; return V_TUNNEL;
} }
return V_GET; return V_GET;

View File

@ -83,7 +83,7 @@ private:
Timer checkPoint_; Timer checkPoint_;
Timer serverStatTimer_; Timer serverStatTimer_;
time_t timeout_; std::chrono::seconds timeout_;
bool checkSocketIsReadable_; bool checkSocketIsReadable_;
bool checkSocketIsWritable_; bool checkSocketIsWritable_;
@ -185,14 +185,14 @@ public:
// check. // check.
void swapSocket(std::shared_ptr<SocketCore>& socket); void swapSocket(std::shared_ptr<SocketCore>& socket);
time_t getTimeout() const std::chrono::seconds getTimeout() const
{ {
return timeout_; return timeout_;
} }
void setTimeout(time_t timeout) void setTimeout(std::chrono::seconds timeout)
{ {
timeout_ = timeout; timeout_ = std::move(timeout);
} }
void prepareForNextAction(std::unique_ptr<CheckIntegrityEntry> checkEntry); void prepareForNextAction(std::unique_ptr<CheckIntegrityEntry> checkEntry);

View File

@ -119,7 +119,7 @@ bool AbstractHttpServerResponseCommand::execute()
afterSend(httpServer_, e_); afterSend(httpServer_, e_);
return true; return true;
} else { } else {
if(timeoutTimer_.difference(global::wallclock()) >= 30) { if (timeoutTimer_.difference(global::wallclock()) >= 30_s) {
A2_LOG_INFO(fmt("CUID#%" PRId64 A2_LOG_INFO(fmt("CUID#%" PRId64
" - HttpServer: Timeout while trasmitting response.", " - HttpServer: Timeout while trasmitting response.",
getCuid())); getCuid()));

View File

@ -64,7 +64,7 @@ AbstractProxyRequestCommand::AbstractProxyRequestCommand
(std::make_shared<HttpConnection> (std::make_shared<HttpConnection>
(cuid, s, std::make_shared<SocketRecvBuffer>(s))) (cuid, s, std::make_shared<SocketRecvBuffer>(s)))
{ {
setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)); setTimeout(std::chrono::seconds(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)));
disableReadCheckSocket(); disableReadCheckSocket();
setWriteCheckSocket(getSocket()); setWriteCheckSocket(getSocket());
} }

View File

@ -101,7 +101,7 @@ void AbstractSingleDiskAdaptor::writeCache(const WrDiskCacheEntry* entry)
// activity especially on Windows 7 NTFS. In this code, we assume // activity especially on Windows 7 NTFS. In this code, we assume
// that maximum length of DataCell data is 16KiB to simplify the // that maximum length of DataCell data is 16KiB to simplify the
// code. // code.
unsigned char buf[16*1024]; unsigned char buf[16_k];
int64_t start = 0; int64_t start = 0;
size_t buflen = 0; size_t buflen = 0;
size_t buffoffset = 0; size_t buffoffset = 0;

View File

@ -60,10 +60,10 @@ ActivePeerConnectionCommand::ActivePeerConnectionCommand
(cuid_t cuid, (cuid_t cuid,
RequestGroup* requestGroup, RequestGroup* requestGroup,
DownloadEngine* e, DownloadEngine* e,
time_t interval) std::chrono::seconds interval)
: Command(cuid), : Command(cuid),
requestGroup_(requestGroup), requestGroup_(requestGroup),
interval_(interval), interval_(std::move(interval)),
e_(e), e_(e),
numNewConnection_(5) numNewConnection_(5)
{ {

View File

@ -59,7 +59,7 @@ private:
std::shared_ptr<PeerStorage> peerStorage_; std::shared_ptr<PeerStorage> peerStorage_;
std::shared_ptr<BtAnnounce> btAnnounce_; std::shared_ptr<BtAnnounce> btAnnounce_;
time_t interval_; // UNIT: sec std::chrono::seconds interval_;
DownloadEngine* e_; DownloadEngine* e_;
Timer checkPoint_; Timer checkPoint_;
int numNewConnection_; // the number of the connection to establish. int numNewConnection_; // the number of the connection to establish.
@ -67,7 +67,7 @@ public:
ActivePeerConnectionCommand(cuid_t cuid, ActivePeerConnectionCommand(cuid_t cuid,
RequestGroup* requestGroup, RequestGroup* requestGroup,
DownloadEngine* e, DownloadEngine* e,
time_t interval); std::chrono::seconds interval);
virtual ~ActivePeerConnectionCommand(); virtual ~ActivePeerConnectionCommand();

View File

@ -61,8 +61,8 @@ void AdaptiveFileAllocationIterator::allocateChunk()
try { try {
A2_LOG_DEBUG("Testing file system supports fallocate."); A2_LOG_DEBUG("Testing file system supports fallocate.");
if(offset_ < totalLength_) { if(offset_ < totalLength_) {
int64_t len = std::min(totalLength_-offset_, int64_t len =
static_cast<int64_t>(4096)); std::min(totalLength_ - offset_, static_cast<int64_t>(4_k));
stream_->allocate(offset_, len, false); stream_->allocate(offset_, len, false);
offset_ += len; offset_ += len;
} }

View File

@ -90,12 +90,16 @@ std::string AdaptiveURISelector::select
std::string selected = selectOne(uris); std::string selected = selectOne(uris);
if(selected != A2STR::NIL) if(selected != A2STR::NIL) {
uris.erase(std::find(uris.begin(), uris.end(), selected)); uris.erase(std::find(std::begin(uris), std::end(uris), selected));
}
return selected; return selected;
} }
namespace {
constexpr auto MAX_TIMEOUT = 60_s;
} // namespace
void AdaptiveURISelector::mayRetryWithIncreasedTimeout(FileEntry* fileEntry) void AdaptiveURISelector::mayRetryWithIncreasedTimeout(FileEntry* fileEntry)
{ {
if (requestGroup_->getTimeout()*2 >= MAX_TIMEOUT) return; if (requestGroup_->getTimeout()*2 >= MAX_TIMEOUT) return;
@ -105,16 +109,16 @@ void AdaptiveURISelector::mayRetryWithIncreasedTimeout(FileEntry* fileEntry)
// looking for retries // looking for retries
std::deque<URIResult> timeouts; std::deque<URIResult> timeouts;
fileEntry->extractURIResult(timeouts, error_code::TIME_OUT); fileEntry->extractURIResult(timeouts, error_code::TIME_OUT);
std::transform(timeouts.begin(), timeouts.end(), std::back_inserter(uris), std::transform(std::begin(timeouts), std::end(timeouts),
std::mem_fn(&URIResult::getURI)); std::back_inserter(uris), std::mem_fn(&URIResult::getURI));
if(A2_LOG_DEBUG_ENABLED) { if(A2_LOG_DEBUG_ENABLED) {
for(std::deque<std::string>::const_iterator i = uris.begin(), for (const auto& uri : uris) {
eoi = uris.end(); i != eoi; ++i) { A2_LOG_DEBUG(
A2_LOG_DEBUG(fmt("AdaptiveURISelector: will retry server with increased" fmt("AdaptiveURISelector: will retry server with increased"
" timeout (%ld s): %s", " timeout (%ld s): %s",
static_cast<long int>(requestGroup_->getTimeout()), static_cast<long int>(requestGroup_->getTimeout().count()),
(*i).c_str())); uri.c_str()));
} }
} }
} }
@ -222,7 +226,7 @@ void AdaptiveURISelector::adjustLowestSpeedLimit
int lowest = int lowest =
requestGroup_->getOption()->getAsInt(PREF_LOWEST_SPEED_LIMIT); requestGroup_->getOption()->getAsInt(PREF_LOWEST_SPEED_LIMIT);
if (lowest > 0) { if (lowest > 0) {
int low_lowest = 4 * 1024; int low_lowest = 4_k;
int max = getMaxDownloadSpeed(uris); int max = getMaxDownloadSpeed(uris);
if (max > 0 && lowest > max / 4) { if (max > 0 && lowest > max / 4) {
A2_LOG_NOTICE(fmt(_("Lowering lowest-speed-limit since known max speed is" A2_LOG_NOTICE(fmt(_("Lowering lowest-speed-limit since known max speed is"
@ -300,7 +304,7 @@ std::string AdaptiveURISelector::selectRandomUri
(const std::deque<std::string>& uris) const (const std::deque<std::string>& uris) const
{ {
int pos = SimpleRandomizer::getInstance()->getRandomNumber(uris.size()); int pos = SimpleRandomizer::getInstance()->getRandomNumber(uris.size());
auto i = uris.begin(); auto i = std::begin(uris);
i = i+pos; i = i+pos;
return *i; return *i;
} }
@ -331,7 +335,7 @@ std::string AdaptiveURISelector::getFirstToTestUri
power = (int)pow(2.0, (float)counter); power = (int)pow(2.0, (float)counter);
/* We test the mirror another time if it has not been /* We test the mirror another time if it has not been
* tested since 2^counter days */ * tested since 2^counter days */
if(ss->getLastUpdated().difference() > power*24*60*60) { if(ss->getLastUpdated().difference() > std::chrono::hours(power * 24)) {
return u; return u;
} }
} }

View File

@ -38,6 +38,7 @@
#include "URISelector.h" #include "URISelector.h"
#include <memory> #include <memory>
#include <chrono>
namespace aria2 { namespace aria2 {
@ -53,8 +54,6 @@ private:
int nbServerToEvaluate_; int nbServerToEvaluate_;
int nbConnections_; int nbConnections_;
static const time_t MAX_TIMEOUT = 60;
void mayRetryWithIncreasedTimeout(FileEntry* fileEntry); void mayRetryWithIncreasedTimeout(FileEntry* fileEntry);
std::string selectOne(const std::deque<std::string>& uris); std::string selectOne(const std::deque<std::string>& uris);

View File

@ -222,8 +222,8 @@ void AnnounceList::moveToCompletedAllowedTier() {
void AnnounceList::shuffle() { void AnnounceList::shuffle() {
for (const auto& tier: tiers_) { for (const auto& tier: tiers_) {
auto& urls = tier->urls; auto& urls = tier->urls;
std::random_shuffle(std::begin(urls), std::end(urls), std::shuffle(std::begin(urls), std::end(urls),
*SimpleRandomizer::getInstance()); *SimpleRandomizer::getInstance());
} }
} }

View File

@ -111,7 +111,8 @@ static inline bool isWhitespace(char c)
static inline std::string stripWhitespace(std::string str) static inline std::string stripWhitespace(std::string str)
{ {
str.erase(std::remove_if(str.begin(), str.end(), isWhitespace), str.end()); str.erase(std::remove_if(std::begin(str), std::end(str), isWhitespace),
std::end(str));
return str; return str;
} }
@ -185,9 +186,9 @@ bool checkIdentity(const SecIdentityRef id,
// future-proof. Also "usually" doesn't cut it; there is already software // future-proof. Also "usually" doesn't cut it; there is already software
// using SHA-2 class algos, and SHA-3 is standardized and potential users // using SHA-2 class algos, and SHA-3 is standardized and potential users
// cannot be far. // cannot be far.
return std::find_if(supported.begin(), return std::find_if(std::begin(supported), std::end(supported),
supported.end(), hash_finder(data.get(), fingerPrint)) !=
hash_finder(data.get(), fingerPrint)) != supported.end(); std::end(supported);
} }
#endif // defined(__MAC_10_6) #endif // defined(__MAC_10_6)
@ -243,11 +244,12 @@ bool AppleTLSContext::tryAsFingerprint(const std::string& fingerprint)
{ {
auto fp = stripWhitespace(fingerprint); auto fp = stripWhitespace(fingerprint);
// Verify this is a valid hex representation and normalize. // Verify this is a valid hex representation and normalize.
fp = util::toHex(util::fromHex(fp.begin(), fp.end())); fp = util::toHex(util::fromHex(std::begin(fp), std::end(fp)));
// Verify this can represent a hash // Verify this can represent a hash
auto ht = MessageDigest::getSupportedHashTypes(); auto ht = MessageDigest::getSupportedHashTypes();
if (std::find_if(ht.begin(), ht.end(), hash_validator(fp)) == ht.end()) { if (std::find_if(std::begin(ht), std::end(ht), hash_validator(fp)) ==
std::end(ht)) {
A2_LOG_INFO(fmt("%s is not a fingerprint, invalid hash representation", A2_LOG_INFO(fmt("%s is not a fingerprint, invalid hash representation",
fingerprint.c_str())); fingerprint.c_str()));
return false; return false;

View File

@ -330,7 +330,8 @@ static SSLCipherSuiteList constructEnabledSuites(SSLContextRef ctx)
return rv; return rv;
} }
rv.erase(std::remove_if(rv.begin(), rv.end(), isBlockedSuite), rv.end()); rv.erase(std::remove_if(std::begin(rv), std::end(rv), isBlockedSuite),
std::end(rv));
return rv; return rv;
} }

View File

@ -143,10 +143,8 @@ void AsyncNameResolver::reset()
ares_addr_node* parseAsyncDNSServers(const std::string& serversOpt) ares_addr_node* parseAsyncDNSServers(const std::string& serversOpt)
{ {
std::vector<std::string> servers; std::vector<std::string> servers;
util::split(serversOpt.begin(), serversOpt.end(), util::split(std::begin(serversOpt), std::end(serversOpt),
std::back_inserter(servers), std::back_inserter(servers), ',', true /* doStrip */);
',',
true /* doStrip */);
ares_addr_node root; ares_addr_node root;
root.next = nullptr; root.next = nullptr;
ares_addr_node* tail = &root; ares_addr_node* tail = &root;

View File

@ -87,7 +87,8 @@ AuthConfigFactory::createAuthConfig
createHttpAuthResolver(op)->resolveAuthConfig(request->getHost()); createHttpAuthResolver(op)->resolveAuthConfig(request->getHost());
} }
} }
} else if(request->getProtocol() == "ftp") { } else if(request->getProtocol() == "ftp" ||
request->getProtocol() == "sftp") {
if(!request->getUsername().empty()) { if(!request->getUsername().empty()) {
if(request->hasPassword()) { if(request->hasPassword()) {
return AuthConfig::create(request->getUsername(), return AuthConfig::create(request->getUsername(),

View File

@ -38,9 +38,9 @@
namespace aria2 { namespace aria2 {
AutoSaveCommand::AutoSaveCommand AutoSaveCommand::AutoSaveCommand(cuid_t cuid, DownloadEngine* e,
(cuid_t cuid, DownloadEngine* e, time_t interval) std::chrono::seconds interval)
: TimeBasedCommand(cuid, e, interval, true) : TimeBasedCommand(cuid, e, std::move(interval), true)
{} {}
AutoSaveCommand::~AutoSaveCommand() {} AutoSaveCommand::~AutoSaveCommand() {}

View File

@ -42,7 +42,8 @@ namespace aria2 {
class AutoSaveCommand : public TimeBasedCommand class AutoSaveCommand : public TimeBasedCommand
{ {
public: public:
AutoSaveCommand(cuid_t cuid, DownloadEngine* e, time_t interval); AutoSaveCommand(cuid_t cuid, DownloadEngine* e,
std::chrono::seconds interval);
virtual ~AutoSaveCommand(); virtual ~AutoSaveCommand();

View File

@ -114,7 +114,8 @@ bool BackupIPv4ConnectCommand::execute()
// TODO Although we check 300ms initial timeout as described in // TODO Although we check 300ms initial timeout as described in
// RFC 6555, the interval will be much longer and around 1 second // RFC 6555, the interval will be much longer and around 1 second
// due to the refresh interval mechanism in DownloadEngine. // due to the refresh interval mechanism in DownloadEngine.
if(startTime_.differenceInMillis(global::wallclock()) >= 300) { if(startTime_.difference(global::wallclock()) >=
std::chrono::milliseconds(300)) {
socket_ = std::make_shared<SocketCore>(); socket_ = std::make_shared<SocketCore>();
try { try {
socket_->establishConnection(ipaddr_, port_); socket_->establishConnection(ipaddr_, port_);

View File

@ -81,7 +81,7 @@ private:
DownloadEngine* e_; DownloadEngine* e_;
Timer startTime_; Timer startTime_;
Timer timeoutCheck_; Timer timeoutCheck_;
time_t timeout_; std::chrono::seconds timeout_;
}; };
} // namespace aria2 } // namespace aria2

View File

@ -54,4 +54,6 @@ const std::string BtAnnounce::PEERS("peers");
const std::string BtAnnounce::PEERS6("peers6"); const std::string BtAnnounce::PEERS6("peers6");
constexpr std::chrono::minutes BtAnnounce::DEFAULT_ANNOUNCE_INTERVAL;
} // namespace aria2 } // namespace aria2

View File

@ -41,6 +41,7 @@
#include <memory> #include <memory>
#include "a2time.h" #include "a2time.h"
#include "a2functional.h"
namespace aria2 { namespace aria2 {
@ -116,7 +117,7 @@ public:
*/ */
virtual void shuffleAnnounce() = 0; virtual void shuffleAnnounce() = 0;
virtual void overrideMinInterval(time_t interval) = 0; virtual void overrideMinInterval(std::chrono::seconds interval) = 0;
virtual void setTcpPort(uint16_t port) = 0; virtual void setTcpPort(uint16_t port) = 0;
@ -138,7 +139,7 @@ public:
static const std::string PEERS6; static const std::string PEERS6;
static const time_t DEFAULT_ANNOUNCE_INTERVAL = 120; constexpr static auto DEFAULT_ANNOUNCE_INTERVAL = 2_min;
}; };
} // namespace aria2 } // namespace aria2

View File

@ -40,6 +40,9 @@
#include "DiskAdaptor.h" #include "DiskAdaptor.h"
#include "prefs.h" #include "prefs.h"
#include "Option.h" #include "Option.h"
#include "util.h"
#include "SingletonHolder.h"
#include "Notifier.h"
namespace aria2 { namespace aria2 {
@ -72,12 +75,17 @@ void BtCheckIntegrityEntry::onDownloadIncomplete
void BtCheckIntegrityEntry::onDownloadFinished void BtCheckIntegrityEntry::onDownloadFinished
(std::vector<std::unique_ptr<Command>>& commands, DownloadEngine* e) (std::vector<std::unique_ptr<Command>>& commands, DownloadEngine* e)
{ {
auto group = getRequestGroup();
const auto& option = group->getOption();
util::executeHookByOptName(group, option.get(), PREF_ON_BT_DOWNLOAD_COMPLETE);
SingletonHolder<Notifier>::instance()->notifyDownloadEvent
(EVENT_ON_BT_DOWNLOAD_COMPLETE, group);
// TODO Currently,when all the checksums // TODO Currently,when all the checksums
// are valid, then aria2 goes to seeding mode. Sometimes it is better // are valid, then aria2 goes to seeding mode. Sometimes it is better
// to exit rather than doing seeding. So, it would be good to toggle this // to exit rather than doing seeding. So, it would be good to toggle this
// behavior. // behavior.
if(!getRequestGroup()->getOption()->getAsBool(PREF_HASH_CHECK_ONLY) && if(!option->getAsBool(PREF_HASH_CHECK_ONLY) &&
getRequestGroup()->getOption()->getAsBool(PREF_BT_HASH_CHECK_SEED)) { option->getAsBool(PREF_BT_HASH_CHECK_SEED)) {
proceedFileAllocation(commands, proceedFileAllocation(commands,
make_unique<BtFileAllocationEntry> make_unique<BtFileAllocationEntry>
(getRequestGroup()), (getRequestGroup()),

View File

@ -36,33 +36,33 @@
#define D_BT_CONSTANTS_H #define D_BT_CONSTANTS_H
#include "common.h" #include "common.h"
#include <vector> #include "a2functional.h"
#define INFO_HASH_LENGTH 20 namespace aria2 {
#define PIECE_HASH_LENGTH 20 constexpr size_t INFO_HASH_LENGTH = 20;
#define PEER_ID_LENGTH 20 constexpr size_t PIECE_HASH_LENGTH = 20;
#define INFO_HASH_LENGTH 20 constexpr size_t PEER_ID_LENGTH = 20;
#define MAX_BLOCK_LENGTH (16*1024) constexpr size_t MAX_BLOCK_LENGTH = 16_k;
#define DEFAULT_MAX_OUTSTANDING_REQUEST 6 constexpr size_t DEFAULT_MAX_OUTSTANDING_REQUEST = 6;
#define OUTSTANDING_REQUEST_STEP 6
// Upper Bound of the number of outstanding request // Upper Bound of the number of outstanding request
#define UB_MAX_OUTSTANDING_REQUEST 256 constexpr size_t UB_MAX_OUTSTANDING_REQUEST = 256;
#define METADATA_PIECE_SIZE (16*1024) constexpr size_t METADATA_PIECE_SIZE = 16_k;
#define LPD_MULTICAST_ADDR "239.192.152.143" constexpr const char LPD_MULTICAST_ADDR[] = "239.192.152.143";
#define LPD_MULTICAST_PORT 6771 constexpr uint16_t LPD_MULTICAST_PORT = 6771;
#define COMPACT_LEN_IPV4 6 constexpr size_t COMPACT_LEN_IPV4 = 6;
#define COMPACT_LEN_IPV6 18 constexpr size_t COMPACT_LEN_IPV6 = 18;
} // namespace aria2
#endif // D_BT_CONSTANTS_H #endif // D_BT_CONSTANTS_H

View File

@ -68,8 +68,8 @@ void copyValues(const std::shared_ptr<FileEntry>& d,
{ {
d->setRequested(true); d->setRequested(true);
d->setPath(s->getPath()); d->setPath(s->getPath());
d->addUris(s->getRemainingUris().begin(), d->addUris(std::begin(s->getRemainingUris()),
s->getRemainingUris().end()); std::end(s->getRemainingUris()));
d->setMaxConnectionPerServer(s->getMaxConnectionPerServer()); d->setMaxConnectionPerServer(s->getMaxConnectionPerServer());
d->setUniqueProtocol(s->isUniqueProtocol()); d->setUniqueProtocol(s->isUniqueProtocol());
} }
@ -120,8 +120,8 @@ bool BtDependency::resolve()
context->getFileEntries(); context->getFileEntries();
for (auto &fe : fileEntries) { for (auto &fe : fileEntries) {
auto &uri = fe->getRemainingUris(); auto &uri = fe->getRemainingUris();
std::random_shuffle(std::begin(uri), std::end(uri), std::shuffle(std::begin(uri), std::end(uri),
*SimpleRandomizer::getInstance()); *SimpleRandomizer::getInstance());
} }
const std::vector<std::shared_ptr<FileEntry> >& dependantFileEntries = const std::vector<std::shared_ptr<FileEntry> >& dependantFileEntries =
dependant_->getDownloadContext()->getFileEntries(); dependant_->getDownloadContext()->getFileEntries();
@ -138,14 +138,14 @@ bool BtDependency::resolve()
e->setRequested(false); e->setRequested(false);
destFiles.push_back(e); destFiles.push_back(e);
} }
std::sort(destFiles.begin(), destFiles.end(), EntryCmp()); std::sort(std::begin(destFiles), std::end(destFiles), EntryCmp());
// Copy file path in dependant_'s FileEntries to newly created // Copy file path in dependant_'s FileEntries to newly created
// context's FileEntries to endorse the path structure of // context's FileEntries to endorse the path structure of
// dependant_. URIs and singleHostMultiConnection are also copied. // dependant_. URIs and singleHostMultiConnection are also copied.
for(const auto& e: dependantFileEntries){ for(const auto& e: dependantFileEntries){
const auto d = std::lower_bound(destFiles.begin(), destFiles.end(), e, const auto d = std::lower_bound(std::begin(destFiles),
EntryCmp()); std::end(destFiles), e, EntryCmp());
if(d == destFiles.end() || if(d == std::end(destFiles) ||
(*d)->getOriginalName() != e->getOriginalName()) { (*d)->getOriginalName() != e->getOriginalName()) {
throw DL_ABORT_EX throw DL_ABORT_EX
(fmt("No entry %s in torrent file", e->getOriginalName().c_str())); (fmt("No entry %s in torrent file", e->getOriginalName().c_str()));

View File

@ -70,7 +70,7 @@ void BtFileAllocationEntry::prepareForNextAction
const std::vector<std::shared_ptr<FileEntry> >& fileEntries = const std::vector<std::shared_ptr<FileEntry> >& fileEntries =
getRequestGroup()->getDownloadContext()->getFileEntries(); getRequestGroup()->getDownloadContext()->getFileEntries();
if(isUriSuppliedForRequsetFileEntry if(isUriSuppliedForRequsetFileEntry
(fileEntries.begin(), fileEntries.end())) { (std::begin(fileEntries), std::end(fileEntries))) {
getRequestGroup()->createNextCommandWithAdj(commands, e, 0); getRequestGroup()->createNextCommandWithAdj(commands, e, 0);
} }
} else { } else {

View File

@ -47,17 +47,20 @@ namespace aria2 {
BtLeecherStateChoke::BtLeecherStateChoke() BtLeecherStateChoke::BtLeecherStateChoke()
: round_(0), : round_(0),
lastRound_(0) lastRound_(Timer::zero())
{} {}
BtLeecherStateChoke::~BtLeecherStateChoke() {} BtLeecherStateChoke::~BtLeecherStateChoke() {}
BtLeecherStateChoke::PeerEntry::PeerEntry(const std::shared_ptr<Peer>& peer): BtLeecherStateChoke::PeerEntry::PeerEntry(const std::shared_ptr<Peer>& peer)
peer_(peer), downloadSpeed_(peer->calculateDownloadSpeed()), : peer_(peer),
// peer must be interested to us and sent block in the last 30 seconds downloadSpeed_(peer->calculateDownloadSpeed()),
regularUnchoker_ // peer must be interested to us and sent block in the last 30 seconds
(peer->peerInterested() && regularUnchoker_(
peer->getLastDownloadUpdate().difference(global::wallclock()) < 30) {} peer->peerInterested() &&
peer->getLastDownloadUpdate().difference(global::wallclock()) < 30_s)
{
}
BtLeecherStateChoke::PeerEntry::PeerEntry(const PeerEntry& c) BtLeecherStateChoke::PeerEntry::PeerEntry(const PeerEntry& c)
: peer_(c.peer_), : peer_(c.peer_),
@ -143,32 +146,32 @@ bool BtLeecherStateChoke::PeerFilter::operator()
void BtLeecherStateChoke::plannedOptimisticUnchoke void BtLeecherStateChoke::plannedOptimisticUnchoke
(std::vector<PeerEntry>& peerEntries) (std::vector<PeerEntry>& peerEntries)
{ {
std::for_each(peerEntries.begin(), peerEntries.end(), std::for_each(std::begin(peerEntries), std::end(peerEntries),
std::mem_fn(&PeerEntry::disableOptUnchoking)); std::mem_fn(&PeerEntry::disableOptUnchoking));
auto i = std::partition(peerEntries.begin(), peerEntries.end(), auto i = std::partition(std::begin(peerEntries), std::end(peerEntries),
PeerFilter(true, true)); PeerFilter(true, true));
if(i != peerEntries.begin()) { if(i != std::begin(peerEntries)) {
std::random_shuffle(peerEntries.begin(), i, std::shuffle(std::begin(peerEntries), i, *SimpleRandomizer::getInstance());
*SimpleRandomizer::getInstance()); (*std::begin(peerEntries)).enableOptUnchoking();
(*peerEntries.begin()).enableOptUnchoking(); A2_LOG_INFO(
A2_LOG_INFO(fmt("POU: %s", fmt("POU: %s",
(*peerEntries.begin()).getPeer()->getIPAddress().c_str())); (*std::begin(peerEntries)).getPeer()->getIPAddress().c_str()));
} }
} }
void BtLeecherStateChoke::regularUnchoke(std::vector<PeerEntry>& peerEntries) void BtLeecherStateChoke::regularUnchoke(std::vector<PeerEntry>& peerEntries)
{ {
auto rest = std::partition(peerEntries.begin(), peerEntries.end(), auto rest = std::partition(std::begin(peerEntries), std::end(peerEntries),
std::mem_fn(&PeerEntry::isRegularUnchoker)); std::mem_fn(&PeerEntry::isRegularUnchoker));
std::sort(peerEntries.begin(), rest); std::sort(std::begin(peerEntries), rest);
// the number of regular unchokers // the number of regular unchokers
int count = 3; int count = 3;
bool fastOptUnchoker = false; bool fastOptUnchoker = false;
auto peerIter = peerEntries.begin(); auto peerIter = std::begin(peerEntries);
for(;peerIter != rest && count; ++peerIter, --count) { for(;peerIter != rest && count; ++peerIter, --count) {
peerIter->disableChokingRequired(); peerIter->disableChokingRequired();
A2_LOG_INFO(fmt("RU: %s, dlspd=%d", A2_LOG_INFO(fmt("RU: %s, dlspd=%d",
@ -180,8 +183,8 @@ void BtLeecherStateChoke::regularUnchoke(std::vector<PeerEntry>& peerEntries)
} }
} }
if(fastOptUnchoker) { if(fastOptUnchoker) {
std::random_shuffle(peerIter, peerEntries.end(), std::shuffle(peerIter, std::end(peerEntries),
*SimpleRandomizer::getInstance()); *SimpleRandomizer::getInstance());
for (auto& p : peerEntries) { for (auto& p : peerEntries) {
if(p.getPeer()->peerInterested()) { if(p.getPeer()->peerInterested()) {
p.enableOptUnchoking(); p.enableOptUnchoking();

View File

@ -213,7 +213,7 @@ void BtPieceMessage::send()
void BtPieceMessage::pushPieceData(int64_t offset, int32_t length) const void BtPieceMessage::pushPieceData(int64_t offset, int32_t length) const
{ {
assert(length <= 16*1024); assert(length <= static_cast<int32_t>(16_k));
auto buf = make_unique<unsigned char[]>(length+MESSAGE_HEADER_LENGTH); auto buf = make_unique<unsigned char[]>(length+MESSAGE_HEADER_LENGTH);
createMessageHeader(buf.get()); createMessageHeader(buf.get());
ssize_t r; ssize_t r;

View File

@ -102,12 +102,12 @@ void BtPostDownloadHandler::getNextRequestGroups
std::vector<std::string>(), std::vector<std::string>(),
"", "",
torrent.get()); torrent.get());
requestGroup->followedBy(newRgs.begin(), newRgs.end()); requestGroup->followedBy(std::begin(newRgs), std::end(newRgs));
auto mi = auto mi =
createMetadataInfoFromFirstFileEntry(requestGroup->getGroupId(), createMetadataInfoFromFirstFileEntry(requestGroup->getGroupId(),
requestGroup->getDownloadContext()); requestGroup->getDownloadContext());
if(mi) { if(mi) {
setMetadataInfo(newRgs.begin(), newRgs.end(), mi); setMetadataInfo(std::begin(newRgs), std::end(newRgs), mi);
} }
auto rgman = requestGroup->getRequestGroupMan(); auto rgman = requestGroup->getRequestGroupMan();
@ -119,7 +119,7 @@ void BtPostDownloadHandler::getNextRequestGroups
} }
} }
groups.insert(groups.end(), newRgs.begin(), newRgs.end()); groups.insert(std::end(groups), std::begin(newRgs), std::end(newRgs));
} }
} // namespace aria2 } // namespace aria2

View File

@ -47,11 +47,15 @@ namespace aria2 {
BtSeederStateChoke::BtSeederStateChoke() BtSeederStateChoke::BtSeederStateChoke()
: round_(0), : round_(0),
lastRound_(0) lastRound_(Timer::zero())
{} {}
BtSeederStateChoke::~BtSeederStateChoke() {} BtSeederStateChoke::~BtSeederStateChoke() {}
namespace {
constexpr auto TIME_FRAME = 20_s;
} // namespace
BtSeederStateChoke::PeerEntry::PeerEntry BtSeederStateChoke::PeerEntry::PeerEntry
(const std::shared_ptr<Peer>& peer): (const std::shared_ptr<Peer>& peer):
peer_(peer), peer_(peer),
@ -122,11 +126,10 @@ void BtSeederStateChoke::unchoke
{ {
int count = (round_ == 2) ? 4 : 3; int count = (round_ == 2) ? 4 : 3;
std::sort(peers.begin(), peers.end()); std::sort(std::begin(peers), std::end(peers));
auto r = peers.begin(); auto r = std::begin(peers);
for(auto eoi = peers.end(); for(; r != std::end(peers) && count; ++r, --count) {
r != eoi && count; ++r, --count) {
(*r).getPeer()->chokingRequired(false); (*r).getPeer()->chokingRequired(false);
A2_LOG_INFO(fmt("RU: %s, ulspd=%d", A2_LOG_INFO(fmt("RU: %s, ulspd=%d",
(*r).getPeer()->getIPAddress().c_str(), (*r).getPeer()->getIPAddress().c_str(),
@ -134,11 +137,10 @@ void BtSeederStateChoke::unchoke
} }
if(round_ < 2) { if(round_ < 2) {
std::for_each(peers.begin(), peers.end(), std::for_each(std::begin(peers), std::end(peers),
std::mem_fn(&PeerEntry::disableOptUnchoking)); std::mem_fn(&PeerEntry::disableOptUnchoking));
if(r != peers.end()) { if(r != std::end(peers)) {
std::random_shuffle(r, peers.end(), std::shuffle(r, std::end(peers), *SimpleRandomizer::getInstance());
*SimpleRandomizer::getInstance());
(*r).getPeer()->optUnchoking(true); (*r).getPeer()->optUnchoking(true);
A2_LOG_INFO(fmt("POU: %s", (*r).getPeer()->getIPAddress().c_str())); A2_LOG_INFO(fmt("POU: %s", (*r).getPeer()->getIPAddress().c_str()));
} }

View File

@ -61,7 +61,6 @@ private:
bool recentUnchoking_; bool recentUnchoking_;
int uploadSpeed_; int uploadSpeed_;
const static time_t TIME_FRAME = 20;
public: public:
PeerEntry(const std::shared_ptr<Peer>& peer); PeerEntry(const std::shared_ptr<Peer>& peer);
PeerEntry(const PeerEntry& c); PeerEntry(const PeerEntry& c);

View File

@ -125,8 +125,8 @@ void BtSetup::setup(std::vector<std::unique_ptr<Command>>& commands,
commands.push_back(std::move(c)); commands.push_back(std::move(c));
} }
{ {
auto c = make_unique<ActivePeerConnectionCommand> auto c = make_unique<ActivePeerConnectionCommand>(
(e->newCUID(), requestGroup, e, metadataGetMode?2:10); e->newCUID(), requestGroup, e, metadataGetMode ? 2_s : 10_s);
c->setBtRuntime(btRuntime); c->setBtRuntime(btRuntime);
c->setPieceStorage(pieceStorage); c->setPieceStorage(pieceStorage);
c->setPeerStorage(peerStorage); c->setPeerStorage(peerStorage);
@ -158,8 +158,8 @@ void BtSetup::setup(std::vector<std::unique_ptr<Command>>& commands,
if(!metadataGetMode) { if(!metadataGetMode) {
auto unionCri = make_unique<UnionSeedCriteria>(); auto unionCri = make_unique<UnionSeedCriteria>();
if(option->defined(PREF_SEED_TIME)) { if(option->defined(PREF_SEED_TIME)) {
unionCri->addSeedCriteria(make_unique<TimeSeedCriteria> unionCri->addSeedCriteria(make_unique<TimeSeedCriteria>(
(option->getAsInt(PREF_SEED_TIME)*60)); std::chrono::seconds(option->getAsInt(PREF_SEED_TIME) * 60)));
} }
{ {
double ratio = option->getAsDouble(PREF_SEED_RATIO); double ratio = option->getAsDouble(PREF_SEED_RATIO);
@ -271,10 +271,10 @@ void BtSetup::setup(std::vector<std::unique_ptr<Command>>& commands,
} }
} }
} }
time_t btStopTimeout = option->getAsInt(PREF_BT_STOP_TIMEOUT); auto btStopTimeout = option->getAsInt(PREF_BT_STOP_TIMEOUT);
if(btStopTimeout > 0) { if(btStopTimeout > 0) {
auto stopDownloadCommand = make_unique<BtStopDownloadCommand> auto stopDownloadCommand = make_unique<BtStopDownloadCommand>
(e->newCUID(), requestGroup, e, btStopTimeout); (e->newCUID(), requestGroup, e, std::chrono::seconds(btStopTimeout));
stopDownloadCommand->setBtRuntime(btRuntime); stopDownloadCommand->setBtRuntime(btRuntime);
stopDownloadCommand->setPieceStorage(pieceStorage); stopDownloadCommand->setPieceStorage(pieceStorage);
commands.push_back(std::move(stopDownloadCommand)); commands.push_back(std::move(stopDownloadCommand));

View File

@ -50,10 +50,10 @@ BtStopDownloadCommand::BtStopDownloadCommand
(cuid_t cuid, (cuid_t cuid,
RequestGroup* requestGroup, RequestGroup* requestGroup,
DownloadEngine* e, DownloadEngine* e,
time_t timeout) std::chrono::seconds timeout)
: TimeBasedCommand(cuid, e, 1), : TimeBasedCommand(cuid, e, 1_s),
requestGroup_(requestGroup), requestGroup_(requestGroup),
timeout_(timeout) timeout_(std::move(timeout))
{} {}
void BtStopDownloadCommand::preProcess() void BtStopDownloadCommand::preProcess()
@ -66,7 +66,7 @@ void BtStopDownloadCommand::preProcess()
" --bt-stop-timeout option."), " --bt-stop-timeout option."),
GroupId::toHex(requestGroup_->getGID()).c_str())); GroupId::toHex(requestGroup_->getGID()).c_str()));
requestGroup_->setForceHaltRequested(true); requestGroup_->setForceHaltRequested(true);
getDownloadEngine()->setRefreshInterval(0); getDownloadEngine()->setRefreshInterval(std::chrono::milliseconds(0));
enableExit(); enableExit();
} }
} }

View File

@ -51,7 +51,7 @@ class BtStopDownloadCommand:public TimeBasedCommand {
private: private:
RequestGroup* requestGroup_; RequestGroup* requestGroup_;
time_t timeout_; std::chrono::seconds timeout_;
Timer checkPoint_; Timer checkPoint_;
@ -63,7 +63,7 @@ public:
(cuid_t cuid, (cuid_t cuid,
RequestGroup* requestGroup, RequestGroup* requestGroup,
DownloadEngine* e, DownloadEngine* e,
time_t timeout); std::chrono::seconds timeout);
virtual void preProcess() CXX11_OVERRIDE; virtual void preProcess() CXX11_OVERRIDE;

View File

@ -38,6 +38,8 @@
#include "DiskWriter.h" #include "DiskWriter.h"
#include <sstream> #include <sstream>
#include "a2functional.h"
namespace aria2 { namespace aria2 {
class ByteArrayDiskWriter : public DiskWriter { class ByteArrayDiskWriter : public DiskWriter {
@ -46,7 +48,7 @@ private:
size_t maxLength_; size_t maxLength_;
void clear(); void clear();
public: public:
ByteArrayDiskWriter(size_t maxLength = 5*1024*1024); ByteArrayDiskWriter(size_t maxLength = 5_m);
virtual ~ByteArrayDiskWriter(); virtual ~ByteArrayDiskWriter();
virtual void initAndOpenFile(int64_t totalLength = 0) CXX11_OVERRIDE; virtual void initAndOpenFile(int64_t totalLength = 0) CXX11_OVERRIDE;

View File

@ -82,7 +82,11 @@ ChecksumCheckIntegrityEntry::onDownloadIncomplete
make_unique<StreamFileAllocationEntry> make_unique<StreamFileAllocationEntry>
(getRequestGroup(), popNextCommand()), (getRequestGroup(), popNextCommand()),
e); e);
return;
} }
// If we don't redownload, set error code to indicate checksum error
getRequestGroup()->setLastErrorCode(error_code::CHECKSUM_ERROR);
} }
} // namespace aria2 } // namespace aria2

View File

@ -57,7 +57,7 @@ ConnectCommand::ConnectCommand(cuid_t cuid,
: AbstractCommand(cuid, req, fileEntry, requestGroup, e, s), : AbstractCommand(cuid, req, fileEntry, requestGroup, e, s),
proxyRequest_(proxyRequest) proxyRequest_(proxyRequest)
{ {
setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)); setTimeout(std::chrono::seconds(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)));
disableReadCheckSocket(); disableReadCheckSocket();
setWriteCheckSocket(getSocket()); setWriteCheckSocket(getSocket());
} }

View File

@ -265,10 +265,10 @@ void printProgressSummary(const RequestGroupList& groups, size_t cols,
} }
} // namespace } // namespace
ConsoleStatCalc::ConsoleStatCalc(time_t summaryInterval, ConsoleStatCalc::ConsoleStatCalc(std::chrono::seconds summaryInterval,
bool colorOutput, bool colorOutput,
bool humanReadable): bool humanReadable):
summaryInterval_(summaryInterval), summaryInterval_(std::move(summaryInterval)),
readoutVisibility_(true), readoutVisibility_(true),
truncate_(true), truncate_(true),
#ifdef __MINGW32__ #ifdef __MINGW32__
@ -288,7 +288,8 @@ ConsoleStatCalc::ConsoleStatCalc(time_t summaryInterval,
void void
ConsoleStatCalc::calculateStat(const DownloadEngine* e) ConsoleStatCalc::calculateStat(const DownloadEngine* e)
{ {
if(cp_.differenceInMillis(global::wallclock())+A2_DELTA_MILLIS < 1000) { if(cp_.difference(global::wallclock()) + A2_DELTA_MILLIS <
std::chrono::milliseconds(1000)) {
return; return;
} }
cp_ = global::wallclock(); cp_ = global::wallclock();
@ -317,9 +318,9 @@ ConsoleStatCalc::calculateStat(const DownloadEngine* e)
} }
ColorizedStream o; ColorizedStream o;
if(e->getRequestGroupMan()->countRequestGroup() > 0) { if(e->getRequestGroupMan()->countRequestGroup() > 0) {
if((summaryInterval_ > 0) && if((summaryInterval_ > 0_s) &&
lastSummaryNotified_.differenceInMillis(global::wallclock())+ lastSummaryNotified_.difference(global::wallclock())+
A2_DELTA_MILLIS >= summaryInterval_*1000) { A2_DELTA_MILLIS >= summaryInterval_) {
lastSummaryNotified_ = global::wallclock(); lastSummaryNotified_ = global::wallclock();
printProgressSummary(e->getRequestGroupMan()->getRequestGroups(), cols, e, printProgressSummary(e->getRequestGroupMan()->getRequestGroups(), cols, e,
sizeFormatter); sizeFormatter);

View File

@ -61,7 +61,7 @@ private:
Timer lastSummaryNotified_; Timer lastSummaryNotified_;
time_t summaryInterval_; std::chrono::seconds summaryInterval_;
std::unique_ptr<SizeFormatter> sizeFormatter_; std::unique_ptr<SizeFormatter> sizeFormatter_;
bool readoutVisibility_; bool readoutVisibility_;
@ -69,7 +69,7 @@ private:
bool isTTY_; bool isTTY_;
bool colorOutput_; bool colorOutput_;
public: public:
ConsoleStatCalc(time_t summaryInterval, bool colorOutput = true, ConsoleStatCalc(std::chrono::seconds summaryInterval, bool colorOutput = true,
bool humanReadable = true); bool humanReadable = true);
virtual ~ConsoleStatCalc() {} virtual ~ConsoleStatCalc() {}

View File

@ -229,6 +229,11 @@ Context::Context(bool standalone,
std::string iface = op->get(PREF_INTERFACE); std::string iface = op->get(PREF_INTERFACE);
SocketCore::bindAddress(iface); SocketCore::bindAddress(iface);
} }
// Bind multiple interfaces
if(!op->get(PREF_MULTIPLE_INTERFACE).empty() && op->get(PREF_INTERFACE).empty()) {
std::string ifaces = op->get(PREF_MULTIPLE_INTERFACE);
SocketCore::bindAllAddress(ifaces);
}
std::vector<std::shared_ptr<RequestGroup> > requestGroups; std::vector<std::shared_ptr<RequestGroup> > requestGroups;
std::shared_ptr<UriListParser> uriListParser; std::shared_ptr<UriListParser> uriListParser;
#ifdef ENABLE_BITTORRENT #ifdef ENABLE_BITTORRENT

View File

@ -48,6 +48,7 @@
#include "SocketRecvBuffer.h" #include "SocketRecvBuffer.h"
#include "LogFactory.h" #include "LogFactory.h"
#include "wallclock.h" #include "wallclock.h"
#include "DownloadFailureException.h"
namespace aria2 { namespace aria2 {
@ -94,6 +95,13 @@ bool CreateRequestCommand::executeInternal()
if(getSegmentMan()) { if(getSegmentMan()) {
getSegmentMan()->ignoreSegmentFor(getFileEntry()); getSegmentMan()->ignoreSegmentFor(getFileEntry());
} }
if(getOption()->getAsBool(PREF_DRY_RUN)) {
// For dry run mode, just throwing DlAbortEx makes infinite
// loop, since we don't have SegmentMan, and we cannot tell all
// hopes were abandoned.
throw DOWNLOAD_FAILURE_EXCEPTION2("No URI available.",
getRequestGroup()->getLastErrorCode());
}
// In this case, the error might be already set in RequestGroup, // In this case, the error might be already set in RequestGroup,
// so use it here. // so use it here.
throw DL_ABORT_EX2("No URI available.", throw DL_ABORT_EX2("No URI available.",

View File

@ -57,8 +57,8 @@
namespace aria2 { namespace aria2 {
DHTAutoSaveCommand::DHTAutoSaveCommand DHTAutoSaveCommand::DHTAutoSaveCommand
(cuid_t cuid, DownloadEngine* e, int family, time_t interval) (cuid_t cuid, DownloadEngine* e, int family, std::chrono::seconds interval)
: TimeBasedCommand{cuid, e, interval}, : TimeBasedCommand{cuid, e, std::move(interval)},
family_{family}, family_{family},
routingTable_{nullptr} routingTable_{nullptr}
{} {}

View File

@ -56,7 +56,7 @@ private:
void save(); void save();
public: public:
DHTAutoSaveCommand DHTAutoSaveCommand
(cuid_t cuid, DownloadEngine* e, int family, time_t interval); (cuid_t cuid, DownloadEngine* e, int family, std::chrono::seconds interval);
virtual ~DHTAutoSaveCommand(); virtual ~DHTAutoSaveCommand();

View File

@ -43,8 +43,8 @@
namespace aria2 { namespace aria2 {
DHTBucketRefreshCommand::DHTBucketRefreshCommand DHTBucketRefreshCommand::DHTBucketRefreshCommand
(cuid_t cuid, DownloadEngine* e, time_t interval) (cuid_t cuid, DownloadEngine* e, std::chrono::seconds interval)
: TimeBasedCommand{cuid, e, interval}, : TimeBasedCommand{cuid, e, std::move(interval)},
routingTable_{nullptr}, routingTable_{nullptr},
taskQueue_{nullptr}, taskQueue_{nullptr},
taskFactory_{nullptr} taskFactory_{nullptr}

View File

@ -53,7 +53,8 @@ private:
DHTTaskFactory* taskFactory_; DHTTaskFactory* taskFactory_;
public: public:
DHTBucketRefreshCommand(cuid_t cuid, DownloadEngine* e, time_t interval); DHTBucketRefreshCommand(cuid_t cuid, DownloadEngine* e,
std::chrono::seconds interval);
virtual ~DHTBucketRefreshCommand(); virtual ~DHTBucketRefreshCommand();

View File

@ -61,8 +61,7 @@ bool DHTConnectionImpl::bind
while(sgl.hasNext()) { while(sgl.hasNext()) {
ports.push_back(sgl.next()); ports.push_back(sgl.next());
} }
std::random_shuffle(ports.begin(), ports.end(), std::shuffle(ports.begin(), ports.end(), *SimpleRandomizer::getInstance());
*SimpleRandomizer::getInstance());
for (const auto& p : ports) { for (const auto& p : ports) {
port = p; port = p;
if(bind(port, addr)) { if(bind(port, addr)) {

View File

@ -35,31 +35,37 @@
#ifndef D_DHT_CONSTANTS_H #ifndef D_DHT_CONSTANTS_H
#define D_DHT_CONSTANTS_H #define D_DHT_CONSTANTS_H
#include "common.h"
#include "TimerA2.h"
#include "a2functional.h"
namespace aria2 {
// Increment this if major improvements or bug fixes are made in DHT // Increment this if major improvements or bug fixes are made in DHT
// code. This is 2 bytes unsigned integer. // code. This is 2 bytes unsigned integer.
#define DHT_VERSION 3U constexpr uint16_t DHT_VERSION = 3U;
#define DHT_ID_LENGTH 20 constexpr size_t DHT_ID_LENGTH = 20;
#define DHT_TRANSACTION_ID_LENGTH 2 constexpr size_t DHT_TRANSACTION_ID_LENGTH = 2;
#define DHT_TOKEN_LENGTH 4
// See --dht-message-timeout option. // See --dht-message-timeout option.
#define DHT_MESSAGE_TIMEOUT 10 constexpr auto DHT_MESSAGE_TIMEOUT = 10_s;
#define DHT_NODE_CONTACT_INTERVAL (15*60) constexpr auto DHT_NODE_CONTACT_INTERVAL = 15_min;
#define DHT_BUCKET_REFRESH_INTERVAL (15*60) constexpr auto DHT_BUCKET_REFRESH_INTERVAL = 15_min;
#define DHT_BUCKET_REFRESH_CHECK_INTERVAL (5*60) constexpr auto DHT_BUCKET_REFRESH_CHECK_INTERVAL = 5_min;
#define DHT_PEER_ANNOUNCE_PURGE_INTERVAL (30*60) constexpr auto DHT_PEER_ANNOUNCE_PURGE_INTERVAL = 30_min;
#define DHT_PEER_ANNOUNCE_INTERVAL (15*60) constexpr auto DHT_PEER_ANNOUNCE_INTERVAL = 15_min;
#define DHT_PEER_ANNOUNCE_CHECK_INTERVAL (5*60) constexpr auto DHT_PEER_ANNOUNCE_CHECK_INTERVAL = 5_min;
#define DHT_TOKEN_UPDATE_INTERVAL (10*60) constexpr auto DHT_TOKEN_UPDATE_INTERVAL = 10_min;
} // namespace aria2
#endif // D_DHT_CONSTANTS_H #endif // D_DHT_CONSTANTS_H

View File

@ -55,13 +55,13 @@ namespace aria2 {
namespace { namespace {
const time_t GET_PEER_INTERVAL = (15*60); constexpr auto GET_PEER_INTERVAL = 15_min;
// Interval when the size of peer list is low. // Interval when the size of peer list is low.
const time_t GET_PEER_INTERVAL_LOW = (5*60); constexpr auto GET_PEER_INTERVAL_LOW = 5_min;
// Interval when the peer list is empty. // Interval when the peer list is empty.
const time_t GET_PEER_INTERVAL_ZERO = 60; constexpr auto GET_PEER_INTERVAL_ZERO = 1_min;
// Interval for retry. // Interval for retry.
const time_t GET_PEER_INTERVAL_RETRY = 5; constexpr auto GET_PEER_INTERVAL_RETRY = 5_s;
// Maximum retries. Try more than 5 to drop bad node. // Maximum retries. Try more than 5 to drop bad node.
const int MAX_RETRIES = 10; const int MAX_RETRIES = 10;
@ -77,7 +77,7 @@ DHTGetPeersCommand::DHTGetPeersCommand
taskQueue_{nullptr}, taskQueue_{nullptr},
taskFactory_{nullptr}, taskFactory_{nullptr},
numRetry_{0}, numRetry_{0},
lastGetPeerTime_{0} lastGetPeerTime_{Timer::zero()}
{ {
requestGroup_->increaseNumCommand(); requestGroup_->increaseNumCommand();
} }
@ -92,7 +92,7 @@ bool DHTGetPeersCommand::execute()
if(btRuntime_->isHalt()) { if(btRuntime_->isHalt()) {
return true; return true;
} }
time_t elapsed = lastGetPeerTime_.difference(global::wallclock()); auto elapsed = lastGetPeerTime_.difference(global::wallclock());
if(!task_ && if(!task_ &&
(elapsed >= GET_PEER_INTERVAL || (elapsed >= GET_PEER_INTERVAL ||
(((btRuntime_->lessThanMinPeers() && (((btRuntime_->lessThanMinPeers() &&

View File

@ -33,6 +33,9 @@
*/ */
/* copyright --> */ /* copyright --> */
#include "DHTInteractionCommand.h" #include "DHTInteractionCommand.h"
#include <array>
#include "DownloadEngine.h" #include "DownloadEngine.h"
#include "RecoverableException.h" #include "RecoverableException.h"
#include "DHTMessageDispatcher.h" #include "DHTMessageDispatcher.h"
@ -100,10 +103,10 @@ bool DHTInteractionCommand::execute()
std::string remoteAddr; std::string remoteAddr;
uint16_t remotePort; uint16_t remotePort;
unsigned char data[64*1024]; std::array<unsigned char, 64_k> data;
try { try {
while(1) { while(1) {
ssize_t length = connection_->receiveMessage(data, sizeof(data), ssize_t length = connection_->receiveMessage(data.data(), data.size(),
remoteAddr, remotePort); remoteAddr, remotePort);
if(length <= 0) { if(length <= 0) {
break; break;
@ -111,11 +114,11 @@ bool DHTInteractionCommand::execute()
if(data[0] == 'd') { if(data[0] == 'd') {
// udp tracker response does not start with 'd', so assume // udp tracker response does not start with 'd', so assume
// this message belongs to DHT. nothrow. // this message belongs to DHT. nothrow.
receiver_->receiveMessage(remoteAddr, remotePort, data, length); receiver_->receiveMessage(remoteAddr, remotePort, data.data(), length);
} else { } else {
// this may be udp tracker response. nothrow. // this may be udp tracker response. nothrow.
udpTrackerClient_->receiveReply(data, length, remoteAddr, remotePort, udpTrackerClient_->receiveReply(data.data(), length, remoteAddr,
global::wallclock()); remotePort, global::wallclock());
} }
} }
} catch(RecoverableException& e) { } catch(RecoverableException& e) {
@ -126,7 +129,7 @@ bool DHTInteractionCommand::execute()
dispatcher_->sendMessages(); dispatcher_->sendMessages();
while(!udpTrackerClient_->getPendingRequests().empty()) { while(!udpTrackerClient_->getPendingRequests().empty()) {
// no throw // no throw
ssize_t length = udpTrackerClient_->createRequest(data, sizeof(data), ssize_t length = udpTrackerClient_->createRequest(data.data(), data.size(),
remoteAddr, remotePort, remoteAddr, remotePort,
global::wallclock()); global::wallclock());
if(length == -1) { if(length == -1) {
@ -134,7 +137,7 @@ bool DHTInteractionCommand::execute()
} }
try { try {
// throw // throw
connection_->sendMessage(data, length, remoteAddr, remotePort); connection_->sendMessage(data.data(), length, remoteAddr, remotePort);
udpTrackerClient_->requestSent(global::wallclock()); udpTrackerClient_->requestSent(global::wallclock());
} catch(RecoverableException& e) { } catch(RecoverableException& e) {
A2_LOG_INFO_EX("Exception thrown while sending UDP tracker request.", e); A2_LOG_INFO_EX("Exception thrown while sending UDP tracker request.", e);

View File

@ -52,7 +52,7 @@ public:
virtual void virtual void
addMessageToQueue(std::unique_ptr<DHTMessage> message, addMessageToQueue(std::unique_ptr<DHTMessage> message,
time_t timeout, std::chrono::seconds timeout,
std::unique_ptr<DHTMessageCallback> callback = std::unique_ptr<DHTMessageCallback> callback =
std::unique_ptr<DHTMessageCallback>{}) = 0; std::unique_ptr<DHTMessageCallback>{}) = 0;

View File

@ -56,11 +56,11 @@ DHTMessageDispatcherImpl::DHTMessageDispatcherImpl
void void
DHTMessageDispatcherImpl::addMessageToQueue DHTMessageDispatcherImpl::addMessageToQueue
(std::unique_ptr<DHTMessage> message, (std::unique_ptr<DHTMessage> message,
time_t timeout, std::chrono::seconds timeout,
std::unique_ptr<DHTMessageCallback> callback) std::unique_ptr<DHTMessageCallback> callback)
{ {
messageQueue_.push_back(make_unique<DHTMessageEntry> messageQueue_.push_back(make_unique<DHTMessageEntry>(
(std::move(message), timeout, std::move(callback))); std::move(message), std::move(timeout), std::move(callback)));
} }
void void
@ -92,7 +92,7 @@ bool DHTMessageDispatcherImpl::sendMessage(DHTMessageEntry* entry)
// DHTTask(such as DHTAbstractNodeLookupTask) don't finish // DHTTask(such as DHTAbstractNodeLookupTask) don't finish
// forever. // forever.
if(!entry->message->isReply()) { if(!entry->message->isReply()) {
tracker_->addMessage(entry->message.get(), 0, tracker_->addMessage(entry->message.get(), 0_s,
std::move(entry->callback)); std::move(entry->callback));
} }
} }

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