Skip to content

Commit abe10fc

Browse files
committed
switch to ci extension tools, use vcpkg from zlib instead
1 parent deb64b2 commit abe10fc

8 files changed

+39
-207
lines changed

.github/workflows/MainDistributionPipeline.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ concurrency:
2424
jobs:
2525
duckdb-latest-build:
2626
name: Build extension binaries
27-
uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@v1.1.0
27+
uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@main
2828
with:
2929
duckdb_version: main
3030
extension_name: spatial
31-
ci_tools_version: v1.1.3
31+
ci_tools_version: main
3232

3333
duckdb-latest-deploy:
3434
name: Deploy extension binaries
3535
needs: duckdb-latest-build
36-
uses: duckdb/extension-ci-tools/.github/workflows/_extension_deploy.yml@v1.1.0
36+
uses: duckdb/extension-ci-tools/.github/workflows/_extension_deploy.yml@main
3737
secrets: inherit
3838
with:
3939
duckdb_version: main

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
[submodule "duckdb"]
22
path = duckdb
33
url = https://github.com/duckdb/duckdb.git
4+
[submodule "extension-ci-tools"]
5+
path = extension-ci-tools
6+
url = https://github.com/duckdb/extension-ci-tools.git

CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ if(NOT EXISTS ${CMAKE_BINARY_DIR}/deps)
5555
-DVCPKG_INSTALLED_DIR='${CMAKE_BINARY_DIR}/vcpkg_installed'
5656
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
5757
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
58+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
5859
-S ${CMAKE_CURRENT_SOURCE_DIR}/deps -B ${CMAKE_BINARY_DIR}/deps
5960
RESULT_VARIABLE DEPENDENCIES_GENERATE_RESULT)
6061
if(NOT DEPENDENCIES_GENERATE_RESULT EQUAL 0)

Makefile

+6-178
Original file line numberDiff line numberDiff line change
@@ -1,180 +1,8 @@
1-
.PHONY: all clean format debug release duckdb_debug duckdb_release pull update
1+
PROJ_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
22

3-
all: release
3+
# Configuration of extension
4+
EXT_NAME=excel
5+
EXT_CONFIG=${PROJ_DIR}extension_config.cmake
46

