Commit Graph

25522 Commits

Author SHA1 Message Date
Erik Verbruggen
a2b58c1643 Implement qt_is_{inf,nan,finite} using std. library functions.
The previous implementations did not check the full mantissa. The result
was that certain NaN values were seen as +/-Infinity.

A nice benefit is that the generated code for this implementation is also
faster.

Task-number: QTBUG-47692
Change-Id: I1507ec579ccd9a2ab97da8cf83dabbc5d6e28597
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2015-10-30 13:07:19 +00:00
Ulf Hermann
0659bb810b Add thorough tests for QLocale string/double conversions
We want to be sure that the conversions are independent of the current
locale set by setlocale(3) and we want to test both directions of the
conversion.

Change-Id: I01be19e680588478d07fd65a48796e806e681863
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
2015-10-30 10:43:19 +00:00
Ulf Hermann
6c72a4a95b Fix building with QT_NO_BEARERMANAGEMENT
Some of the examples make no sense without bearer management and
QNetworkSession is not defined if QT_NO_BEARERMANAGEMENT, so
tst_qnetworkreply.cpp has to be adjusted.

Change-Id: Ic2f73746cba74f670ae5b5e99b0be1461ff6d182
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
2015-10-28 21:25:36 +00:00
Tor Arne Vestbø
81c2ca7f22 Update QPlatformIntegration::createPlatformWindow() documentation
The function is not limited to creating top level windows.

Change-Id: Iedeeba0093f251c852e9b7c9ba23c567a79a53f8
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2015-10-28 14:07:10 +00:00
Albert Astals Cid
b05ba48281 Better debug info for the "_q_startOperation was called more than once" warnings
Change-Id: I50a3e5584a1bc2553acd4bbec1b9a290b8475e47
Reviewed-by: Markus Goetz (Woboq GmbH) <markus@woboq.com>
Reviewed-by: Richard J. Moore <rich@kde.org>
2015-10-28 08:03:20 +00:00
Thiago Macieira
60e0441538 Remove support for MSVC earlier than 2012
We need C++11 support. The ChangeLog is in the previous commit.

Change-Id: Ib056b47dde3341ef9a52ffff13ef6bfa55462a22
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2015-10-27 23:26:52 +00:00
Bjoern Breitmeyer
af2f3bde48 Fixing the SQLite3 build for WEC2013 again.
The new version broke the build again
-> fix it again.

Change-Id: I75761d134d97a2784f1de5076412aa814fdf9bcd
Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
Reviewed-by: Gunnar Roth <gunnar.roth@gmx.net>
Reviewed-by: Mark Brand <mabrand@mabrand.nl>
2015-10-27 15:08:34 +00:00
Friedemann Kleint
c4265fb1b8 tst_qstring: Enable previously disabled test for Q_CC_MINGW.
gcc 4.8 now supports all printf()-formats.

Change-Id: Idead5ff77c3825c642615eceed110c1252869e90
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
2015-10-27 15:04:19 +00:00
David Schulz
dbf1c2eb9f QMake: Add option to set qt.conf file.
Change-Id: Ie5db11892ccf2d357773a4db6a0464bf27be9a26
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
2015-10-27 13:14:00 +00:00
Robin Burchell
2f83e38bfc QDeviceDiscovery: Add static discovery support for new-style multitouch devices.
These don't report ABS_X/ABS_Y, but are still a touchscreen. This is commonly
seen on Android hardware.

As a bonus, we clean up the flow control through device discovery: by using
memset, we can ignore the error value of ioctl() and just check the bits we
need.

We can also close() the FD instantly after running the ioctl calls.

Change-Id: I6405597dc34841c805552fa73ef86250eaae111c
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
2015-10-27 12:26:25 +00:00
Tor Arne Vestbø
2bebf640cc Add QWindow child window positioning test
Tests that window creation order doesn't affect the resulting geometry
of the parent and child windows.

Change-Id: Iff0cb5adf87107dfed4a633a67e1b4312b90e24a
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2015-10-26 19:01:32 +00:00
Tor Arne Vestbø
73c86fcb40 Defer QPlatformWindow creation on setVisible(true) if parent hasn't been created
When a child QWindow is shown by calling setVisible(true), we don't need to
create the platform window immediately if the parent window hasn't been
created yet.

We defer creation until the parent is created, or we're re-parented into
a created parent or made top level.

This optimization is more important now that we create the full parent
hierarchy once we decide that we need to create a child QWindow.

