Commit Graph

1500 Commits

Author SHA1 Message Date
hjk
0415bea736 Tests: gtest unittest: improve compilability
... with recent (namespaced) Qt dev.

[...]tests/unit/unittest/3rdparty/googletest/googletest/include/gtest/gtest-matchers.h:184:14: error: invalid conversion from 'const char*' to 'ushort' {aka 'short unsigned int'} [-fpermissive]
In file included from /data/dev/qt-6-ns/qtbase/include/QtCore/qstring.h:1,
                 from /data/dev/qt-6-ns/qtbase/include/QtCore/QString:1,
                 from /data/dev/creator-out/src/libs/utils/smallstringview.h:9,
                 from /data/dev/creator-out/src/libs/utils/smallstringliteral.h:8,
                 from /data/dev/creator-out/src/libs/utils/smallstring.h:8,
                 from /data/dev/creator-out/src/libs/utils/smallstringvector.h:8,
                 from /data/dev/creator-out/src/libs/utils/smallstringio.h:6,
                 from /data/dev/creator-out/tests/unit/unittest/gtest-creator-printing.h:7,
                 from /data/dev/creator-out/tests/unit/unittest/googletest.h:17,
                 from /data/dev/creator-out/tests/unit/unittest/externaldependenciesmock.h:6,
                 from /data/dev/creator-out/tests/unit/unittest/modulescanner-test.cpp:4:
a/dev/qt-6-ns/qtbase/src/corelib/text/qstring.h:1006:61: note:   initializing argument 2 of 'bool Ns::operator==(const Ns::QString&, Ns::QChar)'
[104/1218] Building CXX object src/plugins/coreplugin/CMakeFiles/Core.dir/locator/executefilter.cpp.o^C

Change-Id: Id8d4533b9e53d7aa81edc64a99df31dd1d6ac5bf
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-06-13 08:41:23 +00:00
Tim Jenssen
66263782ec Merge remote-tracking branch 'origin/11.0' into qds/dev
Conflicts:
  src/plugins/qmldesigner/components/stateseditor/stateseditorview.cpp
  src/plugins/qmldesigner/components/stateseditornew/stateseditorview.cpp
  src/plugins/qmldesigner/designercore/model/qmltextgenerator.cpp
  src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp

Change-Id: I4c8a33736b25c3bb24241224d0a1e7358bb7fd94
2023-06-08 16:35:56 +02:00
Marco Bubke
263152cc81 UnitTests: Cleanup
Instead of putting everything into one big target there are now
libraries which are used by the tests.

Change-Id: I15727924f76b5cb600b7e533e7a6b8701dba81e0
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Burak Hancerli <burak.hancerli@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-06-08 12:31:40 +00:00
Marco Bubke
eaf4391660 UnitTests: Make test names more readable
A majority prefers snake case for long names and because test names are
describtive they have to be long.

Change-Id: I898beb5c9f1b9ab7f7c285b6278454068744f5da
Reviewed-by: Burak Hancerli <burak.hancerli@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-06-07 15:49:27 +00:00
Burak Hancerli
8af0c065ac QmlProject: Reorganize unittests
Task-number: QDS-9946
Change-Id: Ib165340d13e40c6e8fba08a828ceecb312dd5dde
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-06-07 13:14:27 +00:00
Jarek Kobus
abb85b073a QScopeGuard: Make all usages of QScopeGuard consistent
Change-Id: Icfc35ecbdbdee8dadbb1b17789694093427c3ed9
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-06-07 10:35:01 +00:00
Marco Bubke
71e1a77197 QmlDesigner: Add removal for binding properties
If an id is present in a binding expression and the node with that id is
removed we remove the expression is removed too.

