From 22b677147b446a0a370796834695fc5448da1223 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Sun, 25 May 2025 13:18:15 -0400 Subject: [PATCH 01/15] add xpra browser-based x11 server --- Dockerfile | 18 +++++++++++++++++- launch_amrvis3d_browser.sh | 6 ++++++ start_http_server.sh | 18 ++++++++++++++++++ xpra.conf | 13 +++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100755 launch_amrvis3d_browser.sh create mode 100755 start_http_server.sh create mode 100644 xpra.conf diff --git a/Dockerfile b/Dockerfile index 6dee446..fb04d08 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,17 @@ RUN apt-get --yes -qq update \ && apt-get --yes -qq upgrade \ && apt-get --yes -qq install build-essential m4 \ libmotif-dev libxext-dev libxpm-dev \ + python3-setuptools \ + && apt-get --yes -qq clean \ + && rm -rf /var/lib/apt/lists/* + +## add xpra repositories +RUN git clone https://github.com/Xpra-org/xpra && cd xpra \ + && ./setup.py install-repo + +# install xpra +RUN apt-get --yes -qq update && apt-get --yes -qq upgrade \ + && apt-get --yes -qq install xpra xpra-html5 \ && apt-get --yes -qq clean \ && rm -rf /var/lib/apt/lists/* @@ -28,6 +39,11 @@ COPY .bashrc /home/vscode/.bashrc COPY amrvis.defaults /home/vscode/.amrvis.defaults COPY Palette /home/vscode/Palette +## configure X11 server +COPY ./xpra.conf /etc/xpra/xpra.conf +COPY ./start_http_server.sh /home/vscode/start_http_server.sh +EXPOSE 8080 + WORKDIR /home/vscode USER vscode -CMD [ "/Amrvis3D/amrvis3d.gnu.ex" ] +CMD [ "./start_http_server.sh" ] diff --git a/launch_amrvis3d_browser.sh b/launch_amrvis3d_browser.sh new file mode 100755 index 0000000..db9a070 --- /dev/null +++ b/launch_amrvis3d_browser.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +## Wrapper script to launch amrvis3d and connect with a browser-based X11 server +MOUNT_DIR=${1:-`pwd`} + +docker run -p 8080:8080 --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data ghcr.io/benwibking/amrvis-container:latest diff --git a/start_http_server.sh b/start_http_server.sh new file mode 100755 index 0000000..c7d61e2 --- /dev/null +++ b/start_http_server.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +## Wrapper script to launch browser-based X11 session +## (NOTE: This should only be called from within the Docker container.) +PORT=8080 +AMRVIS_EXE=/Amrvis3D/amrvis3d.gnu.ex +export XPRA_PASSWORD=$(openssl rand -hex 16) + +echo "" +echo "" +echo "************************************************************" +echo "Starting xpra server on http://localhost:$PORT/" +echo "Autogenerated password: $XPRA_PASSWORD" +echo "************************************************************" +echo "" +echo "" + +xpra start --start=$AMRVIS_EXE --bind-tcp=0.0.0.0:$PORT --no-daemon --ssl-cert=/etc/xpra/ssl-cert.pem diff --git a/xpra.conf b/xpra.conf new file mode 100644 index 0000000..0155240 --- /dev/null +++ b/xpra.conf @@ -0,0 +1,13 @@ +tcp-auth=env +html=on +exit-with-children=yes +printing=no +mdns=no +notifications=no +dbus-proxy=no +dbus-control=no +dbus-launch=no +systemd-run=no +ssl=auto +ssl-cert=/etc/xpra/ssl-cert.pem +ssl-client-verify-mode=none From 1a17ecde4311c9b5b8ebaf7ece8d3eda09a42312 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Sun, 25 May 2025 13:45:25 -0400 Subject: [PATCH 02/15] update README and launcher --- README.md | 9 +++++++++ start_http_server.sh | 5 +++-- xpra.conf | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fc88cea..1cc9cb9 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,15 @@ A short guide to Amrvis is available [here](https://amrex-codes.github.io/amrex/ The complete LaTeX-formatted documentation is available as a [PDF](Amrvis.pdf). +## Running from within a browser +You can launch a browser-based X11 server by running +```console +$ ./launch_amrvis3d_browser.sh +``` +Then open http://localhost:8080/ and copy-and-paste the autogenerated password printed to the terminal. + +**Caveat: The container hangs when clicking on the orthonormal viewports in Amrvis. No workaround is currently known, so this feature remains on the `xpra` branch, rather than on `main`.** + ## Running on macOS ### Install XQuartz and allow remote clients diff --git a/start_http_server.sh b/start_http_server.sh index c7d61e2..6a47330 100755 --- a/start_http_server.sh +++ b/start_http_server.sh @@ -3,7 +3,8 @@ ## Wrapper script to launch browser-based X11 session ## (NOTE: This should only be called from within the Docker container.) PORT=8080 -AMRVIS_EXE=/Amrvis3D/amrvis3d.gnu.ex +EXE=xterm +#EXE=/Amrvis3D/amrvis3d.gnu.ex export XPRA_PASSWORD=$(openssl rand -hex 16) echo "" @@ -15,4 +16,4 @@ echo "************************************************************" echo "" echo "" -xpra start --start=$AMRVIS_EXE --bind-tcp=0.0.0.0:$PORT --no-daemon --ssl-cert=/etc/xpra/ssl-cert.pem +xpra start --start=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem --no-daemon diff --git a/xpra.conf b/xpra.conf index 0155240..4c110d8 100644 --- a/xpra.conf +++ b/xpra.conf @@ -11,3 +11,5 @@ systemd-run=no ssl=auto ssl-cert=/etc/xpra/ssl-cert.pem ssl-client-verify-mode=none +speaker=disabled +microphone=disabled From 989217f73349e8531990041ddb068e782a903adc Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Sun, 25 May 2025 13:54:41 -0400 Subject: [PATCH 03/15] update launch scripts --- README.md | 4 +++- launch_amrvis3d_browser.sh | 6 ------ launch_amrvis_browser.sh | 11 +++++++++++ start_http_server.sh | 5 ++++- 4 files changed, 18 insertions(+), 8 deletions(-) delete mode 100755 launch_amrvis3d_browser.sh create mode 100755 launch_amrvis_browser.sh diff --git a/README.md b/README.md index 1cc9cb9..2570290 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,12 @@ The complete LaTeX-formatted documentation is available as a [PDF](Amrvis.pdf). ## Running from within a browser You can launch a browser-based X11 server by running ```console -$ ./launch_amrvis3d_browser.sh +$ ./launch_amrvis_browser.sh ``` Then open http://localhost:8080/ and copy-and-paste the autogenerated password printed to the terminal. +An `xterm` window should appear. Then you can type either `amrvis2d` or `amrvis3d` to launch Amrvis. + **Caveat: The container hangs when clicking on the orthonormal viewports in Amrvis. No workaround is currently known, so this feature remains on the `xpra` branch, rather than on `main`.** ## Running on macOS diff --git a/launch_amrvis3d_browser.sh b/launch_amrvis3d_browser.sh deleted file mode 100755 index db9a070..0000000 --- a/launch_amrvis3d_browser.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -## Wrapper script to launch amrvis3d and connect with a browser-based X11 server -MOUNT_DIR=${1:-`pwd`} - -docker run -p 8080:8080 --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data ghcr.io/benwibking/amrvis-container:latest diff --git a/launch_amrvis_browser.sh b/launch_amrvis_browser.sh new file mode 100755 index 0000000..69f8fce --- /dev/null +++ b/launch_amrvis_browser.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +## Wrapper script to launch xterm and connect with a browser-based X11 server + +MOUNT_DIR=${1:-`pwd`} + +docker run -p 8080:8080 --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data ghcr.io/benwibking/amrvis-container:latest + +## open your web browser to http://localhost:$PORT +## enter the autogenerated password printed to the terminal +## type `amrvis2d' or `amrvis3d' in order to launch amrvis diff --git a/start_http_server.sh b/start_http_server.sh index 6a47330..b7ba6d1 100755 --- a/start_http_server.sh +++ b/start_http_server.sh @@ -4,7 +4,6 @@ ## (NOTE: This should only be called from within the Docker container.) PORT=8080 EXE=xterm -#EXE=/Amrvis3D/amrvis3d.gnu.ex export XPRA_PASSWORD=$(openssl rand -hex 16) echo "" @@ -17,3 +16,7 @@ echo "" echo "" xpra start --start=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem --no-daemon + +## open your web browser to http://localhost:$PORT +## enter the autogenerated password printed to the terminal +## type `amrvis2d' or `amrvis3d' in order to launch amrvis From c54fdf8f26c064fc1fc68384d78f748b85db7644 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Sun, 25 May 2025 13:58:30 -0400 Subject: [PATCH 04/15] do not display verbose logging --- start_http_server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start_http_server.sh b/start_http_server.sh index b7ba6d1..943570c 100755 --- a/start_http_server.sh +++ b/start_http_server.sh @@ -15,7 +15,7 @@ echo "************************************************************" echo "" echo "" -xpra start --start=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem --no-daemon +xpra start --start=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem #--no-daemon ## open your web browser to http://localhost:$PORT ## enter the autogenerated password printed to the terminal From bd94e77d9da29e33af4a32e5ec372d0315064850 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Sun, 25 May 2025 13:59:18 -0400 Subject: [PATCH 05/15] prevent container from exiting --- start_http_server.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/start_http_server.sh b/start_http_server.sh index 943570c..10538c8 100755 --- a/start_http_server.sh +++ b/start_http_server.sh @@ -17,6 +17,9 @@ echo "" xpra start --start=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem #--no-daemon +# prevent container from exiting +sleep infinity + ## open your web browser to http://localhost:$PORT ## enter the autogenerated password printed to the terminal ## type `amrvis2d' or `amrvis3d' in order to launch amrvis From dad2c59898bfb1e9157ea3feb93389cf97c0994b Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Sun, 25 May 2025 14:02:23 -0400 Subject: [PATCH 06/15] add screenshot to README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2570290..683abb1 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,9 @@ $ ./launch_amrvis_browser.sh ``` Then open http://localhost:8080/ and copy-and-paste the autogenerated password printed to the terminal. -An `xterm` window should appear. Then you can type either `amrvis2d` or `amrvis3d` to launch Amrvis. +An `xterm` window should appear. Then you can type either `amrvis2d` or `amrvis3d` to launch Amrvis: + +Screenshot 2025-05-25 at 2 00 36 PM **Caveat: The container hangs when clicking on the orthonormal viewports in Amrvis. No workaround is currently known, so this feature remains on the `xpra` branch, rather than on `main`.** From 73377435e3df8253f2bf02ab8102a6e9831274bd Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 26 May 2025 01:27:22 -0400 Subject: [PATCH 07/15] fix Amrvis to avoid grabbing X server --- Dockerfile | 12 +- GNUmakefile.2d => GNUmakefile | 0 GNUmakefile.3d | 245 ---------------------------------- 3 files changed, 6 insertions(+), 251 deletions(-) rename GNUmakefile.2d => GNUmakefile (100%) delete mode 100644 GNUmakefile.3d diff --git a/Dockerfile b/Dockerfile index fb04d08..8414b43 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,14 +25,14 @@ RUN git clone https://ccse.lbl.gov/pub/Downloads/volpack.git && cd volpack && ma RUN git clone https://github.com/AMReX-Codes/amrex.git ## build Amrvis (2D) -RUN git clone https://github.com/AMReX-Codes/Amrvis.git Amrvis2D -COPY GNUmakefile.2d Amrvis2D/GNUmakefile -RUN cd Amrvis2D && make -j`nproc` +RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis2D +COPY GNUmakefile Amrvis2D/GNUmakefile +RUN cd Amrvis2D && git checkout no-grab-server && make DIM=2 -j`nproc` ## build Amrvis (3D) -RUN git clone https://github.com/AMReX-Codes/Amrvis.git Amrvis3D -COPY GNUmakefile.3d Amrvis3D/GNUmakefile -RUN cd Amrvis3D && make -j`nproc` +RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis3D +COPY GNUmakefile Amrvis3D/GNUmakefile +RUN cd Amrvis3D && git checkout no-grab-server && make DIM=3 -j`nproc` ## copy settings COPY .bashrc /home/vscode/.bashrc diff --git a/GNUmakefile.2d b/GNUmakefile similarity index 100% rename from GNUmakefile.2d rename to GNUmakefile diff --git a/GNUmakefile.3d b/GNUmakefile.3d deleted file mode 100644 index b66ecdb..0000000 --- a/GNUmakefile.3d +++ /dev/null @@ -1,245 +0,0 @@ -### ------------------------------------------------------ -### GNUmakefile for Amrvis -### ------------------------------------------------------ -AMREX_HOME ?= ../amrex - -PRECISION = FLOAT -PRECISION = DOUBLE - -PROFILE = FALSE -TRACE_PROFILE = FALSE -COMM_PROFILE = FALSE - -COMP = gnu - -DEBUG = FALSE -#DEBUG = TRUE - -DIM = 3 - -USE_ARRAYVIEW = TRUE -USE_ARRAYVIEW = FALSE - -USE_MPI=TRUE -USE_MPI=FALSE - -USE_CXX11 = TRUE - -USE_VOLRENDER = FALSE -USE_VOLRENDER = TRUE - -USE_PARALLELVOLRENDER = TRUE -USE_PARALLELVOLRENDER = FALSE - -USE_PROFPARSER = TRUE -USE_PROFPARSER = FALSE - -ifeq ($(DIM), 1) - USE_PROFPARSER = FALSE -endif -ifeq ($(DIM), 3) - USE_PROFPARSER = FALSE -endif -ifeq ($(USE_PROFPARSER), TRUE) - PROFILE = TRUE - TRACE_PROFILE = TRUE - BL_NO_FORT = FALSE -else - BL_NO_FORT = TRUE -endif - -#DEFINES += -DAV_CGS_FIXSLNC - -include $(AMREX_HOME)/Tools/GNUMake/Make.defs - -EBASE = amrvis -HERE = . - -INCLUDE_LOCATIONS += $(HERE) -INCLUDE_LOCATIONS += $(AMREX_HOME)/Src/Base -INCLUDE_LOCATIONS += $(AMREX_HOME)/Src/Extern/amrdata - -DEFINES += -DBL_OPTIO - -############################################### x includes and libraries - -ifeq ($(MACHINE), OSF1) - LIBRARIES += -lXm -lXt -lX11 -endif - -ifeq ($(WHICHLINUX), ATLAS) - LIBRARY_LOCATIONS += /usr/X11R6/lib64 -endif - -ifneq ($(which_site), unknown) - LIBRARY_LOCATIONS += /usr/lib64 - INCLUDE_LOCATIONS += /usr/include/Xm - INCLUDE_LOCATIONS += /usr/include/ - - LIBRARIES += -lXm -lXt -lXext -lSM -lICE -lXpm -lX11 - - ifeq ($(which_computer), edison) - ifeq ($(USE_MPI), TRUE) - LDFLAGS += -dynamic - endif - endif - - ifeq ($(which_computer), cori) - ifeq ($(USE_MPI), TRUE) - LDFLAGS += -dynamic - endif - endif -endif - -ifeq ($(MACHINE), AIX) - INCLUDE_LOCATIONS += /usr/include/X11 - INCLUDE_LOCATIONS += /usr/include/Xm - #INCLUDE_LOCATIONS += /usr/include/X11/Xaw - LIBRARIES += -lXm -lXt -lX11 - DEFINES += -D_ALL_SOURCE -endif - -ifeq ($(MACHINE), CYGWIN_NT) - INCLUDE_LOCATIONS += /usr/X11R6/include - LIBRARY_LOCATIONS += /usr/X11R6/lib - LIBRARIES += -lXm -lXt -lSM -lICE -lXpm -lX11 -endif - -# last chance catch-all -ifeq ($(which_site), unknown) - INCLUDE_LOCATIONS += /usr/include/ - - # check if running on macOS (as there are some subtle differences to linux). - UNAME_S = $(shell uname -s) - ifeq ($(UNAME_S), Darwin) - # these assume that dependencies are installed via homebrew, which symlinks - # everything into the /usr/local tree. - INCLUDE_LOCATIONS += /usr/local/include - LIBRARY_LOCATIONS += /usr/local/lib - - # if dependencies installed via macport, everything symlinks - # to /opt/local/ - INCLUDE_LOCATIONS += /opt/local/include - LIBRARY_LOCATIONS += /opt/local/lib - - # on macOS X11 is installed into the /opt tree - INCLUDE_LOCATIONS += /opt/X11/include - LIBRARY_LOCATIONS += /opt/X11/lib - else - # if not running macOS, then assume we are looking at a standard - # ubuntu-like linux. - INCLUDE_LOCATIONS += /usr/include/Xm - LIBRARY_LOCATIONS += /usr/lib64 - endif - - LIBRARIES += -lXm -lXt -lXext -lSM -lICE -lXpm -lX11 -endif - - -# JFG: this line is needed on hive -# LIBRARY_LOCATIONS += /usr/X11R6/lib64 - - - -############################################### arrayview -ifeq ($(USE_ARRAYVIEW), TRUE) - DEFINES += -DBL_USE_ARRAYVIEW - ARRAYVIEWDIR = . - INCLUDE_LOCATIONS += $(ARRAYVIEWDIR) - #LIBRARY_LOCATIONS += $(ARRAYVIEWDIR) - #LIBRARIES += -larrayview$(DIM)d.$(machineSuffix) -endif - - -############################################### volume rendering -ifeq ($(DIM),3) - ifeq ($(MACHINE), T3E) - USE_VOLRENDER = FALSE - endif - ifeq ($(MACHINE), AIX) -# USE_VOLRENDER = FALSE - endif - ifeq ($(USE_VOLRENDER), TRUE) - DEFINES += -DBL_VOLUMERENDER - VOLPACKDIR = ../volpack - INCLUDE_LOCATIONS += $(VOLPACKDIR) - LIBRARY_LOCATIONS += $(VOLPACKDIR) - LIBRARIES += -lvolpack - #DEFINES += -DVOLUMEBOXES - endif -endif - -############################################### parallel volume rendering -ifeq ($(DIM),3) - ifeq ($(USE_PARALLELVOLRENDER), TRUE) - DEFINES += -DBL_PARALLELVOLUMERENDER - endif -endif - -############################################### other defines -#DEFINES += -DSCROLLBARERROR -#DEFINES += -DFIXDENORMALS - -ifdef CONFIG_FILEPATH - DEFINES += -DAMRVIS_CONFIG_FILEPATH='"${CONFIG_FILEPATH}"' -endif -############################################### float fix -# if we are using float override FOPTF which sets -real_size 64 -ifeq ($(PRECISION), FLOAT) - ifeq ($(MACHINE), OSF1) - FDEBF += -C - FDEBF += -fpe2 - FOPTF = -fast -O5 -tune ev5 - endif -endif - -include $(HERE)/Make.package -include $(AMREX_HOME)/Src/Base/Make.package -#include $(AMREX_HOME)/Src/Extern/ProfParser/Make.package -include $(AMREX_HOME)/Src/Extern/amrdata/Make.package - -#INCLUDE_LOCATIONS += $(AMREX_HOME)/Src/Extern/ProfParser - -VPATH_LOCATIONS += $(HERE) -VPATH_LOCATIONS += $(AMREX_HOME)/Src/Base -#VPATH_LOCATIONS += $(AMREX_HOME)/Src/Extern/ProfParser -VPATH_LOCATIONS += $(AMREX_HOME)/Src/Extern/amrdata - -ifeq ($(USE_PROFDATA), TRUE) - #SED0 = | sed 's/\#define vout/\/\//' - #SED1 = | sed 's/vout/\/\//' - SED0 = - SED1 = -endif - -vpath %.cpp $(VPATH_LOCATIONS) -vpath %.H $(VPATH_LOCATIONS) -vpath %.F $(VPATH_LOCATIONS) -vpath %.f $(VPATH_LOCATIONS) -vpath %.f90 $(VPATH_LOCATIONS) -vpath %.c $(VPATH_LOCATIONS) -vpath %.h $(VPATH_LOCATIONS) -vpath %.l $(VPATH_LOCATIONS) -vpath %.y $(VPATH_LOCATIONS) -vpath %.a $(LIBRARY_LOCATIONS) - -all: $(executable) - -ifeq ($(USE_PROFDATA), TRUE) - -#BLProfParser.tab.H BLProfParser.tab.cpp: $(AMREX_HOME)/Src/Extern/ProfParser/BLProfParser.y -# cat $(AMREX_HOME)/Src/Extern/ProfParser/BLProfParser.y $(SED0) $(SED1) > BLProfParserNC.y -# bison --defines=BLProfParser.tab.H --output=BLProfParser.tab.cpp \ -# BLProfParserNC.y -# rm BLProfParserNC.y - - -#BLProfParser.lex.yy.cpp: BLProfParser.tab.H $(AMREX_HOME)/Src/Extern/ProfParser/BLProfParser.l -# flex --outfile=BLProfParser.lex.yy.cpp $(AMREX_HOME)/Src/Extern/ProfParser/BLProfParser.l - -endif - -include $(AMREX_HOME)/Tools/GNUMake/Make.rules - -### ------------------------------------------------------ -### ------------------------------------------------------ From 31d803c31e8044ca7c630ed98a24137ad0568e25 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 26 May 2025 15:31:18 -0400 Subject: [PATCH 08/15] handle cleanup --- .Xresources | 103 +++++++++++++++++++++++++++++++++++++++ .bashrc | 6 +++ Dockerfile | 3 ++ launch_amrvis_browser.sh | 2 +- start_http_server.sh | 6 +-- 5 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 .Xresources diff --git a/.Xresources b/.Xresources new file mode 100644 index 0000000..ac3dbac --- /dev/null +++ b/.Xresources @@ -0,0 +1,103 @@ +!------------------------------------------------------------------------------ +! This is a sample ~/.Xresources file, demonstrating some basic X/Motif and +! EMWM configuration. Refer to EMWM FAQ/Guide and manpages for further info. +!------------------------------------------------------------------------------ + +!------------------------------------------------------------------------------ +! Global X/Motif setup +!------------------------------------------------------------------------------ + +!! Make sure to adjust this for your screen to have properly sized fonts +Xft.dpi: 160 + +!! Default variable width font for all Motif user interface elements +*renderTable.variable.fontType: FONT_IS_XFT +*renderTable.variable.fontName: Liberation Sans +*renderTable.variable.fontSize: 10 +*renderTable: variable + +!! In case fixed width font is preferred for text input widgets... +*renderTable.fixed.fontType: FONT_IS_XFT +*renderTable.fixed.fontName: Liberation Mono +*renderTable.fixed.fontSize: 10 +!! ...uncomment lines below to enable +! *XmText*renderTable: fixed +! *XmTextField*renderTable: fixed + +!! Default background and highlight colors +*background: #d2d2d2 +*highlightColor: #5f8ba0 + +!! Lighter and somewhat saturated background for lists and text input widgets +*XmList.background: #b6b6aa +*XmText.background: #d3b5b5 +*XmTextField.background: #d3b5b5 + +!! Tool tip appearance +*TipLabel.background: antiquewhite +*TipShell.borderColor: black +*TipShell.borderWidth: 1 + +!! Some tweaks +*multiClickTime: 260 +*XmScrollBar.width: 14 +*XmScrollBar.height: 14 + + +!------------------------------------------------------------------------------ +! Window and icon decorations +!------------------------------------------------------------------------------ +Emwm*client*background: #8C8C8C +Emwm*client*activeBackground: #aba68c +Emwm*icon*activeBackground: #aba68c + +!! Dithered frame borders (somewhat reminiscent of Indigo Magic) +! Emwm*client*topShadowPixmap: 1x1 +! Emwm*client*activeTopShadowPixmap: 1x1 + +!------------------------------------------------------------------------------ +! Client icon substitution +!------------------------------------------------------------------------------ +!! Note that unless full path is given, images must reside in one of +!! default locations like $APPLRESDIR/bitmaps (see XmGetPixmap(3)) +Emwm*XTerm*iconImage: terminal.xpm +Emwm*NEdit*iconImage: textedit.xpm +Emwm*XFile*iconImage: xfile.xpm + +!------------------------------------------------------------------------------ +! CDE 2.0 Motif look defaults +!------------------------------------------------------------------------------ +*enableThinThickness: True +*enableBtn1Transfer: button2_adjust +*enableButtonTab: True +*enableDefaultButton: True +*enableEtchedInMenu: True +*enableMenuInCascade: True +*enableMultiKeyBindings: False +*enableToggleColor: True +*enableToggleVisual: False +*enableDragIcon: False + +!------------------------------------------------------------------------------ +! CDE 2.0 bindings for text input widgets +!------------------------------------------------------------------------------ +*XmText*Translations:#override\n\ + Ctrlu:delete-to-start-of-line()\n\ + Ctrlk:delete-to-end-of-line()\n\ + Ctrla:beginning-of-line()\n\ + Ctrle:end-of-line()\n\ + Ctrlp:process-up()\n\ + Ctrlb:backward-character()\n\ + Ctrln:process-down()\n\ + Ctrlf:forward-character() + +*XmTextField*Translations:#override\n\ + Ctrlu:delete-to-start-of-line()\n\ + Ctrlk:delete-to-end-of-line()\n\ + Ctrla:beginning-of-line()\n\ + Ctrle:end-of-line()\n\ + Ctrlb:backward-character()\n\ + Ctrlf:forward-character() + +!----------------------------------- EOF -------------------------------------- +! $Id: Xresources-sample,v 1.8 2024/12/25 21:30:19 alx Exp alx $ diff --git a/.bashrc b/.bashrc index 7d5fc77..0c3f1e7 100644 --- a/.bashrc +++ b/.bashrc @@ -1,3 +1,9 @@ alias amrvis2d='/Amrvis2D/amrvis2d.gnu.ex' alias amrvis3d='/Amrvis3D/amrvis3d.gnu.ex' +echo "*** Welcome to Amrvis-container! ***" +echo "" +echo "Type 'amrvis2d' or 'amrvis3d' to start Amrvis." +echo "Exiting this terminal will stop this container." +echo "" + diff --git a/Dockerfile b/Dockerfile index 8414b43..3b2b020 100644 --- a/Dockerfile +++ b/Dockerfile @@ -41,7 +41,10 @@ COPY Palette /home/vscode/Palette ## configure X11 server COPY ./xpra.conf /etc/xpra/xpra.conf +COPY ./.Xresources /home/vscode/.Xresources COPY ./start_http_server.sh /home/vscode/start_http_server.sh +RUN mkdir -p /run/user/1000 && chown vscode /run/user/1000 +ENV XDG_RUNTIME_DIR=/run/user/1000 EXPOSE 8080 WORKDIR /home/vscode diff --git a/launch_amrvis_browser.sh b/launch_amrvis_browser.sh index 69f8fce..e6661a1 100755 --- a/launch_amrvis_browser.sh +++ b/launch_amrvis_browser.sh @@ -4,7 +4,7 @@ MOUNT_DIR=${1:-`pwd`} -docker run -p 8080:8080 --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data ghcr.io/benwibking/amrvis-container:latest +docker run --init -p 8080:8080 --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data ghcr.io/benwibking/amrvis-container:latest ## open your web browser to http://localhost:$PORT ## enter the autogenerated password printed to the terminal diff --git a/start_http_server.sh b/start_http_server.sh index 10538c8..107d960 100755 --- a/start_http_server.sh +++ b/start_http_server.sh @@ -15,10 +15,8 @@ echo "************************************************************" echo "" echo "" -xpra start --start=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem #--no-daemon - -# prevent container from exiting -sleep infinity +xpra start --start-child=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem --exit-with-children --no-daemon > xpra_logfile.txt 2>&1 +wait $! ## open your web browser to http://localhost:$PORT ## enter the autogenerated password printed to the terminal From 6c3c41a18efad985637d73a9a8f7aae6edd03973 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 26 May 2025 15:31:56 -0400 Subject: [PATCH 09/15] use viridis by default --- Palette | Bin 1024 -> 1024 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Palette b/Palette index 1a87a2ab837a844553af8aed60bf99aa310ed987..3c9e9d85dc816355ecf071bb234cfe7f535e3651 100644 GIT binary patch literal 1024 zcmZ>9admYA0(TJbKnGw^khH6-tBZ?^v$K?%jg7Unm6fHXg@w7f znVG4niHWhXk&&UHp@D(EzMh_*uC9)bj<&XzmX@ZbriO;Py1JU0nyRX*ii)zbvXYXL zA`mDjD9A&AoSYnlp`f6ssHCKfAsYEt2ggIe);y}_g_XP7FKo+E^b~v0YPCAF>whgX&G601x29kYEZik zjEq5+TLNvjvv+WGa&dKY_we-c@%8f$2n-4i2@Q*gjEatljf+o6OiE5kO-s+n%*xKm z&C4$+EG#N6DJ?6nsI024sjaJTXl!a~ZfR|6@96C6?&CDz5Yj5x9=;-Y1>;i&rAm{;uUKr>j5uYfE!;Q&VGO zLw$W+ZB0#eRb^#Gd0A;maZzDGeqL@)c2;IadTL5?QbK%OOmtL4cvwhqV1S>mx2K1j xtFxnnosG4nxtWQPfxfP`riPlTvZ8{#tc=jIm{mzGyn*VZ>Sx3+h7_x2ACkB(1H&(1F{udZ)y@9v*GefIpt%U7@8 zynXln!^cmbzkL1n{m0K=zyJLG_kT*kuWujUzI^iF_Vvr>P8~hCcgL3XtCugDH*@O5 zo{r{v!oDA9=l}ox{qy_R&mZ3hdf@!&=gT?b_PoLc1-QHYZU0$4@ot_*Y z9UkoO?e1)EZEmcut*$IDEiTN@&CX1~hqMm;|1@?#0q;>)nvs!-iJ6&&g_V_!jh&r? zgOihsi<_H=hnJU+kDp&aKu}OfNLW}zL{wBvOk7ezQc_AvT3SX%R#r|V#-QB~(!_(8t%gfu_+sDVp*VoU_ r&)+{FATTf}C^#e}G&C$MJR%}8GAb%MCMGsEE-pSkAu%y2DLDlIM0=QM From 9c140c3b7e2f885e9998993deed19c1c163423ad Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 26 May 2025 15:53:33 -0400 Subject: [PATCH 10/15] comment-out emwm --- Dockerfile | 9 ++++++++- start_http_server.sh | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3b2b020..159bf3a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,6 +34,14 @@ RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis3D COPY GNUmakefile Amrvis3D/GNUmakefile RUN cd Amrvis3D && git checkout no-grab-server && make DIM=3 -j`nproc` +## build window manager +#RUN apt-get --yes -qq update && apt-get --yes -qq upgrade \ +# && apt-get --yes -qq install libxrandr-dev libxinerama-dev \ +# && apt-get --yes -qq clean \ +# && rm -rf /var/lib/apt/lists/* +#RUN git clone https://github.com/alx210/emwm.git && cd emwm && make -j`nproc` && make install +#COPY ./.Xresources /home/vscode/.Xresources + ## copy settings COPY .bashrc /home/vscode/.bashrc COPY amrvis.defaults /home/vscode/.amrvis.defaults @@ -41,7 +49,6 @@ COPY Palette /home/vscode/Palette ## configure X11 server COPY ./xpra.conf /etc/xpra/xpra.conf -COPY ./.Xresources /home/vscode/.Xresources COPY ./start_http_server.sh /home/vscode/start_http_server.sh RUN mkdir -p /run/user/1000 && chown vscode /run/user/1000 ENV XDG_RUNTIME_DIR=/run/user/1000 diff --git a/start_http_server.sh b/start_http_server.sh index 107d960..957f7c7 100755 --- a/start_http_server.sh +++ b/start_http_server.sh @@ -15,7 +15,11 @@ echo "************************************************************" echo "" echo "" -xpra start --start-child=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem --exit-with-children --no-daemon > xpra_logfile.txt 2>&1 +# use xpra as window manager +xpra start --start-child=$EXE --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem --exit-with-children --no-daemon > xpra_logfile.txt 2>&1 +# use emwm as window manager (buggy) +#xpra desktop --start-child=emwm --bind-tcp=0.0.0.0:$PORT --ssl-cert=/etc/xpra/ssl-cert.pem --exit-with-children --no-daemon > xpra_logfile.txt 2>&1 + wait $! ## open your web browser to http://localhost:$PORT From 346685204dcc0582a97570baa8b809c4b49b7b0b Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Tue, 27 May 2025 16:46:46 -0400 Subject: [PATCH 11/15] rename launcher scripts --- .../launch_amrvis2d_linux.sh | 0 .../launch_amrvis2d_macos.sh | 0 .../launch_amrvis3d_linux.sh | 0 .../launch_amrvis3d_macos.sh | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename launch_amrvis2d_linux.sh => legacy_launchers/launch_amrvis2d_linux.sh (100%) rename launch_amrvis2d_macos.sh => legacy_launchers/launch_amrvis2d_macos.sh (100%) rename launch_amrvis3d_linux.sh => legacy_launchers/launch_amrvis3d_linux.sh (100%) rename launch_amrvis3d_macos.sh => legacy_launchers/launch_amrvis3d_macos.sh (100%) diff --git a/launch_amrvis2d_linux.sh b/legacy_launchers/launch_amrvis2d_linux.sh similarity index 100% rename from launch_amrvis2d_linux.sh rename to legacy_launchers/launch_amrvis2d_linux.sh diff --git a/launch_amrvis2d_macos.sh b/legacy_launchers/launch_amrvis2d_macos.sh similarity index 100% rename from launch_amrvis2d_macos.sh rename to legacy_launchers/launch_amrvis2d_macos.sh diff --git a/launch_amrvis3d_linux.sh b/legacy_launchers/launch_amrvis3d_linux.sh similarity index 100% rename from launch_amrvis3d_linux.sh rename to legacy_launchers/launch_amrvis3d_linux.sh diff --git a/launch_amrvis3d_macos.sh b/legacy_launchers/launch_amrvis3d_macos.sh similarity index 100% rename from launch_amrvis3d_macos.sh rename to legacy_launchers/launch_amrvis3d_macos.sh From 3ed62fbc148a33737dc0cb54ab0b8e56997b1c36 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 29 May 2025 23:05:38 -0400 Subject: [PATCH 12/15] update Dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 159bf3a..afc1b8d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,12 +27,12 @@ RUN git clone https://github.com/AMReX-Codes/amrex.git ## build Amrvis (2D) RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis2D COPY GNUmakefile Amrvis2D/GNUmakefile -RUN cd Amrvis2D && git checkout no-grab-server && make DIM=2 -j`nproc` +RUN cd Amrvis2D && git checkout logspace-colorbar && make DIM=2 -j`nproc` ## build Amrvis (3D) RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis3D COPY GNUmakefile Amrvis3D/GNUmakefile -RUN cd Amrvis3D && git checkout no-grab-server && make DIM=3 -j`nproc` +RUN cd Amrvis3D && git checkout logspace-colorbar && make DIM=3 -j`nproc` ## build window manager #RUN apt-get --yes -qq update && apt-get --yes -qq upgrade \ From 2def2713b45cb8260d7194a07f87359e15f16371 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 12 Jun 2025 11:59:10 -0400 Subject: [PATCH 13/15] add AmrProfParser support --- .bashrc | 2 ++ Dockerfile | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.bashrc b/.bashrc index 0c3f1e7..c7c48fd 100644 --- a/.bashrc +++ b/.bashrc @@ -1,9 +1,11 @@ alias amrvis2d='/Amrvis2D/amrvis2d.gnu.ex' alias amrvis3d='/Amrvis3D/amrvis3d.gnu.ex' +alias amrprofparser='/AmrProfParser/amrvis2d.gnu.TRACE_PROF.ex' echo "*** Welcome to Amrvis-container! ***" echo "" echo "Type 'amrvis2d' or 'amrvis3d' to start Amrvis." +echo "Type 'amrprofparser' to start AmrProfParser." echo "Exiting this terminal will stop this container." echo "" diff --git a/Dockerfile b/Dockerfile index afc1b8d..5dbb68c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM mcr.microsoft.com/devcontainers/cpp:ubuntu-24.04 RUN apt-get --yes -qq update \ && apt-get --yes -qq upgrade \ - && apt-get --yes -qq install build-essential m4 \ + && apt-get --yes -qq install build-essential gfortran m4 bison flex \ libmotif-dev libxext-dev libxpm-dev \ python3-setuptools \ && apt-get --yes -qq clean \ @@ -24,15 +24,20 @@ RUN git clone https://ccse.lbl.gov/pub/Downloads/volpack.git && cd volpack && ma ## download AMReX RUN git clone https://github.com/AMReX-Codes/amrex.git +## build AmrProfParser +RUN git clone https://github.com/BenWibking/Amrvis.git AmrProfParser && cd AmrProfParser && git checkout logspace-colorbar +COPY GNUmakefile AmrProfParser/GNUmakefile +RUN cd AmrProfParser && make DIM=2 USE_PROFPARSER=TRUE -j`nproc` + ## build Amrvis (2D) -RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis2D +RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis2D && cd Amrvis2D && git checkout logspace-colorbar COPY GNUmakefile Amrvis2D/GNUmakefile -RUN cd Amrvis2D && git checkout logspace-colorbar && make DIM=2 -j`nproc` +RUN cd Amrvis2D && make DIM=2 -j`nproc` ## build Amrvis (3D) -RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis3D +RUN git clone https://github.com/BenWibking/Amrvis.git Amrvis3D && cd Amrvis3D && git checkout logspace-colorbar COPY GNUmakefile Amrvis3D/GNUmakefile -RUN cd Amrvis3D && git checkout logspace-colorbar && make DIM=3 -j`nproc` +RUN cd Amrvis3D && make DIM=3 -j`nproc` ## build window manager #RUN apt-get --yes -qq update && apt-get --yes -qq upgrade \ From b66f97eacbdb63ecc7e25981e8d426472348ae37 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Sat, 14 Jun 2025 15:55:19 -0400 Subject: [PATCH 14/15] add utilities --- Amrvis.pdf | Bin 186045 -> 187013 bytes Dockerfile | 21 +++++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/Amrvis.pdf b/Amrvis.pdf index de1e94f8773c2c59e45c1c44f97747d1446856b1..5bd98847573e8c169ba464be816cb0475504e664 100644 GIT binary patch delta 25075 zcmV)fK&8LEtqX;<3$Pv?12Q=|lOY`_f2~=dz z)@WL^eV}J#4*`udl{D*hetpl4x>*sktiSGS~Ul?fsQ9 zCboHTm1j2ACcC;lT>UHh$3L%krZCZ$`g*6Lc3|o^-yGU&qoc>`|J?rg;YKI3e|<_F zXN9>+c!S%c@A0J~dZd>$43I9PgYVC^L&lS=P@ni&`=;X2xo!uUZ13eYH#p{ez0UH; z)t5?ExaPo1;EN#E)h@SjZu6_1QgNBdf%aYHh6)yHn?{evs^QV4_ss(jhvT)1DjuKw z;ZV!C?fBXGha*Zo$ddNb%Zj_pe=xL7FWa>EG|{1hGg>?}Qg}33;PzeHv!uyV#^DGX zrez^#P0KR+>Z`~2dRL|iAS$y64$t;S2DWE%d>;_XBG-90__kpd!iY~<1MgOKwI@W7 z`tQXxbT~hdX12t0b&FUTmGdq*z;l6osVSqMFZJNh^=yJiL6fK3pU04;+_n@W?nfLAK3_$d415(;t35p=@d;_F?v#&1) zR1#AAmf`5yS~&Ot8o0)v0&+C zwSZj-2DR7`S}(%fF}nk_C}!A5b^ue95xJx6v0=8KNO+wW(ce97`N-67Go#gc8GHx@ zuwe~}g_B=!p{uK5sCWidg=f-+&V*}R-M2hBizPTgi13X2R`v4Q?Y6ixmoVy?8iDiZ z>zYSxQ$OKIlk5fif4_k^*ZaF#2zGnafV|TQ|DK-`4vfHrO97@w=FK45kkpH3LF_)T zf3SrCi?WcBufc>CdOX}8dyVFg{Bk*Al7s`oZ`HA%++3F#?0s@?$)(DuI7^GA_vk5V zv9b-NJbLnZG^7d2KL+Fbzyr1in7Nm)BNOcppR-^@=6eVpf0f61s+QQ1QZE#VM0Xu| zsgewwfOmnf8AvO_XGOu_%w~uYFyZtD;t6%8y;|Q$a>eyiikC(5g>g&pE=R#rD8Oa6 zrEf8XH>>U^bXZUdS0AI6)TWjS6(@PN3UNAF<|d$BU5~znG@k(mptVj|Ek8+Xi#7Lc zc$e~^lJlTF!-lyfg)#ot+A)gL`+ z@M#Mx6|3|$4MLEppmwaKk~p$wK0$))x542J7XqAo^H)a_{N?QSP*lDkOrc?zFNH}% z#g{_G2OIg51Rk2{Bw7*C^5#^r5@UZETGTY;tGrC5+5^69V{seq5x{rTm7|O{u*wX> zF{BMhf8gv)ydtoZIKc#&rqM^9cxXAOk%A8^3*&dZly2~DwjG{8GF7Z#b>H3wEBKGe zRyxi?RDl6(G{I^zMa4=$78fj#MaB%-6f)WE)=rEp6l2Q%pO9653fVGy$zuwg0m4}f zCdLw~*u(}rQNfWubM&jad$+H)D&MJlD`IFoe+A{eqXGu9#?Kr-FB_W4b!^LWl{270 zJaN3dFhz~hvWl|7Lvi}jbyIu=22>~yGS{;hDgxZH9P0CNSsLbWnR?HnIwmnCOA3Kl zSCo3Gzjcn*CXcw3uu@+D1M6%E5;Fa~vLJR{ahF%~%Ur*Jf4Vb&Bdp^x#-e;kp8dC~ zf0lY&icrw1o&l?~6g+7}7R(affo*&L`&P!-h4mYD3c-(SQ7|G1%MTTmtk}Atfu6XP zUxm!MJDE`nln}YK#f^PEZA?Y(!Uf0#AVR&pSOF|C1J!?Qbq310RWp_rc4l=*&Fd7T z@$!L^5E9Z)!H7Cvcl&-*V{+rB(}t$7h>lo45o?qQ>T$mhw+Ey&%yvT{ zM1v~NAo8u6o~37Nj70n4(p5}Qe{i7@*Zz3#b@HJu4;NQBEdg5Ik;ROaUPMJC$!sX^ zX-MAHwAV(5(?h$(oj3Nb%|`41!&J#s@Lle@>cQiE<#T8=u;FBkp<|jpwOy#As{x|e zb{(j6DIPG3QNQBFB4*Q2tWY|AB~(FEWz%(nOy;2qsYOeb1nt8>S}J6kmWSun{r`0e#qubEH0sdCNsf-R03*_E~ZXojn~Z# zXBOLRRU@)h#v6gcz;X2$e+;n@EKS4#5q};S;8I7Y3sxUEd&jdh#!n*&pU206*YXOK zeOh^DqUS#akR#a{*V83G6;)aE`JSiUrYxN1Sm?zOkB;i_B5Fv<8OCKyLmb=J5TyjFii*lE~|I4UgT)@?eh(L7mkm2DQ~{Bc;e9 zul=sB)+!BLUQ~9!-Y5`SRQx6ZIM{VfW0|e|&ZO3sFe!tb>sNUj@VSi|TP+2vMZ>{g z1Ahkm>qrI`AGnTb=YOtsJbK_+8q;18?S-%XnB!1;Idr~$r^yK~%+a<*bzE;u7{bBO z^f-FxoI|BIQJMtr4@}JYHCGU6r`#{BYUd>kT-Ni<)%^v?GGuF-PzEjd2tsB-`cqM2 z00kwTCY&CFcGOWC|JgMe4nq%kuGJa7=KMiR6Z(tFv(QYM<4B2J_>0tAQ2?xps?SmNyeovnM8cI|8308Cz!_S*E zVNKrDXwz?$uz#t3&YE#3Vrgb+uXUgHpoOcC$I^Oodt%FCwEn1vl(C4DLE7uzKP~L2 zr7)4|dB*m#?egKmRDjUQ;XZWk(m6ia?-1K?(rzhMGn8_V|RiUM8^7pF}_AOa7~Cs8phKU%Nx6d z<4`@4w13x{04#4EYC80?zG3$g$LlHecsN`oDe>xvD#2vc#E+`I`( zD{H^UPlU&44t=xmhr6diXGLN$ayu~dqIB#Z%t$%`UtaAOwo$RjWYn`hT1X@;E`|Hf z{!?iz5*1Ay_~ zw7Jwqm~h?(MH)i3a6Eb-45z*Z5k68LKN6}p$l*>54mjqLL)4nzt#v({=V2^5Zo$v*!xZd9Ubq=d-d7AiH}sP- zlz$?MXE36YzD}zo9;1Sv%X#978%F{ZBtI2kQeJ#jfLU|z4#aBwMx&DL5-3H{3^^_( zwJC6TF0D7WC--ID+866+lnR;Ym+I&aWweueKeWw2@@=yo+GaTYa`5v`6Tke?74BvA zv`9^It9p6qiw#x80wSz$?etTaxqwy+r3CVxxE zMI8x=Z+Bqkk>n!j!rfXiG(9j&v4E59E-(2O161mnyb!WLhC0Zp1&YxbFc`6YVpHHP z4@vrMpRZ9kZ55esgmW-ec2{u*?tInWHlPtUV@r0$J4^VLa9T(;z zx}Y(2xIZKo-xTJEJtfc6?*}q9$>0#Q4Vu&!OA!)GjM{1LL{$v;Ue|Ox*MBt_IQUIb zt0L&->#p20&E2JR%51ov!3r#;khb*WL@Dnl9<$)Py-q_H`{Z&&SFIHB@oq6k>czM3lN$687??ndaxdz4qZi;_vH-q;&^+_LVqic zCu&(2_mALKbiHPees@eD$Jee=RL${AUqP~OAz@ogtO3(5IR+;r+J7^;vnmtQ4Z7cb zK_lj6XP53UkqFale$7;)yE$G6`yUQ|lJ$lG<)%j%Jwz^RjY4X|yuB^?d-jtMNszI8 z4F~Hdv%&v>yfRLF-+=m!LR<$gQ%73MU7~ z@6mzrvxPq1l5pAoYJX58l-&44lENgjUk;T||1_p5`?0b2W!|<0rj^~_eb~9}I>kV- zTt`807Ri?^ZHxiQ(EhhvsFfcNcAsr}xtyx)*+{O`p z-(NAv6DQcA$v$`($b%(WfCDQ?tW9D;(nIf%v%{Dij(O~A_3KktlXFm(fMg$*)z!^r zb#;Ap&5OI6?_L|d%ELTS$?9&minR{YBwHmm4VAX5yJGb|h(jHk^(KyO6ufE2zFco~ zrh}L5VXaj#bZyU+brr2PaTe+<=huENcLT3{F%APPhBe>4R?*4l5)+y@gBR(A zw`E;!hwAVEZ{;f3b!~%`4w~|?R#`Cix9g3G(qLOx+qFuA-=?+q^o5=W?ojZ1?oc&u zsNmDY-?p?334BWu13R>F406X|ZsoW|=WyARY;J;nyzk0~O7=H@L3NPrdH7hBPfYFF zj)}qzt}ln)i&0D);m(ivudT-h6d4D6s4VD@)!{IGbJ&-YPETZm^E{CHW0oR|XeAL< zkNS#(a_B%k#6r<-`S3&M4t?!Jz3~40-WT_bY0r!O&csSstPhcmo~mIFtF)H4HJo=} zkqH2gFNo=5SN45>S-?y2Epu2y@CM&(=5JQBl40Vw-oS;o72hE9SlzIuB25E!zqWbWUu;G2J0gyMZ}k^$N~}ZmcYL^iI}; z&>(wX;TCB5s7qslpJYG%>Xz3Jd(t0nT=y+ccI^N<>KFCcwIhS)1b5{#YNQmj@t04K zqZ#Mg_&4+!&SA)x{WahS_B9 zClT92rT_<60vu}+51i9=6L5g8WRn><8=WRz1c1tB*#ZbZ+GxU$HpUw#a8AL4hxgN8ApCmyO}EpPVxC87yiNI+)s;F+!LH~4RD z+oq9~F@Yvzu%%&=q~}_Hz0O#t2+i`7Yv8lri~7{bsVoHHY|0v4(>>y4tIP(QL-}-n ztOpr<>TC8TmO?M`(s}BPZ0s*{N#l} z_5=KdMcGx4C7!Jar&AtWQ{o6zB8;(r3GwsSC*Amc&kpspFFP^=@Q3&Ta`I#flqFnC zmnNZ#wHK~B0M1=~BHL045kW>~{VP;6Tmug9rY{Tzj=XbYJuJZ{wP8NP27FACbEL+T zh-(2#OjJq%hTSx9aduacfja=W4jpW0BmXqhP zBj2)c(il}Z>qBfa^lyb^_+^-W;T~fsh|*mBp~WUA-b6uBz}^HY@+L^I(?zP6fWv+T zIo?|!%{7Da6$icWED7o-9)F0n=?B*h8%hr_jV}JgQ?tK-!5{dG3+KLhKE-jK1?dLh zf2|Af-720mDX@g_Ji#)_F*YNAi!lj=zfzo|@&uWsqpW1lBf0=yfoYiX*#Hux8=iZg z-Wv50vqV6(IC%bKS4#TN@|~S+RyRt*IcOSi(wcf}WHAqAKQOy48JRUt9=rA)-9G8N z;Uz`exaxq?Kq7tTw`nm^r)YkybY-IuBCJ>6X4bjo%nly)qwALNXEk+y5#&|0DmKGN zhuMXTnb4vVeG5)sx9z37AYLJDF?-INu9Dwi6=Q&;F?%As*3NEN0N+{@cD^e#`%u+v&#hs1dhM@~b16Cc5m z;|rH)jvqL1_*6OUI=cFQd#p_~I*-Wyndg7n@w{8~u8`T=DW-g83ttF_d6-1gA*=pG z=u?yBBd2iGixU%Eauujow@YfzLvxuFEM`Pea)IfbG9o5Edw2r<7k)(iKv&$A53Vaf zX+87EByt~ha}}Jteen4cB~tf%GgRTo(hFndb_g9li6N$)d)udfedV19Dy@?15=4Xh zW3O3tGA_`t2iJ2$h!;!01f8ukBhYxpt}Ex-FglOa_}cHISVg=PhYYK4Z+){ei?|jkSps5Yt4%u-SZcBgfw~%e`ql#%E4l|$HuO^XQq?B z8|3*%=CoMAAh9if(J*lKsVYiL0Mcl3!t`z@EBo;%t*MTSl}PkVs}5Y8N)RQ<&eH>$ zKTbXjYD6+AcvAhfko$rQoEuPIHuD&u7N2@h+O%V522^#})?>j1F$^()Npf;4-f}j$ zc|G|>UM>`CR5raoIc{bl_0<>A2{Z_wB+H2<<<*MZF_)o#GA=(2o%78W#hw?R$J#;E z!m?N;b4!g|s9H(2PYcg_9Ts9 zXabPy&(4SGR`pOFFn;4{Ck<}WRKvdPx+6e!Zm+MNN`Xl30V&51{fgnjyGeqK3{JGq z*Wm_qFF-I}f$(@mhbTV{5NJ*Cw|0P>aAWf{sCH+6yPZhXPBRO=Z8;8p zG6(60N`D-ky3A01yHJEdxVLi{@)ay5S{unot}n)9;S}C(&)TmL)T`|z0N)+p4EFqEy zY{eFC;BLPJUKN2yP4xUz6`E+A1;5b277{v8Z#pfXyL?8nwZu#*0pEvBp~SjQ@e0ng zhnCHQ4N+%vDlb>1&zsyht|aScJ+}PoOvXQd_lULewps9Sv28m0F&c?|QU0H?<6gLx z9bkg3Q0G&dzT<$4EEXsa?n&_kQ<14*<1D6MYtGOD9!#b7TT(l#F6uS>oaFsfu#5xq zTrI^;SN;wPlWu+P`&)D+aSE>R;)K5AC-0lnBwBk%pfQ3~!#6k3-#Gcn2SU!j*16?> z-v<4!ZaR3yR*H?ls$T5##b7;gGNlFoq-<8YLDxcP2rhH6v1#0I7!b<-X?GowH0I%u zeZ>aKImqb#hlr#>pW0@$m4dD0XBPkC!9u-Y!feW6Ft#tmR4BC)`)x;oXc%h!|2TeB)#1 zs2l~>>F>%ohP)n=c}}=g;(LrR!(V0^oJ>FWV9@eo$UXq)AaxezMvj+yh5i?6tV~vu z5iJyx`8X5D~LsB)%&}nJ4+()8S64LgZTA*#Q8cVpePw%2!OZjGmnj10FgRb$3~(RQkK&ka+LCnp73 z-1xRpc~mu5+dX%iZBj&g({R7D{7rp4ZD3%m+vDcnPk+CQ@3vBkQrSID^TcMGWm)t@ z3#3`}dn~iY4A@DdsyE!Y5PLU_m!4AvkY$@>aM3b>h89IpFsl^V22Ka^AIw5=iVGaSwmoZsuW7Q-OV_+nUc{BFT3l%a?k0! zYMK|OH1*d_qEX-2BW*Hc({PKW{REvtvI#60&sE)$9=Bbfhk9-%fBv-0bnbTC@@B+U2rnaK{7dDB?VN+!Ptv77p%>xp2$c3hkO_hfJ;d zUZ3%Lu4wtCiW>6`yJWH@h^vQ7Qz7Mr$b06h2OfT|*v_EYwIM6ZwJ4=GGg$3Xe?M23 zq5f~k$Z~Xl*vxUWuYu@_e_&0#>!u;UE9oM(eD6sL)?B`E?@1Ez5r>g`&*UVAJA-M= zZlvpn-q`UkIKhouc#SQth#k5e&|5RW-D??x;}HF?t`*RPWju7~)k#r0jjenl%Y`go z8G6Vg5>aM_<9xo3BW@4{qw?_g(i2RGfZmE&s3e>`)_r~^T6ce!tbazfUTz8 z*)#0AYfDJymTbC_TWpn|QtFZ#xO-daNglc*+e3AwLY3VHsEux`5wlzvd zKf`6w!;zzIcfF~|fDBU>hL3a4=G^r!+`b|Uq^Wnf zm9O0GtjOt7fcSf?Vv3nOm46&Zz;ADL3w8)XZ>-F!0ZZGzSmVI0VlL6)se$zf;-zJD z1_IYZzpRdQt&Wr~x$;bIIm!(*B2bzte_paDhd^(`3DGL-zwR{7G%2FhM zdE%_=VY;2Q6(%BGLl8=(_yNm#2-+&8qkE?wih0P#ia<{GHy}0Uzz5sPOhO8iEFJXR zfz1GCkxmO189OG>D*ka+Z8>W@%8L{;H$mz`!_+4|AzNR~=oJ$=w3EWW+kqZnFbMh< zMN$CD9-aB}0Iqy}3%qgFY&f=+OStbfQvIe9HuaYLD5oogxmxkG+D*lL-mXy zAXCxye4thqZCi7@G$ZIMqkGc zH@Bn5f{j+CkcD2J0mgUNhNGu0Y)sUI;OGpxjQS16p`+m*!3hV;el^8=4X|-g(gkJr z3$EVDDr{r~ZvUo0>R??LDKpQ45%(YrVNt+9;3=oP`oG|YP!qq=`T&C9f7ryAj6dSscgg`h#r~XqV-J!Do4vi7%fTXeMSgb>Cf|Ur)sy zLu~O_98CReU4iN`xl2}3yvBwb7IY zVul9|xqMQ8<|11KJ2Y+QYS`e?6Skb`rbQC9HWtHw`()@HlZs=Rq}*c%Bq<|O(J~Rx zied(6gd#q5=RTwJY+2i>g8?Od_=(>j_=XKULDbxOZB_2C73>#}4;h2QWNP^Y{EQDj z{^T))#Y*iV_%mLdW8T8U#~QV^uLJn~*tJ`HzG{4b7c{PnR885%p80;R+Y0M%D1>7p z)7f31!L@T3ooeUMq3qwk>td1URY8CwYE~u|eWMOHF)(Skaybfnu&E)GG(rNLc?$$+ z0yhH@0c4v zB>j(njU`^MAMd|>2xkFFUQ9McclhL9cS)JTLaRr`^tlc7I(=?~9#z^-wbKBSR<(e^ zW&Bg(-DA@U;r#d7hz7S2SkhSj3p}IDs z`=0Bn#2yE!WbD4=+{r8hlY&F0So^RjSm4mRU!LCm0h!Yr+LIA26O-#i6$3LeGLs=4 zD1Vh$O>^V85xvi^&?Qw=m5m`lf&}+A$&M?VO17pZ&hBA12aZTdtffSTq%1qXKCjW> zmkjSZK3E_K0{!{=HU9kg;p0ObZ8DK1D%m{lH!_MunwU+ZQ=uZgc`P=+1V3I*+eii9 zw)gm7cK9(-@UYEv&~&GK*#7(RZyz62xPREjBtn^V6Y}?u#}eO!D%kUSj3teE^1M|h zzzO(|6Y#(6dVce3sKe{A+R>{cPgOmC-Is%#IP>p-GprnIbuwku2;Wj9PDzmjirmxZ zn|q}rkx0F{mr`Wf8NjckiiDZ>zEg!KKZ#It0lZK4cfdehoKbM zCeowBl7+*P;AyLqAg?d()h<8tfX++U#2fKzNiY1XOxOXluaShb}#{)GVDEu zj--fWGA`{0tUWkM|5^>RCa+I{JAbuEWwchmD~C&W_8p{!%;NE&-$<2`bcy01-w!rm zq9`bfYJdd%z!t;+o`j>itqk0|I2am!mA7sEvPI4apNL5)WGEpa=9H803)v#?2Dp~8 zEe>`~O|ED;_xelQ+8Ay+UtmfYOsA{#<8#$2HAIxEaZR^Hn3a9mJ(c}SKYx^`9Zk@o zy+6GZ7lR_qkO2@}N<|dZuhor>NTbQb`Kf!VdQp`7{8A6TqwZA#@0-kdFyZeI zti7}GX#Y#k{)vO4+*O5}J#tF&i_;vPkuz!Uyx8zuXH8)B;fa0MoK}vGm#Gr#;PZ3K z@!wU9AmI&kl=e)DQkelHhJPcEcsm-D-KjcTKhsmgzeUOOZc)xZeLhtE{)Gb!&mKUz zqqsmGbuYX`h3k#`0bwP4l0F_SxB?Ncv|-czW*=#5XEeNGENQ*9t*CH-(vfHxR^TO#1XHzlMrbKIc_pxRpp4ct(V6hqHt4zU{7zCw{IVRZI>Sc0R&+0i!MaE@ao$-;h^ zb!G5U_O59Cuph;$oTN@J{+6|1^N=|bA(dG>?A#C!kUFpl@_$U(!S(0PW7Aj*lVyJ# zl#x)Goaszm^AQM78YBcA=K{gS)02wyYT^c@Vv@;4%~{d0REi`u?>DnSZJZ0u?7a;F zGZdMTYb-eC{S8>}o7#cVRI$MyE;|qa2MrvUSlYBh)tuc1L_ICF#Q0F2%Pz0K^O#m4 z?$fytq6jv&l7G^c+5}IQF1=O@C0{Mo(sInMc!ftM6&Vb8ub`uJ*)<_$YLHD|+>-|w zt8+#Cp+IGND#>Xo4B@qNUkxw6v%cTu6p32tFo=EY&X?1-vKyJ9UH7L{=)Jf4<#4!dQt!O{{PgLLArrU{({^>{~{! zT}9bC3V*@*2qFG+Ar6Legp%f1g&`7Wn+zUB+ogkN9Dfv93$Em|-;E4dCg#P0zp8xNYmc$-D8*nSZ%AgBaAZ@zjXs zGzK1c0@pQk$?PqDbf~Kq6@=P4sxLG-eKxC%w}0dwRDdV4D<^v5>}+N`FS?HvfC2Tx z8IdWsZ6`41x5wRDgxO4SmK`p!j4c_HU6>gm)A+`P+}Bdoa6B)TX2vv{oofldbgNSC zIB76DlQ|O(ep!9%?>Ip$(oDav<5VJE#I)-;Uz-p7BgxiR03*!!S{b8}yy@#++}oXL zlYgu?W>k8;uZCV`swPEA!C@N*JtiIo48Sz9j8MmKbj%sr^7-cGdyeVQfCm$WrqR## zq63z@`d}&~B9+d9+kS^)ygOXRUTDnmRNFT4rV7Ei1eLE_8-79Jt2hf#SIWBgImLiL z>iN2WYJ_cOpGzObAa)dHo_MCi902k|(SPMLlOPeAy^rIB8U%ZS&`Wi-snon7G z=m@;&2);{cD59U4E`nVBM9Dh_HJJ^7o88>#ER!aR8TCEQH@JT^QM|{m?B zr0tv4UuPnn`y62N&f7hKjV300Py0z7#iDs3k!?>wg9|X+b`w@HGiwMjc`)HMJ-DRq zUR-#FXa&=o29xYNc00x~Z5pS+IDhAQHF)WHSC$2j=}xC-Goo=y5N03?)_=em`QkQt zx)V#3+t;~8t1S47i+so25?eu5=BxQ8i@Gla4gl2M-Yxd-y6Mucw-&@Y7;{?cy-k!c z8p^q8eMjGp3Y_W{7E#D5kpk{+uEQp2@@_|neB|dgAKYl~1xAyB56l1SDnZTuu3j~u z@pw;wSp;_3k>$Vh^@}o9A|gYlziJZ1$3GT9f+gc=PFE)oFXGjkDark=m?CK_p7P*%vL9$qF79xtgAjlUO5jga!qCgo5KgnwvhF)~86>GwUQgffn%!ncE*ep;*sZrPSu{BRqVA^tqTSjWMocRX;qj`A6byC?v=5@ zgAgQM3Vxl$kR#`RF2htf)}SCogCIJ$$PAo&H%=f3d)3q0dX3Wecy?Fs8$}<$no?=- z#dDW&oI7tfBxkl&PZWp8N|zK&#h=>F5MMo1y?HTnk)epZI5`dBOw^VvcjD!ts%zLD zg0$}y5xtRZDRoIJ3IjN8Xbn!sNfO$5B`B-Pm9q-pbOa&u_jmf z;2o`s3S|`=&{BMN#a$YKf&DWV5s9!eX=`jGV?^sm&3q zI;8Nh(;eP7>)F&oV$;7)Nl2ur+Mng|!%h~JIS#w|(cEs0e7F?NlbPIt%*r7S zC%(V$jCu)Lp>S^8EOe+klC$baAFJa9th4c=&yrk3spscomjCL4W>1i> zDs{Ei5{n;C-{`KPb3Z|zL&=uJ|D~<&?TzccGHBs{k+H!So}Z;>fkAy~M3CyO&p2hr?lctL1K66}{JU;5=3CuljCd4pOVD`>x)Nw{doLljKOp zPLnu)Pk9|eYf9q5>#alt0dLqR)zZ?a-dLZ2o<#YixrCnZCpnWRm^0W}WP!hPxf6xZ z3q~EAte6uWp9=k?$16KG8%Av6&JV@e~k#fK;lR-H7RgxUu{?q_oLkLFPNH%wD(O!zxW< zr`xHPzgRPnXe73MqyUM_?l91h29_GTH!e0+&1&YjV+t>A*{Z{?Hsk%A?G+A_8WA%Nf0k1mCP8k zk!zx!dzOsS;3P&3Tuika+#jX!0G1d+*Q=e>P*BrA_Fs;M9Q}RnE|c&y3bGykt411I z*Y@;IPql^+1=mD(ZGHT@JZUyWygR;sLqBii`mY}@^F&TU0TGym2cK~v8*m|ITv)kz z1kWTFI_tLOnuqPL0g|e^pTR*!ixFT_PvBOu?+_SjS=S18$)LL+CRzJJ#Sa!Akn`!|J5ajjt#k+7wP|?Vxp;?>d8MiWu#;HOn>+FY zj3c&xr8lx*76%z98&3GYa1VHYe=B50e)!nEkp1@R!&C=mDRj!}VfNEEat4Kl+nYgz zYiZ;s1!+;(K_*PtFr;iR4RMU9iE(NnOYy5dh6g}f*269(?92P9&oG4;=5O#aI<&SS zt@&r<|CyCeg6++hSrB_!o;=oBz;$-5cuIkX@HJYg;kgMFW*;-a!@z%kvCCgu-(mC} zUa^2|%pjab#xUa`*S3D(X(h{ZMW~uP;vu#X@32LCkcYvoY}Mh)J_q1?0UH_K+rBh` z2Pk?w9QPDdTw>+dJau758ZIH@p*&iuWT}VuIeZv~Zji94i-dI=zDQbP!P*B3us-i; z7c<#H(71{UEv;`{A%yd8N^5C_xRyx<8+gTXk|zW*{KQLwew=y`+rbsz`HeI$1C#~u zNKLW~oMCQA?d%JTnXp8hJW_y>2L20XDC~al5C5;Si|9PNY3M% zp3?;>GsBLUNEf3qnk8xZUfuEBp;0Z9$9mX-LSBBgHuG39+^b%?lh0PqigY>{L&?v|xvBAb(mlMyv8f65I6#RBE`~ z!ue4S#DwrZ1aWY)4#UuU^%_+Q=_#XWu22Q;zSAX0g+3~Jc_V`rX^PObpf^hWEXzo5 z=x5-lFp9mmAA&F`YTXuio;3D;=?2}iiuf`(q@T+Kj+gl&CoLbMFd)fU7$FtHj#lPo zoe68|D9!C%!GB8qK*IwKP1TvbY70%=uHxOJ%iV+6mwD{8s=fJC_X~RqxU!H=42@=8 zfqF5f@O!6QZP4R5IAXl+T;Q^VDhh~~y1k4svQ66|jcR+)mtjji`NPQXQ zbI+A(P|kC9Ir+>+7%-d8-o3Dq2V>4Mpz5|C*y|E)VSkxMHz#`@9CR)FpN2i?0#!$1 zw(c$iF)=+1t1h~>h0LtG)?aY&hWxe(;Ty$|_wbK!90^e^-n<~9*Nx48q!qKqt$t2~lL#o$9Pn697 z%W_`m!BcS%dMrA*253S%%upP0!a9xUSIx>Ww-BmnWD!#)86aUbEFsyx8+!{^fOz9D zbS zFn|2v5Ko__3>FqCVWepC&|sY<{Ih&QUqq$=%lZA94F|IQXag?e=tUMu^F9{h4^*C~ z=~(eG=nkum1bhkOd9Y&`GU7tpQVh0l0;g0IC;}=6dSNugKERoqj(yAJ;wioI&em24 zLbops4xD8)QuJ{aK>BO}!T>uR2b)T5(SM*(;%)YorBZLx>f@mqxJcsMY%jpw7H?>2 z+pK_pS!d1siZb&WIiO=37V+PYv*g=R75Vag%b%un6rtK$D8<9@*m*) zx!l8Gr=})V6GzbptVKjwV}Nw#M8hpWSV^SqiUyxb)a{PfcMVTtf70m7JujCL&3`d^ zWze?c=mo)?U@sttwi`rAia|R^JFd>b9>b@(@}XBp>$O zo=H6vJ{1os;~6lDOJJ1Vh>b-3anw(Ya1g8#qdVp3mRAuSb2WqssCkB1rA8;UwtB+E z9?gP$Tey*-9*9AYi)KXo;g|&FS%0TF?{lo%lA6Ey>xTn(%0Q7uXsDD8mEsem?}+Lx zj5e-qELZ@yTPTx34lhJ!i$8m97VHJx&jpYhRo1)}6@I2?ML!ku!yXJh*uH!ac<0D) z^2)2jp*bxa1@_2nVV@hkuoL`0t@M z1GQPGeXUYLtL4N7E@~Jr*c;Ge@czzpqiy^IKS!nQ28KZ!TS}!ZPfcfdU1hpGahEL~ zL4SH~w*2>{uGH8JOXrJYUnKeY5r*L8Q?(R<@CCNWm;Si5Jrp-O1khz&F*?9$dhJ@J zvb+M5s%!Z9Gd+)*y1jU9Eq{bgmfNkra1$vnUFU?Mje{Oi(30nM1#6&%28jLP-OulS zUqV^(-gmE6!LIloE*1uXw{3v+l@<67vE*St!_dF!P>1_oBMF3C2?8;wlIfW?2 z+eLaIpZqrcedD0!2n`MYUu0aHNO@>u+^{k#DqXMJ>0cdq^1%L(`hfoMSd{$23~}z+ z+uLXV0;9hMQVL~mWRn#w50ipi6a+FeH#d_Z9VmabSWA=Kwh_MTS8VBGPL+lt9(?&` zM@f|um#vC7j;f*@uq0*%5lKuyav#Z`Pd6GMXB2L%q&Alsu+eBV`tfxG-`~D^`#YK4 zFqYPN&TnoHH%y4MEUKF#FHwuvUU*3|tz~huXH_byngo5~Ajq@w?1B|X>?R|g+mi;_b(su1UL|vn zzjwPm{AxGSj2Y;EBGw}Lu;XQ-Iz3HcZKDR7Ia(svPZ<+etIEWg;|Zlt^r_opn1y^* zP@KWmEeyd1cXxM(!6CRi1a}S2;4(-cxCeJvQ zUrAbth*&+$%4##TSeCj2`6}ups=nrqCh(>1hmB7{%Dx%^&;%Zv6z4dPS0cQyJr;WoK-U z59GU!v&}eD#C5m>H}JQe+mP19dXaml@!)8_N zn1`_sRdcTek-5%QwWh(MIQo+GqIBWjL3eYmEL)%Xs@}RpT^NgrBmCz#zw@9g@iSI< zt+vcs#Vw6P$luug4hhC%m1U~s{NyuCj;kAv+Haj5zM#s^_j|Oa;rFLO>8stoH$U0< zoL3pYFO*d6mDs~6I8F5N_E@@Ekrr{ilDaYHz7Ig@QT;d zg|Mc3AqKXouxzHVthNcZHpLj_5vP9a2W!A@KDdpX74zk3O#^=|df#i=h>DidisG?y zTC4#be28w%xvzf#^8$-z=5GZ6(ImP;ZSQ$q#B}NeS^N#UvN)Vpa!V0DZxlH_2a3$F zD@DnSww8A{;s=X%FSspC1j&X&X4(ckwAk(hWg}^bE_?R1$FM@Y3|f1}kCQHmK54w+ zrUN8B$+>!`GBt%>Qb2zMjaZVxM|!B-!o)o)Hv}{ITVGUFP0fkSUCuFjPIGPVgfg#T z0r>y{idmivd+~iQ-WP>M4Cg5Pl*kuvcRNQzF1IPM})w4@1)%~BeK=` ztHUvu5zl?jztdoPp}dBh7tUlhrZPFL9tYSMHN8ka#g<#aCe4ychg|1X%KVxo+EtL8 z0wGh(-SUmm|&-6`ezg3#l9y zgYhLAMF)Yh@wxG^4B|pa?WL^TLWRiS|3wlMeikfV15mH>Wf zUd|3v$f@s6Gj(YyhQ1~P&tIeh7gyc|NND>n9CkaI}+HA zb^D6%d$XA)StK|A^WBcy?PAa0@zr&OlSCHXis3J2JNo=Nlur;Mr*Kmp!f+}o7PyW^ z#B^LfhIGu%Cbh{(eAA#Oo+lQ5P! zg$8D)N&P*L`&ZHVW1;2zx@(fVfRh|_gC{YzoexBZBQMXZH9xodo`{0&rr7?gKJfFr zsSo(@LYdM702YW^0uNR=H+H0N2&`O3wDso4mb3vaIw$6q9XYziQ26NfzYbEQ%FLdi zpMm+hx5>CRnZn%T6mQdb;{%JG*r+z)aT4MkznVyMbEJ$YT&>qRa(M~G{pt@4W;o5+7v<-ya}41Emq*;a~`Es!R0D9 zal1C+e37Gfp~PmY5jrYE9=Ea|jv~GE8KPk^9x8Cip(k#Lm4P4ia zunCLA9CwPo2hx$>JmN=2^d*N|l;J2-+%SY*N)@G3`C+890{_e!(-BujFJ*Z3A9f-MOT;hCYl0B5UG2nSc?Z{W}R~ErH~V@Ohu2DH#Wo6LBDcp!xyi!x9Jz zBRa}O=;S+QsmQ(MIck=h3Dg&2WUdQqu_?M3)8osqGmU`%F*$5XpEzTpn ziB=;5Mm;|{b@|&clutbIZv%!;Q=KAR%i%$QkmTv&P|`pAvn3i*ST11)1DzOiSkc@} z&1mG$`*7?u#IeHeevRY`^f*iKa(R#e#_1BQTFPdm(lQR(C?p=D87!CEf(_3N(P-ThWmNBNt00fN4qX&2^%;rn_62pl3e2r)#l}zQ(u?oR>$WK!TRP$ zS9SBH#A!o)(5b4C<$;VopA*E(JSq5N?0IYX?5sal>)tN?-#87{{=}&hZrZF5`@D*i z#ybbc{9Ip~drWLjZrI!?w4J-g)abWYT(Tx9^x)XBIT|`jsayBo;{OiGy%w0@lJ6aS zSflW={Gh^perfwzon@H{7h|D|C{>DQrK98S7i) z&^f8GCpZebIYZEuOz$&DVt|RA7Ooc=spH?GzA9eq#-@X&zKPkCwl`TGM1Qa!EF(ax zkO=-4RBNNPxz=wNdOZv&mYZ=6>=!k}{mpqOlm1KjG{(wam!j!gLV~o%#aS0V?EKPS zn7N&C4@z#p7j{e-9%0pxr{-EQ>^UkBAb!;+MnTb^A4KpOh!9kXqC|yJWD%Q9yQSW< zu*v;+FZs{&FEfHGo3wBYZ9tHhzkjRt;$q2`wRBPP8Qn>I8ax5Soy$;LdryB}L0@4& z5RKSJ>Wf8)ucoL%@EBX{iNkq;)>Da3U*IUgVL{;Hg*!n$aI3G!?!UlEe? z%r78W=XPIN56zG|+4equ2PG~fj_S&Hb*tn_OtW6&MBJk|uEiW5>dKK|>k~JvdCS0~ zs)uqv1LqyA4gW+4@gVm2iThsaVg4886(V*LcY^CJB~R@2e&On(<_8!4S6ydU=S8I0 zZvmG0&#=$EzAw+mCD3{Zd+hbm8q*W2*}*Td2T5V zX{Nl-U0M_WJ{dXfV&}^j=T*^=3+qdR`SjK?-EIT~fSye%6{`~sKDt)1+-f8&Vsx~r zJJ}kz+Nm{=Ir9rO`gg9_4RbaR{&O>o!+a%DHGzsxsn*J0G)dqXUIupj8=ud zv8cHa;q&`}@TBAx(1U>c5@}oN%j4>$pN&kJ;Dx;v7OFJ~pWAcCo8XGS<_V`?{z1X! zU%pjg-L2nPIl*Y~2zdkRS3L3Exb_2n}bFVFWi9!gEt}r z2=R2-Z^OTk1BCcGZ2!W?%VZ)|0B}1HqyeLI`Ec?Z}<<2Z1^p8*9MU5 zKxzSO0N%c8uH-Fw-}aV-7wjPZ3RpyV<124Ly!KuI8v;D2gM9#S0e~0&Z>)oR7yv{- z;N|AY6dwgZ*adm`dHDHx_;@(D`I)%6nOJ~aYHl{NmS9_IW?2zlZe9WI{|m`H90eo^ z2vc)YyIDB_#l(PIy8iCA)La@?PC8&0AeTC|ARmxR-qF(wOfA4K2;@?=b+rdOQ1kJE z-nti9AZJF#UU*};AuA25W11{tqM7+BdaQcHds5+H7U%d_LuStTtEnkAfXCZ|lY+IS zQ>T?8sr*Wr;QiDa|l_hR&<8dPDaRx=&a61 ztga1_B2LT@2{Jo7ne3GD;%R7b`{{r zE*c8bz&aX$>E4U16RImBPVoij`1>J~KTT=;q-l$&wm8Z%6o&5%-=jt{sYVG%OG`UI zu<@%xrDogn;BqaBsNB(!e#7l)N())wvU3X*c_|ZVN_K`a9f}PY6h#aGjz5L^H}|sF z!IvE>)+%1bYlrpdu}Yz(tEjmGTdnvaFlk>kn)ooFZI za0`aWC7M0md5f89ESTKXPy%;0_gxSng)jfECI7;CpG=D9A)MX6cfwH)6lpVx64yCY zE@9}nmE4*SVE9$Q4&A=Pe(2h0L2*t4Ve@+?(T1_?1<`$>H9C82CDIx*Q@2G|O5pgD zrE<}=yqs7bpgBLggAyIxm zjU?E+kDTIH6SIkDc}gdAs)y>Qfxi_h=*pg=nML2)1sY{@a%~Cu357cKkOZeaO&0fG z+U0!;dR%p+SHNI2pBW;TPyV^_$9$m90*dsEwQMm$jObRzw?dyfk z{R2G!V+va_QJ#&^kfU+fyKr*^N~RC{S)qY_Rkam-5~ zZSi)GC{-^8_=4%(!^VQJ+Hvl&6lw5}E03wuR?ti*&wN0R^%lK&lpWAG!(0xO@@xI< zNX)a<8U5^@7v;l;EBWQ`J!35th0uif{aC091q(kFF@;6|Sh1ZHBl<67wVg*A$IgH0 znzCTOEM5y&tTV?^;CD^R@<-Hf=$z}yd}XPYdxBbiGe(^!`3ykV4;TgOM7B(G1*oO@ z?D|#JTDh5}UCXKuS`+;t-6yT$=R9M!A=&+;<8C}(5WO;HjRT)D#R&*)1bbhH>Zmn| zk_P=@pKa!qCT&EU4)Oyc?cr*LRZc<6&_R=&7c{E8#WF0Qz|g@mll*c)x8Dk$i@Pu;4}lhou>lpF$uK0a_jTvD?fM+vues~6`% zKaMq@A4lIv?{%lbVZolm`^g1eLA++(#>g$N-d$D;P8Ag*Bl-(PKv+bRa&W`ZgO)28 z)Ci6wtw4(})~hBnJ`w6G3HIdojAI?{$cYWvwU3{l?&n{>3@8$uk!|2MS0P(blM5hr zf7mboW+cme_f-xO&(g!_U~5Ty8*iW9SIWTh4cSeU-;H2QsLf;45$Xg!p|O8}4jxqi zsfQY}fm|5-f3*23cXJU7ev_swm-f6(hp}}vvMx+AvIgu7uqlgHh5sSmICGJwA3coK zbqE9wW;F02f7k026;J9_?cvZfSs?fMk=E7JZy0wxD)H9uNG|iz#cSfO^-)uOPT)O! zp}q<$qqSsxhz8lOeV2`?L%)aW1ipPKyE-;=3ib~AuL&*YQg;UGMsUeutV4X7 z5`Z8Hq@c@r5s*5$QH}NK&>|hI>-V{psRLfrAU}IjdoG`@Y4f{%iH(j?$m8k_!F>3i zS^6!|cLH6=&?t-g^>pr(P0pxW6Sp9lvQePYCkr;2GZ2Sm@YdW*!!X(Ba*kC9&EIppa_a)PdP)e{FkQ_A)1$$+ul8< zF&s;Q@J7Z@M@gLNxgqa{Y&+q1qR$a772?>7y9QI&LJw+@57~D>h47;u-1dc{n(b1q zgTy{zm%lbw+|0-Uqov5!VNgBb;`~FyKo!I-{8A8R|8Bk-U4g@k91A;FgLl!+CEZ)f z(2Jc1j^dl3gIOisU3un2T8K-QM;JnS3e5PK#9;fd0pWidf%DxsA`sJM zudVbzkE#9Qq}{z+E7QWhev5EBY)3!*?#+uW9`g^qaWz!^kJlIX2tK!pT~fh=N3?$b zti?J;tG3iN^-|P5`b36%ZrazxGAAMJDQDCxi)5^JP#N^k8P{Glr4+(2JG=DP zqYC%QNZm{HSF8O!)tRIityE#cmiYjlLhn2#$`5pP7E$;4#z-BO+u)8Bx6=C+w!Ut4 zyO!J2-PYH>kF{U>o1KoG4K-*yo}Wq{Hand{f*&bE3i7}82jt_>)~PIr-(lP@-@f3J z<*{enCY*0^R7*l0p66-`ldvF#l*QyE9-v^H*i;O?hGH&Y+xkOK8tr64|5Q`DSz^V_ z{YvNBim5RY?tSm$#4cD+a@ec|i^^#`K)WHfLwlWmXS4lm_3zW)oX`9*#OsCiPDX1X zb;nXLbHX&>u6w&lozhzP(9=#UiROp?y!`s_1}`rB3lhd+h2M)947nkx4Q}&Q|48Q- zP$s$>QjQ$x`4Xlxs?O*xnQHntSBTP;0LPt2YUb zm%@W1oy}?Z&Rd*}X?nZg_j=Yf%<6wQNoJ!Du9yv-nmz}5pFj&FT-mBvbXuQgixP^$ zvg&;dD$U7m34X*n<{v>yJ%f>6Y<*WM%_nYd*DxIgaz5X*%e(p}Je5nCm)2!1Z)UY; z%l~SZe>ESuS$0`kaTGQFn9EkqSFTFy>WcrmHj|Nqfci3VQ){+!Y-FOd#5d@tU2c;(%ODE)u zfzXJ=8soyNox{(um6JDKRkL488!6ylbtEJr5X6V?E(f)O<(DWCDD92h*cd`sorNm0 zczSulnv{lQ;vFxlUVAw6NRzeOv=^(=f3sS$M0AbIE9>afvtZccTXzUAQ1QkrpnHyr zPr=U+b~=%F{$_^AviL(CTVp7loRSVp)}h^B9E%0_G;_(1o#31n-n)zz3)(Wm(4}0A zs@kZ&(7JHKoK@yHPP@$QCX=^9c6O8_)x2ny-Yi|ZlBdLZ`|4t-{HM30Gf zMgVniPjQM#{~mpq&ZwACY~L5aVq`fvn%^wqF3`Mq~V zxcT)FU9s$ZmN}>TiXt(%6U`Zy2@Sc^LsQgoZ)Z4#97GEcH{3X9HX4!%9fH*H5XlJHdkuDd$zE^ZP>Ab zZE!|-<2e8tMsO&xI4y z=s@d8%fk@mz<&Cv5g!c#Alv%c`_=Q{wePxjkB9F$b2{~_>6zgCvFc4KIc{z7x-4si zVPi)9XMVEZ14v!2+QRr2bQER4s!!j*J$cX~Qb_w;9n+E&PSjzSVw)y%;Nf!0aWTC7 zp@@=KF%IUOck=JSAdvFd+xC4x89V%7Vf0STJufjqG0qY-ugF-=DXQE(wLZTUJ!ANt zDVZZ;>wsaG{=Bm0Je$#H!qpwSHW9esq_A*Q#5D8_Y*o4}zs3Oz(qfOcy?ocmz^70_ zEeO-WYj$%-K=zd+fv4x!g^4*M$+Z z91-kJjM<6tPumw;eka=4QPvbyeK2eNfx~+*NS90$wQ`fu{A7@X(mj08|I^GNAkV9t zx7c9jT1qqohjY+Y#8oz{Qlqzr$mDoi8-i>g+&MXjh{@@m-o5!yaSwEDsQALV@oJ(2 z1-m^L>;4MqF4H}Gy(rgCcpf7uFM0m1U;abPBu+cOvY4ejK;!-ovw&X!SV-gS@_Blp zKfAhly5)8H=63oTIh)9w*R8;2>vbmRq5h|5L-;y=@PJ{|t3J6WI-EVpld;D*kHDd0 o6i?q)>p$@(r?~(3?0SJMJ;8pSwst@skRUG~ACQ4TPD38}Kcg)A{{R30 delta 24110 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 Date: Sat, 14 Jun 2025 16:26:47 -0400 Subject: [PATCH 15/15] update launcher scripts --- legacy_launchers/launch_amrvis2d_linux.sh | 2 +- legacy_launchers/launch_amrvis2d_macos.sh | 2 +- legacy_launchers/launch_amrvis3d_linux.sh | 2 +- legacy_launchers/launch_amrvis3d_macos.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/legacy_launchers/launch_amrvis2d_linux.sh b/legacy_launchers/launch_amrvis2d_linux.sh index 3b82892..fa2c090 100755 --- a/legacy_launchers/launch_amrvis2d_linux.sh +++ b/legacy_launchers/launch_amrvis2d_linux.sh @@ -5,4 +5,4 @@ MOUNT_DIR=${1:-`pwd`} AMRVIS_EXE=/Amrvis2D/amrvis2d.gnu.ex DOCKER_CMD=singularity -$DOCKER_CMD run --env DISPLAY=$DISPLAY docker://ghcr.io/benwibking/amrvis-container:main $AMRVIS_EXE +$DOCKER_CMD run --env DISPLAY=$DISPLAY docker://ghcr.io/amrex-codes/amrvis-container:main $AMRVIS_EXE diff --git a/legacy_launchers/launch_amrvis2d_macos.sh b/legacy_launchers/launch_amrvis2d_macos.sh index 9280834..075d88e 100755 --- a/legacy_launchers/launch_amrvis2d_macos.sh +++ b/legacy_launchers/launch_amrvis2d_macos.sh @@ -8,7 +8,7 @@ AMRVIS_EXE=/Amrvis2D/amrvis2d.gnu.ex open -a XQuartz xhost +localhost -docker run --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data -e DISPLAY=docker.for.mac.host.internal:$PORT ghcr.io/benwibking/amrvis-container:main $AMRVIS_EXE +docker run --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data -e DISPLAY=docker.for.mac.host.internal:$PORT ghcr.io/amrex-codes/amrvis-container:main $AMRVIS_EXE # If you get an error message like this: # Error: Can't open display: docker.for.mac.host.internal:0 diff --git a/legacy_launchers/launch_amrvis3d_linux.sh b/legacy_launchers/launch_amrvis3d_linux.sh index f5e3fab..9af776c 100755 --- a/legacy_launchers/launch_amrvis3d_linux.sh +++ b/legacy_launchers/launch_amrvis3d_linux.sh @@ -5,4 +5,4 @@ MOUNT_DIR=${1:-`pwd`} AMRVIS_EXE=/Amrvis3D/amrvis3d.gnu.ex DOCKER_CMD=singularity -$DOCKER_CMD run --env DISPLAY=$DISPLAY docker://ghcr.io/benwibking/amrvis-container:main $AMRVIS_EXE +$DOCKER_CMD run --env DISPLAY=$DISPLAY docker://ghcr.io/amrex-codes/amrvis-container:main $AMRVIS_EXE diff --git a/legacy_launchers/launch_amrvis3d_macos.sh b/legacy_launchers/launch_amrvis3d_macos.sh index 85e7833..1225795 100755 --- a/legacy_launchers/launch_amrvis3d_macos.sh +++ b/legacy_launchers/launch_amrvis3d_macos.sh @@ -8,7 +8,7 @@ AMRVIS_EXE=/Amrvis3D/amrvis3d.gnu.ex open -a XQuartz xhost +localhost -docker run --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data -e DISPLAY=docker.for.mac.host.internal:$PORT ghcr.io/benwibking/amrvis-container:main $AMRVIS_EXE +docker run --platform linux/amd64 -v $MOUNT_DIR:/home/vscode/data -e DISPLAY=docker.for.mac.host.internal:$PORT ghcr.io/amrex-codes/amrvis-container:main $AMRVIS_EXE # If you get an error message like this: # Error: Can't open display: docker.for.mac.host.internal:0