Change-Id: Ia4f0430f0d3709a12f41f6473c1cea6b0ef3c9cd
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2015-10-26 17:10:02 +00:00
Tor Arne Vestbø
ac27f9a83e Ensure QWindow::setParent() creates parent hierarchy if needed
If the QWindow has been created and has a platform window, we need to
ensure that the windows in the parent hierarchy also are created before
we set a new parent on the platform window, otherwise the platform window
will think that it's a top level window.

Change-Id: Icb2c3cd5411cd1eb595e8673e144095feda31df9
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2015-10-26 14:53:40 +00:00
Tor Arne Vestbø
2f402e4d09 Ensure QWindow::create() creates parent hierarchy before creating self
To be able to create a platform window for a given QWindow we need to
sync up the parent hierarchy first, so that the newly created window
can be placed into that hierarchy.

Without creating the parent hierarchy first, the QPlatformWindow will
end up thinking it's a top level window, when in reality is represents
the platform backing of a child QWindow.

Change-Id: I2cad7759fbc118b04718e7a27ec7570ce1238757
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
2015-10-26 13:12:35 +00:00
Jake Petroules
d669bde4bf Make use of Objective-C conversion functions.
Change-Id: I6a96b69c2d371f0f5fbfa10c7060941a9193a1d4
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
2015-10-26 09:44:52 +00:00
Albert Astals Cid
66084f1c3d qDelete(map.values()) -> qDelete(map)
Saves one iteration of the container and unneeded allocation of a list.

Change-Id: I1626dc3460e21741de3261dd68be9c1fa8bdc792
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
2015-10-26 08:04:49 +00:00
Liang Qi
790aef362f Merge remote-tracking branch 'origin/5.6' into dev
Conflicts:
	.qmake.conf
	configure
	src/corelib/global/qglobal.h
	src/tools/qdoc/node.cpp
	src/tools/qdoc/qdocdatabase.cpp
	tests/auto/corelib/io/qsettings/tst_qsettings.cpp
	tools/configure/configureapp.cpp

Change-Id: I66028ae5e441a06b73ee85ba72a03a3af3e8593f
2015-10-23 14:45:03 +02:00
Erik Verbruggen
07475c662e OSX: replace use of deprecated API.
dragImage:at:offset:event:pasteboard:source:slideBack: on NSView is
deprecated since 10.7. Use the one on NSWindow instead.

Change-Id: Ia1c2ea367ae2ca5194b52ea57ab261461bf8b529
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
2015-10-23 07:51:34 +00:00
Friedemann Kleint
9720efbd10 Diaglib: Add class DebugProxyStyle.
Add a debug proxy style that wraps around an existing style and outputs
the parameters and return values of its function calls, for debugging
QStyle.

Task-number: QTBUG-47084
Task-number: QTBUG-45055
Change-Id: I638618e83bbac8ca4fdce31441bf4c913e911154
Reviewed-by: Andy Shaw <andy.shaw@theqtcompany.com>
2015-10-23 07:47:44 +00:00
Friedemann Kleint
66cfebc2b3 tst_qchar: Remove init()/cleanup() slots.
For Windows CE 7, a QCoreApplication was instantiated
in each test.

Change-Id: Ib579e416e47f884ef0cdf829139518fcc3910b9b
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@theqtcompany.com>
2015-10-23 07:23:00 +00:00
Friedemann Kleint
6f65ddbc21 Implement canceling of Qt-initiated drags.
- Add new virtual QPlatformDrag::cancelDrag()
  [avoiding a conflict with existing QBasicDrag::cancel()]
- Implement on Windows by returning DRAGDROP_S_CANCEL
  from IOleDropSource::QueryContinueDrag() as suggested on report.
- Implement in QBasicDrag by calling QBasicDrag::cancel()
  and quitting the event loop.
- Add new API static void QDrag::cancel() for it.

Task-number: QTBUG-47004
Change-Id: I4b4bb52e5fc226c8e04688ac1b0f9550daaf918e
Reviewed-by: Jørgen Lind <jorgen.lind@theqtcompany.com>
Reviewed-by: David Faure <david.faure@kdab.com>
2015-10-23 06:35:47 +00:00
Marc Mutz
8515aa1871 QTextStream: optimize streaming of QLatin1String and const char*
Instead of converting the QLatin1String to a QString at the first
opportunity, keep it around until it is appended to one of the
internal QStrings in write().

Avoids a memory allocation per QLatin1String / const char* streamed.