Task-number: QDS-10018
Change-Id: I6c33005edcbcafbff7dd82af47977b238068eba1
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-06-07 08:09:40 +00:00
Burak Hancerli
5dadc57bc3 QmlProject: Fix escaping while rewriting the qmlproject file
Task-number: QDS-10032
Change-Id: I856d9935a1c77085f79008db19920f12af9e1a21
Reviewed-by: Henning Gründl <henning.gruendl@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
2023-06-06 10:16:30 +00:00
Tim Jenssen
002d84cb15 Merge remote-tracking branch 'origin/11.0' into qds/dev
Conflicts: src/plugins/qmldesigner/designercore/metainfo/metainfo.cpp
  src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp
  tests/auto/qml/qmlprojectmanager/fileformat/fileformat.qbs
  tests/auto/qml/qmlprojectmanager/fileformat/tst_fileformat.cpp

Change-Id: I257f1908917bcc58805619b53b6866f2f73ca544
2023-06-02 19:26:05 +00:00
Marco Bubke
cffd45890b UnitTests: Fix warning in ModelResourceManagement
Change-Id: I13e9bae5e3431ac131ce9a9de492a011f5e5a979
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-06-02 11:32:56 +00:00
Marco Bubke
1655f1f622 QmlDesigner: Remove FlowTransition if to or from targets are removed
Task-number: QDS-9766
Change-Id: I41c5d6769400772aa4b0d8b395b6a7ed79270cbd
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-06-01 13:53:53 +00:00
Marco Bubke
23c2668657 QmlDesigner: Update clang-format
Change-Id: I1793898e27a92aaf3f4f88390537c405d1f27427
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-06-01 12:20:14 +00:00
Marco Bubke
4e91fd627a Don't add braces around single line scopes
There is a new option which adds braces:
https://clang.llvm.org/docs/ClangFormatStyleOptions.html#insertbraces

Change-Id: I1b0da930fa9faadb215fff4ed653bc95da0a6a17
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
2023-06-01 09:03:18 +00:00
Marco Bubke
40954b8767 QmlDesigner: Handle invalid nodes and properties better
rMdel::removeModelNodes and Model::removeProperties should filter
invalid nodes.

Change-Id: I270f6712cbcc0cd672c9551cccd1de5e740eb549
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-06-01 08:07:35 +00:00
Marco Bubke
8a69afc1bd QmlDesigner: Fix model resource management bypass
Fixes: QDS-9766
Change-Id: I7a242b8e922140f7e100e90af1cd5029e82fcb5c
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-05-31 14:48:57 +00:00
Marco Bubke
397a95689f QmlDesigner: Add removing of multiple nodes and properties
Sometimes multiple nodes or properties has to be removed. In that case
there is also the possibilty that we want to bypass the model resource
management.

Task-number: QDS-9766
Change-Id: I6c3cb0f682a7579f23d72431f641e2f812e2c63c
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-05-31 14:02:16 +00:00
Burak Hancerli
fbc4848f96 QmlProject: Support QDS. prefix when reading
This patch also includes a small update to skip creating 'shaderTool'
object in the json container if it doesn't exist in the qmlproject
file.

Task-number: QDS-9969
Change-Id: I1b8639c5e0a57aa77cbd417b51d57c1f4910613a
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-05-31 09:44:23 +00:00
Marco Bubke
504d24db30 QmlDesigner: Model resource management
The model is now deleting and changing the dependencies by itself. That
has the advantage of consistency. So if a node is now removed all the
dependecies will be deleted changing in the same way.

Task-number: QDS-9766
Change-Id: I1edf9ce172e51b9f52b62612ed2bb7386bf5b221
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
2023-05-31 08:05:59 +00:00
Marco Bubke
8330d4463a Sqlite: Fix that prepare is not checking that the database is locked
The database has to be locked because otherwise it is not thread save.
Because Sqlite connections are already called in different threads this
has to be enforced. The easiest way to lock a database is to put it in a
transaction.

