From ae857a098a4584229a45eb14300a4f526bc98d67 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Fri, 8 Sep 2023 17:41:40 +0200 Subject: [PATCH 01/16] doc: Add user and developers documentation scheme. --- doc/dev/build.sh | 10 ++++ doc/dev/documentation.bib | 1 + doc/dev/documentation.org | 55 +++++++++++++++++++ doc/images/riverly.png | Bin 0 -> 34738 bytes doc/tools/PamhyrDoc.cls | 102 ++++++++++++++++++++++++++++++++++++ doc/tools/latex.org | 19 +++++++ doc/tools/macro.org | 35 +++++++++++++ doc/tools/ref.bib | 0 doc/tools/setup.el | 30 +++++++++++ doc/users/build.sh | 10 ++++ doc/users/documentation.bib | 1 + doc/users/documentation.org | 20 +++++++ 12 files changed, 283 insertions(+) create mode 100755 doc/dev/build.sh create mode 120000 doc/dev/documentation.bib create mode 100644 doc/dev/documentation.org create mode 100644 doc/images/riverly.png create mode 100644 doc/tools/PamhyrDoc.cls create mode 100644 doc/tools/latex.org create mode 100644 doc/tools/macro.org create mode 100644 doc/tools/ref.bib create mode 100644 doc/tools/setup.el create mode 100755 doc/users/build.sh create mode 120000 doc/users/documentation.bib create mode 100644 doc/users/documentation.org diff --git a/doc/dev/build.sh b/doc/dev/build.sh new file mode 100755 index 00000000..476dd5ad --- /dev/null +++ b/doc/dev/build.sh @@ -0,0 +1,10 @@ +#! /bin/sh + +# Build the PDF + +emacs -Q -q -nw --batch \ + --eval "(require 'org)" \ + --eval "(require 'ox-latex)" \ + --eval "(load-file \"../tools/setup.el\")" \ + --file ./documentation.org \ + -f org-latex-export-to-pdf diff --git a/doc/dev/documentation.bib b/doc/dev/documentation.bib new file mode 120000 index 00000000..8319e149 --- /dev/null +++ b/doc/dev/documentation.bib @@ -0,0 +1 @@ +../tools/ref.bib \ No newline at end of file diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org new file mode 100644 index 00000000..99867b08 --- /dev/null +++ b/doc/dev/documentation.org @@ -0,0 +1,55 @@ +# documentation.org -- Pamhyr developers documentation +# Copyright (C) 2023 INRAE +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# -*- coding: utf-8 -*- + +#+STARTUP: indent + +#+INCLUDE: ../tools/macro.org +#+INCLUDE: ../tools/latex.org + +#+TITLE: Developers documentation +#+SUBTITLE: Version: {{{version}}} +#+AUTHOR: {{{INRAE}}} + +#+OPTIONS: toc:t +#+LANGUAGE: UKenglish + +* TODO The environment +* TODO Architecture +** TODO Model +** TODO Solver +** TODO View +** TODO Unit tests +** TODO The debug mode +* TODO Build the project +** TODO Building packages +*** TODO Linux +*** TODO Windows +* TODO Documentation files +** TODO The environment +** TODO Org-mode +*** TODO Format +*** TODO Macro +*** TODO Footnote +*** TODO References +*** TODO Export +* TODO How to contribute? +** TODO Contribution rules +** TODO Translate +** TODO Code contribution + +{{{biblio}}} diff --git a/doc/images/riverly.png b/doc/images/riverly.png new file mode 100644 index 0000000000000000000000000000000000000000..14a38a2f43f67e0aa88cb5b692dc110c681a9d2d GIT binary patch literal 34738 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. + +# -*- coding: utf-8 -*- + +#+LaTeX_CLASS: PamhyrDoc diff --git a/doc/tools/macro.org b/doc/tools/macro.org new file mode 100644 index 00000000..2f897ae4 --- /dev/null +++ b/doc/tools/macro.org @@ -0,0 +1,35 @@ +# macro.org -- Pamhyr documentation macro +# Copyright (C) 2023 INRAE +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# -*- coding: utf-8 -*- + +# Constant name +#+MACRO: oldPamhyr PAMHyR +#+MACRO: Pamhyr Pamhyr2 +#+MACRO: Mage Mage +#+MACRO: Rubarbe RubarBE +#+MACRO: Inrae INRAE + +# Information +#+MACRO: version (eval (pamhyr-version)) +#+MACRO: current-file (eval (pamhyr-current-file)) + +# Special format +#+MACRO: file =$1= + +# Biblio +#+MACRO: cite \cite{$1} +#+MACRO: biblio \bibliography{documentation} diff --git a/doc/tools/ref.bib b/doc/tools/ref.bib new file mode 100644 index 00000000..e69de29b diff --git a/doc/tools/setup.el b/doc/tools/setup.el new file mode 100644 index 00000000..81335dd3 --- /dev/null +++ b/doc/tools/setup.el @@ -0,0 +1,30 @@ +(require 'org) +(require 'subr-x) + +(add-to-list + 'org-latex-classes + '("PamhyrDoc" + "\\documentclass{../tools/PamhyrDoc}" + ("\\section{%s}" . "\\section*{%s}") + ("\\subsection{%s}" . "\\subsection*{%s}") + ("\\subsubsection{%s}" . "\\subsubsection*{%s}") + ("\\paragraph{%s}" . "\\paragraph*{%s}") + ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) + + +(setq org-latex-pdf-process + '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" + "bibtex documentation" + "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" + "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f")) + + +(defun pamhyr-version () + "Return the contents of the pamhyr version file." + (with-temp-buffer + (insert-file-contents "../../VERSION") + (buffer-string))) + +(defun pamhyr-current-file () + (let ((lst (split-string (buffer-file-name) "/"))) + (string-join (nthcdr (- (length lst) 3) lst) "/"))) diff --git a/doc/users/build.sh b/doc/users/build.sh new file mode 100755 index 00000000..476dd5ad --- /dev/null +++ b/doc/users/build.sh @@ -0,0 +1,10 @@ +#! /bin/sh + +# Build the PDF + +emacs -Q -q -nw --batch \ + --eval "(require 'org)" \ + --eval "(require 'ox-latex)" \ + --eval "(load-file \"../tools/setup.el\")" \ + --file ./documentation.org \ + -f org-latex-export-to-pdf diff --git a/doc/users/documentation.bib b/doc/users/documentation.bib new file mode 120000 index 00000000..8319e149 --- /dev/null +++ b/doc/users/documentation.bib @@ -0,0 +1 @@ +../tools/ref.bib \ No newline at end of file diff --git a/doc/users/documentation.org b/doc/users/documentation.org new file mode 100644 index 00000000..1907bf93 --- /dev/null +++ b/doc/users/documentation.org @@ -0,0 +1,20 @@ +#+STARTUP: indent + +#+INCLUDE: ../tools/macro.org +#+INCLUDE: ../tools/latex.org + +#+TITLE: User documentation +#+SUBTITLE: Version: {{{version}}} +#+AUTHOR: {{{INRAE}}} + +#+OPTIONS: toc:t +#+LANGUAGE: UKenglish + +* TODO Over view +* TODO Get started +** Installation +*** Linux +*** Windows +* TODO Usage + +{{{biblio}}} From f3ec60500dae0ad89e48265ac3d00159954677b4 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Fri, 8 Sep 2023 18:43:42 +0200 Subject: [PATCH 02/16] doc: Update dev doc with some org-mode tips. --- doc/dev/documentation.org | 104 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 100 insertions(+), 4 deletions(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 99867b08..03d3c4b6 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -40,13 +40,109 @@ *** TODO Linux *** TODO Windows * TODO Documentation files -** TODO The environment + +This document and the user documentation are org[fn:org] files. This text file +format is formatted so that it can be exported in different formats: +PDF (with latex), ODT, HTML, etc. It was originally designed for the +GNUEmacs[fn:emacs] text editor, but can be edited with any text editor. Here we +take a look at the different features used in these documents. + +[fn:org] The org-mode website: https://orgmode.org/ +[fn:emacs] The GNUEmacs project website: https://gnu.org/s/emacs/ + ** TODO Org-mode -*** TODO Format -*** TODO Macro +*** Document structure + +Org uses the =*= character to define a new document section. To add a +sub-section, you can add an additional =*= to the current section[fn:: +See document structure documentation: +https://orgmode.org/org.html#Headlines]. + +#+BEGIN_EXAMPLE + * Top level headline + ** Second level + *** Third level + some text + *** Third level + more text + * Another top level headline +#+END_EXAMPLE + +*** Format + +Org-mode is a markup file, using markup in the text to modify the +appearance of a portion of text[fn:: See markup documentation: +https://orgmode.org/org.html#Emphasis-and-Monospace]. + +| Markup | Results | +|--------------------+------------------| +| =*Bolt*= | *Bolt* | +| =/Italic/= | /Italic/ | +| =_underline_= | _underline_ | +| ==verbatim== | =verbatim= | +| =~code~= | ~code~ | +| =+strike-through+= | +strike-through+ | + +*** TODO Code block + +*** Latex + +If we export the file to PDF, org-mode use \LaTeX. So we can add some +piece of \LaTeX into the document[fn:: See \LaTeX part in +documentation: https://orgmode.org/org.html#Embedded-LaTeX]. For +exemple, we can add math formula like =\[E=mc^2\]=: + +\[E=mc^2\] + +But we can also add every type of \LaTeX: + +#+BEGIN_EXAMPLE +# Add latex in line +#+LATEX: + +# Add multiple line of LaTeX +#+BEGIN_EXPORT latex + +#+END_EXPORT +#+END_EXAMPLE + +It is also possible to add specific \LaTeX file header with +=#+LATEX_HEADER=. In this document we use the file +{{{file(doc/tools/latex.org)}}} for all \LaTeX headers. + +*** Macro + +In this document, we use a few macros[fn:: See marcos documentation +https://orgmode.org/org.html#Macro-Replacement] to simplify +writing. They allow you to define sequences of text to be replaced, so +that the macro name is replaced by its value. They are defined in the +{{{file(doc/tools/macro.org)}}} file. Once defined, they can be used +in the document as follows: ={{{}}}=. You can also have +macros with arguments, in this case: +={{{(arg1,...)}}}=. Les macros peuvent aussi utiliser du +code emacs-lisp. + +#+BEGIN_EXAMPLE +# Exemple of macro définition + +#+MACRO: toto tata +#+MACRO: add \(($1 + $2)\) +#+MACRO: emacs-version (eval (nth 2 (split-string (emacs-version)))) +#+END_EXAMPLE + +#+MACRO: toto tata +#+MACRO: add \(($1 + $2)\) +#+MACRO: emacs-version (eval (nth 2 (split-string (emacs-version)))) + +Macro apply: +- Marco ={{{toto}}}=: {{{toto}}} +- Marco ={{{add(x,y)}}}=: {{{add(x,y)}}} +- Marco ={{{emacs-version}}}=: {{{emacs-version}}} + *** TODO Footnote *** TODO References -*** TODO Export + +** TODO Export * TODO How to contribute? ** TODO Contribution rules ** TODO Translate From 187135e62b92e0a19253a5efff9ab1c724979b2c Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 11 Sep 2023 09:31:11 +0200 Subject: [PATCH 03/16] doc: dev: minor change. --- doc/dev/documentation.org | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 03d3c4b6..481e30e5 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -90,7 +90,8 @@ https://orgmode.org/org.html#Emphasis-and-Monospace]. If we export the file to PDF, org-mode use \LaTeX. So we can add some piece of \LaTeX into the document[fn:: See \LaTeX part in documentation: https://orgmode.org/org.html#Embedded-LaTeX]. For -exemple, we can add math formula like =\[E=mc^2\]=: +exemple, we can add math formula like =$E=mc^2$= ($E=mc^2$) or +=\[E=mc^2\]=: \[E=mc^2\] From 445de3b77746f3e32b979641dca6fdfc318d6ff8 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Fri, 15 Sep 2023 15:28:26 +0200 Subject: [PATCH 04/16] doc: dev: Introduction + minor change. --- doc/dev/documentation.org | 49 +++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 481e30e5..846a718e 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -28,7 +28,22 @@ #+OPTIONS: toc:t #+LANGUAGE: UKenglish -* TODO The environment +* TODO Introduction + +Pamhyr2 is free and open source graphical user interface (GUI) for 1D +hydro-sedimentary modelling of rivers developed in Python (with +version 3.8). It use PyQt at version 5 and matplotlib in version 3.4.1 +or later for the user insterface (see {{{file(/requirements.txt)}}} +for details). The architecture of project code follow the Qt +Model/View architecture [fn:qt-arch] (see details in section +[[Architecture]]). Pamhyr2 packages can be build manually (see section +[[Building packages]]), but there are automatically build with the +gitlab-ci (see [[Setup the CI environment]]). + +[fn:qt-arch] Qt Model/View documentation: +https://doc.qt.io/qt-5/model-view-programming.html (last access +2023-09-15) + * TODO Architecture ** TODO Model ** TODO Solver @@ -39,6 +54,7 @@ ** TODO Building packages *** TODO Linux *** TODO Windows +** TODO Setup the CI environment * TODO Documentation files This document and the user documentation are org[fn:org] files. This text file @@ -47,8 +63,10 @@ PDF (with latex), ODT, HTML, etc. It was originally designed for the GNUEmacs[fn:emacs] text editor, but can be edited with any text editor. Here we take a look at the different features used in these documents. -[fn:org] The org-mode website: https://orgmode.org/ +[fn:org] The org-mode website: https://orgmode.org/ (last access +2023-09-15) [fn:emacs] The GNUEmacs project website: https://gnu.org/s/emacs/ +(last access 2023-09-15) ** TODO Org-mode *** Document structure @@ -56,7 +74,7 @@ take a look at the different features used in these documents. Org uses the =*= character to define a new document section. To add a sub-section, you can add an additional =*= to the current section[fn:: See document structure documentation: -https://orgmode.org/org.html#Headlines]. +https://orgmode.org/org.html#Headlines (last access 2023-09-15)]. #+BEGIN_EXAMPLE * Top level headline @@ -72,7 +90,8 @@ https://orgmode.org/org.html#Headlines]. Org-mode is a markup file, using markup in the text to modify the appearance of a portion of text[fn:: See markup documentation: -https://orgmode.org/org.html#Emphasis-and-Monospace]. +https://orgmode.org/org.html#Emphasis-and-Monospace (last access +2023-09-15)]. | Markup | Results | |--------------------+------------------| @@ -89,9 +108,9 @@ https://orgmode.org/org.html#Emphasis-and-Monospace]. If we export the file to PDF, org-mode use \LaTeX. So we can add some piece of \LaTeX into the document[fn:: See \LaTeX part in -documentation: https://orgmode.org/org.html#Embedded-LaTeX]. For -exemple, we can add math formula like =$E=mc^2$= ($E=mc^2$) or -=\[E=mc^2\]=: +documentation: https://orgmode.org/org.html#Embedded-LaTeX (last +access 2023-09-15)]. For exemple, we can add math formula like +=$E=mc^2$= ($E=mc^2$) or =\[E=mc^2\]=: \[E=mc^2\] @@ -114,14 +133,14 @@ It is also possible to add specific \LaTeX file header with *** Macro In this document, we use a few macros[fn:: See marcos documentation -https://orgmode.org/org.html#Macro-Replacement] to simplify -writing. They allow you to define sequences of text to be replaced, so -that the macro name is replaced by its value. They are defined in the -{{{file(doc/tools/macro.org)}}} file. Once defined, they can be used -in the document as follows: ={{{}}}=. You can also have -macros with arguments, in this case: -={{{(arg1,...)}}}=. Les macros peuvent aussi utiliser du -code emacs-lisp. +https://orgmode.org/org.html#Macro-Replacement (last access +2023-09-15)] to simplify writing. They allow you to define sequences +of text to be replaced, so that the macro name is replaced by its +value. They are defined in the {{{file(doc/tools/macro.org)}}} +file. Once defined, they can be used in the document as follows: +={{{}}}=. You can also have macros with arguments, in this +case: ={{{(arg1,...)}}}=. Les macros peuvent aussi +utiliser du code emacs-lisp. #+BEGIN_EXAMPLE # Exemple of macro définition From 100f98c56bd95d6dfa49848fee7230475c6a8520 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Fri, 15 Sep 2023 16:09:10 +0200 Subject: [PATCH 05/16] doc: dev: Finish the documentations files section. --- doc/dev/documentation.org | 96 ++++++++++++++++++++++++++++++++------- doc/tools/latex.org | 15 ++++++ doc/tools/macro.org | 2 +- doc/tools/setup.el | 24 ++++++++++ 4 files changed, 119 insertions(+), 18 deletions(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 846a718e..aaf32969 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -28,21 +28,26 @@ #+OPTIONS: toc:t #+LANGUAGE: UKenglish -* TODO Introduction +* Introduction -Pamhyr2 is free and open source graphical user interface (GUI) for 1D -hydro-sedimentary modelling of rivers developed in Python (with -version 3.8). It use PyQt at version 5 and matplotlib in version 3.4.1 -or later for the user insterface (see {{{file(/requirements.txt)}}} -for details). The architecture of project code follow the Qt -Model/View architecture [fn:qt-arch] (see details in section -[[Architecture]]). Pamhyr2 packages can be build manually (see section -[[Building packages]]), but there are automatically build with the -gitlab-ci (see [[Setup the CI environment]]). +Pamhyr2 is free and open source software (FOSS) graphical user +interface (GUI) for 1D hydro-sedimentary modelling of rivers developed +in Python (with version 3.8). It use PyQt at version 5 and matplotlib +in version 3.4.1 or later for the user insterface (see +{{{file(/requirements.txt)}}} for details). The architecture of +project code follow the Qt Model/View architecture [fn:qt-arch] (see +details in section [[Architecture]]). Pamhyr2 packages can be build +manually (see section [[Building packages]]), but there are automatically +build with the gitlab-ci (see the section [[Setup the CI +environment]]). Documentation files are written with org-mode[fn:org], +let see section [[Documentation files]]. Finally, to see the contribution +rules, see the section [[How to contribute?]]. [fn:qt-arch] Qt Model/View documentation: https://doc.qt.io/qt-5/model-view-programming.html (last access 2023-09-15) +[fn:org] The org-mode website: https://orgmode.org/ (last access +2023-09-15) * TODO Architecture ** TODO Model @@ -55,9 +60,9 @@ https://doc.qt.io/qt-5/model-view-programming.html (last access *** TODO Linux *** TODO Windows ** TODO Setup the CI environment -* TODO Documentation files +* Documentation files -This document and the user documentation are org[fn:org] files. This text file +This document and the user documentation are org files. This text file format is formatted so that it can be exported in different formats: PDF (with latex), ODT, HTML, etc. It was originally designed for the GNUEmacs[fn:emacs] text editor, but can be edited with any text editor. Here we @@ -68,7 +73,7 @@ take a look at the different features used in these documents. [fn:emacs] The GNUEmacs project website: https://gnu.org/s/emacs/ (last access 2023-09-15) -** TODO Org-mode +** Org-mode *** Document structure Org uses the =*= character to define a new document section. To add a @@ -102,7 +107,32 @@ https://orgmode.org/org.html#Emphasis-and-Monospace (last access | =~code~= | ~code~ | | =+strike-through+= | +strike-through+ | -*** TODO Code block +*** Source code blocks + +You can add some code blocks[fn:: See org-mode documentation for +source code: https://orgmode.org/org.html#Working-with-Source-Code +(last access 2023-09-15)] in the document. + +Here is an example for python source code: +#+BEGIN_EXAMPLE +#+begin_src python +import os + +print(f"Document build on system: {os.name}") +#+end_src +#+END_EXAMPLE + +If you use GNUEmacs, it is also possible to run the code inside a +block and export (or not) the reuslts in the document. + +#+begin_src python :python python3 :results output :exports both :noweb yes +import os + +print(f"Document build on system: {os.name}") +#+end_src + +#+RESULTS: +: Document build on system: posix *** Latex @@ -159,10 +189,42 @@ Macro apply: - Marco ={{{add(x,y)}}}=: {{{add(x,y)}}} - Marco ={{{emacs-version}}}=: {{{emacs-version}}} -*** TODO Footnote -*** TODO References +*** Footnotes + +Footnote in org-mode is define with marker =[fn:...]=[fn:: Create +footnotes in org-mode documentation +https://orgmode.org/org.html#Creating-Footnotes (last access +2023-09-15)]: +#+BEGIN_EXAMPLE +The Org website[fn:1] now looks a lot better than it used to. +... +[fn:1] The link is: https://orgmode.org +#+END_EXAMPLE +or: +#+BEGIN_EXAMPLE +The Org website[fn:: The link is: https://orgmode.org] now looks +a lot better than it used to. +... +#+END_EXAMPLE + +*** References + +The references use the \LaTeX bibtex tools. The bib file is in +{{{file(/doc/tools/ref.bib)}}} and use for developers and user +documentation. In document, use ={{{cite()}}}= to cite a paper. + +** Export + +To export the files, a {{{build.sh}}} script is available in the org +files directories. On GNU/Linux system you can build the documentation +PDF file with the command =./build.sh=. Some org-mode configuration +used in documentations files are define in =/doc/tools/=: +- {{{file(PamhyrDoc.cls)}}}: The \LaTeX theme +- {{{file(macro.org)}}}: Available macro +- {{{file(latex.org)}}}: \LaTeX configutation for documentations files +- {{{file(setup.el)}}}: GNUEmacs configuration to build documentations +- {{{file(ref.bib)}}}: Bibtex files for documentations files -** TODO Export * TODO How to contribute? ** TODO Contribution rules ** TODO Translate diff --git a/doc/tools/latex.org b/doc/tools/latex.org index 2e655049..06263f85 100644 --- a/doc/tools/latex.org +++ b/doc/tools/latex.org @@ -17,3 +17,18 @@ # -*- coding: utf-8 -*- #+LaTeX_CLASS: PamhyrDoc + +# Source code blocks +#+LATEX_HEADER: \usepackage{minted} +#+LATEX_HEADER: \usemintedstyle{emacs} +#+LATEX_HEADER: \setminted[c]{fontsize=\footnotesize,encoding=utf8,linenos} +#+LATEX_HEADER: \setminted[c++]{breaklines,fontsize=\footnotesize,encoding=utf8,linenos} +#+LATEX_HEADER: \setminted[shell]{breaklines,fontsize=\footnotesize} +#+LATEX_HEADER: \setminted[python]{breaklines,fontsize=\footnotesize,linenos} +#+LATEX_HEADER: \setminted[scheme]{breaklines,fontsize=\footnotesize} +#+LATEX_HEADER: \setminted[commun-lisp]{breaklines,fontsize=\footnotesize} +#+LATEX_HEADER: \setminted[text]{breaklines,fontsize=\footnotesize} +#+LATEX_HEADER: \setminted[llvm]{breaklines,fontsize=\footnotesize} + +#+LATEX_HEADER: \BeforeBeginEnvironment{minted}{\begin{tcolorbox}[boxsep=0pt, left=0.1cm, right=0.1cm, arc=0pt, boxrule=0.5pt, colback=white]}% +#+LATEX_HEADER: \AfterEndEnvironment{minted}{\end{tcolorbox}}% diff --git a/doc/tools/macro.org b/doc/tools/macro.org index 2f897ae4..fb760c9f 100644 --- a/doc/tools/macro.org +++ b/doc/tools/macro.org @@ -31,5 +31,5 @@ #+MACRO: file =$1= # Biblio -#+MACRO: cite \cite{$1} +#+MACRO: cite [cite:$1] #+MACRO: biblio \bibliography{documentation} diff --git a/doc/tools/setup.el b/doc/tools/setup.el index 81335dd3..54a3517b 100644 --- a/doc/tools/setup.el +++ b/doc/tools/setup.el @@ -1,6 +1,8 @@ (require 'org) (require 'subr-x) +;; LaTeX config + (add-to-list 'org-latex-classes '("PamhyrDoc" @@ -11,6 +13,12 @@ ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}"))) +(setq org-confirm-babel-evaluate nil) +(setq org-latex-caption-above nil) + +(add-to-list 'org-latex-packages-alist '("" "minted")) +(setq org-latex-listings 'minted) +(setq org-src-fontify-natively t) (setq org-latex-pdf-process '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" @@ -18,6 +26,22 @@ "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f" "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f")) +;; Citations + +(org-add-link-type + "cite" 'ebib + (lambda (path desc format) + (cond + ((eq format 'html) + (format "(%s)" path)) + ((eq format 'latex) + (if (or (not desc) (equal 0 (search "cite:" desc))) + (format "\\cite{%s}" path) + (format "\\cite[%s][%s]{%s}" + (cadr (split-string desc ";")) + (car (split-string desc ";")) path)))))) + +;; Functools (defun pamhyr-version () "Return the contents of the pamhyr version file." From d772a44c67f7a6b9c4326d8e5f59021aafced2d0 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Fri, 15 Sep 2023 16:19:46 +0200 Subject: [PATCH 06/16] doc: tools, dev: Add caption and box for verbatim. --- doc/dev/documentation.org | 2 ++ doc/tools/latex.org | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index aaf32969..f73be591 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -115,6 +115,7 @@ source code: https://orgmode.org/org.html#Working-with-Source-Code Here is an example for python source code: #+BEGIN_EXAMPLE +#+CAPTION: Get os type name in Python code #+begin_src python import os @@ -125,6 +126,7 @@ print(f"Document build on system: {os.name}") If you use GNUEmacs, it is also possible to run the code inside a block and export (or not) the reuslts in the document. +#+CAPTION: Get os type name in Python code #+begin_src python :python python3 :results output :exports both :noweb yes import os diff --git a/doc/tools/latex.org b/doc/tools/latex.org index 06263f85..32c47e23 100644 --- a/doc/tools/latex.org +++ b/doc/tools/latex.org @@ -32,3 +32,20 @@ #+LATEX_HEADER: \BeforeBeginEnvironment{minted}{\begin{tcolorbox}[boxsep=0pt, left=0.1cm, right=0.1cm, arc=0pt, boxrule=0.5pt, colback=white]}% #+LATEX_HEADER: \AfterEndEnvironment{minted}{\end{tcolorbox}}% + +#+LATEX_HEADER: \makeatletter +#+LATEX_HEADER: \AtBeginEnvironment{minted}{\dontdofcolorbox} + +#+LATEX_HEADER: \def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}} +#+LATEX_HEADER: \makeatother + +#+LATEX_HEADER: \BeforeBeginEnvironment{verbatim}{\begin{tcolorbox}[boxsep=0pt, left=0.1cm, right=0.1cm, arc=0pt, boxrule=0.5pt, colback=white]}% +#+LATEX_HEADER: \AfterEndEnvironment{verbatim}{\end{tcolorbox}}% + +#+LATEX_HEADER: \makeatletter +#+LATEX_HEADER: \AtBeginEnvironment{verbatim}{\dontdofcolorbox} + +#+LATEX_HEADER: \def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}} +#+LATEX_HEADER: \makeatother + +#+LATEX_HEADER: \verbatimfont{\footnotesize} From 9f9dd508b169f716a6eb61294f8d7824503457d4 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Fri, 15 Sep 2023 16:24:26 +0200 Subject: [PATCH 07/16] doc: dev: Add install command for texlive. --- doc/dev/documentation.org | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index f73be591..f2b27fed 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -219,8 +219,17 @@ documentation. In document, use ={{{cite()}}}= to cite a paper. To export the files, a {{{build.sh}}} script is available in the org files directories. On GNU/Linux system you can build the documentation -PDF file with the command =./build.sh=. Some org-mode configuration -used in documentations files are define in =/doc/tools/=: +PDF file with the command =./build.sh=. Texlive package must be +installed, you can install only needed packages or all texlive +packages, for example on Debian (and some derived system): + +#+CAPTION: Installation command for texlive full on Debian system +#+begin_src shell +sudo apt install texlive-full +#+end_src + + Some org-mode configuration used in documentations files are define +in =/doc/tools/=: - {{{file(PamhyrDoc.cls)}}}: The \LaTeX theme - {{{file(macro.org)}}}: Available macro - {{{file(latex.org)}}}: \LaTeX configutation for documentations files From 436f4adaf64b05215b89b022d60923215644a7c3 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 18 Sep 2023 09:55:21 +0200 Subject: [PATCH 08/16] Doc: Add GPL logo and minor change. --- doc/dev/documentation.org | 29 +++++++++++++++---------- doc/images/GPLv3_Logo.png | Bin 0 -> 62532 bytes doc/tools/PamhyrDoc.cls | 44 +++++++++++++++++++++++++++++++++----- doc/tools/latex.org | 32 --------------------------- doc/tools/macro.org | 1 + 5 files changed, 58 insertions(+), 48 deletions(-) create mode 100644 doc/images/GPLv3_Logo.png diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index f2b27fed..4d2b58a2 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -28,6 +28,9 @@ #+OPTIONS: toc:t #+LANGUAGE: UKenglish +#+BEGIN_ABSTRACT +#+END_ABSTRACT + * Introduction Pamhyr2 is free and open source software (FOSS) graphical user @@ -126,6 +129,7 @@ print(f"Document build on system: {os.name}") If you use GNUEmacs, it is also possible to run the code inside a block and export (or not) the reuslts in the document. +#+OPTIONS: float:nil #+CAPTION: Get os type name in Python code #+begin_src python :python python3 :results output :exports both :noweb yes import os @@ -138,15 +142,15 @@ print(f"Document build on system: {os.name}") *** Latex -If we export the file to PDF, org-mode use \LaTeX. So we can add some -piece of \LaTeX into the document[fn:: See \LaTeX part in -documentation: https://orgmode.org/org.html#Embedded-LaTeX (last +If we export the file to PDF, org-mode use {{{latex}}}. So we can add +some piece of {{{latex}}} into the document[fn:: See {{{latex}}} part +in documentation: https://orgmode.org/org.html#Embedded-LaTeX (last access 2023-09-15)]. For exemple, we can add math formula like =$E=mc^2$= ($E=mc^2$) or =\[E=mc^2\]=: \[E=mc^2\] -But we can also add every type of \LaTeX: +But we can also add every type of {{{latex}}}: #+BEGIN_EXAMPLE # Add latex in line @@ -158,9 +162,9 @@ But we can also add every type of \LaTeX: #+END_EXPORT #+END_EXAMPLE -It is also possible to add specific \LaTeX file header with +It is also possible to add specific {{{latex}}} file header with =#+LATEX_HEADER=. In this document we use the file -{{{file(doc/tools/latex.org)}}} for all \LaTeX headers. +{{{file(doc/tools/latex.org)}}} for all {{{latex}}} headers. *** Macro @@ -211,7 +215,7 @@ a lot better than it used to. *** References -The references use the \LaTeX bibtex tools. The bib file is in +The references use the {{{latex}}} bibtex tools. The bib file is in {{{file(/doc/tools/ref.bib)}}} and use for developers and user documentation. In document, use ={{{cite()}}}= to cite a paper. @@ -221,18 +225,21 @@ To export the files, a {{{build.sh}}} script is available in the org files directories. On GNU/Linux system you can build the documentation PDF file with the command =./build.sh=. Texlive package must be installed, you can install only needed packages or all texlive -packages, for example on Debian (and some derived system): +packages, for example on Debian (and some derived system) use command +Listing [[texlive-install]]. +#+NAME: texlive-install #+CAPTION: Installation command for texlive full on Debian system #+begin_src shell -sudo apt install texlive-full + sudo apt install texlive-full #+end_src Some org-mode configuration used in documentations files are define in =/doc/tools/=: -- {{{file(PamhyrDoc.cls)}}}: The \LaTeX theme +- {{{file(PamhyrDoc.cls)}}}: The {{{latex}}} document class - {{{file(macro.org)}}}: Available macro -- {{{file(latex.org)}}}: \LaTeX configutation for documentations files +- {{{file(latex.org)}}}: {{{latex}}} configutation for documentations + files - {{{file(setup.el)}}}: GNUEmacs configuration to build documentations - {{{file(ref.bib)}}}: Bibtex files for documentations files diff --git a/doc/images/GPLv3_Logo.png b/doc/images/GPLv3_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6ddf89ad8e956bf674a98e9f0cb08d0f29e651 GIT binary patch literal 62532 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%0A(^ zb#v9A1T(?}Rt|#2!Jj4vO{t%trqc8XwP~lJh&hgngh+O2JQ(c-5zU5kE#gEq{Y|=P zU$k_wr7Q@T7QhdT7o2L;WZ4yGhL_)>?5tXQAGXu30f5QswW;{tMX26c?MMdU0m!W< zAZyWO=pZr zJuaP*RUi&{0{o=3@^3wQ42D`eh2;50_Lx?#3m4M2V$5TA`j#NTd-TeF{~ayNBob>q z_JVfPy}mgy!i>|Hop`V6blJgu>ER)Lf(s2`CFH)9H-d&Br$c7CK)|6GrA;BYy&IZ0 zInQxg=2cCezhr^73$tvIy_V)%@8GvZMT1pSU; z!V2f5l|%*60$~7b!=x=0V13=u5e%PyTYPyfLv-LsPx)*Y3Zep9xN>68WjpIM5bjSj z6#!ok`Hg#8#E}$W)gE<%@#@^3ciz9Zr(>x*$j_V^*5RlJ2nc*^oJ<@|UfUVIjB<_q zB4-~KFN%l_9TP|9j9vr-?>a1=9yV(`kM>xsv(OaDT}3nr)n&=PItHQ&ve|n?O+@yJQRPQZkU4; zCyJ04KYnqP0eX3ajgJD3{jo|TGWM^A8jbt|XLurq2YD!LPFAFY+}6Y&hFggsE_r8a z@xJmkwDJyMw`r^JA`NCHPTByVS!u<0pexDT=hu9oga>=|nhS8HNnEfXm}>kg_vd$} zJpftPYJPGit_aCn7ZS~0QNdY<$#fDK<8*RN(sR$3fJ-2{8L0Pj(V+6WwfKq=orZUDBTLWa?xa44j!r#9hPpw9#aq3# z&^&A=_!aoh)w6Egv>V^0UaWATYZ({5mid7)(LK?uD{6oKanu?>L1RcSrVAG#=d`eI zspx9yp-68?IyhS|Uciiw8Bl_W)jbArM4DJa;Lk@B+*ee6zu*6=y2co$|C1X1Qvx}P zk`JkrmF+9gg*PSKn)s}wC31+7((Zq1v1M0DxohJ$9QFfiy)eT2i57~w__QL0JErf_ zTDXnwjVnL}vGV><2yjwuOuu4PfX^mV6Xwg?T9Bwg7xsIpv$H18`_WPRY+u(fUOIku z2f3}f?n>T-c8CB;HXP%L#O?vgjMz*|0NV?>a4*0h1VUQ3&BPHdQFbyAO6ub8qx}i7s zF@EC~2*a2USMMDJY-K5)WC%^tIdSS*ZtNq&#wC)F|xz?jP zTJ;uUP`vU1FCghxv{@h>Jvg95kR<%mztVFAaU*fdnrb>EU;ga+Mlf40>-1TPl1Jy~ z4RpjQG)tU%vKRuzJJdDF8L*1QfjK6r843V%RIZbJKb|-hRKW*sS4WS7rZ{}qa0mK! zQ^)jr*u$E<1P_|lM}j)pcR{&>a|M~rq;6pkZBc|u7uaJ3w)0SdpEnx)o? z{A6?%aZS)s0=f3g;JC8B7|Sq>&W-J|UPvj#N@V(| zS6+WTxRLmJyeq2g*Fp{hjGc%`tSXb!fGr-=BoGOOVxf?bybHQ1 zBp!L`8;<*=nmq6@C3JPO%T)@gKM)*1jkbrJloeiEED}iZ0QjTA_eYtpflGAB57z`Y zO&eb*rYz$VsKH+ior`Meuv7m029>M-m3rFJJQ-0HLl4jqWv zh47dQ|LSehYXpRYhn-CpWSSo8^s1jX z2pC^7AP2hgU)fht!AkL}CVm11FYjH)O5%UN$-6V$Ly#9`u5D`O;xTA2j1$BmLg5`J zE=+~2!Am)>SN`7eM^_RwZ;;;Gn-52sP(JwGQO5{nQuE1= z6CW~a^kvi~1u+)A&6yF)l|=ZPIaeLz+e2VsKrkue^uND`U57ISM4E7TlKKp@!9k`; zYtD}nKx=xhN-E8>2Q2~DPn4f>?%adI^wfa&jjIWww|{M7(> zG9`R}|Af?kJ9PcI{9HTSEdw-|B=?lzA_&;IO75GXNN9u7q9jP7X*-cq0`9~IH5u?fO4AvYQ<|KndamM~#zgFJuH-)1b|jd4+Y(6<84IK<;0?@^Ev zU40sW0387tvXB~=krxAWMyMzz zFMc->fI#fayJ9?{5Upqq-M@#l z5}s}dQ@m&&p$NGTIG7P9SWOqEKH!x?o1I(do|@U}NS_THHGwBZ{kufA?++Nhh_jPJ z9G7@3bcxnRe`g*lQ?}BDOC4_hLrm(x@Ge9IO+Qm?;kADvst&K{SK*vWih7K2RXbX% zgERmVHWb{jK~ zQO6XXgL;HAi{S6An8#;7PhTPgktTfsS;XwZky8XvM^kWI^-&pY#iTk!#31SIvB&DBB02(~@`?cSG%jyH< z5i~-dNQRO`qdFpsgt=bOIWY|QP^N|M3p?Tr)f~3*@?c~6nfcc(^c2c8Ka#{HwAgC) zO>UljNUeKttF>>@a9At5z;xbrjIdx*mk=g1l&rLJ#Iyix5IoOg75Goa;G4401BMG- zi`g`RIB`n5F_<-u&p@yXE7L~K)(_Y({G9GTJ;JPyq@b6xY^Oluuz+wL<{pm?o)w;{!V8+V*yem#kZUh{$%jv0#4)uPPl?S83#Oi? z+TjN;A6rGDiC#9iQh==1lf}-&mybtBPggBO9YW0>0G$SS`;6D^PIcs8Fai&L(=?71Lqc*Dbeu;)Dqs>`i*Mep~ro&v)<(}(p?HH@ri>o2@j<~d)t1` zHudsv^koqw5_+g>S`Wy;ADUc@BVeyMZ^MZ}5I1%J%kb!4BB+MMwXE}7g}|7Ly*V@C zX4Exz{C)&0wd8EZq#S?XW85W&C{}BXf-d`r7vpI|_a5yBl|huTJ>OXt+oAvT4Yp3C zhU6yrY%>B`9ryN&wv?|o&FDkP0j&c(U?KL+QqD2S_j|;I=%=Q#)#UCxrJHGW z_e_NM4l6Kez$*KF|8w&t}C7g*xpWdz;=xs(QQ{8?R&+l3~QM?Ns z5FO65@`>GK2AHu2`wAD06v)_2{`KP1D0l3EI};rbmR*y!GMrECrev{qGq~fO&-D7l*QucbZ? zh>!MZ4lx2k)5z8=)k%Z6iv*tl!J+dQ3uw?Q0CbqiR+F%%IPp%;7sL#b!K(?%KEJ0x z5BekaVH!sZIQkNWQlK_qVg1UlTKjkU7B_j|+x|>4*_2K9N5mbYi$x40V%>uY)5NM9 zFZi7xCO9%WZI1=qMOTICzAX#6R5kp~pjomr6jBGd@`@ZRPFA&AqHTyq>3#dUl2$Ad zghylm?>$QxtP4K(?3&B*bzbqwejAg$OX5}V_VB41Dz+EfE}7dMyEE9_D{q2h;`g@w zD&(p{rk5onw6fB(pT)e$-wQGd)}r^#zgQB-uX$73eoBg(Qpthubb(xj+OaKjhfaW1 zpnMGH{CijXRrh8HD|`2A0l(&w)6s#a&!^TSDR>G=xV$^pp%Rrk$vM#Wu@zqbdw^yl zeE1nKXUZTy!q&&FiX-kp!Z{2tnnDdiSQ}51Ljxq3(?i|Rn&Jh&i54s|bDfC5(&TX< zOO;0b`=JAx`?J&r+glnW3({3^VT`czsk|Ucg7(8>#N%GyeQ6v0d$SjWuU;rvDbOoD zuFy-M8&gW0UlP~P;$OfHRl59mD`p$rK%P^E#8|48=J8O^E8k@~ya0wY z8BFG6P{((@tl?i%kb*1wZ=mZRC_7cL+HdjXeD;{3IHwlgJpT9o9&@Bg@k zA@&wvpOnXMD;q?Z9N@gJIi-b)>#I;r`loPwrgVb4pe_yfepYN0gRr$Qvsp^U;(%{t z1g)zuVo`xRMU`9vK&9b6H*AdD%dHu`=tLRyBGPNzzaLoV{N~gzxTw6kF-2AlMz{yE z&{rguO2;CUSB+5oleSv&K+!^OXLtpDrFv?I#zSubgoKCuj_*~TJ(|nr+z+RBt7V7m zd>U9Y3$b%5lx@%8OZ00a;aazRlioLHSr)PU>$%j|pp<&2#|ZPOv&QUymk4N(E9NtO z-v$Gu(i5GjqlyI$tgE2#P|{~yI}9`RDgK5sK++aIZ(CY~&>E(Z)B5%Y%E)Hv3l*{p zHENvgqins=b(w>Bqn%H7|7wmXOY2Sjr*ehPN#|T!xI*knLuoX?vPUq56?@hMzCU+( z1WAZ+zU=kJbRYDZocB7{heYWgiIRUnQ2$r{1;IPv|R@S{e-TaUZ^qJ zAWaWmuNmTi8iKbi-5qH@>yGeiEos2+;c7>HD=Xr!`Zb$IDIxg{d@-N)Hk=wlD0&?+(G%O(TpUoC^antIXnil2Bt4Wx9mZ`xZwCN)F%04o5 z^P#5t2gK;u)@4G;2R6ry&~f7H(g{-%#iO}pFVrr`wWn!nii$H{ zP^s}BnI5K%P?r=j@6l1*b{NrrsLnZxl;?+z*!wI&rl|xg){7i@vAwl(qY7!INi-dF zeY6%a+C@S0xCi0&UPiEBfO~wQZO9OQaQ>T=rhinjjfehBN|u1(?q68ZecDytgsT=(@ioADv|s+BqHfk5)CHX_p7+;#G} za9a%VhR9T>Y%U4d6i%OI@d2CMP$N$%LULO8b~(~Fx5TR@y%Te@oJ92aaL*KPz?(H| z;$%L1<+hwK%fE*1L#bYdsnz)Ht~w0<(UWSqU9)G=)=Vx;$I3rwOlMIqKRd8&_*Ff9 zG~}T~OBX8b+u^2T(1kI2L}I1`X*6H*`&#f*;ID?wO%C$1w&4=%+ghB_D8= z9lf?XBW@P#%N1hBO)_vk#E{!er@NI^Ic( zY=*FqWk>ZUrep++p;CC|Z-XBrd}&!?R6gaphCPf^uA2>gz-o|0i z(V$q0n8@Rm7#9w8a@|?u`_^8RyMPEXR5Ns46jSow2&m34CwSxpEK4(We+bC2pjB!- z!+DubX7LuE3p~yr5Z-r>Vyn+jL=GeiM~CJg{zM)|Y9)HaG`-O5jCe;{{d&B^0&G#< z)2()o0d$)%LjqdFNc^oYTU~6cyX;pG+_p??#Np?np@Nb=btk8MAB+?S-lU1!5-6a~t%?-l+GYW!Qr1Z0*+u7ggh580-4g9FM?s!gjZ52)Az(BFG>0{uju^poQA9m-5HxcH-G?nGsCm(rf)gsWj@oLw*k?kR482rUwg1D z_B~t{K(G+h*&7ye@Mzr8$@nS-nmpQ)di%TFc?Q;vUv>o z4t0@?-KW9)KhNNg06_#o>a?O(2QZNi)|%cMbt zU@62uFZ((2zu$%Xn|1S!Cb(oyyNK6T^=}Q5<5^8E6y*Cpr0%?$gDr>{@BONr%6@li|Y60!X`2r?DYbW9b`tln;e=` zQ9e>bb@u9UBhw>%q1D#J+`2;#p%gtvF5w^uJ5`-J#v*>kK6B$ zWT9P%&Luk!x{(1sU6aqy3Q)P;0JmpPI>tFg35%{rBMBG`-Xe$v`QAtZ%=}=%kdBnO z5Uq%j*G2EY1r7$FWo8$TG0!w6W^o}Me=CI+Iq@7zxZmAktFgA~ zfw3}j2vg~sG&E=REyKTErnVC(CTX|3jJ}aPY@|(lP?7?+eJL_>O?>H7xd+x9Z4wUC zxw*+2*Tr93B;I9E&gbW4>#&6jB}VyMI+j)(y3_!fuE*uHhA;`%Fqs4O3xL*Y;?=!a zs(LW0Wt<%so;aCcgMLISH!-U9i4oR>_ciKcQQ*CUw&P9HW!1Sqdu9V58_Xs8z3F=q z{#*%Dme=jwDOTBJyNjdpd0Bjzs^#bYMBDPFYrEMplPo1}ji&}1PqwO-KCIYG&OGSAd7xqkLK?*0#@ zw0G!Ls`w7N-@r)>qHSkY{wIV|p$$^m#`SHH?5wBdBK9f^!oT(pZZt9~CSALoc0stY zjkCXYKGWoY&1dWm20@odH03eQ6AlrgGQOF1H zbJ)W(IkOS?zbs0t?`F{rEF|S2KuQE{RpW@vTAP0jWzYkfAk}tBW zlP3+Qg7$+x2t?UVDCvaKjaZ?0=N& z`(Cd%62>6>Wj+EwyfOg3iz-4bt%m9lu74rV#ogOaIcN+Y4FYyIF4EI5{d<3UA)px) zYDi*6x{B%hQ?^ah>I6L6lz(ipEqX?+r1TR+)8IVP+1<~d!>^>SB^NNY9}nitICI@y zAT7$KSzYvhy4vLn6ynb6f^KiqdS%I9iGZxp_z<3qskR+DVqrnfMYh-_rVh4uQJExZ zrGCZad*P338aiF4DnkSP9yvRsjUn=TtIM>K=N9fZXCm}z?$B{-~H& zXVZ!mhX`_;-_SgI+yn!oe-=2*X;E50EGz)MZvhMU?1JIwcIVVTOKF`!HoP`f;@Or5Wq&({ssOefYVn_pUy zS6THl2K$uj#T0vJmEo9SPBnJ#I%jG%OyB=}L%~4`P=FCO&!aMo>Uv_3jjVHm8iCam zoew>T@5X61O7e{c8?{-Q_7OT&2|D=7GAX)f4z!%kt`uYpyPxrv30@Yd>R1(2M`g$i0BZr3_I zaC+-l+#{8RK6)$0=I*Q!=$K6v|1Dv0(p>i5SQur2=U^_?;hYs^BI&)~te~vTVUu*@ zQ=jDH1gG9VhRZ~6@Sc#F2Dh zTQHwJYZP1GKBVX>A6Pegm+g6#9qG$(tpa(R^`s+t2x!D6BbO8sb>a=!ZKBP1FlC~Z za=J^pj1wUV?rA5oTRyC#EcozNzgta&FFOSiA!%uCe1cM?(fa)w5)r;d*@}*>Cu!q&Zv)+VesdYd)yu?C4W zj_PV&u5V1E`pna7`Bd;&v|8X-l#fm|JlQ9Y{vjzbfKaatL;1NdlGwn}!S`WheD|`D zGlbYQ`)c;TUMjaF78K~k(XKEK-&8qH-Laq%4b75%=3+@wdK)ox(CV~&EW6_S9lCp# zmcBY@ANy>jsvu?7K?X~?dp!<;Gc?};OD~b1H5%)s&Ggj3a(h8`wEY>r0-wuiPJJFe zUrB#bLar5WfFzt7y>Ifmhn}W5kS6^EC?m|9PGqTkcA<0k%tqFB{O)gUW9eGcX1OiC zu#;gvnWc0awQW~0j^MF>Z;9b*ydj&#b~_E3ARGTAw%w0l1SqnIF6Vhg@H*X5llU9F z-fk9lNlEw7T$@!Cp{#ku6-`@Q2LpYM){z4$gHqpgbJxZp=OuTZW*dHfa--)1BWeAP zt>Ky7!r422HH9yEG4R{pLL2F8+SNfT-`SSE;uvVX$Zd_MV244brU>?%L}$lo0b<2jggl?Rw`7YMzz1x1$+t2q za=#Iz@rQ&5w?d4qa|kW;Ip&k&w^+j4)AdWs6a5`rNQ5J%Q$bI~?=p1ScXcgUa3n|l z?)qhG%qk1{6o?8!nNzkNXCp=L$jEzbur)y!Z}&A-m$lvJ=q8_|o$DMKz;?!J2QaM~ z(Su&|VeP4u-zMX0S#Lj~&a-gZzyY`$TWAj;;;YRiNpSO&AmZNhKs^g}NJMev(WcX> zzn6lR8%XY~h~}yPboa5@Ttj~uPLqdatCct7bE70!5Mqum)4`%RZLoUMDnmO4AfUS0 zYQ#ABhL^k1e69Ag;|*%#j}4H2DK#hqMukJfK=jhrCZAB6V4gY$@E7R}0JvTS$*PS3j8xG!=9>?zRS zz*H9YbZvV1l%d)0PA;X`w<;i%GKF4KQrxs?m-}Kyr77B|W)WYqNnNs~!5b`Tz|lW@o(YgqNrSHn$@ayj)4G2OF3R3$gi}T>iKE(nA5ffC zNC+LwP;|ML8=1j(Wm%^|cY|Vk^|{x5b7EM*Tkw-MYnfRYC#gg{^dFCSLm#LT=>b8|etb(wPJEap=XnBK*5`!hit9NY|K=`{&9{7myDY8=D1^2z#Ko z{1vS$w+}l=Rk~kPbY-*Cz-z>JaeLQT@;fT_&LaT}N(ujz@xE4prO*}+B{TRFXEcg& z<*1Hg?9;uBgO=q&3eiypdNGtdxeEy3u0g^dHM=Y^D(64p4*PiilIr6lKNjzVbB}zfjLx)z-6`^lgb*NYDD+NlM=n*%P9iRq= zg&d%S)JS~8-uIop&m9!_R!6a5?E%SOQG9a9g7@J8W+ocVuZO~g5g3svp};$bce46SmNtE2E}=eyMTJKin{ z6H`JDWxucHwy%&ev$8!@3n z8!iArxl5e>C&8Yhtva-%Etk@1W1K4X6@ajffjNPz>zZ1nhJa*Y`4pTK>pG;n%9zQ_ zTci%ukw`FqHke%jcQQv^AH9zm+rTI${jE1sjK8ApjZMVWWXL)3M)hem<*YP}Y_7mw zee%44{*iq#$2Jz%{8VgT*R2_9O~xK|&?f@7)8W7HePLr=Ayn;i8=cYqCM!mdOS2!p zpAw*;**6$7j@8F>_%Mxw5I5T;#ygzbeqo+Z=lcheXdjkRk?z`|uI*w!_t5p+(%p#= z#FzQfY)RP0RCW%x`PqUivtZXKc}Y^I)0HD!Hwt^oZv1W}VCNTw(i`eC#y7Vh>YB2= z(GO$@WyB(EKo&+V+d^n{C}u$8=r(XOIRGF+^{bxZ?DbI#-~C#|!Eo3~)MI+j;ez1+ z6&@)Cn#3Ss4E41CpHy|G>SbSU67x*MXWzVw@2mZG^JSfznNSLj{2{snKGbTwZ+yxy zdezmH)>q2zIB0xR)7!7RK;?3O4k49^S1|cW{e(|clp7=C%Nx`M%u5Y9m^{+@`Z5-sr%ok7guQq~ETe zxz0BeOvA&0*08eGF0xVZuW|a0ul3Aee z$C@7d9!?ly1@^Gx$AmwdHqk`f=|hw%mZ??#!|C6ghnW{aM~z$6Om+o6b1s3pznl>+~Li)3v+%m<45Cg&b{#jpDV%OtXPAAYoJNn>iB#7QQJ zJGJPI`3BwYWIEci>R=yQak6Z9!7~(Y0@2}hs@g%QeNs^VB#maYI0>99i}N&AkvF;#wwE7Q@bAlsD{gKL*UPhb zOMwK0C$&fHGvtNVrCbP|=>f?5fPz`3biMCVLjEN*`&=RuB(Gzc03fQiO2bT<7rg(Z_%nUn zvn97S$1LVr@KUyZga|X9t3evwkl`7B03H&1^n^hd6E%m#yM?chOr5rNShFqp=7BB} zOcwj>CmD^-7~awrrw?Qx$mqL+MaEZTAkY0NNe$jETy#pzFV2uSTKu>T%xe)Pa^*gp zMc{cY)t&nu8@pFtb~7T-GKy-0NJ(r5bFTGHTzwwVG<>4brw+JcI3z!Hf5EqO%cEPm z7F}H3f$e3-tz;S|sR1$Y%NtEZs5bB35`Raa>D8k6zKu6cJEa(V`d0u*WIk`I0gkON zMK#IUT{>>QS3qBBpO|GqcFZ(8J!-9f zW6O+^BZKP}iLH-er{+jgOOuh79+3xCa~j56FAYJkOEs7wzm)ew>ZFC7o(08@GX89S zQp3<3d}q zv|A$F=n=4gB^}!V5U;LMzqP3NebW<>7~>s%`TMp&NK<-7D3!b@%TqSOINA;tDe>9~ z*|F$(D0;v4Fo>mA9sQ9Y&h8s>lt(ND(DS#X5^nd7t-RIn-;53y3iakeoyeITx!j`; znLV&%Hv=u??0D?e6A-oS@G6Nv^$dAk*gS)Xt4OZ-$Xr*B|MD%(4{yrusMz*jQ~v4r z-g=6mP=eO?8@qwN`1R_`MA<*&yi2tB9jZ<dGOJTKfPME%E3LAZxoJRo@T;w!${CK43lx&KppU1iZpSRXl0`rpK0sfbQ)efzVh+%BeQtC z*%`38ymWRZe^DsnyY(q}^rCZ1FiP`ssDry1#A?;u*4o|^5E58k;OW!CW1J-`M5{Ra z^&oQ>56d~E)o)acucJ4QxlOrO5PT}}O(7_1BdKmV3LHSV)PseAFZE-TLseD3A(_|QIJE<1f+y<9Gv47z;-?lvCURD-| zLO#T}_P6wA@{icaiLZ`~1!b?ccq~TQe>xE!F%hxG*XWb3VtS$R@$-RrMRWzeT{am| z5TTpXRIk7={kmIRhyY+`8S>_e%ldYz&)w;~fYxy5umfQ+A4$hZ$51VjApzfm>BlPe z&mcm1WJGH1aV)Mk)yep>jNUv0(u(PG;$)0Z5Z0BIuwP{B!bAcHE2h0HWS2{-lIk{q zs#K`8^okNU;=9fI@x5^DGmS3-f_*CYv;qRsZto=7qK|UxN7O{)h^D&1>9hxn48c>q zN_5fu1JfIShI*4f_;Rz+*Kc?WET;c7D@tR0vGfEh3|6{*UzruU@MO5TYUwWvD`8L_k z{R8u!E$bb-(Pt-+Lr1dCD23*FihJZa=njAmD9FfEl*83j62zlXHP{=c-s;%Zb@Mee zcYrK$3`O_yKryJInCGDc=v*jY)F7bWAi6ssm*1n|V^7v2Yj-5NsI2#zR4o+t4;BtKPtQEvgl^*tK*)#DmQbt6#jk(ZA*_Slzw7z@rr}=0{mz&IT3U*ZfOukv;zqCd zon}AUc3q94p&sE~3^$aHgZbJPbD=1ZOSZ-r+V3GFw5#!U$y-G}?zwk};H50lR{A!H zo=v}Vumnf~HOuo=^WDIiC{Y<+oCZ$^tH4N)>sOlmJ7#pneq}zfeGWX`U{n;t(&g67 zy=wW#0T);F#Uw=EzoFWhFYT>~O|F=kQ{#3+1E*U1-h?Lb#jf!t7~ms`FiEugBtgaj zErJ&3c|^g^=n6l$opnO7U!`GR0rMhph`=hcnc4Jv@4)DD7sK5u1v-510M1-;kdQY;ZZwGc7=UM>XWuKpx#u}VX0ay_Tu`e_ z>PL3ylX=h%_l3zX6YvNBnGl$3VSP!gai9%3t+0P{Ac{3%`>0)AWmX1|)RI*vuBF=w z{uDg9kY>!Dj50V>=xK9NN~p{g8H;kB#CnMbI@rmE#4YQn z^7J3<#`sRE1vOoT0(gPeqN6EIq|PGDw0qoguL`*uB7wp?Lbe%3XXZJ+FE{G^MTGK& z-r#KQ3~r3fywXeGF^uR|%#Ev*6_=<`_}25A;rz|5bHj8+N1$iEEl{UipIR08n;#hy z!+NqnRLfZ>3+0t_P|TIg`yTJE zeuc7l;F^`$Dz4!OW5=>_T?MyskK~r!NhpSZ{=Qc~{p(&ql!BPT)`32Csj@(}dOo7@brR+5_qLTdZ=Gnue_}>dj}t`vQ;FZe;IZum z3HBX%OmX^$a~u4(oY&Q^mbmSSK(3K{v;f(4M}G$<=6Kn>8k{e2G=P+}{N|L?2}7=x3e%2C>~)Cosy@9wz~gh;?w zL;>7*rCB#jE2P;-M+oD26nV@<91V`049fsssjF3?S^rgq z^e)3tvV^KWgw&k?%vX(&<%#XTvQU@8tl2=pNij)($0-Ia{6^4XC2dV z(l8k8HnlY9g6k{PEUD6lO%aIuL#RswsM;t%C5O0wW)VPKf#|#7kot(_|d1!h>|g?p@+x^%{W}d3w_iNkI(b!@h zih7C&W_iNB%E^DvX&7m|B1)UUJ|~Z%A~d7l?%t*yB_OXxB5=hq{8A`3-AFQ7&V=H= z36NfdzM=rOchXo95@xh9V2B9GzdmUxg9xdtx9aTVH-y%t?T37epl%9Qn;fkSQd zxi)bGT)h%-QURT7(9n~wA0wV|E*1f@X^_7JDME4|+r=?T6wv@#S79d1y*x@)eJTf# zh=|S&5Z}Lj$qg}U2Kb{L3(ewGcr)Y^8?pN6HPo`CTfZ1um-SMXtY*84Cm|K+!1QMY z{WAof=^hZ>hFz1COt4thEW5t!n%7(_OIMxHANcV2#`K$`PVxl22$_M-X{9*r7N&^p=zrRy*I zZ`;M=LCHd@Df7P-{kS3!y}G^n@od&;nn#lzmJ&HL{p zMb`+?77Wc+aU3m4FYsORQ&9eFx!&JN za`%rA3XP!TSrX1CVauWjJ<`|sXV(r9Mq01W#1MdNX5JSxs^wBX#CY_TlZF4*c;pUk z_8Z^B`LEg{HgR0m)V5 zLXseizSu&f4H=RN9wo(+xg!p3ERS*!ln4^}7I*ep?_J1vk4;3ERJTT+q^iD~HnTE_ zm56-&zjH;lLoR2cl**QH#vH|)6U)chHx?P}_18L0&5 zL=xo3MZ^Yr{6pg3F*5ODj(8omXb>%TtH+!rbw7t_p{d&rRn(th#|(uf2G!4kCXp7g zJz8XhfIdm4WQihffsFnNT-qcGlKIvX&-!W87Egq!IapDCVsYRG>T9eOED^7tUWQ(# zg6!${%N2((|Ld1XxzJ`;n#B*L7k~vaHk^XK;3dhD{j>KI%FHzw{tMWm1G-znV<(9v zk8okCH;neQpZAgop9rs)Y9>P)1%pbHM~5f*v$6sY0bRjy_*1_}{oPV@qW&3IXu2_) z1g#HE#!r?+-MEokbn}$jRu0;>dVLByt*aHT)y1c|dRc{cJ=T-=LBxTyYO=I~2RN>k zQ~bSbeEmrOEn&GR7#Sw&K532)0*`?;k+aBBMfq9M8eL>2Pk0FAq%zKvZ0|?66zx+` zV?%8RQJd);+1YFt9m!{5^X41PzC0td*cVI{#~@HzoiN1J`mf$-y$*k}J6k(+9>7i%m-c20~C&?_sUB4Hwvcflxv&*+TUH%``45S8Ie(V zy6T$>pTJ}I$#}_(fmP(J*`Q&67eJ8zX*pHq@!#){(H>JY0!{HJGwv>BR{DXNEeVzj z>jIT8m%jKvuikFZikjk?n~m#*F_Z2=_rQCpXs?Dfjh`JJXjQiSUuXvKm`C)M(Ki!d z1aQPZ(@LPy16=DpvONa?d|TaC9o&X52jX;_`b37Z=w4ZXEMx5$upeWxb{BtMySq9Q z{9UpCO|CfFP8Q}7;c56Ned$l{kq`DI;Jy6Yc>kaNC${w?2K1A@tc@|e)}&P11qXWf z-Qb zI@*vM{blElUXx87yag?gKv+*)V0zduDxZo2wE zPT4xHO#YNc2=jtKU5{Wlg8fiGftltT;I{&Fj`uA>m%Np!Yr1PDhV3OcX7 z8)vXB4gu8!G~*nm7y*ZhO1=Mq5&~2;W2b$qG2jccZmC_;=sQ59pjw66CRB;BBbt{* zzjTZqyWfYk%o> zl#O>Kz?^v!M&I1T5R#{_S}y3nf4V{}zmpF*PtW;62SMXZi--By_`7~)fAyOjKMKCP z(|_`Mu+~~#GH9w7a~EelPV-B~D4pIGBNM+x?~nVtn1!HVMiWKOZ!Yrh0sGxM+h!tQ zt?%v`^OLyI26+}Wz)rhAId7D1y2s0Lh*SM*u>kSw*-KM-J@x>x=0K4qW034w`aW-14YGs8&*?C;Ti=cI%pBrjb24%Vay%tBrgnE zm9(w@!@pw}Q0H0!Bm#<-Jp&7Zm-aLv-h9;lCscw}noHL;XJ{FV65o}mS$`=SZrbPc zAc_CjZ?~NQM%KX);mc_J;}h@}o~2i@+O&%15#DAp1*6_E77+}zLM}j*!)2NiN2w(;p^KUU$=&|mC2~A!U z5CJF>1AKHUdKsM``a9P(TnT!{HL4;Y8Kd`t|11@7!VE)NphRybDwGl?w(1yhHSh5X zL!^2zccb)F{(A>$n7Di?D(2y!w#`O@x$~#Vp?>!>6dgb*37^3;U#AJQfpLL&U{d-> z5gmEL#6X=0-UAZ(o!<|!u`l1Ja`kKicpU@2-s0!7EK6xIo(eJ}JyNJfln9!|GQRTS zO`%?8hTGi39mVgyFJjmvn(MEM4M#x*1Gd$Dvyk3 zeueW}u1Mp1GX+liHt7N<3%M@dpQc`G-nsdnLfbteQ+oP#HhNR{?xykmZaG?W!78k6 z5R-s=#Kt{XP}N}fOUTn>yI}a!S`ifLF7!&^6Qe1dnyjjRoV48z(?H#x8hy>H0YCU- z%SKK`bvb?2^+{9-71sgt@V0X=R1*4T_ASo!1}4M2!IO5+5`F>Z6olc$n$zzf8@%8l zvr#5w?H`#lwfuway)ge?v>LSROp~^j#5#KG=$S<1CDaxm^&yQ%OY=%|1gt|d zPCsm*pXdWiiFLK3%P5}UZog~7)!S~R^G|lNhYjESAA5();u=sK(0PtUMd15udbtG8 zBVdhuk2CUcc{nalLFBY+b}MuDm%=XM7*~BU7UF@Q--Lx>1@;Rx4X_Bt@9sr=)ONW< zu26N%B6Zw?;2%3VGn=O`{AcYt6do^Hw|zk=`y-80qhmN?!x`>kg27=ERir92k0L=K z6{p^?Iu5s|tsFzb_|43p(!w;l@56OIc_}SV?>g4(%4B(Zv9f{RP4^zOibJv~@OSVO z<%Ld;m{*AFQ)}-&zS|W`&g9*461P#x(`H8Rjh1Uxom-O+LLeAf<4y787|%nn_8$D_ zKY%#2D7Icgo^rMY?!~O=jfo=uoa8^Jz6mxNjgxyl&Gh(~RlJJ043u>5-LjS2cwzuD zi1rEVh+Fh+&OPt&l@A}vW$x94M_;)SJq9Zc-&Ne)wKe)?wxsfnl)opPAQ$)!!LLar zwK>YTk;nc{;N3j{P|70!Cek0Z6lL+8{jL>avZcSZs|+T;*BjN)o|hEKY`N}NG+y-v z-kbJuEY>OjiZ0Fn(@MWH+wEM{_F%3ldO+x_jCa#}rw_>>XM$Lpx~p+iC2iO&s4Ko+ zdey_3;F?*4aO*ek=V$mi{6pf}3I9T7-+OrbH&``4mxrp(1yjkJl++*kfy>rLiFL7u zinZfC4ZXJC?R1)|WM9~#Aak7)2j0<5z*i3UWq%ng1Ux6V=kAVPNW!`hTe*kBJKZp_ z9)@x${Hzbrxa|>eg+1`~KZ;-d%G8lHQ7a+XfL2Em5&T>|Hy62Wbv5u?q@AW3q-fQD zS@jxjq0T-|ka?zy*}N!x9yg0GO@p!UNhllYb!6-GK=<)6%O~S)J7btvY>*&k;~(B`(U#AjUJ{-= zK3`D+0*2NVqVI{zo*~@Ou9BZ33qpEOY)t6Zw?U@XxC{N%@eO9yY$KPNKK~e|{x015OM-3LfKBlSDh}$ydKrZ$&?>o0JxiXdAqL zjGmHcZ}>cClxQTi%uVt_`@7P*SKFsIS%1!rvtWlKVzL@i$~j7= zd3nr_Ld#ovpo7pvl6u#8UeD`~l)iTOQaNi|Se!Q>a4LIwjb+x}Qrp19DYiSJ)pjlG z;*8JJh)kP{3G=_UzM1MXK=k1BmE*J~l*!fO&i7wf4MM)6H_!n6O=ig@_*^JN*Zgql z7LmzsY@+{ia!G|qql$oKC++@lH)})g`e(g@DB;-_y-zDf_kOPk_=XmL9kgUi7`)^D z1lxTG(DJoK7&=s4s?aRqe8;n+TKa>2hCbgJeBNf-{4_UMm%RMwnT$Z+?2Ch^uWUO( z>PgW=5jLtfgULh?R6l$E=j-1PU|(;6Vs5r#=Q3`YP)}_ht2AR(_?fcCuW~e zs9d+E6jbsNoA!(@Ie`76*URF-NJxadV`RXda_jTSO8m|PuLg%kR3mdo)8t_S_9evA_9=nyvRPY9Ba?8XZWO$FCnjys37y48K2ceff5Omo#+L|u zSOdbHTnN`y8|;#kEyRbueXDNG@JZz zaG2KCg-*Vl%<5sQJkjl6wVUuWG&@?pP_buokLdD)18WOFNPLG5++|@S0h&Xwg1i&` zMHwuF`uUNS@3FCFLySt`*mZO=a@xPZe8C)M$=nxe?Czz#+yYie@cmFBIp7u9M%Nv& z{O;VF_D|%S(F4kGm4Vkm_;+;Q-Q$C1SQ$U`uMelyk1-rok?5DdEURHuXHd=n44SD~nD>fxYrRTDwD90iCYQ)!w)+xQ`GG1w zO@ll$MwAnCjrt+k+~2D((lZj7QuZ)DVX2mR(H2v1Ki9D6(`+K!MxLBsgX9m4*?B#( zOT^L~v${kAA1!nNA3zmuKyQ290#9Uf5=6S$d> z7-63pMRK+1t9YZ{u8Zejv76J0)uSNJ47s~hNKewK?g^vBQL7&zMjiypQ2c>#zny>a zS|xT~AmW2sw-ux_sr`k?@7ENUclM*aHoW9|Hm77b*3VYfu2=RfYlX2lHGjdXvqoQ@ z&u|v|-}D#1FiKS>S9!+VslJ(wr}EwQ7W+&DP4g98NU_sB7rK8>l<}xraWNnI>PHJK zr&9F6+fcQU<%SoP3}Wdqh8F0DYfrSflNyF&Qi}q_go2Z!KSP8de?He9I44CZsk#!- zZ}iym?YC{G7=-}IU<4~QTh)=w&rd$k+%J*jUO(ZC}JXD3`w} zgE;mMzjk)>dZ`7E^2)9Cq(uM2yG8bazF5Mhl_{>_XUW4~d%U5Pt)IWfMlIwn%=cvr zbtF4u93Glnmi3~TEgka28pBh+dnvc#=xh=EBg9m#pOFCxnA9BOwL-DxR1-U1MpOEa zg2jh8LVBs?jn;F@>8~zU&bi<2xSkBAs31d+R>TH4=*QvvT#hjBxs={*5fQjFX2y>B zc+rFCQp$b<$85P#nYS9a$j~gs&lEc~pJSR8#SdHbs>r>sn-XJKMBn}A+}4&^PGmGs z8e8sza5Wk`Q+XCOhXSRrwU86V4~}M1#&A z2FrfJ?UL6ygs!3l*d`ijxh7H+f^VQS0cWv0{ntv(CumAbogm)9l z8S0G4GkD=6DN?Q%9I%!;DBIg+B=owk4@cxKU4@5U+4V}(+zj@ZlbVhb0WFfr!6I6W zx+{gbZa?NE2E)>qD}C4td~`gdd!pFX-(Myl<>9UGaxwXw;c~@EabV;G0LrG@ndLv| zRucG>CuS*X04nr}N7GYbrJp*o_V+8S#TsAkRBE!ZBZxRPHHq@|qM}ohG}Z_kdEkc8 zC2qzGreW>B_xnW`no5@osY|Byj%AfiE-r>#l{Ex+Whn-WR}= z0wAa}%lHN9q?w+UM-h@F99|>WdudfV;L>0l9px>-5VxlU)r|YO~bc;_?$vW6T<{Oa!*W+tCKc z51JfdZp@G`alQ`JVNF|p^rnqRoPqRB!K0+v^vbPk4UDF(qr6~sQb|{x7Itdd5t(xZ z9XuUIj(FE6Sp7BF&GP79;aaq(Iw?oEJhUG6fk>nB8SbXz+7A8G?O3j8>)&D;6`oMn zJ&G@PZ5D}zfBE{1`S5x+ghwtbm5=A#k6~v0SrHw5s1sblAiq0$fmHU@Zv@PG;ZJq+ zJnO@S3qyRdIRBu;>f6_L@VuX)_Jbhj-mvaJ^RJe>LxJSo{otq4xPpi0fm&aow@&sB zj`pKTw3nghVTsG7gQBT19Z1C8`6NpDL^j>twuff(gjw>uT7(f>=61pS77JlIgjeTY zuvJ|?T63rf-`k^b0)z^F2JY*d2OM7eM_3ikv^5TL2kTdOwwxinvC1``0lP{wK$f_u zPfu4j)``78Y49?xafkhct^U|>UU!y4_`xEYe#+4~QV`dC=YnR(i&ipPnlyT>A zbE;hvVNW0xN$4_d;e5|F$xj?!w;a9k@0HKZu)T$E!4!wZ(8ZpvMQDHTF`?#zXBhvl z>|6rr#Y0bio;oprNQGSEzx-^_&b|o$w$vV54#GZTxg_m2Z?euI0UaYgCW$yWOU_i0 zQOYr;pSCEh%g_8NO$xnqBp-!qTs}&ZLX)BG)^%D{Tc2x;(t#)ZOv;^hzS3y^;j2{-89lyvUm{j% zk+Ha7g}@=yP?FB3%fs&R^kW%-ePyJfYrNe=z?Xmq;l?zYGh#Zb zyCw?ngGf*7{n(3O#3%nJb9%@X&jY%N!a(UgC#%J9>ZYk-WS7O4cj$Oy)BMP5-nmZV z3&t#hQ?B(JwzCc0WyIT8cgPIXMt#dQ%_d}fr&i>f%h;+s;_N*4Q-4}k*wBWM2^sx3 zl?t>c_E`Mk_$40F$(bkJo9+(60+m_#KV%OO*~j5pBY(u2rULtIZ(NHbiz!k8xI7m$ zoFVXi9GS}!s6t(*~-D+6_ZTz>w*<}Thd=RqI!9?z>4Ip z3Scjtjv$^`2~ePj;-Is2KvjU`oI?kzR*w_8;BeX`T{%7-kr;6v6;+Rv+k=%Loe+ovJ~0 zasHreH;ey-xJP7#_3KJY^NCC8yJk> z^_7}!YfRe{L{51=-PSMK&guBvCTdez=(PdR@+PA*VQQF(hYDz74?Pl*YPgeVvYNhk zyQ-eN0US(EZ}L)dIqvus$x?GY%P9YBjEsoUr3{feWoM(;yjLaCp6?ZGodIm)?)S@m zm;->i#tN?S!J{dkJ8U<~K^qVAkPd~|l2B;ZKGD~;U_C?={cXzKI-7f!;q~GX4+1Z# zk>aoUnnQOI<7=fz-uR6!$vg~fZI_tmC7^NW9l&Mvs`Qg^)mY5g+Ucbbc2Xi`76sd8 zjP0CWxQT-Qn90a@AE^z;k{-ut1zh~dmvlKkZWgJa^AS@I-&MA~C4pL`8e8~EM-EnQ zbmBzJgPKD;a$+mi?54G{&EYi^N12mGDbGFL4*xm{L;h|i1G+@4g^poINKGJcQiX5* zYUGuF|KxG$1|E3UBl5s|`LONEKxDXpzT+rw zDpFffJtEAk@}$n+skPSgUIProR8=!}OVCB~JC_i+ z_^orya>27eV9na6(+Qj#lv>|EyFPwCc1@$SgEn{Ub;QkkEJa%zvi?jZau*Ya&*T8aUOhs3WH&K(Tfz-K^0Ygd^n|%BdEFp1D%T6N*uA#-G>v;Vb z62o7&bXmo)pS}7xy2#9|9Qe8EE9#B{FNFJ3D3Zh*#AC6UO{S6*@^NE>R%bXmZB2EQ z_J(pMR6{e&@SNqkgUBXF@7@Cw($Q0^NZ<0>HrX*NnPrw$27Lw)kQZRfI_iFm_0_5F z;Nt^GH;6Q>#%|aKjm8j%Xs-^01~xdBz6S;W85~9bo+H>wwU#oYe|S==83LaD)XiP$ z_(ABGNF#!9bh>^uidd$UwH zWcY5l>(GRGEXS2+EQST^pwqDFfxKij85gA-%v^6vJqzLXXj6866CN%KsrR z+tZ$AQ0hcy^k;+ma)|WV6Z3NiNT*SG$m`fsl-w`HXxIpHR&NmoGI7!{x|Ta}u)c47 z(23N|a3A?7G6{4aeaAGUI{06$J3GSGuGzK)Q;;SKGVdrya|GU_H>^Cy-lllU@pBel zO1C}hV@sj0G*FVep_YwZhBtkU^L{XueClZb!8(3Y^ARHMGNUKC!;?Ft&|o%TjMt0G z$ZaD_jP|8a^a#T%z0VKVZ}q@kK{sX3aK=z)sUEWp`qI#5HS9=`Af6`sAZuJ8`xEl{ zAC(=88{M4@&DFOzx~gJ+9$iMqyIbSs%G|sATUcgxskZ3;hu>m+Y>rkvD$T%w+UhvvWs%DeG-pg8P*P8&c0@YhE8qeOcqz&W^h)=(7Tg;GCT@5=9liJg7D zADr1-;_XMbyR_^3IRZoZLY&^KqFZB<$y#pn;IygG8sZru@&Bg615x7EC7_=l-hh=T zf)YZZYld5Rb5i)jG71C0I~JOnDyYUV+{I^05o-fLP4s*!D?PeTHDxXf#=tL; zO9cG72UE%|KiL@#ZaG2VD<>l* z^xr!WJ~=jgX)+NHfDmKdCOFLJ<>09d{Jt+309s)}Evq+l6z12;d6N8FmbUPTrV88k zCe%x1*fcRSBzCg5>}Oo)T~e7>>CO5qm;5o3#8Vb7YJy85>ht$PDp)g`;Gba|F$;Ds z!taeh1pr&d8L$pMj=R0Al-2bDN%IQOKS=!iLxDM6-ULsV@!p;;SiY^rI75|`u~I6= zy`uel1bh_P#GYpf8}aTJeAcKCa+hSXd28YGl_n%y2@S$ox7P!oYp(E8(U;4K^L)t$ zfIykrm*nz5NJTCRYy8t5oEU}j9}re~zab58g%F;P#>ItCMb0I9UUTV*h|VEgM*0^P zz%7-2Iqxj*CtK$dD7Ahz)(LxxR7$fG^sW$mFs`UE<1at8C@OYdTLDEYOhw(T}xg>IR z5wz**sFeR%@V?-z3-f+l9zy9IR)pgXd=NMp=r7c@LWyH*@-F#d82(sko~p%AzYfM) zIMsJDmy`?joKoG(gB$K23a;1lGw`6`o+n~l_9`#{1nc9wg0I}IjW9#<9d3Z<1#d0} zhu8-sJpiuDgvdpZlF$8iK^PAwA9nU+-mND~HUL<6`=8_rfECB$&4TwK=hC~Gbsn6Q zc4cb`mO-~O2?#h*97>OmCKFc8~9{Kz|GIXQ4$-Kg@u*I z)fre8f%5X@esE;om5f=~TeW`^69a&S@sbCgg*!6vi;&OQL9k7+HUK2O)YXikk8mvYCsIUx+!EH zpA_sOAzOOzM9Bt#zI+&`qPhJ)CoLP#xn+OP5?HKP+R{GvU;m7d9&rY7v!!eu#wyIk?@zcbnkZ-lY5o zo@NqBno158>Sq2WZy`3MDo8-o$=cpts6ERhVrrwrBs=Nw%7yS~i0?}q09F||BON}p zs#5}k`=>%aW`ybCrp|UaYi)JT-pS>vL%#Ru2R1@|JIwU$}j*Rcf;Lg;A|sU z@_3WeVd@0Nq|(r`&j?P<%@Zs4PV7$CDGENWA_G9Z>}B(>!zNWXf|V>R{6xTmQ_3Lm zWFS+NGzdwK|KFH`dqOM#>BIO=sU$C*F~cQfJB40`g%9 zmf-akL2I@Zire-=7y#0)_Vn@yr{IGIp2)#fh46;1*xlrgyfK8{MbVa+M6lpI5kAn% z`i}=!m70uqw##gPh|n4Sr^b*5+)k)j{QqniDkzf|O+;Zl4T2Si46Lf~t5WCgJ6`xC z=n%ey_-0;SDUeXz%CyH{9~h8&Gyp7u0YqE|FG>t74Cyv4c@wcQN;f=!{w@x0KrcIs zUKj{JEm1k$5vQQ`CVUUhk+g`1B^EpB2Ib|CFQf_@n$>eu7 z!ZQ)Ac`)jlB$tX0TaQZthXt@2EI~8a=4GuJCvc0o8mR;m?ZxzIF~4?+m0t!z~7|WHqh11 zt`~UJePL^32PLT5sxT!(fnSV(1z9<3b)pRbgfsy7g601VTrHTmag5M&7R7uWB)#Nt zF2s77AlVilz8|IGIEdMu*vrn_S4|nQ!(Q)`xrzq9T30e&83Ul+lEjnUMut|i}Zgjr>*v&pu1 z^?&XPmtZL#k^y|e2*qd__{mhkxHAJ8p}lH;*k??HS90zUI;$G4;v{fnZVM``lZVt)w zd+x-D=epjN+N-1Y@UDTAOHI%`8-`l>a-lWF!gn%d7_o}*VI!3E*urn6`?J9%25t~& z+k$e9X+cRwsdsvf5zhR-1!4vOAKs{7FOj-zUX(7QbY(a1_MRyxmxSf62?8OZbuKi_ z2(06UB^v;w5&-%zy-BtVMm3PU3A(-!UXQY|o80X|e|itsWZ<$ggyeo!_y(oMJZ|B` zLaswn>-ghB2mPBXLm20}c;@j!hnI-Z+z-Cf0+Xm-Jad2GPdPZkgRe%F^eYNd&d@C3 zxw9y2zoin;S@^qDo#y^7xuwMTJR9c(fCU)r3uVi;aCsBVOwxug>;dqTDm1w_-TrT~ z@bNS}QpUb@ob5#h5DUL*Dzm(=30eNJ!*gD2jKE-JY8d|?R8Siz)Q^8eTm?$1N&#L4 zNeVq7&o3(wYrk105t_F@2o394Y5BI>5P)XzjL?rFaI01Wq&ALrKSYh&G8TSQZ#jqz zT#|vWl&NruZMHFBt_Ks!$U+=BS?7X$fY9TvlQe7u$?y)7cvt%ig>*Ka47l46drJmJZ zh7qj;5(;-~{}QW(Rq4!KwW16U<{sup;$mWXQwQ$|uZP(f4Ggc<%Tr5cI9C*@Y`k|j z!3$Mr_K_r?)xakj;i3w@dqgkjzXg8T0+UO1L#!4CPLg_7N;n+Ix|?=S;8Bl`gLkCb z)#%)gFcLHgt_H@(eE8H*Gk~D3|w077l*qGLJ{|WAO0oXvA{qf5u&kv zXl0>ghYNMZFGg2hm|5^X%m`afRiQQ`_x25z@5OLDbCIX*HHei-*fKMMvS}x>^q~OT z0ecIKg~;vyT9=GI^g6a%gxK_SV~z8!KnJxXPv!x$&k;9dm&!7JqC`;z$p_dEZG()5JwBO=b_G)fWFs2c4}w z5d(IVrNXu#X)?z$;7=BQClQjFg8dU#ai|rz&4+6z!W_YOR)QxZ>T}Hu0CjMn)cUZn zII2ZafbD#t3zR^~EIaY4P_p?|3*bSaZb)1NJR#-zF60@vVaOKV8Fk$(ik*C+_^$SZ zS>pp`a;(tARl^kz>#U8jKY*-L_W#)qw@r2jvIuRkO)44LcpnA+Y2mgecq}RJgq3m8 z-YhsR7H->@gx=K`GZAM<&%n}YFkvKo8)!zR>`hPXW#JQn;URXIn8g2kZqJviHD{Ulu7+?p|Rcd&E(;;f{(nj+%L?7?b`$@??{D7%zz;XcwXpOUJ`pvXJK)5Q6I)6FcwehFg9>sRGV*14x=Kl(!v`CUd3%vFI#5;T#|toBP#3C z>1JD_+laNe{=bgGTuM!Rvdd^bec|TY1S@&0SK!bSfkL2N4AFedc z@E8^Q%!Y#}R+h;)G6a*YK9qLCZyb~`v24xboZ)Slz@t{pg(WfHWBRPjfn2GwY_%F} zYGZWYh|8n$N+55%4m@XIi4RXyvutjSWRCWr|8D@VStobB?7@?5uw)XvR4thc!3q$* zu*c4HmoV+D8t*4kGPxZbkpUnFrx?M|Ss(sb?swW^R^g_>T_}b2#!3kpBvNvQ@r5ND z0O%uehg}SmluK$g596(D_-8Ee;o>g((w=g4&5J&)Zh_S?E3+g~il)uNlx|+cH5ROa zwMAIH09H2(xg5orAS7mAp~s22*ymw%kX>Jj`)e`2jWBl_95wth)i)L1;}SO6FJu12zhUSQ)|G6D1JZOVYys z&_&`~0~-vq_^`17Ru^G)6p7+Ov|YkWG#`w?d+?mQ?z=#H5mpa?)m6MuDn;27^8oQG zOvKm~gWyaHBWt;z7}!S060>QnGkl5C?7Yh^7JTHx6<#nz65k$TEsht^rCv?Yw z;JbPSa%QZ;|BNF2i zHJ)7f#Vbh*v)TYh8CS17EN`T%>*XP__de6dWsa3e?Z2c4NYRzC7GVbTv+xb6=e1WD z8faxI+XNz*JmcUC2v*Lr@P`V&ClPL5X_>~(+B06@84F~mDm0IFW<2aP;ZZ+0N@&ro zT@H^YX;Uk>%(fCYa2r;HtVvyi&1O52i^O5FtB}s`!6OJq=c&Y1p3SOfIWov%@;!?6!nCPG6mY9-?d+AZN4 zx0e;P#8w#**FYolvh^yg;6ZN%vIftBZ46u^+{eXn8uLc@DR7DKV+Y2mkL%zNWCWWh zj)zroP_!lE{{y%99R(h>en<_yTT0w_j}dxK;zACMT>O8v`@TuweMwsB-j3tFQK0`x zmNz7oQju}U!)TlVK#KcA%&nB}V~T>_d(GgryM(|a1>c3AO?FAY%cAHmn?oDYq{=r- zc>*G|7h88O8iD7OZUC@-IQ}2G1c24<`x=2~49m)8d#@@!tQLCI1e7iJgKY#4ickVy z0qW{t8p5~PUUYSc!)%_HAnQTZ9BcuR(-6X+_`AHG0c$O?2@+qUht8x z#i@TbCI$e(O#3ehCjP;bGXTW;9Ih9->7$oqh)eGQ>DmP!^%-y>n zQ>(oe`qEP=09F>*H2Hu;HOhV(;!RN~TQUU66P8mKoiVpfQEs zd@;~7juLo(M9$sd9UL2%_AG({I0JE5=654Iz2{#@xn$j+v>NDwC8-`x%WjUP@T|~t zb}PbfX2}?Vszy-%cZJY8xHhl306HFIZNks{&fTzA83)BEAMOA?A5j-qPjYpYdpi%t zr6I?tG9y=i&MsOj;~g z&ZSd9KM&u|!x!WFUU-6~`vL~1Ae)DSdQkl9a&V6C1kEVjBrCrCp8@@{aAF=tFOaDV zz2&>uD0W&`KSsDqigIBb5=x(xC&B{3cW#`Ju=Y?0_sqx%N_HJC^sXdI=4f{EmsIk@ zs=wPtETqD9Iu-kn@h7ty37(g0u*8vhS45!Pnm zVFQN=J#ri1A`dRg!E?a92A;C;w1HQAcqauL>R|mQ@Vl#hJp=j;aLUmr3p@I-ujiEP zCSX_V#_XR08`4}sg{j`cr-4teh1EHjYh7ZGB`J6wc((`}`UO_-c6cYxT z0}M;Sc0r|q(H4#~aENt+;FWQGFML=QL1~CxEG*8$-+W;Bg;T)Vr!t zxL>OJn-9kb$lc4*-MpuDTWp$p`Z6WI+WWyhNji*!#AFi5Xl$xRH*Fr|t(*a%BYWXW z1a5wDF>Zm<>VB78&x^U^2KJsnO;5o6&4Zi`xhZwQaNtw}r*`a%;lJPX?#7_C6KmTR zFZbZMz8ficE~4Ply3Ixw(_t+^S%JLI5I$U^V#UqAH=n_X;P2qh=GpJ?|LeP1KhooE z;LmYcPZmsG$lEGx{J$?3gT1I(cG?o_jaKIT9V4`+?nz+DVW~N;YRTcvOoUf*&KNG8 z#4lxG+~&(DyTv}*imPXu>p|Y=xYu@ao=Cad=LHP_9oc(x#T*kt=JMXV<~pA1gF>#m zry^Wlhi~=_N_8$TRby{@MBv?=ZiNj19oFv|2F}<#MpaAz@`i=e1@>Es1b}g?x+8Ml zHoMA1V+9`7ZC)I2iw#4n7P44Y#wxz-Qi9;qX~FUzfO5Hco%{Y3*zGbAGAfp03ca|z13O% zC9;AqiPOAyvMvpMIOh;@9so5n@_5d($R=>?X%IMbGfoL!LNW;@a|Ma6ABbVUiiErn zH}GnZSelSyw1(u$q+8Nr;e)}N4@F&kDgc2yY$e)Lv_hWmewE~sErr)U8~-m@lX`xQ z`|;Dhco=nfk*_A17T36E0KPkB?YTAMGTUx1AV8OG0BCl5=VubIuAVQ#&tul6xWxaD zB4i@0fK6?Jf^c7n|1Y>(ju8^$pNgj<(j{5v-Yt>eq^9APX?WhkZAlb3tlXKKRGBNZ z0mQ(qG3?iQz^0JTcv7%Emm!-Buokpi_+%4gB_1Y};O?!o3qg`V!WjElcX>I=L}Gl_ zr`)A*&jx@%7?LP`X6xhccKBb+bVA5zp@m&jp=*Ilobp6pRe%F`^{W!t|5$qfSh$7w zxcfb4|5FZUhmg-&o35bB!8pj^LI7fYXnSx*470$C7y!ar|AQn%5}~CJ2$#H-3P+2( zAzteC|ABOPfxp^Fc^uX}+|q-KNLc;_Ntt6M`~`SAX`S~4WR5x)0uh@q01G$N!_Bxf z5n-Mqmfs))FI)Iof|dXE22O1fH1-H30E}DwzgT;O3?%nxbnV|sc{T?vvYm=63I)5Bz6Pt!Hj5x)uiH6~qpcp#kB4!a1vSE2@;6#Rr9ZewH0 zG7ITO_?OfJgA3RF<8toKb28+f0__or|IfjW*5ycu+#umeAI3JB?*CFZF0t@@$iO1t zf0Hx^Mou{oqhwfWSDvn1#e^5ZVcch}@p0<=e7F#ofwa#Z#sH15(7@+OPJ*JiCjn%l zI~1?1(a&$N@R5mIY-%=q2*67f2=AvOlR-KPeBi51a7l08Yr`J?)18axArj+V?+mU| zj2Bu2u|9``vb(zrJgT@UVI_xW!OlWAJhm++27oEhVqCeiR}wT8qB6${_&y2Bhu{mz z92r<@;YT&>%2O5^C&RKpCJ5~TkcyzhVURCl3NCqK%$Ek24TbSxtL${~aEZ(2cUH&&{ES!*ucMc3G z13;)--vMwWP%qGwC&$BTslgGf4Ik@sI3*YV|Hu?rmn4~^Ue4q2naxU19LT`y1||`K z(hvpGmkv{*7#N4A_cfU-1(yS}YtW5_7Sdakr3>o;uso_#-c4{%U<6nh(`E6Lg{BOA z_ppdOXeBP2Ei9TUB-cxvxmGs*U*a$d84t!ab#luW zlo1OX0#MevD8OOBK{1?~TRk|a31-H1?Fim{u9*vug?vWr!oHfpGcwlyBpBlRa{0dr zy|wR+@Jzcit}RT!Jc!F2Y1p(9K8VYS5NnysmkqmYZ-b9f-7?g_UI~qz)T9sV0q{bU zjc$VZ*5!GLQ_1di7QQ*u$q6#O&EPk}`EK8dc4Ld%VcbC|nc=|!RxpuC6tpMA3t*yC{wEM^=3@(7 zwE+%Eckw%OU?kxUmut!tn&OuH?|uu78Te?r0&j+Dl9E$=7Bq*i^DGr-C#L9(g9Cu! z0*`t-4bR4W8|kz0|F)OK|8L1;SmwcT*2x_kV>}O$oVQbrA1tH|f930_#~i~!Aa-iKCD9&Jjsd{PS>qFT7#lg4)L553%s_sC6EMGSUFOy}u@uNh z`2%TqtqD#vaDt6lX7oS_y?sD}vIuA3We*Owa0Bv&uZMANXkR@EHgsb!348mGSB3!~ z@HjXw2E$(jW*9d{M@DI}7bX_&|AD8?Q8C>2d$looGlI7qi7Pog54HyOlXzBJj4xc$ z(B9-c5BD>0ZH<+j_w1h*?)4%r-PZ)OH^68M-z0v<*`*fdNI&#=STz*Vf!C>Y!r&I* z=lx*6M)*fJp9|#yV5?-bnF_5LxY)Y=;7?RH!SeG4zS9qOX@nnCE0jp+vbl8=+%M4{ zU#2}PnuPWeAzi%W+%R>`&Ilmlc34c92SDJCa-`72#lG)BhSVzy@Y^DsYFv(hNeEb+ z%8^^FD;sn#aG!;FO;z+vXoMNSj657;U8R7J0>i326)yqz2V<~k1uUMLz&gr7jM1lO z!|y$pbS@q8kq;QSG!4^BQD9QAgMgN^ri^#o&W58r_%84nVB0DVcRR4i!krE9_X+Vc z;*~OfaVdTFew-2-wjHlF3WmJ(l|;Oo;7B7A?v%Ka!$HPriE_)YO@CX=gMre2ZxQBBtWro|V8Fhj09RZ1kPn|S&Kt9uGFPjGB?j)buK)9* zTsy%n^7(nVAxI8*3gNQ8FSqd96kOetms^nBb?cB_sA?EKV*S6RV*u)B+)a`0e$SQ*l~gyT{McL^Ebxl#=}b;r2PSV93>-W0J#RhoJi zi_%}3Ub5s=d}@ z(CFOM7A}Uf*TE4!WIUG-Vzh;wLq5KU6HMPU&K36=>)wrLJa{%8|17X&5oG3X%)%HC zPO~l>^ym_VoHpQb3wNYoTDr{rL!bm8rc6OF5FEd^7%p4`$9gc{ha)}MJIFpPCD^?V zJQ)~89xyOBovac<|3%grOZJi2Yqx?2!#u#RVws&X=@SV61;Z~i{y!lE8L}@2F3-a5 z#<_|g3ycBwC44B?THq}MFK#|-Ej;7HGlJQe0Z^urgO5 zbG!^Zv-z)QYhBN;HcJi60;X?*IaA#2e~%1?T?E`HU#gKD z^$PAH<&r#%_FV|cgka3d4Qpt@85R};^NKLHWBKG-V8P@CE}Ny!-2(LYW0a4e0Cm2= zg>*URe_b7t+9qN&a$?Ape{HpW?1 z2X=S??Pk|$3-1_M@56HAV*lPwl7bt|+d?|TtrcKcJM5ftrK+~IuJ1#)SUd0F4%JP- zdSHbQ%Nt;M(r%@sXmW|!9s_=`0Jho$2N>8bSVNl)ZR>DxXU}eeCrUloyWoYe?{A$` zv@2aV+29Xw9z_FScsmUDV7P(dJ`C#+YdOevBIsIp*T5!!KOo%4&y=y)>{`Qw-$KUhqpXf)&eU+o+DKys2Xy6@CQH+b~Lb4 zAa87gtIXA@%;m#6&n4qcgv^z3A)c24m(GGg^>Ba>?=!F+K{;Im@A$AT1<%*RljEFx zRW?Ov4ZF7#W3Yb)#*-(3D*)y@xnkEM>=caK;LT%aq0Mvizs85vDR^!!ywV)AkkbEy zt@^05UK#Gc7PVEig7zFf}?fI65>kD=;uRFfbLupgjNp03~!qSaf7zbY(hi yZ)9m^c>ppnGBYhOIV~_YR4_F Date: Mon, 18 Sep 2023 10:36:50 +0200 Subject: [PATCH 09/16] doc: dev: Add abstract. --- doc/dev/documentation.org | 58 +++++++++++++++++++++++++++++++++++---- doc/tools/PamhyrDoc.cls | 1 + 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 4d2b58a2..5df82310 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -28,8 +28,15 @@ #+OPTIONS: toc:t #+LANGUAGE: UKenglish -#+BEGIN_ABSTRACT -#+END_ABSTRACT +#+BEGIN_abstract +This document is for the use of developers. It describes the project +architecture, the tools available to assist development and +debugging. It also describes the procedures for creating packages and +the configurations required to set up the gitlab runners. Finally, +this document explains how documentation is written and modified, and +how to contribute to the project by modifying, improving or adding +documentation, translations or code. +#+END_abstract * Introduction @@ -59,9 +66,50 @@ https://doc.qt.io/qt-5/model-view-programming.html (last access ** TODO Unit tests ** TODO The debug mode * TODO Build the project -** TODO Building packages -*** TODO Linux -*** TODO Windows + +The project uses gitlab-ci runners to build packages, but it is possible +to build packages manually. + +** Building packages + +If you need an hand made package, you can script available in +{{{file(packages)}}} directory. + +*** GNU/Linux + +On GNU/Linux building GNU/Linux packages is easy, you just need python +in version 3.8 must be installed with venv and pyinstaller packages +(see Listing [[linux-env-deb]] for Debian and derived system). Finally, +run the {{{file(linux.sh)}}} script (see Listing [[linux-pkg]]). + +#+NAME: linux-env-deb +#+CAPTION: Install environment on GNU/Linux +#+begin_src shell +sudo apt install python3.8 +python3 -m pip install venv +python3 -m pip install pyinstaller +#+end_src + +#+NAME: linux-pkg +#+CAPTION: Build GNU/Linux package +#+begin_src shell +cd packages +./linux.sh +#+end_src + +*** Windows + +To make the Windows packages you have two choice: If you use Windows +you can use the script {{{file(packages/windows.bat)}}}, other else +you can use the script {{{file(packages/wine.sh)}}}. Each script need +a specific software environment. + +On windows, you needs python on version 3.8, pyinstaller and +NSIS[fn:nsis] installed. On GNU/Linux you need wget, wine and +winetricks installed. + +[fn:nsis] The NSIS web site: https://sourceforge.net/projects/nsis/ + ** TODO Setup the CI environment * Documentation files diff --git a/doc/tools/PamhyrDoc.cls b/doc/tools/PamhyrDoc.cls index 5d63b4b4..3e50140f 100644 --- a/doc/tools/PamhyrDoc.cls +++ b/doc/tools/PamhyrDoc.cls @@ -96,6 +96,7 @@ }\\ \vspace{0.3cm} %%\rule{\textwidth}{0.4pt} + %%\newpage } } From 4c953d29fe943ce519b4cc0e2c3a8ec7eafceb45 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 18 Sep 2023 10:39:03 +0200 Subject: [PATCH 10/16] doc: dev: Minor change. --- doc/dev/documentation.org | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 5df82310..29176044 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -269,7 +269,7 @@ documentation. In document, use ={{{cite()}}}= to cite a paper. ** Export -To export the files, a {{{build.sh}}} script is available in the org +To export the files, a {{{file(build.sh)}}} script is available in the org files directories. On GNU/Linux system you can build the documentation PDF file with the command =./build.sh=. Texlive package must be installed, you can install only needed packages or all texlive From 8429d04b3ab5e3c6aa1c9b7367940c8d4e4065f0 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 18 Sep 2023 11:57:46 +0200 Subject: [PATCH 11/16] doc: dev: Continue contribution section. --- doc/dev/documentation.org | 52 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 29176044..f7b4dbd8 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -282,8 +282,8 @@ Listing [[texlive-install]]. sudo apt install texlive-full #+end_src - Some org-mode configuration used in documentations files are define -in =/doc/tools/=: +Some org-mode configuration used in documentations files are define in +=/doc/tools/=: - {{{file(PamhyrDoc.cls)}}}: The {{{latex}}} document class - {{{file(macro.org)}}}: Available macro - {{{file(latex.org)}}}: {{{latex}}} configutation for documentations @@ -292,7 +292,53 @@ in =/doc/tools/=: - {{{file(ref.bib)}}}: Bibtex files for documentations files * TODO How to contribute? -** TODO Contribution rules + +Pamhyr2 is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License[fn:license], either +version 3 of the License, or any later version. + +[fn:license] The GPLv3 web page: +https://www.gnu.org/licenses/gpl-3.0.en.html + +** Guidelines + +To contribute to Pamhyr2, we expect a minimum of respect between +contributors. We therefore ask you to respect the following rules +regarding communication and contribution content: ++ No gender, racial, religious or social discrimination ++ No insults, personal attacks or potentially offensive remarks ++ Pamhyr2 is free software, and intended to remain so, so take care + with the licensing of libraries and external content you want to add + to the project ++ Humour or hidden easter eggs are welcome if they respect the + previous rules + +** Make a contribution + +There are several ways to contribute: you can report a bug by creating +an issue on the project's gitlab page[fn:p2-gitlab], or you can create +a merge request on the same page with the changes you have made to the +code, translation or documentation. + +The Pamhyr2 copyright is owned by INRAE[fn:inrae], but we keep a +record of each contributors. If you made a modification to pamhyr2 +software, please add your name at the end of {{{file(AUTHORS)}}} file +and respect the Listing [[auth-format]] format. You can update this file +information for following contribution. + +#+NAME: auth-format +#+CAPTION: =AUTHORS= file format +#+begin_src text + [(optional) email], , +#+end_src + +#+CAPTION: Current =AUTHORS= file +#+INCLUDE: "../../AUTHORS" src text + +[fn:p2-gitlab] The Pamhyr2 Gitlab project page: +https://gitlab.irstea.fr/theophile.terraz/pamhyr +[fn:inrae] The INRAE web site: https://www.inrae.fr/ + ** TODO Translate ** TODO Code contribution From 77c0dddee3184d9e7a1bda375bda8941cb64ddf3 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 18 Sep 2023 14:19:18 +0200 Subject: [PATCH 12/16] doc: tools: LaTeX class minor change. --- doc/tools/PamhyrDoc.cls | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/doc/tools/PamhyrDoc.cls b/doc/tools/PamhyrDoc.cls index 3e50140f..9c617f8f 100644 --- a/doc/tools/PamhyrDoc.cls +++ b/doc/tools/PamhyrDoc.cls @@ -100,13 +100,34 @@ } } + +%% +%% Texttt +%% + +\usepackage[htt]{hyphenat} % Make texttt split at end of line + %% %% Verbatim %% \AtBeginEnvironment{verbatim}{\footnotesize} +%% Add box arrond of verbatim +\BeforeBeginEnvironment{verbatim}{\begin{tcolorbox}[boxsep=0pt, left=0.1cm, right=0.1cm, arc=0pt, boxrule=0.5pt, colback=white]}% +\AfterEndEnvironment{verbatim}{\end{tcolorbox}}% + +\makeatletter +\AtBeginEnvironment{verbatim}{\dontdofcolorbox} + +\def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}} +\makeatother + +%% %% Source code blocks +%% + +%% Use minted \usepackage{minted} \usemintedstyle{emacs} \setminted[c]{fontsize=\footnotesize,encoding=utf8,linenos} @@ -118,6 +139,7 @@ \setminted[text]{breaklines,fontsize=\footnotesize,encoding=utf8} \setminted[llvm]{breaklines,fontsize=\footnotesize,encoding=utf8} +%% Add box arrond of minted \BeforeBeginEnvironment{minted}{\begin{tcolorbox}[boxsep=0pt, left=0.1cm, right=0.1cm, arc=0pt, boxrule=0.5pt, colback=white]}% \AfterEndEnvironment{minted}{\end{tcolorbox}}% @@ -126,12 +148,3 @@ \def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}} \makeatother - -\BeforeBeginEnvironment{verbatim}{\begin{tcolorbox}[boxsep=0pt, left=0.1cm, right=0.1cm, arc=0pt, boxrule=0.5pt, colback=white]}% -\AfterEndEnvironment{verbatim}{\end{tcolorbox}}% - -\makeatletter -\AtBeginEnvironment{verbatim}{\dontdofcolorbox} - -\def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}} -\makeatother From a733e148e2d0f290fa357c77a614f43a5f106d39 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 18 Sep 2023 15:03:30 +0200 Subject: [PATCH 13/16] doc: dev: Complete contribution. --- doc/dev/documentation.org | 43 ++++++++++++++++++++++++-- doc/images/Qt-linguist-setup-lang.png | Bin 0 -> 21516 bytes 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 doc/images/Qt-linguist-setup-lang.png diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index f7b4dbd8..fe817d41 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -291,7 +291,7 @@ Some org-mode configuration used in documentations files are define in - {{{file(setup.el)}}}: GNUEmacs configuration to build documentations - {{{file(ref.bib)}}}: Bibtex files for documentations files -* TODO How to contribute? +* How to contribute? Pamhyr2 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License[fn:license], either @@ -339,7 +339,44 @@ information for following contribution. https://gitlab.irstea.fr/theophile.terraz/pamhyr [fn:inrae] The INRAE web site: https://www.inrae.fr/ -** TODO Translate -** TODO Code contribution +** Translate + +You can improve or add translation for the project. To contribute to +Pamhyr2 translate, you need to use Qt Linguist[fn:qt-linguist]. Open +Qt-linguist and edite the translation ({{{file(.ts)}}}) file, finally, +commit the new version of file and make a merge request. + +If you want add a new language, edit the script +{{{file(src/lang/create_ts.sh)}}} like Listing [[ts-it]]. Run the script +and open the new file with Qt-linguist, setup target language (Figure +[[qt-linguist-setup]]) and complete translation. Finally, commit the new +file and make a merge request. + +#+NAME: ts-it +#+CAPTION: Example of modified {{{file(src/lang/create_ts.sh)}}} to add italian (it) translate for Pamhyr2 +#+begin_src shell + ... + LANG="fr it" + ... +#+end_src + +#+NAME: qt-linguist-setup +#+ATTR_HTML: :width 8cm +#+ATTR_LATEX: :width 8cm +#+CAPTION: Qt linguist lang setup example with italian. +[[../images/Qt-linguist-setup-lang.png]] + +[fn:qt-linguist] The Qt linguist documentation web page: +https://doc.qt.io/qt-5/qtlinguist-index.html (last access 2023-09-18) + +** Code contribution + +If you are developper you can improve and/or add features to +Pamhyr2. Please, follow the architecture described in section +[[Architecture]] as closely as possible. Keep the code simple, clear and +efficient as possible. The master branch is reserved for the project +maintainer; you can create a new branch or fork the project before the +request. + {{{biblio}}} diff --git a/doc/images/Qt-linguist-setup-lang.png b/doc/images/Qt-linguist-setup-lang.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba375d1f4a0e451fd0055c85182353eda959d18 GIT binary patch literal 21516 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 literal 0 HcmV?d00001 From ed006fe1c3f7bb9992c21889e256d51fcff7b05c Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 18 Sep 2023 16:49:51 +0200 Subject: [PATCH 14/16] doc: dev: Add archi and model graph. --- doc/dev/documentation.org | 132 +++++++++++++++++++++++++++++++++++++- doc/dev/images/.gitkeep | 0 doc/tools/macro.org | 15 +++++ doc/tools/setup.el | 12 ++++ 4 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 doc/dev/images/.gitkeep diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index fe817d41..02c6ef21 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -28,6 +28,20 @@ #+OPTIONS: toc:t #+LANGUAGE: UKenglish +#+NAME: attr_wrap +#+HEADER: :var width="\\textwidth" +#+HEADER: :var caption="" +#+HEADER: :var smallcaption="" +#+HEADER: :var name="" +#+HEADER: :var data="" +#+HEADER: :var float="nil" +#+BEGIN_SRC sh :results output :exports none + echo "#+CAPTION[$smallcaption]: $caption" + echo "#+NAME: $name" + echo "#+ATTR_LATEX: :width $width :float $float" + echo "$data" +#+END_SRC + #+BEGIN_abstract This document is for the use of developers. It describes the project architecture, the tools available to assist development and @@ -60,9 +74,123 @@ https://doc.qt.io/qt-5/model-view-programming.html (last access 2023-09-15) * TODO Architecture + +Pamhyr2 architecture is based on Qt Model/View programming[fn:qt-mv] architecture. + +#+name: graph-architecture +#+header: :results drawer +#+header: :exports results +#+header: :post attr_wrap(width="7cm", data=*this*, name="graph-architecture", caption="Pamhyr2 Model/View architecture scheme (inspired by Qt Model/View architecture [[https://doc.qt.io/qt-5/model-view-programming.html]])", float="t") +#+begin_src dot :file "images/graph-architecture.png" :cache no + digraph { + node[colorscheme=set19,shape=box,style="filled",fillcolor=white]; + + save[label="Pamhyr save",fillcolor="9",shape=note]; + model[label="Model",fillcolor="2"]; + view[label="View",fillcolor="1"]; + delegate[label="Delegate",fillcolor="3"]; + undocommand[label="UndoCommand",fillcolor="4"]; + user[label="User",shape=ellipse]; + + model -> save[label="Save"]; + save -> model[label="Load"]; + + model -> view[label="Rendering"]; + view -> delegate[label="Rendering"]; + delegate -> undocommand[label="Create"]; + undocommand -> model[label="Modify"] + + view -> user[label="Vizualize"]; + user -> delegate[label="Modify"]; + } +#+end_src + +#+name: graph-model +#+header: :results drawer +#+header: :exports results +#+header: :post attr_wrap(width="16cm", data=*this*, name="graph-model", caption="Pamhyr2 Model architecture scheme", float="t") +#+begin_src dot :file "images/graph-model.png" :cache no + digraph { + node[colorscheme=set19,shape=box,style="filled",fillcolor="2"]; + + study[label="Study"]; + river[label="River"]; + + subgraph cluster00 { + label="Network" + rnode[label="RiverNode"]; + redge[label="RiverReach"]; + } + + frictionlist[label="FrictionList"]; + + subgraph cluster01 { + label="Stricklers"; + stricklers[label="Stricklers"]; + stricklerslist[label="StricklersList"]; + } + subgraph cluster02 { + label="BoundaryCondition"; + boundaryconditionlist[label="BoundaryConditionList"]; + boundarycondition[label="BoundaryCondition"]; + } + subgraph cluster03 { + label="LateralContribution"; + lateralcontributionlist[label="LateralContributionList"]; + lateralcontribution[label="LateralContribution"]; + } + subgraph cluster04 { + label="InitialConditions"; + initialconditionsdict[label="InitialConditionsDict"]; + initialconditions[label="InitialConditions"]; + } + + solverparameterslist[label="SolverParametersList"]; + + subgraph cluster05 { + label="Sediment"; + sedimentlayerlist[label="SedimentLayerList"]; + sedimentlayer[label="SedimentLayer"]; + layer[label="Layer"]; + } + + subgraph cluster06 { + label="Greometry" + georeach[label="Reach"]; + geocrosssection[label="Cross-section"]; + geopoint[label="Point"]; + } + + study -> river; + river -> rnode; + river -> redge; + redge -> rnode; + river -> boundaryconditionlist -> boundarycondition -> rnode; + river -> lateralcontributionlist -> lateralcontribution -> redge; + river -> initialconditionsdict -> initialconditions; + initialconditions -> redge; + river -> stricklerslist -> stricklers; + river -> solverparameterslist; + river -> sedimentlayerlist -> sedimentlayer -> layer; + redge -> frictionlist -> stricklers; + redge -> georeach -> geocrosssection -> geopoint; + geocrosssection -> sedimentlayer; + geopoint -> sedimentlayer; + + } +#+end_src + +[fn:qt-mv] The Qt Model/View documentation web page: +https://doc.qt.io/qt-5/model-view-programming.html + ** TODO Model -** TODO Solver ** TODO View +*** TODO UI file +*** TODO Window class +** TODO UndoCommand +** TODO Table +** TODO Plot +** TODO Solver ** TODO Unit tests ** TODO The debug mode * TODO Build the project @@ -188,7 +316,7 @@ print(f"Document build on system: {os.name}") #+RESULTS: : Document build on system: posix -*** Latex +*** LaTeX If we export the file to PDF, org-mode use {{{latex}}}. So we can add some piece of {{{latex}}} into the document[fn:: See {{{latex}}} part diff --git a/doc/dev/images/.gitkeep b/doc/dev/images/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/doc/tools/macro.org b/doc/tools/macro.org index 76db0780..9c59153f 100644 --- a/doc/tools/macro.org +++ b/doc/tools/macro.org @@ -34,3 +34,18 @@ # Biblio #+MACRO: cite [cite:$1] #+MACRO: biblio \bibliography{documentation} + +# Wrapper +#+NAME: attr_wrap +#+HEADER: :var width="\\textwidth" +#+HEADER: :var caption="" +#+HEADER: :var smallcaption="" +#+HEADER: :var name="" +#+HEADER: :var data="" +#+HEADER: :var float="nil" +#+BEGIN_SRC sh :results output :exports none + echo "#+CAPTION[$smallcaption]: $caption" + echo "#+NAME: $name" + echo "#+ATTR_LATEX: :width $width :float $float" + echo "$data" +#+END_SRC diff --git a/doc/tools/setup.el b/doc/tools/setup.el index 54a3517b..027e5700 100644 --- a/doc/tools/setup.el +++ b/doc/tools/setup.el @@ -16,6 +16,18 @@ (setq org-confirm-babel-evaluate nil) (setq org-latex-caption-above nil) +(org-babel-do-load-languages + 'org-babel-load-languages + (add-to-list 'org-babel-load-languages '(shell . t))) + +(org-babel-do-load-languages + 'org-babel-load-languages + (add-to-list 'org-babel-load-languages '(dot . t))) + +(org-babel-do-load-languages + 'org-babel-load-languages + (add-to-list 'org-babel-load-languages '(python . t))) + (add-to-list 'org-latex-packages-alist '("" "minted")) (setq org-latex-listings 'minted) (setq org-src-fontify-natively t) From a14dfba6b443558fa173cddbc4c5047cc1218fcd Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 18 Sep 2023 17:25:21 +0200 Subject: [PATCH 15/16] doc: dev: Add solver pipeline graph. --- doc/dev/documentation.org | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/doc/dev/documentation.org b/doc/dev/documentation.org index 02c6ef21..f078bbb7 100644 --- a/doc/dev/documentation.org +++ b/doc/dev/documentation.org @@ -77,6 +77,47 @@ https://doc.qt.io/qt-5/model-view-programming.html (last access Pamhyr2 architecture is based on Qt Model/View programming[fn:qt-mv] architecture. +#+name: graph-pipeline +#+header: :results drawer +#+header: :exports results +#+header: :post attr_wrap(width="12cm", data=*this*, name="graph-pipeline", caption="Pamhyr2 solver execution pipeline architecture scheme", float="t") +#+begin_src dot :file "images/graph-pipeline.png" :cache no + digraph { + node[colorscheme=set19,shape=box,style="filled",fillcolor=9]; + + subgraph cluster0 { + label="Pamhyr2" + config[label="Config",fillcolor=5]; + model[label="Model",fillcolor=2]; + obj[label="Solver",fillcolor=6]; + results[label="Results",fillcolor=2]; + view[label="View",fillcolor=1]; + + results -> model[style="dotted"]; + results -> obj[style="dotted"]; + } + + config -> obj[label=""]; + obj -> model; + + subgraph cluster1{ + label="System"; + in[label="Solver input files",shape=note]; + out[label="Solver output files",shape=note]; + bin[label="Solver binary",shape=note]; + } + + obj -> in[label="Write"]; + bin -> in[label="Read"]; + obj -> bin[label="Execute"]; + bin -> out[label="Write"]; + obj -> results[label="Create"]; + results -> out[label="Read"]; + view -> model; + view -> results; + } +#+end_src + #+name: graph-architecture #+header: :results drawer #+header: :exports results From 6380e3110fc8021195028b858dae05d4e407f866 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Tue, 19 Sep 2023 15:55:37 +0200 Subject: [PATCH 16/16] doc: Add temporary water mark. --- doc/tools/PamhyrDoc.cls | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/tools/PamhyrDoc.cls b/doc/tools/PamhyrDoc.cls index 9c617f8f..a2cc8473 100644 --- a/doc/tools/PamhyrDoc.cls +++ b/doc/tools/PamhyrDoc.cls @@ -129,7 +129,7 @@ %% Use minted \usepackage{minted} -\usemintedstyle{emacs} +\usemintedstyle{tango} \setminted[c]{fontsize=\footnotesize,encoding=utf8,linenos} \setminted[c++]{breaklines,fontsize=\footnotesize,encoding=utf8,linenos} \setminted[python]{breaklines,fontsize=\footnotesize,encoding=utf8,linenos} @@ -148,3 +148,16 @@ \def\dontdofcolorbox{\renewcommand\fcolorbox[4][]{##4}} \makeatother + + +%% +%% Water mark +%% + +%% FIXME: Delete me for the first realease +\usepackage{draftwatermark} +\SetWatermarkLightness{0.8} +\SetWatermarkAngle{25} +\SetWatermarkScale{3} +\SetWatermarkFontSize{1cm} +\SetWatermarkText{Work in progress}