5-
DUCKDB_SRCDIR ?= "./duckdb/"
6-
7-
MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
8-
PROJ_DIR := $(dir $(MKFILE_PATH))
9-
10-
TEST_PATH="/test/unittest"
11-
DUCKDB_PATH="/duckdb"
12-
13-
# For non-MinGW windows the path is slightly different
14-
ifeq ($(OS),Windows_NT)
15-
ifneq ($(CXX),g++)
16-
TEST_PATH="/test/Release/unittest.exe"
17-
DUCKDB_PATH="/Release/duckdb.exe"
18-
endif
19-
endif
20-
21-
#### OSX config
22-
OSX_BUILD_FLAG=
23-
ifneq (${OSX_BUILD_ARCH}, "")
24-
OSX_BUILD_FLAG=-DOSX_BUILD_ARCH=${OSX_BUILD_ARCH}
25-
endif
26-
27-
#### VCPKG config
28-
VCPKG_TOOLCHAIN_PATH?=
29-
ifneq ("${VCPKG_TOOLCHAIN_PATH}", "")
30-
TOOLCHAIN_FLAGS:=${TOOLCHAIN_FLAGS} -DVCPKG_MANIFEST_DIR='${PROJ_DIR}' -DVCPKG_BUILD=1 -DCMAKE_TOOLCHAIN_FILE='${VCPKG_TOOLCHAIN_PATH}'
31-
endif
32-
ifneq ("${VCPKG_TARGET_TRIPLET}", "")
33-
TOOLCHAIN_FLAGS:=${TOOLCHAIN_FLAGS} -DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
34-
endif
35-
ifeq (${USE_MERGED_VCPKG_MANIFEST}, 1)
36-
TOOLCHAIN_FLAGS:=${TOOLCHAIN_FLAGS} -DVCPKG_MANIFEST_DIR='${PROJ_DIR}build/extension_configuration'
37-
else
38-
TOOLCHAIN_FLAGS:=${TOOLCHAIN_FLAGS} -DVCPKG_MANIFEST_DIR='${PROJ_DIR}'
39-
endif
40-
41-
#### Enable Ninja as generator
42-
ifeq ($(GEN),ninja)
43-
GENERATOR=-G "Ninja" -DFORCE_COLORED_OUTPUT=1
44-
endif
45-
46-
EXT_NAME=spatial
47-
48-
#### Configuration for this extension
49-
EXTENSION_NAME=SPATIAL
50-
EXTENSION_FLAGS=\
51-
-DENABLE_SANITIZER=OFF \
52-
-DDUCKDB_EXTENSION_NAMES="spatial" \
53-
-DDUCKDB_EXTENSION_${EXTENSION_NAME}_PATH="$(PROJ_DIR)" \
54-
-DDUCKDB_EXTENSION_${EXTENSION_NAME}_SHOULD_LINK=1 \
55-
-DDUCKDB_EXTENSION_${EXTENSION_NAME}_LOAD_TESTS=1 \
56-
-DDUCKDB_EXTENSION_${EXTENSION_NAME}_INCLUDE_PATH="$(PROJ_DIR)spatial/include" \
57-
-DDUCKDB_EXTENSION_${EXTENSION_NAME}_TEST_PATH="$(PROJ_DIR)test" \
58-
-DDUCKDB_EXTENSION_${EXTENSION_NAME}_LINKED_LIBS="../../deps/local/lib/*.a"
59-
60-
#### Add more of the DuckDB in-tree extensions here that you need (also feel free to remove them when not needed)
61-
EXTRA_EXTENSIONS_FLAG=-DBUILD_EXTENSIONS="parquet;json"
62-
63-
BUILD_FLAGS=-DEXTENSION_STATIC_BUILD=1 $(EXTENSION_FLAGS) ${EXTRA_EXTENSIONS_FLAG} $(OSX_BUILD_FLAG) $(TOOLCHAIN_FLAGS) -DDUCKDB_EXPLICIT_PLATFORM='${DUCKDB_PLATFORM}'
64-
ifeq (${BUILD_SHELL}, 0)
65-
BUILD_FLAGS += -DBUILD_SHELL=0
66-
else
67-
ifeq ($(OS),Windows_NT)
68-
BUILD_FLAGS += -DBUILD_SHELL=0
69-
endif
70-
endif
71-
72-
ifeq (${BUILD_BENCHMARK}, 1)
73-
BUILD_FLAGS += -DBUILD_BENCHMARKS=1
74-
endif
75-
76-
CLIENT_FLAGS:=
77-
78-
#### Main build
79-
# For regular CLI build, we link the spatial extension directly into the DuckDB executable
80-
CLIENT_FLAGS=-DDUCKDB_EXTENSION_${EXTENSION_NAME}_SHOULD_LINK=1
81-
82-
debug:
83-
mkdir -p build/debug && \
84-
cmake $(GENERATOR) $(BUILD_FLAGS) $(CLIENT_FLAGS) -DCMAKE_BUILD_TYPE=Debug -S ./duckdb/ -B build/debug && \
85-
cmake --build build/debug --config Debug
86-
87-
release:
88-
mkdir -p build/release && \
89-
cmake $(GENERATOR) $(BUILD_FLAGS) $(CLIENT_FLAGS) -DCMAKE_BUILD_TYPE=Release -S ./duckdb/ -B build/release && \
90-
cmake --build build/release --config Release
91-
92-
reldebug:
93-
mkdir -p build/reldebug && \
94-
cmake $(GENERATOR) $(BUILD_FLAGS) $(CLIENT_FLAGS) -DCMAKE_BUILD_TYPE=RelWithDebInfo -S ./duckdb/ -B build/reldebug && \
95-
cmake --build build/reldebug --config RelWithDebInfo
96-
97-
##### Client build
98-
JS_BUILD_FLAGS=-DBUILD_NODE=1 -DDUCKDB_EXTENSION_${EXTENSION_NAME}_SHOULD_LINK=0
99-
PY_BUILD_FLAGS=-DBUILD_PYTHON=1 -DDUCKDB_EXTENSION_${EXTENSION_NAME}_SHOULD_LINK=0
100-
101-
debug_js: CLIENT_FLAGS=$(JS_BUILD_FLAGS)
102-
debug_js: debug
103-
debug_python: CLIENT_FLAGS=$(PY_BUILD_FLAGS)
104-
debug_python: debug
105-
release_js: CLIENT_FLAGS=$(JS_BUILD_FLAGS)
106-
release_js: release
107-
release_python: CLIENT_FLAGS=$(PY_BUILD_FLAGS)
108-
release_python: release
109-
110-
# Main tests
111-
test: test_release
112-
113-
test_release: release
114-
./build/release/$(TEST_PATH) "$(PROJ_DIR)test/*"
115-
116-
test_debug: debug
117-
./build/debug/$(TEST_PATH) "$(PROJ_DIR)test/*"
118-
119-
#### Client tests
120-
DEBUG_EXT_PATH='$(PROJ_DIR)build/debug/extension/spatial/spatial.duckdb_extension'
121-
RELEASE_EXT_PATH='$(PROJ_DIR)build/release/extension/spatial/spatial.duckdb_extension'
122-
123-
test_js: test_debug_js
124-
125-
test_debug_js: debug_js
126-
cd duckdb/tools/nodejs && ${EXTENSION_NAME}_EXTENSION_BINARY_PATH=$(DEBUG_EXT_PATH) npm run test-path -- "../../../test/nodejs/**/*.js"
127-
128-
test_release_js: release_js
129-
cd duckdb/tools/nodejs && ${EXTENSION_NAME}_EXTENSION_BINARY_PATH=$(RELEASE_EXT_PATH) npm run test-path -- "../../../test/nodejs/**/*.js"
130-
131-
test_python: test_debug_python
132-
133-
test_debug_python: debug_python
134-
cd test/python && ${EXTENSION_NAME}_EXTENSION_BINARY_PATH=$(DEBUG_EXT_PATH) python3 -m pytest
135-
136-
test_release_python: release_python
137-
cd test/python && ${EXTENSION_NAME}_EXTENSION_BINARY_PATH=$(RELEASE_EXT_PATH) python3 -m pytest
138-
139-
#### Misc
140-
format:
141-
find spatial/src/ -iname *.hpp -o -iname *.cpp | xargs clang-format --sort-includes=0 -style=file -i
142-
find spatial/include -iname *.hpp -o -iname *.cpp | xargs clang-format --sort-includes=0 -style=file -i
143-
cmake-format -i spatial/src/CMakeLists.txt
144-
145-
update:
146-
git submodule update --remote --merge
147-
148-
pull:
149-
git submodule init
150-
git submodule update --recursive --remote
151-
152-
clean:
153-
rm -rf build
154-
rm -rf testext
155-
#cd duckdb && make clean
156-
#cd duckdb && make clean-python
157-
158-
# WASM config
159-
VCPKG_EMSDK_FLAGS=-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE=$(EMSDK)/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake
160-
WASM_COMPILE_TIME_COMMON_FLAGS=-DWASM_LOADABLE_EXTENSIONS=1 -DBUILD_EXTENSIONS_ONLY=1 -DSKIP_EXTENSIONS="parquet;json" $(VCPKG_EMSDK_FLAGS)
161-
WASM_CXX_MVP_FLAGS=
162-
WASM_CXX_EH_FLAGS=$(WASM_CXX_MVP_FLAGS) -fwasm-exceptions -DWEBDB_FAST_EXCEPTIONS=1
163-
WASM_CXX_THREADS_FLAGS=$(WASM_COMPILE_TIME_EH_FLAGS) -DWITH_WASM_THREADS=1 -DWITH_WASM_SIMD=1 -DWITH_WASM_BULK_MEMORY=1 -pthread
164-
WASM_LINK_TIME_FLAGS=-O3 -sSIDE_MODULE=2 -sEXPORTED_FUNCTIONS="_${EXT_NAME}_version,_${EXT_NAME}_init"
165-
166-
# WASM targets
167-
wasm_mvp:
168-
mkdir -p build/wasm_mvp
169-
emcmake cmake $(GENERATOR) $(EXTENSION_FLAGS) $(WASM_COMPILE_TIME_COMMON_FLAGS) -Bbuild/wasm_mvp -DCMAKE_CXX_FLAGS="$(WASM_CXX_MVP_FLAGS)" -S $(DUCKDB_SRCDIR) -DDUCKDB_EXPLICIT_PLATFORM=wasm_mvp -DDUCKDB_CUSTOM_PLATFORM=wasm_mvp
170-
emmake make -j8 -Cbuild/wasm_mvp
171-
172-
wasm_eh:
173-
mkdir -p build/wasm_eh
174-
emcmake cmake $(GENERATOR) $(EXTENSION_FLAGS) $(WASM_COMPILE_TIME_COMMON_FLAGS) -Bbuild/wasm_eh -DCMAKE_CXX_FLAGS="$(WASM_CXX_EH_FLAGS)" -S $(DUCKDB_SRCDIR) -DDUCKDB_EXPLICIT_PLATFORM=wasm_eh -DDUCKDB_CUSTOM_PLATFORM=wasm_eh
175-
emmake make -j8 -Cbuild/wasm_eh
176-
177-
wasm_threads:
178-
mkdir -p ./build/wasm_threads
179-
emcmake cmake $(GENERATOR) $(EXTENSION_FLAGS) $(WASM_COMPILE_TIME_COMMON_FLAGS) -Bbuild/wasm_threads -DCMAKE_CXX_FLAGS="$(WASM_CXX_THREADS_FLAGS)" -S $(DUCKDB_SRCDIR) -DDUCKDB_EXPLICIT_PLATFORM=wasm_threads -DDUCKDB_CUSTOM_PLATFORM=wasm_threads
180-
emmake make -j8 -Cbuild/wasm_threads
7+
# Include the Makefile from extension-ci-tools
8+
include extension-ci-tools/makefiles/duckdb_extension.Makefile