Change-Id: Id973a9b743e5a6696defbc4ef4ed2db1ef54e9cc
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2015-10-23 05:51:00 +00:00
Thiago Macieira
746fbbe039 Define QTypeInfo for char16_t, char32_t and wchar_t in Qt 5
Commits 0b700fb6f9 and
0e4d94edd0 defined QTypeInfo for those
three only for Qt 6 (and forced C++11 support). Define them in Qt 5,
keeping compatibility with QList storage. That is, these types are
defined to be primitive and static at the same time, for the benefit of
QList.

Change-Id: I9cac3a70af156971022c1e6084cb5538c050f826
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@theqtcompany.com>
2015-10-23 00:17:59 +00:00
Thiago Macieira
be926e412c Prevent the pixmap cache from crashing if it's been destroyed
In case the static destructor has already been run, make sure we don't
crash. This shouldn't happen, but could happen if the QApplication
destructor is run in a weird order (after the static destructors have
begun running).

That's not usually a case we'd fix (unsupported), but since this change
improves the code and also avoids creating the pixmap cache if it hadn't
been used up until this point, the change is a net benefit.

Task-number: QTBUG-48709
Change-Id: Ia505aece07bf4e13a1faffff140f3e119cfc773e
Reviewed-by: Gunnar Sletta <gunnar@sletta.org>
2015-10-23 00:16:01 +00:00
Lars Knoll
cefc393059 Respect QPen::dashOffset when generating PDF
Change-Id: I26de1cd4a14d1b8978be6d0377cb2cba573fc82a
Task-number: QTBUG-47164
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
2015-10-22 20:18:39 +00:00
Lars Knoll
661bcb79c8 Fix warning message to match the function signature
Change-Id: Ie21d63e29351dae9a52998e3d1068500e502ec5a
Task-number: QTBUG-46693
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
2015-10-22 20:18:27 +00:00
Frederik Gladhorn
8ea61d6d2a Fix alignment issues on 32 bit in qConvertA2RGB30PMToARGB64PM_sse2 and qConvertARGB32PMToARGB64PM_sse2
On 32 bit platforms the pointers may end up being 4 byte aligned.
Happens with MSVC on 32 bit Windows. _mm_store_si128 is documented to
require 16 byte alignment.

Change-Id: I80737fedf9e7f436a51a83924117cc0bc63017cc
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@theqtcompany.com>
2015-10-22 19:40:19 +00:00
Oswald Buddenhagen
f343989852 qdoc is moving back to qttools
Change-Id: Icb5abd32a1cbc3e8d876341c877e8d2a963c0e25
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@theqtcompany.com>
Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
2015-10-22 19:40:09 +00:00
Boris Nagaev
45fe3f1cde configure: fix log corruption with option -v
This bug occurs if ./configure is called with -v on systems on
which fd proc entries point to the files/devices they are open
on instead of being magic nodes which would basically dup() the
actual fds (e.g., Linux).

In this case, the command "tee $tty" appends to /dev/stderr, which
may be already opened by the parent process. This breaks the log file.

Normally, the log file starts with

 This is the Qt Open Source Edition.
 ...

but with `-v` flag it would start with output of awkprog and maybe
some zero bytes. Zero bytes are observed on Debian Wheezy.

 DEFAULT_INCDIRS=...
 ...
 ^@^@^@^@^@^@^@^@^@^@^@^@...
 Done running configuration tests.
 ...

To fix this problem, the output of `...` is saved to a variable, and
then eval'd and echo'd (if -v).

This solution was found by Tony Theodore.
https://github.com/mxe/mxe/issues/938#issuecomment-149770348

Change-Id: Id0c28598890e813774cc92f38ee46a0697b34e77
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2015-10-22 19:13:08 +00:00
Marc Mutz
a903ddd8dc QTextStream: Extract Method padding() from putString()
This is in preparation of adding a putString(QLatin1String) overload.

To keep the change simple, I kept the construction of the padChar
chain per putString() call. It probably makes sense to have a
QString::resize(int, QChar) to perform the padding operation in-place.

Let's leave that for another changeset.

Change-Id: I9ef66b8df38117e1669fd2bece6ee180a2ce3369
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2015-10-22 18:41:56 +00:00
Olivier Goffart
d206d04b7c moc: fix Q_PROPERTY with parentheses in their MEMBER clause
This was never a documented feature, but happended to work before Qt 5.5.
It broke because the peoperty access went into the static function and are
now prefixed with '_t->'

So restore the behavior as it was by not including the parentheses in the
member name.