It should be ok without locking so long the connection is only called
from one thread but I prefer to enforce it because I have already seen
code was preparing a statement not on initialization stage where it is
highly unlikely that there is more than one thread pre connection but in
the middle of the code. Because preparing is much more expensive than a
lock I prefer to enfore a lock here.

Change-Id: Id0b47f8d615a6697bb807392cafbe976bdd37233
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
2023-05-30 11:20:00 +00:00
Marco Bubke
2981feefd7 Sqlite: Improve readCallback
There are many callback which do not control the flow and want to be
called for all steps. For that case we assume that a callback without a
return value will continue always.

Change-Id: I706123f2c425ac8c937d4d60ab977dae5ea9b030
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
2023-05-30 09:59:19 +00:00
Burak Hancerli
dee8926bb5 QmlProject: Fix test data and rename the tests
Change-Id: I4b8ddf442fed0f1a38ca5cf642bd3f31a00e973b
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
2023-05-26 07:33:03 +00:00
Eike Ziller
77c7a759b7 Merge remote-tracking branch 'origin/11.0'
Conflicts:
	tests/unit/unittest/qmlprojectmanager/CMakeLists.txt

Change-Id: Ib6fd9bf09d654a7a2fe995dad3bcd93eacade2fb
2023-05-25 08:56:09 +02:00
Burak Hancerli
d47fd13058 QmlProject: Remove old test residuals
Change-Id: I800c3e9fe70725935aac5baf58763b7dabc6262a
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-05-24 12:09:38 +00:00
Alessandro Portale
9dcd2cf40b Add target condition to targets depending on QmlProjectManagerLib
The lib is only built with Qt 6.4.3 and higher

Change-Id: I825bab26b90565d315fed4a3ad1a3e6adf726ac6
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Burak Hancerli <burak.hancerli@qt.io>
2023-05-23 14:21:18 +00:00
Christian Stenger
cd267ca4bf Tests: Fix build before Qt 6.4.3
Change-Id: I6859b6c2a42f44e5bc24f569290869008f60d1b2
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
2023-05-23 11:54:20 +00:00
Tim Jenssen
1b6c0ff56c Merge remote-tracking branch 'origin/qds/dev'
Conflicts:
  coin/instructions/build.yaml
  doc/qtcreator/src/projects/creator-only/creator-projects-creating.qdoc
  share/qtcreator/qmldesigner/studio_templates/projects/common/CMakeLists.main.txt.tpl
  src/libs/CMakeLists.txt
  src/libs/advanceddockingsystem/dockmanager.cpp
  src/libs/advanceddockingsystem/workspacedialog.cpp
  src/plugins/coreplugin/manhattanstyle.cpp
  src/plugins/qmldesigner/CMakeLists.txt
  src/plugins/qmldesigner/components/formeditor/toolbox.cpp
  src/plugins/qmldesigner/components/itemlibrary/itemlibraryassetimporter.cpp
  src/plugins/qmldesigner/components/toolbar/toolbarbackend.cpp
  src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.h
  src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp
  src/plugins/qmldesignerbase/qmldesignerbaseplugin.cpp
  src/plugins/qmldesignerbase/qmldesignerbaseplugin.h
  src/plugins/qmlprojectmanager/qmlproject.cpp
  src/tools/qml2puppet/CMakeLists.txt
  tests/unit/unittest/CMakeLists.txt

Change-Id: I2c5f18c4fca49471d02713ce5859032232cf7756
2023-05-22 21:13:40 +02:00
Marco Bubke
5eba056b73 QmlDesigner: Add callbacks for model resource management
As a node or property is removed there are now callbacks to generate
node, properties and expressions which should removed or adapt too.

Task-number: QDS-9766
Change-Id: I6d842006a6282af00ff644ffaa0f3102e14f13fa
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
2023-05-22 15:19:55 +00:00
Marco Bubke
be824148be Sqlite: Improve transaction by inversion of control
Using a callable makes it possible to omit the commit call. It is now
called by the withDeferredTransaction and withImmediateTransaction
function.