deps/CMakeLists.txt

+13-25
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24.0")
1111
cmake_policy(SET CMP0135 NEW)
1212
endif()
1313

14+
if(${VCPKG_TARGET_TRIPLET} STREQUAL "wasm32-emscripten")
15+
set(EMSCRIPTEN ON)
16+
endif()
17+
1418
if (NOT EMSCRIPTEN)
1519
if (OSX_BUILD_ARCH)
1620
message(STATUS "building for OSX architecture: ${OSX_BUILD_ARCH}")
@@ -36,37 +40,15 @@ if (EMSCRIPTEN)
3640
set(OGR_ENABLE_DRIVER_OPENFILEGDB OFF)
3741
endif()
3842

39-
# ZLIB
40-
ExternalProject_Add(
41-
ZLIB
42-
URL ${CMAKE_CURRENT_SOURCE_DIR}/vendor/zlib1213.zip
43-
CONFIGURE_HANDLED_BY_BUILD TRUE
44-
CMAKE_ARGS
45-
-DCMAKE_INSTALL_PREFIX:PATH=${LOCAL_INSTALL_DIR}
46-
-DCMAKE_PREFIX_PATH=${LOCAL_INSTALL_DIR}
47-
-DCMAKE_MODULE_PATH=${LOCAL_INSTALL_DIR}/lib/cmake
48-
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
49-
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES_PACKED}
50-
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
51-
-DBUILD_SHARED_LIBS=OFF
52-
${CMAKE_FLAGS_POINTER_SIZE}
53-
# vcpkg options
54-
-DVCPKG_MANIFEST_DIR='${VCPKG_MANIFEST_DIR}'
55-
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
56-
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
57-
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
58-
)
59-
6043
# Use the system sqlite binary on Emscripten, iOS and Android
6144
if (EMSCRIPTEN OR IOS OR ANDROID)
6245
find_program(EXE_SQLITE3 sqlite3)
6346
endif()
64-
set(GDAL_DEPENDENCIES ${GDAL_DEPENDENCIES} ZLIB)
47+
set(GDAL_DEPENDENCIES ${GDAL_DEPENDENCIES})
6548