Task-number: QTBUG-47695
Change-Id: Ic3509ddea7ac9abc871e71f5bfbe81d04d08e9bc
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@theqtcompany.com>
2015-10-22 16:48:26 +00:00
Samuel Nevala
f57afda69f winrt: Fix sending of back key event.
Windows Runtime side callback is run from XAML thread and receiver
is at UI thread thus sendEvent asserts. Use synchronous system
interface key event handler to deliver the event.

Task-Id: QTBUG-48105
Change-Id: I91a8ef6fd29c277edfb699b688b9e7895dadda8f
Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
2015-10-22 13:28:51 +00:00
Samuel Nevala
0d5bf2eb59 Remove superfluous newline
Change-Id: I556ac48f586633faa6b7048e03a33a0f018973e6
Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
2015-10-22 10:21:47 +00:00
Laszlo Agocs
d0cbd1e0b8 eglfs: Avoid sending enter-leave events with an invalid leave ptr
Task-number: QTBUG-48890
Change-Id: Iad82f285a0c982a5fafd276459b8177086d43d1b
Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
2015-10-22 09:21:54 +00:00
Samuel Nevala
ceec35a6de winrt: Connect callbacks after after integration class constructed.
It was possible for Windows Runtime callback to run while integration
class was constructed. That caused an assert when handling
application state change. Fix this by connecting callbacks after
integration class fully constructed.

Change-Id: I029c2e1f932e8edc3665443cc17dbf11eaae1bf6
Task-Id: QTBUG-48109
Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
2015-10-22 08:58:23 +00:00
Friedemann Kleint
9388bbe4bd Windows: Implement QPlatformInputContext::locale().
Initialize locale from current keyboard value and listen
to WM_INPUTLANGCHANGE.

Task-number: QTBUG-48772
Change-Id: I53b6ef4e2cf538bb81b41ea497ed0cb66991b104
Reviewed-by: Liang Qi <liang.qi@theqtcompany.com>
Reviewed-by: Oliver Wolff <oliver.wolff@theqtcompany.com>
2015-10-22 08:45:16 +00:00
Samuel Nevala
e137676354 winrt: Add missing Q_DECL_OVERRIDEs
Change-Id: Ifbf2995baa2eedc726e814b04b51bde6e91a7c40
Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
2015-10-22 06:11:07 +00:00
Friedemann Kleint
456f721917 tests/auto/corelib: Remove some placeholder formatting.
Use QByteArray/QString addition instead in loops and for
test row names.

Change-Id: Ieffb429efdc14aa5932b3fcdef5a18e13a62d35f
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@theqtcompany.com>
2015-10-22 03:54:29 +00:00
Friedemann Kleint
acdd4850a4 tests/auto/other: Remove some placeholder formatting.
Use QByteArray/QString addition instead in loops and for
test row names.

Change-Id: Iae76d852a1657bfb6d88e84515f30bd2f1dece6b
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@theqtcompany.com>
2015-10-22 03:53:22 +00:00
Timur Pocheptsov
f32f75ae1b Secure Transport SSL backend - add a missing cipher suite
tst_qsslsocket::sessionCipher fails starting from OS X 10.11, since we
do not recognize ECDHE-RSA-AES256-GCM-SHA384 (and the resulting 'sessionCipher'
isNull).

Change-Id: I37f51a1627c25f03a30172b245be8142d179affa
Task-number: QTBUG-48881
Reviewed-by: Richard J. Moore <rich@kde.org>
2015-10-22 03:36:45 +00:00
Alex Trotsenko
e1d4c16aef QNativeSocketEngine: allocate more space for the ancillary data
As a corner case on BSD systems, we use IP_RECVIF control message to
retrieve an interface index of the received datagram. Take care about
sockaddr_dl structure, while calculating a size of the ancillary
data buffer.

Change-Id: I1c113d390a4929489c4c5858847b6262f1baa204
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2015-10-21 19:18:45 +00:00
Friedemann Kleint
a3abf9d76b Improve file handling in test of QSettings.
- Avoid duplication of slashes and use static variable for the
  const part in settingsPath().
- Do not run expensive cleanup twice in init()/cleanup() as was
  before by moving the code into a separate cleanupTestData()
  function called from cleanup() and initTestCase().
- Use QDir::removeRecursively() (which should be able to deal
  with readonly files, etc after 26bcc0565f )
  instead of system calls or the special removePath() function for
  CE/RT.
- Switch QStandardPaths into test mode.

