Last active
March 6, 2018 09:28
-
-
Save mk/50b70c76ba0b94b765982ce5a6ff1fd1 to your computer and use it in GitHub Desktop.
tools.deps problem with jnr-unixsocket
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
set -eu pipefail | |
echo "Classpath tree built with lein:" | |
lein deps :tree | |
echo "\nClasspath tree built with tools.deps (notice com.github.jnr/jffi :classifier \"native\" missing):" | |
clj -Stree | |
echo "\nrunning socket_sample.clj with lein" | |
cat socket_sample.clj | lein repl | |
echo "\nrunning socket_sample.clj with tools.deps" | |
clj socket_sample.clj |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{:deps {org.clojure/clojure {:mvn/version "1.9.0"} | |
com.github.jnr/jnr-unixsocket {:mvn/version "0.18"}}} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Classpath tree built with lein: | |
[alembic "0.3.2"] | |
[lein-as-resource "2.5.0" :exclusions [[org.clojure/clojure]]] | |
[org.flatland/classlojure "0.7.0" :exclusions [[org.clojure/clojure]]] | |
[org.tcrawley/dynapath "0.2.3" :exclusions [[org.clojure/clojure]]] | |
[clojure-complete "0.2.4" :exclusions [[org.clojure/clojure]]] | |
[com.github.jnr/jnr-unixsocket "0.18"] | |
[com.github.jnr/jnr-constants "0.9.8"] | |
[com.github.jnr/jnr-enxio "0.16"] | |
[com.github.jnr/jnr-ffi "2.1.4"] | |
[com.github.jnr/jffi "1.2.15"] | |
[com.github.jnr/jffi "1.2.15" :classifier "native" :scope "runtime"] | |
[com.github.jnr/jnr-x86asm "1.0.2"] | |
[org.ow2.asm/asm-analysis "5.0.3"] | |
[org.ow2.asm/asm-commons "5.0.3"] | |
[org.ow2.asm/asm-tree "5.0.3"] | |
[org.ow2.asm/asm-util "5.0.3"] | |
[org.ow2.asm/asm "5.0.3"] | |
[com.github.jnr/jnr-posix "3.0.35"] | |
[org.clojure/clojure "1.9.0"] | |
[org.clojure/core.specs.alpha "0.1.24"] | |
[org.clojure/spec.alpha "0.1.143"] | |
[org.clojure/tools.nrepl "0.2.12" :exclusions [[org.clojure/clojure]]] | |
Classpath tree built with tools.deps (notice com.github.jnr/jffi :classifier "native" missing): | |
org.clojure/clojure 1.9.0 | |
org.clojure/core.specs.alpha 0.1.24 | |
org.clojure/spec.alpha 0.1.143 | |
com.github.jnr/jnr-unixsocket 0.18 | |
com.github.jnr/jnr-ffi 2.1.4 | |
org.ow2.asm/asm-util 5.0.3 | |
org.ow2.asm/asm 5.0.3 | |
org.ow2.asm/asm-commons 5.0.3 | |
com.github.jnr/jnr-x86asm 1.0.2 | |
com.github.jnr/jffi 1.2.15 | |
org.ow2.asm/asm-analysis 5.0.3 | |
org.ow2.asm/asm-tree 5.0.3 | |
com.github.jnr/jnr-constants 0.9.8 | |
com.github.jnr/jnr-posix 3.0.35 | |
com.github.jnr/jnr-enxio 0.16 | |
running socket_sample.clj with lein | |
nREPL server started on port 62211 on host 127.0.0.1 - nrepl://127.0.0.1:62211 | |
REPL-y 0.3.7, nREPL 0.2.12 | |
Clojure 1.9.0 | |
Java HotSpot(TM) 64-Bit Server VM 1.8.0_151-b12 | |
Docs: (doc function-name-here) | |
(find-doc "part-of-name-here") | |
Source: (source function-name-here) | |
Javadoc: (javadoc java-object-or-class-here) | |
Exit: Control+D or (exit) or (quit) | |
Results: Stored in vars *1, *2, *3, an exception in *e | |
user=> (require 'clojure.java.io)[33G[8G[34G | |
nil | |
user=> (import 'jnr.unixsocket.UnixSocketAddress)[49G[8G[50G | |
jnr.unixsocket.UnixSocketAddress | |
user=> | |
user=> (UnixSocketAddress. (clojure.java.io/file "/tmp/fubar.sock")[67G[28G[68G)[68G[8G[69G | |
#object[jnr.unixsocket.UnixSocketAddress 0x62e9e504 "[family=PF_UNIX path=/tmp/fubar.sock]"] | |
user=> Bye for now! | |
running socket_sample.clj with tools.deps | |
Exception in thread "main" java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider, compiling:(/Users/mk/code/50b70c76ba0b94b765982ce5a6ff1fd1/socket_sample.clj:4:1) | |
at clojure.lang.Compiler.load(Compiler.java:7526) | |
at clojure.lang.Compiler.loadFile(Compiler.java:7452) | |
at clojure.main$load_script.invokeStatic(main.clj:278) | |
at clojure.main$script_opt.invokeStatic(main.clj:338) | |
at clojure.main$script_opt.invoke(main.clj:333) | |
at clojure.main$main.invokeStatic(main.clj:424) | |
at clojure.main$main.doInvoke(main.clj:387) | |
at clojure.lang.RestFn.applyTo(RestFn.java:137) | |
at clojure.lang.Var.applyTo(Var.java:702) | |
at clojure.main.main(main.java:37) | |
Caused by: java.lang.UnsatisfiedLinkError: could not load FFI provider jnr.ffi.provider.jffi.Provider | |
at jnr.ffi.provider.InvalidRuntime.newLoadError(InvalidRuntime.java:101) | |
at jnr.ffi.provider.InvalidRuntime.findType(InvalidRuntime.java:42) | |
at jnr.ffi.Struct$NumberField.<init>(Struct.java:872) | |
at jnr.ffi.Struct$Unsigned8.<init>(Struct.java:1113) | |
at jnr.unixsocket.SockAddrUnix$BSDSockAddrUnix.<init>(SockAddrUnix.java:187) | |
at jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174) | |
at jnr.unixsocket.UnixSocketAddress.<init>(UnixSocketAddress.java:47) | |
at user$eval149.invokeStatic(socket_sample.clj:4) | |
at user$eval149.invoke(socket_sample.clj:4) | |
at clojure.lang.Compiler.eval(Compiler.java:7062) | |
at clojure.lang.Compiler.load(Compiler.java:7514) | |
... 9 more | |
Caused by: java.lang.ExceptionInInitializerError | |
at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:58) | |
at jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) | |
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) | |
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) | |
at java.lang.Class.newInstance(Class.java:442) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57) | |
at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) | |
at jnr.ffi.Runtime$SingletonHolder.<clinit>(Runtime.java:82) | |
at jnr.ffi.Runtime.getSystemRuntime(Runtime.java:67) | |
at jnr.unixsocket.SockAddrUnix.<init>(SockAddrUnix.java:46) | |
at jnr.unixsocket.SockAddrUnix$BSDSockAddrUnix.<init>(SockAddrUnix.java:185) | |
... 15 more | |
Caused by: java.lang.IllegalStateException: Can't overwrite cause with java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/Darwin/libjffi-1.2.dylib, /jni/Darwin/libjffi-1.2.dylib] | |
at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:407) | |
at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:355) | |
at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:258) | |
at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:444) | |
at java.lang.Class.forName0(Native Method) | |
at java.lang.Class.forName(Class.java:348) | |
at com.kenai.jffi.Init.load(Init.java:68) | |
at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) | |
at com.kenai.jffi.Foreign$InstanceHolder.<clinit>(Foreign.java:45) | |
at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) | |
at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) | |
at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) | |
at com.kenai.jffi.Type.resolveSize(Type.java:155) | |
at com.kenai.jffi.Type.size(Type.java:138) | |
at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:187) | |
at jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:66) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41) | |
at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:62) | |
at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:58) | |
at jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) | |
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) | |
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) | |
at java.lang.Class.newInstance(Class.java:442) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57) | |
at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) | |
at jnr.ffi.Runtime$SingletonHolder.<clinit>(Runtime.java:82) | |
at jnr.ffi.Runtime.getSystemRuntime(Runtime.java:67) | |
at jnr.unixsocket.SockAddrUnix.<init>(SockAddrUnix.java:46) | |
at jnr.unixsocket.SockAddrUnix$BSDSockAddrUnix.<init>(SockAddrUnix.java:185) | |
at jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174) | |
at jnr.unixsocket.UnixSocketAddress.<init>(UnixSocketAddress.java:47) | |
at user$eval149.invokeStatic(socket_sample.clj:4) | |
at user$eval149.invoke(socket_sample.clj:4) | |
at clojure.lang.Compiler.eval(Compiler.java:7062) | |
at clojure.lang.Compiler.load(Compiler.java:7514) | |
at clojure.lang.Compiler.loadFile(Compiler.java:7452) | |
at clojure.main$load_script.invokeStatic(main.clj:278) | |
at clojure.main$script_opt.invokeStatic(main.clj:338) | |
at clojure.main$script_opt.invoke(main.clj:333) | |
at clojure.main$main.invokeStatic(main.clj:424) | |
at clojure.main$main.doInvoke(main.clj:387) | |
at clojure.lang.RestFn.applyTo(RestFn.java:137) | |
at clojure.lang.Var.applyTo(Var.java:702) | |
at clojure.main.main(main.java:37) | |
at java.lang.Throwable.initCause(Throwable.java:457) | |
at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:252) | |
at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) | |
at com.kenai.jffi.Type.resolveSize(Type.java:155) | |
at com.kenai.jffi.Type.size(Type.java:138) | |
at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:187) | |
at jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:66) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41) | |
at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:62) | |
... 29 more | |
Caused by: java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/Darwin/libjffi-1.2.dylib, /jni/Darwin/libjffi-1.2.dylib] | |
at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:407) | |
at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:355) | |
at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:258) | |
at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:444) | |
at java.lang.Class.forName0(Native Method) | |
at java.lang.Class.forName(Class.java:348) | |
at com.kenai.jffi.Init.load(Init.java:68) | |
at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) | |
at com.kenai.jffi.Foreign$InstanceHolder.<clinit>(Foreign.java:45) | |
at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) | |
at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) | |
at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) | |
at com.kenai.jffi.Type.resolveSize(Type.java:155) | |
at com.kenai.jffi.Type.size(Type.java:138) | |
at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:187) | |
at jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:66) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41) | |
at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:62) | |
at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:58) | |
at jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) | |
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) | |
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) | |
at java.lang.Class.newInstance(Class.java:442) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57) | |
at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) | |
at jnr.ffi.Runtime$SingletonHolder.<clinit>(Runtime.java:82) | |
at jnr.ffi.Runtime.getSystemRuntime(Runtime.java:67) | |
at jnr.unixsocket.SockAddrUnix.<init>(SockAddrUnix.java:46) | |
at jnr.unixsocket.SockAddrUnix$BSDSockAddrUnix.<init>(SockAddrUnix.java:185) | |
at jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174) | |
at jnr.unixsocket.UnixSocketAddress.<init>(UnixSocketAddress.java:47) | |
at user$eval149.invokeStatic(socket_sample.clj:4) | |
at user$eval149.invoke(socket_sample.clj:4) | |
at clojure.lang.Compiler.eval(Compiler.java:7062) | |
at clojure.lang.Compiler.load(Compiler.java:7514) | |
at clojure.lang.Compiler.loadFile(Compiler.java:7452) | |
at clojure.main$load_script.invokeStatic(main.clj:278) | |
at clojure.main$script_opt.invokeStatic(main.clj:338) | |
at clojure.main$script_opt.invoke(main.clj:333) | |
at clojure.main$main.invokeStatic(main.clj:424) | |
at clojure.main$main.doInvoke(main.clj:387) | |
at clojure.lang.RestFn.applyTo(RestFn.java:137) | |
at clojure.lang.Var.applyTo(Var.java:702) | |
at clojure.main.main(main.java:37) | |
at com.kenai.jffi.Foreign.newLoadError(Foreign.java:72) | |
at com.kenai.jffi.Foreign.access$300(Foreign.java:42) | |
at com.kenai.jffi.Foreign$InValidInstanceHolder.getForeign(Foreign.java:98) | |
at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) | |
at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) | |
... 37 more | |
Caused by: java.lang.UnsatisfiedLinkError: java.lang.UnsatisfiedLinkError: could not locate stub library in jar file. Tried [jni/Darwin/libjffi-1.2.dylib, /jni/Darwin/libjffi-1.2.dylib] | |
at com.kenai.jffi.internal.StubLoader.getStubLibraryStream(StubLoader.java:407) | |
at com.kenai.jffi.internal.StubLoader.loadFromJar(StubLoader.java:355) | |
at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:258) | |
at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:444) | |
at java.lang.Class.forName0(Native Method) | |
at java.lang.Class.forName(Class.java:348) | |
at com.kenai.jffi.Init.load(Init.java:68) | |
at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) | |
at com.kenai.jffi.Foreign$InstanceHolder.<clinit>(Foreign.java:45) | |
at com.kenai.jffi.Foreign.getInstance(Foreign.java:103) | |
at com.kenai.jffi.Type$Builtin.lookupTypeInfo(Type.java:242) | |
at com.kenai.jffi.Type$Builtin.getTypeInfo(Type.java:237) | |
at com.kenai.jffi.Type.resolveSize(Type.java:155) | |
at com.kenai.jffi.Type.size(Type.java:138) | |
at jnr.ffi.provider.jffi.NativeRuntime$TypeDelegate.size(NativeRuntime.java:187) | |
at jnr.ffi.provider.AbstractRuntime.<init>(AbstractRuntime.java:48) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:66) | |
at jnr.ffi.provider.jffi.NativeRuntime.<init>(NativeRuntime.java:41) | |
at jnr.ffi.provider.jffi.NativeRuntime$SingletonHolder.<clinit>(NativeRuntime.java:62) | |
at jnr.ffi.provider.jffi.NativeRuntime.getInstance(NativeRuntime.java:58) | |
at jnr.ffi.provider.jffi.Provider.<init>(Provider.java:29) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) | |
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) | |
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) | |
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) | |
at java.lang.Class.newInstance(Class.java:442) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.getInstance(FFIProvider.java:68) | |
at jnr.ffi.provider.FFIProvider$SystemProviderSingletonHolder.<clinit>(FFIProvider.java:57) | |
at jnr.ffi.provider.FFIProvider.getSystemProvider(FFIProvider.java:35) | |
at jnr.ffi.Runtime$SingletonHolder.<clinit>(Runtime.java:82) | |
at jnr.ffi.Runtime.getSystemRuntime(Runtime.java:67) | |
at jnr.unixsocket.SockAddrUnix.<init>(SockAddrUnix.java:46) | |
at jnr.unixsocket.SockAddrUnix$BSDSockAddrUnix.<init>(SockAddrUnix.java:185) | |
at jnr.unixsocket.SockAddrUnix.create(SockAddrUnix.java:174) | |
at jnr.unixsocket.UnixSocketAddress.<init>(UnixSocketAddress.java:47) | |
at user$eval149.invokeStatic(socket_sample.clj:4) | |
at user$eval149.invoke(socket_sample.clj:4) | |
at clojure.lang.Compiler.eval(Compiler.java:7062) | |
at clojure.lang.Compiler.load(Compiler.java:7514) | |
at clojure.lang.Compiler.loadFile(Compiler.java:7452) | |
at clojure.main$load_script.invokeStatic(main.clj:278) | |
at clojure.main$script_opt.invokeStatic(main.clj:338) | |
at clojure.main$script_opt.invoke(main.clj:333) | |
at clojure.main$main.invokeStatic(main.clj:424) | |
at clojure.main$main.doInvoke(main.clj:387) | |
at clojure.lang.RestFn.applyTo(RestFn.java:137) | |
at clojure.lang.Var.applyTo(Var.java:702) | |
at clojure.main.main(main.java:37) | |
at com.kenai.jffi.internal.StubLoader.load(StubLoader.java:270) | |
at com.kenai.jffi.internal.StubLoader.<clinit>(StubLoader.java:444) | |
at java.lang.Class.forName0(Native Method) | |
at java.lang.Class.forName(Class.java:348) | |
at com.kenai.jffi.Init.load(Init.java:68) | |
at com.kenai.jffi.Foreign$InstanceHolder.getInstanceHolder(Foreign.java:49) | |
at com.kenai.jffi.Foreign$InstanceHolder.<clinit>(Foreign.java:45) | |
... 39 more |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defproject jffi-sample "1.0" | |
:dependencies [[org.clojure/clojure "1.9.0"] ; included in order to run lein repl | |
[com.github.jnr/jnr-unixsocket "0.18"]]) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(require 'clojure.java.io) | |
(import 'jnr.unixsocket.UnixSocketAddress) | |
(UnixSocketAddress. (clojure.java.io/file "/tmp/fubar.sock")) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment