Gadgetron debug log

52 views
Skip to first unread message

Benoit T.

unread,
Apr 9, 2020, 7:58:54 AM4/9/20
to Gadgetron
Hello,

I've started to work with Gadgetron around a week ago, but I'm a bit lost with some parts of it, mainly with the debug messages...

To train on a few things, I want to modify an existing class (SimpleRecon) to export data with ImageIOAnalyse, but when I launch my program, the data I want does not appear anywhere... I have added a debug line in the corresponding function (process) with the content below, but I don't even have any output from it...

I'll try to put every interesting part of my code, but tell me if something is missing...

My CMakesList:

cmake_minimum_required(VERSION 2.6)

project
(examplelib)

if (WIN32)
ADD_DEFINITIONS
(-DWIN32 -D_WIN32 -D_WINDOWS)
ADD_DEFINITIONS
(-DUNICODE -D_UNICODE)
SET
(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc")
SET
(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
endif
(WIN32)

cmake_policy
(SET CMP0042 NEW)  # CMake 3.0 ``MACOSX_RPATH`` is enabled by default.

### Require C++14 ###
include
(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG
("-std=c++14" COMPILER_SUPPORTS_CXX14)
CHECK_CXX_COMPILER_FLAG
("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX14)
 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
elseif
(COMPILER_SUPPORTS_CXX0X)
 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
  message
(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
endif
()

###############################################################
#Bootstrap search for libraries
# (We need to find cmake modules in Gadgetron)
###############################################################
find_path
(GADGETRON_CMAKE_MODULES FindGadgetron.cmake HINTS
$ENV
{GADGETRON_HOME}/share/gadgetron/cmake
/usr/local/gadgetron)

if (NOT GADGETRON_CMAKE_MODULES)
  MESSAGE
(FATAL_ERROR "GADGETRON_CMAKE_MODULES cannot be found.
   Try to set GADGETRON_HOME environment variable."
)
endif
(NOT GADGETRON_CMAKE_MODULES)

set(CMAKE_MODULE_PATH ${GADGETRON_CMAKE_MODULES})
###############################################################

find_package
(ISMRMRD REQUIRED)
find_package
(Gadgetron REQUIRED)
find_package
(Boost REQUIRED)

set(CMAKE_INSTALL_PREFIX ${GADGETRON_HOME})

INCLUDE_DIRECTORIES
(${ACE_INCLUDE_DIR}
     $
{Boost_INCLUDE_DIR}
     $
{GADGETRON_INCLUDE_DIR}
     $
{ISMRMRD_INCLUDE_DIR}
     $
{ISMRMRD_SCHEMA_DIR}
     $
{ISMRMRD_XSD_INCLUDE_DIR}
     
)

LINK_DIRECTORIES
(${GADGETRON_LIB_DIR})

ADD_LIBRARY
(gadgetronexamplelib SHARED SimpleReconGadget.cpp)

TARGET_LINK_LIBRARIES
(gadgetronexamplelib
                      gadgetron_toolbox_log
)

INSTALL
(FILES SimpleReconGadget.h
         examplelib_export
.h
         DESTINATION include
)

INSTALL
(TARGETS gadgetronexamplelib DESTINATION lib)

if (NOT GADGETRON_INSTALL_CONFIG_PATH)
set(GADGETRON_INSTALL_CONFIG_PATH  ${GADGETRON_HOME}/share/gadgetron/config)
endif
()
INSTALL
(FILES threshold.xml DESTINATION ${GADGETRON_INSTALL_CONFIG_PATH})

My .xml :

<?xml version="1.0" encoding="UTF-8"?>

<gadgetronStreamConfiguration xsi:schemaLocation="http://gadgetron.sf.net/gadgetron gadgetron.xsd"
       
xmlns="http://gadgetron.sf.net/gadgetron"
       
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       
<reader>
 
<slot>1008</slot>
 
<dll>gadgetron_mricore</dll>
 
<classname>GadgetIsmrmrdAcquisitionMessageReader</classname>
</reader>

<writer>
 
<slot>1022</slot>
 
<dll>gadgetron_mricore</dll>
 
<classname>MRIImageWriter</classname>
</writer>

<gadget>
 
<name>RemoveROOversampling</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>RemoveROOversamplingGadget</classname>
</gadget>

<gadget>
 
<name>AccTrig</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>AcquisitionAccumulateTriggerGadget</classname>
 
<property>
   
<name>trigger_dimension</name>
   
<value>repetition</value>
 
</property>
 
<property>
   
<name>sorting_dimension</name>
   
<value>slice</value>
 
</property>
</gadget>

<gadget>
 
<name>Buff</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>BucketToBufferGadget</classname>
 
<property>
   
<name>N_dimension</name>
   
<value></value>
 
</property>
 
<property>
   
<name>S_dimension</name>
   
<value></value>
 
</property>
 
<property>
   
<name>split_slices</name>
   
<value>true</value>
 
</property>
</gadget>

<gadget>
 
<name>SimpleRecon</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>SimpleReconGadget</classname>
</gadget>

<gadget>
 
<name>ImageArraySplit</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>ImageArraySplitGadget</classname>
</gadget>

<gadget>
 
<name>Extract</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>ExtractGadget</classname>
</gadget>  

<gadget>
 
<name>ImageFinish</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>ImageFinishGadget</classname>
</gadget>

</gadgetronStreamConfiguration>

The lines I added in my SimpleReconGadget.cpp

#include "GenericReconBase.h"

[...]

std
::string debug_folder_full_path_ = "/tmp/gadgetron";

GDEBUG_STREAM
( (std::string)("Debug folder: ") << debug_folder_full_path_ << std::endl);
                   
if (!debug_folder_full_path_.empty())
                   
{
                        gt_exporter_
.export_array_complex(chunk, debug_folder_full_path_ + "data_before_transform");
                   
}

And the main line of my lib export

#define EXPORTGADGETSMRICORE

I build it, with cmake, make and make install, but when I try to run it, I just don't get the message from GDEBUG_STREAM logging...
I prefer to say it : Yes, a server is launched...

Thank you very much for your answers

David Hansen

unread,
Apr 9, 2020, 8:33:40 AM4/9/20
to Gadgetron
Hey,

Could you post the output from the Gadgetron server and from the client?

Best,
David Hansen

Benoit T.

unread,
Apr 9, 2020, 9:16:00 AM4/9/20
to Gadgetron
I knew I forgot something, sorry...

Server output :

benoit@benoit-Aspire-VN7-592G:/usr/local/share/gadgetron/config$ gadgetron
04-09 14:40:06.886 INFO [main.cpp:49] Gadgetron 4.1.0 [03ec874b94d123732ac5beb93ff5e7886a669a41]
04-09 14:40:06.887 INFO [main.cpp:50] Running on port 9002
04-09 14:40:11.418 INFO [Server.cpp:40] Accepted connection from: ::ffff:127.0.0.1
04-09 14:40:11.418 INFO [ConfigConnection.cpp:112] Connection state: [CONFIG]
04-09 14:40:11.419 INFO [HeaderConnection.cpp:82] Connection state: [HEADER]
04-09 14:40:11.419 INFO [VoidConnection.cpp:38] Connection state: [VOID]
04-09 14:40:11.419 DEBUG [Stream.cpp:52] Loading Gadget NoiseSummary of class NoiseSummaryGadget from
04-09 14:40:11.433 DEBUG [NoiseSummaryGadget.cpp:35] Noise dependency folder is /tmp/gadgetron/
04-09 14:40:11.434 DEBUG [Gadget.h:130] Shutting down Gadget ()
04-09 14:40:11.434 INFO [Core.cpp:76] Connection state: [FINISHED]
04-09 14:40:11.435 INFO [Server.cpp:40] Accepted connection from: ::ffff:127.0.0.1
04-09 14:40:11.435 INFO [ConfigConnection.cpp:112] Connection state: [CONFIG]
04-09 14:40:11.435 DEBUG [ConfigConnection.cpp:54] Reading config file: "/usr/local/share/gadgetron/config/threshold.xml"
04-09 14:40:11.436 INFO [HeaderConnection.cpp:82] Connection state: [HEADER]
04-09 14:40:11.436 INFO [StreamConnection.cpp:75] Connection state: [STREAM]
04-09 14:40:11.436 DEBUG [Stream.cpp:52] Loading Gadget RemoveROOversampling of class RemoveROOversamplingGadget from
04-09 14:40:11.443 DEBUG [RemoveROOversamplingGadget.cpp:43] RemoveROOversamplingGadget:omp_set_num_threads(1) ...
04-09 14:40:11.443 DEBUG [Stream.cpp:52] Loading Gadget AccTrig of class AcquisitionAccumulateTriggerGadget from
04-09 14:40:11.444 DEBUG [Stream.cpp:52] Loading Gadget Buff of class BucketToBufferGadget from
04-09 14:40:11.444 DEBUG [Stream.cpp:52] Loading Gadget SimpleRecon of class SimpleReconGadget from
04-09 14:40:11.445 DEBUG [Stream.cpp:52] Loading Gadget ImageArraySplit of class ImageArraySplitGadget from
04-09 14:40:11.445 DEBUG [Stream.cpp:52] Loading Gadget Extract of class ExtractGadget from
04-09 14:40:11.445 DEBUG [Stream.cpp:52] Loading Gadget ImageFinish of class ImageFinishGadget from
04-09 14:40:11.682 DEBUG [AcquisitionAccumulateTriggerGadget.cpp:156] Trigger (1) occurred, sending out 12 buckets
04-09 14:40:11.682 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.685 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.690 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.693 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.698 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.699 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.717 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.718 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.721 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.732 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.737 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.738 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.744 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.745 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.756 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.765 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.770 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.771 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.781 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.782 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.786 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.799 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.803 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.809 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.973 DEBUG [AcquisitionAccumulateTriggerGadget.cpp:156] Trigger (2) occurred, sending out 12 buckets
04-09 14:40:11.974 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.976 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.978 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.979 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.980 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.981 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.988 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:11.990 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:11.998 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.000 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.003 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.006 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.014 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.018 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.036 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.037 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.042 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.050 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.052 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.057 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.074 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.076 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.081 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.082 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.225 DEBUG [AcquisitionAccumulateTriggerGadget.cpp:156] Trigger (3) occurred, sending out 12 buckets
04-09 14:40:12.225 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.226 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.227 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.228 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.229 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.230 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.234 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.234 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.246 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.247 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.266 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.267 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.271 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.272 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.297 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.298 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.303 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.304 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.308 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.309 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.312 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.313 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:12.337 DEBUG [BucketToBufferGadget.cpp:50] BUCKET_SIZE 96 ESPACE 0
04-09 14:40:12.338 DEBUG [BucketToBufferGadget.cpp:90] End of bucket reached, sending out 2 ReconData buffers
04-09 14:40:14.580 DEBUG [Gadget.h:130] Shutting down Gadget ()
04-09 14:40:14.581 DEBUG [Gadget.h:130] Shutting down Gadget ()
04-09 14:40:14.581 DEBUG [Gadget.h:130] Shutting down Gadget ()
04-09 14:40:14.598 INFO [Core.cpp:76] Connection state: [FINISHED]

And client output :

benoit@benoit-Aspire-VN7-592G:~/IHUBordeaux/Examples/analyse_format$ gadgetron_ismrmrd_client -f *FID*GP0.h5 -F hdr -c threshold.xml -o test
Gadgetron ISMRMRD client
 
-- host            :      localhost
 
-- port            :      9002
 
-- hdf5 file  in   :      meas_MID00026_FID49092_cmrr_12s_80p_MB0_GP0.h5
 
-- hdf5 group in   :      /dataset
 
-- conf            :      threshold.xml
 
-- loop            :      1
 
-- hdf5 file out   :      test
 
-- hdf5 group out  :      2020-04-09 14:40:11
This measurement has dependent measurements
 
Noise : 16
Querying the Gadgetron instance for the dependent measurement: 66056_63650129_63650134_16
Message received with ID: 1024
Input stream has terminated
WARNING
: Dependent noise measurement not found on Gadgetron server. Was the noise data processed?
Receiving image : 0 - 1
Receiving image : 0 - 2
Receiving image : 0 - 3
Receiving image : 0 - 4
Receiving image : 0 - 5
Receiving image : 0 - 6
Receiving image : 0 - 7
Receiving image : 0 - 8
Receiving image : 0 - 9
Receiving image : 0 - 10
Receiving image : 0 - 11
Receiving image : 0 - 12
Receiving image : 0 - 13
Receiving image : 0 - 14
Receiving image : 0 - 15
Receiving image : 0 - 16
Receiving image : 0 - 17
Receiving image : 0 - 18
Receiving image : 0 - 19
Receiving image : 0 - 20
Receiving image : 0 - 21
Receiving image : 0 - 22
Receiving image : 0 - 23
Receiving image : 0 - 24
Receiving image : 0 - 25
Receiving image : 0 - 26
Receiving image : 0 - 27
Receiving image : 0 - 28
Receiving image : 0 - 29
Receiving image : 0 - 30
Receiving image : 0 - 31
Receiving image : 0 - 32
Receiving image : 0 - 33
Receiving image : 0 - 34
Receiving image : 0 - 35
Receiving image : 0 - 36
Receiving image : 0 - 37
Receiving image : 0 - 38
Receiving image : 0 - 39
Receiving image : 0 - 40
Receiving image : 0 - 41
Receiving image : 0 - 42
Receiving image : 0 - 43
Receiving image : 0 - 44
Receiving image : 0 - 45
Receiving image : 0 - 46
Receiving image : 0 - 47
Receiving image : 0 - 48
Receiving image : 0 - 49
Receiving image : 0 - 50
Receiving image : 0 - 51
Receiving image : 0 - 52
Receiving image : 0 - 53
Receiving image : 0 - 54
Receiving image : 0 - 55
Receiving image : 0 - 56
Receiving image : 0 - 57
Receiving image : 0 - 58
Receiving image : 0 - 59
Receiving image : 0 - 60
Receiving image : 0 - 61
Receiving image : 0 - 62
Receiving image : 0 - 63
Receiving image : 0 - 64
Receiving image : 0 - 65
Receiving image : 0 - 66
Receiving image : 0 - 67
Receiving image : 0 - 68
Receiving image : 0 - 69
Receiving image : 0 - 70
Receiving image : 0 - 71
Receiving image : 0 - 72


David Hansen

unread,
Apr 18, 2020, 1:05:13 PM4/18/20
to Gadgetron
Hi Benoit,

The problem is in the part:


<gadget>
 
<name>SimpleRecon</name>
 
<dll>gadgetron_mricore</dll>
 
<classname>SimpleReconGadget</classname>
</gadget>

If you want it to load your own gadget, you have to change the library it loads from. In your case the line would be


<gadget>
 
<name>SimpleRecon</name>
 
<dll>
gadgetronexamplelib</dll>
 
<classname>SimpleReconGadget</classname>
</gadget>

instead.

Best,
David Hansen


Reply all
Reply to author
Forward
0 new messages