Change-Id: I9b7bfa7e32f269fe8fcba2fe5e1218e73f5846d1
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Vikas Pachdha <vikas.pachdha@qt.io>
2023-05-22 10:07:40 +00:00
Burak Hancerli
057b4428d8 QmlDesigner: Refactor QmlProjectManager tests
Task-number: QDS-9743
Change-Id: Ia5e788fcebacef59ba12226e2c873f5cbf8954ba
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-05-16 08:17:40 +00:00
David Schulz
1acd2499e2 Utils: replace LineColumn with Text::Position
Change-Id: Ia69547374efec7412717cbed1eb4162162a89d39
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
2023-05-11 17:00:28 +00:00
Marco Bubke
a6ba2354cc QmlDesigner: Cleanup the Qt conditions
We have now demand QmlPrivate, QmlDomPrivate and QmlCompilerPrivate.

Change-Id: I77fa5b506c827b9ba2f7ea18e3ffdd176c1871ec
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-05-11 09:12:13 +00:00
Marco Bubke
849b8cf000 QmlDesigner: Improve sqlite id
https://www.sqlite.org/autoinc.html says that "If no negative ROWID
values are inserted explicitly, then automatically generated ROWID
values will always be greater than zero."

So zero is an invalid value.

This changes reflect on it and makes it an invalid value too. Null is a
special value in SQL and it could cast to zero by accident. To prevent
that ambiguty we make zero an invalid value too.
You can explicit add negative rowids but that has size overhead because
positive values can be compressed. So explicit not positive values are
not supported.

Change-Id: I417ea9fec1573cfd9f1a98134f8adc567021988c
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-05-09 13:42:31 +00:00
Jarek Kobus
936086745a FileSearch: Get rid of FileSearchResult
Use SearchResultItem instead.
This change should reduce the remaining freeze described in
a9eb732ce6 even more.

Change-Id: I102b82ed5677360ccd9e425dd0bdd941d87116f0
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
2023-05-09 11:03:48 +00:00
Tim Jenssen
5a88c3ffc1 QmlDesigner: improve ModuleScanner
handle empty path and paths better

Task-number: QDS-9847
Change-Id: I9dc6f7972835a366a046d06641fbb64494c734fc
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-05-08 15:29:27 +00:00
Tim Jenssen
1d183e4de7 QmlDesigner: use GTEST_INTERNAL_HAS_STRING_VIEW for str compare
constData() was a workaround for the tests

Task-number: QDS-9847
Change-Id: I23fcca794ab50101ae70034079af46303c98c648
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-05-08 15:29:16 +00:00
Marco Bubke
4be3f6b5e9 QmlDesigner: Improve version handling
Consolidate version handling in imports. It has drawbacks if we copy
code to different places in our code base. Having tests for the version
conversion has advantages too.

The invalid version has not anymore using -1 but the maximum integer as
indicator because an empty version is higher than any other version.

Change-Id: I8608b9509660f4253e8e5ba7397d964defe35e51
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-05-08 11:35:59 +00:00
Marco Bubke
5b9950c5d0 QmlDesigner: Make meta info system mockable
Using the projectstorage mechanism we introduce a flag for the test, so
we can use ProjectStorageInterface instead of ProjectStorage. It has the
overhead of a virtual function interface but for the test that is
neglectable. In the test we can now use a project storage mock to
emulate the meta info system. Later we could use a pregenerated database
file to create a fake project storage.

Task-number: QDS-9766
Change-Id: I16efa28bc4b12181941adecc132084157156daec
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-05-08 11:18:15 +00:00
Marco Bubke
32f84fc05a QmlDesigner: Move Version to different namespace
We want to use it not only for synchronization.

