diff options
Diffstat (limited to 'src/plugins')
19 files changed, 511 insertions, 2 deletions
diff --git a/src/plugins/geometryloaders/CMakeLists.txt b/src/plugins/geometryloaders/CMakeLists.txt new file mode 100644 index 000000000..d2ccc5ae5 --- /dev/null +++ b/src/plugins/geometryloaders/CMakeLists.txt @@ -0,0 +1,17 @@ +# Generated from geometryloaders.pro. + +qt_feature_module_begin( + NO_MODULE + PUBLIC_FILE "qtgeometryloaders-config.h" + PRIVATE_FILE "qtgeometryloaders-config_p.h" +) +include(configure.cmake) +qt_feature_module_end(NO_MODULE) + +add_subdirectory(gltf) +if(QT_FEATURE_regularexpression) + add_subdirectory(default) +endif() +if(QT_FEATURE_qt3d_fbxsdk) + add_subdirectory(fbx) +endif() diff --git a/src/plugins/geometryloaders/configure.cmake b/src/plugins/geometryloaders/configure.cmake new file mode 100644 index 000000000..d6b257fc2 --- /dev/null +++ b/src/plugins/geometryloaders/configure.cmake @@ -0,0 +1,32 @@ +#### Inputs + +# input fbxsdk +set(INPUT_fbxsdk "undefined" CACHE STRING "") +set_property(CACHE INPUT_fbxsdk PROPERTY STRINGS undefined no system) + + +#### Libraries + +#qt_find_package(WrapAssimp 5 PROVIDED_TARGETS WrapAssimp::WrapAssimp) + +qt_config_compile_test("qt3d_fbxsdk" + LABEL "Autodesk FBX" + PROJECT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../config.tests/fbx" +# LIBRARIES WrapAssimp::WrapAssimp +# PACKAGES PACKAGE WrapAssimp 5 + ) +#### Tests + + + +#### Features + +qt_feature("qt3d_fbxsdk" PRIVATE + LABEL "Autodesk FBX" + CONDITION libs.fbx #OR FIXME +) +qt_feature_definition("qt3d_fbxsdk" "QT_3DGEOMETRYLOADERS_FBX") + +qt_configure_add_summary_section(NAME "Qt3D Geometry Loaders") +qt_configure_add_summary_entry(ARGS "qt3d_fbxsdk") +qt_configure_end_summary_section() # end of "Qt3D" section diff --git a/src/plugins/geometryloaders/default/CMakeLists.txt b/src/plugins/geometryloaders/default/CMakeLists.txt new file mode 100644 index 000000000..54a37ece0 --- /dev/null +++ b/src/plugins/geometryloaders/default/CMakeLists.txt @@ -0,0 +1,27 @@ +# Generated from default.pro. + +##################################################################### +## DefaultGeometryLoaderPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(DefaultGeometryLoaderPlugin + OUTPUT_NAME defaultgeometryloader + TYPE geometryloaders + SOURCES + basegeometryloader.cpp basegeometryloader_p.h + main.cpp + objgeometryloader.cpp + plygeometryloader.cpp + stlgeometryloader.cpp + PUBLIC_LIBRARIES + Qt::3DCore + Qt::3DCorePrivate + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui +) + +#### Keys ignored in scope 1:.:.:default.pro:<TRUE>: +# DISTFILES = "default.json" diff --git a/src/plugins/geometryloaders/fbx/CMakeLists.txt b/src/plugins/geometryloaders/fbx/CMakeLists.txt new file mode 100644 index 000000000..a9d037a8d --- /dev/null +++ b/src/plugins/geometryloaders/fbx/CMakeLists.txt @@ -0,0 +1,25 @@ +# Generated from fbx.pro. + +##################################################################### +## fbxGeometryLoaderPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(fbxGeometryLoaderPlugin + OUTPUT_NAME fbxgeometryloader + TYPE geometryloaders + SOURCES + fbxgeometryloader.cpp fbxgeometryloader.h + main.cpp + PUBLIC_LIBRARIES + Qt::3DCore + Qt::3DCorePrivate + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui + fbx +) + +#### Keys ignored in scope 1:.:.:fbx.pro:<TRUE>: +# DISTFILES = "fbx.json" diff --git a/src/plugins/geometryloaders/gltf/CMakeLists.txt b/src/plugins/geometryloaders/gltf/CMakeLists.txt new file mode 100644 index 000000000..aa8f80c19 --- /dev/null +++ b/src/plugins/geometryloaders/gltf/CMakeLists.txt @@ -0,0 +1,24 @@ +# Generated from gltf.pro. + +##################################################################### +## GLTFGeometryLoaderPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(GLTFGeometryLoaderPlugin + OUTPUT_NAME gltfgeometryloader + TYPE geometryloaders + SOURCES + gltfgeometryloader.cpp gltfgeometryloader.h + main.cpp + PUBLIC_LIBRARIES + Qt::3DCore + Qt::3DCorePrivate + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui +) + +#### Keys ignored in scope 1:.:.:gltf.pro:<TRUE>: +# DISTFILES = "gltf.json" diff --git a/src/plugins/renderers/CMakeLists.txt b/src/plugins/renderers/CMakeLists.txt new file mode 100644 index 000000000..59952e2e2 --- /dev/null +++ b/src/plugins/renderers/CMakeLists.txt @@ -0,0 +1,8 @@ +# Generated from renderers.pro. + +if(QT_FEATURE_qt3d_opengl_renderer) + add_subdirectory(opengl) +endif() +if(QT_FEATURE_qt3d_rhi_renderer AND TARGET Qt::ShaderTools) + add_subdirectory(rhi) +endif() diff --git a/src/plugins/renderers/dummy/CMakeLists.txt b/src/plugins/renderers/dummy/CMakeLists.txt new file mode 100644 index 000000000..2e0fea2af --- /dev/null +++ b/src/plugins/renderers/dummy/CMakeLists.txt @@ -0,0 +1,11 @@ +# Generated from dummy.pro. + +##################################################################### +## dummy Binary: +##################################################################### + +qt_add_executable(dummy + GUI + PUBLIC_LIBRARIES + Qt::Gui +) diff --git a/src/plugins/renderers/opengl/CMakeLists.txt b/src/plugins/renderers/opengl/CMakeLists.txt new file mode 100644 index 000000000..42aa8f0e2 --- /dev/null +++ b/src/plugins/renderers/opengl/CMakeLists.txt @@ -0,0 +1,112 @@ +# Generated from opengl.pro. + +##################################################################### +## OpenGLRendererPlugin Plugin: +##################################################################### + +add_library(OpenGLRendererLib STATIC + graphicshelpers/graphicscontext.cpp graphicshelpers/graphicscontext_p.h + graphicshelpers/graphicshelperes2.cpp graphicshelpers/graphicshelperes2_p.h + graphicshelpers/graphicshelperes3.cpp graphicshelpers/graphicshelperes3_p.h + graphicshelpers/graphicshelperes3_1.cpp graphicshelpers/graphicshelperes3_1_p.h + graphicshelpers/graphicshelperes3_2.cpp graphicshelpers/graphicshelperes3_2_p.h + graphicshelpers/graphicshelpergl2.cpp graphicshelpers/graphicshelpergl2_p.h + graphicshelpers/graphicshelpergl3_2.cpp graphicshelpers/graphicshelpergl3_2_p.h + graphicshelpers/graphicshelpergl3_3.cpp graphicshelpers/graphicshelpergl3_3_p.h + graphicshelpers/graphicshelpergl4.cpp graphicshelpers/graphicshelpergl4_p.h + graphicshelpers/graphicshelperinterface_p.h + graphicshelpers/imagesubmissioncontext.cpp graphicshelpers/imagesubmissioncontext_p.h + graphicshelpers/qgraphicsutils_p.h + graphicshelpers/submissioncontext.cpp graphicshelpers/submissioncontext_p.h + graphicshelpers/texturesubmissioncontext.cpp graphicshelpers/texturesubmissioncontext_p.h + io/glbuffer.cpp io/glbuffer_p.h + jobs/filtercompatibletechniquejob.cpp jobs/filtercompatibletechniquejob_p.h + jobs/materialparametergathererjob.cpp jobs/materialparametergathererjob_p.h + jobs/renderviewcommandbuilderjob.cpp jobs/renderviewcommandbuilderjob_p.h + jobs/renderviewcommandupdaterjob.cpp jobs/renderviewcommandupdaterjob_p.h + jobs/renderviewinitializerjob.cpp jobs/renderviewinitializerjob_p.h + jobs/renderviewjobutils.cpp jobs/renderviewjobutils_p.h + managers/gl_handle_types_p.h + managers/glresourcemanagers.cpp managers/glresourcemanagers_p.h + renderer/commandexecuter.cpp renderer/commandexecuter_p.h + renderer/frameprofiler_p.h + renderer/glfence_p.h + renderer/gllights.cpp renderer/gllights_p.h + renderer/glshader.cpp renderer/glshader_p.h + renderer/logging.cpp renderer/logging_p.h + renderer/openglvertexarrayobject.cpp renderer/openglvertexarrayobject_p.h + renderer/rendercommand.cpp renderer/rendercommand_p.h + renderer/renderer.cpp renderer/renderer_p.h + renderer/renderercache_p.h + renderer/renderqueue.cpp renderer/renderqueue_p.h + renderer/renderview.cpp renderer/renderview_p.h + renderer/renderviewbuilder.cpp renderer/renderviewbuilder_p.h + renderer/shaderparameterpack.cpp renderer/shaderparameterpack_p.h + renderer/shadervariables_p.h + textures/gltexture.cpp textures/gltexture_p.h + textures/renderbuffer.cpp textures/renderbuffer_p.h +) + +target_include_directories(OpenGLRendererLib PUBLIC + graphicshelpers + io + jobs + managers + renderer + textures +) + +target_link_libraries(OpenGLRendererLib + PRIVATE + Qt::OpenGLExtensions + PUBLIC + Qt::3DCore + Qt::3DCorePrivate + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui + Qt::GuiPrivate + Qt::OpenGL + Qt::OpenGLPrivate +) + +target_compile_definitions(OpenGLRendererLib PRIVATE + BUILD_QT3D_MODULE + QT_BUILDING_QT + QT_NO_FOREACH +) + +qt_extend_target(OpenGLRendererLib CONDITION NOT INTEGRITY + SOURCES + debug/imguirenderer.cpp debug/imguirenderer_p.h + ${PROJECT_SOURCE_DIR}/src/3rdparty/imgui/imgui.cpp + ${PROJECT_SOURCE_DIR}/src/3rdparty/imgui/imgui_draw.cpp + ${PROJECT_SOURCE_DIR}/src/3rdparty/imgui/imgui_widgets.cpp + INCLUDE_DIRECTORIES + debug + ${PROJECT_SOURCE_DIR}/src/3rdparty/imgui +) + + +qt_internal_add_plugin(OpenGLRendererPlugin + OUTPUT_NAME openglrenderer + TYPE renderers + SOURCES + main.cpp + LIBRARIES + OpenGLRendererLib +) + +## Scopes: +##################################################################### + +qt_extend_target(OpenGLRendererPlugin CONDITION gcov + COMPILE_OPTIONS + -fprofile-arcs + -ftest-coverage + LINK_OPTIONS + "-fprofile-arcs" + "-ftest-coverage" +) diff --git a/src/plugins/renderers/opengl/debug/imguirenderer.cpp b/src/plugins/renderers/opengl/debug/imguirenderer.cpp index 9445eb418..c2ec6152a 100644 --- a/src/plugins/renderers/opengl/debug/imguirenderer.cpp +++ b/src/plugins/renderers/opengl/debug/imguirenderer.cpp @@ -163,6 +163,8 @@ ImGuiRenderer::ImGuiRenderer(Qt3DRender::Render::OpenGL::Renderer *renderer) m_jobsRange.first = m_jobsRange.second = 0.f; } +ImGuiRenderer::~ImGuiRenderer() = default; + void ImGuiRenderer::renderDebugOverlay(const QVector<RenderView *> &renderViews, const RenderView *renderView, int jobsInLastFrame) { if (!newFrame(renderView)) diff --git a/src/plugins/renderers/opengl/debug/imguirenderer_p.h b/src/plugins/renderers/opengl/debug/imguirenderer_p.h index 33a7af282..b4b43dc72 100644 --- a/src/plugins/renderers/opengl/debug/imguirenderer_p.h +++ b/src/plugins/renderers/opengl/debug/imguirenderer_p.h @@ -81,10 +81,10 @@ namespace Debug { #define IMGUI_PERF_LOG_SIZE 30 -class ImGuiRenderer : public QObject { - Q_OBJECT +class Q_AUTOTEST_EXPORT ImGuiRenderer : public QObject { public: ImGuiRenderer(Qt3DRender::Render::OpenGL::Renderer *renderer); + ~ImGuiRenderer(); void processEvent(QEvent *event); void renderDebugOverlay(const QVector<Render::OpenGL::RenderView *> &renderViews, const Render::OpenGL::RenderView *renderView, int jobsInLastFrame); diff --git a/src/plugins/renderers/opengl/opengl.cmake b/src/plugins/renderers/opengl/opengl.cmake new file mode 100644 index 000000000..2eb35f6d9 --- /dev/null +++ b/src/plugins/renderers/opengl/opengl.cmake @@ -0,0 +1,9 @@ +function(qt3d_setup_opengl_renderer_target target) + + set(glplugindir ${PROJECT_SOURCE_DIR}/src/plugins/renderers/opengl) + target_link_libraries(${target} + PRIVATE + OpenGLRendererLib + ) + +endfunction() diff --git a/src/plugins/renderers/rhi/CMakeLists.txt b/src/plugins/renderers/rhi/CMakeLists.txt new file mode 100644 index 000000000..62bb695a8 --- /dev/null +++ b/src/plugins/renderers/rhi/CMakeLists.txt @@ -0,0 +1,73 @@ +# Generated from rhi.pro. + +##################################################################### +## RhiRendererPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(RhiRendererPlugin + OUTPUT_NAME rhirenderer + TYPE renderers + SOURCES + graphicshelpers/submissioncontext.cpp graphicshelpers/submissioncontext_p.h + io/rhibuffer.cpp io/rhibuffer_p.h + jobs/filtercompatibletechniquejob.cpp jobs/filtercompatibletechniquejob_p.h + jobs/materialparametergathererjob.cpp jobs/materialparametergathererjob_p.h + jobs/renderviewcommandbuilderjob.cpp jobs/renderviewcommandbuilderjob_p.h + jobs/renderviewcommandupdaterjob.cpp jobs/renderviewcommandupdaterjob_p.h + jobs/renderviewinitializerjob.cpp jobs/renderviewinitializerjob_p.h + jobs/renderviewjobutils.cpp jobs/renderviewjobutils_p.h + main.cpp + managers/rhihandle_types_p.h + managers/rhiresourcemanagers.cpp managers/rhiresourcemanagers_p.h + renderer/commandexecuter.cpp renderer/commandexecuter_p.h + renderer/logging.cpp renderer/logging_p.h + renderer/rendercommand.cpp renderer/rendercommand_p.h + renderer/renderer.cpp renderer/renderer_p.h + renderer/renderercache_p.h + renderer/renderqueue.cpp renderer/renderqueue_p.h + renderer/renderview.cpp renderer/renderview_p.h + renderer/renderviewbuilder.cpp renderer/renderviewbuilder_p.h + renderer/rhigraphicspipeline.cpp renderer/rhigraphicspipeline_p.h + renderer/rhishader.cpp renderer/rhishader_p.h + renderer/shaderparameterpack.cpp renderer/shaderparameterpack_p.h + renderer/shadervariables_p.h + textures/renderbuffer.cpp textures/renderbuffer_p.h + textures/texture.cpp textures/texture_p.h + DEFINES + QT_BUILDING_QT + QT_NO_FOREACH QT_NO_FOREACH + INCLUDE_DIRECTORIES + ${CMAKE_CURRENT_SOURCE_DIR} + graphicshelpers + io + jobs + managers + renderer + textures + PUBLIC_LIBRARIES + Qt::3DCore + Qt::3DCorePrivate + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui + Qt::GuiPrivate + Qt::ShaderTools + Qt::ShaderToolsPrivate +) + +#### Keys ignored in scope 1:.:.:rhi.pro:<TRUE>: +# DISTFILES = "rhirenderer.json" + +## Scopes: +##################################################################### + +qt_extend_target(RhiRendererPlugin CONDITION gcov + COMPILE_OPTIONS + -fprofile-arcs + -ftest-coverage + LINK_OPTIONS + "-fprofile-arcs" + "-ftest-coverage" +) diff --git a/src/plugins/renderplugins/CMakeLists.txt b/src/plugins/renderplugins/CMakeLists.txt new file mode 100644 index 000000000..42389e72a --- /dev/null +++ b/src/plugins/renderplugins/CMakeLists.txt @@ -0,0 +1,3 @@ +# Generated from renderplugins.pro. + +add_subdirectory(scene2d) diff --git a/src/plugins/renderplugins/scene2d/CMakeLists.txt b/src/plugins/renderplugins/scene2d/CMakeLists.txt new file mode 100644 index 000000000..bb1c4599d --- /dev/null +++ b/src/plugins/renderplugins/scene2d/CMakeLists.txt @@ -0,0 +1,27 @@ +# Generated from scene2d.pro. + +##################################################################### +## Scene2DPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(Scene2DPlugin + OUTPUT_NAME scene2d + TYPE renderplugins + SOURCES + main.cpp + scene2dplugin.cpp scene2dplugin.h + PUBLIC_LIBRARIES + Qt::3DCore + Qt::3DCorePrivate + Qt::3DExtras + Qt::3DQuickScene2D + Qt::3DQuickScene2DPrivate + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui +) + +#### Keys ignored in scope 1:.:.:scene2d.pro:<TRUE>: +# DISTFILES = "scene2dplugin.json" diff --git a/src/plugins/sceneparsers/CMakeLists.txt b/src/plugins/sceneparsers/CMakeLists.txt new file mode 100644 index 000000000..d6e3834f9 --- /dev/null +++ b/src/plugins/sceneparsers/CMakeLists.txt @@ -0,0 +1,17 @@ +# Generated from sceneparsers.pro. + +qt_feature_module_begin( + NO_MODULE + PUBLIC_FILE "qtsceneparsers-config.h" + PRIVATE_FILE "qtsceneparsers-config_p.h" +) +include(configure.cmake) +qt_feature_module_end(NO_MODULE) + +add_subdirectory(gltf) +if((GCC AND QT_COMPILER_VERSION_MAJOR STRGREATER 4) OR (QT_FEATURE_assimp AND NOT IOS AND NOT TVOS AND NOT qcc AND (CLANG OR QT_FEATURE_system_assimp OR android-clang OR win32-msvc))) + add_subdirectory(assimp) +endif() +if(QT_FEATURE_regularexpression AND QT_FEATURE_temporaryfile) + add_subdirectory(gltfexport) +endif() diff --git a/src/plugins/sceneparsers/assimp/CMakeLists.txt b/src/plugins/sceneparsers/assimp/CMakeLists.txt new file mode 100644 index 000000000..63c1453aa --- /dev/null +++ b/src/plugins/sceneparsers/assimp/CMakeLists.txt @@ -0,0 +1,33 @@ +# Generated from assimp.pro. + +##################################################################### +## AssimpSceneImportPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(AssimpSceneImportPlugin + OUTPUT_NAME assimpsceneimport + TYPE sceneparsers + EXCEPTIONS # special case + SOURCES + assimphelpers.cpp assimphelpers.h + assimpimporter.cpp assimpimporter.h + main.cpp + PUBLIC_LIBRARIES + Qt::3DAnimation + Qt::3DCore + Qt::3DCorePrivate + Qt::3DExtras + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui +) + +#### Keys ignored in scope 1:.:.:assimp.pro:<TRUE>: +# DISTFILES = "assimp.json" + +## Scopes: +##################################################################### +include(../../../3rdparty/assimp/assimp.cmake) +qt3d_extend_target_for_assimp(AssimpSceneImportPlugin) diff --git a/src/plugins/sceneparsers/configure.cmake b/src/plugins/sceneparsers/configure.cmake new file mode 100644 index 000000000..ab92ee0a2 --- /dev/null +++ b/src/plugins/sceneparsers/configure.cmake @@ -0,0 +1,39 @@ + + +#### Inputs + +# input assimp +set(INPUT_assimp "undefined" CACHE STRING "") +set_property(CACHE INPUT_assimp PROPERTY STRINGS undefined no qt system) + + +#### Libraries + +qt_find_package(WrapAssimp 5 PROVIDED_TARGETS WrapAssimp::WrapAssimp) + +qt_config_compile_test("assimp" + LABEL "Assimp" + PROJECT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../../config.tests/assimp" + LIBRARIES WrapAssimp::WrapAssimp + PACKAGES PACKAGE WrapAssimp 5) + +#### Tests + + + +#### Features + +qt_feature("assimp" PUBLIC PRIVATE + LABEL "Assimp" +) +qt_feature_definition("assimp" "QT_NO_ASSIMP" NEGATE VALUE "1") +qt_feature("system-assimp" PRIVATE + LABEL "System Assimp" + CONDITION QT_FEATURE_assimp AND TEST_assimp + ENABLE INPUT_assimp STREQUAL 'system' + DISABLE INPUT_assimp STREQUAL 'qt' +) +qt_configure_add_summary_section(NAME "Qt3D Scene Parsers") +qt_configure_add_summary_entry(ARGS "assimp") +qt_configure_add_summary_entry(ARGS "system-assimp") +qt_configure_end_summary_section() # end of "Qt3D" section diff --git a/src/plugins/sceneparsers/gltf/CMakeLists.txt b/src/plugins/sceneparsers/gltf/CMakeLists.txt new file mode 100644 index 000000000..a2e8aaf25 --- /dev/null +++ b/src/plugins/sceneparsers/gltf/CMakeLists.txt @@ -0,0 +1,25 @@ +# Generated from gltf.pro. + +##################################################################### +## GLTFSceneImportPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(GLTFSceneImportPlugin + OUTPUT_NAME gltfsceneimport + TYPE sceneparsers + SOURCES + gltfimporter.cpp gltfimporter.h + main.cpp + PUBLIC_LIBRARIES + Qt::3DCore + Qt::3DCorePrivate + Qt::3DExtras + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui +) + +#### Keys ignored in scope 1:.:.:gltf.pro:<TRUE>: +# DISTFILES = "gltf.json" diff --git a/src/plugins/sceneparsers/gltfexport/CMakeLists.txt b/src/plugins/sceneparsers/gltfexport/CMakeLists.txt new file mode 100644 index 000000000..6a2473a36 --- /dev/null +++ b/src/plugins/sceneparsers/gltfexport/CMakeLists.txt @@ -0,0 +1,25 @@ +# Generated from gltfexport.pro. + +##################################################################### +## GLTFSceneExportPlugin Plugin: +##################################################################### + +qt_internal_add_plugin(GLTFSceneExportPlugin + OUTPUT_NAME gltfsceneexport + TYPE sceneparsers + SOURCES + gltfexporter.cpp gltfexporter.h + main.cpp + PUBLIC_LIBRARIES + Qt::3DCore + Qt::3DCorePrivate + Qt::3DExtras + Qt::3DRender + Qt::3DRenderPrivate + Qt::Core + Qt::CorePrivate + Qt::Gui +) + +#### Keys ignored in scope 1:.:.:gltfexport.pro:<TRUE>: +# DISTFILES = "gltfexport.json" |