6649
# SQLite3
6750
ExternalProject_Add(
6851
SQLITE3
69-
DEPENDS ZLIB
7052
URL ${CMAKE_CURRENT_SOURCE_DIR}/vendor/sqlite3
7153
CONFIGURE_HANDLED_BY_BUILD TRUE
7254
CMAKE_ARGS
@@ -80,14 +62,14 @@ ExternalProject_Add(
8062
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
8163
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
8264
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
65+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
8366
)
8467
set(GDAL_DEPENDENCIES ${GDAL_DEPENDENCIES} SQLITE3)
8568

8669
if(SPATIAL_USE_NETWORK)
8770
# CURL
8871
ExternalProject_Add(
8972
CURL
90-
DEPENDS ZLIB
9173
URL ${CMAKE_CURRENT_SOURCE_DIR}/vendor/curl-7.87.0.zip
9274
CONFIGURE_HANDLED_BY_BUILD TRUE
9375
CMAKE_ARGS
@@ -102,6 +84,7 @@ ExternalProject_Add(
10284
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
10385
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
10486
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
87+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
10588
-DBUILD_SHARED_LIBS=OFF
10689
-DHTTP_ONLY=ON
10790
# Disable some defaults for now
@@ -118,7 +101,7 @@ endif()
118101
# PROJ
119102
ExternalProject_Add(
120103
PROJ
121-
DEPENDS SQLITE3 ZLIB
104+
DEPENDS SQLITE3
122105
URL ${CMAKE_CURRENT_SOURCE_DIR}/vendor/proj-9.1.1.zip
123106
CONFIGURE_HANDLED_BY_BUILD TRUE
124107
PATCH_COMMAND patch -p1 < "${CMAKE_CURRENT_LIST_DIR}/patches/proj${PATCH_NAME_ENDING}.patch"
@@ -136,6 +119,7 @@ ExternalProject_Add(
136119
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
137120
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
138121
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
122+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
139123
# PROJ options
140124
-DBUILD_SHARED_LIBS=OFF
141125
-DBUILD_APPS=OFF
@@ -164,6 +148,7 @@ ExternalProject_Add(
164148
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
165149
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
166150
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
151+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
167152
# EXPAT options
168153
-DEXPAT_SHARED_LIBS=OFF
169154
-DEXPAT_BUILD_TESTS=OFF
@@ -192,6 +177,7 @@ ExternalProject_Add(
192177
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
193178
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
194179
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
180+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
195181
# GEOS options
196182
-DBUILD_SHARED_LIBS=OFF
197183
-DBUILD_TESTING=OFF
@@ -219,6 +205,7 @@ ExternalProject_Add(
219205
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
220206
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
221207
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
208+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
222209
# GeographicLib options
223210
-DBUILD_SHARED_LIBS=OFF
224211
-DGEOGRAPHICLIB_DATA=${LOCAL_INSTALL_DIR}/share/GeographicLib
@@ -247,6 +234,7 @@ ExternalProject_Add(
247234
-DVCPKG_INSTALLED_DIR='${VCPKG_INSTALLED_DIR}'
248235
-DCMAKE_TOOLCHAIN_FILE='${CMAKE_TOOLCHAIN_FILE}'
249236
-DVCPKG_TARGET_TRIPLET='${VCPKG_TARGET_TRIPLET}'
237+
-DVCPKG_CHAINLOAD_TOOLCHAIN_FILE='${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}'
250238
# GDAL Options
251239
-DGDAL_OBJECT_LIBRARIES_POSITION_INDEPENDENT_CODE=ON # this is needed for GDAL to build with -fPIC
252240
-DBUILD_TESTING=OFF

extension-ci-tools

Submodule extension-ci-tools added at 916d4ef

extension_config.cmake

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# This file is included by DuckDB's build system. It specifies which extension to load
2+
3+
# Extension from this repo
4+
duckdb_extension_load(spatial
5+
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}
6+
INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/spatial/include
7+
LOAD_TESTS
8+
DONT_LINK
9+
LINKED_LIBS "../../deps/local/lib/*.a"
10+
)

vcpkg.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"dependencies": [
3-
"openssl"
3+
"openssl",
4+
"zlib"
45
]
56
}

0 commit comments

Comments
 (0)