Task-number: QDS-9766
Change-Id: I26a2ade8203d9c5131e8dec101885434713f8252
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-05-08 10:52:20 +00:00
Jarek Kobus
8b3aa900da Utils: Move SearchResultItem/Color into Utils
It's going to be reused inside FileSearch.

Change-Id: I8993d7158ff31c311c2283d32bc43465a8946a52
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
2023-05-08 06:41:27 +00:00
Marco Bubke
c88417cf48 Utils: Silence warning for GCC too
GCC is recognized by clangso we silence both.

Change-Id: I377caa344a60636e3c73404d9d02a4dfc2eda794
Reviewed-by: Burak Hancerli <burak.hancerli@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-05-03 16:08:20 +00:00
Aleksei German
26acabe625 QmlDesigner: Fix tests compilation
availableInVersion() was removed

Change-Id: Ic98f585ae9b4a8dcdf83281eb6e272b01f3ae4b7
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-05-03 10:02:16 +00:00
Eike Ziller
66c0c36bc1 Fix compiler warnings
Change-Id: I9b0b4a60d1152142f62bf3f76885cf8019714623
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Sivert Krøvel <sivert.krovel@qt.io>
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
2023-05-02 09:05:16 +00:00
Marco Bubke
de2154f1c9 QmlDesigner: Add versioning for core modules
Task-number: QDS-9786
Change-Id: I56c6e9ca06ffcfcaf35cbbee061cb99e7297fca5
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Burak Hancerli <burak.hancerli@qt.io>
2023-04-26 13:16:40 +00:00
Marco Bubke
b929cbfd64 QmlDesigner: Fix QmlTypesParser
Change-Id: I826e1a37747a51602f3f7a8ea675320787080272
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
2023-04-26 09:55:47 +00:00
Marco Bubke
45cf905b29 QmlDesigner: Fix version scanning
Switch was missing.

Change-Id: I5d87e624f698b9f59fe57cf49cafef4e6d08eca2
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Reviewed-by: Aleksei German <aleksei.german@qt.io>
2023-04-25 10:31:32 +00:00
Marco Bubke
eafe43399d QmlDesigner: Remove duplicates
Change-Id: I5b2d8433c0aca286ec530f237750ba660c409a48
Reviewed-by: Aleksei German <aleksei.german@qt.io>
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2023-04-25 10:31:20 +00:00
Marco Bubke
34c69766dd QmlDesigner: Add version scanning for Qt5
Add some hardwired code for lagacy Qt5 support.

Task-number: QDS-9542
Change-Id: I505685042f53b7e653e76c8d883c8d7bb30605d7
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-04-19 15:58:21 +00:00
Marco Bubke
6035ff939d QmlDesigner: Add module scanner
For performance reason we want to get the qml modules directly from the
file system. When the project storage is finished we can get the modules
from there.

Task-number: QDS-9542
Change-Id: I26d4b028fbf5ebc541fcd8e34d285ded1fb14935
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
2023-04-19 13:58:22 +00:00
Marco Bubke
318bb02801 QmlDesigner: React on watcher notification
The watcher notifies the updater if files or directories are changed.
The updater then does minimal updates to the project storage. Common
cases like that the qml documents or qmltypes are changed are handled by
an extra path. Otherwise we trigger a directory update. If the directory
is in 'strange' state like the qmltypes file is removed but the qmldir
is not updated the changed file ids are saved and used additionally in
the next notification.

Task-number: QDS-9479
Change-Id: Ie82fd914b2e229f0315bf60df398c85477ce5a26
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
2023-04-04 10:44:09 +00:00
Tim Jenssen
adb664f521 Merge remote-tracking branch 'origin/qds/dev'
Conflicts: src/libs/utils/filepath.cpp
  src/plugins/qmldesigner/qmldesignerexternaldependencies.cpp
  src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp
  tests/unit/unittest/CMakeLists.txt

Change-Id: I017a6075db41a5233487ac855ffe23de2b2bb0ee
2023-03-30 13:30:42 +00:00