Skip to content

Commit 6bae3c1

Browse files
dmurdochcran-robot
authored andcommitted
version 1.2.8
1 parent a68540a commit 6bae3c1

21 files changed

+197
-142
lines changed

DESCRIPTION

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Package: rgl
2-
Version: 1.2.1
2+
Version: 1.2.8
33
Title: 3D Visualization Using OpenGL
44
Authors@R: c(person("Duncan", "Murdoch", role = c("aut", "cre"),
55
email = "murdoch.duncan@gmail.com"),
@@ -53,7 +53,7 @@ VignetteBuilder: knitr, rmarkdown
5353
Biarch: true
5454
RoxygenNote: 7.2.2.9000
5555
NeedsCompilation: yes
56-
Packaged: 2023-07-04 13:17:31 UTC; murdoch
56+
Packaged: 2023-11-28 20:45:53 UTC; murdoch
5757
Author: Duncan Murdoch [aut, cre],
5858
Daniel Adler [aut],
5959
Oleg Nenadic [ctb],
@@ -78,4 +78,4 @@ Author: Duncan Murdoch [aut, cre],
7878
Mike Stein [ctb]
7979
Maintainer: Duncan Murdoch <murdoch.duncan@gmail.com>
8080
Repository: CRAN
81-
Date/Publication: 2023-07-06 00:10:42 UTC
81+
Date/Publication: 2023-11-29 00:10:02 UTC

MD5

+20-19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
e73499cb89e0d6e97b8ba271c46739fd *COPYING
2-
e8bc0dbd1fe504327730562b9e4debbb *DESCRIPTION
3-
132b49539cf579eefe9be929d62dd65e *NAMESPACE
4-
f746aceb9cb4bff53c5d2be502175a02 *NEWS.md
2+
62377aa6b56ab2ff86d7a0f04e6d2d40 *DESCRIPTION
3+
853030f2297cc511e40b6722284a5639 *NAMESPACE
4+
d6c8f9c2202f69e6a241503cf8caffe5 *NEWS.md
55
664118a44d0cbf5e0754bf2b3fcce21b *R/Sweave.R
66
488aa117a50a2759259e34bb73705935 *R/addNormals.mesh3d.R
77
d62767b6f3a51c93f666e30e437e5556 *R/animate.R
@@ -13,7 +13,7 @@ d62767b6f3a51c93f666e30e437e5556 *R/animate.R
1313
011c20203b9c8fa8663b21664ab6d555 *R/aspect3d.R
1414
29db2c9e83228ef7ccac4194e00acd5b *R/asy.R
1515
8d49afe0396a1e1c5510226c3ac26c7c *R/axes.R
16-
c18f99b589f2e3b990dbfadbeecdfc2b *R/bgplot3d.R
16+
44813d2e561df1618546736d261ed134 *R/bgplot3d.R
1717
3a722c07c1c3113fa89a32a0bf91f09d *R/buffer.R
1818
3e3efa920cd8e9de560177e7860e44f2 *R/callbacks.R
1919
2179470e4c58ed4fb8bb3f4f20353feb *R/clipMesh3d.R
@@ -51,14 +51,14 @@ fdd04f8889702ca3ffd4e2a46e1be2c5 *R/pkgchecks.R
5151
8a71f9a4807839a5a573442ab0ab7293 *R/pkgdown.R
5252
676f1c5ce2e20ae8387acb8a936d77df *R/playwidget.R
5353
ae7ca13011a8a6ca0956f684ceaee5da *R/plot3d.R
54-
005dcaa4e7ac7697fb9b8c64c8dacfec *R/plotmath3d.R
54+
2e0496fdbd878a17593d2ea5a927614e *R/plotmath3d.R
5555
6c65179fb5627597f264c331297dbe74 *R/plugin.R
5656
01de808d8c97b32aea562c674939e19a *R/ply.R
57-
89526da4bdb32ad6e3bc14018bdfdbfb *R/r3d.rgl.R
57+
1b487430bbfb664edc61e8a777ced79f *R/r3d.rgl.R
5858
a82494d493925454323cd8102200995d *R/rgl.bringtotop.R
5959
90d938b7a5e25ba1696d438518f9a2cc *R/rglMouse.R
6060
da053234d673ee26ad3a4034b143014f *R/rglcontroller.R
61-
231b2132b421068c10ed1f183fcd177e *R/rglwidget.R
61+
f33698f6a0ca0b17fe0823565578309a *R/rglwidget.R
6262
50efd82368dd3b4df9c217b8280cfda5 *R/saveURI.R
6363
00f2ba1a79e15c4bfa0d44fa398af5cf *R/scene.R
6464
173f11ad48795145a85e59406d434f9e *R/selectpoints3d.R
@@ -75,12 +75,12 @@ cafb08b2f8a5fc5ad72623e3b493b590 *R/testthat.R
7575
b3dd6af59f03c97611ad8f6632896fb5 *R/thigmophobe3d.R
7676
2e72fce267427a1271402c20b0133fa6 *R/tkpar3dsave.R
7777
045ea58eb2d624a009c89851a247fa80 *R/tkspin3d.R
78-
f7b793db8486245845eb168e63511e63 *R/triangulate.R
78+
b91d5a633bc9cd56dcc6716515582028 *R/triangulate.R
7979
c20ba1ca95350a9dd167a9b0f3ffae40 *R/turn3d.R
8080
df8eb36c57e8c90c13f55d69d6308609 *R/webGL.R
8181
a311022208404beca8c3e139ff0eb27c *R/webGLcontrols.R
8282
bf49a233d31d1b3db72726d570ee0918 *R/windows/noOpenGL.R
83-
5eb50684afb59cac746cdef46c82f720 *R/zzz.R
83+
87a9646f46fb8232406ee22c08dd760b *R/zzz.R
8484
e611f2bbfc42648e81876d566810acce *README.md
8585
da3414641fca13863970946266abd081 *build/vignette.rds
8686
10e89b551cff8c2453ea69fde1b97493 *cleanup
@@ -103,19 +103,19 @@ c56a043aa14d19271d1943429565d957 *demo/simpleShinyRgl.R
103103
5544dce93555cfaced50ee41283e9e58 *inst/demodata/region.dat
104104
6291532f8471d92e3d7b808fce8d74f0 *inst/doc/WebGL.R
105105
04a912c316f6e933c30c92008a06cb87 *inst/doc/WebGL.Rmd
106-
23a70bd1d7011efd4904e11bb7621514 *inst/doc/WebGL.html
106+
a8690c5de1525f5ced116296cab0adbf *inst/doc/WebGL.html
107107
1a39d184195d8300e4ffd8f057216269 *inst/doc/demos.R
108108
27512c3d7fc198808e91e11d1ef1ccbe *inst/doc/demos.Rmd
109-
516a0c968ab62bacd0fb54d0739228fd *inst/doc/demos.html
109+
5934fc9bc1217e43dd1c2a46cfb12485 *inst/doc/demos.html
110110
46750e778a5cdb4d65c347f8e43df623 *inst/doc/deprecation.R
111111
1bff15d0eb2a0059f739c6d9020c48cd *inst/doc/deprecation.Rmd
112-
7bec36c5bb2a107ff133a0500c8a6761 *inst/doc/deprecation.html
112+
6f7ff2b39548fb7a4dbe15b8d693bfa7 *inst/doc/deprecation.html
113113
d7cbcf7446607268da24a6ddf0c448a6 *inst/doc/pkgdown.R
114114
6227ee792d7fba32627b3fa51c882dd4 *inst/doc/pkgdown.Rmd
115115
e32351e94a1f1435d17fe4b5c27dfd90 *inst/doc/pkgdown.html
116-
86d3274f6f4412601fda1288f20ef492 *inst/doc/rgl.R
117-
6fdfbdf15a72e1643485f63b1773e0d9 *inst/doc/rgl.Rmd
118-
b786d57355523f3bb633a71c994ada0e *inst/doc/rgl.html
116+
16b66d3f0df6dec38f71d1c7327848d4 *inst/doc/rgl.R
117+
6c4c20e75dbdd36f3d913b0a1b73d835 *inst/doc/rgl.Rmd
118+
539f9fdd94f8d9f854abf760ce178a5e *inst/doc/rgl.html
119119
9cc7fbabd59616c69724412ddf87d9e3 *inst/doc/transparency.R
120120
002b07c7e555fada70d405ea390aacd2 *inst/doc/transparency.Rmd
121121
ed3d0ce551d81ba16c032574574949d9 *inst/doc/transparency.html
@@ -130,7 +130,7 @@ ad3b153c62394e7c510ec7ce6315378d *inst/htmlwidgets/lib/rglClass/JSDoc.json
130130
30830466b9fbdc4e59cd3219e357e6d6 *inst/htmlwidgets/lib/rglClass/buffer.src.js
131131
1135e5d04e71ff918b4248025fe555d9 *inst/htmlwidgets/lib/rglClass/controls.src.js
132132
34312535a858b5c5adb3fa5b578dd8cf *inst/htmlwidgets/lib/rglClass/draw.src.js
133-
a8d4d2b876215897f0da9e9cab7d418c *inst/htmlwidgets/lib/rglClass/init.src.js
133+
5626e807063a1ec1e3cea6b63a604c00 *inst/htmlwidgets/lib/rglClass/init.src.js
134134
b21d7ef4f3c0060e1cd7e264db2cdb4b *inst/htmlwidgets/lib/rglClass/mouse.src.js
135135
0144a563d14d284cf6092d408397d569 *inst/htmlwidgets/lib/rglClass/pieces.src.js
136136
f4fe316e7edf6f15d154c6e6e9300471 *inst/htmlwidgets/lib/rglClass/pretty.src.js
@@ -244,7 +244,7 @@ e8f9c80075f962f0ef737fef69a8acbf *man/rgl-duplicated.Rd
244244
2b5816560188e336594a47d3b0c55c51 *man/rgl.Sweave.Rd
245245
b5e10c72208b0f5ea350e16a41125d19 *man/rgl.attrib.info.Rd
246246
1ff53f1bd578f50f34371de05a52336e *man/rgl.bringtotop.Rd
247-
722e7a6a88dfb38bc66f82ab2e6680c4 *man/rgl.fns.Rd
247+
08a731b68340e8776762f278fa1ead9d *man/rgl.fns.Rd
248248
5dfa9e3fa93988f51ed6b48ee054f5f4 *man/rgl.getAxisCallback.Rd
249249
092c268370800d54d950953057bfb073 *man/rgl.init.Rd
250250
37ed09923795b7aaf6a603e0420f3d86 *man/rgl.pixels.Rd
@@ -258,6 +258,7 @@ e6d5c64583e9f07f55c3252ce6671b46 *man/rglExtrafonts.Rd
258258
61b93363555358915ea557e51f081d68 *man/rglShared.Rd
259259
de4e070d8d76b0f5820c6b0f8c4ce7f3 *man/rglToLattice.Rd
260260
e6c857b60936b561ebeb5f88fee24dda *man/rglwidget.Rd
261+
6079cba354e60254b3948332cb314c07 *man/safe.dev.off.Rd
261262
f19f7a5bc1765edc268c277838d898c6 *man/scene.Rd
262263
b1b940fb69f79f07b79e0978a4500165 *man/scene3d.Rd
263264
ef63bae9826deb1a816b27d241fd4e39 *man/sceneChange.Rd
@@ -492,7 +493,7 @@ fd582c1a065bcc399d386e66c8e1ef82 *src/subscene.cpp
492493
f8c8c445081c434c2c11e9389ebd540a *src/win32gui.cpp
493494
305ea9cb6c67ba53cd2e719ceb614479 *src/win32gui.h
494495
a93f7b56f763cabe646ff97b6bdf2aea *src/win32lib.cpp
495-
93b88e6e2bc06dd0cb1b18e2206103fe *src/x11gui.cpp
496+
57d1b620137708b19acc05abe9a334b2 *src/x11gui.cpp
496497
5a31996f072a8e64d3fd4a4b31879d0c *src/x11gui.h
497498
a3721c12b29d48604b94a7f31c8598e1 *src/x11lib.cpp
498499
c1cfc4a2398fb865c5cb4da26b1c5c8c *tests/bbox3dtests.R
@@ -526,6 +527,6 @@ a7fa1d2be854209389accfa66ff7febb *tools/winlibs.R
526527
27512c3d7fc198808e91e11d1ef1ccbe *vignettes/demos.Rmd
527528
1bff15d0eb2a0059f739c6d9020c48cd *vignettes/deprecation.Rmd
528529
6227ee792d7fba32627b3fa51c882dd4 *vignettes/pkgdown.Rmd
529-
6fdfbdf15a72e1643485f63b1773e0d9 *vignettes/rgl.Rmd
530+
6c4c20e75dbdd36f3d913b0a1b73d835 *vignettes/rgl.Rmd
530531
fcccffec89f4caa7d5cc5b2d21079d3c *vignettes/setup.R
531532
002b07c7e555fada70d405ea390aacd2 *vignettes/transparency.Rmd

NAMESPACE

+3-2
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export(.check3d,
4545
scale3d, scaleMatrix, scene3d, segments3d,
4646
select3d, selectionFunction3d, selectpoints3d,
4747
rgl.setAxisCallback, rgl.setMouseCallbacks, rgl.setWheelCallback,
48+
safe.dev.off,
4849
set3d, setAxisCallbacks, setGraphicsDelay, setupKnitr,
4950
setUserCallbacks, setUserShaders, shade3d, shadow3d,
5051

@@ -167,8 +168,8 @@ export(.check3d,
167168

168169
importFrom(graphics, legend, par, plot, plot.new, polygon,
169170
strwidth, strheight)
170-
importFrom(grDevices, as.raster, col2rgb, colorRamp, dev.cur, dev.new,
171-
dev.off, png, postscript, rgb, xy.coords, xyz.coords)
171+
importFrom(grDevices, as.raster, col2rgb, colorRamp, dev.cur, dev.list, dev.new,
172+
dev.off, dev.prev, dev.set, png, postscript, rgb, xy.coords, xyz.coords)
172173
importFrom(stats, approxfun, get_all_vars, model.frame,
173174
qchisq, qf, splinefun, terms, var)
174175
importFrom(tools, file_ext)

NEWS.md

+18
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1+
# rgl 1.2.8
2+
3+
## Minor changes
4+
5+
* ARIA support now declares `rgl` scenes with `role = "img"`.
6+
7+
## Bug fixes
8+
9+
* The ARIA support caused `htmlwidgets::saveWidget()` to fail when
10+
run in a Shiny session.
11+
* `text3d()` and `mtext3d()` did not pass the `cex` argument to
12+
`plotmath3d()` (pull request #384).
13+
* `polygon3d()` failed when given exactly 3 points (issue #388).
14+
* `snapshot3d()` failed on Windows with some versions of `webshot2` (issue #391).
15+
* Fixed issues caused by misuse of `dev.off()` using new function
16+
`safe.dev.off()`.
17+
* Fixed issue with `warning()` call reported by CRAN.
18+
119
# rgl 1.2.1
220

321
## Major changes

R/bgplot3d.R

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
safe.dev.off <- function(which = dev.cur(), prev = dev.prev()) {
2+
if (which != 1) {
3+
force(prev)
4+
grDevices::dev.off(which)
5+
}
6+
if (length(dev.list()))
7+
dev.set(prev)
8+
else
9+
c("null device" = 1)
10+
}
11+
12+
dev.off <- function(...) stop("Use safe.dev.off() instead!")
13+
114
legend3d <- function(...) {
215
args <- list(...)
316
bgargs <- setdiff(names(formals(bgplot3d)),
@@ -26,7 +39,7 @@ bgplot3d <- function(expression, bg.color = getr3dDefaults("bg", "color"),
2639
bg = bg.color)
2740
grDevices::devAskNewPage(FALSE)
2841
value <- try(expression)
29-
dev.off()
42+
safe.dev.off()
3043
result <- bg3d(texture = filename, col = "white", lit = FALSE, ...)
3144
} else {
3245
value <- NULL
@@ -61,7 +74,7 @@ show2d <- function(expression,
6174
filename <- tempfile(fileext = ".png")
6275
png(filename = filename, width=width, height=height)
6376
value <- try(expression)
64-
dev.off()
77+
safe.dev.off()
6578
} else
6679
value <- filename
6780
face <- c(strsplit(face, '')[[1]], '-')[1:2]

R/plotmath3d.R

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ plotmath3d <- function(x, y = NULL, z = NULL,
3333
w <- strwidth(thistext, cex = initCex, ...)
3434
w1 <- strwidth("m", cex = initCex, ...)
3535
h <- strheight(thistext, cex = initCex, ...)
36-
dev.off()
36+
safe.dev.off()
3737

3838
# Now make a smaller bitmap
3939
expand <- 1.5
@@ -44,7 +44,7 @@ plotmath3d <- function(x, y = NULL, z = NULL,
4444
usr = c(0, 1, 0, 1))
4545
plot.new()
4646
text(0.5, 0.5, thistext, adj = c(0.5,0.5), cex = initCex, ...)
47-
dev.off()
47+
safe.dev.off()
4848
# The 0.4 tries to match the text3d offset
4949
offseti <- 0.4*offset*h/w
5050
posi <- if (is.null(pos)) NULL else pos[i]

R/r3d.rgl.R

+3-1
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ text3d <- function(x, y = NULL, z = NULL,
496496
...) {
497497
if (usePlotmath)
498498
return(plotmath3d(x = x, y = y, z = z, text = texts, adj = adj,
499-
pos = pos, offset = offset, ...))
499+
pos = pos, offset = offset, cex = cex, ...))
500500
.check3d(); save <- material3d(); on.exit(material3d(save))
501501
do.call("rgl.material0", .fixMaterialArgs(..., Params = save))
502502
# Force evaluation
@@ -1070,6 +1070,8 @@ snapshot3d <- function(filename = tempfile(fileext = ".png"),
10701070
scene <- scene3d()
10711071
rect <- par3d("windowRect")
10721072
f1 <- tempfile(fileext = ".html")
1073+
# Work around path issue in webshot2:
1074+
f1 <- normalizePath(f1, winslash = "/", mustWork = FALSE)
10731075
on.exit(unlink(f1), add = TRUE)
10741076
width <- rect[3] - rect[1]
10751077
height <- rect[4] - rect[2]

R/rglwidget.R

+7-1
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,14 @@ ariaLabelId <- function(id)
402402
paste0(id, "-aria")
403403

404404
widget_html.rglWebGL <- function(id, style, class, ...){
405-
tags$div(id = id, style = style, class = class,
405+
result <- tags$div(id = id, style = style, class = class, role = "img",
406406
"aria-labelledby" = ariaLabelId(id))
407+
# In shiny, we need to write the alt text label.
408+
if (inShiny())
409+
result <- tags$div(tags$p("3D plot 1", id = ariaLabelId(id),
410+
hidden = NA),
411+
result)
412+
result
407413
}
408414

409415
print.rglMouseSelection <- function(x, verbose = FALSE, ...) {

R/triangulate.R

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ triangulateSimple <- function(x,y, random=TRUE, plot=FALSE, partial=NA) {
4343

4444
it <- matrix(NA_integer_, nrow=3, ncol=n-2)
4545
verts <- seq_len(n)
46+
good <- TRUE # 3 vertices are always good PR#388
4647
while((m <- length(verts)) > 3) {
4748
i1 <- 1:m
4849
i2 <- i1 %% m + 1

R/zzz.R

+8-8
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@
2222

2323
getDir <- function(useNULL) {
2424
if (in_pkgload_loadall()) {
25-
dir <- if (useNULL) "inst/useNULL" else "src"
25+
dir <- if (useNULL) file.path("inst", "useNULL") else "src"
2626
} else {
2727
dir <- if (useNULL) "useNULL" else "libs"
2828
if (nchar(.Platform$r_arch))
29-
dir <- paste0(dir, "/", .Platform$r_arch)
29+
dir <- file.path(dir, .Platform$r_arch)
3030
}
3131
dir
3232
}
3333

3434
getDynlib <- function(dir)
35-
system.file(paste0(dir, "/rgl", .Platform$dynlib.ext),
35+
system.file(dir, paste0("rgl", .Platform$dynlib.ext),
3636
package = pkg, lib.loc = lib,
3737
mustWork = TRUE)
3838

@@ -83,10 +83,10 @@
8383
if (onlyNULL) {
8484
rglFonts(serif = rep("serif", 4), sans = rep("sans", 4), mono = rep("mono", 4), symbol = rep("symbol", 4))
8585
} else {
86-
rglFonts(serif = rep(system.file("fonts/FreeSerif.ttf", package="rgl"), 4),
87-
sans = rep(system.file("fonts/FreeSans.ttf", package="rgl"), 4),
88-
mono = rep(system.file("fonts/FreeMono.ttf", package="rgl"), 4),
89-
symbol = rep(system.file("fonts/FreeSerif.ttf", package="rgl"), 4))
86+
rglFonts(serif = rep(system.file("fonts", "FreeSerif.ttf", package="rgl"), 4),
87+
sans = rep(system.file("fonts", "FreeSans.ttf", package="rgl"), 4),
88+
mono = rep(system.file("fonts", "FreeMono.ttf", package="rgl"), 4),
89+
symbol = rep(system.file("fonts", "FreeSerif.ttf", package="rgl"), 4))
9090
if (requireNamespace("extrafont", quietly = TRUE))
9191
suppressWarnings(
9292
rglExtrafonts(sans = c("Helvetica", "Arial"),
@@ -115,7 +115,7 @@
115115
!(.Platform$GUI %in% c("AQUA", "RStudio"))) &&
116116
exists("quartz", getNamespace("grDevices"))) {
117117
grDevices::quartz()
118-
dev.off()
118+
safe.dev.off()
119119
}
120120

121121
ret <- rgl.init(initValue, onlyNULL)

inst/doc/WebGL.html

+29-77
Large diffs are not rendered by default.

inst/doc/demos.html

+10-8
Large diffs are not rendered by default.

inst/doc/deprecation.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<meta name="author" content="Duncan Murdoch" />
1414

15-
<meta name="date" content="2023-07-04" />
15+
<meta name="date" content="2023-11-28" />
1616

1717
<title>Deprecating the rgl.* interface</title>
1818

@@ -341,7 +341,7 @@
341341
<h1 class="title toc-ignore">Deprecating the <code>rgl.*</code>
342342
interface</h1>
343343
<h4 class="author">Duncan Murdoch</h4>
344-
<h4 class="date">2023-07-04</h4>
344+
<h4 class="date">2023-11-28</h4>
345345

346346

347347
<div id="TOC">

inst/doc/rgl.R

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ decorate3d()
4040
bg3d("lightgray")
4141
aspect3d(1,1,1)
4242

43-
## ---- eval = FALSE------------------------------------------------------------
43+
## ----eval = FALSE-------------------------------------------------------------
4444
# myview <- par3d("userMatrix")
4545
# # ... later ...
4646
# par3d(userMatrix = myview)
@@ -49,7 +49,7 @@ aspect3d(1,1,1)
4949
filename <- tempfile(fileext = ".png")
5050
png(filename = filename)
5151
plot(rnorm(1000), rnorm(1000))
52-
dev.off()
52+
safe.dev.off()
5353
open3d()
5454
xyz <- cbind(c(0,1,1,0), 0, c(0,0,1,1))
5555
quads3d(xyz, texture = filename, texcoords = xyz[,c(1, 3)]*2,

inst/doc/rgl.Rmd

+1-1
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ because the texture coordinates run from 0 to 2 in both
374374
filename <- tempfile(fileext = ".png")
375375
png(filename = filename)
376376
plot(rnorm(1000), rnorm(1000))
377-
dev.off()
377+
safe.dev.off()
378378
open3d()
379379
xyz <- cbind(c(0,1,1,0), 0, c(0,0,1,1))
380380
quads3d(xyz, texture = filename, texcoords = xyz[,c(1, 3)]*2,

0 commit comments

Comments
 (0)