Change-Id: Idcde2d17020eae1ea43e448266e3940c06f174ef
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
2015-10-21 16:36:10 +00:00
Laszlo Agocs
2a1d3f330d Add support for TEXTURE_EXTERNAL_OES in the internal texture blitter
Assuming that the target is always GL_TEXTURE_2D is not going to be sufficient
when working with EGLStreams for example where GL_TEXTURE_EXTERNAL_OES is a
must. The blitter is now changed to support multiple programs so other targets
can easily be added as well in the future, if necessary.

Change-Id: I247d30600222fb5af6305ed5d9740baa5e43e83e
Reviewed-by: Louai Al-Khanji <louai.al-khanji@theqtcompany.com>
2015-10-21 13:32:42 +00:00
Edward Welbourne
3dff3fdefb Several cases of s/decelerating from/decelerating to/.
The relevant easing curves all start out fast and end stationery; so
it's at the *end* that they attain zero "velocity", so they're
decelerating *to* zero, not from it.

Change-Id: I69874c46c8d42f185ff815295c4470a195cc43ae
Reviewed-by: Topi Reiniö <topi.reinio@digia.com>
2015-10-21 13:19:55 +00:00
Maurice Kalinowski
fb049254c8 WinRT: Fix InputPanel on Windows 10
Check for MSVC2015 to enable usage of IInputPane(2). Move object
construction to the XAML Thread, otherwise instantiation will fail when
running on desktop.

Task-number: QTBUG-44494
Change-Id: I816230cc5b0def796e86e6c6bb05a552a4e59d1b
Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
2015-10-21 12:59:37 +00:00
Topi Reinio
70b229d996 qdoc: Minor optimizations
Remove unnecessary type casts in qdocindexfiles.cpp, and reduce the
amount of duplicate string literals used for generating QML
documentation.

Change-Id: Ia6d68a44fad14bd7414c0106e8752999830c93e8
Reviewed-by: Martin Smith <martin.smith@digia.com>
2015-10-21 09:52:29 +00:00
Topi Reinio
d159fe199f Doc: Update examplesinstallpath to include the repository name
The examplesinstallpath variable in .qdocconf files defines the path
under QT_INSTALL_EXAMPLES where examples are found.

To match the way examples are packaged in Qt 5.6, prefix each
install path with the repository name.

Task-number: QTBUG-48736
Change-Id: I6a35c94fdacaad21cd044411aba02027b9019300
Reviewed-by: Venugopal Shivashankar <venugopal.shivashankar@digia.com>
2015-10-21 09:50:16 +00:00
Topi Reinio
04fe7af33f Doc: Improve selection of offline template type
Qt 5.6 now includes a version of the offline documentation template
with simplified CSS suited for rendering HTML with a QTextBrowser
backend.

Select the template in qt-html-templates-offline.qdocconf, instead
of the higher-level qt-module-defaults-offline.qdocconf. This is
better because many projects external to qt5 (including Qt Creator)
do not use qt-module-* includes. This way, we can control the
template selection for all projects from a config file.

Change-Id: I766af422d829f3c9519c5a45093473175363d600
Reviewed-by: Martin Smith <martin.smith@digia.com>
2015-10-21 08:15:35 +00:00
Thiago Macieira
fff3101bc6 Place classes from private headers in the Qt_5_PRIVATE_API ELF version
This way, it's possible to tell which applications and libraries depend
on the Qt private API and of which Qt library. Linux distributions can
use this information to decide which applications need to be recompiled
every time Qt itself is rebuilt.

This is done by scanning all class and struct definitions in the private
headers (we've already got the list from syncqt). I opted to add a new
script instead of modifying syncqt because then this can run in parallel
with the rest of the compilation, as opposed to during qmake
time. Another advantage is that it catches modifications to the headers
in between qmake executions.

Since this is already Unix specific, it should be no problem to use Perl.

This solution is limited to use of non-inline symbols of classes
declared in private headers. It will not catch free variables (such as
qsimd_p.h's qt_cpu_features), use of inlined functions or just plain use
of a class/struct for accessing its data members. However, this is
already better than nothing and should help Linux distributions quite a
lot. And there's no way to catch the latter issue anyway.

Change-Id: I049a653beeb5454c9539ffff13e3fff36400ebbd
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
2015-10-20 19:19:34 +00:00
Oswald Buddenhagen
8e846b337b don't try to use relative rpaths on platforms that don't support it
Change-Id: I8224d429d71ccc829beb1addf592806d2edaa87b
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
2015-10-20 17:18:29 +00:00