From c0298c6a6ed4399d2e509c3773d0af13199736cd Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Mon, 15 Jul 2024 09:01:15 +0200 Subject: [PATCH 01/15] rewrite first part of navigating in linux --- mkdocs/docs/HPC/linux-tutorial/navigating.md | 111 +++++++++++-------- 1 file changed, 62 insertions(+), 49 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/navigating.md b/mkdocs/docs/HPC/linux-tutorial/navigating.md index bd882acafbb..19a1f21719d 100644 --- a/mkdocs/docs/HPC/linux-tutorial/navigating.md +++ b/mkdocs/docs/HPC/linux-tutorial/navigating.md @@ -1,22 +1,25 @@ -Navigating -========== +# Navigating -This chapter serves as a guide to navigating within a Linux shell, giving users essential techniques to traverse directories. -A very important skill. +In its most basic form, the linux file system consists of directories and files. +A directory can contain multiple files and subdirectories. +In Linux, the current and parent directory are respectively denoted by `.` and `..`. -Current directory: "pwd" and "\$PWD" ------------------------------------- +This chapter serves as a guide to navigating within a Linux shell. -To print the current directory, use `pwd` or `$PWD`: -
$ cd $HOME
-$ pwd
-/user/home/gent/vsc400/vsc40000
-$ echo "The current directory is: $PWD"
-The current directory is: /user/home/gent/vsc400/vsc40000
-
+## The current directory + +To print the current directory, use `pwd` (**p**rint **w**orking **d**irectory) command: + +```bash +$ pwd +/user/home/gent/vsc400/{{ userid }} +``` -Listing files and directories: "ls" ------------------------------------ +`pwd` prints the working directory starting from the root directory (denoted by `/`). +The root directory is the top-level directory in the filesystem hierarchy. +After that, each directory is separated by a `/`. + +## Listing files and directories: "ls" A very basic and commonly used command is `ls`, which can be used to list files and directories. @@ -27,53 +30,66 @@ in the current directory. For example: afile.txt some_directory -When provided an argument, it can be used to list the contents of a -directory: +When provided an argument, it can be used to list the contents of a directory:
$ ls some_directory
 one.txt two.txt
 
-A couple of commonly used options include: +options: +In Linux, the semantics of commands can often be customized by adding *options* (or *flags*). +Options are usually preceded by a `-` character. + +Some common options for `ls` are: - detailed listing using `ls -l`: -
$ ls -l
-total 4224
--rw-rw-r-- 1 vsc40000 vsc40000 2157404 Apr 12 13:17 afile.txt
-drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory
+ ```bash + $ ls -l + total 4224 + -rw-rw-r-- 1 vsc40000 vsc40000 2157404 Apr 12 13:17 afile.txt + drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory + ``` + + To learn more about the meaning of this output, see TODO - To print the size information in human-readable form, use the `-h` flag: -
$ ls -lh
-total 4.1M
--rw-rw-r-- 1 vsc40000 vsc40000 2.1M Apr 12 13:16 afile.txt
-drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory
+ ```bash + $ ls -lh + total 4.1M + -rw-rw-r-- 1 vsc40000 vsc40000 2.1M Apr 12 13:16 afile.txt + drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory + ``` - also listing hidden files using the `-a` flag: -
$ ls -lah
-total 3.9M
-drwxrwxr-x 3 vsc40000 vsc40000 512 Apr 12 13:11 .
-drwx------ 188 vsc40000 vsc40000 128K Apr 12 12:41 ..
--rw-rw-r-- 1 vsc40000 vsc40000 1.8M Apr 12 13:12 afile.txt
--rw-rw-r-- 1 vsc40000 vsc40000 0 Apr 12 13:11 .hidden_file.txt
-drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory
+ ```bash + $ ls -lah + total 3.9M + drwxrwxr-x 3 vsc40000 vsc40000 512 Apr 12 13:11 . + drwx------ 188 vsc40000 vsc40000 128K Apr 12 12:41 .. + -rw-rw-r-- 1 vsc40000 vsc40000 1.8M Apr 12 13:12 afile.txt + -rw-rw-r-- 1 vsc40000 vsc40000 0 Apr 12 13:11 .hidden_file.txt + drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory + ``` - ordering files by the most recent change using `-rt`: -
$ ls -lrth
-total 4.0M
-drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory
--rw-rw-r-- 1 vsc40000 vsc40000 2.0M Apr 12 13:15 afile.txt
+ ```bash + $ ls -lrth + total 4.0M + drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory + -rw-rw-r-- 1 vsc40000 vsc40000 2.0M Apr 12 13:15 afile.txt + ``` -If you try to use `ls` on a file that doesn't exist, you will get a -clear error message: -
$ ls nosuchfile
+If you try to use `ls` on a file that doesn't exist, you will get a clear error message:
+
+```bash
+$ ls nosuchfile
 ls: cannot access nosuchfile: No such file or directory
-
+``` -Changing directory: "cd" ------------------------- +## Changing directory: "cd" To change to a different directory, you can use the `cd` command:
$ cd some_directory
@@ -88,8 +104,7 @@ $ pwd -Inspecting file type: "file" ----------------------------- +## Inspecting file type: "file" The `file` command can be used to inspect what type of file you're dealing with: @@ -100,8 +115,7 @@ $ file some_directory some_directory: directory -Absolute vs relative file paths -------------------------------- +## Absolute vs relative file paths An *absolute* filepath starts with `/` (or a variable which value starts with `/`), which is also called the *root* of the filesystem. @@ -127,8 +141,7 @@ $ ls ../afile.txt ../afile.txt -Permissions ------------ +## Permissions [//]: # (sec:permissions) From 4a21d08b388d2dd4a0ba7247c28a88ddac880e77 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Mon, 15 Jul 2024 11:56:05 +0200 Subject: [PATCH 02/15] rework navigating section --- config/templates/hpc.template | 1 + mkdocs/docs/HPC/linux-tutorial/navigating.md | 219 ++++++++++--------- 2 files changed, 120 insertions(+), 100 deletions(-) diff --git a/config/templates/hpc.template b/config/templates/hpc.template index 5e3a1807199..ace41e1bcac 100644 --- a/config/templates/hpc.template +++ b/config/templates/hpc.template @@ -95,6 +95,7 @@ markdown_extensions: - def_list - footnotes - abbr + - pymdownx.details - pymdownx.snippets: auto_append: - ./includes/abbreviations.md diff --git a/mkdocs/docs/HPC/linux-tutorial/navigating.md b/mkdocs/docs/HPC/linux-tutorial/navigating.md index 19a1f21719d..81d533f3da4 100644 --- a/mkdocs/docs/HPC/linux-tutorial/navigating.md +++ b/mkdocs/docs/HPC/linux-tutorial/navigating.md @@ -8,7 +8,7 @@ This chapter serves as a guide to navigating within a Linux shell. ## The current directory -To print the current directory, use `pwd` (**p**rint **w**orking **d**irectory) command: +To print the current directory, use the `pwd` (**p**rint **w**orking **d**irectory) command: ```bash $ pwd @@ -19,6 +19,25 @@ $ pwd The root directory is the top-level directory in the filesystem hierarchy. After that, each directory is separated by a `/`. +## Absolute vs relative file paths + +An *absolute* filepath starts with `/`, the *root* of the filesystem. + +!!! example + absolute path to your home directory: `/user/home/gent/vsc400/vsc40000`. + +A *relative* path starts from the current directory, and points to +another location up or down the filesystem hierarchy. + +!!! example + `some_directory/one.txt` points to the file `one.txt` that is + located in the subdirectory named `some_directory` of the current + directory. + + `../file.txt` points to the file `file.txt` that is located in the + parent directory of the current directory. + + ## Listing files and directories: "ls" A very basic and commonly used command is `ls`, which can be used to @@ -26,44 +45,43 @@ list files and directories. In its basic usage, it just prints the names of files and directories in the current directory. For example: -
$ ls
+```bash
+$ ls
 afile.txt some_directory
-
+``` When provided an argument, it can be used to list the contents of a directory: -
$ ls some_directory
+```bash
+$ ls some_directory
 one.txt two.txt
-
- +``` -options: In Linux, the semantics of commands can often be customized by adding *options* (or *flags*). Options are usually preceded by a `-` character. Some common options for `ls` are: - detailed listing using `ls -l`: - ```bash + ``` $ ls -l total 4224 -rw-rw-r-- 1 vsc40000 vsc40000 2157404 Apr 12 13:17 afile.txt drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory ``` - To learn more about the meaning of this output, see TODO + To learn more about the meaning of this output, see [Permissions](#permissions) below. -- To print the size information in human-readable form, use the `-h` - flag: - ```bash +- printing the size information in human-readable form, using the `-h` flag: + ``` $ ls -lh total 4.1M -rw-rw-r-- 1 vsc40000 vsc40000 2.1M Apr 12 13:16 afile.txt drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory ``` -- also listing hidden files using the `-a` flag: +- listing hidden files using the `-a` flag: - ```bash + ``` $ ls -lah total 3.9M drwxrwxr-x 3 vsc40000 vsc40000 512 Apr 12 13:11 . @@ -73,13 +91,13 @@ Some common options for `ls` are: drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory ``` -- ordering files by the most recent change using `-rt`: +- ordering files by the most recent change using `-t`: - ```bash - $ ls -lrth + ``` + $ ls -lth total 4.0M - drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory -rw-rw-r-- 1 vsc40000 vsc40000 2.0M Apr 12 13:15 afile.txt + drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory ``` If you try to use `ls` on a file that doesn't exist, you will get a clear error message: @@ -92,22 +110,25 @@ ls: cannot access nosuchfile: No such file or directory ## Changing directory: "cd" To change to a different directory, you can use the `cd` command: -
$ cd some_directory
-To change back to the previous directory you were in, there's a -shortcut: `cd -` + +```bash +$ cd some_directory +``` + +To change back to the previous directory you were in, use the shortcut: `cd -` Using `cd` without an argument results in returning back to your home directory: -
$ cd
-$ pwd
-/user/home/gent/vsc400/vsc40000
-
+```bash +$ cd +$ pwd +/user/home/gent/vsc400/vsc40000 +``` -## Inspecting file type: "file" +## Inspecting files -The `file` command can be used to inspect what type of file you're -dealing with: +The `file` command can be used to inspect what type of file you're dealing with:
$ file afile.txt
 afile.txt: ASCII text
 
@@ -115,109 +136,107 @@ $ file some_directory
 some_directory: directory
 
-## Absolute vs relative file paths - -An *absolute* filepath starts with `/` (or a variable which value starts -with `/`), which is also called the *root* of the filesystem. - -Example: absolute path to your home directory: `/user/home/gent/vsc400/vsc40000`. - -A *relative* path starts from the current directory, and points to -another location up or down the filesystem hierarchy. - -Example: `some_directory/one.txt` points to the file `one.txt` that is -located in the subdirectory named `some_directory` of the current -directory. - -There are two special relative paths worth mentioning: - -- `.` is a shorthand for the current directory - -- `..` is a shorthand for the parent of the current directory - -You can also use `..` when constructing relative paths, for example: -
$ cd $HOME/some_directory
-$ ls ../afile.txt
-../afile.txt
-
- ## Permissions -[//]: # (sec:permissions) - Each file and directory has particular *permissions* set on it, which can be queried using `ls -l`. For example: -
$ ls -l afile.txt
--rw-rw-r-- 1 vsc40000 agroup 2929176 Apr 12 13:29 afile.txt
-
-The `-rwxrw-r--` specifies both the type of file (`-` for files, `d` for -directories (see first character)), and the permissions for -user/group/others: - -1. each triple of characters indicates whether the read (`r`), write - (`w`), execute (`x`) permission bits are set or not +``` +$ ls -l afile.txt +-rwxrw-r-- 1 vsc40000 agroup 2929176 Apr 12 13:29 afile.sh +``` -2. the 1st part `rwx` indicates that the *owner* "vsc40000" of the file has all - the rights +Here, the output `-rwxrw-r--` indicates the permissions of the file. It can be broken down into 4 parts: -3. the 2nd part `rw-` indicates the members of the *group* "agroup" - only have read/write permissions (not execute) +| type | permissions user | permissions group | permissions others | +|------------------------------------|-------------------------------|-----------------------|--------------------| +| `-`: is a file (`d` for directory) | `rwx`: can read/write/execute | `rw-`: can read/write | `r--`: can read | -4. the 3rd part `r--` indicates that *other* users only have read - permissions +In this example, the file `afile.sh` is a regular file, and the owner `vsc40000` has read/write/execute permissions, +users in the group `agroup` have read/write permissions, +and all others only have read permissions. The default permission settings for new files/directories are determined -by the so-called *umask* setting, and are by default: - -1. read-write permission on files for user/group (no execute), - read-only for others (no write/execute) - -2. read-write-execute permission for directories on user/group, - read/execute-only for others (no write) - -See also [the chmod command](manipulating_files_and_directories.md#changing-permissions---chmod--sec--chmod) -later in this manual. +by the so-called *umask* setting, and are by default `rw-rw-r--` for files and `rwxrwxr-x` for directories. -Finding files/directories: "find" ---------------------------------- +## Finding files/directories: "find" `find` will crawl a series of directories and lists files matching given criteria. -For example, to look for the file named `one.txt`: -
$ cd $HOME
-$ find . -name one.txt
+For example, to look for the file named `one.txt` in the current directory and its subdirectories:
+
+```
+$ cd $HOME
+find . -name one.txt
 ./some_directory/one.txt
-
+``` To look for files using incomplete names, you can use a wildcard `*`; note that you need to escape the `*` to avoid that Bash *expands* it into `afile.txt` by adding double quotes: -
$ find . -name "*.txt"
+
+```
+$ find . -name "*.txt"
 ./.hidden_file.txt
 ./afile.txt
 ./some_directory/one.txt
 ./some_directory/two.txt
-
+``` -A more advanced use of the `find` command is to use the `-exec` flag to -perform actions on the found file(s), rather than just printing their -paths (see `man find`). +For more advanced uses of the `find` command, use `man find` to display its **man**ual. -Exercises ---------- +## Exercises -- Go to `/tmp`, then back to your home directory. How many different - ways to do this can you come up with? +??? question "Go to `/tmp`, then back to your home directory. How many different ways to do this can you come up with?" + + Some ways to go from the home directory to `/tmp` and back are: + + 1. Using the `cd -` shortcut: + ```bash + $ cd /tmp + $ cd - + ``` + + 2. Using absolute paths: + ```bash + $ cd /tmp + $ cd /user/home/gent/vsc400/vsc40000 + ``` + + 3. Using the `~` shortcut: + ```bash + $ cd /tmp + $ cd ~ + ``` + + 4. Using variable expansion: + ```bash + $ cd /tmp + $ cd $HOME + ``` + +??? question "When was your home directory last changed?" + + To find out when your home directory was last changed, you can use the `ls` command, + along with the `-l` flag to get a detailed listing and the `-a` flag to list hidden files: + ``` + $ ls -al ~ + total 3.9M + drwxrwxr-x 3 vsc40000 vsc40000 512 Apr 12 13:11 . + ... + ``` -- When was your home directory created or last changed? + Here, `.` denotes the home directory. The directory was last changed on April 12th at 13:11. -- Determine the name of the last changed file in `/tmp`. -- See how home directories are organised. Can you access the home - directory of other users? +??? question "What is the name of the last changed file in `/tmp`?" + + The output of the `ls -lt /tmp` command will sort the files in `/tmp` by the time of last change. + Check the first letter of the line to determine if it is a file (`-`) or a directory (`d`). + The first line with `-` is the last changed file in `/tmp`. + The [next](manipulating_files_and_directories.md) chapter will teach you how to interact with files and directories. From 9b64db507cf88c1d5091d21dbcc12a72b2cef8f6 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Mon, 15 Jul 2024 14:59:00 +0200 Subject: [PATCH 03/15] move subsections from navigating to manipulating files --- .../manipulating_files_and_directories.md | 153 +++++++++--------- mkdocs/docs/HPC/linux-tutorial/navigating.md | 33 +--- 2 files changed, 81 insertions(+), 105 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md b/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md index 627bf9e9ef7..939bb41f772 100644 --- a/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md +++ b/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md @@ -66,75 +66,47 @@ directories as files. ## Removing files: "rm" -Note: there are NO backups, there is no 'trash bin'. If you -remove files/directories, they are gone.
$ rm filename
 
-`rm` will remove a file or directory. (`rm -rf directory` will remove -every file inside a given directory). WARNING: files removed will be -lost forever, there are no backups, so beware when using this command! +`rm` will remove a file or directory. (`rm -rf directory` will remove every file inside a given directory). -#### Removing a directory: "rmdir" +!!! danger + There are NO backups, there is no 'trash bin'. If you remove files/directories, they are gone. -You can remove directories using `rm -r directory`, however, this is -error-prone and can ruin your day if you make a mistake in typing. To -prevent this type of error, you can remove the contents of a directory -using `rm` and then finally removing the directory with: -
$ rmdir directory
-
-## Changing permissions: "chmod" - -[//]: # (#sec:chmod) +## Permissions -Every file, directory, and link has a set of permissions. These -permissions consist of permission groups and permission types. The -permission groups are: +Each file and directory has particular *permissions* set on it, which +can be queried using `ls -l`. -1. User - a particular user (account) +For example: -2. Group - a particular group of users (may be user-specific group with - only one member) +``` +$ ls -l afile.txt +-rwxrw-r-- 1 vsc40000 agroup 2929176 Apr 12 13:29 afile.sh +``` -3. Other - other users in the system +Here, the output `-rwxrw-r--` indicates the permissions of the file. It can be broken down into 4 parts: -The permission types are: +| type | permissions user | permissions group | permissions others | +|------------------------------------|-------------------------------|-----------------------|--------------------| +| `-`: is a file (`d` for directory) | `rwx`: can read/write/execute | `rw-`: can read/write | `r--`: can read | -1. Read - For files, this gives permission to read the contents of a - file +In this example, the file `afile.sh` is a regular file, and the owner `vsc40000` has read/write/execute permissions, +users in the group `agroup` have read/write permissions, +and all others only have read permissions. -2. Write - For files, this gives permission to write data to the file. - For directories, it allows users to add or remove files to a - directory. +The default permission settings for new files/directories are determined +by the so-called *umask* setting, and are by default `rw-rw-r--` for files and `rwxrwxr-x` for directories. -3. Execute - For files this gives permission to execute a file as - through it were a script. For directories, it allows users to open - the directory and look at the contents. +## Changing permissions: "chmod" -Any time you run `ls -l` you'll see a familiar line of `-rwx------` or -similar combination of the letters `r`, `w`, `x` and `-` (dashes). These -are the permissions for the file or directory. (See also the -[previous section on permissions](navigating.md#permissions))
$ ls -l
 total 1
 -rw-r--r--. 1 vsc40000 mygroup 4283648 Apr 12 15:13 articleTable.csv
 drwxr-x---. 2 vsc40000 mygroup 40 Apr 12 15:00 Project_GoldenDragon
 
-Here, we see that `articleTable.csv` is a file (beginning the line with -`-`) has read and write permission for the user `vsc40000` (`rw-`), and read -permission for the group `mygroup` as well as all other users (`r--` and -`r--`). - -The next entry is `Project_GoldenDragon`. We see it is a directory -because the line begins with a `d`. It also has read, write, and execute -permission for the `vsc40000` user (`rwx`). So that user can look into the -directory and add or remove files. Users in the `mygroup` can also look -into the directory and read the files. But they can't add or remove -files (`r-x`). Finally, other users can read files in the directory, but -other users have no permissions to look in the directory at all (`---`). - -Maybe we have a colleague who wants to be able to add files to the -directory. We use `chmod` to change the modifiers to the directory to +We use `chmod` to change the modifiers to the directory to let people in the group write to the directory:
$ chmod g+w Project_GoldenDragon
 $ ls -l
@@ -193,12 +165,13 @@ $ ls -lh myfile.gz
 -rw-r--r--. 1 vsc40000 vsc40000 1.1M Dec 2 11:14 myfile.gz
 
-Note: if you zip a file, the original file will be removed. If you unzip -a file, the compressed file will be removed. To keep both, we send the -data to `stdout` and redirect it to the target file: -
$ gzip -c myfile > myfile.gz
-$ gunzip -c myfile.gz > myfile
-
+!!! note + If you zip a file, the original file will be removed. If you unzip + a file, the compressed file will be removed. To keep both, we send the + data to `stdout` and redirect it to the target file: +
$ gzip -c myfile > myfile.gz
+    $ gunzip -c myfile.gz > myfile
+    
### "zip" and "unzip" @@ -252,26 +225,54 @@ you remember: ## Exercises -1. Create a subdirectory in your home directory named `test` containing - a single, empty file named `one.txt`. - -2. Copy `/etc/hostname` into the `test` directory and then check what's - in it. Rename the file to `hostname.txt`. - -3. Make a new directory named `another` and copy the entire `test` - directory to it. `another/test/one.txt` should then be an empty - file. - -4. Remove the `another/test` directory with a single command. - -5. Rename `test` to `test2`. Move `test2/hostname.txt` to your home - directory. - -6. Change the permission of `test2` so only you can access it. - -7. Create an empty job script named `job.sh`, and make it executable. -8. gzip `hostname.txt`, see how much smaller it becomes, then unzip it - again. +??? abstract "Create a subdirectory in your home directory named `test` containing a single, empty file named `one.txt`." + ```bash + mkdir ~/test + touch ~/test/one.txt + ``` + +??? abstract "Copy `/etc/hostname` into the `test` directory and then check what's in it. Rename the file to `hostname.txt`." + ```bash + cp /etc/hostname ~/test/ + cat ~/test/hostname + mv ~/test/hostname ~/test/hostname.txt + ``` + +??? abstract "Make a new directory named `another` and copy the entire `test` directory to it. `another/test/one.txt` should then be an empty file." + ```bash + mkdir ~/another + cp -r ~/test ~/another/ + ``` + +??? abstract "Remove the `another/test` directory with a single command." + ```bash + rm -r ~/another/test + ``` + +??? abstract "Rename `test` to `test2`. Move `test2/hostname.txt` to your home directory." + ```bash + mv ~/test ~/test2 + mv ~/test2/hostname.txt ~/ + ``` + +??? abstract "Change the permission of `test2` so only you can access it." + ```bash + chmod u+rwx ~/test2 # Add read, write, and execute permissions for the user (owner) + chmod go-rwx ~/test2 # Remove read, write, and execute permissions for the group and others + ``` + +??? abstract "Create an empty job script named `job.sh`, and make it executable." + ```bash + touch ~/job.sh + chmod +x ~/job.sh + ``` + +??? abstract "gzip `hostname.txt`, see how much smaller it becomes, then unzip it again." + ```bash + gzip ~/hostname.txt + ls -lh ~/hostname.txt.gz + gunzip ~/hostname.txt.gz + ``` The next [chapter](uploading_files.md) is on uploading files, especially important when using HPC-infrastructure. diff --git a/mkdocs/docs/HPC/linux-tutorial/navigating.md b/mkdocs/docs/HPC/linux-tutorial/navigating.md index 81d533f3da4..05456d6d1ce 100644 --- a/mkdocs/docs/HPC/linux-tutorial/navigating.md +++ b/mkdocs/docs/HPC/linux-tutorial/navigating.md @@ -8,7 +8,7 @@ This chapter serves as a guide to navigating within a Linux shell. ## The current directory -To print the current directory, use the `pwd` (**p**rint **w**orking **d**irectory) command: +To print the current directory, use `pwd` (**p**rint **w**orking **d**irectory) command: ```bash $ pwd @@ -136,31 +136,6 @@ $ file some_directory some_directory: directory -## Permissions - -Each file and directory has particular *permissions* set on it, which -can be queried using `ls -l`. - -For example: - -``` -$ ls -l afile.txt --rwxrw-r-- 1 vsc40000 agroup 2929176 Apr 12 13:29 afile.sh -``` - -Here, the output `-rwxrw-r--` indicates the permissions of the file. It can be broken down into 4 parts: - -| type | permissions user | permissions group | permissions others | -|------------------------------------|-------------------------------|-----------------------|--------------------| -| `-`: is a file (`d` for directory) | `rwx`: can read/write/execute | `rw-`: can read/write | `r--`: can read | - -In this example, the file `afile.sh` is a regular file, and the owner `vsc40000` has read/write/execute permissions, -users in the group `agroup` have read/write permissions, -and all others only have read permissions. - -The default permission settings for new files/directories are determined -by the so-called *umask* setting, and are by default `rw-rw-r--` for files and `rwxrwxr-x` for directories. - ## Finding files/directories: "find" `find` will crawl a series of directories and lists files matching given @@ -190,7 +165,7 @@ For more advanced uses of the `find` command, use `man find` to display its **ma ## Exercises -??? question "Go to `/tmp`, then back to your home directory. How many different ways to do this can you come up with?" +??? abstract "Go to `/tmp`, then back to your home directory. How many different ways to do this can you come up with?" Some ways to go from the home directory to `/tmp` and back are: @@ -218,7 +193,7 @@ For more advanced uses of the `find` command, use `man find` to display its **ma $ cd $HOME ``` -??? question "When was your home directory last changed?" +??? abstract "When was your home directory last changed?" To find out when your home directory was last changed, you can use the `ls` command, along with the `-l` flag to get a detailed listing and the `-a` flag to list hidden files: @@ -232,7 +207,7 @@ For more advanced uses of the `find` command, use `man find` to display its **ma Here, `.` denotes the home directory. The directory was last changed on April 12th at 13:11. -??? question "What is the name of the last changed file in `/tmp`?" +??? abstract "What is the name of the last changed file in `/tmp`?" The output of the `ls -lt /tmp` command will sort the files in `/tmp` by the time of last change. Check the first letter of the line to determine if it is a file (`-`) or a directory (`d`). From f6c1de121c86291f7dbb34d48b2e3a058e23b9d3 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Mon, 15 Jul 2024 14:59:18 +0200 Subject: [PATCH 04/15] rework uploading files --- .../HPC/linux-tutorial/uploading_files.md | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/uploading_files.md b/mkdocs/docs/HPC/linux-tutorial/uploading_files.md index 5df09b24f32..0cf4252e925 100644 --- a/mkdocs/docs/HPC/linux-tutorial/uploading_files.md +++ b/mkdocs/docs/HPC/linux-tutorial/uploading_files.md @@ -85,8 +85,8 @@ a lot of distributions. For example, to copy a folder with lots of CSV files:
$ rsync -rzv testfolder vsc40000@login.hpc.ugent.be:data/
-will copy the folder `testfolder` and its contents to `$VSC_DATA` on the -, assuming the `data` symlink is present in your home directory, see +will copy the folder `testfolder` and its contents to `$VSC_DATA`, +assuming the `data` symlink is present in your home directory, see [symlinks section](uploading_files.md#symlinks-for-datascratch). The `-r` flag means "recursively", the `-z` flag means that compression @@ -106,10 +106,26 @@ See `man rsync` or for more information about rsync. ## Exercises -1. Download the file `/etc/hostname` to your local computer. -2. Upload a file to a subdirectory of your personal `$VSC_DATA` space. +??? abstract "Download the file `/etc/hostname` to your local computer." + ```bash + rsync -rzv vsc40000@login.hpc.ugent.be:/etc/hostname local_folder + ``` -3. Create a file named `hello.txt` and edit it using `nano`. + Don't forget to change `vsc40000` to your own username. + +??? abstract "Upload a file to a subdirectory of your personal `$VSC_DATA` space." + ```bash + rsync -rzv testfolder vsc40000@login.hpc.ugent.be:$VSC_DATA/subdirectory/ + ``` + + Don't forget to change `vsc40000` to your own username. + +??? abstract "Create a file named `hello.txt` and edit it using `nano`." + ```bash + touch hello.txt + nano hello.txt + ``` + The `touch` command creates a new file named `hello.txt`, and the `nano` command opens this file in the nano editor for editing. Now you have a basic understanding, see next [chapter](beyond_the_basics.md) for some more in depth concepts. From 0814b20c19dde4765521ba766b44198e23e58060 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Mon, 15 Jul 2024 15:55:55 +0200 Subject: [PATCH 05/15] added solutions to exercises --- .../HPC/linux-tutorial/beyond_the_basics.md | 54 +++++++++++++------ 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md b/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md index ca3f916a8be..5feed471a96 100644 --- a/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md +++ b/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md @@ -83,7 +83,7 @@ For example, to see the number of files in a directory, we can pipe the (`stdout`) output of `ls` to `wc` (**w**ord **c**ount, but can also be used to count the number of lines with the `-l` flag).
$ ls | wc -l
-    42
+42
 
A common pattern is to pipe the output of a command to `less` so you @@ -521,25 +521,45 @@ overwrite any pragmas present in the script. ## Exercises -1. Create a file that contains this message: "Hello, I am <user>", - where `` is replaced by your username. Don't cheat by using an - editor, use a command to create the file. -2. Use another command to add this line to the same file: "I am on - system <hostname> in directory <current directory>". Words - between `<>` should be replaced with their value (hint: use - environment variables). +??? abstract "Create a file `hello.txt` that contains this message: 'Hello, I am [user]'" + ```bash + echo "Hello, I am $USER" > hello.txt + ``` -3. How many files and directories are in `/tmp`? +??? abstract "Use another command to add this line to the same file: 'I am on system [hostname] in directory [current directory]'" + ```bash + echo "I am on system $(hostname) in directory $(pwd)" >> hello.txt + ``` -4. What's the name of the 5th file/directory in alphabetical order in - `/tmp`? +??? abstract "How many files and directories are in /tmp?" + ```bash + ls /tmp | wc -l + ``` -5. List all files that start with `t` in `/tmp`. +??? abstract "What's the name of the 5th file/directory in alphabetical order in /tmp?" + ```bash + ls /tmp | sort | head -5 | tail -1 + ``` -6. Create a file containing "My home directory <home> is available - using $HOME". `` should be replaced with your home directory, - but `$HOME` should remain as-is. +??? abstract "List all files that start with 't' in /tmp." + ```bash + ls /tmp/t* + ``` -7. How many processes are you currently running? How many are you - allowed to run? Where are they coming from? +??? abstract "Create a file containing 'My home directory is available using $HOME'." + ```bash + echo "My home directory $HOME is available using \$HOME" > home_info.txt + ``` + +??? abstract "How many processes are you currently running? How many are you allowed to run? Where are they coming from?" + ```bash + echo "Number of processes currently running:" + ps -u $USER | wc -l + + echo "Maximum number of processes allowed:" + ulimit -u + + echo "Processes currently running:" + ps -u $USER + ``` \ No newline at end of file From 87022950e302d4c24a9eed180729d5fd474206ea Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Tue, 16 Jul 2024 12:11:45 +0200 Subject: [PATCH 06/15] fixed titles, added notes and tips and added solutions to exercises --- .../HPC/linux-tutorial/getting_started.md | 143 ++++++++---------- 1 file changed, 60 insertions(+), 83 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/getting_started.md b/mkdocs/docs/HPC/linux-tutorial/getting_started.md index 735194999c1..9ab20757c0f 100644 --- a/mkdocs/docs/HPC/linux-tutorial/getting_started.md +++ b/mkdocs/docs/HPC/linux-tutorial/getting_started.md @@ -1,23 +1,11 @@ -Getting Started -=============== - -Logging in ----------- +# Getting Started To get started with the HPC-UGent infrastructure, you need to obtain a -VSC account, see [HPC manual](../account.md). -**Keep in mind that you must keep your private key to yourself!** - -You can look at your public/private key pair as a lock and a key: you -give us the lock (your public key), we put it on the door, and then you -can use your key to open the door and get access to the HPC -infrastructure. **Anyone who has your key can use your VSC account!** - +VSC account, see [HPC manual](../account.md). Details on connecting to the HPC infrastructure are available in [HPC manual connecting section](../connecting.md). -Getting help ------------- +## Getting help To get help: @@ -42,8 +30,7 @@ carefully and try to act on it. Try googling the error first to find any possible solution, but if you can't come up with something in 15 minutes, don't hesitate to mail {{hpcinfo}}. -Basic terminal usage --------------------- +## Basic terminal usage The basic interface is the so-called shell prompt, typically ending with `$` (for `bash` shells). @@ -77,11 +64,11 @@ If for any reason you want to stop a command from executing, press `Ctrl-C`. For example, if a command is taking too long, or you want to rerun it with different arguments. -Variables ---------- +## Variables + [//]: # (sec:environment-variables()) -At the prompt we also have access to shell variables, which have both a +At the prompt we also have access to *shell variables*, which have both a *name* and a *value*. They can be thought of as placeholders for things we need to remember. @@ -95,8 +82,6 @@ shell variable named `HOME`: This prints the value of this variable. -### Defining variables - There are several variables already defined for you when you start your session, such as `$HOME` which contains the path to your home directory. @@ -110,19 +95,27 @@ HOME=/user/home/gent/vsc400/vsc40000 ... +!!! info + In Linux, the pipe operator (`|`) is used to pass output from one command as input to another. + This is known as a pipeline. Here, `env | sort` will take the output of `env` and use it as the input for `sort`. + This can be extremely useful for chaining together commands and processing data. + You can also use the `grep` command to search for a piece of text. The following command will output all VSC-specific variable names and their values:
$ env | sort | grep VSC
-But we can also define our own. this is done with the `export` command -(note: variables are always all-caps as a convention): +### Defining variables + +It is also possible to define your own variables. this is done with the `export` command:
$ export MYVARIABLE="value"
-It is important you don't include spaces around the `=` sign. Also note -the lack of `$` sign in front of the variable name. + +!!! note + Notice the lack of the `$` sign and spaces around the `=` sign. + By convention, variables should be all-caps. If we then do
$ echo $MYVARIABLE
@@ -131,56 +124,11 @@ this will output `value`. Note that the quotes are not included, they were only used when defining the variable to escape potential spaces in the value. -#### Changing your prompt using `$PS1` - -You can change what your prompt looks like by redefining the -special-purpose variable `$PS1`. - -For example: to include the current location in your prompt: -
$ export PS1='\w $'
-~ $ cd test
-~/test $
-
- -Note that `~` is short representation of your home directory. - -To make this persistent across session, you can define this custom value -for `$PS1` in your `.profile` startup script: -
$ echo 'export PS1="\w $ " ' >> ~/.profile
- -### Using non-defined variables - -One common pitfall is the (accidental) use of non-defined variables. -Contrary to what you may expect, this does *not* result in error -messages, but the variable is considered to be *empty* instead. - -This may lead to surprising results, for example: -
$ export WORKDIR=/tmp/test
-$ pwd
-/user/home/gent/vsc400/vsc40000
-$ echo $HOME
-/user/home/gent/vsc400/vsc40000
-
- -To understand what's going on here, see the section on `cd` below. - -The moral here is: **be very careful to not use empty variables unintentionally**. - -**Tip for job scripts: use `set -e -u` to avoid using empty variables accidentally.** - -The `-e` option will result in the script getting stopped if any command -fails. - -The `-u` option will result in the script getting stopped if empty -variables are used. (see for a more -detailed explanation and more options) - -More information can be found at . ### Restoring your default environment If you've made a mess of your environment, you shouldn't waste too much -time trying to fix it. Just log out and log in again and you will be +time trying to fix it. Just log out and log in again, and you will be given a pristine environment. Basic system information @@ -205,20 +153,49 @@ Linux gligar01.gligar.os 2.6.32-573.8.1.el6.ug.x86_64 #1 SMP Mon Nov 16 15:12:09 -Exercises ---------- +## Exercises -- Print the full path to your home directory +??? abstract "Print the full path to your home directory" + ```bash + $ echo $HOME + ``` -- Determine the name of the environment variable to your personal - scratch directory +??? abstract "Determine the name of the environment variable to your personal scratch directory" + ```bash + $ env | grep SCRATCH + ``` -- What's the name of the system you're logged into? Is it the same for - everyone? +??? abstract "What's the name of the system you're logged into? Is it the same for everyone?" + ```bash + $ hostname + ``` + + Not everyone will be logged in to the same node, so the output will differ. + +??? abstract "Figure out how to print the value of a variable without including a newline" + + We can use the `man` command to find relevant information on the echo command with: -- Figure out how to print the value of a variable without including a - newline + ```bash + $ man echo + ``` -- How do you get help on using the `man` command? + We find the following line in the manual: + + ``` + -n do not output the trailing newline + ``` + + So we can use the `-n` flag to suppress the newline: + + ```bash + $ echo -n $HOME + ``` + +??? abstract "How do you get help on using the `man` command?" + + ```bash + $ man man + ``` -Next [chapter](navigating.md) teaches you on how to navigate. +Next [chapter](navigating.md) teaches you how to navigate the filesystem. From 92666313a3eee5a3373adaa53947fae38dbf79c6 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Tue, 16 Jul 2024 12:12:37 +0200 Subject: [PATCH 07/15] fixed typos and added note --- mkdocs/docs/HPC/linux-tutorial/navigating.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/navigating.md b/mkdocs/docs/HPC/linux-tutorial/navigating.md index 05456d6d1ce..16cee8fb18a 100644 --- a/mkdocs/docs/HPC/linux-tutorial/navigating.md +++ b/mkdocs/docs/HPC/linux-tutorial/navigating.md @@ -8,7 +8,7 @@ This chapter serves as a guide to navigating within a Linux shell. ## The current directory -To print the current directory, use `pwd` (**p**rint **w**orking **d**irectory) command: +To print the current directory, use the `pwd` (**p**rint **w**orking **d**irectory) command: ```bash $ pwd @@ -68,8 +68,6 @@ Some common options for `ls` are: -rw-rw-r-- 1 vsc40000 vsc40000 2157404 Apr 12 13:17 afile.txt drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory ``` - - To learn more about the meaning of this output, see [Permissions](#permissions) below. - printing the size information in human-readable form, using the `-h` flag: ``` @@ -90,6 +88,9 @@ Some common options for `ls` are: -rw-rw-r-- 1 vsc40000 vsc40000 0 Apr 12 13:11 .hidden_file.txt drwxrwxr-x 2 vsc40000 vsc40000 512 Apr 12 12:51 some_directory ``` + + !!! info + In Linux, files and directories starting with a `.` are considered hidden files. - ordering files by the most recent change using `-t`: From 8f02363e7610d83fe9af8e53202a97595a8a61ff Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Tue, 16 Jul 2024 12:13:50 +0200 Subject: [PATCH 08/15] fixed not rendering --- mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md b/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md index 5feed471a96..18ad425fa1c 100644 --- a/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md +++ b/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md @@ -547,7 +547,7 @@ overwrite any pragmas present in the script. ls /tmp/t* ``` -??? abstract "Create a file containing 'My home directory is available using $HOME'." +??? abstract "Create a file containing 'My home directory [home] is available using $HOME'." ```bash echo "My home directory $HOME is available using \$HOME" > home_info.txt ``` From 9c167770607b7fddf240fcb3541084cbc771b6ab Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Tue, 16 Jul 2024 12:14:24 +0200 Subject: [PATCH 09/15] fixed typo and added solutions to exercises --- .../HPC/linux-tutorial/hpc_infrastructure.md | 81 +++++++++++++++---- 1 file changed, 67 insertions(+), 14 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md b/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md index 764e42208f9..51c156e9990 100644 --- a/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md +++ b/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md @@ -18,7 +18,7 @@ scratch filesystems, which you can share with other members in the VO. Space is limited on the cluster's storage. To check your quota, see section [Pre-defined quota](../running_jobs_with_input_output_data.md#pre-defined-quotas). -To figure out where your quota is being spent, the `du` (isk sage) +To figure out where your quota is being spent, the `du` (**d**isk **u**sage) command can come in useful:
$ du -sh test
 59M test
@@ -59,16 +59,69 @@ Detailed information is available in section
 
 ## Exercises
 
-Create and submit a job script that computes the sum of 1-100 using
-Python, and prints the numbers to a *unique* output file in
-`$VSC_SCRATCH`.
-
-Hint: `python -c "print(sum(range(1, 101)))"`
-
--   How many modules are available for Python version 3.6.4?
--   How many modules get loaded when you load the `Python/3.6.4-intel-2018a` module?
--   Which `cluster` modules are available?
-
--   What's the full path to your personal home/data/scratch directories?
--   Determine how large your personal directories are.
--   What's the difference between the size reported by `du -sh $HOME` and by `ls -ld $HOME`?
+??? abstract "Create and submit a job script that computes the sum of 1-100 using Python, and prints the result to the standard output."
+    
+    We make the following job script:
+
+    ```bash title="jobscript.pbs"
+    #!/bin/bash
+    
+    # Basic parameters
+    #PBS -N sum_1_to_100      ## Job name
+    #PBS -l nodes=1:ppn=1     ## 1 node, 1 processor per node
+    #PBS -l walltime=00:00:15 ## Max time your job will run (no more than 72:00:00)
+    
+    module load Python/3.10.4-GCCcore-11.3.0
+    
+    cd $PBS_O_WORKDIR         # Change working directory to the location where the job was submmitted
+    
+    python -c "print(sum(range(1, 101)))"
+    ```
+
+    We optionally switch to a cluster of choice, for example `skitty`:
+
+    ```bashand prints the numbers to a *unique* output file in `$VSC_SCRATCH`.
+    $ module swap cluster/skitty
+    ```
+
+    We submit the job script:
+
+    ```bash
+    $ qsub jobscript.pbs
+    ```
+
+    after some time, two files (`sum_1_to_100.e[JOBID]` and `sum_1_to_100.o[JOBID]`) should appear.
+    The first one contains the error output, and is empty in this case. 
+    The second one contains the output of the Python command.
+
+
+??? abstract "How many modules are available for Python version 3.10?"
+        
+    We can use the `module avail` command to list all available modules.
+    To filter the list for Python 3.10, we can use `module avail Python/3.10`.
+
+    ```bash
+    $ module avail Python/3.10
+    ```
+
+??? abstract "How many modules get loaded when you load the `Python/3.10.4-GCCcore-11.3.0` module?"
+    
+    We can use the `module load` command to load the Python module.
+    After loading the module, we can use the `module list` command to list all loaded modules.
+    
+    ```bash
+    $ module load Python/3.10.4-GCCcore-11.3.0
+    $ module list
+    ```
+    
+    These are the modules the python module depends on.
+
+
+??? abstract "Which `cluster` modules are available?"
+    
+    We can use the `module avail` command to list all available modules.
+    To filter the list for modules with the name `cluster`, we can use `module avail cluster`.
+
+    ```bash
+    $ module avail cluster
+    ```

From 8fee50b44e52b304acd60e3a71e24487734048c0 Mon Sep 17 00:00:00 2001
From: Lukas Barragan Torres 
Date: Tue, 16 Jul 2024 12:16:02 +0200
Subject: [PATCH 10/15] moved section on empty env vars from getting_started to
 common_pitfalls

---
 .../HPC/linux-tutorial/common_pitfalls.md     | 23 +++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md b/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md
index 6dd0a8dccd5..4f10fafb0c4 100644
--- a/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md
+++ b/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md
@@ -49,6 +49,29 @@ But, this is tedious, and you can prevent errors by simply colouring
 within the lines and not using spaces in filenames.
 
 ### Missing/mistyped environment variables
+
+A common pitfall is the (accidental) use of non-defined variables.
+Contrary to what you may expect, this does *not* result in error
+messages, but the variable is considered to be *empty* instead.
+
+This may lead to surprising results, for example:
+
$ export WORKDIR=/tmp/test
+$ pwd
+/user/home/gent/vsc400/vsc40000
+$ echo $HOME
+/user/home/gent/vsc400/vsc40000
+
+ +!!! tip + For job scripts, use `set -e -u` to avoid using empty variables accidentally. + + The `-e` option will result in the script getting stopped if any command + fails. + + The `-u` option will result in the script getting stopped if empty + variables are used. (see for a more + detailed explanation and more options) + If you use a command like `rm -r` with environment variables you need to be careful to make sure that the environment variable exists. If you mistype an environment variable then it will resolve into a blank string. From a540e9753c0df5118ac0b3dd838743ecf75c1630 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Fri, 19 Jul 2024 15:12:50 +0200 Subject: [PATCH 11/15] remove confusing empty variable example --- mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md b/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md index 4f10fafb0c4..2ad2ea1ab93 100644 --- a/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md +++ b/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md @@ -54,14 +54,6 @@ A common pitfall is the (accidental) use of non-defined variables. Contrary to what you may expect, this does *not* result in error messages, but the variable is considered to be *empty* instead. -This may lead to surprising results, for example: -
$ export WORKDIR=/tmp/test
-$ pwd
-/user/home/gent/vsc400/vsc40000
-$ echo $HOME
-/user/home/gent/vsc400/vsc40000
-
- !!! tip For job scripts, use `set -e -u` to avoid using empty variables accidentally. From 8fb0f37e02045800012a34db875d542cd9f21588 Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres <63658577+lbarraga@users.noreply.github.com> Date: Mon, 19 Aug 2024 11:54:25 +0200 Subject: [PATCH 12/15] Merge branch 'main' into rewrite-linux-tutorial --- .../mpihello.pbs | 2 +- .../HPC-UGent-GPU-clusters/TensorFlow_GPU.sh | 2 +- .../Job-script-examples/multi_core.sh | 2 +- .../Job-script-examples/single_core.sh | 2 +- intro-HPC/examples/MATLAB/jobscript.sh | 2 +- .../mpi_hello.pbs | 2 +- .../examples/OpenFOAM/OpenFOAM_damBreak.sh | 4 +- .../Program-examples/04_MPI_C/mpihello.pbs | 2 +- mkdocs/docs/HPC/FAQ.md | 51 ++++- mkdocs/docs/HPC/MATLAB.md | 8 +- mkdocs/docs/HPC/alphafold.md | 8 +- mkdocs/docs/HPC/best_practices.md | 3 +- mkdocs/docs/HPC/checkpointing.md | 180 ------------------ mkdocs/docs/HPC/compiling_your_software.md | 10 +- .../HPC/fine_tuning_job_specifications.md | 22 ++- mkdocs/docs/HPC/gpu.md | 12 +- mkdocs/docs/HPC/interactive_debug.md | 2 +- .../HPC/linux-tutorial/getting_started.md | 84 ++++---- mkdocs/docs/HPC/linux-tutorial/navigating.md | 15 +- mkdocs/docs/HPC/multi_core_jobs.md | 13 +- mkdocs/docs/HPC/multi_job_submission.md | 23 ++- mkdocs/docs/HPC/only/gent/2023/shinx.md | 13 +- mkdocs/docs/HPC/openFOAM.md | 4 +- .../running_jobs_with_input_output_data.md | 32 ++-- .../docs/HPC/sites/gent/available-modules.md | 30 +-- mkdocs/docs/HPC/teaching_training.md | 15 +- mkdocs/docs/HPC/troubleshooting.md | 72 +++++-- mkdocs/docs/HPC/web_portal.md | 6 +- 28 files changed, 281 insertions(+), 340 deletions(-) delete mode 100644 mkdocs/docs/HPC/checkpointing.md diff --git a/intro-HPC/examples/Compiling-and-testing-your-software-on-the-HPC/mpihello.pbs b/intro-HPC/examples/Compiling-and-testing-your-software-on-the-HPC/mpihello.pbs index 9d4783308e9..47aeea0c757 100644 --- a/intro-HPC/examples/Compiling-and-testing-your-software-on-the-HPC/mpihello.pbs +++ b/intro-HPC/examples/Compiling-and-testing-your-software-on-the-HPC/mpihello.pbs @@ -12,6 +12,6 @@ cd $PBS_O_WORKDIR # load the environment module purge -module load intel +module load foss mpirun ./mpihello diff --git a/intro-HPC/examples/HPC-UGent-GPU-clusters/TensorFlow_GPU.sh b/intro-HPC/examples/HPC-UGent-GPU-clusters/TensorFlow_GPU.sh index ff4e2aa558c..52c8be06ba0 100644 --- a/intro-HPC/examples/HPC-UGent-GPU-clusters/TensorFlow_GPU.sh +++ b/intro-HPC/examples/HPC-UGent-GPU-clusters/TensorFlow_GPU.sh @@ -2,7 +2,7 @@ #PBS -l walltime=5:0:0 #PBS -l nodes=1:ppn=quarter:gpus=1 -module load TensorFlow/2.6.0-foss-2021a-CUDA-11.3.1 +module load TensorFlow/2.11.0-foss-2022a-CUDA-11.7.0 cd $PBS_O_WORKDIR python example.py diff --git a/intro-HPC/examples/Job-script-examples/multi_core.sh b/intro-HPC/examples/Job-script-examples/multi_core.sh index ce7426bff03..3a38689de0b 100644 --- a/intro-HPC/examples/Job-script-examples/multi_core.sh +++ b/intro-HPC/examples/Job-script-examples/multi_core.sh @@ -2,7 +2,7 @@ #PBS -N mpi_hello ## job name #PBS -l nodes=2:ppn=all ## 2 nodes, all cores per node #PBS -l walltime=2:00:00 ## max. 2h of wall time -module load intel/2017b +module load foss/2023a module load vsc-mympirun ## We don't use a version here, this is on purpose # go to working directory, compile and run MPI hello world cd $PBS_O_WORKDIR diff --git a/intro-HPC/examples/Job-script-examples/single_core.sh b/intro-HPC/examples/Job-script-examples/single_core.sh index f6ed99259e9..a406b09931d 100644 --- a/intro-HPC/examples/Job-script-examples/single_core.sh +++ b/intro-HPC/examples/Job-script-examples/single_core.sh @@ -2,7 +2,7 @@ #PBS -N count_example ## job name #PBS -l nodes=1:ppn=1 ## single-node job, single core #PBS -l walltime=2:00:00 ## max. 2h of wall time -module load Python/3.6.4-intel-2018a +module load Python/3.11.3-GCCcore-12.3.0 # copy input data from location where job was submitted from cp $PBS_O_WORKDIR/input.txt $TMPDIR # go to temporary working directory (on local disk) & run diff --git a/intro-HPC/examples/MATLAB/jobscript.sh b/intro-HPC/examples/MATLAB/jobscript.sh index 3a785317b70..849289c329a 100644 --- a/intro-HPC/examples/MATLAB/jobscript.sh +++ b/intro-HPC/examples/MATLAB/jobscript.sh @@ -7,7 +7,7 @@ # # make sure the MATLAB version matches with the one used to compile the MATLAB program! -module load MATLAB/2018a +module load MATLAB/2022b-r5 # use temporary directory (not $HOME) for (mostly useless) MATLAB log files # subdir in $TMPDIR (if defined, or /tmp otherwise) diff --git a/intro-HPC/examples/Multi-core-jobs-Parallel-Computing/mpi_hello.pbs b/intro-HPC/examples/Multi-core-jobs-Parallel-Computing/mpi_hello.pbs index 7101571d64d..ffb42b14fa7 100644 --- a/intro-HPC/examples/Multi-core-jobs-Parallel-Computing/mpi_hello.pbs +++ b/intro-HPC/examples/Multi-core-jobs-Parallel-Computing/mpi_hello.pbs @@ -11,6 +11,6 @@ cd $PBS_O_WORKDIR # load the environment -module load intel +module load foss mpirun ./mpi_hello diff --git a/intro-HPC/examples/OpenFOAM/OpenFOAM_damBreak.sh b/intro-HPC/examples/OpenFOAM/OpenFOAM_damBreak.sh index dab57a4cd33..ca1991e1a1e 100644 --- a/intro-HPC/examples/OpenFOAM/OpenFOAM_damBreak.sh +++ b/intro-HPC/examples/OpenFOAM/OpenFOAM_damBreak.sh @@ -2,7 +2,7 @@ #PBS -l walltime=1:0:0 #PBS -l nodes=1:ppn=4 # check for more recent OpenFOAM modules with 'module avail OpenFOAM' -module load OpenFOAM/6-intel-2018a +module load OpenFOAM/11-foss-2023a source $FOAM_BASH # purposely not specifying a particular version to use most recent mympirun module load vsc-mympirun @@ -15,7 +15,7 @@ export MYMPIRUN_VARIABLESPREFIX=WM_PROJECT,FOAM,MPI export WORKDIR=$VSC_SCRATCH_NODE/$PBS_JOBID # for single-node jobs mkdir -p $WORKDIR # damBreak tutorial, see also https://cfd.direct/openfoam/user-guide/dambreak -cp -r $FOAM_TUTORIALS/multiphase/interFoam/laminar/damBreak/damBreak $WORKDIR +cp -r $FOAM_TUTORIALS/incompressibleVoF/damBreakLaminar/damBreak $WORKDIR cd $WORKDIR/damBreak echo "working directory: $PWD" # pre-processing: generate mesh diff --git a/intro-HPC/examples/Program-examples/04_MPI_C/mpihello.pbs b/intro-HPC/examples/Program-examples/04_MPI_C/mpihello.pbs index c31d6002c5b..86e8e49271c 100644 --- a/intro-HPC/examples/Program-examples/04_MPI_C/mpihello.pbs +++ b/intro-HPC/examples/Program-examples/04_MPI_C/mpihello.pbs @@ -13,6 +13,6 @@ cd $PBS_O_WORKDIR # load the environment module purge -module load intel +module load foss mpirun ./mpihello diff --git a/mkdocs/docs/HPC/FAQ.md b/mkdocs/docs/HPC/FAQ.md index 398bd3e1e67..48e9d705c33 100644 --- a/mkdocs/docs/HPC/FAQ.md +++ b/mkdocs/docs/HPC/FAQ.md @@ -74,7 +74,7 @@ It is possible to use the modules without specifying a version or toolchain. How this will probably cause incompatible modules to be loaded. Don't do it if you use multiple modules. Even if it works now, as more modules get installed on the HPC, your job can suddenly break. -## Troubleshooting jobs +## Troubleshooting ### My modules don't work together @@ -226,6 +226,29 @@ information, see . {% endif %} + +### Why do I get a "No space left on device" error, while I still have storage space left? + +When trying to create files, errors like this can occur: + +```shell +No space left on device +``` + +The error "`No space left on device`" can mean two different things: + +- all available *storage quota* on the file system in question has been used; +- the *inode limit* has been reached on that file system. + +An *inode* can be seen as a "file slot", meaning that when the limit is reached, no more additional files can be created. +There is a standard inode limit in place that will be increased if needed. +The number of inodes used per file system can be checked on [the VSC account page](https://account.vscentrum.be). + +Possible solutions to this problem include cleaning up unused files and directories or +[compressing directories with a lot of files into zip- or tar-files](linux-tutorial/manipulating_files_and_directories.md#zipping-gzipgunzip-zipunzip). + +If the problem persists, feel free to [contact support](FAQ.md#i-have-another-questionproblem). + ## Other ### Can I share my account with someone else? @@ -350,6 +373,32 @@ See also: [Your UGent home drive and shares](running_jobs_with_input_output_data {% endif %} +### My home directory is (almost) full, and I don't know why + +Your home directory might be full without looking like it due to hidden files. +Hidden files and subdirectories have a name starting with a dot and do not show up when running `ls`. +If you want to check where the storage in your home directory is used, you can make use of the [`du` command](running_jobs_with_input_output_data.md#check-your-quota) to find out what the largest files and subdirectories are: + +```shell +du -h --max-depth 1 $VSC_HOME | egrep '[0-9]{3}M|[0-9]G' +``` + +The `du` command returns the size of every file and subdirectory in the $VSC_HOME directory. This output is then piped into an [`egrep`](linux-tutorial/beyond_the_basics.md#searching-file-contents-grep) to filter the lines to the ones that matter the most. + +The `egrep` command will only let entries that match with the specified regular expression `[0-9]{3}M|[0-9]G` through, which corresponds with files that consume more than 100 MB. + + +### How can I get more storage space? + + +[By default](running_jobs_with_input_output_data.md#quota) you get 3 GB of storage space for your home directory and 25 GB in your personal directories on both the data (`$VSC_DATA`) and scratch (`$VSC_SCRATCH`) filesystems. +It is not possible to expand the storage quota for these personal directories. + +You can get more storage space through a [Virtual Organisation (VO)](running_jobs_with_input_output_data.md#virtual-organisations), +which will give you access to the [additional directories](running_jobs_with_input_output_data.md#vo-directories) in a subdirectory specific to that VO (`$VSC_DATA_VO` and `$VSC_SCRATCH_VO`). +The moderators of a VO can [request more storage](running_jobs_with_input_output_data.md#requesting-more-storage-space) for their VO. + + ### Why can't I use the `sudo` command? When you attempt to use sudo, you will be prompted for a password. diff --git a/mkdocs/docs/HPC/MATLAB.md b/mkdocs/docs/HPC/MATLAB.md index e518dccf367..84109fe6b24 100644 --- a/mkdocs/docs/HPC/MATLAB.md +++ b/mkdocs/docs/HPC/MATLAB.md @@ -31,7 +31,7 @@ license, licenses would quickly run out. Compiling MATLAB code can only be done from the login nodes, because only login nodes can access the MATLAB license server, workernodes on -clusters can not. +clusters cannot. To access the MATLAB compiler, the `MATLAB` module should be loaded first. Make sure you are using the same `MATLAB` version to compile and @@ -93,7 +93,7 @@ with:
$ export _JAVA_OPTIONS="-Xmx64M"
 
-The MATLAB compiler spawns multiple Java processes, and because of the +The MATLAB compiler spawns multiple Java processes. Because of the default memory limits that are in effect on the login nodes, this might lead to a crash of the compiler if it's trying to create to many Java processes. If we lower the heap size, more Java processes will be able @@ -122,7 +122,7 @@ controlled via the `parpool` function: `parpool(16)` will use 16 workers. It's best to specify the amount of workers, because otherwise you might not harness the full compute power available (if you have too few workers), or you might negatively impact performance (if you have -too much workers). By default, MATLAB uses a fixed number of workers +too many workers). By default, MATLAB uses a fixed number of workers (12). You should use a number of workers that is equal to the number of cores @@ -163,7 +163,7 @@ You should remove the directory at the end of your job script: ## Cache location When running, MATLAB will use a cache for performance reasons. This -location and size of this cache can be changed trough the +location and size of this cache can be changed through the `MCR_CACHE_ROOT` and `MCR_CACHE_SIZE` environment variables. The snippet below would set the maximum cache size to 1024MB and the diff --git a/mkdocs/docs/HPC/alphafold.md b/mkdocs/docs/HPC/alphafold.md index 253cd895c70..9c502992620 100644 --- a/mkdocs/docs/HPC/alphafold.md +++ b/mkdocs/docs/HPC/alphafold.md @@ -96,9 +96,9 @@ export ALPHAFOLD_DATA_DIR={{directory}}/{{version}} ### Running AlphaFold -AlphaFold provides run script called [run_alphafold.py](https://raw.githubusercontent.com/deepmind/alphafold/main/run_alphafold.py) +AlphaFold provides a script called [run_alphafold.py](https://raw.githubusercontent.com/deepmind/alphafold/main/run_alphafold.py) -A symbolic link named *alphafold* that points to the this script is included, +A symbolic link named *alphafold* that points to this script is included, so you can just use `alphafold` instead of `run_alphafold.py` or `python run_alphafold.py` after loading the AlphaFold module. The `run_alphafold.py` script has also been slightly modified such that defining the `$ALPHAFOLD_DATA_DIR` (see [above](./#setting-up-the-environment)) is sufficient to pick up all the data provided in that location, @@ -158,7 +158,7 @@ This highlights the difference between CPU and GPU performance even more. The following example comes from the official [Examples section]({{readme}}#examples) in the Alphafold [README]({{readme}}). The run command is slightly different (see above: [Running AlphaFold](./running-alphafold)). -Do not forget to setup the environment (see above: [Setting up the environment](./setting-up-the-environment)). +Do not forget to set up the environment (see above: [Setting up the environment](./setting-up-the-environment)). ### Folding a monomer @@ -193,7 +193,7 @@ The main difference between using a GPU or CPU in a job script is what module to For running AlphaFold on GPU, use an AlphaFold module that mentions `CUDA` (or `cuda`), for example `AlphaFold/2.3.1-foss-2022a-CUDA-11.7.0`. -To run the jobs cripts you need to create a file named `T1050.fasta` with the following content: +To run the job scripts you need to create a file named `T1050.fasta` with the following content: ```fasta >T1050 A7LXT1, Bacteroides Ovatus, 779 residues| diff --git a/mkdocs/docs/HPC/best_practices.md b/mkdocs/docs/HPC/best_practices.md index 8b1aa11a52e..73b1c5e4f64 100644 --- a/mkdocs/docs/HPC/best_practices.md +++ b/mkdocs/docs/HPC/best_practices.md @@ -49,8 +49,7 @@ 9. Submit small jobs by grouping them together. See chapter [Multi-job submission](multi_job_submission.md) for how this is done. -10. The runtime is limited by the maximum walltime of the queues. For - longer walltimes, use checkpointing. +10. The runtime is limited by the maximum walltime of the queues. 11. Requesting many processors could imply long queue times. It's advised to only request the resources you'll be able to use. diff --git a/mkdocs/docs/HPC/checkpointing.md b/mkdocs/docs/HPC/checkpointing.md deleted file mode 100644 index e9843f57fdd..00000000000 --- a/mkdocs/docs/HPC/checkpointing.md +++ /dev/null @@ -1,180 +0,0 @@ -# Checkpointing { #ch:checkpointing} - -## Why checkpointing? - -If you want to run jobs that require wall time than the maximum wall -time per job and/or want to avoid you lose work because of power outages -or system crashes, you need to resort to checkpointing. - -## What is checkpointing? - -Checkpointing allows for running jobs that run for weeks or months, by -splitting the job into smaller parts (called subjobs) which are executed -consecutively. Each time a subjob is running out of requested wall time, -a snapshot of the application memory (and much more) is taken and -stored, after which a subsequent subjob will pick up the checkpoint and -continue. - -## How to use checkpointing? - -Using checkpointing is very simple: just use `csub` instead of `qsub` to -submit a job. - -The `csub` command creates a wrapper around your job script, to take -care of all the checkpointing stuff. - -In practice, you (usually) don't need to adjust anything, except for the -command used to submit your job. - -Checkpointing does not require any changes to the application you are -running, and should support most software. - -## Usage and parameters - -An overview of the usage and various command line parameters is given -here. - -### Submitting a job - -Typically, a job script is submitted with checkpointing support enabled -by running: - -::: prompt -csub -s job_script.sh -::: - -The `-s` flag specifies the job script to run. - -### Caveat: don't create local directories - -One important caveat is that the job script (or the applications run in -the script) should *not* create its own local temporary directories, -because those will not (always) be restored when the job is restarted -from checkpoint. - -### PBS directives - -Most PBS directives (`#PBS …` specified in the job script will be -ignored. There are a few exceptions however, i.e., `# PBS -N ` -(job name) and all `-l` directives (`# PBS -l`), e.g., `nodes`, `ppn`, -`vmem` (virtual memory limit), etc. Controlling other job parameters -(like requested walltime per sub-job) should be specified on the `csub` -command line. - -### Getting help - -Help on the various command line parameters supported by `csub` can be -obtained using `-h` or `--help`. - -### Local files (`–pre` / `–post`) - -The `--pre` and `--post` parameters control whether local files are -copied or not. The job submitted using `csub` is (by default) run on the -local storage provided by a particular workernode. Thus, no changes will -be made to the files on the shared storage. - -If the job script needs (local) access to the files of the directory -where `csub` is executed, `--pre` flag should be used. This will copy -all the files in the job script directory to the location where the job -script will execute. - -If the output of the job (`stdout`/`stderr`) that was run, or additional -output files created by the job in its working directory are required, -the `--post` flag should be used. This will copy the entire job working -directory to the location where `csub` was executed, in a directory -named `result.`. An alternative is to copy the interesting -files to the shared storage at the end of the job script. - -### Running on shared storage (`–shared`) - -If the job needs to be run on the shared storage, `--shared` should be -specified. You should enable this option by default, because it makes -the execution of the underlying `csub` script more robust: it doesn't -have to copy from/to the local storage on the workernode. When enabled, -the job will be run in a subdirectory of `$VSC_SCRATCH/chkpt`. All files -produced by the job will be in `$VSC_SCRATCH/chkpt//` while the -job is running. - -Note that if files in the directory where the job script is located are -required to run the job, you should also use `--pre`. - -### Job wall time (`–job_time`, `–chkpt_time`) - -To specify the requested wall time per subjob, use the `--job-time` -parameter. The default setting is 10 hours per (sub)job. Lowering this -will result in more frequent checkpointing, and thus more (sub)jobs. - -To specify the time that is reserved for checkpointing the job, use -`--chkpt_time`. By default, this is set to 15 minutes which should be -enough for most applications/jobs. *Don't change this unless you really -need to*. - -The total requested wall time per subjob is the sum of both `job_time` -and `chkpt_time`. - -If you would like to time how long the job executes, just prepend the -main command in your job script with the time command `time`, e.g.: - -::: prompt -time main_command -::: - -The `real` time will not make sense, as it will also include the time -passed between two checkpointed subjobs. However, the `user` time should -give a good indication of the actual time it took to run your command, -even if multiple checkpoints were performed. - -### Resuming from last checkpoint (`–resume`) - -The `--resume` option allows you to resume a job from the last available -checkpoint in case something went wrong (e.g., accidentally deleting a -(sub)job using `qdel`, a power outage or other system failure, ...). - -Specify the job name as returned after submission (and as listed in -`$VSC_SCRATCH/chkpt`). The full job name consists of the specified job -name (or the script name if no job name was specified), a timestamp and -two random characters at the end, for example `my_job_name._133755.Hk` -or `script.sh._133755.Hk`. - -Note: When resuming from checkpoint, you can change the wall time -resources for your job using the `--job_time` and `--chkpt_time` -options. This should allow you to continue from the last checkpoint in -case your job crashed due to an excessively long checkpointing time. - -In case resuming fails for you, please contact , and include the output -of the `csub --resume` command in your message. - -## Additional options - -### Array jobs (`-t`) - -`csub` has support for checkpointing array jobs with the `-t ` -flag on the `csub` command line. This behaves the same as `qsub`, see . - -### Pro/epilogue mimicking (`–no_mimic_pro_epi`) - -The option `--no_mimic_pro_epi` disables the workaround currently -required to resolve a permissions problem when using actual Torque -prologue/epilogue scripts. Don't use this option unless you really know -what you are doing. - -### Cleanup checkpoints (`–cleanup_after_restart`) - -Specifying this option will make the wrapper script remove the -checkpoint files after a successful job restart. This may be desirable -in cause you are short on storage space. - -Note that we don't recommend setting this option, because this way you -won't be able to resume from the last checkpoint when something goes -wrong. It may also prevent the wrapper script from reattempting to -resubmit a new job in case an infrequent known failure occurs. So, don't -set this unless you really need to. - -### No cleanup after job completion (`–no_cleanup_chkpt`) - -Specifying this option will prevent the wrapper script from cleaning up -the checkpoints and related information once the job has finished. This -may be useful for debugging, since this also preserves the -`stdout`/`stderr` of the wrapper script. - -*Don't set this unless you know what you are doing*. diff --git a/mkdocs/docs/HPC/compiling_your_software.md b/mkdocs/docs/HPC/compiling_your_software.md index 018565bb817..c01b1b7ef88 100644 --- a/mkdocs/docs/HPC/compiling_your_software.md +++ b/mkdocs/docs/HPC/compiling_your_software.md @@ -9,7 +9,7 @@ compiled for {{operatingsystem}}. It also means that you first have to install a required external software packages on the {{hpc}}. Most commonly used compilers are already pre-installed on the {{hpc}} and can be -used straight away. Also many popular external software packages, which +used straight away. Also, many popular external software packages, which are regularly used in the scientific community, are also pre-installed. ## Check the pre-installed software on the {{hpc}} @@ -127,9 +127,11 @@ We first need to compile this C-file into an executable with the gcc-compiler. First, check the command line options for *"gcc" (GNU C-Compiler)*, then -we compile and list the contents of the directory again: +we compile. the `O2` option enables a moderate level of optimization when compiling the code. +It instructs the compiler to optimize the code for better performance without significantly increasing compilation time. +Finally, list the contents of the directory again:
$ gcc -help
-$ gcc -o hello hello.c
+$ gcc -O2 -o hello hello.c
 $ ls -l
 total 512
 -rwxrwxr-x 1 {{userid}} 7116 Sep 16 11:43 hello*
@@ -149,7 +151,7 @@ compilation process, even if they seem unimportant so that a code change
 that produces a warning does not go unnoticed.
 
 Let's test this program on the local compute node, which is at your
-disposal after the "qsub --I" command:
+disposal after the `qsub --I` command:
 
$ ./hello
 Hello #0
 Hello #1
diff --git a/mkdocs/docs/HPC/fine_tuning_job_specifications.md b/mkdocs/docs/HPC/fine_tuning_job_specifications.md
index e9629915fea..fa6849ceae1 100644
--- a/mkdocs/docs/HPC/fine_tuning_job_specifications.md
+++ b/mkdocs/docs/HPC/fine_tuning_job_specifications.md
@@ -14,7 +14,7 @@ can slow down the run time of your application, but also block {{hpc}} resources
 for other users.
 
 Specifying the "optimal" Job Parameters requires some knowledge of your
-application (e.g., how many parallel threads does my application uses,
+application (e.g., how many parallel threads does my application use,
 is there a lot of inter-process communication, how much memory does my
 application need) and also some knowledge about the {{hpc}} infrastructure
 (e.g., what kind of multi-core processors are available, which nodes
@@ -78,7 +78,7 @@ taken to be on the safe side.
 
 It is also wise to check the walltime on different compute nodes or to
 select the "slowest" compute node for your walltime tests. Your estimate
-should appropriate in case your application will run on the "slowest"
+should be appropriate in case your application will run on the "slowest"
 (oldest) compute nodes.
 
 The walltime can be specified in a job scripts as:
@@ -184,7 +184,7 @@ Whereby:
 3.  The third column shows the memory utilisation, expressed in
     percentages of the full available memory. At full memory
     consumption, 19.2% of the memory was being used by our application.
-    With the *"free"* command, we have previously seen that we had a
+    With the `free` command, we have previously seen that we had a
     node of 16 GB in this example. 3 GB is indeed more or less 19.2% of
     the full available memory.
 4.  The fourth column shows you the CPU utilisation, expressed in
@@ -240,7 +240,7 @@ htop
     horizontally to see all processes and their full command lines.
 
 
$ top
-$ htot
+$ htop
### Setting the memory parameter {: #pbs_mem } @@ -295,7 +295,7 @@ are working at full load. The number of core and nodes that a user shall request fully depends on the architecture of the application. Developers design their -applications with a strategy for parallelisation in mind. The +applications with a strategy for parallelization in mind. The application can be designed for a certain fixed number or for a configurable number of nodes and cores. It is wise to target a specific set of compute nodes (e.g., Westmere, Harpertown) for your computing @@ -328,9 +328,10 @@ processor : 5 processor : 6 processor : 7
-Remark: Unless you want information of the login nodes, you'll have to issue -these commands on one of the workernodes. This is most easily achieved -in an interactive job, see the chapter on Running interactive jobs. +!!! note + Unless you want information of the login nodes, you'll have to issue + these commands on one of the workernodes. This is most easily achieved + in an interactive job, see [the chapter on Running interactive jobs](./running_interactive_jobs.md). In order to specify the number of nodes and the number of processors per node in your job script, use: @@ -515,9 +516,10 @@ The **uptime** command will show us the average load 10:14:05 up 86 days, 12:01, 11 users, load average: 0.60, 0.41, 0.41
-Now, start a few instances of the "*eat_cpu*" program in the background, +Now, compile and start a few instances of the "*eat_cpu*" program in the background, and check the effect on the load again: -
$ ./eat_cpu&
+
$ gcc -O2 eat_cpu.c -o eat_cpu
+$ ./eat_cpu&
 $ ./eat_cpu&
 $ ./eat_cpu&
 $ uptime
diff --git a/mkdocs/docs/HPC/gpu.md b/mkdocs/docs/HPC/gpu.md
index e70b13ce1b5..53f4ab1ea09 100644
--- a/mkdocs/docs/HPC/gpu.md
+++ b/mkdocs/docs/HPC/gpu.md
@@ -40,14 +40,14 @@ There are 2 main ways to ask for GPUs as part of a job:
     specified via `ppn`) using `-l nodes=X:ppn=Y:gpus=Z` (where the
     `ppn=Y` is optional), or as a separate resource request (similar to
     the amount of memory) via `-l gpus=Z`. Both notations give exactly
-    the same result. The `-l gpus=Z` is convenient is you only need one
+    the same result. The `-l gpus=Z` is convenient if you only need one
     node and you are fine with the default number of cores per GPU. The
     `-l nodes=...:gpus=Z` notation is required if you want to run with
     full control or in multinode cases like MPI jobs. If you do not
     specify the number of GPUs by just using `-l gpus`, you get by
     default 1 GPU.
 
--   As a resource of it's own, via `--gpus X`. In this case however, you
+-   As a resource of its own, via `--gpus X`. In this case however, you
     are *not* guaranteed that the GPUs are on the same node, so your
     script or code must be able to deal with this.
 
@@ -61,7 +61,7 @@ There are 2 main ways to ask for GPUs as part of a job:
 %  need to be processed or increasing the MPI ranks gives a speedup (e.g. when there is a significant portion of CPU work in the code).
 %  Unfortunately, this is not a silver bullet, and might require some experimenting to found out any potential benefits and proper tuning.
 %  TODO: how can a user now that an application is not using the full gpu resources?
-%  TODO this needs testing and there are some constraints (eg one mps job per node and thus one user per node using MPS)
+%  TODO this needs testing and there are some constraints (e.g. one mps job per node and thus one user per node using MPS)
 %  TODO needs proper integration with mypmirun / wurker
 %  TODO add separate section on MPS -->
 
@@ -86,7 +86,7 @@ Some important attention points:
     the MPI tasks, and is different from the usual `mpirun` that is used
     by the `mympirun` wrapper). At some later point, we *might* promote
     the `mypmirun` tool or rename it, to avoid the confusion in the
-    naming).
+    naming.
 
 -   Sharing GPUs requires MPS. The Slurm built-in MPS does not really do
     want you want, so we will provide integration with `mypmirun` and
@@ -95,7 +95,7 @@ Some important attention points:
 -   For parallel work, we are working on a `wurker` wrapper from the
     `vsc-mympirun` module that supports GPU placement and MPS, without
     any limitations wrt the requested resources (i.e. also support the
-    case where GPUs are spread heterogenous over nodes from using the
+    case where GPUs are spread heterogeneous over nodes from using the
     `--gpus Z` option).
 
 -   Both `mypmirun` and `wurker` will try to do the most optimised
@@ -133,7 +133,7 @@ Please consult `module avail Horovod` for a list of installed versions.
 
 Horovod supports TensorFlow, Keras, PyTorch and MxNet (see
 ), but should be run as an MPI
-application with `mypmirun`. (Horovod also provides it's own wrapper
+application with `mypmirun`. (Horovod also provides its own wrapper
 `horovodrun`, not sure if it handles placement and others correctly).
 
 At least for simple TensorFlow benchmarks, it looks like Horovod is a
diff --git a/mkdocs/docs/HPC/interactive_debug.md b/mkdocs/docs/HPC/interactive_debug.md
index 62e611e7178..11b3a84dfaf 100644
--- a/mkdocs/docs/HPC/interactive_debug.md
+++ b/mkdocs/docs/HPC/interactive_debug.md
@@ -4,7 +4,7 @@
 
 The purpose of this cluster is to give the user an environment where
 there should be no waiting in the queue to get access to a limited
-number of resources. This environment allows a user to immediatelty
+number of resources. This environment allows a user to immediately
 start working, and is the ideal place for interactive work such as
 development, debugging and light production workloads (typically
 sufficient for training and/or courses).
diff --git a/mkdocs/docs/HPC/linux-tutorial/getting_started.md b/mkdocs/docs/HPC/linux-tutorial/getting_started.md
index 9ab20757c0f..5273479f057 100644
--- a/mkdocs/docs/HPC/linux-tutorial/getting_started.md
+++ b/mkdocs/docs/HPC/linux-tutorial/getting_started.md
@@ -3,23 +3,21 @@
 To get started with the HPC-UGent infrastructure, you need to obtain a
 VSC account, see [HPC manual](../account.md). 
 Details on connecting to the HPC infrastructure are available in
-[HPC manual connecting section](../connecting.md).
 
 ## Getting help
 
 To get help:
 
-1.  use the documentation available on the system, through the `help`,
-    `info` and `man` commands (use `q` to exit).
+1.  use the documentation available on the system, through the
+    `help`, `info` and `man` commands (use `q` to exit).
+    ``` 
+    help cd 
+    info ls 
+    man cp 
     ```
-    help cd
-    info ls
-    man cp
-    ```
-
 2.  use Google
 
-3.  contact {{hpcinfo}} in case 
+3. contact {{hpcinfo}} in case
 of problems or questions (even for basic things!)
 
 ### Errors
@@ -28,29 +26,30 @@ Sometimes when executing a command, an error occurs. Most likely there
 will be error output or a message explaining you this. Read this
 carefully and try to act on it. Try googling the error first to find any
 possible solution, but if you can't come up with something in 15
-minutes, don't hesitate to mail {{hpcinfo}}.
+minutes, don't hesitate to mail 
+{{hpcinfo}}.
 
 ## Basic terminal usage
 
 The basic interface is the so-called shell prompt, typically ending with
 `$` (for `bash` shells).
 
-You use the shell by executing commands, and hitting ``. For
-example:
-
$ echo hello
-hello
-
+You use the shell by executing commands, and hitting +``. For example: +
$ echo hello 
+ hello 
-You can go to the start or end of the command line using `Ctrl-A` or -`Ctrl-E`. +You can go to the start or end of the command line using +`Ctrl-A` or `Ctrl-E`. -To go through previous commands, use `` and ``, rather than -retyping them. +To go through previous commands, use `` and +``, rather than retyping them. ### Command history A powerful feature is that you can "search" through your command -history, either using the `history` command, or using `Ctrl-R`: +history, either using the `history` command, or using +`Ctrl-R`:
$ history
     1 echo hello
 
@@ -61,13 +60,11 @@ history, either using the `history` command, or using `Ctrl-R`:
 ### Stopping commands
 
 If for any reason you want to stop a command from executing, press
-`Ctrl-C`. For example, if a command is taking too long, or you want to
-rerun it with different arguments.
+`Ctrl-C`. For example, if a command is taking too long, or
+you want to rerun it with different arguments.
 
 ## Variables
 
-[//]: # (sec:environment-variables())
-
 At the prompt we also have access to *shell variables*, which have both a
 *name* and a *value*.
 
@@ -76,24 +73,24 @@ They can be thought of as placeholders for things we need to remember.
 For example, to print the path to your home directory, we can use the
 shell variable named `HOME`:
 
-
$ echo $HOME
+
$ echo $HOME 
 /user/home/gent/vsc400/vsc40000
 
This prints the value of this variable. There are several variables already defined for you when you start your -session, such as `$HOME` which contains the path to your home directory. +session, such as `$HOME` which contains the path to your +home directory. For a full overview of defined environment variables in your current -session, you can use the `env` command. You can sort this output with -`sort` to make it easier to search in: +session, you can use the `env` command. You can sort this +output with `sort` to make it easier to search in: -
$ env | sort
-...
-HOME=/user/home/gent/vsc400/vsc40000
+
$ env | sort 
 ...
-
+HOME=/user/home/gent/vsc400/vsc40000 +...
!!! info In Linux, the pipe operator (`|`) is used to pass output from one command as input to another. @@ -117,13 +114,13 @@ It is also possible to define your own variables. this is done with the `export` Notice the lack of the `$` sign and spaces around the `=` sign. By convention, variables should be all-caps. -If we then do -
$ echo $MYVARIABLE
-this will output `value`. Note that the quotes are not included, they -were only used when defining the variable to escape potential spaces in -the value. +If we then do +
$ echo $MYVARIABLE
+this will output `value`. Note that the quotes are not +included, they were only used when defining the variable to escape +potential spaces in the value. ### Restoring your default environment @@ -131,22 +128,21 @@ If you've made a mess of your environment, you shouldn't waste too much time trying to fix it. Just log out and log in again, and you will be given a pristine environment. -Basic system information ------------------------- +## Basic system information Basic information about the system you are logged into can be obtained in a variety of ways. -We limit ourselves to determining the hostname: -
$ hostname
+We limit ourselves to determining the hostname: 
+
$ hostname 
 gligar01.gligar.os
 
-$ echo $HOSTNAME
-gligar01.gligar.os
+$ echo $HOSTNAME 
+gligar01.gligar.os 
 
And querying some basic information about the Linux kernel: -
$ uname -a
+
$ uname -a 
 Linux gligar01.gligar.os 2.6.32-573.8.1.el6.ug.x86_64 #1 SMP Mon Nov 16 15:12:09
     CET 2015 x86_64 x86_64 x86_64 GNU/Linux
 
diff --git a/mkdocs/docs/HPC/linux-tutorial/navigating.md b/mkdocs/docs/HPC/linux-tutorial/navigating.md index 16cee8fb18a..5ba6173489c 100644 --- a/mkdocs/docs/HPC/linux-tutorial/navigating.md +++ b/mkdocs/docs/HPC/linux-tutorial/navigating.md @@ -40,8 +40,8 @@ another location up or down the filesystem hierarchy. ## Listing files and directories: "ls" -A very basic and commonly used command is `ls`, which can be used to -list files and directories. +A very basic and commonly used command is `ls`, which can be +used to list files and directories. In its basic usage, it just prints the names of files and directories in the current directory. For example: @@ -130,17 +130,18 @@ $ pwd ## Inspecting files The `file` command can be used to inspect what type of file you're dealing with: +
$ file afile.txt
 afile.txt: ASCII text
 
-$ file some_directory
+$ file some_directory 
 some_directory: directory
 
## Finding files/directories: "find" -`find` will crawl a series of directories and lists files matching given -criteria. +`find` will crawl a series of directories and lists files +matching given criteria. For example, to look for the file named `one.txt` in the current directory and its subdirectories: @@ -214,5 +215,5 @@ For more advanced uses of the `find` command, use `man find` to display its **ma Check the first letter of the line to determine if it is a file (`-`) or a directory (`d`). The first line with `-` is the last changed file in `/tmp`. - -The [next](manipulating_files_and_directories.md) chapter will teach you how to interact with files and directories. +The [next](manipulating_files_and_directories.md) chapter will teach +you how to interact with files and directories. diff --git a/mkdocs/docs/HPC/multi_core_jobs.md b/mkdocs/docs/HPC/multi_core_jobs.md index f5754f69d73..9c527db4eae 100644 --- a/mkdocs/docs/HPC/multi_core_jobs.md +++ b/mkdocs/docs/HPC/multi_core_jobs.md @@ -1,4 +1,4 @@ -{% set exampledir = 'examples/Multi_core_jobs_Parallel_Computing' %} +{% set exampledir = 'examples/Multi-core-jobs-Parallel-Computing' %} # Multi core jobs/Parallel Computing @@ -110,7 +110,7 @@ MPI. This queues a job that claims 2 nodes and 10 cores. !!! warning - Just requesting more nodes and/or cores does mean that your job will automatically run faster. + Just requesting more nodes and/or cores does not mean that your job will automatically run faster. You can find more about this [here](troubleshooting.md#job_does_not_run_faster). ## Parallel Computing with threads @@ -153,6 +153,11 @@ Go to the example directory:
$ cd ~/{{ exampledir }}
 
+!!! note + If the example directory is not yet present, copy it to your home directory: + +
$ cp -r {{ examplesdir }} ~/
+ Study the example first:
-- T_hello.c --
@@ -453,7 +458,7 @@ and compile it:
mpiicc is a wrapper of the Intel C++ compiler icc to compile MPI -programs (see the chapter on compilation for details). +programs (see [the chapter on compilation](./compiling_your_software.md) for details). Run the parallel program: @@ -525,4 +530,4 @@ absolute amount of concurrency available. {% endif %} !!! tip -If you plan engaging in parallel programming using MPI, this book may prove useful: *Parallel Programming with MPI. Peter Pacheo. Morgan Kaufmann. 1996.* + If you plan engaging in parallel programming using MPI, this book may prove useful: *Parallel Programming with MPI. Peter Pacheo. Morgan Kaufmann. 1996.* diff --git a/mkdocs/docs/HPC/multi_job_submission.md b/mkdocs/docs/HPC/multi_job_submission.md index 3f8fa2c7f64..5177d79fa33 100644 --- a/mkdocs/docs/HPC/multi_job_submission.md +++ b/mkdocs/docs/HPC/multi_job_submission.md @@ -22,7 +22,7 @@ huge amounts of small jobs will create a lot of overhead, and can slow down the whole cluster. It would be better to bundle those jobs in larger sets. In TORQUE, an experimental feature known as "*job arrays*" existed to allow the creation of multiple jobs with one *qsub* command, -but is was not supported by Moab, the current scheduler. +but is not supported by Moab, the current scheduler. The "**Worker framework**" has been developed to address this issue. @@ -50,7 +50,7 @@ scenario that can be reduced to a **MapReduce** approach.[^1] First go to the right directory:
$ cd ~/examples/Multi-job-submission/par_sweep
-Suppose the program the user wishes to run the "*weather*" program, +Suppose the user wishes to run the "*weather*" program, which takes three parameters: a temperature, a pressure and a volume. A typical call of the program looks like:
$ ./weather -t 20 -p 1.05 -v 4.3
@@ -366,7 +366,7 @@ This will summarise the log file every 60 seconds.
 
 ### Time limits for work items
 
-Sometimes, the execution of a work item takes long than expected, or
+Sometimes, the execution of a work item takes longer than expected, or
 worse, some work items get stuck in an infinite loop. This situation is
 unfortunate, since it implies that work items that could successfully
 execute are not even started. Again, the Worker framework offers a
@@ -392,8 +392,7 @@ it can be used outside the Worker framework as well.
 
 ### Resuming a Worker job
 
-Unfortunately, it is not always easy to estimate the walltime for a job,
-and consequently, sometimes the latter is underestimated. When using the
+Unfortunately, walltime is sometimes underestimated. When using the
 Worker framework, this implies that not all work items will have been
 processed. Worker makes it very easy to resume such a job without having
 to figure out which work items did complete successfully, and which
@@ -456,6 +455,20 @@ specified:
 #                           command
 
+## Troubleshooting + +### Error: An ORTE daemon has unexpectedly failed after launch and before communicating back to mpirun + +When submitting a Worker job, you might encounter the following error: +`An ORTE daemon has unexpectedly failed after launch and before communicating back to mpirun`. +This error can occur when the foss toolchain version of worker is loaded. Instead, try loading an iimpi toolchain version of worker. + +to check for the available versions of worker, use the following command: + +```bash +$ module avail worker +``` + [^1]: MapReduce: 'Map' refers to the map pattern in which every item in a collection is mapped onto a new value by applying a given diff --git a/mkdocs/docs/HPC/only/gent/2023/shinx.md b/mkdocs/docs/HPC/only/gent/2023/shinx.md index 762ee8268af..daa770e8b69 100644 --- a/mkdocs/docs/HPC/only/gent/2023/shinx.md +++ b/mkdocs/docs/HPC/only/gent/2023/shinx.md @@ -15,8 +15,8 @@ For software installation requests, please use the [request form](https://www.ug `shinx` is a new CPU-only cluster. -It replaces `swalot`, which will be retired on **Wednesday 01 November 2023**, -and `victini`, which will be retired on **Monday 05 February 2024**. +It replaces `swalot`, which was retired on **Wednesday 01 November 2023**, +and `victini`, which ws retired on **Monday 05 February 2024**. It is primarily for regular CPU compute use. @@ -77,7 +77,7 @@ It is not recommended to always set this workaround, only for the specific tools --- -## Shinx pilot phase (23/10/2023-20/05/2024) +## Shinx pilot phase (23/10/2023-15/07/2024) As usual with any pilot phase, you need to be member of the `gpilot` group, and to start using this cluster run: @@ -111,7 +111,7 @@ As such, we will have an extended pilot phase in 3 stages: * Racking of last 16 nodes * Installation of NDR/NDR-200 infiniband network -### Stage 2 (19/04/2024-20/05/2024) +### Stage 2 (19/04/2024-15/07/2024) * Full size cluster * 48 nodes (no job size limit) @@ -123,6 +123,11 @@ As such, we will have an extended pilot phase in 3 stages: that period, and the testing of the `EL9` operating system will also take some time. +### Stage 3 (15/07/2024 - ) + +* Cluster in production using EL9 (starting with 9.4). Any user can now submit jobs. + + ### Using `doduo` software For benchmarking and/or compatibility testing, you can use try to use `doduo` software stack by adding diff --git a/mkdocs/docs/HPC/openFOAM.md b/mkdocs/docs/HPC/openFOAM.md index 09d04efe709..8f83201d6a4 100644 --- a/mkdocs/docs/HPC/openFOAM.md +++ b/mkdocs/docs/HPC/openFOAM.md @@ -138,7 +138,7 @@ it does not prevent that illegal operations (like a division by zero) are being executed; if `NaN` values appear in your results, floating point errors are occurring. -As such, **you should *not* use this in productions runs. Instead, you should track down the root cause of the floating +As such, **you should *not* use this in production runs. Instead, you should track down the root cause of the floating point errors, and try to prevent them from occurring at all. ## OpenFOAM workflow @@ -302,7 +302,7 @@ For modest OpenFOAM simulations where a single workernode suffices, consider using the local disk of the workernode as working directory (accessible via `$VSC_SCRATCH_NODE`), rather than the shared `$VSC_SCRATCH` filesystem. **Certainly do not use a subdirectory in `$VSC_HOME` or `$VSC_DATA`, since these shared filesystems are too slow -for these type of workloads. +for these types of workloads. {% if site == gent %} For large parallel OpenFOAM simulations on the {{university}} Tier-2 clusters, consider diff --git a/mkdocs/docs/HPC/running_jobs_with_input_output_data.md b/mkdocs/docs/HPC/running_jobs_with_input_output_data.md index fc2911996a1..c8393da45de 100644 --- a/mkdocs/docs/HPC/running_jobs_with_input_output_data.md +++ b/mkdocs/docs/HPC/running_jobs_with_input_output_data.md @@ -16,6 +16,12 @@ First go to the directory:
$ cd ~/{{ exampledir }}
 
+!!! note + If the example directory is not yet present, copy it to your home directory: + +
$ cp -r {{ examplesdir }} ~/
+ + List and check the contents with:
ls -l
@@ -299,7 +305,7 @@ scratch space instead.
 
 {% if site == gent %}
 If you are running out of quota on your
-_$VSC_DATA filesystem you can request a VO. See on how to do this.
+_$VSC_DATA filesystem you can join an existing VO, or request a new VO. See [the section about virtual organisations](./#virtual-organisations) on how to do this.
 {% endif %}
 
 ### Your scratch space ($VSC_SCRATCH)
@@ -324,9 +330,7 @@ Each type of scratch has its own use:
 **Node scratch ($VSC_SCRATCH_NODE).**   Every node has its own scratch space, which is completely separated
     from the other nodes. On some clusters, it will be on a local disk
     in the node, while on other clusters it will be emulated through
-    another file server. In many cases, it will be significantly slower
-    than the cluster scratch as it typically consists of just a single
-    disk. Some **drawbacks** are that the storage can only be accessed on that
+    another file server. Some **drawbacks** are that the storage can only be accessed on that
     particular node and that the capacity is often very limited (e.g.,
     100 GB). The performance will depend a lot on the particular
     implementation in the cluster. In many cases, it will be
@@ -429,7 +433,7 @@ needed:
 
If you get an error "*Unknown credential cache type while getting -default ccache*" (or similar) and you use , then please deactivate conda +default ccache*" (or similar) and you use conda, then please deactivate conda before you use the commands in this chapter.
$ conda deactivate
@@ -758,13 +762,14 @@ for a summary of the current directory:
 If you want to see the size of any file or top-level subdirectory in the
 current directory, you could use the following command:
 
-
$ du -s -h *
-1.5M ex01-matlab
-512K ex02-python
-768K ex03-python
-768K ex04-python
-256K example.sh
-1.5M intro-HPC.pdf
+
$ du -h --max-depth 1
+1.5M ./ex01-matlab
+512K ./ex02-python
+768K ./ex03-python
+768K ./ex04-python
+256K ./example.sh
+1.5M ./intro-HPC.pdf
+700M ./.cache
 
Finally, if you don't want to know the size of the data in your current @@ -773,11 +778,12 @@ just pass this directory as a parameter. The command below will show the disk use in your home directory, even if you are currently in a different directory: -
$ du -h $VSC_HOME/*
+
$ du -h --max-depth 1 $VSC_HOME
 22M {{ homedir }}/dataset01
 36M {{ homedir }}/dataset02
 22M {{ homedir }}/dataset03
 3.5M {{ homedir }}/primes.txt
+24M {{ homedir }}/.cache
 
{% if site == gent %} diff --git a/mkdocs/docs/HPC/sites/gent/available-modules.md b/mkdocs/docs/HPC/sites/gent/available-modules.md index d9c1770ad7f..13956ab2346 100644 --- a/mkdocs/docs/HPC/sites/gent/available-modules.md +++ b/mkdocs/docs/HPC/sites/gent/available-modules.md @@ -1,21 +1,21 @@ -
$ module av 2>&1 | more
---- /apps/gent/SL6/sandybridge/modules/all ---
-ABAQUS/6.12.1-linux-x86_64
-AMOS/3.1.0-ictce-4.0.10
-ant/1.9.0-Java-1.7.0_40
-ASE/3.6.0.2515-ictce-4.1.13-Python-2.7.3
-ASE/3.6.0.2515-ictce-5.5.0-Python-2.7.6
-...
+
$ module av | more
+--- /apps/gent/RHEL8/zen2-ib/modules/all ---
+   ABAQUS/2021-hotfix-2132
+   ABAQUS/2022-hotfix-2214
+   ABAQUS/2022
+   ABAQUS/2023
+   ABAQUS/2024-hotfix-2405                                                (D)
+   ...
 
Or when you want to check whether some specific software, some compiler or some application (e.g., MATLAB) is installed on the {{hpc}}. -
$ module av 2>&1 | grep -i -e "matlab"
-MATLAB/2010b
-MATLAB/2012b
-MATLAB/2013b
+
$ module av matlab
+--- /apps/gent/RHEL8/zen2-ib/modules/all ---
+   LIBSVM-MATLAB/3.30-GCCcore-11.3.0-MATLAB-2022b-r5
+   MATLAB/2019b
+   MATLAB/2021b
+   MATLAB/2022b-r5                                   (D)
+   SPM/12.5_r7771-MATLAB-2021b
 
- -As you are not aware of the capitals letters in the module name, we looked for -a case-insensitive name with the "-i" option. diff --git a/mkdocs/docs/HPC/teaching_training.md b/mkdocs/docs/HPC/teaching_training.md index 492198ddd37..d1c65b12ca9 100644 --- a/mkdocs/docs/HPC/teaching_training.md +++ b/mkdocs/docs/HPC/teaching_training.md @@ -64,7 +64,7 @@ as described in the [course data policy](./#course-data-policy): A _course group_ is created with all students or participants, and the teachers or trainers are the group moderators (and also member of this group). -This course group and the moderators group are used to manage the different priviliges: +This course group and the moderators group are used to manage the different privileges: moderators have additional privileges over non-moderator members e.g. they have read/write access in specific folders, can manage subgroups, .... @@ -140,7 +140,7 @@ Optionally, we can also create these folders: - each of these `group_<01>` folders are owned by a dedicated group - teachers are automatically made moderators of these dedicated groups - moderators can populate these groups with VSC-ids of group members in the VSC accountpage - or ask the students to invite themself via [group edit](https://account.vscentrum.be/django/group/edit). + or ask the students to invite themselves via [group edit](https://account.vscentrum.be/django/group/edit). When students invite them self, moderators still need to [approve the group invites](https://account.vscentrum.be/django/group/approve). - only these VSC-ids will then be able to access a `group_<01>` folder, and will have read/write access. @@ -158,7 +158,7 @@ There are 4 quota settings that you can choose in your _teaching request_ in the - overall quota (defaults *10 GB volume* and *20k files*) are for the moderators and can be used for e.g. the `input` folder. - member quota (defaults *5 GB volume* and *10k files*) are per student/participant -The course data usage is not accounted for the any other quota (like VO quota). It is solely dependant on these settings. +The course data usage is not accounted for any other quota (like VO quota). It is solely dependent on these settings. ### Course data policy @@ -176,7 +176,7 @@ We assume that your course requirements are such that the [interactive cluster]( If these resources are insufficient, you will need to request and motivate a reservation. Indicate which cluster you would need and the number of nodes, cores and/or GPUs. -Also clearly indicate when you would need these resources, i.e. the dates and times of each course session. +Also, clearly indicate when you would need these resources, i.e. the dates and times of each course session. Be aware that students will have no access to the reservation outside the course sessions. This might be relevant when requesting a custom application. @@ -213,12 +213,19 @@ It will appear in the `Interactive Apps` menu in the webportal, under the sectio After the indicated end date of your course, this application will be removed. If you would like this for your course, provide more details in your _teaching request_, including: + - what interactive application would you like to get launched (cluster desktop, Jupyter Notebook, ...) + - which cluster you want to use + - how many nodes/cores/GPUs are needed + - which software modules you are loading + - custom code you are launching (e.g. autostart a GUI) + - required environment variables that you are setting + - ... We will try to make the custom interactive application available before the start of your course/workshop, diff --git a/mkdocs/docs/HPC/troubleshooting.md b/mkdocs/docs/HPC/troubleshooting.md index de7e0d170e2..3ae43d5f8fb 100644 --- a/mkdocs/docs/HPC/troubleshooting.md +++ b/mkdocs/docs/HPC/troubleshooting.md @@ -10,7 +10,7 @@ More information on this in the subsections below. ### Using multiple cores When you want to speed up your jobs by requesting multiple cores, you also need to use software that is actually capable of using them (and use them efficiently, ideally). -Unless particular a parallel programming paradigm like [OpenMP](https://www.openmp.org/about/openmp-faq/#WhatIs) threading +Unless a particular parallel programming paradigm like [OpenMP](https://www.openmp.org/about/openmp-faq/#WhatIs) threading (shared memory) or [MPI](https://en.wikipedia.org/wiki/Message_Passing_Interface) (distributed memory) is used, software will run sequentially (on a single core). @@ -30,7 +30,7 @@ Other reasons why using more cores may not lead to a (significant) speedup inclu you should *not* expect that doubling the amount of cores will result in a 2x speedup. This is due to the fact that time is needed to create, manage and synchronize the threads/processes. When this "bookkeeping" overhead exceeds the time gained by parallelization, you will not observe any speedup (or even see slower runs). -For example, this can happen when you split you program in too many (tiny) tasks to run in parallel - +For example, this can happen when you split your program in too many (tiny) tasks to run in parallel - creating a thread/process for each task may even take longer than actually running the task itself. - **[Amdahl's Law](https://en.wikipedia.org/wiki/Amdahl%27s_law)** is often used in parallel computing to predict the maximum achievable (theoretical) speedup when using multiple cores. @@ -41,7 +41,7 @@ Regardless of how many cores are devoted to a parallelized execution of this pro So when you reach this theoretical limit, using more cores will not help at all to speed up the computational workload. - **Resource contention:** When two or more threads/processes want to access the same resource, they need to wait on each other - this is called resource contention. -As a result, 1 thread/process will need to wait until the other one is is finished using that resource. +As a result, 1 thread/process will need to wait until the other one is finished using that resource. When each thread uses the same resource, it will definitely run slower than if it doesn't need to wait for other threads to finish. - **Software limitations:** It is possible that the software you are using is just not really optimized for parallelization. @@ -71,7 +71,7 @@ This means that just changing `#PBS -l nodes=1:ppn=10` to `#PBS -l nodes=2:ppn=1 Actually using additional nodes is not as straightforward as merely asking for multiple nodes when submitting your job. The resources on these additional nodes often need to discovered, managed, and synchronized. This introduces complexities in distributing work effectively across the nodes. Luckily, there exist some libraries that do this for you. -Using the resources of multiple nodes is often done using an [Message Passing Interface (MPI)](https://en.wikipedia.org/wiki/Message_Passing_Interface) library. +Using the resources of multiple nodes is often done using a [Message Passing Interface (MPI)](https://en.wikipedia.org/wiki/Message_Passing_Interface) library. MPI allows nodes to communicate and coordinate, but it also introduces additional complexity. An example of how you can make beneficial use of multiple nodes can be found [here](multi_core_jobs.md#parallel-computing-with-mpi). @@ -91,7 +91,7 @@ you should check its documentation for instructions on how to run in parallel, or check for options that control how many threads/cores/nodes can be used. If you can not find any information along those lines, the software you are using can probably only use a single core -and thus requesting multiple cores and/or nodes will only result in wasted sources. +and thus requesting multiple cores and/or nodes will only result in wasted resources. ## Walltime issues @@ -104,9 +104,7 @@ If you get from your job output an error message similar to this: This occurs when your job did not complete within the requested walltime. See section on [Specifying Walltime](../fine_tuning_job_specifications/#specifying-walltime) for more information -about how to request the walltime. It is recommended to use -*checkpointing* if the job requires **72 hours** of walltime or more to be executed. - +about how to request the walltime. ## Out of quota issues @@ -136,7 +134,7 @@ If you have errors that look like: or you are experiencing problems with connecting, here is a list of things to do that should help: -1. Keep in mind that it an take up to an hour for your VSC account to +1. Keep in mind that it can take up to an hour for your VSC account to become active after it has been *approved*; until then, logging in to your VSC account will not work. @@ -267,7 +265,7 @@ and include it in the email. Follow the instructions in [Change PuTTY private key for a saved configuration](../troubleshooting/#change-putty-private-key-for-a-saved-configuration) util item 5, then: -1. Single click on the textbox containig the path to your private key, +1. Single click on the textbox containing the path to your private key, then select all text (push ++"Ctrl"++ + ++"a"++ ), then copy the location of the private key (push ++"Ctrl"++ + ++"c"++) @@ -343,7 +341,7 @@ line 21). To do that, open `~/.ssh/known_hosts` in an editor, and remove the line. This results in `ssh` "forgetting" the system you are connecting to. -Alternatively you can use the command that might shown by the warning under +Alternatively you can use the command that might be shown by the warning under `remove with:` and it should be something like this:
ssh-keygen -f "~/.ssh/known_hosts" -R "{{loginnode}}"
@@ -363,7 +361,7 @@ one of the following fingerprints:
 
 **Do not click "Yes" until you verified the fingerprint. Do not press "No" in any case.**
 
-If it the fingerprint matches, click "Yes".
+If the fingerprint matches, click "Yes".
 
 If it doesn't (like in the example) or you are in doubt, take a screenshot, press "Cancel" and contact {{ hpcinfo }}.
 
@@ -450,6 +448,12 @@ To avoid jobs allocating too much memory, there are memory limits in
 place by default. It is possible to specify higher memory limits if your
 jobs require this.
 
+!!! note
+
+    Memory is not the same as storage. Memory or RAM is used for temporary, 
+    fast access to data when the program is running, while storage is used for long-term data retention.
+    If you are running into problems because you reached your storage quota, see [Out of quota issues](#out-of-quota-issues).
+
 ### How will I know if memory limits are the cause of my problem?
 
 If your program fails with a memory-related issue, there is a good
@@ -475,13 +479,13 @@ memory you request.
 {% if site == gent %}
 ## Module conflicts
 
-Modules that are loaded together must use the same toolchain version: it
-is impossible to load two versions of the same module. In the following
+Modules that are loaded together must use the same toolchain version or common dependencies. In the following
 example, we try to load a module that uses the `intel-2018a` toolchain
 together with one that uses the `intel-2017a` toolchain:
 
-
$ module load Python/2.7.14-intel-2018a
-$ module load  HMMER/3.1b2-intel-2017a
+```bash
+$ module load Python/2.7.14-intel-2018a
+$ module load  HMMER/3.1b2-intel-2017a
 Lmod has detected the following error: A different version of the 'intel' module is already loaded (see output of 'ml'). 
 You should load another 'HMMER' module for that is compatible with the currently loaded version of 'intel'. 
 Use 'ml avail HMMER' to get an overview of the available versions.
@@ -493,14 +497,46 @@ While processing the following module(s):
     ---------------          ---------------
     HMMER/3.1b2-intel-2017a  /apps/gent/CO7/haswell-ib/modules/all/HMMER/3.1b2-intel-2017a.lua
 
+``` -This resulted in an error because we tried to load two different -versions of the `intel` module. +This resulted in an error because we tried to load two modules with different +versions of the `intel` toolchain. To fix this, check if there are other versions of the modules you want to load that have the same version of common dependencies. You can list all versions of a module with `module avail`: for `HMMER`, this command is `module avail HMMER`. +As a rule of thumb, toolchains in the same row are compatible with each other: + +| | | | | +|----------------|--------------------------|-------------------------|-------------| +| GCCcore-13.2.0 | GCC-13.2.0 | gfbf-2023b/gompi-2023b | foss-2023b | +| GCCcore-13.2.0 | intel-compilers-2023.2.1 | iimkl-2023b/iimpi-2023b | intel-2023b | +| GCCcore-12.3.0 | GCC-12.3.0 | gfbf-2023a/gompi-2023a | foss-2023a | +| GCCcore-12.3.0 | intel-compilers-2023.1.0 | iimkl-2023a/iimpi-2023a | intel-2023a | +| GCCcore-12.2.0 | GCC-12.2.0 | gfbf-2022b/gompi-2022b | foss-2022b | +| GCCcore-12.2.0 | intel-compilers-2022.2.1 | iimkl-2022b/iimpi-2022b | intel-2022b | +| GCCcore-11.3.0 | GCC-11.3.0 | gfbf-2022a/gompi-2022a | foss-2022a | +| GCCcore-11.3.0 | intel-compilers-2022.1.0 | iimkl-2022a/iimpi-2022a | intel-2022a | +| GCCcore-11.2.0 | GCC-11.2.0 | gfbf-2021b/gompi-2021b | foss-2021b | +| GCCcore-11.2.0 | intel-compilers-2021.4.0 | iimkl-2021b/iimpi-2021b | intel-2021b | +| GCCcore-10.3.0 | GCC-10.3.0 | gfbf-2021a/gompi-2021a | foss-2021a | +| GCCcore-10.3.0 | intel-compilers-2021.2.0 | iimkl-2021a/iimpi-2021a | intel-2021a | +| GCCcore-10.2.0 | GCC-10.2.0 | gfbf-2020b/gompi-2020b | foss-2020b | +| GCCcore-10.2.0 | iccifort-2020.4.304 | iimkl-2020b/iimpi-2020b | intel-2020b | + +!!! example + we could load the following modules together: + + ```bash + ml XGBoost/1.7.2-foss-2022a + ml scikit-learn/1.1.2-foss-2022a + ml cURL/7.83.0-GCCcore-11.3.0 + ml JupyterNotebook/6.4.0-GCCcore-11.3.0-IPython-8.5.0 + ``` + + + Another common error is:
$ module load cluster/{{othercluster}}
diff --git a/mkdocs/docs/HPC/web_portal.md b/mkdocs/docs/HPC/web_portal.md
index fff8a25b8e7..9c95a20f72d 100644
--- a/mkdocs/docs/HPC/web_portal.md
+++ b/mkdocs/docs/HPC/web_portal.md
@@ -132,7 +132,7 @@ Here you can:
         Dir*) in the current directory;
 
     -   upload files or directories from your local workstation into
-        your VSC account, in the currect directory (via *Upload*);
+        your VSC account, in the correct directory (via *Upload*);
 
     -   show hidden files and directories, of which the name starts with
         a dot (`.`) (via *Show Dotfiles*);
@@ -169,7 +169,7 @@ Here you can:
     -   use the *Delete* button to (**permanently!**) remove the selected files and
         directories;
 
-For more information, see aslo
+For more information, see also
 .
 
 ### Job management
@@ -220,7 +220,7 @@ create new jobs:
 This extensive interface allows you to create jobs from one of the
 available templates, or by copying an existing job.
 
-You can carefuly prepare your job and the corresponding job script via
+You can carefully prepare your job and the corresponding job script via
 the *Job Options* button and by editing the job script (see lower
 right).
 

From c72b4db5374b49317cfc8e812bd33366b4a38099 Mon Sep 17 00:00:00 2001
From: Lukas Barragan Torres 
Date: Thu, 5 Sep 2024 10:14:26 +0200
Subject: [PATCH 13/15] Merge main

---
 config/templates/hpc.template                 |    3 +
 intro-HPC/examples/MATLAB/jobscript.sh        |    1 -
 mkdocs/docs/HPC/FAQ.md                        |   28 +-
 mkdocs/docs/HPC/HOD.md                        |   34 +-
 mkdocs/docs/HPC/MATLAB.md                     |   62 +-
 mkdocs/docs/HPC/VNC.md                        |   64 +-
 mkdocs/docs/HPC/account.md                    |   50 +-
 mkdocs/docs/HPC/alphafold.md                  |   10 +-
 mkdocs/docs/HPC/apptainer.md                  |   30 +-
 mkdocs/docs/HPC/compiling_your_software.md    |  146 +-
 mkdocs/docs/HPC/connecting.md                 |  163 ++-
 mkdocs/docs/HPC/crontab.md                    |   23 +-
 mkdocs/docs/HPC/easybuild.md                  |   56 +-
 mkdocs/docs/HPC/examples/MATLAB/jobscript.sh  |    1 -
 .../HPC/fine_tuning_job_specifications.md     |  212 ++-
 mkdocs/docs/HPC/getting_started.md            |   51 +-
 mkdocs/docs/HPC/gpu.md                        |   13 +-
 .../docs/HPC/img/ood_jupyter_custom_code.png  |  Bin 0 -> 122976 bytes
 .../docs/HPC/img/ood_jupyter_new_notebook.png |  Bin 49405 -> 47364 bytes
 .../docs/HPC/img/ood_jupyter_open_shell.png   |  Bin 0 -> 22880 bytes
 mkdocs/docs/HPC/img/ood_jupyter_queued.png    |  Bin 36713 -> 45072 bytes
 mkdocs/docs/HPC/img/ood_jupyter_running.png   |  Bin 55702 -> 53980 bytes
 mkdocs/docs/HPC/img/ood_jupyter_starting.png  |  Bin 37898 -> 43663 bytes
 mkdocs/docs/HPC/img/ood_jupyter_version.png   |  Bin 0 -> 145109 bytes
 mkdocs/docs/HPC/img/ood_start_jupyter.png     |  Bin 121750 -> 144242 bytes
 mkdocs/docs/HPC/index.md                      |    3 +-
 mkdocs/docs/HPC/interactive_debug.md          |    5 +-
 mkdocs/docs/HPC/introduction.md               |   13 +-
 mkdocs/docs/HPC/jobscript_examples.md         |   19 +-
 mkdocs/docs/HPC/jupyter.md                    |  106 ++
 .../HPC/linux-tutorial/beyond_the_basics.md   |  138 +-
 .../HPC/linux-tutorial/common_pitfalls.md     |   57 +-
 .../HPC/linux-tutorial/getting_started.md     |   57 +-
 .../HPC/linux-tutorial/hpc_infrastructure.md  |    7 +-
 .../manipulating_files_and_directories.md     |  115 +-
 mkdocs/docs/HPC/linux-tutorial/navigating.md  |    7 +-
 .../HPC/linux-tutorial/uploading_files.md     |   24 +-
 mkdocs/docs/HPC/multi_core_jobs.md            |  195 +--
 mkdocs/docs/HPC/multi_job_submission.md       |  157 ++-
 mkdocs/docs/HPC/mympirun.md                   |   17 +-
 mkdocs/docs/HPC/openFOAM.md                   |   45 +-
 mkdocs/docs/HPC/program_examples.md           |   50 +-
 mkdocs/docs/HPC/quick_reference_guide.md      |  316 +----
 mkdocs/docs/HPC/running_batch_jobs.md         |  289 ++--
 mkdocs/docs/HPC/running_interactive_jobs.md   |  107 +-
 .../running_jobs_with_input_output_data.md    |  297 ++--
 .../setting_up_python_virtual_environments.md |  324 +++++
 .../HPC/sites/antwerpen/available-modules.md  |   10 +-
 .../docs/HPC/sites/gent/available-modules.md  |   10 +-
 mkdocs/docs/HPC/torque_frontend_via_jobcli.md |  153 ++
 mkdocs/docs/HPC/torque_options.md             |   72 +-
 mkdocs/docs/HPC/troubleshooting.md            |  144 +-
 mkdocs/docs/HPC/useful_linux_commands.md      |  563 ++------
 mkdocs/docs/HPC/web_portal.md                 |   75 +-
 mkdocs/docs/HPC/x2go.md                       |   17 +-
 mkdocs/docs/HPC/xdmod.md                      |   13 +-
 mkdocs/docs/macros/firsttimeconnection.md     |    5 +-
 scripts/HPC_chatbot_preprocessor/README.md    |  196 +++
 .../chatbot_parser.py                         | 1237 +++++++++++++++++
 .../HPC_chatbot_preprocessor/requirements.txt |    5 +
 .../generic/tps1/tps1_paragraph_001.txt       |    6 +
 .../tps1/tps1_paragraph_001_metadata.json     |   15 +
 .../generic/tps1/tps1_paragraph_003.txt       |    3 +
 .../tps1/tps1_paragraph_003_metadata.json     |   12 +
 .../tps1/tps1_linux_paragraph_002.001.txt     |    4 +
 ...tps1_linux_paragraph_002.001_metadata.json |   15 +
 .../tps1/tps1_linux_paragraph_002.002.txt     |    3 +
 ...tps1_linux_paragraph_002.002_metadata.json |   12 +
 .../tps1/tps1_macos_paragraph_002.001.txt     |    4 +
 ...tps1_macos_paragraph_002.001_metadata.json |   15 +
 .../tps1/tps1_macos_paragraph_002.002.txt     |    3 +
 ...tps1_macos_paragraph_002.002_metadata.json |   12 +
 .../tps1/tps1_windows_paragraph_002.001.txt   |    7 +
 ...s1_windows_paragraph_002.001_metadata.json |   15 +
 .../tps1/tps1_windows_paragraph_002.002.txt   |    6 +
 ...s1_windows_paragraph_002.002_metadata.json |   12 +
 .../tests/test_files/ftps/tps1.md             |   43 +
 .../tts1/Main-title/Subtitle-1/Subtitle-1.txt |    2 +
 .../Subtitle-1/Subtitle-1_metadata.json       |   12 +
 .../Main-title/Subtitle-5-g/Subtitle-5-g.txt  |    1 +
 .../Subtitle-5-g/Subtitle-5-g_metadata.json   |   12 +
 .../Main-title/Subtitle-2-g/Subtitle-2-g.txt  |    4 +
 .../Subtitle-2-g/Subtitle-2-g_metadata.json   |   15 +
 .../Subtitle-4-l&m/Subtitle-4-l&m.txt         |    3 +
 .../Subtitle-4-l&m_metadata.json              |   15 +
 .../Main-title/Subtitle-2-g/Subtitle-2-g.txt  |    4 +
 .../Subtitle-2-g/Subtitle-2-g_metadata.json   |   15 +
 .../Subtitle-4-l&m/Subtitle-4-l&m.txt         |    3 +
 .../Subtitle-4-l&m_metadata.json              |   15 +
 .../Main-title/Subtitle-2-g/Subtitle-2-g.txt  |    4 +
 .../Subtitle-2-g/Subtitle-2-g_metadata.json   |   15 +
 .../Subtitle-3-w/Subtitle-3-w.txt             |    3 +
 .../Subtitle-3-w/Subtitle-3-w_metadata.json   |   15 +
 .../tests/test_files/ftts/tts1.md             |   31 +
 .../if_mangler_1_input.md                     |    4 +
 .../if_mangler_1_output.md                    |    4 +
 .../if_mangler_2_input.md                     |    7 +
 .../if_mangler_2_output.md                    |    7 +
 .../if_mangler_3_input.md                     |    6 +
 .../if_mangler_3_output.md                    |    6 +
 .../if_mangler_4_input.md                     |    4 +
 .../if_mangler_4_output.md                    |    4 +
 .../if_mangler_5_input.md                     |   11 +
 .../if_mangler_5_output.md                    |   11 +
 .../if_mangler_6_input.md                     |    8 +
 .../if_mangler_6_output.md                    |    8 +
 .../if_mangler_7_input.md                     |    9 +
 .../if_mangler_7_output.md                    |    9 +
 .../if_mangler_test_files/if_mangler_input.md |   55 +
 .../if_mangler_output.md                      |   55 +
 .../tests/test_files/list_file/list_test.md   |   15 +
 .../tests/test_full_script.py                 |   68 +
 .../tests/test_if_mangler.py                  |   32 +
 .../tests/test_insert_links.py                |   31 +
 .../tests/test_links.py                       |   71 +
 .../tests/test_lists.py                       |   46 +
 .../tests/test_make_valid_title.py            |   14 +
 .../tests/test_replace_markdown_markers.py    |   46 +
 .../tests/test_write_metadata.py              |   15 +
 scripts/README.md                             |    3 +-
 120 files changed, 4584 insertions(+), 2116 deletions(-)
 create mode 100644 mkdocs/docs/HPC/img/ood_jupyter_custom_code.png
 create mode 100644 mkdocs/docs/HPC/img/ood_jupyter_open_shell.png
 create mode 100644 mkdocs/docs/HPC/img/ood_jupyter_version.png
 create mode 100644 mkdocs/docs/HPC/jupyter.md
 create mode 100644 mkdocs/docs/HPC/setting_up_python_virtual_environments.md
 create mode 100644 mkdocs/docs/HPC/torque_frontend_via_jobcli.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/README.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/chatbot_parser.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/requirements.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_full_script.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_links.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_lists.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py
 create mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py

diff --git a/config/templates/hpc.template b/config/templates/hpc.template
index ace41e1bcac..9bb1657b1eb 100644
--- a/config/templates/hpc.template
+++ b/config/templates/hpc.template
@@ -23,6 +23,7 @@ nav:
   - Troubleshooting: troubleshooting.md
   - HPC Policies: sites/hpc_policies.md
   - Advanced topics:
+      - Torque frontend via jobcli: torque_frontend_via_jobcli.md
       - Fine-tuning Job Specifications: fine_tuning_job_specifications.md
       - Multi-job submission: multi_job_submission.md
       - Compiling and testing your software on the HPC: compiling_your_software.md
@@ -49,9 +50,11 @@ nav:
       - AlphaFold: alphafold.md
       - Apptainer/Singularity: apptainer.md
       - EasyBuild: easybuild.md
+      - Jupyter notebook: jupyter.md
       - MATLAB: MATLAB.md
       - mympirun: mympirun.md
       - OpenFOAM: openFOAM.md
+      - Python virtual environments: setting_up_python_virtual_environments.md
   - FAQ:
       - Frequently Asked Questions: FAQ.md
   - Appendices:
diff --git a/intro-HPC/examples/MATLAB/jobscript.sh b/intro-HPC/examples/MATLAB/jobscript.sh
index 849289c329a..1ed73ea98c2 100644
--- a/intro-HPC/examples/MATLAB/jobscript.sh
+++ b/intro-HPC/examples/MATLAB/jobscript.sh
@@ -3,7 +3,6 @@
 #PBS -l walltime=1:0:0
 #
 # Example (single-core) MATLAB job script
-# see http://hpcugent.github.io/vsc_user_docs/
 #
 
 # make sure the MATLAB version matches with the one used to compile the MATLAB program!
diff --git a/mkdocs/docs/HPC/FAQ.md b/mkdocs/docs/HPC/FAQ.md
index 48e9d705c33..4e9ac13b033 100644
--- a/mkdocs/docs/HPC/FAQ.md
+++ b/mkdocs/docs/HPC/FAQ.md
@@ -16,7 +16,7 @@ Overview of HPC-UGent Tier-2 [infrastructure]({{ hpc_infrastructure_url }})
 
 ### How many cores/nodes should I request?
 
-An important factor in this question is how well your task is being parallellized:
+An important factor in this question is how well your task is being parallelized:
 does it actually run faster with more resources? You can test this yourself:
 start with 4 cores, then 8, then 16... The execution time should each time be reduced to
 around half of what it was before. You can also try this with full nodes: 1 node, 2 nodes.
@@ -171,7 +171,7 @@ Not all file locations perform the same. In particular, the `$VSC_HOME` and `$VS
 directories are, relatively, very slow to access. Your jobs should rather use the
 `$VSC_SCRATCH` directory, or other fast locations (depending on your needs), described
 in [Where to store your data on the HPC](../running_jobs_with_input_output_data/#where-to-store-your-data-on-the-hpc).
-As an example how do this: The job can copy the input to the scratch directory, then execute
+As an example how to do this: The job can copy the input to the scratch directory, then execute
 the computations, and lastly copy the output back to the data directory.
 Using the home and data directories is especially a problem when UGent isn't your home institution:
 your files may be stored, for example, in Leuven while you're running a job in Ghent.
@@ -217,12 +217,13 @@ See the explanation about how jobs get prioritized in [When will my job start](.
 
 {% else %}
 
-In practice it's
+In practice, it's
 impossible to predict when your job(s) will start, since most currently
-running jobs will finish before their requested walltime expires, and
-new jobs by may be submitted by other users that are assigned a higher
-priority than your job(s). You can use the `showstart` command. For more
-information, see .
+running jobs will finish before their requested walltime expires. 
+New jobs may be submitted by other users that are assigned a higher
+priority than your job(s). 
+You can use the `squeue --start` command to get an estimated start time for your jobs in the queue.
+Keep in mind that this is just an estimate.
 
 {% endif %}
 
@@ -282,10 +283,11 @@ of files so other users can access the data. For example, the following
 command will enable a user named "otheruser" to read the file named
 `dataset.txt`. See
 
-
$ setfacl -m u:otheruser:r dataset.txt
-$ ls -l dataset.txt
+```
+$ setfacl -m u:otheruser:r dataset.txt
+$ ls -l dataset.txt
 -rwxr-x---+ 2 {{userid}} mygroup      40 Apr 12 15:00 dataset.txt
-
+``` For more information about `chmod` or `setfacl`, see [Linux tutorial](linux-tutorial/manipulating_files_and_directories.md#changing-permissions-chmod). @@ -317,6 +319,12 @@ Please send an e-mail to {{hpcinfo}} that includes: {% endif %} +If the software is a Python package, you can manually install it in a virtual environment. +More information can be found [here](./setting_up_python_virtual_environments.md). +Note that it is still preferred to submit a software installation request, +as the software installed by the HPC team will be optimized for the HPC environment. +This can lead to dramatic performance improvements. + ### Is my connection compromised? Remote host identification has changed On Monday 25 April 2022, the login nodes received an update to RHEL8. diff --git a/mkdocs/docs/HPC/HOD.md b/mkdocs/docs/HPC/HOD.md index ec51b4d3e22..01313600f4b 100644 --- a/mkdocs/docs/HPC/HOD.md +++ b/mkdocs/docs/HPC/HOD.md @@ -16,8 +16,9 @@ Before using HOD, you first need to load the `hod` module. We don't specify a version here (this is an exception, for most other modules you should, see [Using explicit version numbers](../running_batch_jobs/#using-explicit-version-numbers)) because newer versions might include important bug fixes. -
$ module load hod
-
+``` +module load hod +``` ### Compatibility with login nodes @@ -31,16 +32,17 @@ cluster module before loading the `hod` module and subsequently running For example, this will work as expected: -
$ module swap cluster/{{othercluster}}
-$ module load hod
-$ hod
+```
+$ module swap cluster/{{othercluster}}
+$ module load hod
+$ hod
 hanythingondemand - Run services within an HPC cluster
 usage: hod  [subcommand options]
 Available subcommands (one of these must be specified!):
     batch           Submit a job to spawn a cluster on a PBS job controller, run a job script, and tear down the cluster when it's done
     clean           Remove stale cluster info.
 ...
-
+``` Note that also modules named `hanythingondemand/*` are available. These should however not be used directly, since they may not be compatible @@ -52,13 +54,14 @@ for). The `hod` module will also put a basic configuration in place for HOD, by defining a couple of `$HOD_*` environment variables: -
$ module load hod
-$ env | grep HOD | sort
+```
+$ module load hod
+$ env | grep HOD | sort
 HOD_BATCH_HOD_MODULE=hanythingondemand/3.2.2-intel-2016b-Python-2.7.12
 HOD_BATCH_WORKDIR=$VSC_SCRATCH/hod
 HOD_CREATE_HOD_MODULE=hanythingondemand/3.2.2-intel-2016b-Python-2.7.12
 HOD_CREATE_WORKDIR=$VSC_SCRATCH/hod
-
+``` By defining these environment variables, we avoid that you have to specify `--hod-module` and `--workdir` when using `hod batch` or @@ -85,26 +88,27 @@ will be marked as ``. You should occasionally clean this up using `hod clean`: -
$ module list
+```
+$ module list
 Currently Loaded Modulefiles:
   1) cluster/{{defaultcluster}}(default)   2) pbs_python/4.6.0            3) vsc-base/2.4.2              4) hod/3.0.0-cli
 
-$ hod list
+$ hod list
 Cluster label	Job ID		   State                Hosts
 example1        {{jobid}}         <job-not-found>     <none>
 
-$ hod clean
+$ hod clean
 Removed cluster localworkdir directory /user/scratch/gent/vsc400/vsc40000/hod/hod/{{jobid}} for cluster labeled example1
 Removed cluster info directory /user/home/gent/vsc400/vsc40000/.config/hod.d/wordcount for cluster labeled example1
 
-$ module swap cluster/{{othercluster}}
+$ module swap cluster/{{othercluster}}
 Cluster label	Job ID				            State              	Hosts
 example2		98765.master19.{{othercluster}}.gent.vsc	<job-not-found>     <none>
 
-$ hod clean
+$ hod clean
 Removed cluster localworkdir directory /user/scratch/gent/vsc400/vsc40000/hod/hod/98765.master19.{{othercluster}}.gent.vsc for cluster labeled example2
 Removed cluster info directory /user/home/gent/vsc400/vsc40000/.config/hod.d/wordcount for cluster labeled example2
-
+``` Note that **only HOD clusters that were submitted to the currently loaded `cluster` module will be cleaned up**. ## Getting help diff --git a/mkdocs/docs/HPC/MATLAB.md b/mkdocs/docs/HPC/MATLAB.md index 84109fe6b24..2fdd910c85d 100644 --- a/mkdocs/docs/HPC/MATLAB.md +++ b/mkdocs/docs/HPC/MATLAB.md @@ -37,11 +37,12 @@ To access the MATLAB compiler, the `MATLAB` module should be loaded first. Make sure you are using the same `MATLAB` version to compile and to run the compiled MATLAB program. -
$ module avail MATLAB/
+```
+$ module avail MATLAB/
 ----------------------/apps/gent/RHEL8/zen2-ib/modules/all----------------------
    MATLAB/2021b    MATLAB/2022b-r5 (D)
-$ module load MATLAB/2021b
-
+$ module load MATLAB/2021b +``` After loading the `MATLAB` module, the `mcc` command can be used. To get help on `mcc`, you can run `mcc -?`. @@ -53,12 +54,14 @@ flag means verbose output). To show how `mcc` can be used, we use the First, we copy the `magicsquare.m` example that comes with MATLAB to `example.m`: -
$ cp $EBROOTMATLAB/extern/examples/compiler/magicsquare.m example.m
-
+``` +cp $EBROOTMATLAB/extern/examples/compiler/magicsquare.m example.m +``` To compile a MATLAB program, use `mcc -mv`: -
mcc -mv example.m
+```
+mcc -mv example.m
 Opening log file:  {{homedir}}/java.log.34090
 Compiler version: 8.3 (R2021b)
 Dependency analysis by REQUIREMENTS.
@@ -67,7 +70,7 @@ Parsing file "{{homedir}}/example.m"
 Deleting 0 temporary MEX authorization files.
 Generating file "{{homedir}}/readme.txt".
 Generating file "run\_example.sh".
-
+``` ### Libraries @@ -90,8 +93,9 @@ MATLAB program on the login nodes, consider tweaking the default maximum heap size (128M) of Java using the `_JAVA_OPTIONS` environment variable with: -
$ export _JAVA_OPTIONS="-Xmx64M"
-
+``` +export _JAVA_OPTIONS="-Xmx64M" +``` The MATLAB compiler spawns multiple Java processes. Because of the default memory limits that are in effect on the login nodes, this might @@ -102,14 +106,16 @@ to fit in memory. Another possible issue is that the heap size is too small. This could result in errors like: -
Error: Out of memory
-
+``` +Error: Out of memory +``` A possible solution to this is by setting the maximum heap size to be bigger: -
$ export _JAVA_OPTIONS="-Xmx512M"
-
+``` +export _JAVA_OPTIONS="-Xmx512M" +``` ## Multithreading @@ -130,8 +136,7 @@ you requested when submitting your job script (the `ppn` value, see [Generic res You can determine the right number of workers to use via the following code snippet in your MATLAB program: -
-- parpool.m --
-```matlab +```matlab title="parpool.m" {% include "./examples/MATLAB/parpool.m" %} ``` @@ -143,22 +148,25 @@ documentation](https://nl.mathworks.com/help/distcomp/parpool.html). Each time MATLAB is executed, it generates a Java log file in the users home directory. The output log directory can be changed using: -
$ MATLAB_LOG_DIR=<OUTPUT_DIR>
-
+``` +MATLAB_LOG_DIR= +``` where `` is the name of the desired output directory. To create and use a temporary directory for these logs: -
# create unique temporary directory in $TMPDIR (or /tmp/$USER if
+```
+# create unique temporary directory in $TMPDIR (or /tmp/$USER if
 $TMPDIR is not defined)
 # instruct MATLAB to use this directory for log files by setting $MATLAB_LOG_DIR
-$  export MATLAB_LOG_DIR=$ (mktemp -d -p $TMPDIR:-/tmp/$USER)
-
+$ export MATLAB_LOG_DIR=$ (mktemp -d -p $TMPDIR:-/tmp/$USER) +``` You should remove the directory at the end of your job script: -
$  rm -rf $MATLAB_LOG_DIR
-
+``` +rm -rf $MATLAB_LOG_DIR +``` ## Cache location @@ -169,9 +177,10 @@ location and size of this cache can be changed through the The snippet below would set the maximum cache size to 1024MB and the location to `/tmp/testdirectory`. -
$ export MATLAB_CACHE_ROOT=/tmp/testdirectory 
-$ export MATLAB_CACHE_SIZE=1024M 
-
+``` +export MATLAB_CACHE_ROOT=/tmp/testdirectory +export MATLAB_CACHE_SIZE=1024M +``` So when MATLAB is running, it can fill up to 1024MB of cache in `/tmp/testdirectory`. @@ -182,7 +191,6 @@ All of the tweaks needed to get MATLAB working have been implemented in an example job script. This job script is also available on the HPC. -
-- jobscript.sh --
-```bash +```bash title="jobscript.sh" {% include "./examples/MATLAB/jobscript.sh" %} ``` diff --git a/mkdocs/docs/HPC/VNC.md b/mkdocs/docs/HPC/VNC.md index e42fdae5437..9bce16bf93d 100644 --- a/mkdocs/docs/HPC/VNC.md +++ b/mkdocs/docs/HPC/VNC.md @@ -15,21 +15,22 @@ infrastructure from your own computer. First login on the login node (see [First time connection to the HPC infrastructure](../connecting/#first-time-connection-to-the-hpc-infrastructure), then start `vncserver` with: -
$ vncserver -geometry 1920x1080 -localhost
+```
+$ vncserver -geometry 1920x1080 -localhost
 You will require a password to access your desktops.
 
-Password:<enter a secure password>
-Verify:<enter the same password>
-Would you like to enter a view-only password (y/n)? n
+Password: 
+Verify: 
+Would you like to enter a view-only password (y/n)? n
 A view-only password is not used
 
-New '{{loginhost}}:6 ({{userid}})' desktop is {{loginhost}}:6
+New '{{loginhost}}:6 ({{userid}})' desktop is {{loginhost}}:6
 
 Creating default startup script {{homedir}}.vnc/xstartup
 Creating default config {{homedir}}.vnc/config
 Starting applications specified in {{homedir}}.vnc/xstartup
 Log file is {{homedir}}.vnc/{{loginhost}}:6.log
-
+``` **When prompted for a password, make sure to enter a secure password: if someone can guess your password, they will be able to do anything with your account you can!** @@ -46,12 +47,13 @@ each time you want to connect. You can get a list of running VNC servers on a node with -
$ vncserver -list
+```
+$ vncserver -list
 TigerVNC server sessions:
 
 X DISPLAY #	PROCESS ID
 :6		    30713
-
+``` This only displays the running VNC servers on **the login node you run the command on**. @@ -59,11 +61,12 @@ To see what login nodes you are running a VNC server on, you can run the `ls .vnc/*.pid` command in your home directory: the files shown have the hostname of the login node in the filename: -
$ cd $HOME
-$ ls .vnc/*.pid
+```
+$ cd $HOME
+$ ls .vnc/*.pid
 .vnc/{{loginhost}}:6.pid
 .vnc/{{altloginhost}}:8.pid
-
+``` This shows that there is a VNC server running on `{{loginhost}}` on port 5906 and another one running `{{altloginhost}}` on port 5908 (see also [Determining the source/destination port](./#determining-the-sourcedestination-port)). @@ -153,8 +156,9 @@ tunnel, by entering the settings in the and fields in [SSH tunnel](../running_in {% else %} Execute the following command to set up the SSH tunnel. -
$ ssh -L 5906:localhost:12345  {{userid}}@{{loginnode}}
-
+``` +ssh -L 5906:localhost:12345 {{userid}}@{{loginnode}} +``` **Replace the source port `5906`, destination port `12345` and user ID {{userid}} with your own!** @@ -172,9 +176,9 @@ you have picked is actually still available (see [Picking an intermediate port t You can check using the following command (**do not forget to replace `12345` the value you picked for your intermediate port): -
$ netstat -an | grep -i listen | grep tcp | grep 12345
-$
-
+``` +netstat -an | grep -i listen | grep tcp | grep 12345 +``` If you see no matching lines, then the port you picked is still available, and you can continue. @@ -182,11 +186,12 @@ available, and you can continue. If you see one or more matching lines as shown below, **you must disconnect the first SSH tunnel, pick a different intermediate port, and set up the first SSH tunnel again using the new value**. -
$ netstat -an | grep -i listen | grep tcp | grep 12345
+```
+$ netstat -an | grep -i listen | grep tcp | grep 12345
 tcp        0      0 0.0.0.0:12345           0.0.0.0:*               LISTEN
 tcp6       0      0 :::12345                :::*                    LISTEN
 $
-
+``` #### Setting up the second SSH tunnel to the correct login node @@ -197,10 +202,11 @@ running (`{{loginhost}}` in our running example, see [Starting a VNC server](./# To do this, run the following command: -
$ ssh -L 12345:localhost:5906 {{loginhost}}
-$ hostname
+```
+$ ssh -L 12345:localhost:5906 {{loginhost}}
+$ hostname
 {{loginhost}}
-
+``` With this, we are forwarding port `12345` on the login node we are connected to (which is referred to as `localhost`) through to port @@ -251,18 +257,20 @@ When prompted for default or empty panel, choose default. If you have an empty panel, you can reset your settings with the following commands: -
$ xfce4-panel --quit ; pkill xfconfd
-$ mkdir ~/.oldxfcesettings
-$ mv ~/.config/xfce4 ~/.oldxfcesettings
-$ xfce4-panel
-
+``` +xfce4-panel --quit ; pkill xfconfd +mkdir ~/.oldxfcesettings +mv ~/.config/xfce4 ~/.oldxfcesettings +xfce4-panel +``` ## Stopping the VNC server The VNC server can be killed by running -
vncserver -kill :6
-
+``` +vncserver -kill :6 +``` where `6` is the port number we noted down earlier. If you forgot, you can get it with `vncserver -list` (see [List running VNC servers](./#list-running-vnc-servers)). diff --git a/mkdocs/docs/HPC/account.md b/mkdocs/docs/HPC/account.md index a6292be41fb..c33c829231c 100644 --- a/mkdocs/docs/HPC/account.md +++ b/mkdocs/docs/HPC/account.md @@ -201,9 +201,10 @@ On all popular Linux distributions, the OpenSSH software is readily available, and most often installed by default. You can check whether the OpenSSH software is installed by opening a terminal and typing: -
$ ssh -V
+```
+$ ssh -V
 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
-
+``` To access the clusters and transfer your files, you will use the following commands: @@ -222,17 +223,20 @@ A key pair might already be present in the default location inside your home directory. Therefore, we first check if a key is available with the "list short" ("ls") command: -
$ ls ~/.ssh
-
+``` +ls ~/.ssh +``` If a key-pair is already available, you would normally get: -
authorized_keys     id_rsa      id_rsa.pub      known_hosts
-
+``` +authorized_keys id_rsa id_rsa.pub known_hosts +``` Otherwise, the command will show: -
ls: .ssh: No such file or directory
-
+``` +ls: .ssh: No such file or directory +``` You can recognise a public/private key pair when a pair of files has the same name except for the extension ".pub" added to one of them. In this @@ -260,13 +264,9 @@ private and should stay private. You should not even copy it to one of your other machines, instead, you should create a new public/private key pair for each machine. -
$ ssh-keygen -t rsa -b 4096
-Generating public/private rsa key pair. Enter file in which to save the
-key (/home/user/.ssh/id_rsa): Enter passphrase (empty for no
-passphrase): Enter same passphrase again: Your identification has been
-saved in /home/user/.ssh/id_rsa. Your public key has been saved in
-/home/user/.ssh/id_rsa.pub.
-
+``` +ssh-keygen -t rsa -b 4096 +``` This will ask you for a file name to store the private and public key, and a passphrase to protect your private key. It needs to be emphasised @@ -335,15 +335,17 @@ to keep and manage the user SSH keys. If you use one of these derivatives you ** the SSH manager keyring to be able to connect to the HPC cluster. If not, SSH client will display an error message (see [Connecting](../connecting)) similar to this: -
Agent admitted failure to sign using the key. 
+```
+Agent admitted failure to sign using the key. 
 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
-
+``` This could be fixed using the `ssh-add` command. You can include the new private keys' identities in your keyring with: -
$ ssh-add
-
+```shell +ssh-add +``` !!! tip Without extra options `ssh-add` adds any key located at `$HOME/.ssh` @@ -353,8 +355,9 @@ private keys' identities in your keyring with: Check that your key is available from the keyring with: -
$ ssh-add -l
-
+``` +ssh-add -l +``` After these changes the key agent will keep your SSH key to connect to the clusters as usual. @@ -466,7 +469,8 @@ account. Within one day, you should receive a Welcome e-mail with your VSC account details. -
Dear (Username), 
+```
+Dear (Username), 
 Your VSC-account has been approved by an administrator.
 Your vsc-username is {{ userid }}
 
@@ -479,7 +483,7 @@ For further info please visit https://www.vscentrum.be/user-portal
 
 Kind regards,
 -- The VSC administrators
-
+``` Now, you can start using the {{ hpc }}. You can always look up your VSC id later by visiting . diff --git a/mkdocs/docs/HPC/alphafold.md b/mkdocs/docs/HPC/alphafold.md index 9c502992620..4fbd3d26d79 100644 --- a/mkdocs/docs/HPC/alphafold.md +++ b/mkdocs/docs/HPC/alphafold.md @@ -199,7 +199,7 @@ To run the job scripts you need to create a file named `T1050.fasta` with the fo >T1050 A7LXT1, Bacteroides Ovatus, 779 residues| MASQSYLFKHLEVSDGLSNNSVNTIYKDRDGFMWFGTTTGLNRYDGYTFKIYQHAENEPGSLPDNYITDIVEMPDGRFWINTARGYVLFDKERDYFITDVTGFMKNLESWGVPEQVFVDREGNTWLSVAGEGCYRYKEGGKRLFFSYTEHSLPEYGVTQMAECSDGILLIYNTGLLVCLDRATLAIKWQSDEIKKYIPGGKTIELSLFVDRDNCIWAYSLMGIWAYDCGTKSWRTDLTGIWSSRPDVIIHAVAQDIEGRIWVGKDYDGIDVLEKETGKVTSLVAHDDNGRSLPHNTIYDLYADRDGVMWVGTYKKGVSYYSESIFKFNMYEWGDITCIEQADEDRLWLGTNDHGILLWNRSTGKAEPFWRDAEGQLPNPVVSMLKSKDGKLWVGTFNGGLYCMNGSQVRSYKEGTGNALASNNVWALVEDDKGRIWIASLGGGLQCLEPLSGTFETYTSNNSALLENNVTSLCWVDDNTLFFGTASQGVGTMDMRTREIKKIQGQSDSMKLSNDAVNHVYKDSRGLVWIATREGLNVYDTRRHMFLDLFPVVEAKGNFIAAITEDQERNMWVSTSRKVIRVTVASDGKGSYLFDSRAYNSEDGLQNCDFNQRSIKTLHNGIIAIGGLYGVNIFAPDHIRYNKMLPNVMFTGLSLFDEAVKVGQSYGGRVLIEKELNDVENVEFDYKQNIFSVSFASDNYNLPEKTQYMYKLEGFNNDWLTLPVGVHNVTFTNLAPGKYVLRVKAINSDGYVGIKEATLGIVVNPPFKLAAALQHHHHHH ``` -source: +source: ### Job script for running AlphaFold on GPU @@ -212,9 +212,7 @@ Swap to the `joltik` GPU before submitting it: module swap cluster/joltik ``` -
-- AlphaFold-gpu-joltik.sh --
- -```bash +```bash title="AlphaFold-gpu-joltik.sh" {% include "./examples/AlphaFold/AlphaFold-gpu-joltik.sh" %} ``` @@ -222,9 +220,7 @@ module swap cluster/joltik Jobscript that runs AlphaFold on CPU using 24 cores on one node. -
-- AlphaFold-cpu-doduo.sh --
- -```bash +```bash title="AlphaFold-cpu-doduo.sh" {% include "./examples/AlphaFold/AlphaFold-cpu-doduo.sh" %} ``` diff --git a/mkdocs/docs/HPC/apptainer.md b/mkdocs/docs/HPC/apptainer.md index f06d943b90a..4d26cdeeab1 100644 --- a/mkdocs/docs/HPC/apptainer.md +++ b/mkdocs/docs/HPC/apptainer.md @@ -84,8 +84,9 @@ We strongly recommend the use of Docker Hub, see Copy testing image from `/apps/gent/tutorials/Singularity` to `$VSC_SCRATCH`: -
$ cp /apps/gent/tutorials/Singularity/CentOS7_EasyBuild.img $VSC_SCRATCH/
-
+``` +cp /apps/gent/tutorials/Singularity/CentOS7_EasyBuild.img $VSC_SCRATCH/ +``` Create a job script like: @@ -118,8 +119,9 @@ Apptainer/Singularity image yourself Copy testing image from `/apps/gent/tutorials` to `$VSC_SCRATCH`: -
$ cp /apps/gent/tutorials/Singularity/Ubuntu14.04_tensorflow.img $VSC_SCRATCH/
-
+``` +cp /apps/gent/tutorials/Singularity/Ubuntu14.04_tensorflow.img $VSC_SCRATCH/ +``` ```bash #!/bin/sh @@ -158,19 +160,21 @@ following requirements apply: Copy the testing image from `/apps/gent/tutorials/Singularity` to `$VSC_SCRATCH` -
$ cp /apps/gent/tutorials/Singularity/Debian8_UGentMPI.img $VSC_SCRATCH/
-
+``` +cp /apps/gent/tutorials/Singularity/Debian8_UGentMPI.img $VSC_SCRATCH/ +``` For example to compile an [MPI example](https://github.com/open-mpi/ompi/blob/master/examples/ring_c.c): -
$ module load intel
-$ apptainer shell $VSC_SCRATCH/Debian8_UGentMPI.img
-$ export LANG=C
-$ export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu/:$C_INCLUDE_PATH
-$ mpiicc ompi/examples/ring_c.c -o ring_debian
-$ exit
-
+``` +module load intel +apptainer shell $VSC_SCRATCH/Debian8_UGentMPI.img +export LANG=C +export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu/:$C_INCLUDE_PATH +mpiicc ompi/examples/ring_c.c -o ring_debian +exit +``` Example MPI job script: diff --git a/mkdocs/docs/HPC/compiling_your_software.md b/mkdocs/docs/HPC/compiling_your_software.md index c01b1b7ef88..5cf5e27ed3d 100644 --- a/mkdocs/docs/HPC/compiling_your_software.md +++ b/mkdocs/docs/HPC/compiling_your_software.md @@ -90,9 +90,11 @@ A typical process looks like: We assume you've copied your software to the {{hpc}}. The next step is to request your private compute node. -
$ qsub -I
+
+```bash
+$ qsub -I
 qsub: waiting for job {{jobid}} to start
-
+``` ### Compiling a sequential program in C @@ -100,23 +102,23 @@ qsub: waiting for job {{jobid}} to start Go to the examples for chapter [Compiling and testing your software on the HPC](compiling_your_software.md#compiling-and-building-on-the-hpc) and load the foss module: -
$ cd ~/{{exampledir}}
-$ module load foss
-
+``` +cd ~/{{exampledir}} +module load foss +``` We now list the directory and explore the contents of the "*hello.c*" program: -
$ ls -l
+```
+$ ls -l
 total 512
 -rw-r--r-- 1 {{userid}} 214 Sep 16 09:42 hello.c
 -rw-r--r-- 1 {{userid}} 130 Sep 16 11:39 hello.pbs*
 -rw-r--r-- 1 {{userid}} 359 Sep 16 13:55 mpihello.c
 -rw-r--r-- 1 {{userid}} 304 Sep 16 13:55 mpihello.pbs
-
- -

hello.c

+``` -```shell +```shell title="hello.c" {% include "examples/Compiling-and-testing-your-software-on-the-HPC/hello.c" %} ``` @@ -130,14 +132,15 @@ First, check the command line options for *"gcc" (GNU C-Compiler)*, then we compile. the `O2` option enables a moderate level of optimization when compiling the code. It instructs the compiler to optimize the code for better performance without significantly increasing compilation time. Finally, list the contents of the directory again: -
$ gcc -help
-$ gcc -O2 -o hello hello.c
-$ ls -l
+```
+$ gcc -help
+$ gcc -O2 -o hello hello.c
+$ ls -l
 total 512
 -rwxrwxr-x 1 {{userid}} 7116 Sep 16 11:43 hello*
 -rw-r--r-- 1 {{userid}}  214 Sep 16 09:42 hello.c
 -rwxr-xr-x 1 {{userid}}  130 Sep 16 11:39 hello.pbs*
-
+``` A new file "hello" has been created. Note that this file has "execute" rights, i.e., it is an executable. More often than not, calling gcc -- @@ -152,35 +155,39 @@ that produces a warning does not go unnoticed. Let's test this program on the local compute node, which is at your disposal after the `qsub --I` command: -
$ ./hello
+```
+$ ./hello
 Hello #0
 Hello #1
 Hello #2
 Hello #3
 Hello #4
 ...
-
+``` It seems to work, now run it on the {{hpc}} -
$ qsub hello.pbs
+``` +qsub hello.pbs +``` ### Compiling a parallel program in C/MPI -
$ cd ~/{{exampledir}}
+``` +cd ~/{{exampledir}} +``` List the directory and explore the contents of the "*mpihello.c*" program: -
$ ls -l
+```
+$ ls -l
 total 512
 total 512
 -rw-r--r-- 1 {{userid}} 214 Sep 16 09:42 hello.c
 -rw-r--r-- 1 {{userid}} 130 Sep 16 11:39 hello.pbs*
 -rw-r--r-- 1 {{userid}} 359 Sep 16 13:55 mpihello.c
 -rw-r--r-- 1 {{userid}} 304 Sep 16 13:55 mpihello.pbs
-
- -

mpihello.c

+``` -```shell +```shell title="mpihello.c" {% include "examples/Compiling-and-testing-your-software-on-the-HPC/mpihello.c" %} ``` @@ -191,21 +198,27 @@ Then, check the command line options for *"mpicc" (GNU C-Compiler with MPI extensions)*, then we compile and list the contents of the directory again: -
$ mpicc --help
-$ mpicc -o mpihello mpihello.c
-$ ls -l
+``` +mpicc --help +mpicc -o mpihello mpihello.c +ls -l +``` A new file "hello" has been created. Note that this program has "execute" rights. Let's test this program on the "login" node first: -
$ ./mpihello
-Hello World from Node 0.
+``` +$ ./mpihello +Hello World from Node 0. +``` It seems to work, now run it on the {{hpc}}. -
$ qsub mpihello.pbs
+``` +qsub mpihello.pbs +``` ### Compiling a parallel program in Intel Parallel Studio Cluster Edition @@ -213,30 +226,39 @@ We will now compile the same program, but using the Intel Parallel Studio Cluster Edition compilers. We stay in the examples directory for this chapter: -
$ cd ~/{{exampledir}}
+``` +cd ~/{{exampledir}} +``` We will compile this C/MPI -file into an executable with the Intel Parallel Studio Cluster Edition. First, clear the modules (purge) and then load the latest "intel" module: -
$ module purge
-$ module load intel
-
+``` +module purge +module load intel +``` Then, compile and list the contents of the directory again. The Intel equivalent of mpicc is mpiicc. -
$ mpiicc -o mpihello mpihello.c
-$ ls -l
+``` +mpiicc -o mpihello mpihello.c +ls -l +``` Note that the old "mpihello" file has been overwritten. Let's test this program on the "login" node first: -
$ ./mpihello
-Hello World from Node 0.
+``` +$ ./mpihello +Hello World from Node 0. +``` It seems to work, now run it on the {{hpc}}. -
$ qsub mpihello.pbs
+``` +qsub mpihello.pbs +``` Note: The {{association}} only has a license for the Intel Parallel Studio Cluster Edition for a fixed number of users. As such, it might happen that you @@ -246,44 +268,10 @@ for your use. Note: The Intel Parallel Studio Cluster Edition contains equivalent compilers for all GNU compilers. Hereafter the overview for C, C++ and Fortran compilers. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sequential ProgramParallel Program (with MPI)
GNUIntelGNUIntel
Cgcciccmpiccmpiicc
C++g++icpcmpicxxmpiicpc
Fortrangfortranifortmpif90mpiifort
-
+ +| | **Sequential Program** | | **Parallel Program (with MPI)** | | +|-------------|------------------------|-----------|---------------------------------|-----------| +| | **GNU** | **Intel** | **GNU** | **Intel** | +| **C** | gcc | icc | mpicc | mpiicc | +| **C++** | g++ | icpc | mpicxx | mpiicpc | +| **Fortran** | gfortran | ifort | mpif90 | mpiifort | diff --git a/mkdocs/docs/HPC/connecting.md b/mkdocs/docs/HPC/connecting.md index e7035511fbe..86f1f443a01 100644 --- a/mkdocs/docs/HPC/connecting.md +++ b/mkdocs/docs/HPC/connecting.md @@ -56,8 +56,9 @@ Trying to establish an SSH connection from an IP address that does not adhere to these restrictions will result in an immediate failure to connect, with an error message like: -
ssh_exchange_identification: read: Connection reset by peer
-
+``` +ssh_exchange_identification: read: Connection reset by peer +``` ## First Time connection to the HPC infrastructure @@ -164,11 +165,12 @@ to the {{ hpc }} cluster via the login node "***{{ loginnode }}***". 10. To check you can now "Print the Working Directory" (pwd) and check the name of the computer, where you have logged in (hostname): -
    $ pwd
+    ```
+    $ pwd
     {{ homedir }}
-    $ hostname -f
+    $ hostname -f
     {{ loginhost }}
-    
+ ``` 11. For future PuTTY sessions, just select your saved session (i.e. "**{{ hpcname }}**") from the list, ++"Load"++ it and press ++"Open"++. @@ -183,8 +185,9 @@ Open up a terminal and enter the following command to connect to the {{ hpc }}. You can open a terminal by navigation to Applications and then Utilities in the finder and open Terminal.app, or enter Terminal in Spotlight Search. {% endif %} -
$ ssh {{ userid }}@{{ loginnode }}
-
+``` +ssh {{ userid }}@{{ loginnode }} +``` Here, user {{ userid }} wants to make a connection to the "{{ hpcname }}" cluster at {{ university }} via the login node "{{ loginnode }}", so replace {{ userid }} with your own VSC id in the above command. @@ -197,32 +200,36 @@ A possible error message you can get if you previously saved your private key somewhere else than the default location (`$HOME/.ssh/id_rsa`): -
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
-
+``` +Permission denied (publickey,gssapi-keyex,gssapi-with-mic). +``` In this case, use the `-i` option for the `ssh` command to specify the location of your private key. For example: -
$ ssh -i /home/example/my_keys
-
+``` +ssh -i /home/example/my_keys +``` {% endif %} **Congratulations, you're on the {{ hpc }} infrastructure now!** To find out where you have landed you can print the current working directory: -
$ pwd
+```
+$ pwd
 {{ homedir }}
-
+``` Your new private home directory is "{{ homedir }}". Here you can create your own subdirectory structure, copy and prepare your applications, compile and test them and submit your jobs on the {{ hpc }}. -
$ cd {{ tutorialdir }}
-$ ls
+```
+$ cd {{ tutorialdir }}
+$ ls
 Intro-HPC/
-
+``` This directory currently contains all training material for the ***Introduction to the {{ hpc }}***. More relevant training material to work with the {{ hpc }} can always be added later in @@ -233,8 +240,9 @@ You can now explore the content of this directory with the "ls --l" (**l**ist**s As we are interested in the use of the ***HPC***, move further to ***Intro-HPC*** and explore the contents up to 2 levels deep: -
$ cd Intro-HPC
-$ tree -L 2
+```
+$ cd Intro-HPC
+$ tree -L 2
 .
 '-- examples
     |-- Compiling-and-testing-your-software-on-the-HPC
@@ -248,7 +256,7 @@ contents up to 2 levels deep:
     |-- example.pbs
     '-- example.sh
 9 directories, 5 files
-
+``` This directory contains: @@ -257,8 +265,9 @@ This directory contains: 2. An ***examples*** subdirectory, containing all the examples that you need in this Tutorial, as well as examples that might be useful for your specific applications. -
$ cd examples
-
+``` +cd examples +``` !!! tip Typing `cd ex` followed by ++tab++ (the Tab-key) will generate the `cd examples` @@ -275,20 +284,23 @@ your home directory, so that you have your own personal copy and that you can start using the examples. The "-r" option of the copy command will also copy the contents of the sub-directories "*recursively*". -
$ cp -r {{ examplesdir }} ~/
-
+``` +cp -r {{ examplesdir }} ~/ +``` {%- if site == gent %} Go to your home directory, check your own private examples directory, ... and start working. -
$ cd
-$ ls -l
-
+``` +cd +ls -l +``` Upon connecting you will see a login message containing your last login time stamp and a basic overview of the current cluster utilisation. -
Last login: Thu Mar 18 13:15:09 2021 from gligarha02.gastly.os
+```
+Last login: Thu Mar 18 13:15:09 2021 from gligarha02.gastly.os
 
  STEVIN HPC-UGent infrastructure status on Mon, 19 Feb 2024 10:00:01
       cluster         - full - free -  part - total - running - queued
@@ -305,14 +317,15 @@ Upon connecting you will see a login message containing your last login time sta
 For a full view of the current loads and queues see:
 https://hpc.ugent.be/clusterstate/
 Updates on current system status and planned maintenance can be found on https://www.ugent.be/hpc/en/infrastructure/status
-
+``` {% endif %} {%- if site == brussel %} Upon connecting you will see a login message containing your last login time stamp, some useful environment variable definitions and the message of the day (MOTD). -
Last login: Thu Nov  6 16:05:21 2014 from example.vub.ac.be
+```
+Last login: Thu Nov  6 16:05:21 2014 from example.vub.ac.be
 
 Initialising your working environment...
 System variables to use in your scripts/programs:
@@ -333,14 +346,15 @@ Message of the day:
         \  (oo)____
            (__)    )\
               ||--||
-
+``` {% endif %} {%- if site == leuven %} Upon connecting you will see a login message containing your last login time stamp and some useful links. -
Last login: Mon Jan 12 18:52:20 2015 from example.kuleuven.be
+```
+Last login: Mon Jan 12 18:52:20 2015 from example.kuleuven.be
 **********************************************
 *                                            *
 * Please check the following site for        *
@@ -355,13 +369,14 @@ Upon connecting you will see a login message containing your last login time sta
 *                                            *
 *                                            *
 **********************************************
-
+``` {% endif %} {%- if site == antwerpen %} Upon connection, you will get a welcome message containing your last login timestamp and some pointers to information about the system. On Leibniz, the system will also show your disk quota. -
Last login: Mon Feb  2 17:58:13 2015 from mylaptop.uantwerpen.be
+```
+Last login: Mon Feb  2 17:58:13 2015 from mylaptop.uantwerpen.be
 
 ---------------------------------------------------------------
 
@@ -396,15 +411,16 @@ Your quota is:
    small            1389     100000     110000     none
 
 ---------------------------------------------------------------
-
+``` {% endif %} You can exit the connection at anytime by entering: -
$ exit
+```
+$ exit
 logout
 Connection to {{ loginnode }} closed.
-
+``` !!! tip "tip: Setting your Language right" You may encounter a warning message similar to the following one during connecting: @@ -449,14 +465,15 @@ Connection to {{ loginnode }} closed. Open the `.bashrc` on your local machine with your favourite editor and add the following lines: -
$ nano ~/.bashrc
+    ```
+    $ nano ~/.bashrc
     ...
     export LANGUAGE="en_US.UTF-8"
     export LC_ALL="en_US.UTF-8"
     export LC_CTYPE="en_US.UTF-8"
     export LANG="en_US.UTF-8"
     ...
-    
+ ``` !!! tip "tip: vi" To start entering text in vi: move to the place you want to start @@ -467,11 +484,12 @@ Connection to {{ loginnode }} closed. or alternatively (if you are not comfortable with the Linux editors), again on your local machine: -
$ echo "export LANGUAGE=\"en_US.UTF-8\"" >> ~/.profile
-    $ echo "export LC_ALL=\"en_US.UTF-8\"" >> ~/.profile
-    $ echo "export LC_CTYPE=\"en_US.UTF-8\"" >> ~/.profile
-    $ echo "export LANG=\"en_US.UTF-8\"" >> ~/.profile
-    
+ ``` + echo "export LANGUAGE=\"en_US.UTF-8\"" >> ~/.profile + echo "export LC_ALL=\"en_US.UTF-8\"" >> ~/.profile + echo "export LC_CTYPE=\"en_US.UTF-8\"" >> ~/.profile + echo "export LANG=\"en_US.UTF-8\"" >> ~/.profile + ``` You can now log out, open a new terminal/shell on your local machine and reconnect to the login node, and you should not get these warnings anymore. @@ -587,9 +605,10 @@ you have symlinks to them in your home directory. See {{ LinuxManualURL.LinuxMan Open an additional terminal window and check that you're working on your local machine. -
$ hostname
+```
+$ hostname
 
-
+``` If you're still using the terminal that is connected to the {{ hpc }}, close the connection by typing "exit" in the terminal window. @@ -602,29 +621,31 @@ end: if you forget it, it will just create a file named {{ userid }}@{{ loginnod local filesystem. You can even specify where to save the file on the remote filesystem by putting a path after the colon. -
$ echo "Hello" > localfile.txt
-$ ls -l 
+```
+$ echo "Hello" > localfile.txt
+$ ls -l 
 ...
 -rw-r--r-- 1 user  staff   6 Sep 18 09:37 localfile.txt
 $ scp localfile.txt {{ userid }}@{{ loginnode }}:
 localfile.txt     100%   6     0.0KB/s     00:00
-
+``` Connect to the {{ hpc }} via another terminal, print the working directory (to make sure you're in the home directory) and check whether the file has arrived: -
$ pwd
+```
+$ pwd
 {{ homedir }}
-$ ls -l 
+$ ls -l 
 total 1536
 drwxrwxr-x 2
 drwxrwxr-x 2
 drwxrwxr-x 10
 -rw-r--r-- 1
-$ cat localfile.txt
+$ cat localfile.txt
 Hello
-
+``` The **scp** command can also be used to copy files from the cluster to your local machine. Let us copy the remote file "intro-HPC-{{ OS }}-{{ site }}.pdf" from your "docs" @@ -633,22 +654,24 @@ subdirectory on the cluster to your local computer. First, we will confirm that the file is indeed in the "docs" subdirectory. In the terminal on the login node, enter: -
$ cd ~/docs
-$ ls -l
+```
+$ cd ~/docs
+$ ls -l
 total 1536
 -rw-r--r-- 1 {{ userid }} Sep 11 09:53 intro-HPC-{{ OS }}-{{ site }}.pdf
-
+``` Now we will copy the file to the local machine. On the terminal on your own local computer, enter: -
$ scp {{ userid }}@{{ loginnode }}:./docs/intro-HPC-{{ OS }}-{{ site }}.pdf .
+```
+$ scp {{ userid }}@{{ loginnode }}:./docs/intro-HPC-{{ OS }}-{{ site }}.pdf .
 intro-HPC-{{ OS }}-{{ site }}.pdf 100% 725KB 724.6KB/s 00:01
-$ ls -l
+$ ls -l
 total 899
 -rw-r--r-- 1 user staff 741995 Sep 18 09:53
 -rw-r--r-- 1 user staff      6 Sep 18 09:37 localfile.txt
-
+``` The file has been copied from the HPC to your local computer. @@ -657,15 +680,17 @@ the `-r` flag. For example, if we want to copy the local directory `dataset` to `$VSC_SCRATCH`, we can use the following command (assuming you've created the `scratch` symlink): -
$ scp -r dataset {{ userid }}@{{ loginnode }}:scratch
-
+``` +scp -r dataset {{ userid }}@{{ loginnode }}:scratch +``` If you don't use the `-r` option to copy a directory, you will run into the following error: -
$ scp -r dataset {{ userid }}@{{ loginnode }}:scratch
+```
+$ scp dataset {{ userid }}@{{ loginnode }}:scratch
 dataset: not a regular file
-
+``` ### Using sftp @@ -682,8 +707,9 @@ it uses the secure ssh protocol to connect to the clusters. One easy way of starting a sftp session is -
$ sftp {{ userid }}@{{ loginnode }}
-
+``` +sftp {{ userid }}@{{ loginnode }} +``` Typical and popular commands inside an sftp session are: @@ -772,13 +798,14 @@ ssh {{loginhost}} This is also possible the other way around. If you want to find out which login host you are connected to, you can use the `hostname` command. -
$ hostname
+```
+$ hostname
 {{loginhost}}
-$ ssh {{altloginhost}}
+$ ssh {{altloginhost}}
 
-$ hostname
+$ hostname
 {{altloginhost}}
-
+``` Rather than always starting a new session on the HPC, you can also use a terminal multiplexer like `screen` or `tmux`. diff --git a/mkdocs/docs/HPC/crontab.md b/mkdocs/docs/HPC/crontab.md index d259f52fb60..78a2f6f6d50 100644 --- a/mkdocs/docs/HPC/crontab.md +++ b/mkdocs/docs/HPC/crontab.md @@ -13,24 +13,26 @@ as usual with your vsc user's account (see section Check if any cron script is already set in the current login node with: -
$ crontab -l
-
+``` +crontab -l +``` At this point you can add/edit (with `vi` editor) any cron script running the command: -
$ crontab -e
-
+``` +crontab -e +``` #### Example cron job script -
 15 5 * * * ~/runscript.sh >& ~/job.out
-
+``` + 15 5 * * * ~/runscript.sh >& ~/job.out +``` where `runscript.sh` has these lines in this example: -
-- runscript.sh --
-```bash +```bash title="runscript.sh" {% include "./examples/Cron-scripts/runscript.sh" %} ``` @@ -42,5 +44,6 @@ Please note that you should login into the same login node to edit your previously generated crontab tasks. If that is not the case you can always jump from one login node to another with: -
$ ssh gligar<id>
-
+``` +ssh gligar07 # or gligar08 +``` diff --git a/mkdocs/docs/HPC/easybuild.md b/mkdocs/docs/HPC/easybuild.md index a274ff82f41..668eb9ad767 100644 --- a/mkdocs/docs/HPC/easybuild.md +++ b/mkdocs/docs/HPC/easybuild.md @@ -34,8 +34,9 @@ Before you use EasyBuild, you need to configure it: This is where EasyBuild can find software sources: -
$ EASYBUILD_SOURCEPATH=$VSC_DATA/easybuild/sources:/apps/gent/source 
-
+``` +EASYBUILD_SOURCEPATH=$VSC_DATA/easybuild/sources:/apps/gent/source +``` - the first directory `$VSC_DATA/easybuild/sources` is where EasyBuild will (try to) automatically download sources if they're not @@ -50,8 +51,9 @@ This is where EasyBuild can find software sources: This directory is where EasyBuild will build software in. To have good performance, this needs to be on a fast filesystem. -
$ export EASYBUILD_BUILDPATH=${TMPDIR:-/tmp/$USER}
-
+``` +export EASYBUILD_BUILDPATH=${TMPDIR:-/tmp/$USER} +``` On cluster nodes, you can use the fast, in-memory `/dev/shm/$USER` location as a build directory. @@ -63,8 +65,9 @@ modules) to. For example, to let it use `$VSC_DATA/easybuild`, use: -
$ export EASYBUILD_INSTALLPATH=$VSC_DATA/easybuild/$VSC_OS_LOCAL/$VSC_ARCH_LOCAL$VSC_ARCH_SUFFIX
-
+``` +export EASYBUILD_INSTALLPATH=$VSC_DATA/easybuild/$VSC_OS_LOCAL/$VSC_ARCH_LOCAL$VSC_ARCH_SUFFIX +``` Using the `$VSC_OS_LOCAL`, `$VSC_ARCH` and `$VSC_ARCH_SUFFIX` environment variables ensures that your install software to a location @@ -81,11 +84,12 @@ To share custom software installations with members of your VO, replace Before using EasyBuild, you first need to load the `EasyBuild` module. We don't specify a version here (this is an exception, for most other -modules you should, see [Using explicit version numbers](../running_batch_jobs/#using-explicit-version-numbers)) because newer versions might include important +modules you should see [Using explicit version numbers](../running_batch_jobs/#using-explicit-version-numbers)) because newer versions might include important bug fixes. -
module load EasyBuild
-
+``` +module load EasyBuild +``` ### Installing supported software @@ -95,18 +99,20 @@ versions, combined with a particular toolchain version. Use the (build recipes, see ) are available: -
$ eb -S example-1.2
+```
+$ eb -S example-1.2
 CFGS1=/apps/gent/CO7/sandybridge/software/EasyBuild/3.6.2/lib/python2.7/site-packages/easybuild_easyconfigs-3.6.2-py2.7.egg/easybuild/easyconfigs
  * $CFGS1/e/example/example-1.2.1-foss-{{ current_year}}a.eb
  * $CFGS1/e/example/example-1.2.3-foss-{{ current_year}}b.eb
  * $CFGS1/e/example/example-1.2.5-intel-{{ current_year}}a.eb
-
+``` For readily available easyconfigs, just specify the name of the easyconfig file to build and install the corresponding software package: -
$ eb example-1.2.1-foss-{{ current_year}}a.eb --robot
-
+``` +eb example-1.2.1-foss-2024a.eb --robot +``` ### Installing variants on supported software @@ -117,13 +123,15 @@ corresponding `--try-X` options: To try to install `example v1.2.6`, based on the easyconfig file for `example v1.2.5`: -
$ eb example-1.2.5-intel-{{ current_year}}a.eb --try-software-version=1.2.6
-
+``` +eb example-1.2.5-intel-{{ current_year}}a.eb --try-software-version=1.2.6 +``` To try to install example v1.2.5 with a different compiler toolchain: -
$ eb example-1.2.5-intel-{{ current_year}}a.eb --robot --try-toolchain=intel,{{ current_year}}b
-
+``` +eb example-1.2.5-intel-{{ current_year}}a.eb --robot --try-toolchain=intel,{{ current_year}}b +``` ### Install other software @@ -137,12 +145,16 @@ for more information. To use the modules you installed with EasyBuild, extend `$MODULEPATH` to make them accessible for loading: -
$ module use $EASYBUILD_INSTALLPATH/modules/all
-
+``` +module use $EASYBUILD_INSTALLPATH/modules/all +``` It makes sense to put this `module use` command and all `export` -commands in your `.bashrc` login script. That way you don't have to type +commands in your `.bashrc` login script. +That way, you don't have to type these commands every time you want to use EasyBuild or you want to load -modules generated with EasyBuild. See also [the section on `.bashrc` in +modules generated with EasyBuild. +See also [the section on `.bashrc` in the "Beyond the basics" chapter of the intro to -Linux](https://hpcugent.github.io/vsc_user_docs/linux-tutorial/beyond_the_basics/#bashrc-login-script). +Linux](../linux-tutorial/beyond_the_basics/#bashrc-login-script) + diff --git a/mkdocs/docs/HPC/examples/MATLAB/jobscript.sh b/mkdocs/docs/HPC/examples/MATLAB/jobscript.sh index 87c66d1b8ad..e3919962f1d 100644 --- a/mkdocs/docs/HPC/examples/MATLAB/jobscript.sh +++ b/mkdocs/docs/HPC/examples/MATLAB/jobscript.sh @@ -3,7 +3,6 @@ #PBS -l walltime=1:0:0 # # Example (single-core) MATLAB job script -# see http://hpcugent.github.io/vsc_user_docs/ # # make sure the MATLAB version matches with the one used to compile the MATLAB program! diff --git a/mkdocs/docs/HPC/fine_tuning_job_specifications.md b/mkdocs/docs/HPC/fine_tuning_job_specifications.md index fa6849ceae1..20499a091ef 100644 --- a/mkdocs/docs/HPC/fine_tuning_job_specifications.md +++ b/mkdocs/docs/HPC/fine_tuning_job_specifications.md @@ -49,8 +49,11 @@ This chapter shows you how to measure: 5. Network bottlenecks First, we allocate a compute node and move to our relevant directory: -
$ qsub -I
-$ cd ~/examples/Fine-tuning-Job-Specifications
+ +``` +qsub -I +cd ~/examples/Fine-tuning-Job-Specifications +``` ## Specifying Walltime [//]: # (sec:specifying-walltime-requirements) @@ -67,10 +70,13 @@ execute your executable to the standard error stream. The calculated times are reported in seconds. Test the time command: -
$ time sleep 75
+
+```
+$ time sleep 75
 real 1m15.005s
 user 0m0.001s
-sys 0m0.002s
+sys 0m0.002s +``` It is a good practice to correctly estimate and specify the run time (duration) of an application. Of course, a margin of 10% to 20% can be @@ -82,10 +88,15 @@ should be appropriate in case your application will run on the "slowest" (oldest) compute nodes. The walltime can be specified in a job scripts as: -
#PBS -l walltime=3:00:00:00
+ +``` +#PBS -l walltime=3:00:00:00 +``` or on the command line -
$ qsub -l walltime=3:00:00:00
+``` +qsub -l walltime=3:00:00:00 +``` It is recommended to always specify the walltime for a job. @@ -106,9 +117,12 @@ parameter, the amount of gigabytes of memory which needs to be allocated. First compile the program on your machine and then test it for 1 GB: -
$ gcc -o eat_mem eat_mem.c
-$ ./eat_mem 1
-Consuming 1 gigabyte of memory.
+ +``` +$ gcc -o eat_mem eat_mem.c +$ ./eat_mem 1 +Consuming 1 gigabyte of memory. +``` {% endif %} ### Available Memory on the machine @@ -118,12 +132,15 @@ computer. The "*free*" command displays the total amount of free and used physical and swap memory in the system, as well as the buffers used by the kernel. We also use the options "-m" to see the results expressed in Mega-Bytes and the "-t" option to get totals. -
$ free -m -t
+
+```
+$ free -m -t
                 total   used   free  shared  buffers  cached
 Mem:            16049   4772  11277       0      107     161
 -/+ buffers/cache:      4503  11546
 Swap:           16002   4185  11816
-Total:          32052   8957  23094
+Total: 32052 8957 23094 +``` Important is to note the total amount of memory available in the machine (i.e., 16 GB in this example) and the amount of used and free memory @@ -146,14 +163,18 @@ release. To start using monitor, first load the appropriate module. Then we study the "eat_mem.c" program and compile it: -
$ module load monitor
-$ cat eat_mem.c
-$ gcc -o eat_mem eat_mem.c
-
+ +``` +$ module load monitor +$ cat eat_mem.c +$ gcc -o eat_mem eat_mem.c +``` Starting a program to monitor is very straightforward; you just add the "monitor" command before the regular command line. -
$ monitor ./eat_mem 3
+
+```
+$ monitor ./eat_mem 3
 time (s) size (kb) %mem %cpu
 Consuming 3 gigabyte of memory.
 5  252900 1.4 0.6
@@ -172,7 +193,7 @@ Consuming 3 gigabyte of memory.
 70  3167280 19.2 0.2
 75  9264  0 0.5
 80  9264  0 0.4
-
+``` Whereby: @@ -198,24 +219,33 @@ This is the rate at which monitor samples the program's metrics. Since monitor's output may interfere with that of the program to monitor, it is often convenient to use a log file. The latter can be specified as follows: -
$ monitor -l test1.log eat_mem 2
+
+```
+$ monitor -l test1.log eat_mem 2
 Consuming 2 gigabyte of memory.
-$ cat test1.log
+$ cat test1.log +``` For long-running programs, it may be convenient to limit the output to, e.g., the last minute of the programs' execution. Since monitor provides metrics every 5 seconds, this implies we want to limit the output to the last 12 values to cover a minute: -
$ monitor -l test2.log -n 12 eat_mem 4
-Consuming 4 gigabyte of memory.
+ +``` +$ monitor -l test2.log -n 12 eat_mem 4 +Consuming 4 gigabyte of memory. +``` Note that this option is only available when monitor writes its metrics to a log file, not when standard error is used. The interval at which monitor will show the metrics can be modified by specifying delta, the sample rate: -
$ monitor -d 1 ./eat_mem
-Consuming 3 gigabyte of memory.
+ +``` +$ monitor -d 1 ./eat_mem +Consuming 3 gigabyte of memory. +``` Monitor will now print the program's metrics every second. Note that the minimum delta value is 1 second. {% endif %} @@ -239,8 +269,6 @@ htop the machine and allows to scroll the list vertically and horizontally to see all processes and their full command lines. -
$ top
-$ htop
### Setting the memory parameter {: #pbs_mem } @@ -252,19 +280,25 @@ a margin of about 10%. The maximum amount of physical memory used by the job per node can be specified in a job script as: {% else %} -Sequential or single-node applications: +Sequential or single-node applications: The maximum amount of physical memory used by the job can be specified in a job script as: {% endif %} -
#PBS -l mem=4gb
+ +``` +#PBS -l mem=4gb +``` or on the command line -
$ qsub -l mem=4gb
+ +``` +qsub -l mem=4gb +``` {% if site!=gent %} This setting is ignored if the number of nodes is not 1. -Parallel or multi-node applications: +Parallel or multi-node applications: When you are running a parallel application over multiple cores, you can also specify the memory requirements per processor (pmem). This @@ -273,10 +307,16 @@ process in the job. For example, if the job would run four processes and each would use up to 2 GB (gigabytes) of memory, then the memory directive would read: -
#PBS -l pmem=2gb
+ +``` +#PBS -l pmem=2gb +``` or on the command line -
$ qsub -l pmem=2gb
+ +``` +$ qsub -l pmem=2gb +``` (and of course this would need to be combined with a CPU cores directive such as nodes=1:ppn=4). In this example, you request 8 GB of memory in @@ -306,7 +346,9 @@ The */proc/cpuinfo* stores info about your CPU architecture like number of CPUs, threads, cores, information about CPU caches, CPU family, model and much more. So, if you want to detect how many cores are available on a specific machine: -
$ less /proc/cpuinfo
+
+```
+$ less /proc/cpuinfo
 processor       : 0
 vendor_id       : GenuineIntel
 cpu family      : 6
@@ -315,10 +357,13 @@ model name      : Intel(R) Xeon(R) CPU  E5420  @ 2.50GHz
 stepping        : 10
 cpu MHz         : 2500.088
 cache size      : 6144 KB
-...
+... +``` Or if you want to see it in a more readable format, execute: -
$ grep processor /proc/cpuinfo
+
+```
+$ grep processor /proc/cpuinfo
 processor : 0
 processor : 1
 processor : 2
@@ -326,7 +371,8 @@ processor : 3
 processor : 4
 processor : 5
 processor : 6
-processor : 7
+processor : 7 +``` !!! note Unless you want information of the login nodes, you'll have to issue @@ -335,10 +381,16 @@ processor : 7
In order to specify the number of nodes and the number of processors per node in your job script, use: -
#PBS -l nodes=N:ppn=M
+ +``` +#PBS -l nodes=N:ppn=M +``` or with equivalent parameters on the command line -
$ qsub -l nodes=N:ppn=M
+ +``` +qsub -l nodes=N:ppn=M +``` This specifies the number of nodes (nodes=N) and the number of processors per node (ppn=M) that the job should use. PBS treats a @@ -347,11 +399,15 @@ node can have ppn=8 as its maximum ppn request. {% if site !=antwerpen %} You can also use this statement in your job script: -
#PBS -l nodes=N:ppn=all
+``` +#PBS -l nodes=N:ppn=all +``` to request all cores of a node, or -
#PBS -l nodes=N:ppn=half
+``` +#PBS -l nodes=N:ppn=half +``` to request half of them. {% endif %} @@ -369,12 +425,17 @@ The previously used "monitor" tool also shows the overall CPU-load. The We first load the monitor modules, study the "eat_cpu.c" program and compile it: -
$ module load monitor
-$ cat eat_cpu.c
-$ gcc -o eat_cpu eat_cpu.c
+ +``` +$ module load monitor +$ cat eat_cpu.c +$ gcc -o eat_cpu eat_cpu.c +``` And then start to monitor the *eat_cpu* program: -
$ monitor -d 1 ./eat_cpu
+
+```
+$ monitor -d 1 ./eat_cpu
 time  (s) size (kb) %mem %cpu
 1  52852  0.3 100
 2  52852  0.3 100
@@ -383,7 +444,8 @@ time  (s) size (kb) %mem %cpu
 5  52852  0.3  99
 6  52852  0.3 100
 7  52852  0.3 100
-8  52852  0.3 100
+8 52852 0.3 100 +``` We notice that it the program keeps its CPU nicely busy at 100%. @@ -399,7 +461,11 @@ programs of this type are running on a computer with n cores, the CPU usage can go up to \(\text{n} \times 100\%\). {% endif %} This could also be monitored with the _**htop**_ command: -
$ htop
+ +``` +htop +``` +Example output: ``` {% include "examples/Fine-tuning-Job-Specifications/htop-output" %} ``` @@ -512,19 +578,23 @@ conventionally appears in the form of three numbers, which represent the system load during the last **one**-, **five**-, and **fifteen**-minute periods. The **uptime** command will show us the average load -
$ uptime
+
+```
+$ uptime
 10:14:05 up 86 days, 12:01, 11 users, load average: 0.60, 0.41, 0.41
-
+``` Now, compile and start a few instances of the "*eat_cpu*" program in the background, and check the effect on the load again: -
$ gcc -O2 eat_cpu.c -o eat_cpu
-$ ./eat_cpu&
-$ ./eat_cpu&
-$ ./eat_cpu&
-$ uptime
+
+```
+$ gcc -O2 eat_cpu.c -o eat_cpu
+$ ./eat_cpu&
+$ ./eat_cpu&
+$ ./eat_cpu&
+$ uptime
 10:14:42 up 86 days, 12:02, 11 users, load average: 2.60, 0.93, 0.58
-
+``` You can also read it in the **htop** command. ### Fine-tuning your executable and/or job script @@ -565,14 +635,18 @@ by the *$VSC_SCRATCH_NODE* environment variable. {% if site != gent %} We first load the monitor modules, study the "eat_disk.c" program and compile it: -
$ module load monitor
-$ cat eat_disk.c
-$ gcc -o eat_disk eat_disk.c
-
+ +``` +$ module load monitor +$ cat eat_disk.c +$ gcc -o eat_disk eat_disk.c +``` The *monitor* tool provides an option (-f) to display the size of one or more files: -
$ monitor -f $VSC_SCRATCH/test.txt ./eat_disk
+
+```
+$ monitor -f $VSC_SCRATCH/test.txt ./eat_disk
 time (s) size (kb) %mem %cpu
 5  1276  0 38.6 168820736
 10  1276  0 24.8 238026752
@@ -581,7 +655,7 @@ time (s) size (kb) %mem %cpu
 25  1276  0 26.9 614465536
 30  1276  0 27.7 760217600
 ...
-
+``` Here, the size of the file "*test.txt*" in directory $VSC_SCRATCH will be monitored. Files can be specified by absolute as well as relative @@ -623,11 +697,17 @@ specialised high bandwidth, low latency network that enables large parallel jobs to run as efficiently as possible. The parameter to add in your job script would be: -
#PBS -l ib
+ +``` +#PBS -l ib +``` If for some other reasons, a user is fine with the gigabit Ethernet network, he can specify: -
#PBS -l gbe
+ +``` +#PBS -l gbe +``` {% if site!=gent %} ## Some more tips on the Monitor tool @@ -637,7 +717,10 @@ network, he can specify: Many programs, e.g., MATLAB, take command line options. To make sure these do not interfere with those of monitor and vice versa, the program can for instance be started in the following way: -
$ monitor -delta 60 -- matlab -nojvm -nodisplay computation.m
+ +``` +$ monitor -delta 60 -- matlab -nojvm -nodisplay computation.m +``` The use of `--` will ensure that monitor does not get confused by MATLAB's `-nojvm` and `-nodisplay` options. @@ -660,7 +743,10 @@ value. It is also possible to "attach" monitor to a program or process that is already running. One simply determines the relevant process ID using the ps command, e.g., 18749, and starts monitor: -
$ monitor -p 18749
+ +``` +$ monitor -p 18749 +``` Note that this feature can be (ab)used to monitor specific sub-processes. {% endif %} diff --git a/mkdocs/docs/HPC/getting_started.md b/mkdocs/docs/HPC/getting_started.md index 8fe33ebc513..861b73df10e 100644 --- a/mkdocs/docs/HPC/getting_started.md +++ b/mkdocs/docs/HPC/getting_started.md @@ -45,11 +45,13 @@ it is recommended to make use of the `ssh` command in a terminal to get the most Assuming you have already generated SSH keys in the previous step ([Getting Access](#getting-access)), and that they are in a default location, you should now be able to login by running the following command: -
ssh {{userid}}@{{loginnode}}
+```shell +ssh {{userid}}@{{loginnode}} +``` !!! Warning "User your own VSC account id" - Replace {{userid}} with your VSC account id (see ) + Replace **{{userid}}** with your VSC account id (see ) !!! Tip @@ -94,17 +96,23 @@ Upload both files (`run.sh` and `tensorflow-mnist.py`) to your **home directory* {%- else %} On your local machine you can run: -
curl -OL https://raw.githubusercontent.com/hpcugent/vsc_user_docs/main/{{exampleloc}}/tensorflow_mnist.py
+```shell
+curl -OL https://raw.githubusercontent.com/hpcugent/vsc_user_docs/main/{{exampleloc}}/tensorflow_mnist.py
 curl -OL https://raw.githubusercontent.com/hpcugent/vsc_user_docs/main/{{exampleloc}}/run.sh
-
+``` Using the `scp` command, the files can be copied from your local host to your *home directory* (`~`) on the remote host (HPC). -
scp tensorflow_mnist.py run.sh {{userid}}{{ loginnode }}:~ 
-
ssh  {{userid}}@{{ loginnode }} 
+```shell +scp tensorflow_mnist.py run.sh {{userid}}{{ loginnode }}:~ +``` + +```shell +ssh {{userid}}@{{ loginnode }} +``` !!! Warning "User your own VSC account id" - Replace {{userid}} with your VSC account id (see ) + Replace **{{userid}}** with your VSC account id (see ) !!! Info @@ -114,7 +122,7 @@ Using the `scp` command, the files can be copied from your local host to your *h When running `ls` in your session on the {{hpcinfra}}, you should see the two files listed in your home directory (`~`): -```shell +``` $ ls ~ run.sh tensorflow_mnist.py ``` @@ -131,17 +139,14 @@ and the steps that should be executed to run the calculation. Our job script looks like this: -
-- run.sh --
- -```bash +```bash title="run.sh" #!/bin/bash module load TensorFlow/2.11.0-foss-2022a python tensorflow_mnist.py - ``` -As you can see this job script will run the Python script named **tensorflow_mnist.py**. +As you can see this job script will run the Python script named **tensorflow_mnist.py**. The jobs you submit are per default executed on **cluser/{{defaultcluster}}**, you can swap to another cluster by issuing the following command. @@ -162,7 +167,7 @@ module swap cluster/{{othercluster}} This job script can now be submitted to the cluster's job system for execution, using the qsub (**q**ueue **sub**mit) command: -```shell +``` $ qsub run.sh {{jobid}} ``` @@ -186,18 +191,20 @@ Your job is put into a queue before being executed, so it may take a while befor (see [when will my job start?](running_batch_jobs.md#when-will-my-job-start) for scheduling policy). You can get an overview of the active jobs using the `qstat` command: -
$ qstat
+```
+$ qstat
 Job ID     Name             User            Time Use S Queue
 ---------- ---------------- --------------- -------- - -------
-{{jobid}}     run.sh           {{userid}}        0:00:00  Q {{othercluster}}
-
+{{jobid}} run.sh {{userid}} 0:00:00 Q {{othercluster}} +``` Eventually, after entering `qstat` again you should see that your job has started running: -
$ qstat
+```
+$ qstat
 Job ID     Name             User            Time Use S Queue
 ---------- ---------------- --------------- -------- - -------
-{{jobid}}     run.sh           {{userid}}        0:00:01  R {{othercluster}}
-
+{{jobid}} run.sh {{userid}} 0:00:01 R {{othercluster}} +``` If you don't see your job in the output of the `qstat` command anymore, your job has likely completed. @@ -220,7 +227,7 @@ By default located in the directory where you issued `qsub`. {%- endif %} -In our example when running ls in the current directory you should see 2 new files: +In our example when running `ls` in the current directory you should see 2 new files: - **run.sh.o{{jobid}}**, containing *normal output messages* produced by job {{jobid}}; - **run.sh.e{{jobid}}**, containing *errors and warnings* produced by job {{jobid}}. @@ -231,7 +238,7 @@ In our example when running ls in the current directory you should !!! Warning "Use your own job ID" - Replace {{jobid}} with the jobid you got from the `qstat` command (see above) or simply look for added files in your current directory by running `ls`. + Replace **{{jobid}}** with the jobid you got from the `qstat` command (see above) or simply look for added files in your current directory by running `ls`. When examining the contents of ``run.sh.o{{jobid}}`` you will see something like this: ``` diff --git a/mkdocs/docs/HPC/gpu.md b/mkdocs/docs/HPC/gpu.md index 53f4ab1ea09..46257f80c64 100644 --- a/mkdocs/docs/HPC/gpu.md +++ b/mkdocs/docs/HPC/gpu.md @@ -5,14 +5,16 @@ To submit jobs to the `joltik` GPU cluster, where each node provides 4 NVIDIA V100 GPUs (each with 32GB of GPU memory), use: -
$ module swap cluster/joltik
-
+``` +module swap cluster/joltik +``` To submit to the `accelgor` GPU cluster, where each node provides 4 NVIDIA A100 GPUs (each with 80GB GPU memory), use: -
$ module swap cluster/accelgor
-
+``` +module swap cluster/accelgor +``` Then use the familiar `qsub`, `qstat`, etc. commands, taking into account the guidelines outlined in @@ -158,8 +160,7 @@ versions. #### Example TensorFlow job script -
-- TensorFlow_GPU.sh --
-```bash +```bash title="TensorFlow_GPU.sh" {% include "./examples/HPC-UGent-GPU-clusters/TensorFlow_GPU.sh" %} ``` diff --git a/mkdocs/docs/HPC/img/ood_jupyter_custom_code.png b/mkdocs/docs/HPC/img/ood_jupyter_custom_code.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e75227865a919071a8eade22432ce68dab1a30 GIT binary patch literal 122976 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 z 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

En5obn1F6<9nn%vs)rn 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 Te;%`1vgl|TK5lsQ{Pq6=NE^9_ literal 0 HcmV?d00001 diff --git a/mkdocs/docs/HPC/img/ood_jupyter_new_notebook.png b/mkdocs/docs/HPC/img/ood_jupyter_new_notebook.png index 9d63ff7550f459b29994f8b9032be7a84e4ffebc..012cb720308522c6b1119d44980e06920d97152c 100644 GIT binary patch literal 47364 zcmagF2T)UC(?6=BAV`s-NLQ-#UPDn(L8=r5q(r*(PUwg<0i_7iAyNa&fGJTIg{BqObsm{}D*J=~*Tw2{Cekb?PF!jE6jk@dV zbG<3qdHdS6rp%Ymo*MaEZq1RuGa74G*>$J85qb9^XY%c=NP)li@4TG*IR4(UVVlG` zN|mJi4+*B{@ey!t0#qH$B__CqbY z8;|-4mqYCis{@0%y|$UQ5@(@@VxVjQXh-NI+k2=zWic@b7vk6k)z>I{!BO_bX3PkN=ohxx`(RK(9_b=>R&z>mChktuDOB!kb}c6X0&!5 z5FgY2if^LKsZ{^r>sWeDl~oR1w^D)RrfpDP{Y}3O1LZxEMfsDc1T9?8@g9;l37+#6 z5XxH}^3*6*Y+Gqnusvsz5iy>(A2=715G5qA-w!+M2m0u&wW6eNaa=Bt&6PbPUJRn= z!X8zYb)=$gyC2!{OFFU}3;ZngE3)R(d zb*4cXZvba*SFGHD=Mds`-V6{dpQ4AAsi=+1X^jzhTEX(wO(0!9(rIU(0P%lq9 z#+NBHQE)4SYleSDbcTt)Liu>o=6oELzJIxbPdAqUEFBZ|tZ$7u>EySP%$gq9Nn$oE zJ7R^5XO@i5v002=_9~jbxRGf(r1f#i6*^ZE!;=~qQDz!*vz^7QiJeCIbo0sS!Tt=X zDO52!$@eTu?UB{+%?=>peB%5~ci!R5=N|XmZso_K(2;?YQbXhmrCO>TRKNG8PV{j)G7<-s%^$yqZ|b@Wm&}oku)Ns*JCWV#Sgp>krdk0E z*lDiZF<8uWFV`UPbw-zim1U-LCPH5K=tZ~y@&)yf_#96Y6+Ca z&iz7rnlU2Xiaf>Q-j&BxiFx>SSQ@4;1gFmNshXSKF6(}c$4}hRt+?M3MZ?| zTseLH1G(0RD#P#p{2JK4%M15<9dyzWi$)|C{`_gc*gTvi?RDS7sI9lZYY`GXVf6ZU zIG8QF$tj&W!V2@-W>#|hqs5uXl29>EU1@9?ULEVnPHwwfN8Gd<)$(xtCjIGXXI zPNX%_p}tEuFUAxa;BrBy9<69x$F_Qw)z6)|#NuJ>IkH(jDYMOmuI7{ej%^l7CaQ^2PHc*f;w6S?1r zwyM)%`tE#t=C*aW3I8E&WreZ0>45 z#JH2t$wdLzw_;I|I*xDgN7Wpo@DcY~D5EY7r1}PgO~!^PiD>Vi&PP62+<)mL#TV?t zBO!{Ndb#gKAg)UO!9enTcS$7FBxFjEl2;Y_*U(X*V^d3scb%=qngh^@kCE&^(_DbfnN1=-C&%t{+ z$;tV{exZajEND$`a0_CTJVQTbcmC!^3Bv|*3i)A!M>YA0!h7 z%OO%H1&31Qh~l<+F1Ovoyb<5k)|PnU=fsIWnN#x_Zo0@VYlMm^>|z`Ge?McEs~aBh zi}^UDc%Tis`T?Kl^kJmB}dnr zgL9$C&zAN+SIj=L(*PHvP$>4tbet=1GM+e+^}ko;jd*+&LLAf-JT$2w3;>rbGdSRC zv1fB|X5H7?$QJT+x+kqaDs5ePul~^|I+zL)sZE|(Qex;&0#VAnVzMPh2jjNR5JD@( zqdG(O|mvDkELK|&z_||81VcM zWml8#|9A5aEIlo)ps8t+Egtm*du?hbCx`Vjt2`Y%no7;dNx;Csz(<_%6%imEU z;UHLi`-Kh{(cY1a^L2Y(4|$n2aNkU=4dDD7OI4bRN!vBf^4r#tED7AxE5u0cFaYu` zvOXP5QGJFxIa{ymWa|I&nFrSCNZGii`s~@$l5z%GU$89w(Ho+@Ph}`m+0VRrD1U}F zX&+`1h5?v*LFoXlkbz*@qwNE^4+vN=HR=dS0m|tvJKbpAtrAtLI)30=f>H+tGIs3V zJfYSHorZvk3>K^(j;%q|!|RM`+T5j;^D0z}Ai=>pxvftKwV;9k<>Lbi$_b@#QJw5) z!Vj+(+jjMRWFABEvWt88Fp3b}m`>2t%5^aX^}-u8rMROf#Q^4R@r&7_$d318d zN`dKke~0KDEyZ+`jluKQdvX^$u>)}Iyie#NA~l9Fcd>#{;9kBL<2lC-LTs$eEh-Cj zOF{kDdZngHI{n9^nlSLrL~!M8Q{7?1{*J?~#1GZxiRHsdju1441KZ649KhDQ1g8fo z;(vjxu8%K%kwx83^#yLPrn~$iQ7GzQkeD+)Sp%0sOMD*^;xXc(UedbI5~|gLGwq23 z+s5HTjpsXs(ZOrAHIysX2if<9gL3~d6m)fCaht}0Kln}(1w4-J;R7KN&vlUMBY7(S zOvnkWd5pdZ8}7qq|Nx6$Z2ucp~|a<^>4er`IEOvH+NC1_@rY0lQ& z#&|}-YUt=xUhF7QGYsum9u4=-&{N(lr9304A@KafrWXF#7|f z<83L{=J?A=bM_vIUg)EyP}3N|{O#Q8W36JvXa|B3KE2_yz@rOE-SrUq6&Z}(ihK(; z(LdDknfU#UQ|r~Ket!h+bP$R~bW50MfqYLo{)w>2cpNWx6_}!gZ07ljG`1mTBm(Fz zeTO!`L4^25a=_%o^p7z9(uQ+TX%qJ?!N%qjY{U|-e2NJi72k1lmf&Ldr!8(R^k(px z^|Be#Hf8Jsz%ra{$n;Y}49IFi1X7V5C`kc3l*5c&UTV3$5foOBGVN$&%{G#|lljK9 zigPwd{H5#^qBKXG5rkhCn1w#MrK*Pn)%fh0yBQ$a-wdnY+Vu^@uO(NHUvySgHetCs zU#m?2z#eqwAdk-5sw>%HVUIeHo{-kiW-vvy3YDK-Y1q=8$CsF(xg)JJ*|z2dd&Oc< zb8BuxBKpo9zl9E1mfiTG{idh2Va}kjn(~3s-cX8bn-9G*>*R|gb0F}Ocg32(i9SiV z=e;S=s+^Dp zuey9cPsNXVE7V9vb5P%n3eRE9L>HD&+{*>fiFr)y4uf_FHL#Vw$;O+eT)x$6oCkP4 z^lidB9tWOA+_L8E#om)6dp@$fOODHR!Oh($)18|<1oX+`4;@0hs{xm6`Kw=b#x=v0 zxqw|L;g=z>S>9*5!}vor1LtMo;TLjmj?O9=3bMcCk`uJk+{9m$CKIW`ZztoHtimbuEv)Uia4=sLwM*ei^LgvpB3Z>n=^D>4WM*kSd#<#2=l`(geZ1-m{4AqhV6X3(7q z1e164$<7)tVlw4x&*Q zl|nTBRu}Ip{&du56|%I<$X*V-q)hwzs6gMoEO0--{PLb;CHqQPnq%GUijDbDMm%_X zHa2&7HlEt?2FO{|&T?Y-dED0U-w@`;48qo4S&AYbt?6d@Ts#{a(R(wGgTWF9=%y3+ ziB^B*X&}Vz?))!FVd3|CY3@LV{ReaWLu!#6G-;WS1~DT!p)0Q${S^AAt$r8t zpUH#o?n@5%4m-itf0XZz8qOHils`Gc$)Y*$mD&$>Ol7`lr6RQUX4K9N3+o&t z#yt2p`#|I2U;JHbZhG{n4GI2{Cc~|e4XB$#%YXzLVzZNI*NXpeLh9sv@yH*evzu8J zR~L|v#xEYKi1okaJ#6lO@4=P~sjH!^qKlmmzUZK%F80sdKm{C!3@BVq9+;Ytdha2} zBo<5JJ&;tev+z!)!CYM0Ubb7w*%0yA?-1!}n`^ z%tsXFD1!}VlWPs)dxUI5a_JmoJ4A}0Ggm)1qZt?XvDfC$I>QQP2aJo|w!^FkI~M$< zo>xnE`%e~B_nz4(5`e>KylDEnA*Ng?Fz%8I4S^BV1hi2fvC*S7uNT&6O!xwGJRd0^ zE^;i=-wBJ%cE~RAc60)jSbUS@Z*r;7oTEQ&hTgB)Pi(S7zCQhXk(&}+5GX>=hZdM4 zj1HuGDGV81-z>wlk4wGIX=e{LXH@#fq-;Z7MTnztx)a8(n6JqW+~#Wk-0Z$Gym#=V zvVx)ghO?r~uc_OF01P21z#!raM;NCM0MJf49&(5Zpn#g&D}fp=LGGax#uih}X}M86 zv~jX7foFqI_u|R^Nn|_Eh$0r9p~^sWiONont1RDW^gwdfu3h9w*&di>&XY_d2mFgx zx`olNkOPXDmFl^B@g2T5>_EX}&$(W_i!>VwMSBG=4J@1&2uCZS#yr#!{^qBm96dOd zW)5JpoHk6ey)6h_A%FUEN@=}m#Xvh-W>A>MdPMP}1G2dpd;|C^D!jy7a$D1Ug|x#Y zo$b*~X&;|L&1wVqoo-sIw$$)*VZ;3u$ZkWwt)&?2U>1m`>T-`W1T3l?&}o61(htAz zV+O@#J$R6JbT(15+ON`G(1~`3M>%Cz)u$!z7wTo4Aw4z>jTfgb)_RmvHwI5KMX7;`=evLb$^<0hMXtoiv-r#MR*LCw6yf{bl$#q_DH0gTl=q?7}v!TL&~i%I$*~o zzj?z7Uq(bJ)S8BxZV|RuWB$NCuNl@}p&c)^vjS}sLtd`ZQr%xwV%cfm%w>0M z1M~;>w$+3qFRoL`ii98R_lr)zqc3^hAE1m+bvE@v!wrZ0(?2-gaA>OG|3BpB0Zn^? zOV= z#2F`}%0myf93{5cWV@;EV4H+j0P|-F9i>Tw7hRvFI<5+p)m4mDrrWA-1NEY8CCtd! z*yeEkpMov19%PZ=?=Zq$3i@wU(4c31K;6f{g^vW22+?_873HKqPb)kbWpKw}{|SeR zHQm(j-E1tjEx2|UQ9k6hC-SD7Ta?l~FLL|hLU>|K;nUJf&_R5A8`E*e1TKvhh1gGE z>5$Grk<}u$X>u9dsUY(|yV;4A5xcXUo!y_Iq4AI>#eT?9k1Sr_DJ#FzR4c3BR6&!w z*)KxS3*e5pe)o%b!0PG954O{j%pHw_X&5aKmp<6EPuQ8@`$5a|Lj!R$(;lJ4078v*)@p4 zn&9tL^m6U}nVztVnah%+7>B%o7i7A~91$q5%XBz$%bZk~vtaTLNLvg!cv23MXG&kf zg~}kcbs$QE?9_-nzJBK99W|-H1tEGdENKH==+J}hjnIQAC6~yXx)*TnEl(zyUrAOQ zcTA0p7)D$k4b&(NQvZlnfN$7wwNI}1i`~-ifd(ttXBRDpsNgu8L`8QD~*iNml;rH<`L<3=DZqc;jnt zUy`Ty?AfTru_wY_4;s^|AR{d!Q_$FW|Llz90N(j5_DOe%`4bA;o4t_-w;~!wo@pbx zZjmp>Vcq=gY=q{kG*KR-hKtm%P#gBM$}*YO)X}Sx+|oH@)U5BQ`1D0JsMe}1T6d3U z+{vnzxCSa~oTb{O!Hq>^9KmAC^sdT(L!qdV>FKyTqHV7TRgzbr!%-xw-sL26utpxA z;YqKo^EZ_fQBqRE%c|h>DLkc=k=vsKf4=FDKU*USm;C!|N2WI31KL=$mNzrKk>VDX zu}uRtTqfC$96Uaj`OKk`_a7E*R{ha-da`idcch6gbt_9|vugOC54{Ro%LP4pyyrkrUjv&sl%km7+6Zs114H}3|lb4Z){+mzy#3>0D zw3^SN`=T3;tTA4&C_70b!WAl$2sW6NyqJP?uA(yS5zpD@sb8zIgMuy#451(ye%Y*V zSF~?o_kLsLdTi+QU2d9De`FG)gPkdOWHF)4M1w+i4esOniO|chk0%d!(8qhd{DG;T z0te5;JLhS%GT34Y+Br# ztQ)rY^mr)a#8JD~v~LqO-4ly!EGHdW>vvt|jBo10g#CWcD>`g(p$X#DTrq#(`5u%r!bZ}q^1{ccKg zaRAqg{5tA#tXXtGx%-oR01xLJXvE12*z~rt>!-W)D&HUi6Ouo8a4-=mG!~!)ijkQG zNLMYcU5q5o4PN|B`gR&_*qaqb6B?j1p|eSMUnLTA;`$F*)cz{=Ed zUE`CHLm|Z`gk8k}LgzD(s=va``)}TT8{6tQYUBB{Gdk=|l9uy2&bp4KFWm;dlx=j| z*Fj5+(scNZ?=pn|4A5KYDShBvi&>e}&{QDXY1Gz|xUu0?&nR>LRlM`~ z(~U6p`B#rW=Gdzvm`AIG;ckFFdf_2PuR?CI|i(G%B^3FB8Wms6?H%h-RCGXEfQt9I8&{lz?Mbt08<(q|1 zyjxNoPiJj*f_WVJ#{8Fh9lpb&ZO_~-qN^=xg~Td5EqS0C`jpTikdvWp{1 zs6>`KNoKr>@FeuYY!>z2^W`H=y_*N9!U}9X&4X?aMg1@6wU3)GVievSrs9+ z)8e~N%6bDHKWTc%C`e!HpNmYjT!`+`?W!Y7OV3{QX`PfVe)d!i5^Y$QHSX-?(ExZ2 zF#OVLB~c+M3Ll$L49|iVSC=>{q?h<*zKO^}Oy=l58=c^GL3zMo8#PlL7VVZ(8<+b@ zY%;~7kem93+)2lu4b_^rI&R~*qNq!9vxkby+7GF}KdjzV{+@f!x@&Q&~w zE=TOSDu6Ds&L@bAq5?4TF7{~o=hcP_TSGC;D$1uJLsFIV{#?tc;A^tlp>7)-xxC&J z@hbJ%3w0h-=8kDF3c-r2qHzLQ)%!F7@a5B|Kv6EP!g(i|FDiY{cNtT)}>2e_HS94(nnXpngT-)UmeTO zX4tPO30tmZaEw{nJGccjy8W5q;^Yr-<166KbpMRO!or5@E~% zo%<{F+uGn78rH@5?w>XLmnpNLEZs*;gI)z&=s8(BKGsn1-%X+@)Mai6Yte|_2LDW5 zY;2SX(WxIFe^Xyye{<-5j*M$o2itpoe*Qp~*iV5U=O5v;bZ_kMxO-F59q(ym*d&V~ z_`F@dqQA<^^m_KmcisLoJUr2_&e@PT5{WV#X%iXTdKSC7y9oD3e~}$^sIVX`@(EM@ zPuJlGzC(&{|7Efje>X8B37J6>Cj|_ZCqEL~Gj!KsYUk;!Ne|@0Wsc_ak8yH;-$2}H zH1*+LK|c#kztO+%dKtpSR`U^;uh0izr0YNboL`BFPKzU zFLQl1Yq3Z&>8sShoHet+))f&|J`zZG#4Xw*(*Gf|#N)9uTdDe1bl^gx1i;`FHe*)m z7)0U@9bdmz7GW3kz9txg`_SqW3=j^u@q6Zx(Olo@P3d6!z9~7t3ahqutWO9pv&#cH z_(IpmPk|9vQli$_yDJy8X{3I~ud(Cv#Oo>Kxq{Q%`Oa(s+rI6+gcqQ){71t4Z1V7- zf6s5cx9l_0)(YV$DanI4>pOZ_El@^~-63u+SGj@wL#oEkfC{u&BUCZb*i3LQuz%k7 z@9fxl93Y)j-eEGxXE#S-OR09JKSyZzg+k+#t@C@3lU3gse{XH@Aa=&H(>f>D`UIPv{N8V<_g;Hi}ERjQg(4 zCw7-=B+jV#PS?L<&}`7*=dHqS+Fwon{)^1t(*9$*e{bSg z$G-%pr@-oqs9!!=Z12S)nqRIhTD-(|wSJwC@Ud<3259N(>dz?D6OtTX(4$^;9eklC z{|?yIL}>Z9hqMA@6;i%>?S(Ig{j%dH#C=@Wnk`e)3xk1C{x*zPbqST_|K_BHUM|s> zwX392<(=Wh+qQAb72Pk|=dV`zEDCO{o@L~#t_GzHAxew>?aZ!=d7J~n(UbpcJ+Ghj6}gg(g4)-YuluKraeJh4cqyQwJOcZrsSn6%T<`bNm3Cbt~_8v#n+-+)B+ z$IOJrsx(xNh0wN22sYnc<6|uI%4FXWCLLPGwc`RVD{)Mhm1riTdZkU>FI#Z_JGBp2 zUf|TbUUhc%UbScE-X+M&1Z9ON(yf|s4~PpGECh#4&hMpr(x63MSq?+GnbK0@`isim zd^<1{fp5&=i}(LLkPBM9O}%v1DC}Rdt#|5t0Y1z;Og2xx)E8nt4j9nxn9Ti}@j&is zBB+#QVDGoRUR|PkH*0*P{EM?&LzpxR|Mxv1{xZHPmNKm5j|pGBs6@0f>5=hYB|VNU zoe}(s$UVN)MkUk=$6ezh^Dn~?R6?C+6@aIfa<8+uZZ!7&E*hjk_)78>6qaq1RP%q< zR?f6ZA9(2t4L@02&jx8gm4&az7@up?cnPSd-5)ah83bZC;_ zdFGQ!JpnX{&qJm-EGCSCZ8S%GKz$3cCL|Ea7sM{MhSCI{0bdxBK&&8@GgY)Lz5prb zr5;+PSeHMxqs9v!k z+?rqN)qQc}h}X+&Vgf5|3+|-uWGr!(O5>%~GdnqDq=JoZcIVa9?w1Mp|#VpDfjve^7xPNSiO{#znoZRQaW6hV?+O zawSCrznn^z@aC@RG6j=5FZlc>cJE1(=X08>4JR*ocMt`QqD?kRTwR7)ldS@Lz>NU< zVBEPLx*jR9mwA+%9g=(Pfg8Io;;R*~+oFtsPLS6vV1l{hY5^~Bu~)Jp{WdW}NI>Y} zP;B0pK_dpir8eP!ac@@vkG#oaLW>XtU;DdVeOSp8U3rS0+0o$m`?PU6QMsKlrmEav z6)jlSKPQebblt2iM7!@iIASCQZcb(+cEA|`^k=VQIexcyS+vzAqDLCmEebojsSHiM zEc8}2qNAF7!9Fph*>`puAZfmH^;INOuTL+k zEfD}Lt6!g?Ck4l@`bq)Dh{}a zL9invb5$EgGc2R-p^lD8yjP{3Bbu!vy~hgj?*EV4hM11oiE8t>5S`1PybWsRGL!0$ zEQDK3mK+6+wowSR7aZJ*6lqeug)nyJlu`qne4Fl1;@v4%)hnPi*6a0*`OLa(PIB4) zVw`L9lovA?8|pwbX^Jf&R(ZebM) zyeG#~ON2s>ApE^pzZh20Min&mQ9CWxw4%C}X+t5qozV^%NFyB5C*?lF(>T%j`E5_< zEU0gWFwEw)EbejK%6?0i@4bWz9j!j0)xHNZ`v@^V14dw{FYwcGg;l}V3abL2&}dDj zf~#2r_GFLz!FQx8%Xe7~!n31TrFSNL@WeuA?58~Kxl%ODJslNFs;B5DT_uv*px#X7 zuzD(++q&6DUUrrfD_RxI2J88f!H(9FuXGH$7Itu{FTq!Q0TYl;l^hCK~BvJ(bVn7w*_?9pm z)8J-IitJ-DIcJ{1`l<(%7nC57#r*l#vBc4&lw4~T1;XsH`sHcrG}--TnYGW$ z2Xo>WQGGI9(m}j_DD;3{|K%Oy!lB%>n&Zmfmqlm9nHn}e&NzeKKW0hco;w-nizX&# zgB<4GJWc(4gREggJ|ISSLt7P6cD7}viwxuw_=EF9R9|ZqEx|kfiBVOXJp*@(Rwvi> zj|I~&3=x=7`kUsS--1;5C7nDn*SK@b!;Tod*v0y_;cL5sZT4VkqRE)=`g%tPd06b% zWiDPgYOecyJU$dlH^r3ALvc6f<$VhQt4ZL-%h8(Z78{1jcTqO)D~q)$+NppAcwyf& zHealJ8CWsEfbhmXn2;98_C|Ez_t%&?eOLKLKcVOOfcv7D@d5Q?t^@s6H*ww;|}lJ>OyAgiWaXgxa%+um8O=cF=m$k=?Nt;LMugOD}hRvWX}x4r`Pzd z=M(KYbTo#F<^HL#FMs!CNgx=X))KrhnEnCx>u!2u(#^w_tPmwk=%4fpq1p48zt>D;XDq$g?)*!ztd!sJWseN;gm4n zaLRN$S(MsZJT*$V7u7H3?khYFWMp3CwS=;>t@PJcBwa6s@LHZ+dm}vg;V4Y!G&+nk z&c@sDJ{mRJ@E{&J%b)POsPGi4KmSVyq8tZnboYXsYcYE_x@o%4oVY;aM?b%C3WebJ z%x4Twz4{d^-k(XJHsls`eLw3mM_?g%_KA|zCd1NJ?t{#N->Sb0g_XA88H@iG?+X2J7B!x78JV>cmpS1 z{A??wth@HD{V|)@|yDl!i({V3T2EEZIGLxLu2V^MNwe96N3{_EUir;7s!p)Cb;0B@FR>Y#Ti`4sN#- zSDx6nN^MlZ=u+{7NEFMr%SMs@PHW`bi!$`yYcK?N-q|Kjp+=x`jXnUW!YH2ed(ZMq zy$T#HVsHC0-#O)bP|qjUEF(1ZTgU&2iV8mw3`nxQRrCa=mNHEQ#_aCVsi{Kh@>Cf#pXd_J?81Ckz$=ahs#F02#5)2ohNbU=hH~jKD$#QZ-?;EJ0WXQhGD?s6 zTan!}GyV48v_SD-yKh|1yba9^+HXTYrDgVyhgmi<0AQIZ#-NLmKbUo_xLW(u@iGY^5W;~7Y^dzoXvT0j(g2w+|(Ag{XXS}Z3)(1leyXGpGpe{Od`;k3S#QPHu)Umv08vWzhpfvp$r z?E9)i3x17OXWw#%Yem}(e)T?9wS1b#1}x-}PVQP$yjXc%dX%%_4tn&*ayDT8{6JZS zvjCMj>3QGH@%&N8e9ar6w|EX@Ca-f_SoZtrvZ+EazRXql7%dDEp{kEy^F8&Rfw$P7 z19kH%-3is(v>-PJV{TvskeUDt7Cn-c6Wm}02^^*6xQ4D~PGv}K3_OwFtmu8TvQ;-s z!7nfG01}w1T1>5RobdTAXc5FD9vme@4npjELC<81BBQH&=mXONV?s7~p@dZzxw-2_ z8iq==$;K>iJ!{&--innpcF?G>9t2%l4afw$^gxme@CV58e?Q=B77*n`XWfC$HM6yM zJfWYA4S>(yPXDn?w}Kl4L+X4)2pS>euwU(`)-&qjC(EsSxrSh*bT;JgQpeleLAH(u zriVMz z+*>GDXI$#|?T%hV6C%>z=KWecj@bFy4%%NPznYh=8xie3(Yp}N1N-0Z|9yE=(twN5 zr){_S=5nd$#6u1KIwM5t4p6D%8qBSoOq2(AuM%!{sL*OSf>b}#<-in&JQEa1$%DJU z#li;>D&bm*y3bz1$@UKD`}d%RVZOvLgMB%OfFdq$i{^OVK1l#Zoj`y~7Y|}h&JS>- z=`CYLZgI#WR23lnceSd}Sh_MMc)U*ePP>Qc`}wEoQt4!RZT|ryOU0x)e!10EyES&$ z_^tQKU%at-u99bJVe*sWU{oejvD#Ho>>?q+Wn-18wBI2dw!Uh&xU^6)g*e|gz`_p%I9TOC3(Jr<_)Em`V5Sd&0E4#snie-67Z zTNK9D%x^f?jL({8**)y#+e1gsc;W!Yi?|EKk`39xUTz^FTpAIUkgls#E-Iy)EbYgt z_PpQQ35v27XSNe0-e` zyX4yRiEw$B>#+UQ(^$GV#BtxcV!oB42AtlPX$Bx&XAC+d*INCm{$uvWEXLKqcqVw$ zqJ-nU-cTH0!86ar-Tt{pVZPfJK1o5BJ=nd2-z!b+i{4F(>oL2@aO7TcA<{Dh{;jF- z%=`3t|H-cHjFXX{VvNF;FP1I$<6`cx&|~A8C+x|&02fkx$RV_5=g`&PsaqtN3(cORa!Imd z&a7R4chov#(jw0w!e4=>J+bzz06$7oQ-_{2J+l}6XXM&vuQ{<%OGJzXD+OXjKxiz& zVc@{7+>xLOzA!eh)5Q<`hMjlY*O|-9U{LJ3#-y;yUKkM;{GnxGh7|#GH~es*0g%b_ zuf0>%l+o2wCV@b-N1^D~nct&{sU=~=|B-Y**$l?#lX6ktb!j1}MCkX*`_iuN3xngb z9u??ML5X?2n)39FG@|3h9?!&ww0k{?P~p`;0{(0`j8jR;f>2S+aAvA?0TC`Pc&RHS z@jS!P-emp-i=1AL9PQ~tt#!rFOF3p17IDv|XIB*!CXIvrf)o$gAR{LHmoqi)3zBTm z^`xnp&W(nH(f-L$%-NIVJrgZOw*$knUG(pc#53RWdptH^1sc7QNv1=)nr-eD~+|djMmY=Vgio!%FSzAsosaK zmVHv%hSv>0+B=PSfcTk(NQFEa>+4Is=yY^+y#uXpUCEDz?r)w-^R0P+pQK;Ijt9hV zxRMK&xM=|U4qtsjHl(3V_zitqPBJ*^_4!-P&H+tjq(v58 z*N0oWXSwMzv!VDV;G20Rp*{ecolUNQBXe+xGSHaOhlcyD{OEK$^Dm8Zh+< zH)=nH1)eBDO2^bD;vC7R(wVKKfL^>yYMXa4Ug=N+7Uib8N|KrQZib0$H=>qi(Yp{9 z8_S;@#;Mc23K{9xO8Av$4m?MK&+Cb2zbM>6Z^?^C`$T^Vn-qtg4P}lKVD}+V1YTOH z;K7Fef~}zf@o=Gc5$-NN*jg!#<3d8&@B70aNtr2LBKH$oXisdbx(T}eR4S||fMAbh z#9^<%Z}k@%^0Vn@N7Y(uI;i4RP zxzLG2!;ryV53d*gpptTRi@Bm=j;1>(*x! zY(2W>;lAp0xl<3xP0DPP`>`ounejIAgz}D3_GNq_42iWe)Tmrlqru$=UQ7#5c7z1M zCcHHN_J`Vr)?|iY1&kO1N#;m}nrZx>h}JPg?HJ99vlJV*oCpFFsN(BhKN$F(XSU@i z>pQ1sRJq2hxG)PTykCA_2<{@7s<|$#1R2l8R)9<&U4RX2=Q@PGn%k>Z!5l*!AM^2% zAxm_SCrt0X0z1svBR-Y#Mel?DEG9&hV*IH^8C#R^#-(fGMj#O-tO zQ-gSj?>Cdf0tgnQK{nLVvOYAw(`%P}V^QL7%uiOquRBjssJ|UK2HA2fX8$}} zAIelAf`<>jcR4(%hHr4l1+Wok{JLJ~UM2%C&ycYy3!;4NUnUumN%UbwG^;T$h7e>g zg5`=t?LnF7FaBjKra}R062XFK<>0_k;vP+a@(q2jFr1%U4e2FrQ}8aOb5O z6m{NEs_Fo~sVl4P_Sai!=O>B7ni!*qM>O8tJ2hO=Rw)j+a5y!-LYYH;#S77JBaDGL z7CWFNJ@@vo)8bQ929T_K^@*4RL~C%BPo?>po@7@YLCCmk$n{5KJli$0jK~pgw#S3V zuCL8>7?_AouKy7*YMH1rxVbxLBfD5gX8+=z1cWj>;dvpRM5WI>e$celnogp9^~-q$ zK+0oz%ZEJEpr8M`PgtrBCdAr{ouY=a*fZpYuDm8TXS(%|F@rR4b@;d)WK(W5XM zaCqnRFkf(Yj0@a}DIs*TR93fW`5aeSVf~11)o?m@Dtx*#2}T3eLvKL%$N~>|q#P9p zi!@>1BT6ENVnQ#>6c1Zt4x4ViYVBFwI#Okrza=C{sU+CuHW(+T@Q9Bl;Le9QrLKpT zp(if)Qeru;j;w3mC8i~4y}_`~T!hh|VD+d0IJh$lt%8-XwUosiG^rfW_`knI>i*GA zNt$Y>|3DWd1<_hhC7yV8p^%T&5cy`CZjyYb*1g@C$)4|)sC+8!g(vG6uWrxM#hdHr zl>QDEn$@-`3cg?XsEGYAYqDv~?oydV$o_D=u-&PH^Mpe>SaM70d^(-+OA{+2HH?+m z{+yM^_5Zi!@E`RX3F$IpV)JsOo-ttkNAA-8yX#lePR)`%u{2Z&o{-Lz<*Mmd`W}^2}1Oc=%V)?LUhrhMT_3M(ME}u5G_O*y$zxh zMjb8D2hn?pZZPT$M)_}fp7WgZyRP%%y!(5zU4z;4vG-@~weEG__X4{09$x@mdK4}2 zFwT4B47AG`1k-+p4VIK_ZbMYZETy=7Tf}W#`Ff}U(xDU`KBaKi#?xQzN@U`Mo!&D4;lAxA#Ec z+klf78H0!64)&v9+V?MNVu;K{{r_A$uPezfqTB65lNfJj&$nI=JtYLG``qTuC4EVG zog33@KOg?zPBWGgGDi8FpvX>GSugnmC{cXz!Kp4swR<7E21=n;+{x9pd%tMHTW_Ly z)mWs;SaKLXV;XmBgH0>Vd6JEv? zxpa*3N_T&IUO`J@p7<#u8J8&Ibee0$dfi)aO)l~y&+)~pX8{IQ*gGKWf9)5IqhcbX ztBMP7neB{b+R zaR&N6o!FioCvB0+fgRqVt+Y55k^0(I8Ai<%)B^E5gw6QNTJ7~%v0)kfJ?h1$GJ{C0f)2?xV3Y}@+{ z*dAgW*AG6;dup_NZQzr8#)-aj2^t_uzNJjD0sOSIxMdKqCjtXpfA;VQr7-|2jtC>p zxGOK;TQdKY1<(J9#N;>g%Xtzqjl(eS{O7!zRXmv)j`_DuCm6J+ER}m{&UwEmQEhU)dM)7j;y_7GtMtd? zw=2%}a%_{yF+CYy)9#OJDydB--p_<8YGb;ULAauP=6lrH|*;j2#w8qJ>TkM6NNy;+#Y8xEj7*P@P@W${=+8J$x zcHka_dnQ*7X(Gk)CvAdQ(b)X4s;k}gYH|jP$YyxF(*wB89#{rvb+4Xk^GN;zHUKj- zoudP8VE`2X1vbCuG8g#cZuug{YcrnyKR1hn-6vM>i=%?vq&a77cc!1>Vc^J~+xY>6 zxIQ3h}vJXOM%v72t@3*rq6Lr`8iNi6EkgnF9f zV`kx0SM8$&mD3cR>op6XlLS3pZ+kkvo)TJv(}z?nn_UL-{OEU*k&x$gz4uj1fqm|6 zKJH7=uqtHZyGHiG-uk=vOB#H-I5VTHx|iBLe zE9okwE*NWu+jLMjCrOr$GXbn;?*+1ZGBdthrG5gn4p3Iirj>X8iFC7D4lEaW--`35 z8zHkuNx3C*MDsoJE=&_|nnDPNKbl7lI)f@d`Mkr+T!I}L0{v~Q%K`hKs`YpvxNdEs3CfP=*x9QCf$A-=kepGd5l(cZ7Kwj zn$mz-q(qLWR5ej?kCmP;FcrgEdYC;NC`e`0?hC?ZW&i-3aR*MyqP{i4_G%1QRa><^ zNyd(1g_c|{hqy?wE9pVAt)a_o4DGkOsTP>Abe<>jje^CC++dE{`10$wL?^YL>CO*i zp@M%N5yaExdfNvmOm(#QVu*AU%X3>_Zfn2QPYQ)V44=4g+BbH}yiD`U;wK31H+)k1 znxBfe^ouyNT-@g$Z2Sw5M!#Lo(pMexBao&t1CMe3Vi~8@s{+`|AazB;_mhqGOYijZ z>!}e_3*cDo{E|cQx25&-vp1wVKF1OiOFfx9wbX)9cD+M~j`@MyYtJxWwr;kR)A?}j zW`W<`yu0fj1vRW28>e5iFYSJgX!`|=OuDaT|oz2>Jv#H>Fp!d-}jIpFL4*iqfQjeJ( zMbNko#NeYig8dF~L4Olp9jd7am1XgEvwcH?0=t&$8aGF~Shdx%&o7%k-TY$C`a1RT zX>s|kiEUw4VtnJunae?WKGWGakZU2HXa9=WSlZfNQS9YZYLkx~jO>;!m$N?Xjr-s^ z`V@puH5hmhO22%8tVC)00wzTBb&oVfH!I_a2Ge1uyK$9}dsx7`178kKfXj>dRpTTwKIply;E7AV9 zpj{*7eWCa_+)m2X1mW*Id@pRjV4TEKHp$`J()0CRdZyBEHUk5LczQjECSRZ@(0HAB zb9IcPNV;Utncz+0r#srCoLq?2QPm2$jRcZ~fa`Y-Yw^C|i>dke^B>fFl?r}Z8dAOj z`tLmuf(3=@ zW6nt`*#nddjkbRL-g@C!-E2tE~?m3owjf+$P|}Ep$hbctp9?rBs^2ocr^IA5~JWxF)cSQoy68+z72s3an_bjvmafR*%Nyl7U}X^R{TfFIw$#)j>C%b5GS{OEwUZT zTW&B_+X7{Nu9|wgKX%Ws<#ci`qy~h7#~%TPGjhsmi1f_<_y$g`O;XuGE4QYmu=rss zpA)N(84h;$CXwoL6e+v-t|`Qlm%gxHGuO*^y(Cijwf?o4m}6<5PFXwjm0BDi5>4^0 zseiFlE7e+_HSmwu?Df#x#(HzPBskXOLX@7MjWE-MAGI2>?|+qgail1fB41--YO_?5 zvVd)1s0>lj@Sx*e6WrSOj|}KLN7T*XnZ!jR)zHk_ z5dQCP+0=Gs^n;v$#_N=gk#eYvsR=n-2oB5dXUh~@Z0s)e*QDG{ceFdLov2?|FdN+)Kd&6$iQKEzdSxh;o{m8yuMDW?^pfsn}z(SBWEI{ zPv)&BRJW|+SGkL&1)6r>(#dyvnNrl%4+k2wJdV6Cu_#eCJBKIugG>)Fq9JN!_R16a zb0Ue57xK{1S=)TRZu4S2B~a>W=*by6f%;@vRe>O#gzv`bWa=<_kOhbfbKRGZQsPp( zs+1TCypLyWvXPqGPW;U;AIa)ABnK~4gPyPxBvyS$AAI>!OHc|0ux7xL11Rr*i*a8q zyf=lvSNoR3hKYMWFhd>EZeL&9@{h{UPMcJ*z*$v9qHX)@9rP;&H6%4qGI;G7)Bj!+ zzU-9IZXCCaRi(P6lYaPLG(bM*2n6re5UA&@aHdl7(eeOZfMo{aA?tMzC6kSO;1na#y#?^EqeIbF3mYW3{FWWKA~ zuU<}?VT0ojytL25*=_rssN}5Y`TwI(0RTMhPN*1Nlf?o*_~HkhF;$87^7t!f{Eso) zQ_&XwlWb$i1swa=>m0uUMqw<*WAx4N}YwK2gLL@^z(je ziD%;-1J%1*F+MHln8#fkgDVs(OQSAbmFig1K+pwwfaEHcmFm3mVfwg}mYgqO26s|? zvgakD=Fw0ThT8?S6J7D}lzV4RJ36bBR)9kOcW{Z_T)0 zab9g&3B^kH@1^!izMHT}b$=>T`eX2Wp+C=`&LE=g9?#@m73QX1e;-+sATy%`8exco zoyqwyrcI}bE5Vc}MD2C_6W&AqK9b5ario1xEPow&dzyAvTGfiwhjWPjgz4 z+bCP1SnWP>Sq@U4D{$a*L7W9OI2I73DLqUZ7rs5m^!4|*3{fcAqDKZWYxx7q3@48G z)~EWqTKC@v;JkaOA2AbRimUbFVcx&~A1LnuLWk>*Krej2e!5LkCs3H1Mq{O#nC0=W zjIcof;a&cf%m+4FLf4D4v>237h=cjo`4qaidp;E;?9(Wd{bwP2@tt^6=03=vK%M0z z^*Y^|USs;|1sHl4ML#gWC_0ubu^Y?2+m_~YTipL@y#=||FB13%iGNHrd2|lYn|ykp z)1JgXz~o5Ob00*+#Q2|C_N{;_CBn~dbVP6}K;TZ0Mkb*8`}8L%Y*0qcI*GyKoqaAm zAfcp>ChKRss7~sC6wEuN?V^uT2bzD_@@*cgtb6@sXVv(PrTpre~gH^z1Q zQ|VJ7KzRBOP@3<2d!RtZAlN4@K>o1pb>yIFHkvF@I`Dz>kp4>8AkP5ltv_Er^Qqm1 z6pq?=??SuqPZv`~MqFJ(=#HA$d!psA24PHpG4WRDcEKD{-HkBiQg9lFmqRu@WY=SyBE{3m|!waN}p9li2m zM|>B6%-pOxii5iJ6qXQG0DcC)g{uLzAoTy`Xe-mZuGR7j-V)Wg8`bzQ`u$g{wcdm# zz)y`J|4m%?bhU-stX&ZU2gd_I77T^!&_Dh~f7?U=+6Ziaj|1sOM0cb1Y){=XBNL#O3@iiZh0rCBK zf{eDAO(HLo*iQi3rTTVB+M5G9!MySuZ*fn38?HgmK8b8N?PXbDGe$=DFy)=`zs=sm zOvOyZVbcLOI_(cg+ZgS9U-bIw>0Y{(`dH(*r!wyt-ZyY5ue6=iJG^6eoqm+M?C8Qe zz-7&YfmiIuXI4W`8eb6H8^S&9FChSnGl&{3z55|SarWnW;Pac)9~CX`J50dKzIpJN z2#nk3i?8^SM<&o~!AIFn=N0z5BG5>dqP6Y0YsL4br$R?)~3N7OsXz zxRNhP@QXL1uQSY16R_V0QqB^*=Ib>Vefvq%e0Oea2$#HyPGYVD=?;H}Wwn@(o$Sec zo^YUcXr0*)Idg3Dwr>{4z3mUo=Y}wV#hHS$jK|*yW<1!q6PFZ0oH(akJxE)?LtZB9 z^afAtUn@!SX4B|!Sm~ix^kc9W{x2#V8zAed;QY1E43fCB>o6C3<>a!x0)$26oXeL+ zyhH2@EYi@9cDX8PDYq1$$O z!gU$5T`C95LLiaXwC|Q+4+l_&`>~{ifpUzlLMSdkl*b{byuI(UeX#IlK_k-H$aW^y z52Tb%^UuD>1*$1|VB9-RN_{wcKF{Ts{By1;7*rZM-xH5BvPo=8T6}tT*6{!bvDa*5 zItJ5@P@94s`S6)0KbVRf2z+mz41*!`g95C~(g*p_^?lx{PG4uA&M2@&s3z|5U{Y3G z!7YPL${G?CJ=re4hH>dV$NMU^QZwC(yH4>={K&*juZ3Kd)2fE;gE~J-x%x3|Q`(e_ z38^_cW{@ANX~NM+h>^H_eXMT+y{9|L(S^Qh1*DLzvDR%W)oGg+F0fsdHY+E9b)e>E zKhr50;cGl-F+HqAHz2`cFeFjrD%i7e-scTEokgR;PRJqT@|8p{pF4d%Y|bgDo?0vx z*F?@heNkHo)wFi5B<<>ZEMee`?sWzl>9Sg(EJ}KWg@3!y;okjsvJ`=zMycI9Itd_;=5voE>#be>Fe06by-L? zVs&nAjgy{F4a4R|FFw*H;MtncOzrs+B9-o!)^1TFDm6(W;W}y2OyJ}YhmcWHQmW$Q z{5MvxVc_8p02yO!aPl~sD7X}zL=U}At~Cn|a9cVXYWqXn6GSQU&%j;~U9&u~i}ZRx zS4ILK+Xzaj^K-AVl=f0T1*}Z2GrHu|=X^Z+4AqU=UeVLg-7z|rzu9{(ymdbM;->D) z&G=Z$;A%hLl9XSoiAit$RnxYKBt;F&iD=V#atZjVWr1UNF_O&{Al;CoI4}J9v=q~ z{lFt;<^GYhJ@+SpegYP_J7QtKl_lD!v;?_w@VPOo$xdu>-Vp6`#|Qk`bPM^ zMJW8* znQd=!7;eO?MUC)>dWt+WuE@VlT=_b@8KWvQBMH6r?!X*^CCm3Kk=5p}=svc(3m1DO z<%v`ct?!7=la2kuYVILqNk2Utn#-R|BI2rySW%#1Hw^n~kky+kb@$hzU1;wWAq>fF ze|~hcIBklA9wEotBBCQqb2s&15kif#bqpIaFYydSAN5jTAcw<$Zfd-dp{+DJzp^H$ zPRj#+4|KdDdgdN{aow;Kv8Q51r#H!g{OVUu0jR@ zNkcqNHIJH|yR<+4@ zn+;O>p_OUx@!5o3&<-r|lPYP`(#&>in}8OOqRs-0*gA*feoem~_j$ieQ&g8MXX`># zZelcVP{_r@y~FW)i(U>n+!n0(>9?ey;<`y~*ajV^Q56BPew^rG)9JKdiuj+e&stvH zoj66;8@K3i+t}N)1e!^0NVecXrJ4hd`39REe0zULx;VDCI7G``=y7oiujn*3?_es)t_x}F5Mq9gxS{sp z0%pu`V|!u8d3rF+@6zM(cQ4m%v^KX~Pro$iG8rwhyj zb8^qHxWAAxO_|hafs_lpVPX1UpItuL-Z>Y$Czf zs7G7j4wz#=@i5Dh?CNQ{%dCAHGNz|5TWP2 zSkuXog2Rn+>s=P*F;O35kuS~paB;?y}EceEyx;()k+QCIHk{TD<>{H zGE`hP4%osGdy8*S=^L{sEivsf6c+QK+)!f11v)b_E(O`#$6TCA5=;MBwo%&tutoe1kguy7tVOLc;HZIAxIT>3BmUShw~?-Uq2D7IC#bKZrmzcf8&HADqH5 z%6)bGl2)ddOiYxUS^iv5z>;)(tO$9Og=xVav7TpiQ9P-dUpN6j^U=fe*v&e8o z2nZ!3@BEm2Ms5FpVEQ8R+LFhS@u6SZL26XcK}g>96ZU7xcjPG`Zt@F33Q}(mlb5!o zjr%%P9gKFZ((o2ymfdOyqddYl5GFg612~n0LW;7=~KnAtB#b z_wF`aW6}8jJHRax-kcQeyAPezQzT3@hXf&zs}$^4S&`YcKw7(*v`H*f8?z#tTf&r# z@c`A&?7!iv42hRkx0HTCRkB{z;3BwFFZqdSGu(xU8*GWQQC@MnokAJon;MiYkf?&l z0@uVpFIXzv7`MHr26zs1Kt0k0(pOtrWcKn(4mod-e(mL=6KZ>WP8#xLbtM3^l=#*` zLJK|hMT#$rCzkX9?VF2j7q84k|jyE7P&kd9MV z@+zL{xi$w2OGhgI>%BlXl7B6YJ86Qi&Lk^%@EAxXRGq$x>Yw9JIXYtSf5@2&42Br? z-cgC7ZP)|bUF0euO2EN_YY&ZUD+^4sF$Kih{1&NT$E@a=wi+T)CE4lWiOTJIzoeSg~S z36^bQ2iYasH#d?8i4X>b9@l%1;lc@BaHWsE9GrK&`K#V% zk5Y><9RL6qzH`mcLyQs3WIuK$*CyV@C}ajS_+Vi_I=cFOxeNLO?yVz*vBq5R$Cf)W z=|k5hRd-aJ@%N4m0zsS4)Y+Yx?{q~HPcZ?Ob8iQK*s65i8~Va4+P=~qANUQ-=8!y> z6zG#r$}acO=FUbcV4rca{FpI75P(V@u`8`!3F197H=-|=Z`GzRHOf49VTUb;OWRzfF~{1U(# zLshCU$Y!>XUngUNSJ!K}WTcb3SI8;r~joG5-tdn&aDSt{c>23iY#&;OfKLoVhHjqCQ&$*HGc!M`h*Uk|+}Dj&@=cIEc${Li;q zIW?bnZaX_?zLfi-Bl{WW4v@k@ids$^d*oUUH=b4+v!yYgvpu`O$L)j zrItSQdWvn53>ZN?C($&S`l&LF-d6(|yqv21Eut2S-aV<=cZnn-XxckZU-GMt!Q$7~ zms#+HMB8VO{8-tG%5&PXZ~^Jrj@SF#NZw)1k42)z{T2`>>|z5R&KP1fHS~vX#YPxI zW47syVcX^k3#8}hD<%q4N8vpNeT+b|?qWh0Kx4Qc8gF1dXQtA1@Vz~Cl!vcLgaiox zOXpyaqpa?;`F^CiG|P-otyHZ>!S=Lu+s0AAJ{9%>Xz=lV-QFH{b`sde*Q_=4Q@eP+ zH?wuetuxNYGh9k-OqR6J>>>ti|6-4<6!npBb+gLrS_FWC4f3PhN*JCTUCbKeeqhkr z+KsMavk3-?b*%p>)Kum8IU0W*5za0$b4A3Yczz<6l=GB?AamW4He|!MRn^v1;mSc0 zoi^WD`~F~5IrlPf`;Epi*OJ}b>(ov2!-Yt4R6Qt=s{?E%Z4;GQ5Q;}!ay6g(W_E7w zR9zS_dsp`G;5RfhbUj*A5)c&3&CR_N6B7eO>y96G+6ifPnS!L;M26&gavCe6QA*b|1WttVKBpef~2C_+K6l2VHApmITyRp-PfW zO!5@Q{%ILBtevX-T^B;RI7J)x6hVUtp^T(F;&;_oTI1?kTybn;#CHU8BTaG^@H6*6 zRpB_|X5v`88Wk91eaf@JQxxsvAlXi_g+vv;<9ffx`>PFTOLc~+H{z0XF%t^jLZq7U ziSG*Na|QMw$nlE=snCrg`ocEz0{#uQ>r<;`G7^!!0mjFKPr#HSnY@g7xGyN!QdF*9 z6Qs*Rh7eXEPlfuT%@d0;|1T)-|3ZUpWl{(BXMVl^s-X-R@pBcaXO7BqAwYkA;v2`( zOIL6sKqp(8EyqLR#g&ykb1rQ$5XkbAub){1ZwZiqi=ZmN5xYI649d^@-&)N8Umv3W zZ^vGX)75Wh8^l7nYt%@d%?MMZ5gT9Tr;mAiQ-A#`EN6nM9+%RU{`})$oohn)pz#~y z7^RpU>ka~6?(ZA-9vva;dd0v1dwOQcwA3T=&mepvHCuqb6w|osRzy@v!OXC|e-wXs z?(oMmNGtpAq?el1s`Gr)8(rcz1lf|BFl%_lO9HkBdZlNAXWy3gd`+6lf%QASZ250@tA?3c-t0Jnv&i~2XWSm`oFvVApyO8i3R zNTZYd<-Nw{`iM(Eoi{!I(bWA(w$I<+KJ$aRkVB=qxsO&u1TlSeqMWqv?A_xJh1)Z| zdpFT+Az({09s7*~mM?883fBwxdFJ)WIvZ(~wO9^+%z1&;P}935vdunXdZm3~bG_bZ zoEarh?O!KwU60A-m$_SweP_Pdh18^iAy!_u^1t}k=6GN0D%?J0@m^J!1+CAY5A^4b zaoQKc5~pEORi#d+(!o;}{?oo>rWsT0T#G@x=KNK z>I(079TEWxh#8hH@Gh?5n;ec9!>#Ef(= zyDwma#U$*Gm!ZHC+M(aE;rCLEsu7t>&wroJJakHq+mtF9r^Tle$;9cNwctOYu+RB# z1Tek=Y@io2AD)Y~Z4qyF@nUgZ&*@!c)&)oxoeEwz9S3-FzY@We>Q8mBiKNNi&$^DU z(-VX4$3O)O+U(=7TgPdFDhsG6Hbsw~-{YU;cKDNd`)Mh_M;Y^|g_^@ui@oNrUq#y! z*?qdr_dr(+o2n)O-D%WggZ6)5*f+tixDesE>{#sA$h4u*4|j0&fQs~ zV7&Qtd%fYVn$BsV)q#3M#Ka3zlbkGKIU7dB<#sl;K5DmO+sDe*R*hrtfm&oYQz&er zO*bSXPgYe4#B#qb&RQLx2J%N?Ht9ps;7b`b1K$8pXfL;{rt@8)8av+u&D;Tem0!8p z_)HG(Htni~Ql+x<;P%hi-2tYfC9`asRV|Np_|V7xn1$<5P5Y(~N*6AEN>!H|G1>?D zF0q7cH&=+D<&&iJg+dwG1ycah^E;;x3#L)F z#wRkTO@GbbSQ}jg_Zuzf-tE=N**7qQ>*m4H6YqO|BAs;~3wt&PEaY}Ng*`5mA@`ac-V*6);>F%<6y?RePdfidC!xr}iugboGr!MKD^GSa?T z8T3Xk(MVgH`ohONOsaAO@Niu~PbY6(t2 zTbKq&A+QEp>yzJd6|VH^hYZjYuETvQS@{@j-`itvoqzB0mqErK8KfE}ksh9(ym${W zvxsO`f%H1jx2(Ot+%1*v87$-A;ay*4SYKNaUnrDiA|CLH%sV+Cv232pOcJ1eQtD8i zXvds)HtVZjKZ9E*mLyekXQ1-OM}2+umv;I9w$b(RoE6Q*-}v-cwoan|g11q}I*>s+8sMc!yA_J3TK8oF zQ&M30I0~4J5fzYDS>C4`v=X@}J$k1wP!GpCb=?Zg+BK_=7vS~G=MJl9ictZ)K@Q@y zF7v3ym?_oGF`r;@|B|Q18u98?onK1@Q7pT}x6-!HICIkrR4o9<^=jOrq~oK>DYZ(M zZC#r~ne$_J9zv&1?KzN-1y6%U@4GmoklA*JkuS3lDlZ3((l_N|`mw`RMBiF{hk%W- z1&#^uY~5SIq|bw%mtl7157}jWeC;Q z@`MM!b)t86Xx6eG`x<#2pS-_{YQPRwAha2rBhNGZ9L}4#$+I;Uv~on}uBG z`=TnXILOKe3lX2`Q{#N02F8%FY69W+Wj0Jg!-4p)Aln0_EvXDq3o+CFJPt%NkRZSE zPHd*8`8VhrXa}1V!B#tHdU86=hBy77yzOA(%4V&!>)L3An8KiTmm4Esxw-aFBz1Xc z>svfLhgLgn>#(rm3uCL|zHCyGKQ-2UAw9JCDv+jvAP8>aeL-sbHnMxNp?*XB;~gb6 zLPxK76!^M}uPn9eyn9ULEqKV!v*nG-lmi}YIsB?%e|#d z{ya^}9oiY;CTh;EgaNut;g@r?+Nj{)cni5(52;J8KOr3wDOM+&Gd3LT)O+fFg+TXA z(lR!Kgj(j_{CFb>0W;0lYsxBawcAYv%a^X`6S}+Ch|_Y84)yBdE#2D^-1%o)NZvOz zjOZmaja^?z;ZVi4sc*nI&?#*k?kg|$NGSiXN^C@}rc*|E+mIUBK3Sq5Ms+qfwAt?c^8gPBSASjkqEdnRuo-E8tV7cgE6*pqyqow z%B)F6@vxMaZe+M&N|XB8C2ri?zt%LTU2fA=VE$0U9!=GX_!rUb3ym- zz_>;x6G$aaT~Da|h3%8@ru!FQ*((Nj`GZqPK3^cKLd79dDnuJT@VntIZw)mZHO-I3n|`u8 z+EY+ioYSgQtx04*dwM^1bhz3-M0Lo0$uDI=j}I^asl&z-ku~zP_&>gEuV-4x@^G$F zcg+hiGkMVLsn>Z=o#lO!xlI_ilr%$~8M!fbJy7XhBOc*4#u8F-a);xHq9Uc%Swq{3 z*vq-zMMjQTJ?mk~9VC%U?^GQnxYQRU+W$7J1iGP0=xq+Fn~VyILu^lSeoywW zKL0{w=f3o|`x?ttaR$vbx#jff990V z|ME}0=KHOE8y>gx@d*mkYJ!iWsuSD6EP_$y;$y?EVq0^^6G!ViDtsf{Dlsm^{*Szf z^|NNnHWuc(OuCE4I=a9u`@GvYqCgu4R*PYT9L6@PlrUl9E?;gFCJ>KBSQnkCJ zr^XAl5bh#Mt?c;^rW!mWzd8cx>}MznG>{KVZ*s;EX#X_Rd;zf#sfp5V!w@~I)M za@7_!U7CjjJ#ai{9^~R-hAN8)n$UgHc=br;c^N0?q`5~EHeJlw9j~5>d9~Sy+6@<# zG{F1C7*wVZr+-B2SJ2vOd?RQcfoMqD*sul+IG5M@ z5^e46W#!~>0B!Pw>37joAt!b|{_?ROt5F#SNJ3-xk753dp#k_i(d=_9LOv*qm)s}d z@s4R)FUZIqDc9Pwm2FrF+_Fokgo9yVliXZgT~Me$ZJ$|xo0MnSm&Qii9FypwG0sD< z!6n-rTUR_}K!#RsB|$*s*IK{tkTPwV4Mi@>`F z&M642L_mty6o<_b9^F)C1f7%(_Y$^o@cK{+Rb0OSYE!yTya%InH?3{;2#H}pMGs*m zzdLR1)aH8nU0XL7k}qA$F${&nQ;f5Q-CVO9m+ruqSd__7>8>r6(Fbs$OmyRcgmsZs zr=vsBWEdK@LP}Fjx`}YVG;o2t!Cd`vfQG!faA5< z*}=+FA;+g$+S&e3>>9EZ$AISdz*gAIE$5EBlt)~`1$xemy>cR*<6($FOIO?*1ERssTQ$- zlq&X>wSKG$;2T+Rc2~Xe+v=nlP*Wdva=SuC0B)4HCqY|#S_Am@58l=gYnh-WQ0^Q5 zP;6fVo)wbk8GlQ_;O(89C(dw?ABZ^cHJRjjz&W@(FO&K2S>7JgEqBr$d@2U5)jruj zezNVsa{OOE;K38Xwv#)je!7SasBgkH9;@2`qOrUN^6g;jjWl!rj87NISB*RSHedcO zS{+1WT~lUY;*3bEc|8sq+#I|Pn8_B$P7+Ih16&1dUyHSeQ#0o+CJfMfZ62?~IRAMFqLBtIc7&l zj$O*KSh>+H|0@b_jiYx?Lg$b z2D4aclMN9|Vin#VR*x3Gx{M7LF16#P`Tgl?Ir?W-zM`)ERWuI~ug3gk>U;J=OUxsz zz!8$!#ciG#@Ftjkz(yu@_~Sef;>W%?|64SeXk?)7ynd}UX!G-WKGj!&{_fCU0-twS zz|5n^r?|J4wtyYwYFvsa5v98$2_J%{$WoHeQMPCvGONz!(sor3S%MM=Zv?Z&xj4%= z0HX#~$%uEKQ4pez7BMhiluE*IXqYNxvJt5i!n5()I^ZMUW{?7C@({q(1i5+Ovxb{89- zyd9kYo*K5@E~<(+*?QWAN>k$4A4P@sH;!1Jd^p!J%7vD|N62+kf*SqN>k+c}4W{}IH~zy{kBQwNTH`tzy*Q_9xa za#Pq_MFtGvh0qGL4iHcZ!K|nMj*fKuMHAUFc-Z^!0anB+0&zG%rVY$n)Fui;<3HMX zW>1uX?iiyHXay!w2wg&fA=a)aQ+`eu^ZVJZ4G(jQ+Aln-5nr(8fA0p1Sa~6S1Wn4W zx%QyjfWMKh?vvt`B$d|btKS8w=3P>sAlv9y6aV!-q-~hut81ZOEjNfNN?1|4n}?}~ zLqzNCCT8VITTMWy^7kOo0E)ne?Oc|@zY)vFCRQy1 zG#{pJzLB>rEWSz&3 zW3SP%)QeSYEy$DD2e)@FmB1ix|3T~nQEy6XI5@ef@l>c}AY`0Il~Tm6c$;0Z-&FvG zbk_`KlD&mQ|t2zu=xl ztS+!LBp?YUcz>{Pa%%{iAnnWj#!uRR6X=N9-0np}u|=Fb(ELD{lJ?*cFv2EjYtW`0 zb-dDp;wN=B;Qspof3)DqwBh8@*JhBlg}!{ClJ^9Koe!)8{c>rvMLFEUqMAN<^%m>> zd&QtPtGW%L<{;vzPJdJ2qp>bL*@sJ-n0~;ll=Yy$QERTm+MRp6<>MHjWdLTpN-cp| z+X0#778;g~JH+z478?a!U^Ui@paSWvk-d~XOcDTb3Jq2d7MGRnzN1&i=GbfSUlKJ) ziryzZjfDHSpuK57Q;RHcHy(PZ@OXR_SA&O@2H%dcNy>qMQa(6QzWo6J>!S;wmBG4f zRKtQ}88T7vs2(0aQjt?Iakz8zh4Ug@nwsB&M#RbeA<}s{$;czvYPlfyJNMEU{#?Og zOB133GW)IVym(C$|83-bhnyU@7EZ8wD0%+hr&B+ zk<_4ed{rmKeD9gacJG1sKfnY&WlBZ-_g!fbYAt zd#qj%&WMWU24(ugN01<;H*C#~ijo@-PX+1Z5$umOm#E`@w>k+8Xa9~=Lm8x&d_-mh zoUfX~Bk?p2UgW{Qxz9N*HH^^`iIxs$a9aMTug@zlS4+_@Qr{;1RPcpbn5ZaQiq6jN zYL11)uq4eFu#N9IsrIir)G%`O+4Wqrf;M?PDJgt^%380ZoBQ3K!hWJ)7tpH~!(Fxc z#}ZnsSPY>X3?3pQEtMq0nL;?fYzAO%{OB7Cyn2_V+@O5nx86H~X7<;wPi8 zDqf(xB-%ZpEiKR(oLcHi{3>L=3T1zxQBMyG8lRZhCJkG|edduDFRIi_)=b_j?zlwo zcktEg*q{4dc1r15W$A+s{oePkJ14J%<2hzpwkX!I7f%fR ze9j*+=4C0<#~g-`L-gGZ;|4Jc8J8od4#gDleh5>!x@hrqwfM9kKS_Iz^=Q7Mv~+_+9mQ|fUJDr}!MifqP=PN)xa^A`aDeAE&N+?&nB|vms>;Aq zVjba}4xrbR%V3TJ0PlO57mmu=1CaUmmdN0=kT36--^v}7Hp2V;b1khpb;xq5#6h|^ zS+&wkU-H~7wkRQL&DCJx8*i4p>l8tUgbVnQw9=c3F3L;w-ODQqKr_F%=c?ZFI#9?c z=~!KhTuKcr2o8w z9lqHA%6yncTHvx_sI%!4cvq2os`f#f3al{Z+y19g=|HPqV(v?Ifhv;AqL+X|0C*7I zGwc*90lZotYX;nATfi{p)W3a{|DTRKdjGp+g4O>YD*Aj%Eg?tg&Vt)i$ewTr1Pe@2;>*)AeU7ZLZ3q=hMs)F0j zwBq(Sg!4LS$Bs60EZ-%I^R=%HT=fx<4ZiFc#NQWSj8Z`~t5nyQb<=wMPXIO~K~Lt1 z6|rEvJQtH`$X;@GCwU68hIkkYx+5C6ZKwgp7^die^p&tx5l zYX7`&WLK*zuHb6_^1vfOyD=1@_u5UV^Dp&w{5-Dnge|0MCTK^~C@nPafgFz6ESa!l zciIJvJziVqX_J$E+bL-JMP5kC{|Z;*&IH=EcK>I%0#fGH?wGFaqPRDPh5_J^A9RbM zv~#mOY(b2SU}6=gjwUtT;_vRtM{5D9N#cqxJH9J>sv_hzTx|^0u0NQWLASW$t}dp>3hR}3F=Mc+2l`m4At60)k+BmHg1^q*@1^(l z9(~B;35`F)fx~?UuY%_>F=RI=D71;aMPGOk6L?i#QK3F%t?X1-G9e%cfhrOfmK2^4 z&HZ=6oA4ZnCiWYzzev_lro(8u^<8WQ#woDW<>64$@yoe$HP@$M~n3KIXK_>SGw=$Q_Z`1mHy`-vFxa3`Oe5qk-k5P142^VK^_ zk&(m}vLO?i4D>ync)46*PSVVLt|X`V7slyT9L@ivC|oWVGV*iNkM+=X$G*VuJN!F& zcvU=W5MsQ2m-W22uy<F$yaVd$3bMutX2L_k4G zx&@N=p%rQL(58$F(Qx!{qg_N1?V=vw?&;UZjRFEwp1TG!qc&TFytQ&%J@^1TK$SpuskmESzJ`9s+v z`aqIZfQvWvs15m1E$uR__f)8%e?Q9kMXif2r5bG1vAAwyF55wE>;$4T{Wc;MGvDvN z1Mmtu9k(IUw^e6Lh#VWouM)2Dl89{ybWP@%-HTkFpZ2P~$=WcP3TxILG`kdn@YJ7m zPzBgwiNAb*Xhp_47ZfCmfmpjK#{@7CN$r*|>JtR_5<7Wf7`IYh-is2ay-ka$nsc4- z@{-dN9uZcAXa2j5l>QDwH-3+?a%F&%D((O*t z; zvex5z+h?QS+vp>>2Qq`U(>-Gw6~1*xicL1*BzX+OhZvmfFjHA=YGMB6xlPn%L zIUJSTO^3eE3p+(ze>ZURst(A@1&vPh=mN;=VR%J)gM-&+Pw z*Vy1k5Gi)9us|R^U}NOZ_?(~aw?2e=%a~NUpC|EtSgqnL!>nBgzkq;Q>u&YNRAlhs zuiY2BwEmO1yBBE){Se;R(5g94AqN7)-L`T6y<;9eI8@J9l1a04K@!1oD#3XWA6oI+Q(8k!mfS1+a%~}3Y*K{ zxs7;%471SV>H{?=?l_~b0vyKIIH4!5Hh4|{&<`S(r%3|qDTtzXTyUH-iAcE=N)l>M z&$2RGEn)TYevM398c}%I`(z<2xctb0i|QRp+YHA)4BWN7^h}7Sm#J*$a3^du1cF@f z%5*twO6h(u_%YtMp=0sKwqBmd@(rjK2?gKqr1G)jf^w?HyBq|z;|KSg2<-403lfY} z#2RwTd7T|OF0c9qWzF0(<|S^-(CS!iv|ncDRXGV)bN99&%C4po>9tqm>?w5WPtkgv zQk8BLVu4&<`;$Ni!BNhYFalO))F0!DJD*g4DQCV()*M0LTS@V29Z7e-AXSw1gy7oS z+iUl^Z&?2V?b}7f=U2LwVH_ggwB&%^&^GIp8slQcC8W9?pQdQHw>dvG( z?eI(YCPDjIkrj;ywWtqr#}H^B8wkQgVk2{NxPFr#p4mA&%YnI(kPOlHU@$2!FKYn5AVKrETGS2|yqP9eY&{*R?SqkGB|R6Ms9UJtkzB z*}|(%M`PmSDv4Rlh5*?Uw;qNJQRKt%p7Eb1E1U~sy21Q~4uttRcg7|giplQSVR|90 zRETkXvzkiJOIUdJ!DgZpag@7sE$ZV_5H+SD3GRhQkGI(e^9izcFOo$kII?|;ibM{0^+>3 zc6RMOv5doT_}h>WOkRF|+J8ttf*EeM4i3;RFl8qc3@9s>IQ4RJDm|}51H;%lL9ieF zC(iHoR8WLK#$~&mG&D3!^^#tg{i%<356cHaLFWnV9&qh`s#sa&;iiB(4O$Q&e1jh% zO=KEiAi_JrDNjz2LsGSh#3SfQ3kaV*-gbT&{^`*|AWj8#VGLJ_$w z`sT&naY=7p;?1Zhh4#%@6YZ(u_s2CxDpgk=v7Cj@>943lyCCw$`G*SGQQ1l(xzTH7 z7X@WAQHp;h9|PRGwYAfy$5XG$^BapG7vnKueZxHkzWM4d<$Yrp&z+#AQ+FWlUnS1xt<`IkF~VH_2^)mS~TK~dT_o2lLB-5_@F8_bNX z93!vXx8*cdv^6l~r-CZ=ac_7-XRVt;UUY*&;hH>$(Gni4xUHyt27(~%5T40J(_dk? zOfz|dXY!Hyj@bc%YU+f2iwo{~xr8rj;1n!>b;(@8(%d$CJ2tw>iif{=sBY=YGwJ-D zZQ6xkytJS7)4K*A+)f?VtC-u0{e|tzs;_)SqWEboa#R^;|s*phlQM;{#%myK{R%h2=iS|8<5mXCjTwrwKqRl4cv)6NcO$Mh$|TT zzNWoA)^ou~{ZMV)FXLJYw6uC|;R-a`SWQ^i=;L6oPWM`xt#;5BO^5G>nyCq|1CeW=-uRA+0byxJ2~y-T~Y0ino?svd&x5RY%7?{Y{X)2zaobT-sUu zA`lm;=K7p_Kej)4WrL85$&Qde>lIi`KkKHhWm9Vq36By0(7X-f= zH;GX-Lk5U_laY}PO-{Z`OQTRuGCfg<8D6KD zwYMq4q0%La>A(=bJ10j9bb#$k^#AVl3@I9_o8#_PEkbqoYX6}mQd0B)5O>vqCn#v8 zcl{GxGh2Eq1z@CkPc*^eE<%u}F55BTO47$BsrcTIgyfc$!_s3tp+Ikdspc)QO$<+{ zZmH?AMn4Uo66hjBSP`g>vmR5FBR!C)uz&L&(#hm!kL6~FV+4bTMsdNEIGNYNS3)T^~7O6Y@qN=i%1WY`AU0nJC5c{?Wadbtw7J%&=WP zjiKD%B|`|&dZ%~V=SpP6j|LuRPQOih86LIaqtQS=^ zxWrk;{ztNwCI%mR>-v__Z4Z5r*t!Od8i}6?}<8JyMMUqqVxXZ`=0GIXL+MEXjfsj+dhu3l{57FYeT?=+7*+VEUCfjcs*k zEyD(9OJG3abGNqe%FB|6pE`Y+m2k%a*efX`qjcOv0xFem-dm$YSRWX8eM5H)|BfN;jIp@NSY6oVJ#dXjwYXNP_p7dop8|4rYqTow_ zK`|!DSMqwBVz8#X$9|fQj^KtDcqEZ2$M9R_fA$;!g*u?^_42t!vAq~TwRc2!+0Hei z5ocJT8Zq|OhJ4!9eK^Tqb7M_}5?`~aO%Edc7G8GPI*_pzagMtp zC{KseuZ!_J?Gi7_KoU51oe5`>3Mpdp>ddc8M#KwE6T(M<6ZIR7C)8 zbPrSJWo`Pn3V6gTIgw|?Nf;jHrdHVrWs@tUtR5Wqe3qpH39ZM5Z)O=pP5%ICt63M( z#_7b_HU5PLZuDPF#_pO|v%_O8;ct#I`qXdauzSGacu3i(nkDP zufj60hgU(h)Z!W3>>zaxB%|^cqRJ0<IU2CaZU7rwLOHZQ~%GgpRT zEF={CB*QQZCNAT3MuT;FOy|v{H-O68%mQi=>_q68$lDb0&`*LgBwx3 zl>WSSeXQ;F9kwA&eo1Fu+Pt&b5SKW1B-yIpI?>(0Z{wOOx>Q9yCRjcTN;gEjUj{TD zY*=uebVHx`JsVgZkkXlR|4=&jF2WGR=qqsvcCtx}8ME68@@^vxqMG`z-#lX|s?0ii zf0mTH>VzO_x``acR(n|sixYo#b?1BYM4Gl!E-lm@=`Bn4Vkz7hn)(A82BKhSNey=n z=fnn@O&;z}O>|NDqo*Qv##V?;br!a-hIqOo#ykBgmOznp$fmt`XVZQjXHaGiUO9RA zIb!nXz)2a_Z1Cs z>@>g%1Wr*N>;V^M78Z{oOV9#%=%@j39{;1wM+)12MQ>OX{i}dE@{+^xfDX;L#l??! z=02ahXb-?uRu546O*ZhRf&K|oh=ia$_c@59LhyRO1{Oa!Y zkxP_tLs8p1-;Cg3CwU~(ZI(exTU%(QTTgkgSEi^h_ByJVd6zdDhaeOVf5iisOBREikcZDAiuVnq~xdS+# zgns-#)rNB*vnbnSQ|CrFNoK2wtWx;!T7y~i<+Bnt@+hG|E92&ghmT85v-(o_2=#X>rfN-J^AC0z zGu-9LV+jP?9_$a35Kx?T7F@<|pthbU*Gp3Mb}!ij_8s^sil44S29mX*JH+i%#4Ux-GjVY*>tjw(=dw+v3UT|y}L*8c=9?oZ5eqt;jMpyYBTl#_}m;-J<&%1s6$rf&bbx- zd0MkC&CZsK`bmT&TH-dnnLTDY53F=y6;@JhEEF#4Z60-@H@C7cc6?DuCQDNNu8w=#dVhF|jPm&S z^o>7$D1CUyC1paO_*eSWAoI~b`LP*$tYruWN4N|eiba9EUKGeGg+n*rU(kx1|1L`Y7?-1Ur@A*9 z*HZk#B6>Hrk?-)h_9C?D)}7ZuVbuX2Ny>Dj!LF-JtPh0F+xMxalyd9b78X{X3R~IT z&UWrKm0dFhM(>XiQ@q-%-`DRT&G_*YCl(0XOWu^N@~4z;bAnY|MEhI zH2^4ggcY43X7buz`KMd2Zhs?3scCWaN=0>uIPk#rpL;b!4d#b8A_9!9FB(hI+2l7U z4>@np2-T5;4_`{qImh}f>|fQz6i8eyGfK3J>@_V#f@>XL5eWV1foD2~ip7qPo3Q!F z$QR;NVb}0dD1o@KSC#$yB?fuLb@|DnA?3S0!w{chm)B*C@j;jRTU-IgiV|() zac{>^@tC3|q-lqlJ0uU~TVSzOt5*uwXG}wP+qXp!Q({1rV)|9h;4asqN^tv>7i-tJ zM>yATa!$8+O|8=&v*`;@h4r}Tl;(OA!+vh-R(EV^d!y9wbSt<;U$fC{(HeF^7yQ(4 zb9?O_cIB7R>-}sr{dMuJCmd=QQ|Q<4^_n0%U1Nvt{dT1=m2)5YGhr9Ci$w;}`+7Iy zFiR8t?CM@8SDDtEd&jQ?9k3p4;rNsa7aKzH64;WWe)ibQw04zF%xJ&z;!jAck_OF%vqZUghfrBm*fm!ZV&gW z$n4h~RxHMhEJ(gGVH%g%hU30JhulSmZQngl0xSY^*-_jeXGkMkbCq*9|{ ztH{(UXk5b` z{l-n6)RZ%8B{p6N02a#lHQ@j?b#K$wv3BT)JiqB&%{Tjqjy18ekdvko<7DUo;zbSI z<5}q%1bzd0e7}~cZyt60f%5kJ~y0Ar&l&8~+>jH^&eLyRkZ$WiHOR;d;WEL8-dk7@IMh3NSKPpUyN-5h? z>!}af%`mJIqu}keQ;|;9-6mJYN$D@;!o>k98e^Kmh+roJFXQ4BT~FM)VBMmH-v?AI zu0FCi!ZS4eF`-QuPrp&=`^C)+m0sxv`jH5iYicpR+K@;}Skk$`i^uCbMb|%+4;7s+ zgYn)!P89PyS-8H~>v~Vfh+vZ8O?v!tf!F;PT%}yYZ*Ay`P&!4a*{1SA&Tn?j>UB7- z51RC6o)(Y&acoSFt0W+4mgciNWJ-V>>h5vsv8#)Z28}K=8#AIUS$LVCe3&Mhd%YgL zrVDHAFiL2T{VA=a6!vPKV0eMY67@4uDoJf|oS>(Nkl^vSyd!(uG~?{@`ZzA}ZTm|G z+P$W-R10a@)1=`$PME|H9E0*5!-!P(8%g4~dr6eOQkoCl#(8#`Jv$P&En4$U>O`bW z#%#~Ac}o*fH*2u4Zwxk^Bse&voL;CJ+vqAh_<*FnU6iBLl@)(uW|j2RV!V5H+h*2f z>@)ehQQ`a3Y_Dyzl+%TYO|CX|xy--bLGEt`z);*8FIm?b&2#WZ?T`0_e*SdnoVn_> zA@Tm$+jYgaEsb?~L?wGpEgy9Td*0dzf5pO6GSg_=PQ1(zN{AGgK1vcglgY55aaNPG z)X%Q-1OuyP7UeSaa^HL?JWFqyY(N11_0?v@Imt$=Z6lq`{R4T))8zbP`V7K?G@dG( zP|w1l8LH_h-dw-eEYlPEDcM22^@CIPR8jWijmzho)&0D zd3fnA#uo%APBxvbrjqi%$E-vzTP$$}^vr~*N&EC~TWRlTZ1hsk@^sJnTzcOVGg}v; zSU^ayqw~AmgnALaY1JoLg4;dh!{XKtw4UhiWl%bg)7i+M9_7+}?$N@)*}$_+|3D-- zD)G1*m@UH-!9<*oIjXGKJGTwIVM5X~B@%%BSQ=55Y4*r9d1sUTvt2V`rhh^%zl}ra z=UV;DtQBXN&zyS8z@d(d?3}-KvLo>=-RyC32hkr+>(|$@LmTKjj`PLb1rsOY#Uzb{ z8^Sqr4^A5fPpwX?)EWgPGKLyBIMi<*f-yEg@r2;%pJXprUj<+%w;1>V{~?c8Kwzs^ zGfmV7%%M~P123OiSkSq-xp6v8Ygt-bZ(gXQ#yVJUz9wSyfAIdvVvnK}oqVKwmv32B zl}6~eS!c+`%wHMbd5F?qEzr`-VXKf}(g!CMivkhvD5Q&lBso3~vp+und)oyh^8ut& z{~{*>UNw%6j!CBikT8x$GILYyR*39aP9!yTWoG zmrSlk;zonmCnmSHlO3%YS=y4hde4`}wS+#mEx-Dy_7fUq{vk_8C#B!Ty!tweE=0|EvhE9%0IA{AQn_@hauBtpJFt5|FQvRl zuacO*7PVVxNEg)x2gZYgVg_ZC3u-?}D@T0}gk?>kUOu-H(um2HA3F}b^3kr)f9XQC z%M>^HpuI(G@-^zRif5O8wdMC0Q7f}TOIji=Sm4RB;=E-ExUy>mj1j!n! zNdr3h?sVAkguX{KGu)~9F3?&ig&h?a#xd->z4tfLiw+g_8k$%Z?StM1Vf;ISsrxu- zK$4QX;_`=-muSH+C1M7Xxg}nUXDTZ|jv-P_lT=5yCb5y^4<=%NKQ~)%s3wtka%q$r zUNECM?7{W~xy?}@=70d{#$|8LXS%zCGqM#SrDF4VvU`NtP#v8~!_kiX*~KmM@OVz` zI5&~F$Y+vSvylW&R8-Dfkc=)Yl1 zPv^0*rhp}-he9jqg;(ySi@5DQkj>8-qd6*dn!-YtCnO*0 zr>h@fEf@US{56&3$XObou}1UE0Q<&TAhEGDJ8^U&r}7Fao= zk$4<4Yr7q{aQ|*+|MFt5`P*5W73#PtfJCm@}XL_rGg7Vt)zThoz^6Kai@JDx|K;&mAWfzbKkjMY$ zfAZH|fSVw|f1(&j;xU33;jlI=aJWcXS8zUApISs*xucNBD)pWeOY?Iub~TPoYrP9T zF*C6i$iwJ>hL$f-t1*YLX}aelk)LaM*ewC>f7amhyJ=*v4aNoJNO{iJt=0{?fLl0B|l1A^ZMohQI`DiY4rI4#Nm)f#l_a+-3*RDql@N* zA65U^HD`TcR4*byfnUtI%%$dY^>-Nqhk`v zKvchjsaq1gR!{-8K zYYC^$cvyOtCY1T92ds-l;M4n+FXhy@3z-^ zGdtgEiFiCMPgd+HPGnM?u5G5&Kbj`s%dGSh=Rra6T{t?dkUsE)NQjaL!p7&Jf|Ly2 zt2*FWU7yZgx(qFOZ1R{{EQ-x1qu>a#DaACr)vxB)pb|Pc^GXF}U9-KS-~wGC>yS!$ zftMlYW1N4FK-ws2N3yOR#R~nFu1o)1%GX5Qm74UMjpm7sAv0%6{s+mC(|7FrM4L|} zzEKNv;MF)7Uhgfq3ZtO3&2G-L`5bueOsDlDsG%R5`I``W%WH9u>sBp45nQ@ek&Ffl zmA#Ys{54r%Dg!~j$KhBlXxknhrK4<|{7tk5stR@aStS@7qdTDHxBXzJA)+@;OClAw zCbgC=WbjrNsjpDrKoPlM>g-F;hdF+G!~Ox4YBgW2bd~ms!mSLrV-h?FFSob06{K2u zMkO4-87H*LYYy6-)F_NixXtMndcKGru|pY?RUK$(A2baa%kx}ExWvZ4B{aW%~DpRSkK+ed>D7kdkVc4I|Kte(y@o#%Gm?`lrTP@nW@`=PHCzEQ1 zXiQ}#7nBVJWp;I8;i;Uwyp^TpSI5xMP!*#(X=&;Fd$_nd*Yy*PRTs`#?pr!~%jvulq{2}3?MsMPtM?q=_2fvNlt(=R8A&#gM!G|qtcj2{dfW1*xC$M z?qGEFBf}i1XuYhz0XDth^4?u)C9j!|NVNLo1V6z}m#5Ca+U?mfY7xiu-vJ*U=mD|VgPPAO0Xcz$h+O3+754VN0WHa2n} zyUe%roSikiygJurXJ=pD-c}C#mZOVJ@Lp#5=m?&68yN4Dw6r*+@g^nZvhw!U3keBP zu9V&}lbv!>YxYE`DZ_xka7b{H$prbl?U`;5-s4jgMK zgW(iS;G%ffrv!`5+E-=|hbWM<@>x!26&m8C7=W%}^SJZuM9neh@$@Y?cc3Nci DfHo)2 literal 49405 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 diff --git a/mkdocs/docs/HPC/img/ood_jupyter_open_shell.png b/mkdocs/docs/HPC/img/ood_jupyter_open_shell.png new file mode 100644 index 0000000000000000000000000000000000000000..0c0756c7728903fed4ff63bcb6360142ad1ea2f3 GIT binary patch literal 22880 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 Q75UPAh@Mt8_*wY>036{&EdT%j literal 0 HcmV?d00001 diff --git a/mkdocs/docs/HPC/img/ood_jupyter_queued.png b/mkdocs/docs/HPC/img/ood_jupyter_queued.png index 6452a44c68a7446a3cbc676d2f3715f5a4253d0e..4bf9bcc8348b3a718821395845beabdf47d51125 100644 GIT binary patch literal 45072 zcmd42Wl&sQ*Cq@hNP;K0TY|fLaCdhL?ygNkf;+)UpmB%B-K`1kjk~+MeB6(`^UaU> zIaRZ&x=tPGz1Kc_`MOTHvZ55~M}m(qFfgbx(&DNxFz@|gU|_wF5Z-pyg3vn#^4g&+umk}3H_cA{X?4aM}&x9VS6+Wz%la^b{4oI9)R!|yVK5anydHft^Uet z>#m^ZGR8OY|Bzx~+5;%;KlBF$PWXRrl#F&NDJVqq{r7^nf`WY&;cvi`eyf*?zrloI zU-Ti$3kK%DiBrOp(^UjHntq|ynzAEG=e>U(&4iNhbC4WoCn^-D(dRkjiQ+$$Qvj)( zH@HAv7;>`p$6ctiMa0F$y=RZqYbz-&RWWddOZjc>w7=kv0QfIs=`6G!lzmPWjkR&F za#h5{k)2~-&ez?c$wljGE8+in>I6@fVK<}zo5`R#FQ#gCWA_4^_kVHki9=i9dVgVl zosrZz7M*T;@L$d`m#r&|xHF{(mnqB9QdItETSjME}prick2zFuXeyRfISh8ykCFmQd-Mc!D_R z$(6z1oW44LU23z^*)C3?S%yD7NJZ{qt1FI`*-W#sL15|oQn>X37Ow_hvgz%jBgJ_T z2T>6B3uY*cx4^%6)oBJm#~7KCd&b6;NE}21K>~IU2A_nI5n9k7CA>UL zbv}BE>?RN1FhS_SWqk(%oL-bos(`6>%h(pZI@M6B85(V2 zboLdDN9D{mR3_m>X(v+%5rPD}Q+l!Fu*~rGX zZDGsnCWkY=O{MCQjkPGG7bye&n!WamPj&pt3#Y?d-EOyzg5gzaN^tBGCg$>eMUGu; zqh|W~S3{i+(#3WtJb+3|#c2nt-mjVDyvDFAVk|OCLpZx2G!P_ti#mx@A+d2oam3xM zZ0}Q2Me7ZxxJO6apxjqMHT?3esdKk${VPw^hf=outd(UikE4ubmkR5oq*9(%Tjr1X zBCD`S`(I=8`1R)-;CUFBj9X96dwO@ju8mFg+DCHJrkO=r^I zVM+HK!?Bp_3TU=r#%gt+YToef`vMJOKkvYPlIno&kVhrX{@pqJAYM1CKo}$fKp8O_ zWJ@to*@4f8Pbf5bv=E%vxzCp|oYg(t4aBj>#m#p&z>nA zxiVFMd^!Hf!rxU1Ag46!HG08#58P*WCXrsX#Njz7`O(|3v)M$AK$bPM?9@UH1L)ag zu~p=GC`mYar5j_z^EjslIDMtE%Ia$#1T$IOnm^z1a`|W13MJ{%yqGHzAt1<2p>=ld z?yN^o$VT=>Y^Ke*>yxP0k_4DccnR;U#?FSc03DW7v_}gr>P=*}pM&<4a~Js{V~j%|4)vvb z6OhL1KB`*#2!&f+3sjmx4RdEXeiV}O{Z?SU1R#+&y9)tuBs~LZE7Ujt@L7Q)o*ZYs z;jtY3rCu|i^^DWHOYo|1;!uyC1}6$lxV4J*u*wrOT9Fu2Qc&a|6!S)0#ZKFzn5?DZ zvTlE{1w1u%Q{KTpZ3mM)w4mJml%I05bUV?vq;9P5&^uERFuWHfxR87zWHvJ{rTFf+ z5H|fs&1LnY3v~)yW_QgPo;!)op9tuV06S-sCT9;dZB*ARij|&IBun%8@e~&qWqNAeWOj;r$rhgCr`k; zAtNFOk1l(u-BC_l<@(o-xr_>h|L;OTqe)dzUSsu(~hC^?@oMSddwikS@)jT ziD(L*dB^?jImkAvgp;>^=L2SS?pAcg5KmirsHKq9hEcs~!=Hi-%-0lL*734mRtodG zm#ppyMLzB*kc;4ndcAz&_&CYEue1R6PqvRS}!5e+xm->S8|?Q!a&Bel^xE zTx#a`tWP6-W;xqm$AQ3w_pxS6zSPkv@H_ua9@$i>)G7Z5Zj}b|&xR5GF z(y*r|MP7uxhL*x44SwRO}gp0G;q%8N~0 ztYWyqP0B{O?gXW@2N*WbigMwX8*w`urkeXJvL}|CjEzBhVcij>mC9lvNAlLvj1Zg@ zQc3gCjYbdbP_2<}TV7KZFBGAY>p=K7Q5`)*o_LY8P!Z7V2lS`%Z|8}CyT^FS>2XWc>IVh_x+BV$D56`H}n zs*5X;oem1?Ye^c88_3Xi;645Ofj zc4}ObG%8qg>9Jm?wX?nnSH}_G;)nHn#gHBmKxM8q19B(MI*;zp!?fu;>fODwYN&Rd zJAN|s6YwM{s8}#x_zUH9CeH+7(I<~U=;=M@_h4!rG^A!X>Uf8?TPHo4=*IZbBUe*H zdv*EITfP>aMsCV*ronB}Z3hzKQdHW{PmaR=B z)MeL;({ZP|t}=;J9VH^9wcRyS1@qWfu%p>$aTmTVKoFum0-)sP3vI@{zh;o#<*1$O zO?K~w<&z|p{bFg3UD;RtxT$kTH`2?8B?3wjgr2?r{m1-<~ChVdnlbc1v2ZSABs;kY}QdX?^35NG)LvN_2We=(|Hg%-i;wh?Q zu5Ds9sk`?APR3~!%3yc`QmdQ6y#ABQRz92d>Zy(=EaFS)d%$=rB1N>`BN9nwNatd> zD&c*RBb8bV=xF{l5}jOc1wEi09p8U`ie4~ZU;G1!{UO?e^n%-Xxh1V#d4a#+SmNO= zdN6(SjrwPXU7CoyLy9+#lgsnvz_r=cVIT|ESn)ULPoM6h1;&mYE-S zFVDu5+%r_%`vbC@jsD6>eAUyGq`SB&#%;9kgZD&tP9lsc24=*fzbPW+_PJ<^6V>2m z?;-m7L*)14cFvp&SJ?_Oge&|Q3CGs(*yOfwjSmxev|uGpu5#IKe?s@HNoH~Q%hrbi z*j5V28n64KXQ7{+t2d6#$I9*F>$yCHUY~2CARYE3G}%=z2MiJ|U=<@z<%e*>m;=wK zfOuJ5Dk1ZtxTrsQ1+iWd@FkRyYE@f~kJ}NAQYr0sm$sJ@4-EZ?;69U_h3u0Ph1YM* z1YR|94Y1*da+o|Ex+ke_8r{gL`G-6jb8SK&S`>bG<5mLQDKt~vm`dm=Llh0^6;JvI zzY<5u5?mPA=G}kUzw}&7^@=(&c}mRGoyJ-ZT0oRk5^lOhLsmr&gszUM@msk{40Nu0 znU6+NJoh~)M)voTDY4#IU?L6!3GEjvdEymi=TrD%GdQR9NR_Kv%EIhd&QEmx7`81h zTh5O-su<;PH*;?ddkK5^hP;`sQGZ#LGMAP%&Bf>3{4`C_KGo%OpC!4+qj$R%=GNlt zHJ}JYWA6^Y?{)1}hVp`-mn{ zyCsZ;j5lq5zO(mgYD7={J0rAH`u_GlNa^jSEZFHu=jG(R{82W&;LM%Z=59!5ro7!2 zr`8p!W`Wj)3kgp22W8-OV}$*oJvS=TVm)kRM+@PYVBv|;*tLWaFCb4~C4x8_P&$_O zN}+H(^`Tu5!+82revZ7Sm>PYpRWVw+lLYc}x#~<~UJFdo?(LfgZdCzHX1togG3p(< z9h7z0Gw?sNCls3g9rcSTH!ALNZ}LDZbeT0fUzDX+DQ3=;iTzzi#eRAI%PZ<3<01mM zP3%``FHBdqRh|-C4U(+~Sm1X~kvya5DU~>uIkgCXTOOtO^Q1yT_D?uMEAjXCAgk!` z29?Dz+bknA7X0$Z@El+Og?iXnwT-J>>#XEI&()eT-wa*Tt8ky-R!oEQY%i$!dk(!w zxMo}!T}z*$-U-jp1Wb2rs|%12!GO6kCOEa#hj*gmK`0coPo~TlGsyN0Ss3}JFeZ?8 zu_Dz_?0lY!q=%_IN8zhqx`<7U-Q@~;=Qj3MsA~%!?YEpaW^~Ij@RynQCtRrvGoIcz z`_%s^@TOO3>^?stogQTeV~5Lz)+N8opG($=XkY(aX`@5I^&-|<#;H^jDhET6d0Hy8 zoR2i5cC&!Z$hcTVLRyq`8z8lLc0nphL8ZK(#X;sqRY29duEUw79@m8Z&@acBSZg&k ziJ?2*SiDbZNWlBc4|bk#MsIupy_23<=^NO$*K$PSVdZm>$&}l@M)WlEjh@l!<;)qu zC51&aS_=Qy>%B=h^0(+5)c~0~K7{`Ur?@A_)Y(`tdFXkA2Ad$?RmA{bh2LAl)9n&X zlJHG=2H94jV@k4%#W4aAZ5s@UpUiSOMHFBsp*yrnpMU9odNyIQhz7m`w0Pj`GtY9< z=;xgxBQ;rj`uIow(08vK`i%Fe9w$wme|bqVvsN$g9Q9e4G-9 zLiw~f*^Qk(n}K;Y%`uFWOf4qT|5}D9+&5#d z5`MNEOXBZ6rW-8N(u&VymuNz+!*1jcCjKicwdCS2?~AV{iI+5wdG6({8%Kau+z+vC z8Ho|&o1wY#5lw7kMT);rl^tTOxmt{|l~Os&;IkX;0`#eKjy}pjDy^=5bu8lce2siec&`@R{ykPUe zGWX-_X4pOK5V{v(N;49?J~Rv`N*aXouLi0WYr zBS@CfHpQ%C!Bm>ri7aR4G8n7#acEIyE+eH!CQMX>B@IVQrV= zO_%srlz70e*Q2ws8k%m6h|Q}Ogi@5#$i%80+eybS!gi{92-g5M5}-f1Zn2RJbgLhI zx^cu`v%v?I@V-m}F=aAA1OatIV^|zsMhjxi4ugJ3M=5nfzS@ZY6r9UbCV9VA;5e8C zxVWXz$beQt5W5ucInJ)3r!0@?_~~%pS2`X)n6xOVsB+FAZxAIJYb9izV>8~kE?U4Wa=Nn$6ta(OpU8LByFcH>!6v|UMDg|+8J_A=g->Gc&m`4T; z>3bMievIe=_|Up(5O1*6D2_wYhB z?4js}QUJ2`4JW~X{kU#8K!3;TcBvu$B534O*jQM?NiFMaR80bF>^ggw7)06M> zHZY&YZWH}6ZIsa0S2$shqak%ujNLVgw=@=rgD)Cf6tGW6-LJ5Y%3NngA70lk86=Vo z#{egJ{gtjDS0Z06+R#CECE#=2vLV?=&*BPeJ#JyQstNp}MF9F9eG4Rl*b3-4EhT>Q zz+IjfTVckqzQDP^gDEEho6KL5r+|C6@6k*;R;&b~l}M}DH@I{-Yq-9_A=B~ zEvav{8t@!ZKk0)s8`bAaF)P))MEZ!S`xzD0W56I>d9V~s)3i?PstCJ-O8Ozd-=W1o z#opv$fzpP6>5(Fa%((~|9P=-Rt5v^;7ufjFzDe7+?M8?_thdR^oa2p?2JUPx7qz1K zk#+i{*W1BgdesbPo<CLYgFJQkE^Z*skbgjyaCc4J>*zF6Aggl|I^ zWF0H@fFbkwmF>GB!n8SZQnS2xsSonjZ0ZXNV zt@g``36}ELH@hXdhU)ly?aW!B-IQ5#a1=YBg*efi)cDILtG@`BFUN4GrqE&OBjeIc z*W%urKw(OZ_0QVq;xm1r2jgLeGK)44jSK4DzKhu^I`3Tz+}kwH4X>VZ*K)G) zO(XF7)7Puhl0-uzvA6%; z@<)pAbI4&vSJf}GGd*b_)08&WXD$Hdec}mjr47;J%Aj+*0*q*XN0{)dMpLl&jM1*i z2GYLuZ^@C7XFrLOx4y{4$d?L{tMYK>tTo?9-F>Y@tV5vw%Zf5s;TP&1U&N*lBj^`;bwI0)S*n`>(s*LPuJ^1EP~7l1o?`dX_2;t=l5L28}(5Q zp8Hl$2*vu2_z9Q}^C84~3b@Zh6H@Cs$kSduEs+8+iSst|WMK=b?R~lJeq38E1@Aza zSzu-C6P?IycL9ZBp@qi7oJ3rwmDyvCXmLF=#@2kNLtccM6}>18_K?kahYDHz4i8wp zS!&aJTr|4|XPrcnZM(WCJi}QMOMCt^^5Ql%OPRy^5VSx#CLWK&bY~s#am#{S^CGjJ zh}mn!^fwO#&f@})AO7M#E~)gQ)1!I97~9_le|t)DdbkTAQI1>~y;i&EGY;v8bl7P+ z)?A@M~aM(M&Dt&PnLMFM_Rp@E;4B`21ypdY~FRy{&>s z>V?&OJl8V7#Hb|N?eKtQxy^6aiDz|3W$cFm<9ONqIpOnX&Ig1Cy{0gZlhA;-b{4@; z$E@|_eBwp+5t2ERw<7OieoLcua2GnSvRsWyN{97z_u=d!!i=rA{Q`l%ct!a?+nLrG zd$Z_xmd~ee8#KOfOdyh;! zZyWtE`w?RFX=7Z@Q|}il$udeq^~tN`^OsI-@4)uYX0M1X`$LLv1?1r~aT#OnF%q=b zyDYUTYU1D1hnW!H+Y+c>g<*s6Y6%?*B&bDCr{j2GQUmMzkp`a*7GyDwjDEd1J+iR~ zA>;_e{8k;G=`SBMj+%ZJ()|-2dvK@H%-||0G<$78`)q7e`mif)(2jW!tV_>WRws<- zu+OFf+OD&TbvFSis%QA3x1RD+s% zwt)i7mY&$rjYv4;Z1-8`ngN4o>5m9m9Tl-Lktud7AY1RXo1d>@HWH^BhIT7Dk01W3 zJSb*J;Mea>>p;NNBwAC`Hr`1WK)KB8Z*NH`iaH!Gw(l$YK7B64c3Rc3ExpMXZ1B1QURjxeV=s`%tr2X{A=oxpe-(oG z*WkT`znYieVtG=s4e$ABuAc52bcR!gkkY*)Eo#G#zR9^J#mz%2d#zK+hz0XN(w@Rp zqUrRA`DC}f^)ep{u$xycpXB~(oC^{*`8jv2{|Ok~o9}UJvoE)tY3ICy;tu++V?Mn{ z*pKCx9DOeGsF?d`Xn1X>@lS8OK=-PzGIjKU^fiw(U+a_?zFfj!mu~Qe0s0#DH6s>8 zY(A@H4LH2GF2f~gSembb9u?21E}66>k*-o*>#o2d?Sau2ieeMZ{X=5yHJlvCQ#z0i zD$8l)nxs^lm^@dbzr0cXq(%z-s&axqk-s#qbR%a7mN63uF zt1K5Q9zZin#&b(&z88JWpTodWV*c)yZOkJ9KiCwoQRhmAQFej5ua_qlwjV8^*0PuF z#`KnYzi1D~t|(6f7%Ir$9!zBA;E!79;^MSYN6hEdxPB4qTj{FsX=O<5mPcjczGsib zNv$W7$uPs&vwhB@YBWXevT9fQ!yB3-w%!5iT<^r(ez%KwCzY)#{jM9b*#t{`ZSb38 ztA)oEhIU@I>vYK#qx)&GGvAE#%EtA*j@0zAu=0G!!;sNh z$7*=>mwfA4*jk(2=o?jCqQ&4bO>h@M6&ZS!|Hb*=@80$j-ppMlDhPvpGNneVf`DT}+cRgG2jbm0F;LB9we80a@4W!Usm)qid>W}kHen+x~ zA)Yrnt6Jh3M8ept*kr^4hhkr`{tM?^7x_3wbMj=@X6=+-7I&zC4yBn`-CZhcGA!RH;E zp=831?VCNRXQd}~E5b%;*Gv{KwxFeqxcX{&JIL+b%_Vx3*D@xcDFTEYim34Gn$YgP zhySjumSE&J_fN?`K<5+Rt=(sI(34rl3sfLBb0U?%dQK~_=I)@)+v|4dQ|-i3Cua&y z5#0;Is`R$kHtt;Z%K+wCFOL8eQakO};EaZo_Y4DVIT4-lrfrKg0S*$hwj3w^;(lvd zpWdo$=rbrei25>omXq*_;N2`Xy8YR3qQ(6N0^T=Ry^91p z6&(3u0bP;c5!tHtdr-BL)R>GQatJYZg8jkxGoDn}viS-wtD+}Sy$%jRu%-r%_#-Ym}9HX z^K$7Q&(DYJ9xTpP&8_ZRtx8AEzEE?uMa_eLKl?bg8gk|jygc%2`_Su%16Z#xB=51s)o2ia>nf)W}jw*Kz2ngu24 zVKRlCwllPs$|=p%u)951s^=O%|JF|Q?(&iQkfy_z2#o0i+iCbSq66NYn}aA-D$LWZ zC-7@_+QTpm`c!u(RqVWP0e;4HNeMYx9r3Ab&T-pQ^#_jzDg{#EY>Xf9FWD^iK_u$Y zJ*9^Iwl<~s`x7UQ!?mZhMi13cmBfkQ*+DAY6}R;dbpZ2>3QBZJ&zDwvPh{fAv!sB zzmrS(Zq>R)e7WMWa)po&kn?F`Ghz!}0!7>fsZ-~Ot zUs#G}zu~<_jJzcTg+fLl+*}zYEg({7)S9J!PWd;#?hZAeN``j7^+ngP0rXUq?uNg) zFD`-t&Aw*6YT4Sh`M2xn>NA9bKrWEK_BQ9aee=0SBINII$bkC!|@aE&8+@3YBA3euwL`%>^Zcq29@BPJDtHTJUvO=)Y)kds6w z;C7?fd5U%4S$N1u%RSHNni&xInyGA)94q`e6k;a`(YGROrk4JycPf=&^Qp6y3reOXex^9-nytNgxVZ5HGbn8Mr_BI(-ZolwPWux4W zk0y$0 zX_0$Lwv>a@{?VuN@(EvEL%rCV{w6p^$jek53jy9ENKzNNpxYnD=64zpy3HY^z6A{RQ*s2Y+fD9h{hQfBXH66rn}5=if7E8gN(uzetC@|L{xnw$m9#$J zJZo1S!x7Hest2B#1U08@JfUOLBwt9=F~`|nb7DsG3)0-V>@629~k7A{B?X|ch=fV4!j61ND^gQqaa*6x_ z2_WC=$wKGUvB&(x`OQH{yNa9Gh7fwpxZ`K>acH($r z5}%xTxQ}oQJ}YGjYRFk%t|b0M_}i&_7LIZ+*=!AhX5Qi!+h+fUth5smQP784J?*Fz z-<#0BT!Y7Kn}m}XGP>VNw_{r`v8dwAnqR}yvr2iYyy3XQBV~$}s;b~d9HCTiI8GzKdas1dZHAT%xsY4&UuQ>(czE@&pzxX~nuHbjvM+1mg zKfjsY=Rd4xW-}W43k}%d)<+>6N9H77mfN$V$ayow$~yFAd|gD7Ej?Kn%9V{bbh@}F zlR_*{EBSMJK*h z^DOr|I_fx?qbTJ<`NPTXP1|1t8W7L4^12^ z*FPdB+P$DNVT0b=*i2WsNjW=<*se02;h%G~A_$elwBARV@&6ALo|AR8+?#Z}r30hx zre%Do9QDMepU~q(oV&sZQdbgbx`rTtC=~Gs0*X9u?fef4z9^h-`C8cT6%6doH>cN! z+H6Ck386De`-(15gOPFh+;}6-lv3waM}Oo~k=SC;iopMxP(&5`dF{wcU(gc=TBqgw zT%!3Lbn<;fKYuNjUjOtYU?uXCGt|Jd7_>z6CIa=?Z&=8G$c7@XQ_1}=?Y;0%p;56x zxy{zLr2hf;+fZy}eN#ZKFlsN0A-5#oEgsPOAArCAPM%`m-=?Js0rUS&A*RF=9Ww)8 zo*(JK`Q8WG|DJ^+=fRdQ5L7LYS0Ue-ScQo+1OM$I)a)vVR$7`_g*shqGkH`=e=K62Aa4tp93i?0;N{PYrAuu9V&NzJ4L&ZP0(N%(S74 zZ}^IqT|e6YEgOT`FfV#I`HlJj?xRBOAvB7_g>`l` z@3e5Y6aC~;h*<3CfPVbf@B8;cip>OMykCtN@rDP8(c(7epIL?FyrFIXvTRbS; zed(BjnESfdGY=4BXjkcG&&$n_2syD?$%V%CF|l9j94YU!nET6hL+@4y+-0+=u-W?= zzA1L{45wirkQPnhyf-^}_!4%bQutY8qc#mQ707_XnqY>pQyy5)fn2&OBbf>1p(>A- zQnqzhMc$UqAPI!`?ak`3E|6H6)b1^Z50M9jO$27rjI9RD$gyvEmw&#TbR7Ajf(gP1 z-HI@l&%h2fB-tKVZ6pX!>qGk80WWtDpP3}37T z!mq$HFL@$tq_GG;yE{t?He&$q7d=Z#j}?bIarwSGOj94$3ISnk?-gM05fcAJ85_C` z@K4k>BJ9|T7)u!tqxtr{FX>5)Mo90+(nX;5lTV(25$_r0to^_+HXfkk$^PeTyH`=l zoKc>MfeziJ_}rOQ(DjFq(%r(LfL%;^E-BCZ%=Hq`p#*Cc4z! zbaxE{^pd^CxBns=v$`K!^j<6X(|W6g&l4tKFX>;XWUww`}3(-O7Qq-jQK4Eo5@0>Zx?t zFa{s|l^onn+@%z{-VK}_@5*E=POi}iM6NRTrxI`<`t>e~5+}>)g3m4!t0)F*Ya2*+ z;h8^RG{sRHDKy9Zz9wZ%LO#GbyFnE7DM~L%&$fLFj2}41`C`#E)=UEdbt4?L{G)9r@&M(|z2IcgEML{xn!qc@B$CuwxOqG8q)m+Z7eshk;ibEFlOzXj+lO&qB!pSZx_^fd2kTr2{&ewGOdo9K5Jjdo4qxC~ z8L-)}0QyuEO6tvOh8holr3H!_dd3g%C0=f46Z zNI!cFvmJ*@+AvNTtu9FY3Wo1Va%V9ts6fY?@>f)iv&{E5%*^<{rzOe2ep0SZ)KcVc zh0YH(fS!g`)WuTS`UkPKEqO-b+}joo>|^nHz_JlcCaK!?Fj6mU-cuyKn-Cta?mi;L zV|XbbKjq&B7;wy9Cwp4rcriTOD!s( z_j}I6ko+J^mw3x(IV8Sse~b>4A~3nijJWdL#GD^D7InP_+7lUQX6%iIQJ*6LG&A-w$Jk8KhgL)(gOev*VI~VJE#eKbVu- z9vG9C>;{{~t7k=3%gGQ}2opyJ)!~PDYhVo$H}(q(!WBORL^wPrQ|3zBUr;2cH8{gs zw3e>yn8!-$-I~qSb4V#t+l$bt9!}{vD+swr2-)QPm@pvL@Yb~1KF9DY*GLCEZ6}ij ze{p9xv|?ftuX`>QYHlJ(^t<6&c_BwYrbdK{3vb2}D+=^e+N`Yf%;n#04|FCoj|5T)mh&bK_K%dzq0k zw-y@jL7#1|J#W?G^VrI2RQCqICkZ7hlKW77MeHI+%s(cn>alFD@5`Z7<_n0Cai1XL z@ra>$rA=iu<@$v_YXarc6UMegZ9tg+ z_-UF>;zeU6m5U!UL2G-ci+E(MX|9qQw`o32n^mN^6T3p8w~%^UBpco@KVl8YRz
hhYK2!!O{-{ae6=R%$BO~2(XRt%}@G%-H@s`_Riygyq%Pf9yw;m@I$HtTRx&hG;m0)0`46ONMsJV|dR z`s+2D&0QHcfr%BqapXMm6UdKKIO@Dh)(SFFEF;&>S|Z2~^tGS(X?p;)&3n<+%6A#B{QkCdj!;pnf}riz2RZ*fDGN0U|e#pR^f-x zAk*Gqti~~YEpSZ6VL27{2e4%)P*foEAScF_>L$MwK_r2j%=0m4fu9@v<@Ly{{f`S4 z3GS3GHeJ@|-pgN@vyg-5{eNEQEi$@L_ue7m_WoKPOD$_Dc^3Cic!EE39Vn zYbNM1j&pOIjq>Zc)d#O2dVW;(RC*qi-Dgt z!#Mu-WybE9hEZZKr@MS-jFDK9MBPYca%j~v9jvaj5+zdQaMo@bKl-cjr8t#S5MJmq zIaNsH$Ra`4?b(NmtvR}9$y3X?uNqsMNAQ!DX2h{kF2aRF_23Vzds=JnY~-r%=@XwJ z1Y%|dw)Xd)ku-r2lr3LyZ*$)!2L7k0wXTUUqh>T$vAO{tTTYjQ;aa|TDO}P@*S`is z&*>Lh!B0%_sgDyRdCZYgb4f~7(jQ^k5`T!Uy!Qr*c==DY)+n;|PMnV*|7H2H3s2#>BXQteAh)6>%ytPh^#q{W7ZE8E(Z=+bdCF6*n`?|k%FTo;96C%2t@x%45!-)1X+jUMU zU(xy-RV-lHa7j@JKU3CwbEDxFZops6yUl? zTvx`67hZg|UR>sj4pOmME?HT_6-baO&guH^_&~cP%-lpm)`zSsdeLG z7t&Z3`i7@k_mm&n_cSVx`m8Ft3@(d^2B(|{0*wWqci?fvJTfnP0zH`AC_$p);yhqZOO|V43kt+u*EAd8o>LOT8Wrkb3QJ zM4mdPs;tzrwx?to+bY%G4-J* zHn!agF#EtX?NWAjbQ3r5Nc5d}R@moc$9baD(n(-ex(k%EeaCW%!;tWgRq?mrS`*)B zq0yeLgf<+i&fL$NT&!X?zo-pCLutM4933fHELa{fn}Z$9B0=AR1nsS^e>HI6>!6lg z-sQAhX*=tXSvaacv{!k_02Zf-MEmKkEs99awNuh!+-=sAcBI}SY zjbWt`NQbvS3{=&ZV15fc3hYi}f+shh?626jR)9Huj2wgXBw~3VLi&eJsSh$G^PNLm zLg(d3X^&z;Ln48QN$vjfRa*@uoU}d%Sg-}-ADFmL?pXCmWh}#X4@RL?Z>!*frPKA^rB)uEWCEbH@Rgz6oXg__?!7eLy~i<5 zFXa;47nG%0y|#BiLEKF@*Z?`&)bpozc|;5oo|7N#c|X>uRjyI)Pi(rMi=UZIUgl8U zOY5iqcyg)xq>(G(t%CC_xq!CeLBAyEWwbh?W)S?!nKZDP8ii$EmWE?xJIzP?nyL~+ z=R{`e2C|nI&$*iOT7EF1iwDi+AHo&+f~){>G`2Io(rR#&N%P^_m9wKCK|O~RE!Pt9 zu2*<;*X3V{-W<=D$zRF2PT~SPD4fG%bRB_VIM}<1K>rBQO&o%^WUHBpROoXKW|>@A z1V@>nX4u}otIe^Q^ycU9&dAXhA60dCia>}uzDEi0s6TqlvUtxBACUy!a?u%67idc!41A5(n@&I16z-W)5#C(Lp(u{lP|Hs~2 z2F10#-M$I#7ThJlCAdRyhv4qP-5ml1Xk0?00fM^)cXtc!?ljuCpU&R&hIqnxGKAYrxY%)2#eXX>1 zx^w|2?JeV&UO^{B^k{13aCOWTf|1r&|k))18v6{~Cep<_C~fr+JPb`0k7brrglz0U0wo0!c7ch*WSAWvdOFfl`AE0%t=MmZ0e!MDc4 zaOqV#q4m@t*ze}#+U#h^1B7m0{GL*t4s36a#5DF(zh}Td+Y-f7f1%t%g;O!`CPmC) zV`gHoo5k*J&kU~ex&X{vkK`cs_s-{Rwz#~Nj8^Idk7=7Mapbjf!eV~^?o{s~u*Xs5 zKx`umb|K$C(6+InY(u&(kFqCW0&B!bzGm0NYZSyZ)7@K`@u~>5V#C?~2-!DOkWAw^ zyLvC5TJ?rEc%Rb0$f;92v4dcHM<8-GxkK%}Vr*YfuyM+xcNB&6m*9eVwK6^W8&J?L z02y6srB(d>h*ws~Ox;NJQ~4smPaX9=5go5}>q&Dm1uDJEyN}+M-;Dha=}Zi)wM%YQ zfB%_10jK0N_1nEGskHHgqOQI$w=ey=&tL76mdQ52C}K}xhYRPYw!PoryQhoXg8LaT z0ykMx1Q#6Tw955-G1_=YKn7%C6mK&_b*luP`h5G1PaWXt{aQOo#0>PqnsS3?k_b-` z2uWjcUQsi3?YiKzGhVV)wl_shHbPy)5AEF7=j57Gajx{y5 zp8-gp|BI4-B zK`(-MJr%Y+%j|voh^5N-9PpsI-gMW8(yNJt*d0x#{lZoaDk*<8f746xyhOZrzVRIz zivryhnA^I584q)S)w?Q6JcRUiDBTxUv_S6c3jdotSCAnb z7Soj2t!!PZ!U#YN3!?HzQo%8BmyntgG)9yO2U4}!7q>-u4DL9WkGS;gz6?KXUKWN~z;LNI*}(1INP+ zMf~w}%~GQpeOHh`E38rm%Fz3{uv5|DZ@#*4$X{3#`M) z`q=BpSzJdc_W41W54E(a-2l2umRO&<$sK(y#2GH`{96iN2sI=B=fu2C9G)=x{gg$x zOO>z_4fA}h)Z^fOe(@>Kzxu%>6D|VYwng(TVW_)M=k+^&t}{o4qn{6W zN3_V*=dJ6gJm14qb!BIrA}-UxyBeZQr;!?xGh1s?&ACli*tJTkvq=&qejvw-sJr#a zj`0`Kbjp7vg9BVp(4NZ1z6ws>4fnxT=-!rL4ZI}iac;81BzR{+kADeityXhy_5$;% z`>7>7n8I(S)ep~Wc&V{jrp?p4=Tg1KtLzn?Px=|AX*F5{oall3U!OhaO^smB6j<8# zn7CY~Hm`WxyQt4)0B;k}J9bTWSr(w=?dK++QG%u^ck#XMY^0LKNjc+KvHM>b(JG&c z)MyXXWZ53}xL>_Kfu&b>7BX6q3jKF_UN6jB}LIqarJD0^zcGKc(SA~F&pq2_qa)15gt%Z>W>#_l4kg1 z79(&r@~RUyg~gQiy5)6caL-JtwvTx}wR}(`0P9CRvfjS^@jpzcEB2|Cav-=k;+?%os26Qz56r*_W&6-fj0ka)!^<$K$p{4={dM zEgx~THl(X)I7L#jB2@a+JR&y=v(EIuFN>Dh?bc9XSvj8D!@`&A)hG00D4wQyd*%O9 z+ACN2cfw)AN3Zx1enWbs3$JeHhZHtf;!xBjI%gLYDMuwfXKhTpY#jL?kX2#*JD@PV zoer^P#1Zrn`D*;a)<3AMqVPsuCja;PP7@B2J?uY`IVz5d`1BZrL$loNI?=T~wra}K zDs)%3!u~T-a;UfVVEv1VH_8qE?)!<0&(QuW!cqR;Cu}K0loGOQg@#GH|0dj}#U*9< z&QLgWHBdPa{0HM@O?lc3Vs<6Qg-xC-pJm-)%o6~DHHNo!!~g3bMUjv^QGKybL`65J znt^;tr>-gnvR?GNO#gzugjH2O|Ma@tYxM9XKJ~ictvx@1YOFf)AHedW+09N&R>_q0 z@+pNDhWPYmjI|*?y{D(A8ION{vuo+>%*+PFINRubT_V89TH3Dqt`PaWv9Ympc2*ri z9O!8Xa9*1_1U^GHl}GIxv?1`I3M+AL1_Vu)umLaSUVT>_*@FsI8$JJC&ufL0oXHIwHW&8E(p-xg1!#OFOFA2li6^ z=&k@vS~m4$-j-sao^hxA$v%^#!Q|cLmCnQq19Vxh^Ra*L z5yGGxd zxP{2e*hUkKKELLsrrX+Goys#jWY=)K=QK3Ayp!!ap zh?hGXRzY+U|B1$fXxbkIbOSziv&pfCBy>>wVGjAphqp3g zdNo>y{vy@rko)^i62?=U+oHj#2@r%0*S-AAysnccaX-GB0&by80sAuIN_Sze-UZX8 z2nr(J_jdskI7a>Xa1m|T;|vQlx)_k+Yn(8*GLz_MhH0gMXL{dYZD#N5(0XQQP`Td$ zZ8M@VP2a`+NUf|O`mCK8oY=61!O4L0;o*9k(!q=|r+`UHGJZ+yD&Kj>PVXzh86m6| z;g$+%QfzE@V!qWNtB$1qp7SWiVS?x9RXA4t9O;Q~>XOrlQ{IKUL{NHl({@UfQ@@aR z6|K&sZ0lEir09{98Lz8SlScyuiQTWoTCKLQ8jR^-7cYI%UT(FA z?(>njydzj~1Rv24`CZ~$I0!vd9JKyEjWdlu7|&f`MW(q%o{zpT6Tv@^sY~$kxSr|R zj^pBNzK%+0*{t5FFF2`@NQM`A(vath65b3nnx$I53LIS}|2n^ECVpht^}!_mbPmRDKN+wsC|F!c432V=cRs_AnNvm4F%c^K7%j%^ULD0^upTPZH;`>zAMXb;a0(7 zl&q)MZVR+irJirlB$=`|4*ziI@_3vOY))(Uf|czeN^E_}B}IB}$Q&KsQI+%0EhK_2>H~j6dT%sUFhT_<+$^a(3+g}o2AphF= zLVN)w9&H%Dz&F(BRLUnVodGrhYL|RTVLpJ^#5l zlqe2ygovz;Jh6cQI)y@1G!DDNse1K4=f)L<;D|hix!dyj=2q&MZS|MSXDv8SG<@?J zYkC}HYH@N70VwvQg2nr*3Q^+ad^Acjh!T)A8*uFGC$#fJz^2(CJMh4sm}RnYJ?&?V zAe1i()2ORXLmYnu^OK0CCB3pUHp1~cgb%hB{e5^ZZEx)Y6ZfxiPy!-x{vIJYSqzXd zGL!DakR-W7Kp1v=$I^GJDFIj3>$>$|uG8B-fSP;BXjQmEQ zUTSU$CMvUv*voxX+D7xMwBwgH`@+2f68CkXoH9;L_`l()2Ntn`WWd6XNhXm$&Dt5V z=sp|791?%K*$NgfKBCs1}#}^Zw-OM$4e9ee;UOloLQEp^M3_q0Z zEEW*NlrixK??Z08yKB*(LLX<}GR^k0q|HfkbC3+Odp84Vg2<*rQo-?!9I*GzA+wMr zOkzl0zSZ!FqL2u}^w^^c8`k_zwn|!TJw~xZ8&mx#5DMe>b(4#vKQb&|MB{DG@RRFu}Qba;{m+~rE;=4kw^f}Non=fJ*R<&cf`MXL= zKxn>9rSVCJSoeL(Udf_mQmhDoGJDliqrLG9K<4)@a$Ex&+UAt6sFbNlg|F%NkYzBB z2mif5+h}qv0vFFJ}AXH2kPTmHj3&PsA`2xKxDdJ8V$x#u0{E|T7>EE; z8_;ZCiaH2}zwMv*X>qf_i5SRwif`kDI#oJ!Hsh5mp=Vh#-rJJkD&hxyy5`67==g+^ z`VsG4Pa;tq$8E$F0wTxN8P%MgcaZuD2vl`{E!|@$ODgu!VN9?0>ZTUu_u%q(h%F|z zC+N7%ro7mTciZPI#XR;X_7eiDqAI%^p?m3AXJI94lIuzZVALT>q_*WIy^G zn$`*)W5-}MY`d@!O_<_F`+ISX`OFA0bp2Zu0{-^^%I>G~|9s1i_(Bu=KOZ$Y@#fzm zOI-2)MVj*ea7kA=|gF&E4Ruyj|T?x%Pg)eSjvi{ZmD2ZR8Y3iSeCnvNK6#5fwBqAaL!lo^3Z-KQQj=#*BU8v%P=aoWMri-2FWbY(H ze|ARO6C#80@LDNP3hRAwlGa!c8Iv1Gz|1^qS?==m>!+aOCKUlY@~RX{8Fi7~M;Fg! zA{^sHZJZkeVi1A@#NL5dWbz!I-de3&EBm54+D)SPksSqv=QelusAou0!ulsLn}SD- z@wf70N=L4<9CyB(YGwH#!fNJu*wLJ+VAi{vq^fYQkhqQ;AG!sbA&G z(@$HnG)}RvhCWeV_3+;AmKE~vrGZs=^;WYUa}s?aroJrK3Z|IAB_@!6XHt$$Q6rkC zt92w|u76;lzHZ4oX?o>5ueU;rewYvo@pcJ*?(&)ioLkUxIl{FDagU)Pf3z)&L+h(E zx@S?Yne$@f&vw>=>Xug8L-diu6J{~DrkIj#6Ct8;Bac-4IbiTY=7E<73F6(D$kWU7 zB`s(bhi+oEFlMGHYKx`4|KZi(lRMCJxs?|#bR`mTVg(-EriPQDLB;Fp_5>h2cKp`I zgCUWmFWn(&>+8duR)$$^y>D&gi60KIu=?>kr7a)jl=!g?sYiq4%=cBy*@lcK1wpB~ zS8rCKRGKN|a@LEX7{_;3D=tMmT%7NP%cpXV8CW|=_MJYZW#Mlx?f0 zzL{U4(rUY>G0U=DL!l6CW2G+O_th=_KGS9X*Knfz)x}f44aO58RZ&+{>+I>dkbCl` zlj%8*ce;DLsZ{nX5YS_DdZdK!H(BUZ_Lf)Pyg_Xv4FcI)84Liu|mrHtGIPIJ$_JpDu{;VCL@~pM-%N3@n z7TV-dsjTljr|~^ktAh8gYmPc@+g)(1B@BiGM9k?Q<(U;$Z+3ECk-1j-S-H0n6P%Iu z8g?`V{x*Ct8KpYG@T|ika!=aygkYClJCqT5bOGqxhT?^TYlv$(iOPBj(iSLSWBx8=E z6k{ZatUYwpzOD;}M46YfZVoBpzeFbe_Vqv`i#Rz)IYJ5W(BFCmjP4*iB473oN-agY zSqCdx&|g@&6a1P;wLcrnmgwq;-RvQAcw=ve!C6EV)uW;gyH0gYw2@laY*b4t7Fydv z^rFAiHHKkWa|rgJsov$0A4#S%E7F)(t`{U?pMU-~LUP)lf@uIa_YiS1;1zmUCs=uO zv~cBGBY(FaUtNM=C>{URXUWvnVSD?)4BIy@n)h`&=dwpAe}>lysRlIzvtL4o;&dq0ewZQ@DZiEEIzK#P!5&K?7p^ z`1!!WTeroO41YvBAJ5HuL-)>~it|+g6TG&A72@ksZIcEKpt)}AzlV8Ah?DI;*V>VK z%uEATTy}lmJW6J?+p2*9Z*s?Dq%RTIinPNgVT zDfd}8DTFz2-pspH*ZBm}0$M(DILm200pdz!_bv!Iq$d%Xek~>&MN(Dg1j>DM%n}dt z^RtJ7^IC}!^U>EFsJ0$PTupAdyTzw)V_blY_fL!$f`yT<`84EV>fp3yiI;Ca9KS*2uz}1 z`mbZYov&N?Rj8JM zQ3-zZH`f%e`)#s20P9=|-RI{ixig8+OOk($^hwS4qk-?|FRJ#4G15#@_61M5TJiAd zOav7ga=UqTMdyV1=}$*cm2k(WXu#|xHR6E>yX4Ku76#mYcsjGqN%E(|S!MtR@DW|L zBUx8jTeS{^uc67Qs#BXXA{>eXUun9b+ICT>{1(iGPK*#8=+rVm0!Y3 z{qlk-K$Q%wENOAmcg2k1#c=fe;Zg5C4YHhtbvQBPXxthP_E3%~W)5KHzW+6&V%wnxSF!2qS2IL9 zRnA4088-h}SbWh^i~83YwPO{^Y|fD*ue;$q`BC_zyaT$;ENXmkS}x-mBT{)E4+B!w zgDMkc)`f(jTVj_R_OW2Bi85CX9KrhV42pqRFJI&YJ6e{;0OGoD7`hV2Krf=mxr61K z3u{5BU+z1(`nJcVW`+41E;e`T7QPQoQWKduQ3f4Rsur`#SnzX(i1cYC9{zk~1irf( zX7iuTU1>}=v$H-&aRCUe-Kkqx-cXUjpdIs{a6JFDIf(MK8`ev`PzzOqWUftbUUYe|E{w?w z^pZ}+EA&??d(D%Oey(UQcRb$Mim4j9{3z}hnV=MZoxxTlm=;ARmhT3!NSxf{cPMDc zO}VKZPxMT|T3eLXw09Z`^MsmgzZnBMV@E7y2h878H3n}ADHCA7x@X0ufqi4q^Sz3m zdu(M?_#9*IH+-;t$x*X9aSwxoX%a62)c6vv4`x)d@kJ-0tabM;0}d znKTXH-P?4%9OM>R%U+N8;3QYjUmuRuE&3i_nUDk2_zRMz>38#1685c?KcM~O^?uNv z>jn<*nPFqoot3x5T<*?`o6V!X%;{9j{<3`xce^|1nQQSfHTmXznZb!;M!DLivp6pm zJu@)YZ~MMAuT1k;PW$d7DC)4Cxw-{qRsoT;R(xM^*vGW}wq6bD-CmdIAyRA_CqD&FKu)hE%F;@~bk@_j#BCQU+Q@WJfaML`<~2Ul&%-{p1O8 zam)^b9|eFH+x!d-D}doU@pX_^hdmkE51_YgduYiMl~(gToA2X#q)0t|;(T4voq^id za_fs<1>>rvkT+It-y0J=Ii8e-d{(i_=Cu$3q*<`Oc?F_r6t-?-3AS0eq9o zEWP6vz~AW4G+fMV`B2CbcmAS`t+9j|SmpQ@(b{{UJrBmvZfs!9x2$btVNLS`X)qtv z@Clnn8DCCW*uwm9`$|~8p}tg>u|B3z^$OoyM+UcK#J$qlhq@cHb!U04j=xE40T75Y6Yp^A7*;ux)ek-FYJg6AdF++NzjFFLbeXPP zdZ|J6arIn7CxGL!H%{1f;0_n>Vh_|JzUzdSX-G#ukM7#ly}*o%*L zx6A>(Rk$X`NV3n#cBm~T?xFUkn6@(_K>t%}CHES;EJHC_!Xb-m@*{(aeY6!?!_q@1 zYq3@d6La1?gH)Vj6)$!B6GHzLTl=a)mFc28=I#awD_JGr6o0C?9_DxVwlOCHd7DWq z=Hw>dubTFO+7FUlpR!FJS<4vhLyOj7Oq-WzVpnxf|RNDbb4UhVQzHc1tTS5m7U!mUC+m9sBzieemfpq4SI=p4$21~Et-@nh0dc-jN zVEF)m)4Y^p-9LdIe%F4yL%1*$x3=xanr-7k%8hc+Jf3s(rvD<&sPH*Ez)<1C^ zBw{gPG~UXx<9BjPhqrlSiQa1Ko}Q-gI1nFi zr$bEwi8cOtp*hy3Ej9X5Rv!q1svJeDhNzb7V6CKo5Qj9@H7BtH7ut9wNYKQet}O55 z+>r1*V5HE3v4n@j%CQ~5M`=jXg( z!w;_FC$8aN`7|6%3=-O(HCyk*^|QrLTS?XEXTYF%Qv7#hp|_#o&p#Wn$xf$Epm!Ho zI0Hdj(H5h@>J{zy_!@F=^0R$gj787PX@xwYrg2Zi`jcrKH!g#m_}sOX_|m z9Js3M{4v0vb(l|vDX|y4`*qWf@vq^ub46HQqU~@R2x%ijrTTDD9p+oY9A!0^LBhig zKn(%f-fDfYGzCO0I(!(#tgIf%24zt1=QXmOvBEetYw$xJ%^Y?xqGH{c+$;pVN3j)| z(4itThd2_&S|2H(vNthPsyR?Ynspn>*bHJn!nm`y;or8-J5oj8cxKP)7V6*&)-2A` zXpuB8j_2sjcgvigYW4Xa{ZET#)DUjEftU=eX zR%@5N;;*I~8O1ebw<4;F#}re>AE;E(Fwor;YIw0*=r(p0Iv;Mr_&i#RW#?(4$&EsQ z6XkW;LJ5A5XuXd$<+8`2?>}X!?BX0m7A&tDRDL9j*M&PU)E@kN3R2d&1i)NCV)D_t z{KY|@BuhF8gXKV{!hY*W`w)sn*N6>N^m^mJYVt>~5S~~oFoEWWCA5X(W5HanIW-ccMDy*p zl(KoMB9mU68AnUFAU&V!?r-oCFJwYgF_uBW_m+lD)w?KDni>5sKKz?)yw8a=GvUtk z@b&)Fxax+uMs_6SWK44%8t!|Ah70kzP}X`(e(E&*wg6 zGyou;d zczqACdysn`CAk$7YuiA)&E3vBvnpp*K7wfpkbX(|S&J7!koU~x{C25DTzm@CIv>Xi zdhCXha>j;+E@Dafubfgq3um$e9ewSR)R@G*raOxRcPTKNPyhbyq9L?kPjiY8s@zmD z5hb+52fnkYSsL`ix@L6Dsmc?xeW%_XyntD5N`;biC}D45?IXpW_*wCiTfSAeMAp^I1yacfn>gqk+cOA;Mgh*k3UpQFxiu0qx=nEycuB(?D z5*B@*dkWc6(AR|l`JmphrR@D83`V^&#(=SIsdM>t4O(U_8bV=@?*p&P`v0t}KI_&! z-<+d}I-crO@SahIcHL2=(N0V4*9VQgW<(_YzlW=ru ze`AfR>E=AIVX|?oL|eA2C>#sF)Mc1wu_-eG_;S&Z>{zF5^PL89wxG?vD@br8$^DaN z2tIu)aYITgqd zHvE}sSv4J$&*OYY*y`<(sEbEnkI3=o%2&94JdW=CbaD3O1Eakn)}vTEKEXzz&Ee+T z06G@A8C)mo+D3Yux7BB~EslZ>62~KEQ^vn@Lw?D_Urx3|hQO{3_@$stV_C>6KgMs$ z_8HW}DBOpD?dwmtSYh|k;U)KO8X3~;mOZo>=!n^}$qpeAsXijBGW=lycXO)N@lUPy zMvUn^X+#WMIwZ}n6C|teS1+k%Kdni{tLYa@{_Q%Unc5FHb$p;%g>pafV_;5IE&4kz*s{Tm?MU9lHXJ2G|ia^ zM5Ktjw}wnAxGb8P5g*zZWP5x{eDA89ol=sXwpnaYedc)X2Z)J_SnrFm`)-PG~In0{yK z45JypRhRtQ>G~?B&2iRb;~iQ?gWNKCQ!*rF^Xa$66@6nupp8^k$p&IlL zG(ZNck;T9x0gM>Fb!}_GTy^wz9nq~g+#|--aH@E4rt~l zurJpcA5gmubi(>_pMal2o>JU%$wQkU7Dq!u)QRBm1L2_uJ48zj{1TVpKvH?U-B34x$6`NCIzei~Q7q59;kk7BS0Efd1-go- zm$M)BfYs!T1;Qg9pwZ+2JmeSkdVJ+OaTD(kNpb(dF!2bLv(??_>GnhZ=xhh39^h37 z@B-|X^FY#BWwy&}g%-ZeN?4@di2IML-rQg<#J@zqT(2L!G{~|)Q7^-9a2mVZDC@X^iV+ z44mE~I}R)94-Cr?ZADY)r{_|>a%cqPOLSI| zx7w~K#m(%Gw|Hq;37mwh*xrNLYDLTs)flQrJ4nRZ7m_fVY44Gm0JWVzuMb49QjNp@ZcKT5#}eMZ9*t-FVin)NseulC#L(^CkrSoO88^9=OXW)&gkJ_y}C8mPAU)Q z$@KX)?Y{d@h^HD}QLTulCKmvwEgQ57=~1aW?f_Q8iZMxEfBZr@I`{+bdM}iNVkHp~ zNS>ZEmCgGpdqq}s%o_}qo1*HxC9_#EoCbjhj|ZNkUM>^{2-jS$Zj+-Vt6}{c%CCfK zKjU*B{gppTElC>=wlZe4OuO-%u8RcIU$F05ddI zCZ`=aCniCHF_+D|%{{_j5HeFA2-hA?-qf9iTkkl?^(!{HSdm-yBI7&8a_m5z#o@$WG=uAT)C@T+AX_rm4{ zs0W^yEK11+c4ClSwN*y9qBnYmTS1jLy?llh8Y=&^$DO>nG>cqAb1TZty~+hR)GN8@ z$!53ai#WM!M#5XF?@Ccd-wMgTO>rYJUH?VmK@idsAkMr*Zv9ybzhq7)aX+Ig0R0Ev zJ$b&!^v^V!QI4C{b_Yv`Rwa`{>6Nu}{c0+;E>`tf~1N{uYiX5On zjU+Yv8A64G(0Ue{_lZ?*Bi$Gq8K++C<u$15&(;$;KzE@PN%twaS9Zjy3h?(-tHBe!M?FSA}| zx?tuFPap&7yUSF;0){1Bx~T%&f9}I2umOY!TF^Ip#=y!pw$S#To|o;+L*;$;UHI@rW}J2{Q4de*a@sp2R7nZQfB zi=tr+a%DrOs&Zfo*O5@oHI|uw06~4x^eOXHj;e>#aq1M2-&ic&f4>1C$@2e%N+_*u z`>Qkf0xm!NZRdmRY4z^^H~#$ZC18#!h=TYS8R+SQAlSo)(>*#mI^};7Igpq?sjsi^ zOm_MJPrb`Bl<;3YF36vmI|#I|^}{|I{A$|Ff^@9~a;MF|cFt9~K$J z#PrN+>eBS^g68%S^Z9Y&lXdFD+TzR(m6t7Tx1nqgNv5hW(Y=i+CZ8+U)R8`Q#+UV0 zyWx1gHsJ@BG1c{TUtlUSh7b>~OjzAfO8VDHu z4d6Q`Ibgm?sA{I6{j*cYVe{p5jsQ0zduUjMX*q4Fu2+9cu2ymKD&qc_t}}_0;{FYs z|IE8)*Pk4%-K^dklq%?#onBHUO;Dskr|)(2j60nMa;E=?6)A1M$;VSWNy<1I)bVH6y{2V za9NcQ9>G2B=z?C3qKJYLBHLP8^f%Xp{BY;D}a8_uTf!+gbc?A>x#5 z-=xs31?rD@=PI`W*7NV7gh`rVsd&V_B`D3owv3CvFkRrGwa?yDg$Z|XDqF-iutEbh zXBry9Z^DT4NLqikQ&|tE^$VHmsu~I>SovbS&tjR?BnxoG$o2EakABAzfNloP3IPk` zebMNC$r<^j*nl*W=2F_b_&q0QYMHE^`G_`0vez4pv!GycAT|;`XQ2O0vir7UJm23T zry`l(ISC#s7?UJ9hwi5dUI8($%{z=j_Yzz_f&Ty=D{>XNA-eDseD?-I zZyPY8TkdF|Z>}Ic8SXNDeAp$wzykuCRQeu846h4L8#O(!95qNYZxTw73z634Bgze< z_v8K+n-&d;*0elOesuj@AYtrHX`^=Qm(k&wp4$Gj;{i zRSka{i@dt0w{rm-=hl=iO-S@UFG^)~$GZvPl?( zVcLLaG5c!=wHfP8#j(KAQ!Rf-kuX`c8ltpH%{tv_T;`^9<|m!Ql`VqnJgDtmUd#%t z$bpk|Za^2_)vXyjl?RaQ<9MLC5AfbuJ68R2)%W%L$l8?}14*UMp^?tKv0?b&r8;|} z+mv5J{lt5B63wV7!!nN}-Tvi_D1qE9okt;4+4MH)H7Trm-Ig>)k>Sg&7MA?%Ih!%a z{_@%up>7pfxsSo4I`_50V@E2PcJ2aRa*5x+Cy{jV)xXjn^J?&_;eK!j7N-vmvvShS zJD+^G=Iz+6B%s)9LC`jDX-RmYic|X;^BMSL5pj6sPMWT8sd}>DnV{!fZPbXLw5B_T z7qY$2lIvt5ES<(lxH;t!+HV|hPxg_NWzMIcp6Gt*t4otOuSL-a=A-;dD|Yq7Lc8>o zzXe}g-F7vF;7O|_#&K%p1uKMcIP|6c!Ij;#U1>rqEd+}wy|65J^NB8bKiHl4Q{MBZ zrSa+`=Z7##ld@~y--QbL^Hf|5ek%<;xYXL~>xA1nzhmrJR|lfBmxWOV_)k2Fwet21 z56%f5?g?X)Z_~%>%4&wVB3e@uzwW>h7hWw>?lI(7>zS7mUyd!h_!W%uLm}S)xc_8( z(i-ZXI4#OiB2MJ_i~X5dg-K<1P15RWKkkJ87@uI6Cc3>apMNP?e!T|eC5ris5A9if zIE&N(k52m4ckN?$wc9z6UxGA>g)DZ7H_lm0E4*WXip8kg;{HdsF3RoZM-`P(1Cef? z{+KFuc~X8A&_#zfzXG$KR!}ZH5Sr)bltdH|RV*ZohfASKJ~hGb?E2G-)?PS5BA*&O-aA%&x+ly;HSeYxB7QH}6SUkpcSw68#FJ#om|Hmj1(d|yCs+%P)k zf}lIa;uQ{r_d9-RWhjBC>)@K8;h$y`Z&`!X3m7~A)p&N-%p>I(#R!lYlDWHj)0 z`$uta^$M|(8h+61DdI7|RQjb4C?1Dd zRmOZeE-fx1{+V=UcKLCwL#yojAbc^nOwrnC;2MDH4&*Ey5UuWLO9|?h?7%I1t)G$b zc@lfiIQqZZ`_5=MyRYwbw@8SHBzh`A5S_tDLi84l-bL>{1|uSRwCIG<%M2rfF?#QV zi8i8(ZkW+K<8ded_gU{+@AL8b_+Fp(I_sRX&%Um+uiswhoc%k2&|m&Zp+}TEUDP|Y zi-N+m<&dOsp=}iLZZESzSo{$(*@+MmX%{4?ocvWYl#iQ$*$6LtUNZ9m31zBKH(Cd( zBs^M7r>)xVz58J)-0f`lkw=}!z7e$g0Qv$*V^I_G@nSpkz8=QdZM*tWOYtr4j^Rv& z_!XS~!ru1Q;8FISjHeg)ZM@}JCr9g2oMNAIKJ@Kg-5HiM)F_o5apX!pqfh6sK}v08 zy`N)@4LIT7SpbB&pWXks|L`V!gxsE;W`~}0|6Sj!)Av&kWPR4}FDG{EIG$D%f!E7# zOB9HJZxusbkyPQ^b=rZZ{B6MJiRI4mVxEf2pZw{WRPk=TFe?dJQ6j5JKn;|~+vXu) zA$%v~g`4P{2n)LUwwe2hf8KBb(Ko_xDc^wX{g893(#8H6z?~u<0yYOXLWJ`RGC;Eb zfZByA{a&qgn46sz=9=T>y0aKIQj~p!JdPtFXZbUS6*^2=HQ#ooBMTw#g|(L9Prpb( z&rUkRIQAm(Z8gZblepV6lC{c4&~9jQ-)8EuakjqIjt#7#X3I#kk>Ne-ntgk~K^x!6 z)XG7Ks?$9NtajD6z5PhpV+mJtNXPZ5WQLGL>8X_md()Any}0^A8k-5@dZd(a(QO6# zu)X6oZ8OJwm12J*U#)2OZ@Nn%bL)|+=Z`9#x*zY=&%RDw#d*aaHgq4~C!KWc40MiZt2^|Yf=Q#xFIUb#9{<)^%!)?vvq>taiJ{kGnk2ZHkz!|+A^ z=Mw9ph{Dwwr{Ty0%H*Y7lph8U=y|z={1~|Fm&2C>*jHWssOB?04uUKa9!%)K8j^I4 z8;^-pxJt~HK=~ZmqK--Rxm+jay%}@<#OzPfd=s)Kw#?c;1xDtPJ|mXdAe{4ZqTk$B zs^4j}%~P?Hd)|h7y=n{gi>Pf(y@(SjL4?kK*6D|z3j)G_c@vSTP%Vs`!}`pFz4>Da z|M{7YBw4&m8C1kdRaH=>ltQ?&k9t1uOp_@mzVF6&jGZVeRM`jg-K!U;n?5~P=U<{T zmZ*KJ)7evGf=KkUSQl0~g z!(_hgTYIC0C|JPeZZH@#tPJ*VgPTcbdp{#B27&DP{ErE$9_t#y3SN_kUWsFg5q`c6 z@dq+H@KNAIj9YkXC&$oE2*Iyua*RPtXuZJ&_dyIX`Rgn-o-LSAvcaop=4M!&e&F6Y zCG3@Ek9L&&QPn{LqpEK3N<0u=0enh*HvdZ{&U(w-`U^_eB9$ z&@Ut}#Y5UaQy~7uzkF=Lnb$(1=pbyj=$Wsc`CMh z#*paC@SIJpcw#y@1GB?t&m1QaA``*LpU2o*^8LWj_YNaBj!ObtOdIJp`cD*A+hFah zpuUw0<*KCIDNpGaZf}LMLHi7vtL=c~jUgt0`vd>-7>}mn5xJ7iXC9J_0BV}PD2cmJ zHnyJS4UkwLwoZ5hENw~9dH5u1YY?e6x{V${Tz8tQ6sL`PHSe)=^KJ6vT}y%NNHq5O zo%%MUG`?wQ{p%BSY8cTeQJ9nlCmM#! z-ldO2$pwAFb=Qdhe2a>F_x#wm@WP)yxheQXf%fLZ9_O^o+LSTTyKitI;@a;j3|}jp z;f0gTf`e1+(N=27r@Ppufr0$dUjg;furQ5Y`PS)=Ziv9bBI~;WEK)Q&t0>B}gAZmw zA}ckcHBy?{(zYbDOE6dxHo*BI+*Q@%JyJZcScWrSRjQ|FQAdFDK9WY}sR8jpQ>e`M zd&}=yCA}`od{I0|DhQ{EwBfJoQ7=-5ex}Q^#M~=oX9`2By{cRPwe=c#;f9a z6pB;LWpl;irKjyVTo(z`ZC6}GUwZyzSsy$5{CnmdlfV);<^G&;zkH6q(7HSunP`S( zz$RMccS@eJ-x$)5-sN%Srj7qX9q?^~s)UOhb8mQn2ltzYLT@w;M;)ayxVv0j$XmVCd@)$=V1g=G{+$bk=A&4idUV$d}WDKEJ5 zgXPhBzKK~p8-qbgJ$bLBsVb}Al!23s8R&f=WjAui#^UC>tnAKhxD8!LjOQ6=`u=s3 zn%9RP;elX>fwu~+^FhaaxF3Yk*{mN0ZP%*`GrI%mxm-Q-A8pDbp?m*yXk@#l!iCPT zk};PZtdm!{sD*z|4i&!aDZWA6zFu+Yq_v_~CHIu$eNnA)cEIxX_T8dzv-!i7!M9AW z)S`YL=?L`L>&^+zd3f7cHVd2}s2QP74^KBhWP2CntsD{6LC5+ZnWhT-g0XLWyL6wa zQpz6gkjqW$hW3m@bYj>~OiiG#*U*=14qF=0FHqN)Mjr}qfu--xntQ*rpL(m}<(Fbz zVb`37<}#hCfk^@ITkSbP5BWyk;#sM{&?qZ|M`Lm4-{%gIu*lXZk^$BA^i4N0uU{+i`kRHgUZQfDn{G~D85_}LytL`uNTivR|ZpRsk zqG~apr#@c}3SBEz$<)C5RZcJ88&d{o(Q#g+2!=X;g$UAl)6yS)iIzS68l)rAU7S9b z?%8X5(?h6+J(Z|Yj~~9`;3wT))4@cw8Yp8~dXhk6dbB?x$MH|c$S%)Vk}@jjNrkh#tUN_!DaE^Z{4iaYL`>Q%uwlLB;vA6|3^Vu+0Kh{?qjXz8 zq9eoDue&pD()XTTgqUHCSQVbV z`Yfb;3WcQrV48LJc$Ro zc9@%#3 z6?R^Q8j&m$I$1L>P@2hQ4I#SwRgZ<9vo}fc@hO0P!)Zy-;tYXZ&s{R_FfDo)beoy! zk#PVM%H>^7hH*)h%rC=sRSk7mrr<&Saro9=@1y!8imPu%P4*g@S zlD|sJSsjyWhD{iCy&8E_h1OjAnry(~z4bLZeLe%t#@$;)+E(^pqZ((V3(pPuD@El? z-`;Zb;;J+CrVB^(6v|?A)Sd^_cELNWG=(({>WhYaEWL0>CP**uu&srYSef2+V6Qm8 zIF=uKn&O?$Q?J=45dvy-D;Ih|D~)S(|0dR}K79^15n6kIXs{F6jC+o?)ex!m1-J%< zuCB&-40bVk!L4*i=0KlmOT)G{<1U@Z*)!bEkZHOE1A#+YHszrEpvS$X!t@AyM&r1{ z;9JyQEUIBAzF+k;zgd6l(`uo+C+DjYwD{48pZ%$P+xq$A(i?*m@mA*rFIMO8vE8ZJ zzU|NN*2}%T9ZlVyt4TRmT^4U8K_d>qSXUPO3Emo*6$Vq zh0Eh-3K-!%GXo3@5uf1i8x3Arw)F1>b`n&dAQs`-6XG!@X)aIF%Ld}WRu>C z6|hyvqnFr6>4hz=5BZ!v^$v%Rj1401qn=gi^X`U=M&-DimC^~7lnI&pH81#%`$a_< zt>I#~&QIy~);1dgc>SWr);03SB^AT$g0ytaub~LgQ{@61$3;YW2em>xYw>Ir<1qe^K0r$a4;&xLt;Ze(GQZ6! z@Bx<*OGn4DpG^@67%)#Cnp5&VH~&`KpF&>l-xmyDrKdbiZaK0pQAj#OEyvykp$<|h z9EL6>7ojn5Sf@S@Wkcm|gJAx9yxLhm<(|yoF3bZX1>h@dQ88s8YPCz@9^Qxe7_u6s zYX|I_mFPJNm*F@WMy+~`wR682BKJ~O3stA5ENqqWjgNI*p4OHh=rZ$_03fL5xoW z`e-h*Ri33Fw0-HCjfxZ&UAR{zKQXT{^8t(L@8VVLrFUZObJx??Qx553Ou}iivAFV# zoiRZ2-X5ub9C09MKZBNxm-A#+WP|iv7Trn=s;S^2XUp5b5w`Z*c;5j+J8X(Du)5E; z=u};iZnWk>ie7*Js6a2$DhIn_6DA&fgE2?8qztqggxODcLI;gbvtuXsk zoO7BMU6KEsx?z8>pHjwdCSJIs(j4ESVZp&*080VCcsAzw+=G3XPJdyb8BK+mAU4ir z_Va4+G=}X6PaVISCr)LK`)aHyr|C`)GdT=Jd0}c%a!flo>&e@=q7mr5ahPV0*`Nhp zsgy&DTf4jY+5;wNFr7900YpMIV?fLMAYJeQo68=M@0Z={1}V1q{n!1;6a~Zm66DEI z=uSptR3%Q%dxcmdAf#nhG}^wJvQ&MF1C9US)yP`LfXWDiy!c-hJws#bVGc8&uYgkB zdUfM~Bu4X*xF|MG%{}~K$@5WJIlp@Ongd>fk9X5wDUmnF+t{jxHy+11(@@<-@t%<$IqLoS6K%R}!$pP#ikjW>Wud zE)pMD6lXzDw;3Xao%Kk6LzKSp-oeamnuYa^@@KfNLkv8SN;1cO z=l3)_s$BU-0Cp)oq87Mu81H=!AMZ+c*HRdFr9P0r>-Wo~FbT?Y8SU(<%-=)aN>>Z zDnA39B;4kZgAM(V^PaH-nG;X83E?Ej&RPV>z)L4xzq4NcQI1-qVIRx@Vk8T>he@)D znNiS~eoB1iB;P+A9IWEtc?2r&8#jtH5^>_LpsFjDS(6;7%#GG)drM0!*4|=zL-23O zm3WnV6c_cIkEYZ9?t!D$gjO^V>>aIZm7wxf3GzI3om8C&UI1<+jjkto)S)G5)RywK z>gycVUmV3LxWS#zp4_HPA4yF(cy^lpbtDp8?NF*4t4V~AYt1b}&jI6%a@N4@f9;&WICjdJ}dYyV8eTI*Lg z_R=K_!8EXcgI6g>aoPR{bjuOh@S&G3%}%`fnS54>Lf*@My_8fN{-0W%(@W;uzjivl zIwThPxbok-nGV`g7}AZ38?R;y(5FDncbjqDCJHZRy*-&pm&_{z!t*`2h5eJ1(*XwB zu-@jCnY_6WV0|2@DF2XRP9)Z?w?VfPGzK5Jve@h5ubl*7SK?V>??yF@n_GAirHXS7Zv+X=V7(p1AKPU7Q{3bGU{ z5!06MtdAwcJB`7KKlH`MS&3`C$ysGWPyL#o83qAmzu1`5PY7Z5^ptm!_;3UfAowW34S+{7TY&L&94Xo|)GJ^s1pm~`1qse}2G4Z;8Bs3^a==SAp*!0K+e zqnDos2M1St=(ex}ARf0$(DsyeYp%(=Z8`V{j|n?FqZGin!kxS__C~F z`$s&%UG%<3JLLz7&y=RfWEaE|$20pcT|9T9o2Xv3${bT+gaIyU%c2+gnJUafZOb{l zY_}K*YOluLq+hOWz|egxbUz$4458w+9H5xqSs(4z6eDjcy}-jgn8z9` zL2`M3C|lL--!C%6W~}_rb+2pvgF4bXi#DH>X-Wt>zb|O zqP}RXGIx-1#f`1<8=D4s_{tl!leYdLa3>=jQmQM62~Y}BWmbFcb@K0klW*Mcy78}Y z$@$Lzkq&P?+PwOwY*y_WBK|hWDs)suKU#hSLtAW4~C%F0soe$lgZcOe|A07$Z zCRII4a|~x7UgQ9B^jb{|uP=&R z%p!6!S;|IX$du9E#o5=!NOHT)LhT8bzR~T7RXt_q;*HM(zV_>{b|3`rpU2ZmTPL=+ zpzCTQGA9SxOK^LykSkl{W->R1Cn^l7B<~oi66ZnN_3i1>e=R5$b?#Kv3Gf5q&+(2- z5)gH^w411($A@p_rY4xxkD6o3gar$|jmznK_yj-xFrXq3HJ)XdQ8fMrjpcyw%zK5~ zMV4`uT6yRb(ALNLQ_s|*GMr%jbHsA;<;e5a5v@YH8T0e{#LD99B zK4n`mIO3p&8}kx4^v9u7I4XcXPq4jKMHT&e(J7>9uB1H_HNNPlRN6kL`?95=&di9T z+EVQasG(B9Z+TrhaUioUI;jw5C7n?c8M`-(Fw7h!m@S(-ujoA9YG$W$G9wPVM$;lR`#$ z4;GQ_?XjE$+c&Ad`LuRXJ%4X3oz4;x%ePUEGtaN(kGJ&m%h&g@J9XW_tFO@nZR^aG zywuujmPxpX5)Se%b0$!0ZJHzi`afz;P5Z7^6(clvC>Y|~GY9^d^r-*)!+Exi>6bp- zmTHYF+luen^(@*I=5nW&-)Fo9?=YRv6=oVY4BT><)G7SxJrHfi*I)=U^MP=*u=$Ko z_o%OWO%7aA?yb93?KU+ykl9^i5qp2i6jHaO{fMOXj8k%cJHE@LQ56z5H0KmOG3JgI zKTymXoe2Zp_57{8hYE>DLdtJ;J|AhhLW@8y|8>EyqIV8mINf~jNIkt-?*MTJ{hD8F zQ^xer(y?2;0P|p-yKdGOtKqbtM40!bIboIhx^(RruEKcelgRi>5ERK9Hv}J6V_2o^ zDnUIL*RCyASH~i~Po=h~GcgQDKWlP23&Iy^&>Ez=BRr~kC0(&KOD@x5tq@^P%>Iv)`5$f%$=>tj#f&8NyX@{_v!g5EHDg&${K6>o^w2Q+QG5@AQy zjes>~tqw9S*oz(zvEL}@?k(x`pG@sA<*M6u9K*@=$_#Gje;xewTerFQrD02JJ9LAy z*OQ3Ij#_zvDQc$sqFhtQbU$awV%w1|PwCHzCCSY{+eR(YnahZC)z4~(LkbwV3$5`b zUk@MliYJwA3&Sf*jAa?Z7Xey%^`+0iT%$TWhL%<{aRx}FKdVy8z?)1b*LRQ`(-A-u zAuXM!Ir}gFGm&MlO6qPG_s7)u0`8Vcrheg^;EKL6yk%zcHpc1){2kDTlzly-;@9av z*JkL_Aj7582&A3!VzJuvv$YJ9$#e+{?WNQiLGOn^hO^o1Pb&V_*zvN&lJ~*gMH>m6 zgmnp5o}?RqTH1#!3*Oj*L~bAEKYE*z53s=!EH1=JQ7#=5$wq+*$O-3}4_4GK=R-o` zw7tKje#I_#(*E)*jL4i}n(0WlAPt}sm0{U^#v}6$pDu_84 znBmwc9a3(|teZJ*AZhFnd?~wUNKUriR>+20^FU%aQ~w%pxTqhpM8N$|^l zTm4FT{#zIHq@6&CGxrFHw+l)tT|${)3wyGY+_$gL{jOr*X%Ci~alaT7~n7 z>i|jnD0$;@$mZ8wK~=TpfOW+q$su?+Xl=x$xg?}vKkq|F%3pXHt-65mWs<%0lD(9a zlwR3~uzCT^^d^VZd?w7;LGyRXzSY*he`#EHVg~Sb20vz%BEbW#563xZZ7H09R;W#H zGf$N+S=EeK-GkC+DQBv4fR&>bGju!^+{39L*vKzyLC8zmcDfD;w{`bCyNq(^Wj?Xw z`!m&M<+hON7x0G!N;3!Qy!zMajHOM(w|Ru$+_f*89>XP&GPN+atDLca3_nuJ()*=J6%4L{oS)20DE@6#rS)CRi~H_GSjwHl>ec)-_p`mxwcZqdfImq* z+V5}kUQ@00j_}_)$nOk}RgW*~9!)}T`#`=*p8lqaWoM+MIsIENIj5M{Z*XwX9m9o| y&i@#9<3BN{vqRcu;e)^Wz6boj@#nME^UKj9N4>A|+ZX<=CI3!E8u8ZT^M3)Ak6&p3 literal 36713 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 diff --git a/mkdocs/docs/HPC/img/ood_jupyter_running.png b/mkdocs/docs/HPC/img/ood_jupyter_running.png index 31f5c8d792ef212da7c634e9f5fb1e499d287ee2..788a75597b39da14928d6a0364a239f1ca6aab46 100644 GIT binary patch literal 53980 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 SPkWCI2EzqKpxaQyg8u+W4=KI? literal 55702 zcmd43bzD@>7e9=Fw3G;lv;tB~NS8EPg+=sIN$xEc)*UM> ztXnj=_b^xV+c^6%Cvvv3vTt6>$}+rhbGEj1z|h&^Elf?xUUIVan3I} zjfjYTYZ}nr+SS_E+Qu+snv!N{_=}3<*B#AvtbFyhdV9iXhRbU19?qOlih+bBq#=G* z&hCKW8IZ2f`$21Rf_^697c`cuzMHf<-km!Z_#ev*jo)IKgR!QWng+f=xa0cV ziO9NZMt`dW56|shwKLZA?Oy807yMKvSks~}m6o@Z9KN}% z8vS^vwY9vr^#FN^M#JmTXf&Am&YfefdtrALvD#RT6$1lbVT6ZeZl(LuT15qm9h1k! zx_yfb>kcM&3-gZ^Zi{vIUwJGn7R(W&jf5~P9L$jn^Lz98_J65&tUllQZ~hhyhK41r zA^Y+r=BQ!eW@Y6BeCO<*TeUihg>_rPR#VqqSLL;+g|j2KnWeM26}P9O%WoDeaZgc9 z*3rt{jKR~+EL5Ai({cn}w=6Hg{X={};C3lz+4Rt6%@Vo%rv{M74lcZnDmfj#f_Yl79(T{9kwagZNiF z|IPTu*3-&CSI!p03B>eCQdm&rKV1K${9ifs{^H~l=KnkA-zb0M{M`jnH8)#KJI#K} zP?A?1@PAzUPkC{`Zvp>J;Q!X1VBpvF^5a#T2d@&w;;vvi$$3KkxPApZu8W929Po zS!IyIKwN*elHqm%K@fxewSGq9s+vI~D7~zIh`pzfo#UUy(64S6yh?)LTb1Z`6qm(p z1?fk+)6>N;WHgwDXtC*Zc+Q+OoswB$hn5}vqhn}E3}*_+yflQ%r0$3Q#I~WSSqg+L z1Lm2T%%- zw@9ZxwlIt`iDF*^0-RGTcX zKP#*ZCH=@Y+pgMhU*}Jg`0R-xa2RjMmXZG1uc>xij7^xa8ixNvA#a*71d58|+=;*2 ziUZ5-lF4!iw(`T7;_(te4FbVor~0v#1@T(){W|yMPJQ;g12f@%`O{+D@vVplkDhYCkfO%1Vx1mtFTD`0vMFt@g$HjVTY`@93I z^7zJrKYO+m5L=5{M68s+x6hRwGPDhfX0#M0kO*J_mwwaKr!hxMaOOPpg@^y)j?UTT zq%#W8<1RPdNNni9p;K0yp}J#LMpMWB1C~IcK;yA zMUDvZi=F1oD@A{FMuY;41z_KurBGe9ab|P1aECs`vkAycntI2Tq*?WwUgDgp#;6Tc zHIe;zJwNgG62zHyRxpcibX~O`R^AfOIIPy2P*AF}G6C9SEHW4@7BD~MsdBm&g`RCK zKm_f}uJ_?0IW=$I_B|%!&quV&^c)KeB~<3?yl$3k3_66(#QhdtLywbDWk!kG z6E!I8TzoXl^McIhs>8-{ZtT!s%Bnx9&T-ym8zDPXiNDr|;_KHbtL&EY?CN?=ZErtO zUbU@NOudNRjqpesOcU#;^WVS&6P6*m=vt1(%BX)ofY^ral9*LA?2qtjbWzM&Gm%}O zm+Es$Wk(^PBY#%U_>^z=D0S{-EH`WcOs-dn@J6)QO-7m^`{v=h-j(pc?8+Z3hMtQw z#Iq4_{~B4a$dA}X)TT;9k&40TI)RCMR^FiF{`EopezYW7K2~_{!EUcHTvB@%Tz*Fh z2cWC1t({hjAj4jXkAzeV-#{I!!W{A1vpGzmv}eU4TUh_EwS}#4UaPYB@_#u%5iqX58Jy?ei+hOg``)!cDTM5u!~L26gk}fT~DL5zJ%r$9ikpD9|1|-gLL*& zZd@S3P618!LD$SzcADSzG z*fgn5rT3@VY%%sEyNOvcx(@f<8P+t|*u~3E4(R>X52OMFTztx5^;kqSbuUm(t_}w@bg9c3&m4jgCJE`Kdz!ZJ;;fF)CS=CY*R8(rB| zB)Mk~d^mIpJ}A*Dw+r8Qt8}KHCBbiSzu<#=`Of0Sna`4vD_joQkAKi|7#@O(ft`>< zAfaBbd$@Np_S<{=8lZ&k_wx@&JqeB7cW|zGzX$wip!u064TNq+01b;8yh~y7<)bfg z7fi~@2X0&~_J26}h+VfP8reKQdB|%9FLdP-L<*WVWW8Wwx9jm~+`1 z44MIOR-1GYo*9Q>H`0*|4O8P}nHvb~lW>r;91P4Y%gBl7)MsAQ&$bNvsEIoFds0e* zi;>y`E*oojl=?!w^V0eGgmLA2zB#}i+p~+$H)mVJIVg6#$Q6A?NeLdmfY$Dzog*!T z=$zw@5hCe27P&_H*xCQM{MrW9Vu;)MoQBUS&BpV1Yx3fBkq|Wmr%&_o#TeakyYxaW zwld`pK?qyd}RMoHZYG+V3@G@9eCK?=_99-b@|-c*@t+C~>r);oqzg8(#Eb7rqkU>z4#S z88KGHpM@k)E+V|D+$*P(xqq=( z-!FM~*gA~Z;DuibYP&9C`#McF?WFGT#&a1ZGuJ}w7Dg( zm!8ZU5)0ZDdTUB7Ie`;HVCt`;mbOoIHDp8c`=7R3 zMfpmJYAu#j(eS;X4y)ryTE8=ys=wqPF#Fujc7DFH@JA7JFMZ)=eX}t<+ibXjQTjx0 zXY%WY|2{JEG|FTf`RSU^JAww^BVvaf;ke}>YcWEl=68}wuPqIC&T&LmN@m`9DRpxzRL1~ z3Aq+HKZXP?UaZf2eFF(HLFOO-ECbV`?l~bwi8P$@RNEMhXTYlH#$4@>J&DyO*4RFq1uW zn3hL-v)Qh9E<8a5OJii|9vsmXEX0$1H!H(>tZZ~NJX_s*?^`U9cC{4D? zR7ooOjcq)N$Ini0wnJ{%D9^$fe^t5naSl)f(K6p|wy1&JJYrp-?Vt%Iq86K@^W9LF zqD5DG)Z8EH7Z?jSITQXR7f|LFZ5TH;=qlxUA?sgLBR?545lB_s)Q z25W3eAoGLTvPEUi-I~w2)R|b70*^b0)y|z-p_6^r486an8lQ#97;@#Sc`ct5+ii3? z@*1bm7-fhyh2Ffns9r0}+`)M;CVVgU>HI4F$mOv`tFur%0OPlP5hx!0aW2873gPX} zT6A?emeh^995f2BOWvWwm<`xQ9TGRjT!_=ud_7OM-}Z5%IEf7ec6*O*eK6I;P^qD^ey+0REJ zzH)cp7Y%b}oh4@)FSoV#8QOJDQhvwha#8_u$gGdHXucUMc}#yy$&$BIV*;yP$<%Rq zzk>)@-Q%VOp9EWkivl` zT0m`nvs(UUUA%16SH!sC-o+98N8>q%NPMv0@*b19=jzwsC!D%v#R9u+QF~{jxF=N_ z-6C;6*>;wiEe;ez7#UtQIi__roRRiWF$G>ioJXg-~H2%5(?)hg4GNi~gaE z%Zw}snh(_*b6IQ+6J^G;d*U0`!*}+d2r*DefxbYu0!@B6`B>b+)nla*?h3~Yv!Ft>|9_#@UH~7jYqT8Gwha<=MIFT*PPeRo@4s>ff)n4bb<7Vw98ych*P5&2{h0&6=LBt# zu7qdOCsvK3lh}^sPMB^py?Ko1n}d=_{pvV(uEM%CDzP!Y%}jkhWIz8k)XJ*t7~VMd z<2#9mTnI@^<-2Jz=10McT+v?(j3C?FaGMSlEqHs2i|o#WRIaM><2;OCICl@t%V`3j z=zdG3oeUp=vWB9Q80y>;mh!j;Ts}B?IqdebQpsGa&|NPe5m{HUaAY1z za-mT7XiAt;eY|l^TQXsb6$v$b&`m2rby>hj_Msc+E^n>Tj%xX$em~Wu5y{S81MONE zIgdX&FTDJ~k48@8M8U@%?C&gm`Y1s5JVA2u{Kg5+Xacoo@ zhD(tTjKL-75?45Xq+RcAM0u7BWQ7}-e=1s`kty|MM9OqE%Vxe%>IOMXb_P_v&J>vj zk8M`U$HaoD;BKG$zbh3oAoB8uYIcmeiD@o2*y!_;zwSPvYNhh*#aS&<4=y#!x@VkJ zbp<7r(zgd6VvE@gcUWA-x=jNXUCco4DTluZds}vHr5+pNq##?2nDDn5Uc1iK9>P9- zbO{{rllG0r+uv9WI5c-WXjrORbKtSRK~(zCv(FUFL#i&$BcCKOfhG?l{aZ`8qhSX1# zzZu6g857>8m705%I&g75;b!u_;aKtJ6biq1K|5%KZwlk_+gyo7>FXgoB|GrCBKcXT zQ}>h!34$hv<&4j(yN6ti_3pAO7%YJDa*o5lMhw5%Bxp>9sUkuVAIzq$y03)J)&{G~ zKGlJZ7pZRuPNUkcjf8D#h^li~*gJ?_D--ta+g7^7;wStHeZsI*qd@ijs(?T|uG?_x zh|A_G2k9Pqnb^V{;k@k=E|prF>p$3(&1<;ty><(_ab@6G;Rpuil+<5)_#AfV=BI4?Ih~5K*`m6I2U&6P5IlGTb5(+uHl6l0UGwv_f&ZvH|+#UHgo#>rLiVp z$+o)YmuZH+y|L!WL*PzQno;5Pq<+cWQ1U=@{BX@0 z>hiYq?L}sl_2|aN!O|rjJ;Q_|{Bs)ME2A-$*x8&7-~!;XmvEp4RdwA0CeEKSWj^Q- zQ#iM5=5k%RIfyom_{PwaMlb091(}vm1&CJM9&@v&za6faBuZVn@I$Af~@Ya^ik(U|g-0B?3)@)XI;xMJhQE)evoantGsOk%LR3|M*DM`7S;mzmd zXIfqKC~P!zi~!(t&sCMW|NK1-fItkE(Gb`MdJUAtD$%Yg4j|59mCC35S3Jx5?k3Gs z{`R4BRsm5V=-X+2?q%yzXq(UeMLlX?-N|7$1vPtG*iU)zElO9UJBE2?G-heRK4ad< zQ*UUn;THVbLCyc9ly-NvFgBpKrOXA`VoXG~Fq%N?8;B(FE&PTN_$=Y-w<9{OC}pqZ(gCS(I=<#u6kpb1#k3=Qa_i&AlIoPcwTa6zNo2 zFFgUIX5XMqfaVeIvBV!8fkUI=tf9}()rnPV_goxQ42!bG3=Xx2y?#)Mg&wX^)T!b4 zZP_3fK*O8nQq~9G{bD`x97B*wM4(8iUnjo|;+hURP!7bDM}5Qt!l_@ryiVuKmNMqd z4n7U1seGgxN)PFl^qe8KeCiv2FrGrBKV_Nf9&E`I84XbQ&Ss*0+^DQqE?uhIpkUYZ zamI4OFOE4==W>7NgImb`9KU^e|HN)?9|jgp@U)!`pzq+lTl9vM%S#w$nU##VoxfW& zo|#@)Vb-eIQ48KyhjKtM@rXC&`@xj{!m^H=>C_CZcKym%!f# zcdbi7?WzL~tRXd%S2CV&Z7B7g9nJ@Ct*28Y~F?0W=nDc#g6~>pk>h$1I?-&dCnrF@SWU-BqxQ~Hq z0FMx74ybV3N8K7oHL1V3GXPS>y}Y9G>j)wY?Qx$4I*C~}O*CBQ8K>3H&AW1c*;lw9 zkzAbNlZzcFixUH-wOsE90Ecm;{1IBB6!N1l>)m+!rfzW?JbpNs4T1NMJ>(1#D>JU? z>J+LtrJeh6Z&@D<);l4wUNc(8$=(~PX?q((L*TK2RPC|A?Tt#Y|0QZ^_=M`EQ2TMh z!qs|MW6Ysr5muHoVSKGee=Ka*pz%Jl?RVP%-=L4g^T+UpercSmjtC$6IHioa zaPAdSW@ZKjrB*g1cI3Eg?k(L0nzQhoo@MHe^Srgk=7%o{8V;N#S48Q}d%eZq_R8F{ z(;RH%AZvDu5Q+A>H*-(clf?VwS&Jt#@M#yX+q_w{Rt7!kms;crbO`A>;GXA$2*@LU zf$SdY9Jmmft#VXyYI|;bS=Gp0!dUKpml2(Fb=4?wGs17|d3oCvfXE3a!p!dp&)QQf zEN96%b>ih?DZAVjGZN4oD*Zh`=&HLiou0Y( zwHMN2V1rwWx^LO5U5S+*VUJu1+5Ocn|FbHr?$M=rgp(5)HjSX9VyS#LB-A5vfo809 zpYr(4rm3%Wuu#S+yz%2tWxB>0Z%N+*bSYyGjP@`Xy}TiQk2pZ--RQvekAF{$8_0gK zSQZjWhn0a}ehvzyX?qgb`e;2&^oWMaA4hh|T=NSL3juT0y_Kw&52Vjl=>1VBp>E2E z<_BlG_)sIu$*Qjp{h?L-MuiGpGmevmi8+8Br=~D}^Xs|AN0$X{DXVnO>U7{Ka31)( zCC??n)=7)Z#o#I3rRb8Ycr7#G%Cw;)JDHlEfsiigK9RXu1HtUF6csHm8JTIBp$)*D z>ZS7|nPi#ib8y#grr)BxcC}@st}rbv_&X6KtAtWb_22`^`omKN(!L1B*F()HnH>G& zFMe@Ii_y)>EL3Z!_J~(bQ0u$NFDgGd17Ug3O*YfAfIZYV%FO{w}ibw+P@Ap~`XhCCWgkQ0y z*X9wHuVu!Qek}F-vP8VMP~$dQk+Wp}*%`EAr|W-VF?mUBP7+WlWj)O7cU?uf5#P%H z%5F4#!G8eY|7%wf(S}~2;2>imAz6CFuo?}l2X>d=#N&hzko752J))C{e!_Mb#(+CX zM|_K=pOK04G0qzGYUEVVah=*JWT>qEtZE=h`pGdB7Tw!u*Rm5(H?-)uba&7 zyFSjj+K=!Wj`ds6SE_PBj`j_NoaxB}88a9;l!5|nwnQj*q!wZ*GFnWX2J8nJZ22B^ z8N}UDJs93Fk7nxbQz745cSS@TFhsMbR;&tLd!K_PfwseY8zS`q%ay?`hVOcHoIVSF z3+%m$h-bszS#N(^>E6eq@QZb$^NCzxs`A%%n+z9Hm?D+pr`V-kh1#Et4E;}pcnX^u zPFysWS|i>JRY=ODzKoV_I0&F`9+(lZwa;gXJDhwtDfuiY5=p!$oqE#PS5>;x5%3Ku zER-gpi`y0*W*P4BA8%ad{o+%Z4Z-B=^>$cepyww7#>L$0vxx%7p+N|#leolElpG7s zI-T0+1efUdPrPH-3cRXOhmBXNBqDA5)}9aFm6}>IZSzEMs*0rJ-D942-CMgPeY}yK z1wQT$)rnl}%`%hDb zZhyPXL&=7Z%~(Stf|!U(6qUIRsbBO($EM-pHUux5Cj`d?|NG?`!XLKt9&)(WFdDEm zf{ETFYYXwq&!#=!WV&8B;2`Cr*xHod#0tu|%WVG84+F?ULu#5jUly>S=aWDM!@yQc$Mc zpq&qPb;_~dyJRf`5PB~{HQa~~F`9L}T7|?{s@%1xJiag1k;5Nyr(2%t5acL^vS9K( z<4?U2Kql$pA;TG)hQtuBha)YXt}sn9Ww+6&!C5qS<#{;u6kC==KTt%x&O~I-Dx|z5 z?79MGqMF_;95^&%?D}R8&fP&d$yiEinORh#)+|0ul-g4+l(y=-;4&j{(|mZ%>oA84 z=n;N+F9~O)u`SG%py5Imq9AVUJE2rXY!l)QK>ATS;hwlT5?JBZajqpK@tg~XC?4PG zIvo&r*u~Jb`>N(QI^+!}u3Uggg21~hXm5JXpuB9|iji_nuJvzH$iu zx4zyF;+}In=vnD=Z>rleUq(aH6R%uw!@6q0*NLJ-qY5?|jJUm=Sr#vA9YtpkO9!qH zR!BoGClX+0mVw6+T)G1K<;}^{E1+A}!Bfk4j}uvw^D7Gap&pm_Un$mHH%>_0&QvFk zJ(+QCowf8cL>6rOJl&?hAd)TmKK!xBw8LL>Q+fU2;q=$^LX-I8Y;PK}LDKl|Q~sA| z!k8uXd(xD0sD9W_CeLR}qCZ8_xsIl(je}f|aT@P~27O-@)PIP5uw*RHcD)qFz zozA!T6JHW1MV9YPdqbMlK!q0ZR@YdcUv#@qCB?}VJei-pB8{%k@v|s>)&8BOu}WQh zHC61@1+B$Y1kcO6hGRPqCJu*)u~#xY56rlPoY-;e-=&Z5HQGcFhd8_EWa4C3=*)*2 zvdnPn?2jNxv!-cM7X==%YXyFls0kzUgz>F z?d0RVHl~qc6=qO5tAnE?w{(V4k&Pv9j@>;^vY>>`^U-IrVxC=;E88--GI@{!eTCVU zk01-S9Wj9Rxr|z!(Uo_|xHu*LbnAHhCISOHzi9(GNzHHO2Q>j3)JgVk5Xml$2bf)g%WB@ zWx}0E*bq7B?AYv@sby5FmgjM3l@9o@qFTGC+5h&m<*g(9+XVAT(O~+PM6x3=+^Y2w zpYk*mvu^F&zIg0DTjO?m+uopmUf1P%$i2+H37cOl_WpD9g`VoUnfILqQVugig<930 zE5KAKDqGRSQ0=9WukR>iMyAB*lLl=W3HjlIPwd6Ob0yD<6BY~oX>*ez&*g=lWbztT zj;tMyMuf*ukQ{m(y;zup`Ok*0FBvgLF|H5$>^0P%J0=WvgTq$(8A(VSdgW-=8pFtp z6f<$U@(V0_6XHW0NmaP!h$3H8cTe2`Zn?`i~VlQmv@glx^!8npO71Ui{*!1%e&4UqF&obYAtePi3-Y7(+R7D zi~=m~HFguznkh$m_R$)*<%f~Yo6bMjjhJZ64FEJjs8q?#L+XPA3KOaI@Sn-Dk$zKD zbG7KSM2p{c*X~t_XxX4!=OhmdAivcvj@xGT`j(KC<-eXSb9g+3+m{;UZX={L3j^GH zjzxpDEtM<1?T6Q+RF=PkMrfJ^>f(@&z|A5Z6x^1+QIVYILEyV0dm#P1##p!B>Qa=v z-}{+Gcrcckb;N<3adAL5={6fg?sl{-^OF?%*G?~bey`B{%8@axrV*7{Z_2~98n{a? z^YGB6fXtHI=$%wLyxy@zrBCTY!0lia*SU0I`p$y;?WU|7k~QU3{bA`QW6IJqhG_@# zk<~#Y+IoM3_61ViqEkO^QO*l}F`bl7Z6U_ldUtDw)a=Oy?sN%3rPqvn6islR=w9tD z$3X0-eUR3~a@pTT|F^^@c^99#53};#_kq}{PVP^r*^9e^+3)41yZAMU{(;kDdh-s0 z5e!u*BKjwy&~)WDGErQ1{2vfUhTEYm7^K@f_n9~UAKm1|R*+`f=r^l>c7@?~I`bO_ z^@-d)?)2FjJF>q?=eMK+1E>Ref%hJsM?8S(np)2M3D3mnmQV3T9w(4fEAdZc9|k&- z_FhgeFy8jg9}>sZ+4J~TWc5ImrpiB?^2QV+RcwVqqTeR-_rw6a`=pPr`>nt~k&iC| zG2*76N*DaQQvcQL0SrvA|FQD;lRt5V47ag=>*4>89ZBLoc!>T<6bpyvT#GoutjY|K z00|jd?WVi0QrWF$>upWdOd52WGQMX1C25C;w>bjntu&k)N2(ukRwC-`g_LP-h{U+m z3!{_E^+rFMo7N5N{VMk)2b;cJ!3 z;fWBV<5_uwV}^!|op-dk>$uCdr)wxZ`b`ImU;U*KK1D2P!Q2h(a$iKV~Mj?F!~%ZroMyzsElk^T@ud*Q7J>@XdX* z*cbFSlcik0-g!j)&k)d>w>6w$yow*SzOqR}s#r(xX5J>Vi?|vr{L&v|QD2W(;Y8IAqFl7?+e&Za6$~p|JRIvXD&!|;R~;2osVv5MraLL zKt#IMDbm@X`!G~#0QzR4+(^u4Em_ArL>GkGtw&w71>!B8#y3b|*5b}v>y4-yFs-{IV z!oUPJ5VoeA#8dJX)|2^7zFl7I53FtAvcl&cpE+_?)f1U#?->So>w_kBUOjQZG z{CXjky}O>_9BYtqgDCARLBQ0yrjotCUS1n+LN#7<|!MmZ4b#Rh=3t*5b7A znVSRH=7a5w`paE*?e$9%{P?{gM#wIg)Sf3ro*wlW5gA;H!sz+CVL&vrzQn@ES!?+I ze0e-kM(q#UQB#9DP>aW6Rb*YcN$0~dT?+$&a_dQ$;GA~p^z&gC4z22tjYj2+8PMg* z9mlcS&X;i&zUc`QrJ$!YVnExUeEN)kJXg?9Zp-gIGpMnSA)?}8IHL#jWe41N0eT(@ zIXNu)qssiy*T{)N6&g6Amo?|aK~{H}RPnJHMvG}#0XG*DWd=eyN+CbwA)O@780CE) z|EAHsJz3#gW>A0DFSNdPn!_@CC+Eh@Glj%jevOw#z@tj#6O?nYaI(~J!cL3ZMh7lB zAW6g9akitmcsAbzTP(Di?>k$d@R@Epod)ed^P3qu2+lT23;b`UozX|#)kepkCO&&( zLoW|v1?{$(c2M(oXUiOE#oo<^UF`W-X#Xr^B-e3ahK6agQgoIhHx@TJ$F+H92ZvCSF@u(u5m*s#4 zXn?nSDhs?|o39Xav?B^ayvtXNgGl;ada6$}0&PrKb7Lc;cQ1yMS}s?f0OS2Y(`~z> zXK71BOeaIHa_v(&`^iRiK>d@$dLeK$P2QE_N*=QAjfeS zZRHmITt<}D@WW2DjiN3ar?%#m>Q_wkv_Ct-bT+RV_q@S2TrL%vIl~hwxxs;uK#?pk;rW`^Z2U4SG zM040qTW4WmP|eqWur0CR+#Hh)%eBFbR<6>QWgoPmue?yMbA~>s)MubQ$+8xgRnM>W zi_Ts-%qj0O6a?6(Y<=o#r(*}X9qnf+07P}29H+G?7rN8`Ve%`j$k-OkTaq0QkSa(~ z3Dx?yS|wekrH}b%9tMn~_b*1^voj(!7RR4@I0KoGNdk6bJ#qWy(Uj=$$8Jj5%=&e9 z$vFUeul3uuCsh<2+UH2tY|nP?hF`bsr>hH)pNVKi$I9V1-agl-lh>Ddo?e}JHS{-W zI}+AHwDZr_xDW4LOFG8aebso@ZE(84Hamk?+afx_U*wEPu@IYWbv;I$Ap`1}q0ccJ z9db?lV~%zG1neO5Cud4<+LdM=8GNgAYXt!se zs;0|U1~pDCemtI^h`CDjbE9L@s(bp9*tc4o64$xv7YjLSBY~+XLFb)jR{(L^yJ&kc zpB(KGyKDCy@8n%`)@5Tlo?hc~|DaPh!h;3B=k84==ni_IAcEYiJ>;*Pym#HMy&ci*HkP;4yr@lgIy8nRPADZahg696u0 zvJv8#%(MFGNLKc>*+Qpe#&KV+|9OidUX*` z%COn9YTjqR#ou=-!x^@<@$xR8?awFqhErigL9O|)cxFZY&JPs3pM&ooc{n2ad!YjL z5;K#B*Mpd!1P7B{aBuS0-Y4N!h zTqHN7r;Qn$M8h9uLkLCXkDMhRJ4yJ?+@EN%*Vs7yWJ?L>nNpprYn=DLg1`pSsFkmL zJk3h=cG=eugUXWg!W}ZIwY@yB4<6Yz59H(b@*I}1# zbZUCVE5=*mR=uU}<96DpRSoiTYp7nFcxFl}k(o{t$kE_vR|s$C1Gj_Q4lTrKi!8%+ z*l45^J+)=d+NUbA_5gKtJbazT&&Qg=Z8Q_d73>m6CsFz;nH{qMM{1w3zpt;F+o)-( z+De4hKRYlCd-%~(3~u!&0sEPnVac6T8=0i6)w|TWQ6cxNnWhy_KZxL|Xxpqk`Ki0p ztor2SohE;`Y}(rTN?9a1zh?!m1_H|Gyp0CljLww%`85n0G|j}pWd_WiW@Qk?)QpAh zlTJ_ykfr#FxD}3jP_tA?s~R4vMXcIUwx92Pem1h~)I4ntk1H|4wQ$~e_C=K}-1oWr zCjw;zA~9y}@P^H2DaZ)XjIOOZ&Y@kc2Q1C}*f}Uebkeg-8E!0<=)+!Td#6j6nw8Kl zmbw*Oxz`yg__MSrS3A$PWXHFvk{>GfIthphUVFdbxdua0qwn-uo5 zH(hJdZ0gn>{+80)Y^qj5P`3O;y1KL7*;!if+)~Z61d_YV1Qr#>Ee;qz40#+;W?#`V zA$hsUj2>>slo%NjKYk6rSxrGx+*`or@vA*>-DeSgiiOqE&Rz*G!4 zR`}A3s@=O2tSXEt$eryARqCvyh-(Y$7pAlCSB|YI~ z*}`pP$tI$|Q16mEK}|h!(?;N@Ag+WT!RW8MaP&Oki^aO>S#_7rgJx{LB`;RH?TP$h~@E7You&QcL$t zZZh{1tt(+s%Eju;Lbi%Ug#x~Pm#mpC!c$hla_?2rY6kGiY!~uJCu2gHzI=35A2(!M zsn)Xh6Z}5u|7o@RgVBn(RzwEtWlT-W{Q2_)GgDk{L;*cZ)0ao~F(k@&@y-01ji^?_ z%WpucN?9#nd-}ff!^$oH0nFh3G9)$j6wmBBbokmXKu(5IPoeng(@=)Tmh^5JoLqS{ z>)?`8s14V+&RHa-<~c8 zY{*k**O0+uFcvUx`_u>)VI>=`OI;6VhwhsdWY#9ENu+ylCY|3Q2BoI$Kc5#0G1v5#jX8S$Il|_Z@Cf;1l9%8?{*JCe zdP~~vy@c8UDKGhrD3dBaExQ5_+;Fh1rN(;M)MsGaj~6FT_`CEO1&{d2Oc>rCV9683 zk!EvdkJR~ks76@m#=SA9V(GWBBkWITA>UIn8aZfjD^R{HjjefD5iKzs4f^Q8>si0N zV=idiGbo;=ba64SJNM)HJGQx~}nZ$ME#aX?NhkPlx;{2UC=M z4o^aD3fn?J3E#+~7Q?P5vA(IAOWJ)JoSueM~2^l*N?gjktDv&%moe(~8F*q935!@M(e2LU3bds^J63)g&*M&2#$H*b){lk8ZT|#rKvX5DfW=6M7Jmcv# z1efM&N(W1v^(TU`1rPI%{Y07_aht5*H_P4eb-v5C{ra^%g(ppY6>3_NYWZ&mO0$F} zA(v;}4+;`0==g0u*OiTrk?i0wqNOqp@Qk&fNj~*9C;7S=4N~;FdSH^~h2p?tE z{^SP8MM=h?+-^E!u-PZSOfMccYG8B0rLj9r1LgF1h4Jiy{(8M*uo_o1c$$dJ#9p5= z8jxn27qn8K#`;rPzpH3z7Jq+r){5!r>PvrG0ArvcUMg|WX*0D>9-sM+{?Kstv6*zsBsj?0xz6fmTEY-_ZElk9=k`3?|XgYy1dfh*b33E z^Ft!3X=)x03s6W0h#9Jh`fN-yMKLiEFk-?jfn_e!4=J0`*=1C`1C#QfuG0PJ zs+(-Gt)7sW1(e)ej;_O|z`=fl-lcKL?$l!(j?gSE#Mtx%mmVS^*w;)MhMq|6JnjNc z*gf|D!gaAnqpam0O#7e)yAQUh+M^feYcG5A$)bQ=6Vy~{$txyrr>ai=;$xXX<3Lkw zvHh^|SlL%_#r0qQ_Y3{If`TaX8XvUHntrWPBY=;0XcuMJ=Z5|4g)mdf=7r_qX_D=a zA4RY@lWYgr=e3m`^|MY-Ci&-T-85!`hzh+uvwj+DDb76WcS4;ZSX;`_+G2pT_UobW zPydSnRNCSW_$`U-+qN?&4^%(ot_{uc&2;d{O)X;Xl35dvDrM0AafJQNMip`t9pK36`HQ zgu=*T$^Yu>zlvkS!o*r{x4u>XC!yy#hVYtP%kS^@{X72#>vs_LeL)`PMDTD3^MQ(g ze+%HRa&H`Plh~H%PU>J&&o@j)KA!Ge$(BW3>OSfF@TuX9^^Xxl&G4pB)ySaU-0Gg) zTZ+KersR@R_d$I#NYBF4z7K?Tpg-fY>C8V?3k@8ui<2S#o%sA4OYx3(Z*>#L9)#Gd zXVB3ZjeW0^`lBa3Sb_Kkj*eXPUhRbozWG*MY0lGndemP%`b+cVwtgVFoiTh}#;-9h=#>k_I@GlSP-!D#6elpAk z_2`2-`#;))87@eICqQsRxr3?a+D6s`>S>uRh1(zgY#w1YN`zSw>{YqTDG z#GzH3gjTD0rL1MsbQxu~9ER z9U;=GFy6IkOd->g78%G88divTWR=;Ci94Z&wQ3je$XVoUj$hZm8({)1ps$YAP%Cj# zS0eV4)@^!npwyCd20jbtVD{iSmB*#;U3## zy?ZUl1zjAkgI{f+l^CI!OcCIfw{DGJnZC%d$@#(m!`@p*MY*-{--@7v)DY4jLw9#~ zh&0mO-7&Pl&_g4kgp{Bl4T20H-5?@e(jeU+_1>K4Ip=uJ^RD;r_qWz>Etk$>WMc*8M#cxJWnKo!?Rk9r>4BVBrxxUueY6R_26;xdwmKhm+8hm z+NaX!-9o$dR4Prcf5)-%$uEzz3c1&Fd&xyEi&9n(nSMx1ow7D=C(RWqra4R~411B? zI!p)*?oQX17<*kEbgzH9kS%XK8WOq=%zVkdLD2JUjViG*K(EPB)goU{G}O>&L`Ry zSVWxEm%x-C9^GCp+~T}gPb>V8ENLM0ox|nFmr1b+O-lDX_RE9rr^BKbE6LXfvu^z? zKGABAJX@oe_a@4Xvrk4c;zfV;r1=0LP-S{|*)K0tL@zoB6l+EGCVri4U5l!SoP6Il zZ4bA^B4q!PV>}&P*bdQqnxiPnm#Gog>Vt9}RF8=%xbfD3uI!4Il#Vnr%{Mftul^0? z&F3Y-c6=7SlW=hcg8!B zc)SWcA+%@cb26qq7?th6mC0?JbjG=O@Lr=R?he0RJTv^6k74Y85Qat7zWma97eMel zr!z$=Pg_JxO`y=5z1y4NO!g`ORS$Yi+tLZGrf3{~7X!KtRLp}>w98Nq1krj#mqTQ;}n{EvOG=kXOmwNqTLW-giM9&uw+SES+iE233Hv=La{4 zMcd8~FG{R-tzKf$eKczNoMTOdk0{HGu{gO1`D5empSM%_81cj?PGkbF?`m?L$V32Z zpdbehPB~ME2;%J^&6=lCOoir3nznrb6A!stcrOHe z+No&AY;J#}F}hF=AMPtxE^>%v=jph&6s^i9iFL%)F$ye_AN`{oUfGoH*^d?=3qaz# zI@~zjZue0{=Y_LG6Ig>s*9gh1W&I@O zNi0D*F~p|MIf1`yJ=C%{iMXuJFDx#l3p{pbr*c{-U|7QY;%u}>ns^xsFX*-_W7wJ} z>H9B!%;HM+cpzMr455o*fvz@EH3Q^++oo6LdbNzX^iq>l+3b=JILaiXeSu!rHR8zR z*O}%P_E;og+B#y#miVAx0^#bNfEx=iMahFK>$nvxFuhQe@K( zbaRcSUsBNdzak+T;@Xt)zv3a9)B2|_fT#in{9)-0o$i=>m{g3!c@benF$eN+_gwS- zI$$k*Rso09n-fujAm4!A%3hcskgNi}At9(ij0gjGt|WVd3-b&BgAm^6&Z>c)N&6u? zo5xF2=IG;vX+}R~G;3lMw_vHyr)pMiY-g7cN)2f@&{3+}@rO+B)a z?f9+@4ASlKVmE{f(rje{w}c@=H-fU;w0bI+;4>PlK$64>L?^sfsG$) z)(~6iDnZnfw$Gkh_=?esU3RNXeft9q9GaplI3q7VvA)6{Pwm^^P~}^4SDij!C%8+BL~gr?z<8~eM6k8%-2+^k7J+tw%&=kL)-no_W5;q= zty~heG!djR>XZa3J8aD_+xB=lc@5^7Dfg4kfZqbzVNNv61f#AZBj>z1c#Fe35c`0T zsubIn^S2T%SV`)wyfl$gQK+&`o+9s}(Dy}`eS8Y9iVc2h$*& z(g@q2bfKnayL09*60*r?3j(mn+4@Xjg{ClE$_{V_RJv`Fd%P0vj>98(Sd$YZ>^8!^ z5xJ&$S&%#|01APB#%4ASx~?rRVfPGo>9-L=Rg~Fqv~x%0E>%dT4MdQ2hw)Q8q-+ra zx4vmn9o%oe=Zg`SN9_VjR!HVg3=b1i9P&Lmlp32obqNHlTd9cqU`IDVK}M8YO=#Js zQ>Pl|T?Xm0Cij{&4RoMd$6Oo|%MdyEDqCK;QTK;q?9WU%2}P2j?c4WaSBASX%?8j# z-81zon8B1SCP(F9N7%O#(#fvl-p5B+L76vxBrRpt>=Hs^s9%6a11WdI@RoFdxKEdy zUHmAXP&sT74n@u8nC_WmmSm9<8QIA*OH>sQ){T4)lSOdEMYBt_vE(n;(-V9vt~QP% zLo**Lj^~B+fFnGHP$S@agu@YMoWemdJE7g2pt%j+R`*ngoEeAeSd}g19y|UB*p%sZ zKD+1AoW#q74I0Ab=6xhbyHJwcJebMD7+(U7k61JNLq{$0pCvcUL5eh`c=!Sp4 z#E%QJ=fq}jfZbCpux?oys7HVY@%^DmStscP7g{^mgxQGsDcaqp+P?@v0tXTemzG9! z^nN%>{G;W@{pLaUq=eNiDwrUYIMI+`Cm{MX$vMJ>@UVeU;Y=baLP~B> z^~!}xBnGkp;$VPL5|cqui2msfwjDL}$9Zpaq&2cL-qL*)2vTGL161M;f>SjbP4dD= z+O|RsgRW1E*z3Qq--xuV*B4IH8BEa)%Thg{9(JcnNp{tVYCE3{`XFd1=)IRHX~T{Q z#vuA|1}lj&lzaCHZ-;9;PKGc*qHmz(2lY!R zE54K|{7@sR#)*PID=MJ05)TLAWfY;S;F5DDIkE3X#|g>Ooxr((V6Q(b<7KPf%2Pr>xZNon>;vlDM5ws;)Oo5?O+MLr- z8G;i_3_h{v)NK|5IMs*asd6uS81P_KOdZkQ) z6JI4_3gQcUA7Fiu?HRdGmlC^z2W8Lb29spQTXfZ3>?AL@lXMXB3!V^~g&rjhsE;YA zqa%|~D6j}gu$%o`Qe(COuO$O}F(v*{jh0VhojU5~u6+z*g#R;A1_^ zVJ1g&1FgJeg<8?Tp#83;@?}+4G0fcO$5~r=Y(#th@6=<1;7%l2T_yb|%5Fq$mQrnR zY>1S8SDe&z>{dhK_WC9E!Q4Yu*p|Im688Vr=Ra~3-?HbG_H?COyH|c#{dfZwMkFvjjnnEoVC-L#$BH%x2 z;LE$aQ|~q>KUn>CfB7SS$}0e#IU33*|AlLR=2S31*?^M@M=M_p{(HO$NdVw^Ce8R) zs`>N5n>fIt_|ClK_3t$4ZtN5^0N_c9)clk4|Mhuz$$%%6y0v(IpVGUri$4QM2Ltx| z|BU{(za0dDC*H(;wELHP5*(ZY`0~^#)&Kece?FM>0G{9_(;s90Ej#`(WCp;nS14WZ z?;lhCe_asztSae;kC}C=I@Si?q}9B;10_4twT^288Cqoq0`}jF)xK3_7;pf31+d^K zWiu+KGTUO1@YVqMWKGxTI~OkP^ZiB#po|-Ncjd6!_ey4nwT6y~ssH>Az39}m3c*e1 z0FBOM_*tH{0b^P<1+9LbfX&E3=`}aQu@fLMo%>T+ssV|B|2gg)LqJ92-SdN;C9Z!Q ztw>Lf99o_|6U%OTstgodc+C7B{bItHCOxCf})IwS4~>o8|xTkEWA{ zjxr|MZhZ`=fG*bu$OE6wt+W0<;4GR9#S*n?xjIyAlWP1Cg607Duzbc115U=gRubiW zgZ+SanT&WExG~}G{?>Xp`_7}a#$cRIju6wNA=5IJPJ!@U!y_u8Oc};WOY&GGJdFU}|H& z1nR$1v(D)EuMslkatV+)uX&$!!U#Z!pKn@c`*fjI%{Te!16O5d&U>L2n70Mv7+}x= zrT(V0cT#S`&^v1}U=Rl2A;0nF06&0re$gcRYgOrU2VX5Oal))V&3RRKKMk6_UFJZ= zPhEVW^V#D)1}Xp7a14?)?Ur9ZON_uHo88qFqsl^4t&g5MK*O>DMR_?KbhDgh7Yd+khOeet;$XwOk08NJjujnR+WMoXt3kHLj-WBZ}5vX&Y5Oe!_TO)pC8R z@9^g4`cfY#0t1?$+(v#owUdIvvdn%*gM2&b=5Ys>`wj!?9PNHH0G-mF0YU|i>CHav z*@jAYUL~|$5$en(3GN>nI%WP*>9wQRLUwYtGcz$Ha%Rw?^vP)su^x4Jusx{~xH@I^ ztw3Sk4@Db6#@2FGwXoL5RBlmg4UY(4J&>iRG)lX@Y`Nu{Zl3d+nF_kSG!DJZ3A!ON z7UsPLSj4ZRF5VjF*?QMXPr#(bJ4CRvI15~ateZ)OePAk}T9s{1A@vl1`bG^w%nz0Wl zP7;{e0~*|P?BQOu_3$aAn)H@;#$h>(XsHy4{N`322!Yzp9PGt^P?+EQ7mOHs;8{UcDUb(l# z37#WdacL$ejDs9=1IJA>BVt%T_oz^fKLuQpL70P6hThm z56csj--|qb_PhAs+?Ub$I)z2%iLf1@Vh5XfoNrc8J_B3A^UbEt7J{7FnvRneItTd{ z9Dtd~+ymj9hIPkaa+BS7#9nLg;kQ+RTBM;I0WmD9i-hzfUM~f~u0aG1ySBNqzB-bU{ zI_-n7IYL?FMDvc``d_|}8REG_%d`9P^1cxv=2Owxw5VnZifn)cY<+gdg^88pJtG36uQ~R_gpiC(f;L`2s{57z zSd01iD?y|m03qPUAtqCIqE}v`$7Rr@=GB2sBx6}4a7{;y-5a;7VvL{OhS+=t*6y{Z zbUn)iwxjgd96(LgUG6rLkh4s~Z9;^W(9QKboI@XCpmW5fy>_oM>wFwEr^Y+G|Mn^b z1?}p@u<+TF1?5!7+A%Go0S=`}8l*%L9MY$JI{VpX2F5i}V9Ozc)Qd4B z4~Wa3WZ4R%n;Kwb4Z05rbT9bG3BySRzM(x9tb~1AoD=7tb!o@A84@G26AbI!4kIwy z&t?K zKWLZlPPjj>K+7!)G!3?pATf_LP*W#Wz9fv&*@t$anY3^oN~)7PF}e&La8lI> z{8zkh`w;aRcCRMTBP@F)&DNlcqvr3Wr!prgw97Q ztzbxI9>2hrvlsEZSoWh?%>`>92Jxl=^_Xq`$65BApsET|wa#X2<-1mfGnV;x zuo+C#Ez6aKmMf0Wu6LS*1^3;9b@rSEKk!IYABWN^Kg5i9KsZUlupAE zLbp8l;u?_?Cp`Z|a72v*+*jy}wK=2^E}l-*<)Nm#pU19+rGmG#bFrQ?Tzv^}|B(nx zUi`Q-w^<-(P9mIaf?Dve=wkFKFj4-iIEW2+qlO1IUS&vVoK}p9FohLyrZN#K@PI63 z3?Tme^Tn=)v_~E?{g!Tm`xXeZiXRwgMfHkNGdhxc`8jW}GvMaS zfNV2$ysz?FJeg3C#4Mj`pF>#X$u_Q!7Q!;RfNY_y-&<0v>$H6uR z&V&+dbB{hq2mK5c>V77PJ&g}juJYw-61E7X_DFKIyK9p;yL*U1SNQiNCYN7P!=9)` zf2BT9u4j<6VP2lE_c}LlRc1#7|0_)NRdoI3wT`7}^dk5v$wb>2sO`SQ1iz&;ga+ap zKb3sxDr3q_Jaqxer_zj97Rpi+9EOZR{pSu&I?Lq-zV^x>gUuq+kjt@-OcB~1Z=_FF z=^kpl>PC~KCqfVohw;I|&$>)duoOIQ4@MVTyQA9fV{=2B^HPoV86s36$VnDN)EKQB zKO$C$;1CN32vTqmaI8ObaulsFXQn$M2vR5pmukar37sXtNmcdE5e>K!n?N`3n8a7Z zRrTGcVI3*`9H9rMP0aZ!ex>JB+y6 zH=96=B;RN__FYgCJ#t)n_i%@b`^kM`@)>cmNFPZlYy*GZeRgBl&L^U%pe^iCf7yD} zU<#^?flbx}Id;)Ei@IT^8S{T@Rue^P)i$5UIM(+fzfu&~{lO`mmTG1b^E%CN%H^vD zf=Ncj5jq~lsAr0D2*8}0zQjTg$gpjq7ZirN_BKxp=k}LZv_2hfPG>DC&8QU`c0O0+({9s|mxd;0IRxdAHi?s>)%8lTPAFN~VSCZq3^s)6lk z9gOt4RRwoDHGr*UxcaHP9j{AIPEYo#0edjxc$L$tKi}Q1ps_Obp`Y4pInE8Go>O%m zV|pcO?;YCQ`n9YtR$ui$+2zb=afluJkXgT50rV2J^{2kke6$M-;X?J4UPvo7c%x<5 zPRCY5TgzDJU|h3%^$yLCv;^24Bhx=YE37RRpJRP@Bz%_MdQelDPW2GqN3$t))Hn4m z7sS9;G59Oi7nF;?EYQ&025Cyn&C^r>PpzzqzC(o5f{l4ev}4XL56%pQQ^<~KyY=ti z0+K94CmLGS3UTVe9v66M&?9GhkfXivXC15xA*|QqZ z0c@jVGYFrfZNNKmbmAs_CyTQHxKal_Si(3R1Nwn?x*LAx0gu~s#lqN^IkPeD4!pJx z{y5aP87cS4`KNT3P}+{Ewa7{J&Rk{ooaa*A$XMm34Ac1ZRM|j5L;rQvHyXuBUB6FN z?x(gp>)6a`E!^KX{LNnVy{c+dnH}z+C@LpFZ+Xl>E%~jp~-Qj4;Pf>*W6R&zpk*P{LN$SG%MDJ7HC)? z#6g4Cd*4}sV~Z8zyB|)c6OkA#6lNw|U5r1-lR@JNxTy|x*oUD6>Pt`Mo(0-h6O{L9 zOx$f9QN*%yZamvf+p`Xd&AwP;yW2G;1xj;8@+`;f6{GU;!pV@h_tgLFlUAXm?dA6C zCMtVwhQCQ)7@ev`Ua9xqyivkfnc++v{}M>Q$+x!Y_U7^wa2HJ1P8it(mmazpPZ`Ss z)Z=!50jX9wOR!K)uv&(H4PZZ$Ni>RA2XRlu=9PsHr2T%rFS@h*t29&-1f_5E`_J1u z?~VEHO}yu5?ReZVR@81i>9q5+pfm=FK$NfN-Jr2)8tLTFPfZr*_!AOqmB5ptolU{_ zjz6_4(G0BXqqlxg72ucaEDN5R?^LCQPkzx?2fh^`r|Ilv{MLuMh)<4BO3uu5Q(4aD z?MdmB_X_T#Qo|CyN(SsJo*!ZBk*^-Sggt^0gYF}tLQo45jIt)<{PvVmnRUm0Hl6El z%?jj~9N19DM$=e2UzhC;%z6!d-YKmzR6-t zC5&P0Yf*jX=Pc^KIsC>_1T@9MRBgF7sdIr#Jdf4vugZ$D*>?{c)xsQ?YNaejD9PNH z8Y{Cj$-SuP;q-TAw0GpxonnDb<)j@P&|TRGuVa_Q$buT#!~h zq=p);<%`d+?^1icB@6XE+h;eo+sO^O2W})i3{6T{EuP5f&Pgo+riBXupM#E@)@J*+ z*Hw(Ur@praI@>rsIF++7(=$;iGi)glaDAJ$PeAdSd)#Mg#X?sk{~9rnlVFp2J@I4| zX&zU_X&`x_*$X7i{Gu#94YEg0&oQx@Oyag0+Fvyw`uS+@2+NtXAgYbX19t z2&p}m2=n}-bAaOM?wtMUtAqp!?>Wyjh|iTNkbV!7bFQS7vxRL_lR}nC~5OAKL1?his$^z(S zJJ3+x27FW1Q*z$7hMr?D4m;TbM@o$h4IO`K=;+WdT&?k~0*rut#bKh%unNd=4S-!l zXgf8#fUIG4?bFt7kbbl87#uTJ-j`eSSAVVBNl4}47*mnor$LsIS202RpA+t}3%l?L zTaS~-NP4Y?pkGXWaHtL>sW?9s^X^N`vkM*_fWFy)2o6g<<87llI&C(?t?CRoNT-$@ zx96Z0ZR5_QE0FH(YA;NBg~#A+EYiMxX#nn2lIvf2l|?6%P{n3`IoYG?&g`7~z#nSc ztsrHw(L@p^IrKD#qUBcy&ZxMNcZH^Cy$7iYNY_9yY_by+h(d@4>kr5u}H+Zh5tBQa+ux%?z8a z*oWQ(o0oe<-Wiw=#<4#k28amQumbEd1R}CbQ(lo;3OCHMZ3SIFuwS_k{i(Aca`loi- zN|=u>8a^{SBy{0&{>%a($?E$0OvX2dX@k7SqIW$6XrX*n`koAqw7U1zxvP6=&h6Fu zA<$WVyr7Ft?a(bLNKj6t90 zyJx^?cwnx8kJWnn)BwixjYLvklx7v~U*#;^Jjd-7(7uhCU7G3wHE|NPMp(S$uEY*n z&}bY89QR+xxj4meM}PloxDH9mi*QJ07)QkNO>p~J+4>&^{;Io(#qj3!6+4(YX+tpLXooW= zbyOZ~+YjL8dE0WbQ&evCA&o7cE|l_F>Vs5<9(_G8lG`D#h_8znz{#=x^wu3^ z;;EE^wM7Tf^Nr0y&v5K=4x_CaycNffZ9H{1CQ%ndL-)LRnVZjOq5#Qa=aW&;MFNA35{HIhJzsTcZP z%H)YREd%|pT}_o~dw(i{L|8wRreOsakBrLYDYPl0)qK>IxMe_!eo6TjM2{5x0N2spQGYNtcu~(j9^%#v&NGIfxH(5WgLX52OZw~}qKUoD%1V{sTFwvn^nyWI>89+W?=LGJDKJ5YOJ4R|- z?r_c2SFbXLuL$t*Y3~eu8QbyH!A+G1%iVr_bR2KkO+yNbiWIG^-ko`02FFf?O+|%6 zNBqp2C=HtL$3DX;dNZ8i5+3@PN?eNl65H@I@(I$6g|jTp>~H+TP3W*JlxHk43Q1D@!8QU&ek_usO%q;s*7S z??j!sg<+Vj`Hsl{xH+3@I_yQGm9l9+(0h$?|3>6qp0wZE?%1Ix^bL7~eHbJP{hFz` zn6F=_j6Z=r+(qlk@XywV z!oz4sw}AoOI8rZt43hNLnou}>Yj$-+MoRA@4FmP$Q!~bk>%|stlBHhv^J)UpOyzcbq_Wq2wmz3=O*n}1PGK}P+ zC*L)IE-t`G@>mmG!@}mmYOvRmL<66y`ogGP(K&!t(K}Sbt5voj zTlpzK8mx4YIHv#rUycx89;wsOspZ-$x5)A0aCMCfHGYPeb<=bKJLsuYv)y@Lo@tF>Jyx%jyRBp^OPTYDv+nyC?!D(( z4a41;p%CS}T{4t9CHyR_BEceCT2DFi1J_U3 zZURpdh`9HjBe5ofV;NqPwfEJo$OV~Oq_U4B{>O;Otw5+x>H+3q^^Clpg3(+@$Pzfn z|ER*dRvOB3dsI6H(%wRl>${V>Mw6roW`SqZvp;#B2~529ww}8ZSFat#ZR=Cg`Vu3p zLV}`6IIfV0Ml3~bd$9jq$6SZ9SD;hAIpXL50*%&*Tc)TH=0lIF)e63n2+F2oZP~ai z_XbVn*LNu~k%pXosuc)751gjLGe7IzZvspr<~Or}&?L8KWTr%{dknJFo}V&>B=B=X zL%P1|r*6j1g&i6ixQ_$Dgg#uDn9__sf)|dFRGf9TQ2tn9!zO;cr26QD1$K%<;x{;D zK6OC_R>`G%otsa+j4=8*<$Kf8ow@IL1K>p2K|HW{yT}2RkkN-lX;k47;8_=7n>Cq@Vtq)YI!7N9Y-8X%{duR zCDHU~31g~f`LUe&=tP_FqT}h=zN&TBvJIgIXj%67oQp4fF&e84aO!v)2d@O?qCWA% zz?fr`K!zE`6#!qg(q5F-UkgI@x9Ue7Z5)<$wC)OMK0iTQga|ny%+QJa!MTnOrRwl} zaDy_n?SNQbrR(#;E+L7$K8mc5oE)3^NA2uRo@sK!*}8`0BCu;t4UsR_|g`q zjA+f|TWQ)5figha_5 zZu*U0wN02OoJSp0D0E7ThqQUG9zE7AsP0iV>L(6^Xj!%=?h%J0;-B&!U6GNhY^Y2^ z3pB~Y&R#C(>h2|VkC?=Dckwr|QtMJPbBAB6Q7og#!){Nq@@buW9zS;xc!f?^*eOp8 z!aLilOZp&7rJ}q?mUjDaF|fJI@_3^mb|sXOR^?`b@u+$Rt$l%rHRGOo#=}L_wSAXu zUZy9*s{HzNjl)H6hvXWcJdSgsYOSK~zfq1idh7fAk?z~3#+D8er)O6T2R9fnW3P9` zHfMW6XX`I4$o9m`X0t#KECVTaTD3`sH+{I&7oW_qH2xSv5MMZWWj63;TM(k6yx@zG zNciZT*dm6Uh@IpWw5H+!+j32#_N&I$+OS8^%D*#iJfozdXy@e0j33v4vtBHcBq2*) z@gr)-p%}>qx@aCMF7@}kb?81p8lpjHn^nwsbgozuYEix*N=hF?UMl0Hf@sD>yzJbA zo2mi_&N4rvAUwv!6Q%saWn-|D(8Io*;5r_rEwTT|$h)c=YD~dSQ2>YdQj@&lbLMT( z2kPqG&iKxjc2A}0H zT*&R79V34d+%=C5zA{MMsNA6YhD5>EJPrD>0A z_ayrjLl0hi|3ml|gCoE62J6Rr$fB>E zc^Sm!xOAlCXrobJZSwfrSN%59n)pnvRuD`5tBd+k_vWL=hhNm2`V!W}MQ@#8;z+CW z3U;Cq!X;^5c!cWmW758Q#i!?j2tRbo0)nV#N!*Wh5~Pzz{qL*qdzEtQKRq+Wl=4Y3 zN-29dyT*H5@9_f5H$vX&J)XSEno9Np+M$4YnW4Xxa#ADd-1UH}a&!bc-+*rrIm+T< zy%qBUO^-e$L;g#YrfhV5%Xu;sL;1JqCFh2q7FCxe_cY~KWcAtn%ppR|wL+FtdqhPJ zpPAAIoaB}i_o!CS1#WjWhI}BcYo6b5;qoCFY^Pt)E>}NyW*j2BwWd$3(+&g!^{{Iq zG`aNfGqpg$dc1(yG15cE7`CY96YZ@8x+$Bo``Hhs6;i?k;_$92R?=6laqDFnejT`G zM(jZzCBx!On_Lr3jjCp+>UOWxV&4Bls!`rW&R3EBFAus#Wxh%K_$qTJQG~N|rtC2p zUqnMRHBDE1(b)`u6UJ2Gp^(@Cn&ot>JM%|Iy-3;uupcfQ#=#eB7uE7>th~O5kY-Kc z2e7@(Jc!fXcaEOAO;s{UnizHDtmQV~Xv&z7p#N*eh5o|AXVPkTcf)$NAIzdwXf4{{ zs7x70B7Z+vj7ox%$ef-s_Q9iDbjkBlPSC0xF_Y+7vN2iU}0YszwQ4 zcZD~dgsbvq`Pg{-;H}6$!Ql?nlMigqByDJcPO6K+N&k zlefhv@p6zSz_$>f$j)x~%;rWn_s=dcRNfkH=LiIGIFTv zLEp+>hyP4NZ`xs%olRYB-kI2f6GUgz6D#y%8HC0?`b?+8=6ioC_e)eA)Qr+%i)a7xOJ%K6?c7Z*D_X=XM?Jy^3%D zzLA(rQn4fD1}i_;c=_R*kY|NM{(!tEvHyLo9XISIonyU`8JSv%Ab}SKvI@T8+~F{f zl~`uhCuj^k5{nqm1{z~$IPntP3X~Cbip$1(wZ&{#<%(Lz4K{}` zj!xD=9CiiOo+MhpeAvflmW-UFre-gsc2|$lsY8F9&+ttwyTu8N%{^@PTeuPB(v0i# z$5qd}-c5c$&n4Gme1m<~{p+jLB0lfIr7tzY!~o>2Iz0L(atbz&GP{&3FFv z&-&B%=`811(#wkObmV{KX8ecVTQUbUntRr@#K_b2y*M7~U_fr;h$~F(3#94c{(V#UFKHwU0nsy% zgwQF)l>X0P+aKMhv20&Auv7XwF8*MX0K)-MzAbP7WplGs{at(h_rsz;MNUb<$Z>zq zqxKig{J$UW|3_C2%&BV0%EtDzSZdStf3B=JHi$SF27|r*gkjYV@Q(+El_p=lI{v@> zKSCR1ZhzOe*b~ctLzBOP{fDHuLIxW8b@Bg1RrD8eDt42_7~q9--4LU0dU`W@1K-^~ z>*@_y54|Zo@rbF(a!MX8YQVqQ&j?x*3hK_$jT3N0zLAY1v|Xd(e;T}Z&Xse))Utf0 zMkPsYVNnck!{fxsk=u8V%&5oW`QH%d2jcMrdz@OH<)hNKuX=1sEEwM+ea!7cxij8l zyIb2i*{7`4(MEU#za%=eTsucsmkp6M^P**N?@3>DsB!-DEPz}yqr8XFYY>OhaH+n5 zAgM3%UFb3oh^R!4Xe_BMsLiP@=ZC{f1qxU^EYe|d=xG&dyS6p3_$54uDJ0*LdkvD` zHc)v9dNvpPuO+kJ3`~~pC*?C+@Ovv;oA<9iuMu;N@l8AvY38f>?n4{s6{)jKR8ZQh z*!Nnzr=Cr*3z#yIz%r*N1;*NW@ebd6)G*Z^2%vT1Jv19v?mKVDN(l>1NqifN8TAD( zjN#jJ>~m6VVw%L<5vwK6-IyA+-}?;zS($>savlhKB%gHYR4 z;*jCT_`oydB04jMk9*$#J3jWbk>}HZf;6O-Lhpsrs`{7?>sTf_c1Z`K4a}KTrI%1K z{mzcdS<;453U6#k`lUrp-A8=>vFrwL3p(lK+8;i#6Q3hMkmi) zRDoQIYcK2-=v^$v_^-U%4hl9^=_90-AJ&$Udaucy`pi-)Lo)=H2-j8D8ry(&{aifB zbLkS-i%5{5`m(s_cN)XMOeI(JVngJYZ6y{cp?WDLpgd!%?Q~{3p;_T@` zt1Ei7G3M-hA4J$Mj!DU(jh6tzHpg+~-1~ z*pZ|#QeT6Zlm?abI=Z95`6a0ae9Y;K%H^Y|43*zqxhG((s-%g^ySl`MLVh&?PrAc+rhcALT zF0d2!Uczl1V&{t|!Acc_sD&H|3Mcmw8Enll3x80G!HBpAyF*&rgpVbj- zgvcgTFt;=h%ZSq^<9d@++}W0&3QnYqB6my0%b@MW-b{i;S;Su0hoTH;f7hOP@sE2F z^p=u+MV^S{{0Rn)x`8$YP3?ucy0`kXE%}~k@quS>PBRtMmm=2=0}&B05-cS+-Fj4m zlA38xSO`A~3S%)n;r)@vR2GXF`eUu^U>4u<@DG(Y)X|x;iWZ+fNMIS@f-+y^dh`&= zs1+-3(!Wp_E=<+HbvsVz@Ahx9QyDTcSEMR7IRlYIO}`J^REQ=gBik(EI(zt?8ES$B_Z#%0Yj+>q?5ut zJf)RM>j5M#do7q_GPVsjt{(X?or1TOls2$vL;6x$G91+cE)BPk`ACICoeNal8U|4H z?yzjk%lR*9jX}=eoJ1~zCZG0y^*SP$=iGWsY0{QjR0A>u-(J1xbOt| z#|Ud`%l8!4n`#+J_*p1;Q|haCa2*MWJmf?Hq(Vfx<)@Da@V|-?~=sUD_(S-3;(3g zlr(^2u8cF*j4EO=xbL5oPW0q?ezug5!h6nO-LBBxmu4Tf|qxeATV&bp-7Kl4+j2=c=x4CZm_u7=H-#e&Rq;$4qF z#GCiMa^wEmDD;r9lb0Tx*n^;Yju$GwUwo$48b43U_{;UBIa7k`>5rhGrx`104c<}M zncom52?nkvPI3&%NGx$WXfpczS(53DbdT$hafl#3Y_Nz|qh(1f^_VykeewfcinKkt zR@)ZP?_IA+#rIlILjS$QzJM}4)yKU)k8#(yGhrzhJt@jhk6Zjy<%H^y0OPP=nR+a0 zk`1yHjTYr+3}EPD;&kgMz8|iIMZksYp z4`lm_5o!89s+g&cX;MX}>EKRcSiYwfwOJ*2z9*81j%Z|gu}OTH1O|6!q;XTV!dbJ$4>nJDdyjKEW`9F6Q)c_xA3j(5cFWw=U&919yvoLQicP}zCaRH<+A zY>7GJHTP3##}BB54q~Z+>ir`Eg9EL3Nn02R8q6*!YAT+>n9CWvVXrPqkfd-0 zXbGE42Tq94IKnG?7@j?1h{23)Cp0mTQo`OKzMte3Ugh>WyGGUSHIu|poMNCS<~ws* z??fZ+xU993jh>;90LwvO?>mtb$%us8VByDHx+=V2p? zERwgoJP=EuE|QWX{nJrLs>1i8&whTu!In*>p80@V*i8HEHOI~O&C$k63_4&|&Oq?T zL<|g3?+;f=*8AIzDRD*pNGZ8!dL-<-c(!=g3dn?Ou@>vPS5+^ZGJrjER;I+E%1C6@ zL$N7=TK|}h4GbhI<@V3h6882?ZJ2z0@b6CyKiZ{gwD}uvYE2o{jKdh+X6b_-+1g_y zhkurSUqbW%CzaK+cJteJLOMss4=Ix@Z#@gisa%LnqaBqnC|NKLH$>8&x%oGtmJGh< zr;vjPw$E05UgHwN+Q^T^i06XD9*t`C!B@fv_gEXcyC*RISw)BQAzemKP@!18hZBzl zD32Buz~?K4;T(0VD>GI3Hlf%$`*dpa)11WA%rZYebU$Nx_xZD?t?hV4#bSUDX4!Nt z@3?~9^J2tRmc44lsMWnKVbE97;Cq9nE5hV*8754?h=v~+`(Ucmf!TE8^cT5Fcq(ir@- z*C>3)sc841t5q?T^5cFgP}n_){nAr0qOPvCDzFXe+39Y-td*}?w(fa8fR#PX@F?Md z54seOCKY^~ScvGcowB^8c>^|BH_<1mS2rd^aKnUeJR*yBG=WNv^ZklLMGgnc@4XCT z@CL4WSFryl{4x$0Gu8#)N5YK>M{G!bVGXsOo!vWm&sFIAM?~fud9Nv5>cE8e4u6Cb+d90VJ-(ZfP_p}R!Mq%Sw9+C~7V1~b;EIzfw3Sk@dG^%7(By>+;*cKM zA)8|{o{5u9#%8%*!jNaJe}`?xQT|<0wM4*&8kfJ*?7pbvTkV3<3SRAbft&w_tG5h@ zt6R2qgS)$XaCdjNgg}5m(8k@Rk>J|6y9GjmOVEbk?g{SJ5S+&K>v!*S_rB-+>c6ws zTC?V?sxhAGqyy|>?NOPp)_A`+#Mp9NCm~5nTQ^ z<=ES78v!3-I=@%|lV-+y2H+phv#^vyt_O^eqA5qaHC4mh+mz1C*9=|S?m=?BzbOnK ztYjb14RhS+$QwRH#^Z)ohrx=Jril1OO|6Iv{3tvd2IrBE?8e+*lV)1vXphr2!94gl zW6;K$9!Z`-ACj=kj+DktZFSCQ4MV4Tf$ae@F*f6r(m6(Q#L;DS@xmlXizF9_6VzaF zY2W5{n9nC=7yFsgwd-{A$K~qJp|Y+v6XJN&w=|y~MuO<9fLe|z%)(L}%Ier5NuXq- z$@{#jEO*sk4c7y`HFZb!ex_-~+_${HM^`evXc8X({tdX62py>-XZ3MiiT^$=7!vzK-nR8?-7i53G?G_{9mW;}&_XxdJ(6w!Z#S#SIdjHwIxaY*ZpXRf(|Vlz?O3^db>}mDFVC`F z5p*dR2rQx%)B6w)(askBy}r8gehv6?rA&sfwL~*S!S%QcT}la6=tS6d!_LO3oqt8u z{hcwoa}><(fZb_Le;aV`J@fS9GxK; zUjH>Oq#W_vu2oc&xnk>C5zl>an{30R?U%H#cUO{1_ z{KgU6x{}qGZQT(i>_vzjxrLX@8+ zpYx|+-^>lE_oNNnljC)V>MDP312T5FSeIW@c~D206);Yn+@REXcaz~fNUGIA2i&lp!n?H5*%WPE^c_x1 z@-v^o>7#@*Il4k$5YkrWIPAC#t~&OOLwcyye2G8Pad<=db~7s5Og1JBvY$OS>3J1^j6mvvRw+$EUzs z?3?O8^1<$;HA<)+aKi!mbo0BEru`ut@tdnnLn8R-Z!vR%AW0=^Lw8wt65LmBnv_b! z%qYO9QJ$F1pwE5xZJfLV_0cX^vs(I!E#V?XS5P;)yB(57nWTR!!D*COEq`F%rn-xR zfhJ6smO0t>em~LFJY2Ce;%GOlV@rvi0A<^Eb63mnc5@85&_5}!9?j5wB#&a6$AI&g zvx#{8eoSK=J9=$a^~YCatjKE7BX|o3(?g^^(aZfV$aot|q)ke3$=1OHC4uxuuAIQ? zsyugA@{$uss$^j;Y%KRN_ac}1FdP7Eu?02`zVq63bWAB3g=hHgzJ4_}ew{%sKL2sy ztg~Z5u5Rxd_--Ll;stpX;m8%dn?V&}^K;c$afG+B!L?Vk0B9e3H0mzo46l`&Sj~I8 zF|+-=PmVrx&Clf)T2d>OlYDUKX8@d2a^k z^r`vYQ35`4SQFpIn3eI*T3aE|znV~&GIPOOniB=XN8Qsm&o~lda&v5oJQzy9U2zSo%88WoSrfPv&~-p~!v>L|WOM08gPEDTW5Io-%ix z-E}UfcK>l4@?mtV7%FGJX6{)FxZ?B!zGC2FEph+3){7)(+Faig^cm>P1=v4OdSE_s zFSffsw%ooB^0VsTm-e1pe9P?QQwbnx%B&C{68HIp zPOcT>ilMxvIL|1akU7?9blK5(_~@LE!#yR3(D;6R@xxWu51Lf8+up{}#z z-}+HlH`|?(Rg6~8_P2@HZ5SLHRyz99@M22iI`PoBhgxEhn^7cWRMfVcN0t;suWdkU zs-^Apl)9Tgiq}PJ$B3IN``vdu*SO8L>TxFJxq)+`5(poSZ#paB|HfqLIZdMD+GR1g z{(j=cQXZ)N;yowwIvhKdHTYSdnt<7~2Ucj^nz*Pe57?$bv0OMjxs^UP8^N-&_)c;@6vA&DnSw)2$5xl8)>(H zQ3k`aGPAqOj<#fpeJ#Ozx}0RzlrqCZ%@;J0)^>UM(er?S;lf`w!3E9t(W5cJ0JGMf zU94^-Zjt-h&-JwuFO*uAE`d?c1_C_aJbk!y0|(kJRZMT@9DSZd-tKOZ2z79&ZbLo^ zZ7(Mleb=gtO?1LvT)M!~`iK2f-{hj8t?hf?$VYD@vYO0=8wnS3T^hp+Lr>JrhbSbE zZX{qJ3RJ>%p(p5c^8WY_7zF8kE09pQ{uGTjUp&(O47O!80e^nnTR+^bZmgObYf z8&|>BQAcNCSldUfZP9uX&_09huuX*qZ$7^$F1uLFlSvBycMW88;hm0>3JCooWQe7+ zV-)wTbG>@vm;yk#nlai#>rRW-`;0nZ!c#|QF{T8+lX}T-_+)XZ|FLhrvf~;8z8KGt zE`?fygunNhysJp^7`AM%+$`TKR8pR7+xHvT>zPkqSf|6?a}uREe=82cj^kPK51w+?VG+>ui znNKG-%%vFl4ad9e4wH-E>MUA1|3z1gJ(hl-cyNx}cAs}~xwW@*5sHOiFk$Oi?8E9T zK#o?r>-ruf@i58T8GShs_N%}+7)rAyVaio7S6{WjH7fAXs*3RM-8SSG_^~ z@SD$=R@41Y&>r$E|v>Z z+l}4Xut(l&2&^-pjCzkXqP)WE2n{@W|9o{bZdm_hn#A8yf;YCq&eKC}lEQ}1mm^M7 zg1H;ZO{P9P$gCY+VOOjWu1LncXr9EbHhm^l|Hl_&(bo)T!Nc}f_fLrET#=1@Hpo3v zyx~GFwEui4a|W6NkJOuf06HEwC~s=5Pr)mU$+RvOC1yIB+scQfP{>m{Lc?Ue@Uqi) z_+P2Gq`qX@i%5uM`>ICdthdLATF*DBA0APbp`QIHcO_ZN{(Lj&!o<0dqF-OX!?nZb4iN1kl}2J zc_jF1TJ>Oz4B7@M7UX?r6~rp)Q+$;Dl<22wNT+f*mrD~FweK`%wjG%CC5bXp^5cSj z?#4m=VooFR!o2aS^pA0utDx44a(yq)1KYXbog}QLQd%JJQh2PaDf=xWTh{-aqOvxv z-jIJ1s`VUb0v$m4T%rh1St@G0Im%9bU24kKTO(-v9eZ!=n!gc(tT4!i& zGS)=ZmOHaW9vdBD-~l$cVC(wuQom&mos0uTr`JvMRQB)>cX=G#R}B48>cIScZvjwb zT*kNL4Sl48b zU`>HJ>eBj?+WibaaAr;?rT~oCM$xT36`lSHgLQ0m=NA+ep^Lwv0L3KAxS&~neKykZ z6ye%MeZ@ezul@YTsgAf%*h%O#1XeX=thnSMSC~Yoqy|T=#0llt)n!O7x?e};&B$BI zJKVj|h*#sKCN(1V=?h^DxySwK)`>yQ*!9GEFM)?PeY$?XhDsM;(I?+6->AVlBb7hXso-^CT!GwF-oE6t-MFyL2ANyj0R+VKX#>Um7 zxh?mvryKWb#0zT~t*T)6h80jGPCB(+=46*vjo}?Hv;l%~KGWRIvyPWS4xJs6LNLV0 z_)rYuRwj3ovKft7gjDbE1rQdDG7CLXn+F<=UrGp^#_^uwsT$Tn65V@0n-8@k_Id+P z#RNW@2!zM`Ru{Ns8+V-V{F1_;a>uNHXnArNGnEO*S3*%m^Y|p9l^0g+VUp$IPA7L= z^VySvJR!T>=I-o>I_-A4RD&Yo>3fZPRl5i0Re5JQZP1I8@)VTXH+$&|Ss`ppD|_5b zlBJ)Yq%;zmlgZTh{WcAV8sFdW(2!w}5rL*xa0DCG1mXC=m!PcTzhNoUZ=$uGw|M-;!(mQ&ne8qjVD_FN=`3uz)6#mO3YgH1L%tgQ?9Ai;xl zvTN!yX;XJABrk2c_RQ_;O)2-&{_lYM+V%?GH9uN-tMSXvn@rke?re`fo&z)eiAUe7s*dzdfbv$#_C0HRfMq#K)&i9@h7?OuCw7 zK23O3WSRxhO^QqGRv-82J-Ee_G57X;@EsyE=X_ti^@6*EO_uMq!&`TP zhIsF>+wso6S*3Cd6t6Iy>pllQ*J=(CP03^P6#G==r!`~fUGEy&(JQ!~d@|y5V_FX^ z6eykuaDFB@gM^(A&RO6-_&;y2;Iai(_w4hgLDJWzvL+3-dwmFpIb%HvRf%QUj`ZR}co zXrzlE{jxgv^w?VSAxIEC7|^egbpF0H0&x6nk&%}^Pn6BZET7GXFAtB%C)LVnrz-mr zca6B@q`{r9%orwWK{>uClth+b-Zw!C-&2>E6)l1rqsm8Bf8=9&Z3*qQL`VUrQbHok zxzcU#l6>>TPw@G%NhBQvZu;MQC4mgO@>;1;bP})=n+HTKCru9AaYa^s*yv(Na%$caKxaqZKE%#YP4xUVpL>2u$w8D+DnPOU{$uAIAv<&Nf)e#`Z&h2-- zIsP zN_(}9P0&1k8!iYApN~AoCG99LQK`nls!tY>YM`EgT6*(i8UxU$@^0+fH<_;0WL%+SdUJU$~oK#_jEGEtPL{zAuS{+4AM`ZW0I^#Pf;8k$5$Zi;^3@4OQ>uZ*oT#| z|1oR^Dd2R*NS#l~ax(QIg)a8XeIC?RGbw2Xev9n5u?=a8{uU}saQiDNGZ?)si6m>1 z&|~w>Yp5v6)d3PLAOWN3*^_C@iyG!L+r$r zSJ$;nHJ<+ziY|%Igp6Q|ndoOSa0Cye#eqvcvikaHs1{mXmfumENwF2CHm(0oA1&J} z@DT=|kIBMkJE)aLam}WOwK`tjH()|IdZ9Jj;=*YQBsC1TP~V~{lCi&@jv~9WR4-#z z&rWM^tw7aSIt$1BEGu#YFlmjk$ddRY*TcLVF5m4l&Q#xk|0k*2Ay8xzZ#)-zalAgK ztMi?!!0+yt5JQzKDW)TwbaMCW(!}vhZd2aRL6{BuKgos_F~|hv)|cP!G7)bMLUxWu9Ps*(VIRPXpZ3gunYJED%;kG-mAk7v>j3bKaf16i;g32-BT) z@ImblEBFO-%Zc0=~ac7P0P!3(~TJO4pVpY=Urr^6JV10 zla#qiMejTPXuwK%g=$Q7hB9ha<*ryK#>w~bjz1}ciivW5%Bi0OiqNpuZ~0zS4AaO~ zx%ira>|T-uW*=3@Rb{yI`3HZeZhd1MIBkEvBv1#KeC(u~YzA>2jA$ose33AHoNK|t zGmdVbo*M~>wn&<2bYK_4x7V>)8JeVr&4R~4F?DBrcbsiAMb3Pa){vRTU9glL=Z4dty*9Ixns`o3zH>=7 zKa4Bv;Ap_3+e@xW_zF)p=CXH67Mezy{x`7RRa|QNzNFNuLLsdw27_<4&hZU8YP#DVzxFAKrPe!r zi~d}Q#p8cuyJZk%LEmIHRk$XE>m5>ORj`GYWOMV>us}T1E`-Oh9pF1k5jz?(Y7Sx8-mz>|BT@lP7O9rbacH zqcOQ5<6k;i4<}XNxi#Wh@Zp(4Fq)j)51C|cLEB$1&&)*(FCGx^XE2qM+BpIi2yWab zQgLB2oM2c|Il=}Vo32jj+Zaw2f;lqLPUH{@*Acv(lZ;)LvpeAO;i4u48wk}x`1y(b zf8e1`nH5g#Q?}CM5f^zx4wd z$GF~FmM-OGdx_?@F>vLNm5w15 zVhYJ#_w)9aDT6LyveUw2v>8FV-=K6`OYxId1s38J)MT^M{Po`)^5nz&3=;7+(g9F_-q z&@{qTD&#ig+eA3-FSil6$_Axc!fM=Y+7QR3T}Js~m2b|k6aI~CF~7rFxHA%Kb8J<} zg3E>u5ol2a{GFscW&p-_yahovA?jTUT~82B>-$<+#*E${sc&#Hnar;CldqDqB%c33 zcaeQB4w@P0R&qXYjk}ZvK6N_YZ(GgbT2eBY`T`myf~V|TYbf@91h3g=biA(J{^pVg za2E;>`qs1_8_|Xd(hAVL+;>D~)ni_j@Ft!@xKE|SirQ~Ujv@R1m@xUC1!Rz*J;Po8)1 z39vaLM2D@*MA5xq$aszn%KvnJwQPj)%ukdG}4HvN2-Mt@e*q z0^diqd(^!nPj9tmsM=F7#8v=&pKy5^$`psriokjcWZ_`}lyrd$zQ92+`$K?hx96gY zO;FTXQCYe20)ZSp2w4O;2K0C_2$xy(YR=mx9;Yd`3JoY{2%l^jzj9A8Gi(IRQu+5s z+9UUVSmdeO-`w&+HFef)8M8w^p%=LQY1h52Sn06g`@$vuv7^Lb40*H-OdKvac#Zm_yi1N zv=B@Gb%8fQgkV# z8HDa!pbCae3o!&FuOEdm`{ej+?Kaujo^jkNfkdVlDiX$r)MTQAhqUS^k4(QLu*W`~ zugO>{$AVDnL|nCMIW}ShA}?Fcx+Oj9nWxlt%;ixKRhdENjfCGD_QQ?E6r#=~m3}Q| zNI**t;hMIEGs3C4)^`H;J*3ybKK>qEq<<%D5gt36tm>~1&iq;F+pQ)tUx0y!orH)(07;Je!>E?lUGV5jYs8864Q)0M`|!N{czqc^9M zQ{Zs^7>iEd7zyfUaCw8_E-uJ0JGvF|itwBmT||7|O; zKx%IXqGnlk4Ck0F@S=L0a!5d{Fyo-u`zn0FnWX1mVw=~EmbmUk3ntk5vz!k}lgxU4 zTq(z==g3HMyKgjtVzK68_Ku!w`SX%>sp@#+?PJOYT6>7kdl$~hXxTA(zQWsmUGfk{ zdTbbc#w6YWZ?32&Qwt(fm$l(bFCW%RVtn zvS2K1(Ce$1719SK11rp70UL;6f zj`U?1_g%{cQ#J}tiJt3ND5;WINxN7;dv$j0|(|C8I92M27H>(J>Z7-EqJ zvaK>hEs>iqWXdyzBR{&yTFM)qbzSjkmv>Y7I77=A>v%tR?+KE}4)Fts!Az*bHGij| zaa4D1=tzq@h8kIMiS=_xx* zF_o#od-u`p-(mU20XU5u2v)F5D&|=1C7R}UM~=)t9xP%zxdsn#^q9!)eLwk~dLKRh%g<7wSXAkUpzyEs(8P5vQ#;QZHJBZ}01D~L=^ z1zN4iKP-=`lG$9NOYVTD1DPTXRUMQ5vz|LPbv<#eKp&nw|7FUVBKOM^K~iN+!r^*k zAsN0ZRG;L9+5%aBmwD)*?P0NP>GDw+n}UAGG_d8m>TiBT8_!l^|A-SOb&6WA8Zgj@ zt{-ubykTH^TyPlaN}pT3iy~)5%xoagaZEHKTrX<({0RqJ-03u8a6X}6@%XONeW@&W z!q>{CBX5d2fYDZG-iXioNQ>LBxgvx#vcA1!8hC*HLnJs?`!rN}gf_cn(fwVX43a5|%>`%m_*6y*8`87Y>8aAF@VU&j7mIQQK20B;W? z%yz~HHyXE&PO&_@r}L;M0Uu1L3-?d=nz^}hKR`Mi^D{#}+zNc~A$S{JptrARRgCA2 z(mTBTu^GOiG)X8J#pGTeOlMgo3|0(@Z!>gsHDcoM&ov-!IT>Af^Jh44pE;6O>zCV{ z1^?EBDar5qorLz@njd=_2`JH%4cTJvx z?yWdJrN2(Vo@X1k9>M9bW9LSk!pO*dofk{=<)_FaWvYUUq>QmriIycpym|AnZIN-C z(Fw@Bldj;MZjE~4qIHsF8IC zhhX8K46&rM}f3E??jJCCmPV(fF%b~Cx{8S^sNb8~dK6l5+E<~M7T2T0ym zh7G=hK!Ua^Asjxm;<&e&8bK;!SZY;-qUzJ3o4uDYK9A{(!=fft1^cvTB-Un>zk0Vdq|oA*m`xP36ZhXvrW z+v}NwLdQvSD-2nSrS@jva)w|qhpxzJ-J(U?KQf6Hei`P zKjX_zTrri+<@_r9%%g%h_E}-ACKZ7tPlXStIGr-IXnZH8iIE#a)RJ(`j0Iq=Lx^e# zlp+BKVTzYkq*{*<9BDGtzh$-TqJ<)_naFarc!~d|n_+Z=HL2|=beWY&3(oKEG)b4qA$MM zYDtC9#kg1bc1yghyTtc%Wd`~#<@eU7ZEww(aS;LUb3O%!0fS5Z&;}T)B0$gGt0;YAB6mEdS^;jb0&w$)s%2FmjE0~~JKpR64Sxn2Xx*By6XGsGGzqr8weiQ0 z#0mH=#v9%@cqtB&vN5V)o~e9nTzP>{gjx=&3lNPg30oRBilP!&I44up-L_Q+3*VzN zQk=r2p17@f`0S)~&oL-j4RB0tu3`F={xva=@SrZY8RuoQKkmW2dAbn!Y`*ZvJt1Z! z@-4*$^ClicOjh_RkB|`Q!~JB)>#x)+Y;rNp@(_NTRf`YI8~wf;(BA7cwKV55rm?l` zYkgREXuUYKBQKIr1(#wcu2G+CB)CSq1dM_h!bL(XFWLc?n>vM@ z?@E%4H_KTZ2EBOSnl$gB?;G=Q&v9~W15Z1kPtl4hY$$5w7tatgWwa+!W%v!EPY%5r zGi|Uzry|zbOjcc44?lug#Kcd;Bc>F+-7lASgKX1AA%a6J1j|+RP>lpmkITgoGRMyo z*Jo`%1I2%?-XbTCxUaC_1~C^mwhi_#czYIrpo(}^vHlQAM~@YQ!H@>$RKA z9&}dc0KRATwAKto9@@)lBrsasf zqnwKmr4Z&CcTIf&8Yb5H6T!mddTkDv)AO(+jmEwMxtup`q~}f9Klm|`IKGx?kHA3 zEh&RA2kSiXXd|vuGDY`hlz_qiCPB_M+83!V!?AAaF(-cMp&WjLjMA5g z3ia#T>>N-jCu#^I9Ai(8pm$f<_E)0lq>IJ9#Yrl3Z$t}o>3et+I^VI%G4uwh#zD=qJ>#n<+^1}xwC5t1z znC0Zd8e|efTmHHQPmk@U6ow8rjymgNIBgD{HLOMMFHP+6!w3slH&1RW|L9dk<#k|+ zh`1+~?}$++Kb?$MdML`GD{{GLqnXZDbd=G@YgDre!~GZuzi) zt?={%7R3Tn+<%HU!t!7JA0%9XX;0>>|2mh;`8cAGHw6bFE7EvDYRSa=HK$vodPp4; z&+0w-emj{v<>^y}j0UaMI{ zZB~0gQrqL^3^%1ff_=$k_a`MFdmnd!5t{v)XEo`!1I*1&7P5#iX~GsYepd{zVLx%q z$ei$0g1O%%3q@2i&lR;jVO~;l#-b7r~2s?Om}FfV7n=) zKPBL&Iqp!i38?3-x~b@0f=N|nct z;bcth`-93MlLV4 zDwx-uAx147uRs5=XkT{DvFyva;ctkooJ`GkR@J=oChBJHB&n*uEr108vW;n;j!Cn; zTN1KHuL&N}H>AH-KT#G3WGsmpeD~nKINw zh23<@D)&5;U1o~mYtSL@(Ybq!9nD?#QOc8BozdejpTCgKfP;Fo1F}DDwx{hML>(vx zOP6ty@o!SPyC8o2*+i1BzMy>mJ$OST_&@0tr};&R|F#1KfeVs0SBIUN6Aqrop3V_sQwim4u9Y3fEVhTc%M024?XTLN6;X7XZrWWEN#i+kgAe_5E?xilysU< z8MkvHT7LEIcq0D$;@v2_J_iZm^s#};KpKT_g`ia|(ppo9Bi!P$B5feZU$s>SlF8Pe zVJSa=RFBzZAalKP2Dk;dm~5t1{!BgIb`S?aIa81Nt>hPxM~U{7PDO}rXi~8= z*#@}_*uP7-xnIeDP>viZ@^GeG2a0PNh@)*1@6vj>8?hC5P=4xr|Jf=oVyJv*RMcC$ zAf4#E4C>!RZSE7rc6-$6u`JHMHf7d04vpVxcb4-Jn#{Zq*rv8mQJRbCWg$vn7|r`D zt2A2li!hz(13qMU2AvTbI5=Y)eiWd8@m4ivJjsKPJM$ojyb)$dPOLp!wB1BIuB_jh zirJ0r52XWjQ8VCUMXI_}<>bCQhhDmXSGVdIL2+k+BagX{{J~FTgY(;f69_3oJb}l6 z<8aC6!RfIh8iSqNMPtaTjGBm-H72mBIMJI5Uy>ZG(dE^Aw0O_pkbuq{3Hm7C)c09x zKEKsfnz7K?`1pod>(3ZWe&zIcaPK8SnMrkdt_D{p=vKcaH~6Bar+4_N1C<2@4dVH; z8o9W`2xB1&_~kaVne;05!emR5pRlTXBx~Rc&QhGUiGzFB;^X8hZe*DoCSxRyv&d6q zRfuxjevrtA{U@Dx)q%lZE60b*q-84ySh*3?KYr|QI7*n0iZU$I5ZoBvdwwJI5>kqTsxxCLW7E5|>YPC8H-}&d*$oyXl5{@@86Zl$ZZ1(yM&w z;8IH+pceDaBY`U#8t(t;YWVp-@ReN`h z*!S)pIV{G@ZC-kXW@9T$c!wYZ^d(31tvWab%bJC%@%y(hp2=LMx0F+mbPQvV{~K1- z38){IJL?h;3`$0;JJmR-;Ek^BYPOVZNs{Yz(olKm!Talqd4_q(`clyE#Gq9Fq@hiC zbfB?D7`%RS`(J5&-V3ZPV&ih^`5)_>@XRHTiL)e z-!^Za1+}8V=WHesXr|euqN${G{36P*aC$@x(@^bIrqO}1!zmn$V09 z2_>cC_IKdf<>xlXOTWvIh?eYP-c<X_D&qYCE=#m8d?Vhd#ibB0ZC$KY9S_kI}mRn*|;d+V~Aq}5UR%fi0I(VxAy z(;_fs6wC!Zpp_KYSeuD-_=6U7BGA6pk$d~KTh%sxZrJs;rZ5TzKGEXc$-zu6m;j-x=ew5dF^I8POK`}}~)4MwMh=pj?qj(w{?vfL%tIrG1`P?Lf;18m) z7uSgS#n_k;=EvPDaeM0tfUqIU0Les22IpiZp3by-8Ma@0^WeP#(pWfGRQ84bkHBd9JQ%J=f%nen^sI$CmG3*3Q<%-BbQF!e{8g(@ zA*@$QBmDkjVz<)%*J=s*J9*V?lJDk^A?BG^wh!2=PVD2xZQRB}L|gXPmzut9t0p2H zlQNS)`B9eR`cm8KPOm3XQ4>ExtU&dVMOj|z@M8vAYe;^&l7$UvyXw*sy=8v7X0ZOh z{i&p#sPEn!)O&TyVV~rl7exJvdq4{p-dL4=c0127Q7=cul=#P*NxhpUN@StEd$k*( z^U*Z?JQ?z}X)|ad%)1a5qyq)nS{}o}P~;oQeNl+OH+~FMX<2(swzXfnQ>46L@`~ z0r3RcCn;_%W1clI%O+T!mPKb!UdPUDuXU_gZI+$_eH|XnBbtn&lF7EJ2FZ}UhEoRN zIv_i_GdlMhE4(~$NGvj@j&Zx9P@lZ_!EX~!6;H|?PPoh4F}{zvz>;oV6(9!n2q`m@ zC0J3X^_>1hYWI26F1z2OQ4c@ zJuVfN27L1%U@7gJr~L3ofJv;|$l#Je z63&h-7!xgvQA@0WCxQ@SlFWAs0!>33YIt?-j*>0qFL2oJ#|Ir`C(wLn)R-)F;(zPv zseAoFtgKZ}{yAUAk6sERHXua2`LnMihuzNa;8?BPwaB|eweq3U(EUe(TA;do)E`k? zMny^3is&)u{w9<5@Sgk!WfD@H_=agjbhz~&HV7srJov2@$6Jb0_CXUiw9?dw{^QL` zNvhtC#Vk;)OVZ4HJ$#}}ZozazTHBp6xZNtfk)>aGc9Lo+h|4+TjDkI6(SN{2#b341 zWd^bTaT1UI9IKC&*ICm&F&PL*KnJB%#x!Em<-+XgCA}6?2Fk(z1GM_jPkWe5VG68V}@RVnsQc(?@iS(k=Eiv1X!8PbI1x&*i@}QI4bX0C?$y;KPs6 zv(ur{v6DE`)eVCXScsNsa|CiS? zZG`xcmbTPeSKrRK13wa<&jM5v8gbSbVoy+^lIvR)Vk;vv2YtmaG+<>-{zDqzp9UCU zqSLlX0rUgZIRFF7h`h7lN74sFJXZ!8Z9}~eqH=_ZW(ScBw1B8BB5?qrd@h~e*%ZAz zy;Z;ypsH~zN|K2)yARE11ku9i%`Lx-LpV9~3wq~D-;!=TJu%Z3t) zc1?voHs~s=*_GGd^aH?84&JFdQSe=9;MGj>6bLPq-;tTty{}O?p7|8;-FFFa;IEnxu2H3UvhgT5aCQOc~`G0vx2kM9q zptL2q20U>=w*oYqyc_{-?9eRUGTz$1q~xQ5-h%uPQX4^AMjEkZoHj|6P1d-uA;&zx zm$a|SHh$%9s0`{!?-?Gz2UMfwrjf+()fGm#LPps18BweY8c4KONPqm!)AYQPns2KO z1(5ZqNphX!h$=#ptOhjGzfF^F{JHA*ceMKtPHUPO6_d2lyfhmiHvZXF_lR=-6VjK@htfy?Dc-CWAgJL{+yeW>5FTYq_T(;G}o?ObR zL3G>kgoW0mI#ktI4J6jFB;9c3x5^1UY0mqEWN0)*TWcSsF-;LgG7S9WW76jH`*m&i z2fY4yQaT^?9eV+Xfmnbo(z`rBu-p@2Hm)!h^zeK*Va|aC*S1~b|AzsA9ZcGIq^>&F z>e|~1wPcEt*1{Zu)Qz3r>Bi!_=7w`Of;Dnu-`f zF5~UUc@C3#fr!|j`24|(Ih9#@yaXY9gy-*ApAna}TI7i82b1bPTn|{3M_MG+(z8bR zR1reSG|OxXSNJtK2o{&yglHbu=7)UjsoSK^V! z6`fGA#`)E=ADXHl+iD%xP@auUWL2_wUgk2{xW6(8fzg|q~szD3ANFiv8kQX*IoQxLm!rDip2*W)9F;KimXgex2^>LP;+ zULAUpP_8)zbykeA&>q;5c(l^jE0>cR(ElN%scre-pB3QpWW*L|voV*`c2Dn8$f3Ta zLgc^#a3J|vCZ8v;;T_%I&vE|m0Qf)>BC9sKnvN`sKxgqn#_X@o_W!2vE9W>SYGa+ITK1O-t?ey~6Xk)9%`UpS$jS4}B3{GA9-N;q zdt6X*TI{paV)+~UL@k||y^sA_IwUk{k!*nWUP$N zRNQlOEJ@nX;=SqLT7mF|>8p3HHZs;`Gy{5uTNgE zIrp;j^EpQm_ec3G&$e9FNS6L*v7EiT;)bQO&Cj{bTGmIpKc_W2pMII9FZp;=n!aZ7 zFr#m z_QY86eCHDFfV!yguWFVn+rM`Nm-m)5ooZ;C)7UVvrzIk&?R`v|=ZuBPaY1eIA8-CU z_IP508f^OYSsI~)$ZyY}tOR}VAy<|9P~1<$?) zRvh&!{Nc0oOhtc{TJhhGUi4OqfrMbf?^%0RE;nQ9{jPWWVQy}2(WYM=J#H`Jgg%wF z?Yby^;%7avK-ZQUTSRrp4;EX^;Njzqj}G7Cu);i9V+W7M2nZ zk&b!a>qX@lytq^}1g1C4h}7l|Vki_a;`{Bs>5S|18~^4gDZe+B>^*+hzHW7~Ms<+l z;j4FBr}g}7p6UOk?dN~njUQyDdTVZyys*$`wwLC+z5SoKriWGdt?JT=$$O}td@DQi ze)#;Q+cfnT&7Ze?{xjdLF2!Q4>YH!43wAlpNdI8-eCzt6DSI`1EdwlyB|evloc7;4 zWwJhtfCB>~gfI(DSSM4snCVb-uisp`dHrP}az9=#JY(^BXIig`eMxQoN`*&Kzs}pA zsSH*OpSykfpUP#YibMLfwije4Oo>}jxgl-Mo6k$!r=71_^{iofwZ7n))TVh?XI=N1 z{wHp0j6wR|FxkEH_g8B!oi5xbx=HOg{p%I&v`1U+ch0vppZ>Wx zZ$VFy@LqxP#b1tmF1`4XnYmcFXj-Dhj?m(V%}leJXE)z^T%EAGsCU-; zu1~#McUDO1zg6CHv}VS$qe<(Pb-k>U_WzixZ=Zg?=$g*{^FadU?z@DJv?}n$)?EyF zaH>|cFJ+_0-*rvb%UE>TH)?5}Trl*w)n2r%0beTWmu$qf$POf8$Hy)(Ps qg{;3>SYZn9yJ-bZ$W~pLbU^w>zuv|_r&1O(0D-5gpUXO@geCx%w5nqO diff --git a/mkdocs/docs/HPC/img/ood_jupyter_starting.png b/mkdocs/docs/HPC/img/ood_jupyter_starting.png index b4b4a8e87ada1c131ab7bf52fcd587f815e702a2..e3101ac867c24c668ca211bbf59eec655eebc4c1 100644 GIT binary patch literal 43663 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 KXE!F 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 Q<-bk_;L$5i%4M6q=l@q#6_ytOXPlG!!B{q~zDG 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℞v$C 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 j8*K3u%qKKe{op@CjJ-1|aZs^>bP0l+XkKo8nV% diff --git a/mkdocs/docs/HPC/img/ood_jupyter_version.png b/mkdocs/docs/HPC/img/ood_jupyter_version.png new file mode 100644 index 0000000000000000000000000000000000000000..8e86ca2971d1f8e568bfad8772c9eca5b21bc7b7 GIT binary patch literal 145109 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\(>O^^xid?8%<2VKPyWM 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μ>nDFSdk%s~K` z-T6F{as~o-N8UzYqgo?-KM_;B`_a1yHLmPsA-7ZGBE>?I5w<@Ym-3zgVxh z@Vv;<4Tcd1Lx+3tct1C9L`N*tTu9aFVLwm{5dMJ-4zwjPDge?ut~{>qvGNeHKvSsM zjdP^O?Xs$EPx^ESi-C|F3%YYn8Ee2x86 z)LTc&iPY1aSrYwts9JF}bH`Ftnqug=V(aVL%0E8zAyxCb>j(^q)M-^onX=YGrd!xP zl>tU?VRkYu&Oojegsp{N)%9fz)Nx~Z|I!$x7d{#Eca+#YG2hJMhR$>41+F;FzC-V} z-&P`)c0XT|Dc(N(GQ7`Wx;Ns|et7$zV6V*InR*vFm&o+E$@PY$Upt5BY%N(loZT>9 z?z`lDl#!LG6uYwJ_m3dKi|-a7N!3O;)oWL4<7;B*)-%3&wyLrftTq?&^4=*dQO!F@ zIFM3+8!Qi=4_oe0$J7fPLvh1!Hf3J@nCf>3dEt>VRj*R<_WunS*9TN~#JMqZxL9@)g~bfI)r12f-K{z(b~vYSXmU*51YGq4bj=5b{|M(}2(thuRQE2d zge)JnA>@V&Nv7m2&#AZBgl1$c-Dm^7pk0$Ng=MH;uGo$7mG5fjkTb+_1o;n(ZxNB_yu^>Mn z8`qro=kgyUIqM=D)_h;t)+d)LI~@=-Zv2(DNKNriQCGK3IQ91Tl$DjGN+G9guNE@vK&*kVNG^{Rm!&u=5aD1z{Zfozo>38p4)T?W zCQkoTp@Py)o9g;WSiLDO!0m9(N1>#t=bV`QpK1q9o`1Zpt<~CUkxIT=9pcf66?I-d zRb9KHLAU5I8p^U~?7ez%^>m~4Ib#xQE0&^SjWvL?GXYP9cYK5WExU>Zi+y)-ap@mv z@wo~EWqsca6s}#;ePvZp${X-vrGJy+=fN{uQfs3vE-uC%e>3ZakTE|LfF8y#Ev^Vk zWg4PpFm4<@Z;wenlk&2GeShtHwfmmutCN;n^AEtMfCx~sx~~uavPY+U$U`jAFQs@1 z1;~+HaTj$2W@fdo&Ni?en#Zi})tD}q+>dCYzXGK8B71rNsccXZiF@TSy{0QL*b|Y=>xIRr0+V)kY0b#VGpV|hPXQ6N4*_SMBM^cyE)*tz z$hi%@BKw7&adt=^8}X;ByaL>#G;tX%KVyofiWsI*%cpMTklOAjhpRXsb1=Rt_~uu> z%~HOvIxnst5)Ti9+0_045%C?@hcG3Lub}kN>y_H0;RTU=s>sWGa z2W>R>)datOU2u5=m$KIC`J6LsJ`8czbP zfv+vDe)2U4%3&GXJ06sXxQuXc6&Vj6)d&i2$3* zc-Rp%@xA%avz;)PCMubWl`A}^mkU1Yvmx=Bq|$sL&t0XVoPFZB7Sq_TD*ns3n++DU zIeAO1V#Fjqs)LFprf6_SCbazHK-g=(Nyr0 zb75_>XPXuYpJ9U*f4ZVzZ^4-8$X^}?_D653M&{o*!VM{@i%wajE;x`NXFs^yJoY3`*ada!qQ!R=SSHp z!4Cxww@9ME+k>&0xWc2oSRL}&+W>!Q5~>FA$>p0|uJmc%cFZrGS6h}}DZ_bsbMAke z*JLx|0@=*$!POGUV8LW_qt(KA89o%=Feo>`Sb#WP0F7yK$JilYcZ| zR<288MduNrwNvj!K=45pt;xuA_j23D0;j4}8`Nq)Z|?y)Vh~x_tgbE<*%jJgW&a3O7IMo6vG|nhyOD z_6o!Z={0cG8BTczDQWCCyeEBDGeDyc6Mc9AErMPBX{hIATpBrX5w6vT7yB~&NOaHx z%y(&V?IQOSSxuivmV%u;ZtCPC7l-AyMeqYMcxM~x-ewHn%a)xDGcC4jHHe6qmlh@K zd#iK7!Um7?IuTWB=&BfpiQ*{oWLQf|83{OlF zz884%KzHw3=qA%c&rWy-t+k7r7FV#GU#EG$`HZqaopto}OgOL z4+SfgIqsZxPj%DU^yUC|HURRLUg7T+(eN2*uM2yh^oN-Bf_;q}pHzNu{ss?>t%zFa zn6)*a7^<<_ia03e@DUj;6>1UeSyGklZzH#l;i|n${bXYSXFu>Ux4L< zL9(Ow5X8nc7~9nxpQULnKRMR9E6LyLY-cVvi!kPzMUqz+hgu(hiLxvs&ex}eu?dT3 zJ2@m2~WWTpbSKm#gxLfwDMh5wCMKdbIg*T8;7uen8B{jr4Lhv)f^kkmD z4PbshCK3@$)XOkLW43!|E0wcWIXr3m)o$|zhyeJLoWHB_&3sy8YG;Bc@2N(k*iXtT zEH&Cl!k5>({t6>GL?Rhh#b8BDJP%{(!gao$g*{>$CL4E4DGAgyV<|;HU_cKExvH#$ znnZWzkvO^-mfsYFf@M!IGQgjDIH|@_1kUHx+WsiQG-p01!<(O;)kiNZfZV>~%%$t` zG+msm$4FJy^f;GY?fpZhMq^;3WEWjR@T$yB>GaT1asd#Y{|N;67oRd%Sjaop{1_Ux za8K2AFQQ-5i|OSq#O0l;T#FNcU?re;{sFhPXW1Qpb;BCAx(IGTghF@jwGk{Mp53XP z_zj6lnuXdAMtyt=rM?-YeC|_gD|_(#<_o~?`KoPWOv}=jJ5b?2Og$Zkm`*Xf7@jOpS-Fi&3>jENJ&|**uug_mwP_qGsp6q7#b< z>JpSK3-p|NTIQgam(+C}SfGot!;CEyV`CinVii?CFgvlwF?+vK$@BwJmnfy-%@vr* zuxk*{qU%0;o-6A8Dg9lCP063<@Yi~7dGJfFi6yQvC>Yx+(lehdk0-0a_{Z<+V|vt- ztw+%rj7{Xn2gy1DED>4Ogd4PmN#E@ z*;zj&@jlYixI*aK;yrl zdp>(ZGrLfrXJCO{*x^_q7^j0}=QU_M4nz0<1Vv`v+?$MWPD^pEhVH8CRl)6r1yFd{LsXhq$z zNe5>t%UNVUMD{y;pKtx%?DaWNV%fhs*D|4SiBM&IurXbX6e|dcAZR8VDLdzFdnq)> zo-h0{_tO<6SX0TlDC5^txA1q_1(pmOGAQ z0JkbOMG{6rz44tUPx6}i74F@r*8A0{u8Q3U(!EKExPrgv5KrI?px8d2J9=uF!C@`G zge64lbgW>q=LokDx=sj7038J%zLyYIPsjIr2(BwvPjQdq?p#-ml;w0MaL34zWIbhg zyj(QivVGu7!wX5tygM!eOsh}EmDsl8>2y35MV7u|o6E`y9xxpHj7lNOEbNu_W&(H0$@W+B~+EbC~ zv6?gexzW$5Bd@6e1x%I;C=T`GR}RfvoL~u+vs%>k?YPJdH|s*btExSJBP}wY2CD=R zLAae3Bs=9k`p_HTyNDZ$sl8x8#$MO8*m4pJb#!iA0bX5uysho+^|7vj zy{q8+_t0wQ3i*vmi|{ox`JuW|(U(mm8A!;LCCv|D4Oosy?0R9@Jm|#z) zc|e>HP_2Crdo_;R!9FFSvo9zX;>9@u9_B82EYmBR^VO`f*AJ@~f_ClFbc0>1kJV$i1pyX)EH#{i`YUA7VC1;l|rO0&Fb6N&n9ZG+A7V z5x6YYmxeVS?DTI3ip_meRPwCC3V6+PH0sS1$l=W~R&4=sDlim24_Y~Fv$@H<9u)ZB z?7(ZA^U1dUp(YBu*We&HpYg|=Vn^)ik#IpYUH`giACNaPzuUv$00ge;x`LhB{>hHq z|4C~L9v%jbSAQ3rE;93LI-zVVVET6w{Oy~raI?g3ZPqxfthenaFTJ**jiyBNg~M2K zKveEqXieMdP6iQAt0k;B>ma{bCj54HV$%C^;tkI~ObTYo`FRq}-k6B;na;HT6h%Ti zUzgOsk^g@$R{wt<-T(jNKSHa$dc?8MI&qKUH(%HK>xhMdP^+8&+g3(G|Ag-N^b$2p zk(knkRVMKz zz`AFKuC>gJsg{s<(x$6D{oZ?nc3n=t0bSdd9xoRb9Uto`Z^zod*o#f2_;SBPo~d$m z741KBwlHFyBAA0EC)vtE$yo}gU>pbDuSN-yCn|kb+FawhVM;mL^}|5pY8Np?letz% z9PN3VCHa=}o>>~?7A~kNUP)h6L28LF--1TfhJGE`qIR9@*neJ-Que*~v(orcB#^=x z2zkD-5X=8R^rtBCplb)eKlzCFkB-Lb1pu;EMp^`OaK;q-pDkDX`58|?=(a`i@A&zx zFP9YzSAG3Y_^f%^{?pg9{t3DMnVHc51wu)h^eskK5?oOZMu1_|X%to!BU16H;(^=Y zF}&Fg=E&qU5{yXBYH!_=`-Zz-!&(0*=LR9Jc=ahE90d*cpQ-=b;2Y~da+rs zP$}-aPNB)eRzO1qmE0_Zvzl5@ZHL}NM@10L)Lo4MBTUe(eU7)#I;!|-aNunk0GmEU zU#@_t=n)SNvZCAcn=v|H^a*3cn#YX~m7XIId>MK2-P-#>L?m(a$D|-9eYnvR{t*pq zF^^ExPF&4&8!)(O#w=9sXixv(Mm82Au}Ocv(mA z&OCF-ZadP#Uz@43$(d{rK1)60pYH{P*skz^79-jVF9acnNpT*?rW#CY8mdn7=Z?W`yzZK5Yekh?djp);3x* zAGTtr5=Uph#3LD-?woo~6A(;P$TCQc68ftAInccxGg?;#t;hC1c4Ti>SGx#*Yq>e( zDY<>WI{6H=^TCtL8Wzm#w!`a~U-FPzL%d|yZQ2|zk*1`}v;OQ1)i*Rci(?wA zl32`V9K}xy+TK>k;GY{Z^TL=K>#sT!IKbW~jYB6+q^})zRnps5@Liz^8CG|6=fJJa ztSZDfh>X3IeboMIT|M}-$G((EXpfws-^CDGaTpJgjl(J`Kzwc887i5zyP)npmA0SM zAWdx7F`$ySdxn4NQ}EH|0Ic*1n_ANWpJq9pculf_VEJ*gCC93(#F508l_(y{0g+^G z8zJ1dq-mf6Ox=wW!b_B-_sg22zR{=2V%L!CvYe4G`<1A66FqM9sxz+^#2!vvz+VZ= z9#-PlX5C!Q$jaVi4^gb1#USzNmrl)-K+RK;Fx*!wT&N0gTVXcS+K8kb@)eNVRdHXC zHV{=m?zTxt8l3})+jd`y(FFFa5_eHv%bhM_jJ&i6_;z$EsEX)5u-$d+b@PR=Sc^6k z>#9M4=@Y+&@Mga|3QjoI=U(l0h=pSC2v?o2P8`(RPpxRtO3AwY#714bm8Pu1Y;&0H zM19r*hKUMO(5af5-lwy)-b!P+>^1jH&XKnw+DjNJUk}aA(IeY21ed~nU0Fx>cEI%s z#bzO&Kh%7Uzd_h4kCU9!bXGODl1S0iraWcesHIwbLgyS%v?kMx6Ew1)WVt5EGW`lI z(M)nu5BK=zYsE4^^QhGO}(MmH!Q=ZzX$)ogy2*bTfv@(K*V+f!U(*0Bl2)%@bF zBVOEeQY#?1INRUgiJ(QdA1P&V`a7rQO3jR7fEve{!~L@c*N8di0sx}s0 ztF>E9g1grl(sD0oi45z~-SuKZ*S*|}Cd%OR#yorOldm4@PEG(3d(5;A5Ge;*)DQ)! zovQYSFNcx3FrKzs3Tf2zeXC<-%tjwFH9=D2_$DNuIeOBbWx^X=d$pu0#?iE+yU)65 z*tkta$^g&1DOl(Umv_)R2zzpPtGz4wJpRq_&5yua4mxH3IGo7sz zh^LL(m^Yb9zNAJpXR-a-^w2)Qhlp!$tGQBqT2U>WkOd*qTy#~E6DQK1^QUf?#oVu> zDpn20E*cp%gp^S&JGzvJu4WnzX;2qvw;`TGR4FCh)Uk6Q)lDGRYg<9?NN$_*m~F%~ zvL!&K5@*vL6`Y@?E+%j{3a>vj5jp|zu)!zn{E*|xswlsXCOQj|V@@@^Iao5VfU%R} zRdYgSurcW$ZT9yXP4_RYx?|dRQLcPJ^%SQ(k|z|Y`$##^%xaBij`S%|PcREgnm`DG z+5O!&E_(?cS8}E8xF%P#oFXO0(D%qnSa5l3gnQur}PtHgV(?e>>O!) zT46)}7^L5(xY;FSiNEtK4NtWxa;R5cOz5!=Q0C4>sMN;?Tof5ecx^@La*A!dR3smD zdgYb0HwCDrzwjGV@eu0RaWfQ0sqJNc?7U-(=*fvIBJu1~)t08V+g;^X`yg#R8qFw?q3hI=X zXpEcXFFfo;4#?X`__wRcMJ;T~s2EmuuwHkTn|%C6S$|m_EOk%ww++`d9rir!r%6|J zU!tvqCwhdu-D5PcQRRof8r`H>6|pNZ`CX(U=&aq}H0R1eBF>LFfeR*#7SjFQYGH_L zojLGJ=$m4)7qN3BGbi35VJp6Be(2^&JcO@~M*BE+cP}{!Ddr-XZbA_g0@4e1> zp=5AKl%W3J?%8!p=vp=ceR~Ue(omK$8}{k7nK$W2xpf9M^_bY9g;rRfOW}JVl~M2! zw;R#Cl;!uDUgH^4ci`Lg)Fh2n2LChV8_suC8Rk>jb;p9ww zHgF^B{rl{=&kJ1IKb^hC7qh7G8C+Yj6?@6+Gtz45W!c;|??Z;77d%lhsivN|*Q|9p zxM3c(g9cWSWl>r`z5go+Ue5Fp3|3Q$vF)b@2q$5J21Ca#o)nl=R6Epoz3Cs))O-`~ z{c=s_=-P)c<~QkPJMd5nDzzc7oWD4nS6*yS;mO4~D9C!j9A5ztHVHSvv?956W}6Db z1zjf@t0JEBrxb!L#qgzXBK~7SLhTrGF|POe&}m(WchV{EK|)>D(gz^PzV>(z)XdVG@2v!vi~7=pQR7~AVJAl??8bV z*1YqvHIYjZvazcoa+pmUD*k0tCmw_L#_xQ|7P(EX4rHLHi2Brr=r=}-K7AhUi4*)| z)+oZnnAzym_U_2OJB8?m_~XZSeo5e>bK#xk_viU+`jI;c@JXj&ePN6TiguJKg>+;#?o+lbvAQiwIUqw?@I9tmDw&Vchb4iqtk6@ zM0e01SQvP``niG(IAi$EBJQ3ttw1rS4b+RoDqFoZPiTt*m#bbzx-V<|q?eCF%+BFT ztxeL#o*QkIDI2}pPu-`yBe$*&;nZxOy{g9spNM|Z4uJ=j60AlOt>4fA+qtp+~b zh27tW@DI8PUZ5Fpq+YgJ^m~CMZ+)+^p9+;;+=gm*$U|?@znga@YOHS4U7QaR@fKS@ zuc}>Wc)BN1XG>R&P+hK0Ek>@Rt&DhiEuTCw&FSN;yKkA#TvOX~cpW|tKCTXcPKt*a z4JRrmFT4_HbD^Fo`a<&A>kib_S+OqLye=!A`c|Ga;V~A7w3G5`_`LS@qPE?H_ay(; zF@qSQ^J1hMK3@Jgst>rA4mGLrY^G%L9MYNxWS@7H2qq#A)mMJ;Nya2&(hN~BUtSM_ zR_^cz;DP!d!yTM;~?l;|-VLcc@Hi&nt3t!~UQjy9YrZkI_9j zPFkMofkEYTvj%flq>!&NF0VXEFdPfZc=pD*Ka-ix30kTAV%0Lwp2*ejqZ{#hso1^r ziyDMq_C$3N-;8MGvPv0TJu6JO(KUXdNX#k9&eUy@Y&D5JW?q0BgvCI1?o;GF> zTeeHCdmgo$;>(RMPQS;MyY&l--*W|@SK|C=AMcA~q_|k3uWhB~P_@_gMHAj>-_g@D zTpF{g65xzxU39h2(wrT>z}@?;a(r$xKY$t#6yN2@+{fio$tP59Z0bHQWWBT=2Gfl#EQ9-K{xz}|}*G?39*LpPr$ zalTU5-K?pe1WFF*NRF}UO)OrV*)s`r`P+1f6?*J-Zx&l3dC%*Wl~8M+jz4!yy7^Ag zGZg*~qsB7Vr{veEmfaBBGTrN|wjEMOvH~v6&e9vMgllH0L|y+(-&VePCxsMSSVsxC z@Aj`0TQS5#vv3ib?xFo@-yKzqo8d3Q%mrv1DD$=5>^;+J`(w_=O?yCGtyGpd3}g1soCts<;h<% z#Ez1qtSiD9{8~7fJ}qMP7xY`xwG%CguvZF?XRZ4$*u`fNh-+LnOn^eIvVu`okbR@E zHvg5&a=0}B?xzEKK~id#22$T>BvhR%ZoUZ;j1lp!@;dLdm`M597i!K4JWn6FwX6q2 zIY%Do4h*hxy|NRLA@O;X8VE(wz|1;Jk23Y?qps|*Ae`B-U(lmyYLs!Fz19}$_($76 zBMCGUKF=PCVRO4(PhNFkIxTGNNTKB{x0RNt4Q2}TJ_fvQx!erp4q@CA1+a$A3qoj1 zlYf%iJsixm&-6gL8<*}YgeWrC+E7b0Ff-Fdc`@Urt4P^gJH$_-e{aY4mxI~0gU&r9 z9$OiUW~}c_9(-iQ{Um((W_zFElH{hqx>nN>^QHj(5yg_Q$BSM1PH6)?{mJW|9J{(2 z{2zKj4}~6T3NgKV(-kzuvQZ>2KPqIJ1ti^oOl5mys?7p#_o$_4H(>?nu?d}!RMx8O z-L)&qKz5kUr;);3lV#-^qKJ$VE8omWmSetdX^y%`%Nlj8w*#3!@2eJ;*MW{jA>22g6CuW>vGV2T@DUz(}-cK z2j07B%ywFk0Pe>%ZxhAi{od}hqM@+~IH?LOyRE9>w*i2FN*;u;P0Y=Sh$BLy^NS6N z6d%#Kqh>9-8uvPFFJfhI>fAG;E3T$skLQA8e!wJfBl_287_vTcO=N>E6hZ}GMFFxc z_F1HVj89#&rhbWmLUB6yvfrUIMGn$#)4yZ=$7^iL4;Iz7XPfn14$~t^)nP(QRi<8!XnP)ajNM0`E##b<|i#4yXSZkK~d^|t7E&+1y4 zMZzL>)I~kzk#7K%Hvo2aXosSMwk(-8Y#dpOxLLkAM=;-T@+dkod zg2|IJNuB*Xl`l&7Wo$vB)m|n!GwbSY!d~+#0GQ%L0*0jASdTf2jn;SfPWamaI{{$} zeAy&{YlM$k>L+U4(~zGf=fSIZLBY~X>uF1ve)>3q|EP;)$U>(xaY*TWAF?sYJ9LiB z!#$NTr%cB2xZcHEn$9i2UFB7c(ua>6$v z;W&W~b_7P1D_%9O+=D@-0KTsv39|#*h1d5a_rCaN`bJ^=od|rW^qPr7U91a@k!$LBdlfQm_8rURNY(Ojo1hesybbz9z_Lf*tVK^(3@^? zcRM9Ucvl4YP&RdVCM=Ue>1;lBGSLgjt)9DOqp+Hx2aZMr4W+!R$2%2F1sL&cUa9V& zFGId+S%@$ZHG)eE#OB|RBX(V}>#&N0JT))$1&(lAOEY)5{e zK0P)b&J?kK=DWah*!G`jnfA4prMRI3BFl;6_E$~%h3{qY_UjzN6P z?l?;<)<_$R=d!7&fq6)TYmfP<(087|qghhq$S~saVb`WG+1U|lFMpzPfzxQ(+`7@E@}Qyi-fu6i zrNwg%!SxsLm{zJEBh6I0!%kDGA6CK6CE-rmYR$A(IXRr7v| ztSNvz01V0xZ@}3)J{)gHRS8e+LjyW3Y&0airBx|EsQq{Uh5rxR9=x3#_#zW4Ppb8^YbJ6kBXJ)8 ztPv1~%v#jRxE1?fbU+tiYMmK`h3wtV)g@l<3DCf-1LQXU4Vl<(Oh6=4KC`g1;qD?9 zUj3i`x=chH<{M;}vIS@?k|CA4U_4#Ui_4l%Za4AeSWyk+|(H~j|R#3*D;4~vac-N!0xueI?|R+;J4 za9Yl}hl~D?h~})UfV|k?(2$_z3Bn(Z=Fr>-JoLY|VXrm4!XE%s*PVm|>e{^6#_GAT zys}dF>nk)fI3M+gfI>q#mlqsCmzZ!DysDNJMC(47Xj>RQ^W&a(xQpPiTuF#=w=f6sa zxR3t<;<{5mr;fgvkqPYo{OTY2@@;8lnZ8}~+xP#4X?^|a|Du-p?~ndpe_*-=XIsBu zgUgKe9R=>S?zxNzOjt8$49)pZDun55F@@bAEsZH6w<1Bj-U0NTXF$lPZMU-F2VJ&e ze&ZvCKN=%YrfgrS;yccg)&do;4HC1qH26CMW8X*e23Ku7D_$>V>{6YaIp;!|>!XCJ zV;rL31WM}ijOH4B6dgc2)LqPFf^NG5hh}G+L1&7)bRuCbi4q$2YK)- zsuN)pkB$$k<|CrSa{!&#~ISirWY^6!N)YX^ydw2?U zk*E%qKiQFFzZ*l6Ky9WjNUm+-41XPdQ5R`QBIVfyP0|0PTW5r~Fd(pms4qBVlRl#c z%B`t6661BYKm3Z158^{2&z>SJF^Hsi1s&%LESvb0q_iQC?5EIXWYfWr>nW1hdl@y? z?I768Mc}LRZ%Ih||EcC5L-Cj>DL^RA0R>8GopcYlS|$*&Bc_IivIA+sNh3LOU_IM^9#0YxwDGh~Q%?_L@Bza<&lr}s;owCy!q=Gi z-bSXiVguR63X_Z*C3q%q=~HpRuJ~#cBDd~-Aw z<6`)yPy0N+PiM*s8hlkA)|3J$;b8e?VE+7#4Lmre3CB*Eq zy>S@6{pJ9Q=8CTHidLh-@eB~-wfz~=6UCvfr`J>L?&#$fpmLKoc_dzVve{_st!l@m zaMEZzYsk_w{HaVx4{8nmqg#f4cWe6QF!+V<@lK@NoNyySt&w0z{oHUlJwaVgh2(+F z#G@b*1f1QVHHbj4gkdx;6!t|t(!e1`y%q+ud#M!W$f>=TjPqNJPyWLbadRN40q%%| zZBJ~bN^2DWV%=3~Ee*h&xUe+Ev=nmYSL5k&f^2J+4Nw)tUA9W^V&8$}o z%IW>E9D*f<%Zm>cb3t_n4N%0d7>cJOCAP*vMfHs5m}yUBr%r1@W`M6pK`EGo3_obn z(Z7Xe%=1S)?UI`A{7paoxDO=9R3+KFHV^8s& zwD7R6oDZekn7;=Kxs7VK%ynX; zLK%03j>*KkQ#@!D>7(7|H(ZT~#m2-|4yZMVG^rAIyS5 zM^s$J-YdT%mn(;vTHM-eP0%FY4YAkfz?l-0s>BI>tXnn?cPJoZQuvd*7VKPLBqx-ZEQWQnqu#OI2DZ3!Bg}fk zAfx}YdwQE{P>X*dqrsqug|^Q#5NWF=&ORj#rDWq1V z)rZs1!C0`Cb}suSIu_8808)pg%>VlNrtASSxwOvbF}QE!w2zU9>eUU1lL1#GdKh7a zwZws`@#RB`IsL)`KpiGLZkK~FX$ZTo(eTc1ANp*_045Jt3k1i0&`%e0tWiB@;l*sSD=o%-fNP(qTe`E)aPWmkctNNtgMKC=Zw z6Ix6E6_6|@4Egf1LWl%vvO&5TqPnOwO>kuA8EOBMfO*T z^5dN-P%JA@`q1XvHMTyYf+(lvB!_9ywJ!n6q>GD?9p3V$gd6!kv^i^!I z9QQ2n+ zuhZt97s>9>L^JEjOuk%6G%N}$#CE>|E`Ta7AY@9*Y?`U2#WqijQsI>#VjpP^LNqFg znT3gTu3aO^qgeVp5SBJE3WY_K7-B|mbFdp6R4N@~vv2N$gPk| zna>S7+9gNseGhTTCoc|i5?TC}u!JIqanL?$%Gd>Cbon6O3f0v5g(b1?2v6#GLPW&Q zlG{a!D*YDtC|MW@5(`b1+#ROzW3Y1w2u(D6)JYM^ejHje=Biv~RXGBGytGyMgb0S_ z;CF$}P*4wNib!WB6=NTxDbO;t6w@@ZU{Q*$RRMdLNlcHBhO%4Hk#+Q$p_|`*^+bxg zR*DIPylQ7v#-B8__#V*}frqBSuVT3G!)rh_un+T}Zg@rb+pELEo2~2lGIA|SVaaSY zUbroXmQ?JmRk&=Iwk(@<3(;rG<E6)D&(kn`3Y21Fx) z!&bE6yyTB^Mb;myl<&`BEd%~_k#AUv+r*@b=9Rs9;qlz&1HZo~s$Ytcp>_|qM*5eQ zwF+xkZu~OsDd>h`@PE9KnBDAEvjx53U;h{<2KTSPmqb6EWIKGm7t<%d7k1Vo(@-S8 zZsD*}>DYLWa^0k&dUgcCGeXuylB{1G7mHH*v!_sVBoFRvj-Sja-MuWp%DkZx?u=nA zwall%Xp!ELN2RkKDgL& zPAiMDXDPYwsf78##L1y<=AkF2N5Ka%3O46Y6O*1DKX2nm3p%?3JwkqiALAOHhxx`i=NqPJzsL37l~4u=5X_B8{&Lin~L0}Q3#212mkVIc-RSlwE(3Zx}WZ{7{Ro9Cym#!5= z9hh#@%X>j%6rZY{<)v|a7?j5K43l?9r`Y}{{lZ;FXhvs#HlGG?I{nB}~(iHif` zt^tU&cG)%acm22EzuAvN9<(>zCqj|gc#SN-RfNZR?C)eHym8lsEaPQ`|H?)cKlcpQ{yoP8J+ z5Zl`Htou-W3WOQ`PC!Kh2B~!5KwkwB5YM!2ehZeC{|*!FsG%nB@?mXyU9ac+7_8*?k{-h=)TtHfIO-XlDMhVJ~4GAM#C0+L>-{R7s9i|0Cw% zL8*$@ofN9#c#4xw8I3MM* z(wi^WF`mc@*x{*5YIqTKoF4wMkLgQu)BCf_4S6aiD)k)1aJOx9md1j+tPd;LL!C~rk1F#$ zg)4$I-){#=+0)HoVRg3~v>&X}irjiRGYQ>|HPiVWmL7_>T_|3?+v7g*OB193Lk(JF-*?sF6 z=>Fbpk6i^fCf%M*(Bj>kbSgEl417d=E^2PfbBABsG7rt(Yqq@8gy3pF=(aRh&M7`M zQa(SHI^uQ(yXDi@avsGvWNx>Dbq{iSx6uVusWtF@B?l1JCu_^ws1{%BP`Is_)4F;6 zgB=tP%zL6X+zv5_ARlAb3Vs3J-GC7jeO7iUVNWwJ;y)Tj{iju*9_Re3J6Y!=^WyIc}yIP6E z<0h_pDSz|K!l(OL%K}OTpa-iV62Eam`7Zs0R@O53w(DC{p6bbTHT488k%sUi1T*iu zU|N2Imj6CIdDV`f4LvaPo$zr;8fgV9m;Jrx+oKb!ue~IVK8*!kYcXcO-z7B)tE61i zQB-|Fn(BFwT21oO+({Up;rE{iU7n98BEEP$obxlp>)nDm{=NC|vY6cVEr#f&hXG&? zlG#v=^^nCnuQ`W|{X;X`n|*1Ud4=lhgaPdv3=9JD(w(t6yiNs1fPSIX!>04)nYqG> z>AYhZA`!Sr@<2=U>BdJ(b)G9YOLdBl5qKAh`6?~~=W2+B{bwkpDHY36etd>KQV4cD zJU>#~dF9c_)L@pEFi_$*{}=eF7g0h_aLa2s z12@e{*(3-|(VGhjJQfrdW?AN~rzP^v9dC?_AOmKD%pQ0`meBK#z5eLXIRl*4rDHgR z2QEO21v-;x%;yyIuk<$+b)JalN;;J1Kl@65Bw@Hspt`9q1@o6?6MiOIucn1KUK|G| zWo`G+zcS9TN8DpxM4H!Ic%cv;TYRD;EB|pYfNatSmKZ~||0zj1UlM(*#Yx)}E_{=i zE;H2&=EQd7kIRBb{3!OBQJScu#?DA*^9)^8QZ-QZmNo8_ahKg!bhIP)utxiGZ4-Nw z1rZ`V{ft~cEx6;N9pP?U0@JqmAj6`Kjo~m>b^a`iNJ`>;`>&TqOmUcs4JeBh7^GgE z^FhgP?D25Zmfli4fnCqBn#MV^CB56J2`ndeM_$&PEfg6hQ8>Er zs3HetNG-Ms`&MD<^|IzM4K%ni zcK0TL1gkKLbS_C&)>5QhMb3XKD{L=x5WS`CWBr<&xu0CvaZ(9QXzU~aNbYFNL9+`J zl9H38u*e4G)^ofcUZP8XizXJE?ZH|rxt4HMd^hJz{>N1tDh%k_4}Kb$KYeJLas2Pc z(0MaMg8Nb5>KuRvY@&=hzflsreYDomb$8P=(tpYf<471}13G)Z#7B*e6p19dh_qp) z_oL`)v{yu@Etcw`i823Q@dZdL!9b{OA6>*!-QBJh^$$NFIn8+?-&Vg69dJYmEIU4H zJ7`@}VoeLI*mRqV{Z|?0wdmsqY(qEoLweZUcP`9Tb-y_jHD77jSg@WKKv(BxMjqHvaRD0rsk|6uPu!fzl&T`VNmp7# zMK-;Iln@2!O?pibP(W!)@1eKQTc`mnHF3f+n1Y-^*V7pR$cwtOejPi~nnlXBO1t?eileuii2WB1xrktqoMJg=&j`#Y%K zj|I8n=UqIru<6t0G@Re>W7NKz++PQ%UmT)q1b$h5yLk~}VS$Sk7yKW^%9GO9ers7? zw-5b?Cgf7X>*7I4HJd9<4x$j4CzXb|-Th#}?peC(e($ek9T0f-hP&!y=zcS4|52vp z2^A?yg>~Fg`(6uBSb+t0_6F+%+rg;)g*z#soEXT9DSduBhoN^5IiksS5tMYTnQITC z*5|3@eYK@IN~p6y#M%EGxF;F* zH@7V!E|u>=3(-$hrr=Tyg2YQP23emt-)K=Hm9Pti90Ffe`^k^u=?AyQU)ZX9q;Csx zb+#{wEvQQp=mX%+(#m9qa1p;m^MPl>fUvYGs{6l*>R*(bnO?{xKRb zD!N9Q@W3w6o<`HqHM*3-B8z0V7X~JGave&G)5uDE?Q-$n74^e{_I<_4#f3nCePg!| zEY(e4zTI1-z_iFV{r0Uxd|ZJ!{@XT~#vuyu+_1~#{#q>4>eMZwM`*v2EC7VViO9QT zDIcVbRa!s8SRKVJU^)hr3K4H1U2?20urzCPbCd_=7Al)oG2M>?iIZ|>2uTAGcUUrL zlA8ga8L4R|797p!pSH1l@xIdF;W0}j^fqto*#vP4m&bjxHYeBF>n{dC^S^CNo3SJX z=${543ku}jXsLlgoteVjmpP8;gAWc>Th9jF5dLb)SYm@hZ>6C zwWvGoj^BNr@6RORJIK@kINVefxq|$5oi_mNx_L$@?5_JvV{7c+= zN5T9IqoGkT&t{M4IX)+Ufkftu**N755Ujog-Te_mz^G?Ir)m!kOQT2&dG~ zi?{wLYH>!326ClX^Sm~oMd8WeU<@|54*R@BsE)~@eTB}6j7P6W#?kC=| z6T!v!pbodZzJPq$H>wM{E)rRKAM$XhbEWII;yxGzIiWv7<036hPe{>kg90mr&Waht z_)oXtWV=_!C-*5SC-t`gWwx@quhtGvs65fye7{t zDy(W{Kfr8do(T5SZQH%Sw`|#3<%KQJ0x|33dmrpR0cI(Nrdug&_DW4NO@!q9B_XzoyqjJ_yYx$w6chJa@nTziCt#!HjWp)J4uG=4Vcxr9k z9uPcMU=3E9B02mqHR=Zq23@K6ew1j>b+^v{3cBZP3;7)*4YGK5g7}S`4e4s zkyCRf{ejy^gmUDuCTe0bcfKkdip?8#3Bc448~-4yxEeegn|B}En7Q{VUqyIM9!2yl zM(iJ$qnh8L>ucXRj<`K$Xg^6lY;E2E{+4`qL+#`x)c3vv>=k28@H{P>Ylc!(-0js= zAcERw|M65s%04=e42GF^81VJ@H29><>H0DJ%hcP8p!J%w4PZdlZXFou4*&S$S?^Z! zbKsu@BSgw|Q$JB{vO%VG?R7-LWGpSc)=X6OSqG;VeA2W(-bJ*^rnJWXglQ*qn)Y|9i(@hU z1BEcnTs$eo)55c7BD7h$+gG8609X1hPN z{OFlxc5>mM?}r8PVwpwtr|i2Q=N343sv^BL0nr7g^as+tjmOa}q#nx~P=oF%IuACj zVOiUs)>A801T6~oA<;eRNKe2)sh5D^I)GYtA0)ntFv-5zYc+;_Ei_!yXhpmo|6OKX zZMLl5o_~u=P{4~iJ~~cp^-O@lV|*lSuZAZQoP2Kzwef^F#c37Hy2Zt9JA7B2IARzZ zRzP0_o;7{9AT;S4l2b}u*bt)^#Z)Zr7I`pq`32ataqf#WMm)?vijc;8^oHQ`;g0X0 zihT~d8TZ#4zLlT#gSgD{R!;NV9|wPCSsrPf4!`vE&0KR<7fH{i51+5^`=erO#W$+Y zA9!DhYv=Nu?yFrjOw7K~uyQg4F%hTipZT*!y?bT8aNktm0RMI-n9Z2^ziUX(8nq^a z-=+@0KWu(XI@25Ps5<*v+{(Y{9CY(xa6!gdr}TC;>WK8?H#r_?Uv@di%L@yhI*w@T z`>1@o#(6J3+w9Ns#L3|qi0?J8P$34gQLLw5oPTTOvm_8W5=F3 zij6%o%=k298)(%N_RM#XdGW+oWvXx$YMp>{7Tg~Me!%{e2=5ZOdvEXQ<%x+EIImT-`oGY8=1u*+~QF6<3a zS!@W<-Oidawljj4<)AWr}Ro(`>C=g^QoC(!o(mZ_v`&& zi{=vcC|+oi1VksfdpEB?^!!#)o_Pss9KG`8zUK+E!z?wir%EcUL!Fge@)Zyoj|c*d zJG4Utw?>}DwUtQaoNB-_RrhqNTJMRbe~;RWGvYYOpFIB7zw*rD(Qw`NxcS+m_8kAu z**$R+qH%JM`o}GVOOu4|Ycw`LfZD(9+aCZTX~Muc8?D{zpJHaC6p2w{+aEs#Q1!FB zXWk_@rSw`}7^)e&G&E#!$$s?H_G)21E5VD2i7FCii{dcSG z3sSiasn=HdF?ru?GjzfueM3G9D>8^EFbJOxw;QR~0iw-Ue!h-W8_25FCDiF7G7?5rb_3z%@Zk)D zsS%UOJeD(2%BEx@10Vjq(B>5-pj@6dUeChc?_?Tg#!6r@c7)%yzxbfAb*L*5qN`T1 zdq3-e>l59?UXV@_!ioabb;wqLjQfo6sGt_XB`cUYShWs}S6CRYzVX{DbkWOU$F7#A zTIa7Pi%ljqj@&B@F0!JQFZ+CQX7WG<+$fyi4m6qzRpt4qmpt`YF!KjLOQt$VUj0UQ z5LN#AHj;C<(3L0u&4zD?t|o{5$eREbY~gDpL9=^*TX@V}ciy-16B5joyp<}@MY?g_ zj9}QwMUQOU9vvKS&!g6$2%yixCWsFDLCz7LCnKq+2-y=Q!EXH9%V(l3z`rhX8S^!< za>&G4iFixaQ#?z%hz&Lq^}bT)^8-kGhO@iG<}{mT;}CkU+- zmshLn#-cC@fwp78N|lhu3>v4)Z9lD-ec(Tuv<89pPD=32Xt6s{gtL@ZiAzOZy{`=Q zLiViwsb88YqQ7zH$cblU#2oG_i_}W$zmD+ z(EgEmO$9IRL0rOqUgP%cQrQM(@{Fr!0YmJ+1gx#k0%svyE8gy_3;Hcm43E8fkrWPGNMMC(Y9L#bPx@zeOFNrC>z7(mg?G z7c=(n%sB>e>K-M1gimjn{n@(BQYv`iBG3+f{|8)C$lI|GVoVT_kdtZX%6V{6(5iJ_ zT4zpD$v4U$?0=^b9FyH=F`)qNFNozudxR&50d8`j^BpzAQUHNE~-t<)0 zaExdnUQ_GLm&-Z&i0CK5>0jhcYk&olB73 z>{S2&ovSZ@gxsSdXJ~7}FTxAOKQy*V#r4&KAh?HV(x?3}1ug%WCQT`#3Y- zzK%Q`z^ThmdcsM|M2#}3#mni|>dhZ-g?s0K-@TYQ-Pd!?$eMXl`fkChUH6;0gN7IT zKlm)zw|R{6_NnfSZ#d?3Ttj%8@BJ_8OC{hLuM~qNd#g=G zmpBQ)NHHzbukO=GJox<0G%f$% zC`#PEu3g-!DfK8+vs>{-&@1NZ7Yj`6Gn_PwrP+7#G9uz%27Kc_Y!Wu~FH{*4u&}Fh zpg$Ve|1Z?}!qA%naz|HKU}N>0Hn0Y)Bhd&giTHR^wpx+YmRVNx7w6(h$9++8leN;v zDUqp?PY*1I?JN6!ekU|)Jm=8p zD^`Y@*M;in#v*U5E|SVxoNNOF0&MM$7)Q6TCw|ul4=21#Oib{a;KnjD?n*-W4ygm> z^sPz5>kV0AgIY}QfK>a8Oq|K^nuBLgIH_jkYLGSp&__KZj(Mgd00u?NR-avutBjV4 zBk4J<9e%27?gKnNFWV)h#H+V<#9~KP&sM0;+r5`poVWS&^LNWw18mpCkH1?FBA2}bUYkyiCQOX$F#P?sRv$X2Al1id zLxkV(c!;jhf$mxjWZgj3KKa zD!lO!0>u$l2UQO};xxQavH)0AQ@hOHFMfRG=CmU>3^ZTFsPvOV)IQ9t4szW4^yz@o zk-uVNXxv##$>uVqL=$$nvg^}ibAc^;JYiRz#WDy|gwh+aWa1^V&Hm|)JnWhNQ?TZ| zl}87wLN2+wnu;Gy!H#G_;}s|nX05VC`?lL@`r6qqj+A@mj<_H+cz~WX4>UpN%pvO3 z-I(v7kB_)&#}^MLPs-413(mL2HtyH${QQLF=5@ehb^~5G;de%z=8dOh_bk|D08&FLtmL37+Yh~mK(95N`|On2V@zJ0vs=MeN3e1$ah!OXb=MF zJ}%$ecQdh9oq0qr-x_6ZH4ZA=ynuAGoi7k0E%6jS2<83QcJkY?F3WRJP9xHh0@cfi z_R82H`DX=K2DJlxC&}%`&vEfYp?eM9@t!ob9f7%UDsCM+J>rR+afK!F1}< zv4aee9)G6q7VH)3TC+i39+&&2(=maT1#5Lc=6K}pEsVK!;6a3498u~Q0I{^~Ir+vG z+ToP~Ibun9_!^I;^PY1#D2O6yk!_BalcR(Z0|>1xIP(!ZdTI3DH}00b#$CsTm&dCI zJy`FtMd%nc99HV1SDlky?Fjy6k0T+Zv z|DCh-_g9=7La<`k{DYD8_^YqMo+MDiW}(D3;gn%}1{ZR)J(s_cFftKyTiX|EKY@5@ zqnPeVsJ^*blyaESS&aa~OxF8=K-$ixH*LUO z#m{Zt_G6p_&lbk!L{BOgt475ZD;{ALB?H^DguE826AA!rc_!!we`%MKxM=RO6v^GP z9&D=Lz3bW+EMjLj2>*KQ)G_QvF!ghO}aY%%KR?s2_& zLr0)xYbpV}iqn0nZdkOG7Oy>n4Zq#GlW|`F@o_+ zFk-JV7z(Z;+tlGbG|+5FcRTy16BSp68Z&5&2yL8i%?ing*6Srx7n+!(yhFrrd(bszmPrY+AN?R%>Eu*`{#&{!7=9taxg3IZF)CqwVn9wTfEh z7(B{;vdS0xK_^DHh3nOQn_l{H5uf#iu^~nqd0c)Y?U<+8>1T2akloZcDDDx=B%rdi zr1uK=JCD3qX6{w;-G-_oapmW6K7CY6uXQ{0$BX9+)4g}3)$1*#i_VI~T;5eN-iYO< zqKdpvnfSL;)?yodMgrh!>kLxMs&pY=6xow#2`19c9R}4p==*;Rzdx%gu6@VnlQxPA zhn>XD?zJ)zVq#G|&*OY|nY$R!@&jib))5N_DK9pU_HMRRI~Ox65#G8VcyNHr1&4wg z*j(K5uHZ7-b3H%B5focuAD6-E9TF@97X#C_i5!)xX1B$NjX=U^@0ow82N$2s&XpNv z%c=pFR|PU|9wW0LysHnDRaigax^fP72A+bDc??R~?{c zfl%=(g)jm-hPFLDV$~9id<6WV2u6Vzd z8}zLuQ9i=i`5?q`vmXcK(MRO|oGE3<=D9IrSLU?PhfL`Dr;Nl?3@Qogugjt zeiZ81?yZpuf!-iZxEFr(+(CsP3!A* z2{^u-QaKrmQb`Fmv(thStkT9G!T|2vhDW0<3b7-jEJvCGLVx-?-TGHJO$ zMHwXj`oKxZFzbYQ{)oJGf|7rFfY-tEml0eGrhJDRMYo068XUJ5+ij*AJ4isCs+qh> zMPjA##+Rw4+$?n6x7f|V0vWPjlI5bjrfkrgChf=b?Kek>iIQGF#F107pb1YHq_`ML zYPVdNHRX$GQ};cyYfxI4;}I^=%qEvwZKg~&yKN{ceS?D`WwOW5Lc z<<9dT*!}~hJnPSy)lR)!ChMO7hZ7~Rh>|#S<_TgxrlhP_h6f5NEp|p&&gM#zwmH#3 z{cMD;sztp?8{S1x^Al9V^D1Frxf%V~ag>gpubXL@BNwQ&!*)BRZuN5A4$5m*#iXRa zqU6+pTXSY-Ji`f+-xC#FVWU$eVPjaV%@;exWPNLMd{PG!EF%x|jD8pxq$krDXf0JSEP8{hDvbhbsA~)$_2Zxrn+%#1noS=u>(hm_yr~ML$}%bwF72D zLx0*>YlFKpzcTBj<|q(%K9>FtUqm@9DmkhERd$VrFB5^0^2upLiMY&`n~xVZ0@C{2 z%8+xGU*I}Av*4YwMcbqvjm@C7CvqQmRj8=sK4`~4O!A-WTb&v5uxR>LF=S%m&2bIn z5rz}{iEN;JLzR26_MJcOWGzfrhDN$N2bIt<%IS?4d-$;^(4McQ|FLYedi*xBsU z+KrZr=F6jmoR_S!<3C+Zf8w5_u~ZilmM#)9GS}H1ZBv$cXk)~*K5jEQwHs;nm+@nKbleQ$_$E14G zKgPolGuOG&au0W#^g4!M`BHINyZzKPj8O>jvsuJxn+Tw;K!9t^W-`7lNq<4BS9VcO z!v-a(lm5?ivI(v1Tdr;e9DhLYcyEP85>DUfHQ)iBp0c-V?|g3J%FI}=kmto6g$vn+ zbIHhPu>+1@*y>-T+5+@Rvki8%8*NAvXv_Lv3di@2j(*3LNz(~NOuq^0*$b5j>3qJr z{?+o)!{#D~E3Z9<73#7slrhjaMt}dFAzhiLOlODDe&LET=eTl5r2_81+Tw@guN$%o ze<-tFIx~=1+m+Kv^24S|bUC;Fd=rBcGFra86nY`KC}<*_w_axw&yY0m^kBB20<@;3 zyd)&zCL*v~zrxNoQF|e8>QaMn23+@x!zh0paoze(rE1xo%F+ay)b9r#ZWnbIbNb8o zMO+uDs5*1QD88V_&XNauFSx&bDH%V_2QCTZ18;71Z2TCQ-Oq+lQLWeo-k5x-wH&N( zQ2juh_rYlGFilIpQPR(y5W|06ZJ}fv8eP!F2!p1LPVih@K3te~;`PDk^?cqJ$RIBZarM_mHRENReCWgV=-7-?&ZnXkmd8y&1lpL z%^N{U;H`&Wc(v9!?+#VM{|T!!_Wrg7%58lZaN#D4LX@t*g}ZXXgt^R>I%VmQeLPnq zUm}$Er@5Qb29>UWztbE4V&=jys0;f7S(c_K&l;P7ZKfSzef zU`43W&csaH?O_}=PV;GTVp~IXn^5mUd0J&qkys4LSwLSS<@6wEh`*Bd)mz8`PHDgZ z(Zfkme>Z~vzA?1>Ch<+=%>%_JCl`5!4lwW4MNFB+uUB_Dqsrl(K68ez|Fx+XGVJ;75sX+2w| zr|&v-=2wo?z1>dPr;~-(N1O`1EaRVCVD`m4lLweiz3ZV-l(x=}XUebLL8kgXJNf*J z6>~Y+_G3W!4DQ9y9+M!8Jl~`<+uO_=skbZY+Zu}6gj5%|E|WbDK&%}Yv-ROvnW`P5 z*guGhK#TDdsS=OD4?j6UeKU23hDEgI0q9e>=mo0x)Wrt*?JA4+1;rs{@pMJ4CX`1Z zPJ5)+YzKAqy7^Mx>I7GRy@7OV%(MM4ZhwGvn22QZiE_M`9K75^-(EkUyR~&8`47Qj zA+&oVuhDcrpnIP5kaq<-;)q^OcMenidb*{wYw5pVDU>?J(CU;vFu3puNn;x-*gIcd znnsmKo=G${uJAW?s2jhW6c3+D^j)g^*k5y(1Y}0jaldKQYvA>|PCbWTper0Pr{z_X z-jH)(D(j%4TKe+*H67JxWfOC+n!$S>xzvmG`4>Y5`Fk$QUZ9AK*xX2pw|n=5F9R)x$)3F!v6McwstlRD3iI@rZSp?gy+b5Ks@Ly!+o7 zwctg9TXUcO+f$P1b=Pvn<;&-CjjvdEt<%^?|mY$g-bs4YUTV3YloEBZgv zO!Cs9|Ur78NCzYpGj@>$Z+Ja^KK{8|6u;3xcreyw$Y#H7e?h2zAz-p; zA@oW67aCv|+)m#khB)}I5u<=fzk*Kl>Kn_EG7*_3R*u(=T^MHk2kQ3>pU?N;ma0r7 z?l_LQ$waFX;nAi988+Q9x@xg(sn;EPk)B-iP%-g`3A8snN|jms)BJ}t<7JJNQuN@r zdRJof>C~C2xq{!NmiXn_^BgmYdf}#6!?njB2IlEcHx1@>RiLNQ`|RB^$wtin;R_#C zvI33QUVVrKuT(eL4oj0$KLlP{W#~EFzojrH=?w_Za)7McAI~2Y;;Tv#(fa*tQ(8jCsjmlWC&3xk92wwTN2r_BeziFKvEc5>n~5M74hO+yKS_1Z7S&< z=YtOG^53x<+8hIt4HQWi-9m z5*ceSGIp8Iw~kJsQBQ){r(GoO8=-_3IJk>%o~a8ipg0fL3cR6<2sMEJ?sB^SoKadm z;H0mrc6^rRw{JE|plDA5XBM3GoFNcc+OI5E=rG=_E)oWHL#b3=7i}-l_XdzZLTVd5 zjZNo%AnT!LeNO+{?C;}2_AREi3}3V*DH%}3f4u=qY}x&kCTsnECALCmA$2D>SD{C> z8ep1{$_sG94rJxe*pUaJemAfgntTrk!b+37Fog$0HR2mW^2PPXGg@+MgQJj&(~k&T zd8q*^MkuJQZfgQNqErRgeCt_h0~Ol74-*!oN%PQ3@rPKp2Z9r_{c&&69(eK?)6p^K zQ9QHQNyDc8TBd()RS``xd4+ET=4m`b5p~gqYi&5JuaBGF#K?8Ye`kTx<)ygHF)qT`}&y*c=sPm4syiS;nRpD8F>S87d)LN^W}#QD;e zhK{L)nhiOnf3t?LA9V^RWci?R>uCnOZzt#GvFaaO`8Go}kgIF^|6GxBX+TY^9E~3B z*D2l(jz>(jIPFXB8rcrhfx@!Wi9*D^#DT-+gU|G-rV#%*C-WmhEt4GML0@2n?3VYb z`G^b$ch&G#1CV?LQQ>6qq=zDG3=LR!ACuJ&p!Aj?m(ES4p@ur?@<)~+; zDH|`o5pi=eWyu0bsb41Pay?W?b~g&pSm zwFz-CF8U%-J1(~1*rJ6pVZXLz!N7IfA_y-$Jb5lR{ntsRM+E3)@qpM9yX^Rzil(>n z>p+3tys1SMo6&u+@Jm>~W>HQjOk+Q1a(bVgal1FJ!pQ&8T!vKt7K(<+Hw8uGxm}G} zuffmH< zo4%r*82Ty2gt$)3=edOd1G3hPUF=t**N>&%Pv56lDV>lNtw@ghi~ClFytmeR{Y!pr zUcRE){Wkiv2I_k6`c;{S!Yp?N(%uHXFMD)`28+I_$w5pz|6 zaA7p^y`v#j&(TG-MRCzZjxFciSg-U$ZW!k0g((`GfP80)B3@V7^67k{zxE#+OHbi8u%Q#LgKIPdBMst^76k2%~caMulu*3&bY5eqXp13hW2 z+zVSkYwj8U!cgz2HK7MTfwh^0waPiY3rmqFW3}~5P1E;7)1*v2dCe+QoDoY_V{;mK z8qZTHYnx&B3pd=(U8Cu^txJ18dB7?iuN++NvcGn@dH6WzYz?UN9d z9$UrrR6J(Zic-7oW7hLwr-=aopiMR8wc5iDUk&!@<~5HI>r;LkkE6AjUkFlzZJ1+i zs1T_^M)1mtmXB+)m?rJp@sKm0>$>pL$fst6F^i`asmoRvy2JiHZ9gbvQE1uOawY>G z+K%}aY$#C1*^~okDe&rrxdgObczovu#TI)Fs8gn>fio`b5qXNHL80sZ1J^rNQ=@mp z?%fjKs!|D6E`0Y~>?gg}>~FG>qUu8K6P|zZm-g2nrbX$`=#ykbsG%&c`y>zhp|oY& zTO%$F@b7m3_h!6=k)GdFWQ&MD?8hG!>0@Fx`QtT`1y*tYI=%VQ$T9rY=W8+CuGK@) zIt*1efm~f^kdb?}L!$a}_hrfscm@Ai-cQ;SEn2X?{2RLKgXpvh)F8BD&hEK*G@gd3 z(`_n0(q)$J<$mvX?wxer&vjTIFz~V0w0i3k_wn<`ts{O$D%K;*n z3NX>vMs|@8EMJe5*Xg=N`tXOH9mJm8R)-f7n=2aQ&ESZpTA$}j9vHyE>M%Ek_Nsj< z&FWnOHr(%J-xJX6vfS5{X4m@T>1HfC-e&v8L$j*4-*JK|^1FF!dHcuy*J*0c-aF?4 zXxQ1W0pWB)`%Nn+`7c{gwh-6hc1^T{zv7>xG4}2-rAWFQ{&TK+{GuR&dn)~h%fzLP zv?nj0#R$qjEI2u-eSlP1s1f{*&JuhgFU6SLK6x5X!}HB|Sy10Y+Yby8YZ!cc^3@DP z^JISuIs~eivCNo-&N&L1Cp!fUv)f~htRq-xTm_eg3=H{yre&*&j=sn3(xllTMDw)* zYnq?H(i^Rhy4qY>N$J^CXHV&e8Z2}&%3JrEYkjKHn{qU?b!RiVk7D0H!9>nJrnLWiZEpgll}H7(=o03`**U9qC}V#$vD{U{DIwz3GzN8*1XGJbC=yCUe&)0du}c{xg* z8+SLH8f#qm@El(}2gujwbg#&IZI2dqx}0vmMM#_1rkFOqVR7}FZq`b79oTgPNUyDB zK6&KD46NdY>XJ&Zu`1Iwr*sUf|DKgw<=6euI;J{ zoMswtHRjd#9BHgp@wG1a`D?q0ffcqMeSg*+@BGf;C|ozI4vAATneu5{G9Z1L@IVtiRB+3+;hl~yIsz* z;W0!$37U)kX_t!yjirOCf;nY;(eAy^n|q};+x{@Q3rnas?Wp`TSwwzAu?k@o`aBhd zH=90Gbst%zKb(2$Yzx*yZT`f*@SKbC19%P5{wIs5tSS@VQyjw1+z;n=231WmXZG@l zBn`zh{(8QjsUk1SXY%@5a?1B6%U-G+eWXNj)}R0L{3gYbwtC<=%(nKK(&M;$?&_bn z@3;Q`i_*KHan6un@6N&F)V44+n|1cAQ zNs>__ zfp5a60zBNd=$l9bU12^C@l5YtalSw$SD8TLWC(ItE-R>|DRu!>*d?o{7z0b+aBGJC zdDjC}n-u-p|I(zi!+fO_RMG6aP#`q4FDM_3S{L#j&+=@LQ`i?#R1QMRRFFs&tk#&# z78_+B&QKp->4R$tYoDv^n>jcgR5T?zwm+E<)uyTMpeti^=8HFVGBK;x-n@H4} zCjxSVrUEjAqS|dw^2a4kJr?-Nq_@W=XPKpgyiQ+=K$d)f%g9+`DZ;bH`6~}swLfgi z;vi^J(fSPEop8t!cqTys6Lo2jZke20s37#kpSF2qHcFM1W2MLeb;D$fK?Q5dEV)FU zuQ@fg>P-qhDH~YP5Mtk5$>P-Ts#{8G>^U(a+R)Um={Fl2F8X9Q!KnDODh4PPq>8d| zPe2?vip4PDZDleku%(^UZ1p z#psge-ROyS#vnCrEg!nM%GE`L9=^>l-n9t}Q9O>Blhz-QJ|LJ&leJR5mj?be1|Bu< z+8eCCKs)T8E=7+x+4pbtVlaa95h75a*q|Y4g=vQS5C zCglG5oG~RVsUd1)6!7~9s0PLiv$~WK;votcOQ5`MNqDxrVYeu>oEBO#*1!ZiOrrg! z=xr=C<5ug+W%)W*lx;fACuRr6Q6{Ds02OtSDX|e56-4K%BK(rV(-f|AK#~xLxVa=< zea{q{o!wU*PeHAANwFO}_Z9aioxDr60(S~qj$m=?q+gA}dNzfB86A8NORIk#5r2S@J%6^65KSA6=bM8z*^>1bp`GHr=Ux2F$l4tR{k zAl7;j?EV!&ehDI;DkdbYZ;A=3Xv9H938{n#B%VXbvb)}50800v>xj2ueN2w0vQ>&t zk+KubBK}h983Jozaw7inbt|8&ZIPg0>M_(GjxKp_f02^4a6dJxfEaHAgumXEYXZZz zGrSN4=w=547I%~Ffq4b0u0@&NsH3f`tip_hWAnzgaT4$mw)SUNUETEvs^xHaz>M0? zV#&ZDu;GMW{s|R2HmAfoClZM~00u**H&{AUT zbmtLmuXl=4UdR7B5CwU#g<2ybqdzK599DYg=fZ>W-+Riy?kV-+4%s*g?t^7;r7{1( z#ec_QjXUCaCUnHGX&C3xqAV}PXN4c2c}b<^lkH#jQ&c*xZk$v<;9L&v%@NtxORxR8 z1Z0dkn=ld#^a)A!_e|eLZZaJ-I32!Fq_h_*R!g>sN*;-u%no->Ne+zx$6=%8O&iD_>UU5cgwc4QKAHn4bOuP z#^|=6ZDXZZ?No;RjM8f*N`3NWR8)q1AWK?J3z@Z*KEi8`F4wfwcV`;flP)xKd({gZ zXa%~&H6Lca%Iy^(z0w764dATag_3X8noBIDH~BN_6yxU7-f-+krODWO7|%TVi)4xKi6DA6C1jE(l}Ig|$p=oGyZLTH0OT z%nlcVsu+(5LT)Vw4T0{M?JjJa;f^&g z7p0BBRIN(F(-J*{Tjcm68#a0wGaBIGt=6k?7$-f+)`jJ^8psLYA3f4dW0Z}K)8blh zRUH(+a(l#nvR}n)xL}XMyW8Ou-lf_s?&3bX*B?YbKKjD-((<7vptKf8SD#}{csse_ zT52F;n84L!+*@__xia;!mS;-&)F#H*Y4SEjZ>&zH!<=xVEaph-V$Dx%Tw~8s992g6 zdY5;wt$8*t%pZvg!X{H0>Bq$ii4$PEM~Ll$$Hz6__OhnFWuYIN;Uk9zXhv70w85HV z4Y1cUN*W)9vY(y$@T2vu$RruGGugmbfi$U7K{x9OW*kELaV*%tbfKb@Fax-rAM_ppF9GoC5(zmi$rK6^ zM|~8j{$lXs+uiSYwcVM*GQum@-HcjEK5PvXT{Xhqq2`GQNN^?0Yo+h&>bF<6f^-yS zYg=(A{fWo(#1`Mfn`Yi4(k(<27pD2mLJhmKXN(IH`ep=awBvr@DK)HMfD0K7JN+0? zzG_YF7Pp}aYBwgzD3&|ea=;<}2+JLSDPvG2efWa6mi_fj#5=_ zMWsoX8Wa_k-i1IwkX}MB2@n(k6#xa%UnPJwfa;m#y{J(rRXulbD-wFv?? z0>M5Hqk;cE+3ZA=RGS7$ZyLNY71>Ei9j#>!>VgvCPh2oVB+D^K^89dxliQc zK!r!4%75YcMoU*X_FlxE1YAF+YM}$f%`CJ`>4n1ts@q{wi zGCEzJG>5uN^{C&v;SD{g`|z@JoFjfoX`9fbFocF1uP+V|&=(H6A+xnosfMezrR>8* zM`3Ac1iQk*y=AdS8$c5RczWgayF0^8zU4m46FJ*u2z~!$%fBpIo0{`=+ zH)ZhI&W3cO@j;`q-`c2a-0Ov$IPBM<8fpv-+Mz{11^o2&+u!>}b^q?EFR*n*Q*hm$ zCY-+HseW)P&zS|N*A94m-&QPFKW7@r%=B}5&}F2US79IZVHHXFg-&HxD0MToJGgkU zgB>)sKfyjE+g#>49;G*_j2>6`_0Ni4H#vfGfnrM16(%_?B7lp(zP2V0R7 zHr&){|L3RhzYGQ|uCYV<0JJ~K6#V;O@?^5zB#-5FN*diILIiG6j2*Y*nhdJ?(0#26 zE&6=M{b*&sQsc-@##$cRQcawxeD|z(0;TT@?#tJVwT#wedzGpuryA~wg~{)dtO@PDt$Qh%SK8#U3G9lu?(qgJnP zd-xxj8R71U^-bHlUiV*<;{a(2sq~+CFzPf<* zLC2uLux`~qNpSCPL#+=hDTPWbPUl0Z;EC-kritLo{$)ST)hw-5>XMov`JsWQGFXem zFKD3CIG=NRn;&DUW`!NbXg;*$SNzHhRsT?bA?vefsJiomcNm6t7vs(vZO{xXN$4;73zBlc?tWs3j<+7LXP3z^UU45k$5anYUkPk2d6 zr6d-Od?=HC+9x-mPk-^#f`|HGY9KVH>Bx4gwkkmjzw)k`K+FB~hAP=y>G`^*N50_W z=Y%BU;{|;ieude46#1dc9_5#Qu{fs5S;PZe9ubFrFlV&1O`I8@l9_w@o<>8l#_Q@y zH%%rL&qE6hEVc8rDL?nc#A+flqyl^Y?T(Ie*cvho8PooD~^3>q#|B#06OH}XdEUDjlQv9%7Su)Svb;1ZW0^l~-1ra7p@f1+`hGqzxshfvbK@pmWZ zW>h;i*Fh$}?12=ET4u*y?SWmZ+PoGL`7a<$|353ghNy-lcE0uDMXSThXZ1**!Gn1c7B4*izX z8&AJPmi%BcZWR3S$?ab5*s_vdrf$mkFni&>?l+OsZeNRrvblRYrSq>Fz2tI4T_<5= zBD>$UyT}LsEJmKN#_;OXw^__zo4)4!q&@F_;kub@M{;i44*R*fH zFj8?X|KyQw32JJCnt``y6pF6rsr9EGuX}#a;yT>WKind>HO>}EuUA_}-v!lQ6&ADj zyY_CFQ`)ms-V-kOb}Uz4yb4s0IJ0p-sJtWC$c**Woht?osxIRS#X2KIYG|^M64tO` z1QA=?VEKZCdfyP828o{VZcPs_`z*MbgyeVDn7-DKp5p|&k8v4PNi`< zcaf5iV4>kZZm;9Lri3=_T~8!~(p*FO>!P5rSJINGykFmqoF8G@oYNvK$e9ewN(6Csm^*EXZ z`C0Vtn(8~>AX1zfUs*l-E2mHB3zj6Bt|}ivHPbh4+_ef_l%iX|usdV6FfNV;-K&R$ z2kmEv<#BzxUY`}t7DaSSRgm9Sx+iP@($?PdB)Z0#qs=WSb+PRf)9vF2n+S;%7{}}e z&le@Xhmo;8Imy#nx@@Uy0!~j&V%Qd}9&enAm{an(_oJ(X-+l$&Ue8j=nYPMZ)SzTL z3K4JZGX2Zq?2@IYERhI=?GzjcN;_n8RfG$Kp&zXwLBxAFB=fTO~u3 z3~0wbv0ntU7HqawdxqyF{1_UrI!XhGZkpQ<*E^PLfOM7~vGQg#or#I{=t1os_R|Dx zxE?{6i);{E(MzG9ONPDjI{9u8*K0euiixmG#4`+!)gIk}6h5=9hUU>`zsPnkrap@$ zHihn!JvG9NP=hFMCAH5qQ;>U5!gqg>VmtLL*xW{qP0Af$91RWF_T_wrX*Xm=?7Ka} z2wKo$-;(cEgCJi73NPW0Xzx82krK>K&sBya%j_3DktV2cM^}LuI=g~@s`rRNhE$|R z)wl{%AAz+B`;6QE#Bt^4U5E;a3s|h2>2Ylx@f0R>Wu z!#7&tu)?r(=NUCKGKZ>jXS2l?Io+cb5@HHibw6T^!o>mpiK{=KkWH$->D7VSj!BjM z**=8}mC2C&aJkT{yD;S>qyu6<(897_Mk&Y=tY0( z&RzJAtaL_upU_3;xg?g)Xkt@($nC+VZxc%`Q)bfh?@@_w2Syf;g&k>toRXVgNbfir zDN!zN(e-Fxeo;&!vaXPiWdmhjTOk8C+8AfXD=qbM$Ngx8Lty8LQ)SCQjD}_GPvxu1 z>rDmW_@A=M zu>?&lwCmTzarYwd^l~|Ybv+K0=_jlD$F1H!BMUhH(OQrS*nnikM$g3TFn2~=3^!4 zi9z3NuMaY@urtsl#HGDbXT}xCS8;H>0`natd`9=Ia=GPKTz&yoZcUw z?S1o|UGg;jMuRtyrP{b2*<)sGyweFEV8$*q~)5~?fs5KMY4Rc^yL*@DpI*)SeE0vLh+V~DEU$9>>G~o;=IKW(}@OIR^0i8O<6dZ8n!wG;sQI@qy=$~P_6Bu;og=_zE;dLh;<&r&*L?Ei; zmU*!MnL3+bDzAN-+AZyR27QhFemSS^pdyI&Jj3GD^S%nznQXzmjV1fxj*Pdw;^K3T zFsCC-rib`6&zpWvj!P**r+2_eIp0$~+;7b^J+(tgFd$CA`yawH{{=$--w(Q{bFtBR zfSu(0{HTcOm*1K$6P2oP`bv%8ZA!okLEg!N)b{B64>%3h-PM7h&c7gJ(_U>LM-ii) z41H9zqigOp{E~E%T@DCLP|%p=gr0Kb={}UfIw+kq0o80H8i*SO*B|hJ<~}XpCtW0ssO8Je z<>pP?HE^slot+&>GpPGkrnUXELXASz4}%>M1A-5KbH;WsGs*wOJzT85D8=x-Q8@H^ z*cyoaBNny@d_Yyk4y*E1rtqcU2Lu8SsXN9Sszlltz5q-Irgxx!_S9N;qoP8s0XYu0 zxobcL4odKggR1<`KKlBAcx-%YQa}npnP2km@EjqF{@jHkOSs3KfJa@+(25L$vjbtc z3g2bO9?eB)yaab&kBnHA+8da%HgI2?rkvl5{iPs=&c+5Is^Esg+{5yQA+?yil6=fU z0h$aJTxVdD7_8nw4v;as)yg|RQ$?r071;U9^1=;@K+GF+V$o%I zX3`2~65_J4BAc?mtF@@yTq1hKKU-bDRKn08t_aLYKY#FuBZrR|REzGfAYry;Avi9? zv+ycXxcBI$Z;|?zxcsCDGjQDo=RqQd*HagX4%|(<`HG5;r-w@4fx zpuzBZ;>!zAd(ciQYx@og~2gMo*i5 zMtYVO-^uVHq+0ly5AYKf;$uMJxaocPk<<)}EG*;Ry$+o5I39P2#-JxLqnR&aJz&CqJ5vN&Vl=; zBicq%U{UG`9iI@&#&wYkc^?85YT8rDj;Rz5fQT-@I`5Qm#vYPj8Z+*==62!!rJ?9 zj%!Ceb>ISasPtJ!$@iNTC_aymjq`zJ;BDKDdyR<@ypYTjTGmoykHu%}pB-?@X6wd$ zJg5|l>~<;{A(52yqI0BvfZg8off_VMTQogect^ET=Za${d9t=PR@x-JXXYTb{FC^U z$4=6F{)w})R4Er9`@$)8#DK-V>;AG)zUSV}$HO_1SR1Ul5oV6pr4rrTILmH*46xcA z2LM2@j1D8*SUPZfpm8QVb-in&)xe$P&`6i;Xz(SH8s+uK6LUvZlRH3jyA!0coT#5G zkS?>mMuJM;OZmmmf9%xi8;ZLO+_N-CG?k)1`!Lp(MC!x{W|ni={=yd9l}kyhU`>QX zQ=Ku!Qwt}O!Ceg1;>}mvCqGo$z!W%sO4Tp*gRg1zEAJhr1{WN%Vc4CFMsN0n%zkHAOUY?OFFl4jL=Msc|fZfY_km?d$_IY7I zRQCJ@pbvi>Fcp|wT&St0beu9x1pb1w6r$iFPg;h;2seTEVj4Yk zhdoPQTU61_a>6uB&GF~lg-X)I-FC^&MOX*>V@0RT zuzH(c``OaarC8Y7AZX81tgiHvgrV6KvNrUH8s!CTGRn8st~b(9yw+@w#`bu@C%3)6 z0C=EEQN7R&07Y_)ZMtzw8CcSG@0%-bA2Yw7TgQ?ys4gJ3RNy39HmDXgT+oZy%&{F6 zf8QR(#$SjxAyNjC(&KOA8yIeHQ2QMNUJjEWhfeuaiQlMqsf=6curwCL zroFk_%RH8V%`0qtuax1qmF+bm|BxXw_j<&rujY3pQ#wVN?S50D)}nEdcA9somePtU zS4!bvQU(7|yxk9sWcEsw$)sQu=%G?~^iVjcADqFrab2XW7qlTpM!nPB4|p3EHCHrq zHwqV8z*nZPO)aB|$s6J`O!9g8y>Kxwi%uKx*r#rDF1Nmu6g=%jV7-NGI;{N}*8oNf z<9{d6_;2(%f`?6P4KiT{bwCDP={TIPlp@)+0ZvB#HV3y&eKUyty(m7=oy&qog*qI6+ z%=6V=-s9kJ=s*u}A^MpyPaSCN`g{cmaDPQAV9&QW7^Rr{i<%R7Rc&Y7t<+jfr*(Eo z*K=ez;L$Phnio9T5d^#&`6M))PRW3R=OI}F+tc{)5>Im9(k0-M-|zSi7B!&!lWzIH z>rd6^<)4JzYXAUL#+G(nRY=L{n>_hTpau?{_(jhJssEYfb^`x4Jo@-Lf(I$Q!6}Z z7jxh#e_uMRpKS;jzOnFYX}k$dzHAX0p5TQQ=KewH&x>FO?Yg}&1+EM~ap=clgD&Os z-}f3}GTsK}^FQx*(3k)__`pj(DAyAH4b}d?c@!M-eD(ERL&IK!el$R~W?DS}wu5VY z6Di2l@|}FM9Pw5c%QmI3=wH$n<|r4@tH3qEA*=_zSu1ErgL2NVVtWTG>vkL#Fk>h< zCJ@u&rCw7Ek~2_S7$csq4VM>TWDulXPG(60cV-&=YqJ$)XQwAwUVK`o>2ht6vDK|c1+*Nb|qI|EX6K}juZ zbAhba4l(yk>BBLK@=b7B%JF_4;9A*E_wG)q04T9E4d)ik)2>B&L(C(~3ow@oTNctH zmwVe{vH!~^Iui5@Rzpf5mn>bKA+0wWo~EGd0@q8V>3ykQM0*C!FsFP_)3~Fm3E_q^1Z4s0yihGbiK&F;BWHjjsGzZu& ztB-CNSJLUt+GaTf{uia13g&Mz7rARTUlSyEWPWcuq(E1Y6S>$er4<7)=VFDuIbsyANliYGFxYHK_T_xB*6-gIO70Eu6F zARgaqAaP}^QdOlK^JD-yjCxr&ww#Bi>!WLa(}o(MdFmIw08#vW;R1*Fega0-+E?^v z^+|woekt*QZ^9d$4h(?cD0}J~Fc(&N$0-sUFm?IjH%5;vH@*?CSu3-@3+i)K+}Y3f z#VK!cKt{>*`r{5J<#?GO+CmjK)a1($+DG|bx0piH3coUg*4{gfUB0)x7dwLEjo_N} zj_9Y#?HsKFDU96^TBo&x7gnpv?RQBjU!#`%8&+Oc?N>3JOe}eSO$1URA{lNQpd>|C zAN3pcK)`ncRB&H5l`eX}X{B-*y>L0;XZ^;0w+002u8Uzz1oV?xVx21ZAMOTNtwL&xzjAwKs6Se(R~cZ93es`nNHCz8KXl zy@4>J}sJ zN%zwaWiS<{6onUiuw+iP^*=B~S&)b$)3m4y2X90rN@m?Qex0{Ci~L0CJcXdu`V6R? zo7(}7HTQL!5^GUtgpnmt+QE)-!r3zk{BEXYv+em!M@*ZL;L@$>sTY33FWa6*exaG7 zD>T7-H?NjZ7u=d|*%%6V8RF#w89S#9I3d{oz~anWdF_&od14m(DM7I?+~UUsIWveH zY5cHz{ZGy_Vs0@wGaS*ZzNakRQ`$RskhT#kqg<;}(rU9Y8W4+9@`V|sm&c42Hh|32 zn*ebXCNKMcCB4h1^~I}7JO0$#bDd}{-rDC_Z^AU^EE4FH5Z?)d#Z?Q(t!#b=QZ~BL zez2(0v(gu}kfqceRNQbHsaveZ?>&y}kLX^;S7&$)6-GDbCU$jDtH?$$s#YIYR?%q= z{5f;bPeLknt$o>Xt!#wbdzY<_8uma5E#;G4KG@h`x-w|Q8}uByXwvkY8;;BhQsXbr zQuUz}L3{gKg&3s*jr5LgOUZGk3tWtm=x(fgHIg~3cr`v;nhFLDrqJQV1+_u| z^?7K2wFzcLuw+vhDqT;Kl&Z$6!!}==Y)_A-Q$}*CYN17vHnhy8?Q$-(!TL=l37aIC zA3~2>91EmUc9Z*XW0%T{sp1{59a7#N(hK(`_cJ&1mi($g`b*p%qZfA1Y23RU@7Tt{ zKe+3Q{q-Z7g?^xE!uwbd?)2y&;2Gs~kip>`by?UvZwQ*(#RozTVS9Tm$7Ud@_Z*j0@LxZ4E2^h=n0aOzvj2-hF50Qkt zpNcw|{jL8a5c+?Li1{CIg#-WVp!_FP(Ep-t{ug!gKa(!{FKX%k^cG?bMeNieXnbw| z9Wr4CvRjR~{yl4XbmlX0HF!t~gU;B`pf_JRK+g|~+t*_urkrMOuj$P%{`)zVYCuNl z0JS+NUxPR=4OVvdcSk((y7o{LzRVC1F^&)wt2S_)7xo-G z;Li3H4108?8EQDz96pESAlO2S%k&z za1(V}L=zgJ`{Fcy5jjEkse{O>mj+5a#vx8k*`6t*GDqYs2nyl@H2N zW|<5L%aXK0zS)U)$5G*j{0;p!H%)I4q#58T+P-XP*E}hl>Rxj`h;shS8sZ|aM&#~Z zZ~Wqcde#G0Bh32Q6W1OcD);eb7Ki-lz+}iidWQBclnUTlvt?Z_GLYN0r73w=iK5(2 zkLtp4sUfvmMjyMj(m$n{2mHAvUXh0p7`=ee&6ZADW}{i$aR0{l%k8)KqKaIEY*ue=5-q=8uzcHr_Kay|P(i+v3qRlE3ih z7(;A%BFOpu{UDU{0JUetLMRUVX6N$Rcvp&hcW>oHasY7#fzvL~L4KHE6iU!75m?He)&ha z1-`OdRD?DW*J7IFIrhCHZ)?xxZtGh|^U*XXJ(U6FHQe{9MjC|K6FXpw<<_=m)1xqdd7=^Dm*>hty6d^V3hwE+J{PkZNt#PVjinfDY~Y@y_O5gd>5gh+4+ zvZqlYdm>CUoci#UiN6On!*WlXED{i@DOTsu;qv|m;ub>J8+B*-@uIPr6u?z)Z|6h| z`%zsc9RnnY5Ig^(m1)9~^X~Fa%a9*65aTfRJ7GIRygLJ6rVA&^d~sgP@lEjpIh#=- zvNAYXLMywo_ov5(t85s#iN^Hq?^9TJBx!2$Afs5G&)I-B@=hnBLE>&sH z_v}yD)t(bp0Bc3J%p%E&V4t9^C%oa7EzQ`_Iy(^OnC&aMhGturfu$X&M7bw^@zJb6 zop8#<8t9Wj@r}e#5PvVoby8woR)K#j%C2H-6_nAmSGY?m>7Hn?!j`;i)NxkMp6v#E znLOgB8KpBjOa!U%G~J*^X8=^A)lJrf$3sfdLNi~LXUBtLb_fPxS=MQ41IicOh0XaY zsjA4C3l&g@c|{qbm?Q7&?Zo)#+HSBPuUtoOSHqK8u$?FZ6f!?%*Sa&%Qv-a7%U&sK zxiDb8ophbj+$UO~VnSBH3*gMxd zI8xW-x?BCf5Tc7ivb^?dTgmCfsK;8#GI`xfh_tjuuIs;3$PtB{=kR4B+I#n?RSn() zWrB_fRl+*Z1R2pn9ckMpyBnv5LhZM@|JvLNu=#|JEVM}g^LZ~_GD-aX=0NA+;vK_D z@X$9*GaFZ)`z7106gD}8yK5z+<{2U9rNNY#B_KO%m4%ryp&ClURUc`;d);_{4>mqC zVKI6>_95bG@0r9Typ)6Y-t(b)%=U4{Hk52%)VDQY23S6H4|Vb4m=AI8 zX`8KBdh6*&wk4X1q3l4&*GbS0o-k#>(Mw(kuwQ?6b704I1HYu|5tABl-(2+d;!Sdo ze*ZpEs$P@cFtwsCl3ozH-hikm;E)oopDFDWH^8r zD~O5l?qBIEaWl7fQ9gAlF;tGfV^nTKL#bEe%y>Il#c42=CbPOJYd`JmyTGzV`#wAC zlzvC33SszuO8T$oMLSO2ZVxxaMgJy*FIda<4Fdnpubx%bUR+6*_!i(3;`pI~mfwW4 z!9S>qdY03(e$DS=pd8*CjLlD~Uhl5HXU6}bC)F2Sp~U}CN!lX{{1zZC!v)Of5rf%I zF6x+^fDQTc`%$Y=F8w&Pa|{^v-2OUS zbH_!0T*LLGNF6@!&w8JkdKFxV_{@%&=G#`J@s~yrmj?RB((yQn4k;UoH@LTCE+gY5m4iWd|i_4BTWIjn5{I2Gt$RJ z&02dG?CP^fi*S;fS;$Df2{|Z9v35AH8}V_x;}GIk^!FQG z+1cgBvU=b#7-5^oKE5z4w_A-gdVyEt2RQ2G&1Iese# z5=NwV^5b>rOw)H^N#Z9@-VgGVtq$s4V1vxtA^~HSTdi-LRh2JZ5jBcH)rjmy-Texx z%~$O2kSU9Ea;osI{8{0CWU|&O9I15kgg8N52);KoJpu+Uv4z`J9o-|;IX;F z2OV*-d!0Nsy(8<&{1dt&LaA-7@#(Tf<5(r%MtS^oQn+8u$PxI)$v${KgD&v!}S_C&o;=ePC~Y8`q2prRcvc3_Kx5Tb*Jx$=-~d z8hi382@#HFD?Yi{F?(l(Hk^A&adO~WvEC{PB^w`@jZYPui#3g7PpQ6FNOb6|skNEZ z9pPFV{HS8WT3&MGra3sGEVh>?)##*o$ZkW*8yZ5o)3-S%&Vb#2_?msb#tqUP+Qpr8 z{_BGEzXL%DsoR&>rE1L%6tsgKvy6QKbzU0ZyXDSLmyz9%heE9oiT8uFAA6ctb;wgW zeB16AkUtcwi>n-<_#3uO@KpX*pW8;;YNon%r=e}p{kSSL%h5VHEUennKExLc8@Tp` z-zyT8^7B*XQxdD$(#D?J#-GGsMWU^sNu;Uvrq5QMl#XfM%^jTR!^rO;H!WBd`CZ`b z)zK=!cgDJZP}fbKM@QaYfW|ERLH^jg7yZXA?cr!n#n?wZcx_nCoGGDy`F1PxB35tl zETU;5r#Fm=Z%RH{Kbn2l-x40_-(m2Yn!_tkoq$SaL3AP7KdfMggjboIx7TRPN6n_c zQXbHhMwEdOb$;;jYh5SIP~P6#12}%?*_UtUr13gBMjXLUU9Y@q$&$;$NL@Cy=qeS6 z;Jo6Pftq{&exE}I8WlGZ%{do107x&{kcN^o-#R1>9pkp~hn*tcmPt4KGb~jw94M65 zx16jeTov_hW}bh?%PseB39PPZdQW-HmOZnJ7yGM3sLGvn!Abwrfzy)kcL{i^q*kkT zN~dZCS}PUfV;i9yy&Ld~>r>urSu*u$i@dHJE&wzftm6Us^&s!z2MkW;4pE^i_Uh#! z_6K2B)K^(vODUdnFUmtn@V>ry6TRTt$Gg{S0YW(9iq%T1NW^{D2R_PD+y*P8zUK%8 z|G#_t4v`)flgt>1)72&0R&CgskAe=S)R&AcPt!~L(}{dWaY$jQ4dmnS6)eWKGyR&&!^k%>przwe$E(P0VQ5Cad)ew$&*BWIu3|Kkbzxww1L^;z}r z{;kOIv1anI6U^U1kce?vObnki>w8d7sh=)QufdxC#N~??q+idAVneHC_*=fOmt@Mw zvu3{$&%34txTHo#?t^0olmdF9;PLZxN0;HzHoW${c!t=nGZ=P_q zHJ`uc{LEj-i`T&xnf+isRk+77cFL#%KYDL@SJJEBAJGYeogWSb*S_A%B+#noO5QX`q^Gea%n0mXmrxBv6ZUN9m`}WbDhb`-!QB z3(MyPJZTxa&;4XYx)97CvYGvN8blX44mKk8##F-#6w?eu_5hQtU7X9*D>i`&kXt_+ zpD&$9q1*sxv5W(V;SWAbH`pVqH`vW;@?U-yxkr9(A9WeJI;I!Gb_+W~ea5)P1AK1! zsxQ7XZSQn^5hJn3BQkXsdvg~1IA*UEn`$;8<`P_p0OLA3mfx+W*kspKI%)7<{d*f3JegqH=pQj7w#&7*l z&<*@GI>qypZhNxV-B54Oy|VioXn!KT@jJpnTYJ0NzQMPytkCHrfAtAg`O(cZ=($){ zxNm)$V*Q@v|y#KOd|9Y0- z)U_;LgF)4_1*$#9apS>vUnHWp`<>O5z*I_ZlRBinAXTXVm$d377P#Rzk`>#wZmBSr z8{+rP(n1m+W#s-KZuIf9yp)|5t?o3$x8TS!>jqER5!&?~_;;4LUSB;JUpez1rK`9U z&jz`+JyG$U>3uh{g>?$*v5C?E&76ZaGU@FAn)?@yZ$>&D2q=*GFFmmddZZ~1`qcgw z>a@i8x*-^+DLdTiu!lDRW%qK#6=i|d$V8&hPWhzIu$tR%9T3MiegPlI=eez`yG^bQ zoMDS$$~D-^xxl)}+&|I3tX7wljg$NA24M@$S0C?RJ3}7nihIx)@SPfA#^)~V>~_s= z;^I!oeW_nwewfysSCjl;vh=&w4nZLod!^%a5dm3{OmDr&bR%b3QPeGi)Eb8F&XUkA ziw1AZGk0$ZhJU<~+18`eq;Dl;Tkb7dnxNRt4CaxJyHH3(DQIFJD!#0#=hON{htF(W zd)YJ2vcZ;E@orDVYb@v0#`QFdy0RYc8v?%-d*SF4`MoG?gZGyrzRi><{~D4_Uay4@ zU~%42-(50ce~rCdZ$#pWD4a2#qP4sW?9#{FplWU^bh$#GO01>#8{igo1(l`){2X9T zFL6Et#1zIT*>nD)IlIX!Zl=UU4C)k*a#ne1axw1rF_-U-OTnn_j+S zMqgY<^~9XKnbCv0=)ZfSBkbB=KlaG^Klq=(_s8pEN3oj@b7r8A1v$_!)_b|fWqIhDAoMf zFc9__KFc&4kF*T9_&|hb?ZCiFAXRov)|j-;Cny4q){-C|2(e){*}mN35?0`%O|5 ziS9SYsr~=xnFl(Az}a4~HbVaO;ik0pC24?_ML59L00o!bU_C&)yi$(J2YsvqaL_WX z|M?+-Qg@e#yev>-QvwG#6v2A`4%Vp%d;g;VD1Sxal`~S$+SRCrp+*> zzlcWx`b$`3@U~{UgjxJVW&U20eB&7Sx2FSjTwNfhs^#6T!7)7V@726Cm#Z<$MACJ~ zJ;;{J`(YGszARkzRg2_m?h0K!**f|1gpqg$YF-ju^E1x-mcPA)2i|5@M4M3`8fzTZ zRhzW?xZ7Cl`HKP}Lgt+HIYYcF?qozyrSb(S&)+I_)t}B&yZ$O_ACx61pe*<9d2Ha* zJY}@^SO2uArCS@-D@JrerzGFAO>D)?_a@ds4qE2lv{p;5YEn_++O`vx8eL#S{YSm} zj2;<~M*d!)SFFDG)G4Y-?#r%m3d7ls?W#|9W0UkI8{Wip%$}>rm%(rD-gzR{=k0b1 z7S|K_EFG(;R^a9NjE(SVA6GRl<=Vx&Jyu{gIxAe|T;N}4rrP7v9JT}qASc_&7VRVp zNd0v-F2;wlZl@XKT`BrwwskU^w*Z-QT1yMsL!zEj^8DcNbmUkYA3Qqam` z)4#PP_e*Mlp&HxVoVphfSaO$@l`ftMHb!GM{L4oA1q|5rD0P^hzwugwZ@IDS^lvPU zOUMH0Z;Hd~AO&q{kaiIiW)W$yiZ`V}+%nR(y-k~Ovw{UYNAI%hr;jiUGV=E-Ar>_{ zPI?OKuF+Gg>!$Wm5q+{9gQ9@Iem?YSd^+ac%mR5?X>Wy0@Yc;Qy=zFPS<^GqH>t@@M`)9a;hE z{mkKAr@jq2&KR?8yNJzLOU+2#uAWiiyZ$2^c|dFy8Z4lUt)`E{rc$k zr{XgUk$+XLRC09599Qr}0NEXqWHHpPf zuTzC1641Z)d|}(1O<}2$JXwbVKC=N& z)|&=8NITiG-&sd9bzB6RSzNi%UAbesnsOTpS?Wa?y7o8CIClNjB&)mTzA-3U=%M$; z4yzK$eZlauOHOX1VQxQ8?p^_>F|ZXNd57E~fggU6a9p%uc%HN`}XN_$V<#|_lW1rmU=^tUiLS6)_8c;3#OHDJfr#7{Uu^Jsn8fe zNh}I$N53Z)?gUM5H%x9akKgc@TZo$Fi+H+ZriJR{eALVKVU$+w@#D7P`pKmN{`yGyf;YR{maAMSj^toy zuuw+63t$8i4v^HjKX;>@Ug~s?@1ZKS*T_}e4Q$U{#2KL>_KV+$LN%`vZfQ3N?Zil1 z=r#KGOK8?D_uj5$)p5P|mE+3sH$ITyzd7DKTIp(@{i<;!%QBAhQMJwD`j3&!QE#6j zs^Mk#GYg-3G_D>eKRC5od+vNqsYskb-G{+`?@|BSejCY~QUwN*RN?39l;^*Q$fd{9 zSS;d^*tdoCCYAINez6xROM%2U(1sm{aQXc1cEyLZn7m8P?bR=XIRVuCP<1K%wnElM z&sE*%uR2c^E@FjKDQrbFX0w5aD_rs8s>Ssa!i!z&K`U_5=7UEVdJ^?zb=y)b|7O?P zUCD)GG?{CQG}rLyd}cFgNalcX^3$Z5 z#Wxv{%)WIN+8aC3pXB2$mGJjl-+r1D^ZqWMglkBU9~W(?ec=Z9jaLo;Ceto9&()Ay z4b5`?fQ-@W;KPUtaXvi;dS9=_n{!a3CHojRqv$4W&ESi%R@~IsBM3C%YqOzIA**3h z9cCILTSoat4C^0RU0;o5f4JF=p0M%pvodnCLSGhj_=G0R` zs-xVB?33;i&)2pVmpvok9|1RmtX)Yi%G0^Tlx3nZt~vy z;c%Aog7EFQ^6$;a7kSRDQk${5G^0GYj>reDiMcTNahTs$Bpk1B>nlg?#SZT0c3r;H zpH|EH?c!zRk=Qe#2%$p`@jDC zM%)Wy(~jdRRb2!Q`2w8qz(ai&O{Hx!oi&jvXufdeQ60!x8Q;xZPNs;@eEnBuy9x|j z?*p#TVf_Wfe~s6ONP!GJqS7PmRR+fKAG>~C*j2#xo>;palb&OT)Vnm@?gDeoB)*=| z4;r<4bNs#demZaKRweDGG@G1K!i@&pn|`J&H_DE}V%t zAIeGM2<>LOm7rJm!EjgJoTIgL+m5R4w_l;yF~V-0hOYU+XOlM+|9LpzEpDFm&lB6p zZ|vAkfwJNMv)b$C!1)`W>k zN9SK!Q6UvnC|z-Q-~F&T)DhwCQU9OUA~ld=aM}GmFzD)Me(}`NO(i5GLdC$R z-*HZmzP%h@ieIW9wqc2qfr>T{_o&nwA0Y(>-&d z%=N(k86T^iijjT)$U)mtR2dBs(fDahp)OeEk&)Y@DOyPp>Bmz}BD>D0o`@l7NQP98 z^U=^8k<08KO(ArXgo?Z()_*j`Co8kOC1dlgf%@ml^7cv=wt#g^#Lnr#2r(J)+W zc&fgVR$NlL^4CRFjGXsR2J1}(DW1?F(jg)vD}5G!@6-7BnVb~IvjEL9W<-Bw+!zN+ znuM|TpCvl@o0#YUpP%z1`eQ5I#8`i)i|>i+)TjRX<#m=!q)ap6%jBUswk_bsq^kBm$;WzFQ}AH4*wQ6C{Z#(jhc zTs;Q99|c=JLi*43qestycVH)CgC3y(@3_E^(iepPmLf)eLHz4F{^3DURdHEa;9b?& z(bUw=$->@Q@QGmHqelpWmhUy4HRa#&8Qa^k8JgG|nX*A_KRi@XKO)PO?f41aeGHo>Njk!+1P1?o>Eg&3pkpX@u^5i z{ZDn^FF{%hXXg)mAds7z8=KoJHhV{N5C<MX#o=iJ(Per*w{h; zw`$IoX8#Y>9!mbK_MdtE*`2^cV|;2(rjFwFwzj5r&O(1LuE2kK`bXj4v`dQ0zn#85V| zU4a_%$3I^pQm8Vo&5+6!Xc1_s|M6n@^oN9TcfI{~s)a7|KH8OR{H;K(cZHp&8Zj5G5czdz0^!pA1l|vkd=e=3dFrarv7WpX(0wJP*n1yZy_vTm7ltZ;%77$O1$7TP~wnvFoGgnyILM z>y;8Xsg65Q-|gr+qdtZ5Ore3-puQ5GUNI2~mzqY&M9*^E29J1x4dp$Wzu(q2*%OjoX z#@C7&b!i`(c0Ku-+`LdV>np`*{zsxP-luf@3iFjUm3HsjgYN5oo;BQ^%Y1>xUON_Xvu#;{ym4T=-CcAnXs{CrpwakT*{0jO2rYJRj+jV$9ooY6q~tU&*oqs;U1^Ofv)Kg zaY+}!!($7b-;ObLxJYJL$Bme+vT3~9iz>dRV1l=|N3dyaH7(0Z=7J-5q@GIiUi$l1 zDYloS^w(Uv*Cmb7I*As2wUH2v!TGuz8VuE`*+Ayq`p(Wt+fHX0)Xw+Dl$Kf2b;;vJ zvTE0E+p!X#ZmaBdOts5E@XJhJ9L1XHZU)9!jb1c>1ty5~Y2gpu^hB<2LgQtu0QBLq5 zKGstaYiqXq$Z|H($Z~}rnaRql{RD*zlh1W=uROr{PtHb1x5tZ@jPmsyD$`EgDEPD5 z5oWU29rO2sn){u=Emdh72V+}m(EY8}BvvBrXl>?#Ty){I`T{>euAF3fZSDCYyQ-fP zQ+Z3cJL<+Yb2~^Y;JsNN)*lAY9Z>naOX9S<&jgI2XmFD9G;uOrVONhImLRXAKA>P* zI>}XB+4qAddW}lKV*XWWZNDpc#3V?=iHztf48`^P$Tyuau$>EYQ5moG_IXiV-xar( zjZfVUd|4p&&C3Fq&+L_8ks@BAdI{IwG{~mmr@K9~=Bo`HTNU?sd2N+>u*1aV4!SH-t_ za>GPH(TeY<1_PC(;Okj4Gr4RPjtinqQ(|^uuL1@>LX#(5K#}E&X}{i@^1J3+C-U3R zYtU_I4@O$)TD+qlJ(pq_;+@Z z#$rwLbuHimbr;`#Zfd9m8?xk6Yx;iFfkw{m^R3+)Ukypg>zX9iIN2;l<*(Lf-S>md z{1=if?7g{1s-Rzv>nWS$RINw8{b1Fu9d0CfGsxy~L{(Sh!#~q}igkT5z2`bu_o*P+ z+Rex9cK?=Vgi^qT?)v7u#)3CGD%Q1Qg0lI?HBZJH$F7_TZLf$ee4t!;(*vhai!nZwyC zTv9#%=55Muz|7kX6B8C1aHCdl@8z#?RbAf3PSCnK?Ae$)DNR90uGs+dBvwbk=XBI*hm zHG!$lF{pRDzen?j+N&pgnHxb{F@OkM?k={iAWf`;ii+o~ib_0nFKkYa@&)LwMn=-i zHXdZ)iZ&Gi)S=ciNI zSvt-0n7t3zMq5{iBUpZPM;yo@O*ZNj5rjt6iCcKxZq&EYIHhf1(ga^T?eLIeG{JVR zApt8-^IHW!S2!uGSW;lAbfw)P+%V0Dcf40f`?NMBPCsNGFp^JnKe*ZHRs^?nN}LkX z;VO|5hHpFmB=dmkDOcUXZAZgbY=GZxeb-JeQ)|J zpV+Z1&Fj1_;g4GQsa^}}T7E+d3B!ZhIPC`Y=TAL7=ggFy>k0ad37g41g-%Uc$`zd7 zZ%;Nb+5+ZHqf}9<54NpAid9#w&%85I8AX&`r+=I; zccyR{ zi4WYdRLYOV;`cuN$_9?R%p$Lbs}-$Qr(@z|><|{|hHx}GHi^bL-j2r!f{q;X(AQ z3QG3p95i_MsikO1I|$U>mQRu01}16;&e8{o(zwf^W0iiZc!?MraqFnVIcGz=FXx#j z$3tONsYH0bujl2LlOqXF0TNlGO%`5X*^j%_;ocTA4^BjD zb~%7W-kR25^<#ikCLz<2)&ho!X5e~`4xD0*iSaS`ZH76cK(xCazhNxm9_d=X;7-6V zSeo@r7aBUePx=mK$Zc;lh>^A}V7~&dhw5Dv;x!}+9v2IiKmRx|V(xZCi@8J^aTv|b zUrd=d|yxqOhd8*YuS)1?$nC6zMc0fC9;l{R zX;HD~DQm!z6Ev+_??3@<&nyg9mbM z#5i#xCM~n9XPym=K#K7ELWBf9Hc#^!hBdq~wtcRFL`@apl*5TMAC3Of6GWMr15HK2 z_FQm(#jWcUmF|+Dvq7qLi?Kq>?M(Tr+CstvrsLEHc!!s+2UhA%@Ustwl>r6Fp0@Iu ztTPY{oJjbr%afstJyHey7I&x%(ou~g6q*K;M&~z-Tx^vKadDfMh$!_%m5M0+?5TI1Po%Dx zKGq$mr+y56rN8N2VXe~dzL)SEiSD|J=RQv_sd(5@yy@6stUd4wn=mj$`3K( zXmJ+4GlfyqIjJVT-t^%z?7yYPPdHvxUnkQ%_CL_u^~K69m|DTrt%=c3Dzs za_*R(bRz8USTRl%L6VJ>r1NuBOA;k zv!uu0h=I49u!yE>-3!-*>d%IK%IXVVlM_X?OR_&_tBp~|4iM&}sTk=v^_pY^H=+oC z{+M-2l;#$xBqi_>Rj%bN$wopE4q3Se!A5(8oe_|A)NFh`G)6YVr4Vs<;FchxzbgirfF+Hc zx!JvqOKeQudo{PWJ!!wx#-F4?;u(f=Y{e}U$5P$hBetN4>mAOj|M4_7o1#t)Jv;t;w~-R$W?> zwz(zw1kF5B=CsA0Bc&*vWCjdjSIXXBgXX%9>3nP)gMRT-4xAkhC`8MABYHYb3)`mG z?75E2j0ayS2j|)9-w+##v?r zH!kDuEG`-IJr&TmhbF3O=2{7--O{u&8{v5NG1&1QMG4=cfXIzpJCd=xVt9f)-X$vc z&n@!nPOf`%-`Ek=B5^A#^G-2D7`|hmY%~xr+BDm*R^&T_)hV=igZRHia;PDbvv*Li zxgs3yO5ZD-I7N|t3O(nrL)GS7pj^U5k;H6PNV#E)PEU1-4!YrC9-6=1SA^Bty<;+d ztM5iBB@mb=bdY!+C$w1~xM>~xcuk#9kSa8|1WIeHnWTzGMugMkEgeg>mCo3mInD5! zhZ!WIFrkSIqQD}NwUe1V%0;JRaK;yPlbm^Swo)H9UN`T!!K=Ge7NA~kWi1e#>DkOI zeX$Tp#9B!hOM4nk5u*Q zD~IdZNJR{Ul#I#2DE-M^autGdv2!0YerybScccb7M zu1(dF5nY~_@L!$cdL&$Jf!WB0-7b2IZA<$_#pJ;s$T`b@usTzY7wSoki?WFhTJPza zBowaK`f19Wp?0zq8#m*_^iZyg5Dm@bf*>rTr9+9;&fORFIBxe#AZ3LXv{yUYIj4grGmqSmwG|R^4d;R zs!on#CL5|w%sgLRrJF&*C@Zs1)@n9A&c=fO*nPqC6I8W#+=Q*+@SAI+ z!2DhKK&$k{^J4|vbP@q4P~9#4jQbeFNB90iI6I)!JKx)zh&k8rhr`# zy4BkGRJ2yx6h_qx4xdV$mqwvrk!?$m7+*)()pmvF*UeQBi0i2kim@oVg_;s$$#AA- z(5>9v`0jOjZH#$#GGrNEp>6MNv@LBoy}Z21xz$}J-=$5Y4sPS?3x~wuGVBD)v z1BTQ%ByQ=NRo+a+yPt1_#d1fQ^dL6Qe39WDqemmg;^dRwlm@^M&5BQ(yGHT6*aNWrP|?$0BN5AL5J|SYJ(MvD5R=+)IpL=h zMlHqYNDc0`$+=eOKR>1^Iv7!^a5KzhJhR>V)RTHWNvyLz?@YeYaX?Wiu1Ytu!Jv4b zQa~bJza$G^S{JPE3(b_DtDw-o`$+JzoA_tle3HpvZ2+GMFD7_+BCX5V19P{0Vg2I6 zyMPxf7%LqvoPx+fJQz}9)b-H*)JKwWw6ikQttSKy{`<-U);+h>Q~hfwl`uIyeG;PX zI1?>K9uo3XWi7G3BNH&%O0~YPB1o>8igwSmUU1*3g@(Jr0jT)~)z8 z7p*$;+k&wlB|Ye^^#cm1Oki;dYQlwQ*P1~Neg#B94s7+%t%#3(a4!>)wekh~Q)p#a zQ69|{7C)CGnk%wB`(VGR)(E;pE}Q6U##dM3O;4xuOl# zk{yXL-r+@#v92l#ky&j|%{g{EQMBHh63os3 zQ||%1s3Dc#%-B=kRF0(f)gIN*uaI-U3HIG+`|_recB2zr`nDJE#BVx2olDGYXm`aW z_ms6cZ6CewEG)its}~%~;Om?CTtIaU97iRP)@ALkIR2c#A6v9mR}PU$*byhMlD@nh zyN4VlnfNh-8P#+y=Q4^6vh|8yK-g5%g89%B*D>02yzM4pbhK`CFAd3rxr8@Dsq$@q zL%!fhVTBef@WreNZg{?jk58kbK!k%@$w79oqlnC!(je_X=MB`0V>6*vDHfGwTQk<9&ih)s z(U4g;%$l#%ENL>K%HejNB291vsfSh9FyC4N0n9n~I8E`tCy|;JVNJb2bBUZ>>+8q0 zru#c<3jViGvLzMcC8(*8q@pQp;nS6J0hzc_q+%+qvFl%VE-k=nlE0HyUu00@qMvq@ zfa%RuvH-H3od#of6p_{24Q}LX-Koo{;P++BdUbYgr5OML$sargm_KD?~DU&i4f}h2%)wj zZME@@86B!Bkqs6(qzejW{YI~0xo7Fp?i8PvhZKH0GQOu0)F~EmZpMOhPtst0*r*`O zmM3!5$hg|SODetw!u(pZKMN&xXveZg%4qSh81-Epp@fNMLc-3d%kT0UM~Of>qUo`h zQGpkx8)MN&Z=06ihZhpoPW`mCtgjX4(eEQOk_ATg zo;KCUJ$m%JiUf6luXH~kobe~v=$AHO zyD0s4Yk@ub(udu(ZprdWqY$0I_f&>@TP@B&H=0{4@Aq-Zgo{X8Nm3b&@V(54x2uD5 zr3gVimcKnEc&Qmq$XeiYf2W?Okk)p0Q=sb!uN<#&GUq?|iC9j-<#}e~xf02}``I|E z8>UZ23&?l&m7Z}^?gG;@HyP-ks_D<)A$SMr9VO*V4U{fBID|^$*&L94mn-7N4xE6x1L|0j3^e`FEpN=PUz2g?l+kCCW6lAJ3lE3 zO#xcUoXYzm6O)2(bdXN#y9&e3L~+LH<`CV?i(pJLGy8_q1Y6jY*;y-=@I_fKTV3BX z{#|zKg~kTKlV9RoF5B<-yDi6l#HW2|L6h>at63w=*RK2l60aZsq1LM)a42Ct`b}AT zqkkODHbf*DN#(YvR2V{*wPVSZZ}kt+Ria1oqD?)(CQFcX%+<_7ZRv?;o{4**YBQWI z3qEmyPmiGs2CP8O=ggTkicY?k8Fxmx?v{3H17{LmIRWk+A3j)Wg##0;+MBDJVXNCU zO0lc`4q9-T(8Kf%F-YaIO@=p|&%=%f_-8H-SKwQD8D}nptlF!C4QmNH)1oL8CUS{v zmDl@C!iC3XI{{o0)ba>RZY(Uvd@OSw?v+{pv^1I;2m})w;xCNJ5?OW3GQ5sL)$-N* zuTHjBiv17962TtbX8p-)RptY!TTh--wpeU#wT0p}nByqBA2g#}*M>;dM>cq#pDphL zdgeI258U8!>DXd~liZA*0FdR;3kAwqL4t>EcpV&?KaQ`&Zn1q4aAnTwIvW>lSqzT( zbbpg<5u~SqA{{NNpH2w}DJiAf7M9z?Z4VZkr+&~JxX##eUvFkb@A{%pmK?41l7X8I zLij054%MHR$9S2yVsgL3cia5c?0vPxNVV59u->1-*n^!xoZdY6hpE4(fN)OQK1BATY(ZY9|fn>&H8+}Q}^gX=5=%JV`D$-HpmbTLshsLZZn53(L zYbo}PmJ8n3g|-c+Wn{Ey0gE9lFzR6q-7=Nmt!U1nlcMq7gw1vaR!HG8s_acRbg@(1G<`fM zyf17bJLk3lEi`Nm0^`$CUmB1TVZJb37?P%fH~68x!(FGoL3LrM>Hp&~;_gRjN{)4x zHmmW1t(|MkbHr%c%wpns>2)ZE(d**lEB_O5q+$9JlWyF5+JJpVsz!T5lKKTh*-r)1 ziQeME{~*_?TakMDQ@HKlr1Oi3U1ArJbex%1gYIrZ+J$jL#CAm(UMWW*zg6y-rKB~JJiYcc93^_zeK zrmpLA9!FaEnjs$>F>e(62yixXMkIRp-c5Y$!T#FaW?`7hJ;qz9|68R$_ZY#~h=KGK zW&xnQo)Bgw?UfHO{^mveC-)X1i zMFz`w_aE$w30{l^%hb7I z1JQ4`=|ScD(lSsFX=X#ls{h>>VAydZ8LscXpZ`N@fN3dZ1MY1&elh9)YAjY>{XM>p9S2@`ZI)^e%@-AnS|Z~S`210RfbR%zlAKeK*XXMvocz4 z*3U^y5a`h8u+l*wITFgnD4%TNv_aUkulLno`!9pa1UQiBm6iCB@=2WSkgl%icxH_O zu4xOpe64ab?`NudI83TYU~;Y@@P+GFsJGU>k<%Pt8;|_Hy27WQ?2Q2SYPX+zp+fL{ zc7$ujrW~OvQ3r7WdY*O*=;rYzpZnP#IeKTER6djZ`}M{TryS78gBK};yMXF;uHBWCff+t`HMa+?SgvdF8tYnaddvcVZXC}PN8tyo&_pE~ z#b08fUt*jXN=*LpK^o3$-hIreuW94#ue*w5#mqyvWt~@{2S}TRNht z>>rd6VBZo$!XNBXJV<|@l*>lb=9=GSUZw7!a*503jx%2~)9*yNv`!m}3grpgHN3uNIh zT^Ih4FHkP*IhzwMhbMF2Rk(*IUc-_{zZ;#CPqk|1TGx{=yOoLhBX3d07JC3%wfx?* zWJH1ga>cCgvmuu7O$h~L(N{fRoz?T^u+!EbldA+Ub2AAbeLJ-u?@NWCSCi^Gwx)xE z=c&;Up8K0)Ja7}B{HA~uShV&AAFQ|;j>vOY zHbSqjoE9J}k+9Zh{KP)_W&^2~8oCaW!`8k}d{C+;jnJ*9D=dfkeC{suh!Rrs{I10+ zEQVS<1(?--n4|_D%m$(pkwW=bB3>0(jr}-lK?hy1j{@fV@@|D@jnA*)VmUk=aqW%O z=mEGH*vxAq?@mDe-0wXb9oOE1WZVFox-(v=qrJ97&SDwvDN_9s%Cxz#Y%!z#*J)*< zMB?Pi{aCfjnC7f9O+`65TncFT31RkJRqiT2X)0)iAYdqE^Rcx(``=7Vrt&()CM3er z1VX614w}yZ!;tG@>5q(Artf{ppqv=&L|O65azf87P0#DFJxRc{anR*3ylE=pQqE>@ zPu}(umkT`6!3n;c=zR{y@UqR8cl`PxIx=OFMyIl3ZNL+9N=65rS}O)1NV-mn+Dc}f z8kh|XFIX<2_~i61m2-j3$z^J35Db=7m2r!vwY9>;IU36Zv>J}R33Jac@AAq8b_0) zvX3ABI5G-xq9xb&xpg7qceT-8YmB{acEA!i_=9LxHxJ2}`Y(hsjtzkXFOq?Tj1pBs zsVsny;j;E={=R_C@)X(`pmMGq)C_fcSrFvX%cLkjW~RnaoMH0=;TOFZH86wj zrzxc$zT+XU?M}jHroZ!7R>`F?mO`^gJ2+kuvYdijSFTOs^yM3<)PrhP11m|Hrmgy1*3XUM6k4W2F zssD(|)Z=bAoGVWTsKE1j%`8kL98g1u)Wv#=J#J!<`DsDPIlsFn7StV-)g5!El%D(Nh0sd|lyYU=y0NgOXv_ChuE} z$AU&}ArjXR(W$2W#_KB&2>Jc~{oP==?zHVhQQBb{h611nYK5Z~^dvsmtt}x{oGRsraBP^6UaGlTFj@ z*|7`6pzii;=C(8-x%A!-olPd-M_>@-bN$J%9MpmoOMFn^I0CdR8W+q(iS1s}avhR~ zuruFKr{^-JHZLx^oUszcKXA6-bIMnUGTeFdFJ!4l_SWI=_%)4K`@~o9v3_^wF z3>ok^*<8v$`T&_U44#Ui5#Oy^@IGELi97z8*q5u2W`&6I?1WN;av5-%A^T~>0+13P znSsLl!!v9IU9#>s7U2g1xSlbYhZQ3V$75U9<{8lSPo5ucA-rdk##nR`Q6#${P| zCg1aw=S}#b>*8FiE{}!UOrQH>d%o;^weOnqXH(fpf&$J3aG#ATq4%$~2^%QIbjWG} zN6jVwxhqw*q|^0wanjkyBnuYx6Vz^l(;pgTmvUt-%AOTP#;s`~bCza3(_?SRq^UOrG!-~KTq3IJb8GoD(SqM|+Cof??BCJyB3;yv=v2_eU6gS_$Q#=)V$;CN@jJcREaA8gzbPAhSEe|O$gq9gZTSix6C=8J?o zDNgwLtWz{m7~oqZ`4C40i5|J$gwRDD*stM01(H7_U&bKMu3Mg^06YwuhQ`7uJWH2Ux8kDf z*KW&p{vBh5cBeh#O&ZK~r@x9|l6AE(i>c!<_!+n)A=VIc<){lSxlYUf{w?Z4> zDujr9&Y}CNQhB+ZUwp;h{eJE6R{1ee&oWry3V-`_Z*B%%RKT${80#Dw8HI>pTe3@5mgjxk57T5@FJXo9!_+k_=(-FDzZ@?8m6?^T82~l74YmnTR&H%2^NU<1hJ0_Sej9*CyY?+B>WIb$ z!gA<5@4k^nh{SM9>lNt%q2L&Zu5SO#Y0ydGb^@hIk{&&cq2B>yzJT%`7>v3ld z-c8PTGiKOC3mk>)gEBu5cP`rYu$q9zDi4&>$-*DNqsE&fIUjwrjn?W68eX)SSt2Bx z&yIg^YBrutTMHq@@a^=nEmVCvCR9JBT?#IBg2(SO>f|Gj?QTyp~ zRN?L3DRxfJuyyyp=H4r*J4TrI&{U7b?b*9t)z>E^@Wr%JFYPWTx<=xTPYcGqK8fD) zp30H5O_7OB!{?fdbRj<(&v30rkA^OOmiHa~Hu z_nYURw^%Nqn1n=ThCXEsAXV(b8*d5mxvA(XoI`@5V<0p?m&eY;t~&7STF6_JH%Z-K zF0NnhR39en2u~kKC5bAkk=n%Hwrb85ZRoSceb!f;TwsX>J%7HER z>;w7j9~?BW0H;l6n9;8%!3- zS2HZgqBQEKxB+n5dcFIo(|KA{4%0alI3jwpC}$u82iZ>))p;~DaVZn}T7TAL(MF-n zep9AAjSVQXsMeb7jI~BLwUKW4YLmyw(-w(xWw3RYag|xfquSzp__iQFr#9h3LrIvn z0ZzTr;r?TIb2^HC1j-sD<1nH?k>5So_3WZ#i>-A_<{Zjme`=);>z%D2B{oI@K@Q!> zHU*-Je(mp!mqo#+vXYLE#>$-1$qY3buYwl_qwQF&ugg$``f-PLXZlUS6t@cqo~OaG zu4Q;pnhm7!a4zmO&IM^#s~_|gxVu)h=j87{CLW5R ze8g)4xl<5LmvGe{PMjM(vmsK_Z}v-~(KDDAUEiD$^?)j)KbeaH_SNPr4mQA_VrFcZ$37^?8I$Q4v$EKu#FQ~>8Q;(f*z9PtVc zs3be*w_)=;vr5~U@!%yoGn^FSCQ!XhC>RTrE;h*o{W(KfR*&mAa2Vi-LWgb*F^to2 z=LuqH!7FAoP7iGf@wm-8t@sPmQF25B009iFcl0Ih*YK*5=aL~Lgi#xYA;Bt?sgQDt z2$XmO2+9F|0Jg%}F}C;-3MDd{Cw+Eo)ny0`Ckk#Eu>>8KCFF&>>R>Bbx-jLh zL<4)i;+N+iAPRZSesNIpmdVmk2h4(CUmrwM@hlUS8F!wV4X2#`l6sVf7=#d8inW%c z8O!RjU&uGPE6H5=M|-q*TOdFSL{VGu&6G;F zBvL-Tylou>Ug|wiFf!3z!`pqA_$D5UM0JOEpJqzg|07Pk;%K^%JA9NY_|(P}h5ut0 zPfxsEPc#fuk8t$q+Sf7FqE@b(qTGTwsmIGP3(6ha%MPtO1O#G`Z#W<66PK@v2)@(2 zCpc_7Pbhg0CP#|am+7q+|?Lro(% zLE7K&6v4m_qt;=;B?n2)EdTmUk&?#))I(4HbWrqtMRs^JcArHELy{aC4MRP?;-hq= zj;cTu-ZuJ`r`<68e0!XnK$SXXQ)UpZwKUaL2uS)Qzmxw9-Andf3k`VSaQdF&# zr6>t@dYIv|ZB!PU+>NH{bP4!l8$_?W4&;SEus+L8+#KavbY&_a9X{2Hl zzhrjdvnNGcy3$}4rcNj48QZE$6vK;_m)p&2o-OqIAEXTy<(IBj&}4?U6qQG5S}k8b zr|%36PyL0`Q(!mQ1C>1+ap4e%g3rFEx~x3lk6l<%8S7N-gDRM%GABno*P;k8BTgae zamNuSX3Q*e@qI3om`I!SEwK%08=E7k<$arfIWrd4s0uSg);AQ6Lin0{!!GQ7r@ zs38Ag@X`vNkV_}IX@E^0f{EPfO^|v2QZn(mdE}U zZ8L!u=v+VL@0*GHOr$cp%X(&fA{tj@L!wgNx$1KIHjC5Vig&eO;GkF+rMcAO*PIF` zo8lMG-JUP(=RK#{!j`gliNHym=@W2`3znv(j=hK}jOPdpK-f6@MLKOjQp5lvjF6MW zK5mBmiV_KsV=Us2rh!R0_GA z1sT@oC-T#xo&m1SAihr0W1?7D{EtCZ0gcNfXkSBCR7k)=>*Opln~Z*;60{+Dlrc5x z9lkWQNvi_W6DGHcW87`*l*zLKWZ$Fo5^o>ky>}MiAJ;M}4)%{fX zB;1sEgm_LPZU-2ae-~ps;5Uz*Q;%^>gZ>H4$E1mLNUr?!MJzx6f^SFTDr4~J<-4M9 zAd*3{%rdt*mqaWFhEn7tJn>CyU+n@f8xZ~pihew z)<-j%?Ka5!p9ESETGz;D!$rQde-AN^{(%(Ovin~A?;*w*0wpBKMI--fgtD|TA2}jb zbKjN9etNzZj=oa!U&OvKO4angVbEW^gl`L-((2bkfF-C>RTLakF9xUWgXxGD+&3ry zl>F1kiE9FkxZm%5xkanA!i^Fu;oVW3gaO-a~Wu|iZz{f_TYDe-E z&(DhiW&-wMNzAwoV99v5O^rH%WwdPxKuh>hoV4jb@XzHpjTHG9-tov8K&l4RZUQ|F zFMo++xepP;R9OMKL9Y&gY-}b=48Q-#uDk~rP#EGfo}UW*@Cx!%v_j~~kTe`X!75^@ zUz!7uH42qiiQvVezdL92#4Qk~?gmqNmy{3i^*U9yTbp68~lOPc!Extt?YTL@m)19O3z~}XJ-}X1|UNo z$ZADhBwG0DCq)GtYsr7|Q(tUwm>j+yhBBs?%(>3=b1ir|?Ymq7$Z*+QDZoICJkann zR{4bw@K!nC>C!3R0a)DgDEL@@;+)rUzig*AZkhW70I@>lbK?MzEyrGDo#ajtOOM+D z`pp!8mS7K&#+}pER^Ih5`5u{@@=i+6Nr30K30NB@s{j0eJ-5q7I?V%y9R@J}7gxcQ z9^Wvjgank&ez1Aeau{HQ>H*HkDV-Ms$RNircA!*$w{v2H1dECPGfAeG9F9Gz%Sf7EO+9p2D1E7xNWq#Wo}TB%ipjsH#5{D(Yz z3V=PK9YkPA^Ipvc<<4|vzMkup>G&5>#Qnz@7yw!;%)cB$_do&6kBom;Wu#Kz1%MxM z1El?#FQWc78PK!R2Ob~QK5`o1YT&a@gOz}=kFwRQ;!@4m0P=qEl7F|vUzqzp0MIpn zk=BRs1GE&BiB$~iu*znNGX)@bu(04$<#|M3)_N1qY4Ma(`jDTITj(wf@bB9Y={bL7 z)vo9YFY>v+ozP%>ji=mR{R?1(7px|VY&G;;;){vwqlG@)wTBbwfT59;bwH+qc4rht zp;+M4bj6We`G!YkUM92H74$q-0EeCC&_Qx&G?>B{vilejc@juzSZ&qDxdlQFKVIbho$5-i-kH0fq$g{ht40_e4VA zzyAy1L0jRciga|mCalk2?FpjVmyoye^v?{-%HyL3f$z-;9{fpFc<*tdMKX* zAo~Fw><)WKn}ouaxcMS$3=|9SFc4+R0ex#OY>g%a}9^VJLSFN?O~t1$sjqKS+j z1LCTH?icHw<~%Ih2tMDNgMLb-atMb5$SVvu*`(0sR+7r3SLPnYG?c@OV{J}BN@C75 zgr)M_bEDw~<2cqp6!?oKN_7fIG>Em<#|djbSd60JANO%Ym%Rn}|C>s?(sn{`ffog; zB;?}v#LS^?I4fWpg+qxThpzx>c$9CRU*?0+D# zyEG>j@&J$^FO)zDGYcxBbJieftg+H*gt4}JPK z9sFm`QWv)`E?#<=McXpC5J<|PXY<$^&H-2BsFMf<1k=uAe+D((l;I$UeW7NFFBt~l z6mACr+F%Dr2$q2Q_lN`4?GDT#VgiT5EjA|U(T>Qol8ZPZT^*(@FTHy6t+V*EkvAO< zF#CmhyZS>Z;W^nKE3q6;U1~HAchF|ovlkq^GgG;EDACW87z}%7t=G@v{=N3kd}+^L z(~h&ZU;Jj*btweBqG3;vvxb z(yFNl1n1|eF+0ZE2LoL?!XB;tUzv#Lb&G!JUNW3Jv)s4`udPNyKF%8(4InX`~k>~{8AMlh!H)$dU+9ypCQ8EP( z6O)Wk5`dVX^6z}p7Rlib5hkIN&5*_QmyY|Oi+hdVHVn7sL75k<&kQ*POnuPYR6+<( z8*BF;)s4V`XVY=#BSUqT;4+r4(dfgHJyQ)3&TIqpbaDOBTRJrCB=aS_2qiVhr;3mR zaPHF@K;7J4jDI`l9sPHPkHH)e-Q|@!Z43xGV2lV!*bb!fh8~87g-NZ(2 zK0t^iz*p`H=Im$>TzwhAOkd7~fC)q*nQ@RdZ0~nT&G@A6-bVw+86>SjdiE(k-t{3J zPS_L$A+WJTK0zS>!!IVAS9Ek}9MFs#otsZeCBG5}yeoOk7S6PC7E1zsF2_WRnzc{g z9{QhXQX38s(38jWHUl0aW3H$U{P;hQ|rE>`37j>rt{aa7-)0?@m!|=^1A}1 zzob4S=+OK@kG+egP*)vrwGvRdi3`HuyxjPQLbIvRzX6#o1weALApUOKw4U)q`OOc zXpt_176EYp$)Ti`lupS31O^blYux*N-@Tvb`)B_)PTzCi*R|Gp9_N|>8;?C;(o($k z{j$YvXuHOGD3OT>Jl-7P*Nbx;J2W@OE2T;JMtP6`kN0f1~k5hT5)r3Dby+f6ism zKSh0&f=TI^_KHe^FrALhz(_`Jhv|Z6aS99w4VTQfudKo6%%3Yla#^=^&x7#bwyB{* z#Kl-7zg0+!mZC{S6Q5KYboKa$Q_CjDu0K}i{b)-~Fa9n;?f3s`*T8bcL4AvgA~E4B z_g?gt^$?_}C`SyI?z=$AZ3MhW?E>@7f3|n1``e-m(dR!NINyG*%;0#Xr1yj(3LIeuu^d2Skxm;((Y^i>rTd?%+Fb`dJk5) zO6Hr9%pS4ODx-hhLlSil>ndSz57N*Z^l&onhoptK>A3#UpVaaJf@mu0WfCBJj9k$P zlmA!XL?KB-L;%12>wWyGmHxM3)T9M`6S2?Wq}4w@>z~G<4|U5>-M5_oz3<=uQ`ilj zjK{r6o9>_O8EWGIFY`J(&JaZs0pmWs#!#^6OqIsj25>V&Q|@nh{_%GII$iXAQGG@* zs3pCBys4ONv5`?0Xajr@aZ;2|`&a0{7sgPmwRltu0M^+VoZi;c*}<2hPMO}D!B+^i zOMrJi1LP?nS98l`Tozz{Vm|w(P5}8EklH5IekCy$Khff~Q*PL5G-bv239$+{8O-FZ z0+hbwg_Kn%`a4jnf2}r?Rx>`CM)h*umL_iu%4ofWTT5#9y~;1Ej{mgB@m9X7(2PWhhf!w*J!3G)zuDV~r7p zi%{a_Qg><8HID*zd5vlr5@&nb2cjs<9l(y^kx$n{TN_vr)hfkWUL*0Xh+P1Q;Iy_h-O<-34W@ zuGBXup-vkoe)f@O?NUTM~Z&h|er@vJ7;uB?(yVA;IS! zyRPlO$YojTf&nhpy>*DGP*Be&t5f8GX#>hMGJlz_Y{#(%{eK-F6* z97fDaO(c!-j!`%=K#YZ)MhnBvZbZNP4KUtaU?JDOeelkoz!)&%yDdA_?~9aTW_M@a zlbF8;tdw8f(YO{r6=U)}laJ5K@&fiho`REfmNmhW zfyapy?y-Ws7EC9EA>iD6?>JG8JRHrJ4e-A?aIT=tRxFmoSluiq6Z$`G1fj$4>&u#& zVTo=Um*$RS9F-+Odc@mz)ki;}A1F>4U91#C2%iJ~3b9H`1f5>%PYaTcJOgKD(y~DN z+G7cPL~I@~6#t-koE5L0WLX4%6zn~G=~RudML;4?27977+Ifxf(OzP(SNS zVf3E7r-ob;^5r2i^I7n#xP4cnT~}(G#iAzQY`;wd<;tGUd+6~GY~j!kzy9({av}f^ zfq_xOMz4m>lCRUv)Ce?Mf1)9OKy>{&*8&=RQW}*a@&$MG;ZzhB3SO^&+D3~=AXM>X z7oNWVTAy(_tPKB_1Yb)D92yz3qw;!%4glv(zd%3P*h6kIjUv?d=9-$oX}SpMY*n7G zZwH`oFz$BCf)lLvpNlYRf$U_|f1=E6&aX_^$xG=W$#g@hkD~}0Pr=^^++fN3b#>P8 zi@I3weHKv!vViFP$4%Ju9IA^W#K|b||H0WlTWh6sK!tO;I+)6==6{n6oq65HSA~VK zG~7X%<964jMy#EX-fFg>b)e`4N#(<;$Bp2Orv|d2uLPMccAW+&S1PCOfUk)K#`z@af(3+GK=3R#Ul7F5BDMq@}x-LU#KR1agN( z6~2Au0KKw)^`tLbQ?`)`9@7LB09x=lr`KvPFw^+tbZ)Q5&Nh$HtNKkgH|qBWN7@G` zIKidkvQ7#k@CVpZO7=ut7i3y;JoAE6QZo=Q6IPW4Na$age4D-htH&v>r$&5|V7Ye3 zzb4H*)cc>w7Swf361IEiS>DUOUku&Uss?F**pWUPNF5(5QM;^ilL^07Lw+ny+)IVh zgs|Sp&8O-c^a^4yr>DCIB=j(Y($p@+^LALj2u)4v>0?Ea(}Tsu08Ru3@sAgqHO|nX zqFp8B=wSRRHwRD-NCgR=XqGbf$mDChskiVU!QR({?57luq zSZ3#d!m;9!+P=|Godn|n~Gt-f}*aX0NMguzo`Xm&(wLlM%v`H<&Z&i^V z(=EmlAh}cd{z`761Xp!>7f3nJSfc*)5d3|j-Bkds3^rx5X4w}0sga;0;d1|ePx7Es z?wT}~2=TDn7pp5vb2uxvMXUdZMcJp59E;?)t}-5(BUb$O=Rfx2_j^G!BKp|0>S=rL z32ht!g5zjG8=q&Zb@=BR7wMnU11%6C*ZvZN>xhdPb__G&l{C7(u zrDz8OU-&MenuYSbP{{+J%<^wrzWqT!k9nji#S$6z?vcG~OD5COvC1g5vvGIBiaWQa?iJ~hDQN)M!VR63; z^sB~$;ks>>V2y8f^+A5NbhbQpQd6X}<-zJ$B&TE*w!bcZzV~8}g+G%%uIuQMUy;us zTQjeCYIvzqSc@$nmo@5~uy_Vah;y%BM&h?ndSq1PI12Nf;4XW*4VF0FA$zTjryB^~ zq~6g4!YIXVHBi9BTZ;!3Xc}0=^D2A&89t#&6_yaM+WRBJTj?Zq6ocRu_}9V{5(XL% z^^+(!PRHU@o<6`dC%4~YX?ekR@)+Wi-0e8VVt=KRsB1;KH=)Jfnoc<<_Zjad2kw{= zsf35;haM`TlGl9N6gDNwF-} z)1Y*yUr;GIP+x-s!Sbs1HY_Qpc4e5E1lJS)@9I64xGzVA_3>M;zyCHGLC;=11x238 zNbBhK--2o3E(qiCd^$6K1Wa@NTi7YS?<9<}quJYo7?EFFrU7tf3qNA9M1#7qp!4Xc$%lxZh99Ud%aDy)>@773D={&vvKlyg{Pw z!Yf#Sk5|scrRN1%aIkSEdzcWLrM0DZFHqwS>#%p+|Eywg1Mh4Hrv-Y z|6EHN0F%E0VMTme<-Ct;EyG55@X&fWp|ZI)0ttGs{g$2LuM>}B7D4JR^C8=hQ3k4N zKwjTPwGCIzI@M@)+L&H|I5vsFr&D||LVK#x!R$`l)ETrHOpKw``@CErd>tsbyA`o7 zzTxeh&;4v(3y@M(Er_9I_i7ua>6i9z7AMtoen5~N7FEc;~Ncp!Y4=!FTP z#jaX{GtiaI-BfQgO^`7vauRrNu0k|gfQeHpOU!Q>}$Q)SA^QP^h_Fh|-%E8?O z1!N{+gnitwQ;>@pVx#=X-l0W5JN{Rot?-06rK0X+!Nd&6ehQq73KE;5Q>JNHgWX!H zMvTh^f9lCc=6+=qE{vW4(HhDT<{c_~QP_1!fy-|L7W!Xoox)h3tdk^rao*`CpJG|{ z5T^THg!gr8#cUPH$G!)T?TLrFJ@f1rH3i`TNkzL7FN3O8?C!xRBV~>*rpTjmsSQ*U z=W9k3hr$s>pG}WGY6qeuZ2B5>X1~N1B&vmdY2#mFhNoT=LaA|G7bo=O_ryOwRJ7j~ zUx8S~xX+^z$XMn+tB+gUz&x`C(Zk@}Z8dz*!a9MpoBT!(g@yK{G&r+<`LOMNeisKP z$@gtUsb;kK+xl64sKRNs)^YQdM^gJi9NpjAGsjQ#HAkMGO-2+PU{Qi%Gmv5(@K^-z z6*$3?uyQRsawh@uA1P403$}Kg2Un)iSm?M23UupY#TOZ`51UcqXL#xl?XZqE%Y+zh zyM#O&T?D+lS zz@_)SEDlfgSRu1bcv3qecR5tUG#yR{y5SixzlvyY2!|FonVCGZ(r{QS`Zb8mb~*4H zW!sB9i(&Oh!KalFcy_^QEK%{-z#?Ghf$#a*cUQA2@I7NQhZ0tTvM9-X^&<|!u`lwR z@IqsH3xzc7td`w*!bttne<=)e!-4;667Yt^?~&?-E8f&F3n%i<83LYLv(2aD4+N=Q zqL_MIiUO5znkU+Jgnf}^U@Q5C;L6_y&H6eV%|HTR(h*+f4=H7^v=Twrx&90sYE54n zcp}Z_J9K_#6z1=9CD7gq_Cln4$}{vDH!LSR3z5m}Jxdm2e{dmP*`2f~N)D!^aPH0l zQ?cvq-}Jq0EO6MVT4q}AgC@p{SwZNfz;`tBw>C^R-yaWOa=^m-6M`9HJ0%pMWlQ%I z70}0Gmn`KO--51Ir#R>S3iCayFL#_{2#vgNC)>fyJ#*K%!O=+EAK1Vie3&wV*QqK0 z>%=hR%L(^`Sgz&Fj^b5{uC`hmm`&|#37pH7!OoS`ANkNaG0G{0P6k+EM{!(qr(EXP zY4|j*)_@_M+EJHF6U#mHRK5yFJ7)!AdK8fnq8@or z=_FwoJY3d-s;W|GZq~b*1D`OC3z1OK@lGWQM&Ck`*qq^6AIoH9XnX?u;52pml`s~S zE-rWyP8Uhn=rqN*?AK*Y(JNX0RD4%0{kiP249Y4c*uz~%u!c0HnT3GTWc9(6V{Tn~ zY^FflKG0?Q*s>K%#&&Y$LxQLCtf_t`h=I~q%`Z^R3bB;0+GX42M>yZnToB2kW`WDV zfMA33a`7mA;)$3N{OZHeB5!H}b8e)%>}z19q}T4XhDtv8OCZ$u{%8E{i?FbX&>EI% zuZOw>TS-X}_=Gu3gcP#A?jRtQCJ}V9Ed992piDDP>Rz(hv?PdY)V_Qk7nAlz@Q_C} zG3Jb6V;Vvx8!NrR+6~U2VU_HH(fdho8kJ(21Od2>HKP&-i#2V@)Gh(n8YJ>Q^w1Xc z%Wbxb_g2YU#j&_9ARF&-y@+V*b-kag(aC}2S@!{4n#<4|Gq0`RzKDTG@!QZ%1UtVmjL^a%iL`4 zuOhfC{qyY59Tm^8AsSUK*WRbEKoH$A#Mf|G>7lQH`d3*t7rR?~;nW0VW0>vXjZJdN zn>UYvVyF>WMOMmRRJGMy7T)k^)OuUZ%FN{MW%24DepvI;(!pbawzRRBUk+T# zR$|J39Sf2LU#6YM1S2Eqj^+8EmZ&8+>d7Hl>bNHfwC+UX)4f~`;iNYbs>8t9#F?|A z>K2&@R<>9&_g#*X%#OBh_^TxX_;P)F3t#7sHLlLv5Y2wwLHVzT2CjGM`2Xf|wZqAWv zUfbiW?J@7#K;L|`8)Cg0zJ>DUucQdZw37*Y$;Ku4`@)HIsqpx1sH3ctWxvJ53yCFf z6ORjC_v+-!%#3vPb;(%|6r0x@>PoVj2*fLo*ohBDU5Q5y z#RY8+yRB6+_3A^OiUq!HiDuZ=#9g7E;8_`05Sh3>2u)GJY;r!lqJQ@J>SGxeGg8jO; z?6=CIZkWr+a9h2^=~VQqBWvPqnio==W+Wm9?omz6i^F*Te!{%|&WEde^@;Wgdh_Z7 z5%z*EHuu12s^DK2J@1fviQ)^>zZ0#|tcGM_ulAX#u>;my5Z|n@dK@H50XxZ{4s_?U zTH`gXNTF5Hl7-GK4I;JJxy}55;R970wJ7h`gVRV~@2TRAFgQg=bZsJyEdUN4JP~Kg zI>23&Pq>Wmji*^G6Zj^aF8G^;Um2N%$V>FEP@>D6Kd_v`) zAD0ZN_-kxX7*wyYJFb^K-?ua7DT1I0r2VdSo}P#iu5`(3DpFDf2w8p(?KVmR3i7B+ z`!Da`BQM3@B_J4REJP~f8?pM8Ifzb4bTo!br(|Lg8$O`>yoT^v8`c7m?K0#<#xnIh zCME@Jl#2^sFH!P@mL-o?9g@=4c_j}q3at@;m1*Ty!`FTDIGxCMe?)M^{?m=AnU4O3*(6Dtor3-;fmmj4~JBA>H%JRa^PYbmG!KI8s%{eR)X#w zh%CkdN4wG(Cr|OQ;>!0Q^B>#1d6?1n7$Q zlQqO_&^nTCth-uHQW9v0;1>%UZct7uI&=_GeqD}A{l@mPfg+G7PpUoHZ*tM~TR zy!73a@Gf*XZN%$U2=}TCp+|y-KgfJvfqxTl1u4eJEr#d5X-Pge+*M_}sn=yBjtD#D zb&L>=xyQoaB3okR&~*vLU&Yr6MWzuED@%Z6r0`YOW*FYR0W`D~%9?H)`6^~D zbn0{Os*{5prJh`h&vR~BK$a$x;mT>4<7aB7QeiF-uLhP7Nx73rY z!>@-A7asAk$*U$%F1LywE_Fo+LcaMq*vj&3Kle=mLo}aL?R=mKY(idteimd*xjCrC zO8*)eRHlcB+421iMwHkvt0jqKVo8}7mI^7FciEhR*|^?<-q2DBEPdjXLmw$|_a4eN zP?$0<_pg;bsz1DRfJk75OgUt|eql2eIrU=Ex%XSDOw{6t&ClXJ@))m+L0P3kVO@Ty zR+YEcWTFJu<%0QO6r%V062To!QE!D>yfn2aRfOJkPA$(|1qai@WY7L z9hHZc5O=H$u#^_|W00>oHk~g(3$zP)LdX)E3NSJrB84KC*$b{MymDj~mx$X!JTZl2>gg2HbMd_T>0ZNW&Qp4l0|tKC&p$X> zxFGovgGGAlCOUCAZ#)0gIX;C=g5ct>`}v(VSv@#q4qM#(rAI=;sdKPsT0Lcj^SSIt z0X=VCsYhL%etPY9coeD^j7z}z+x2`6PME1&dzkvS4Fcx#q*IRd%>^xlGS7!Ehuytm ztQ1)2zusDj*>fq-z==!xOqhU?8j65RgDp|fbgu;Lc>g{6q zJ>-W5QMMNGB)vHSfCdYC=lGu}EXZsOp^(6D6-c^yCprr>An8*1GyLf>00}A^S!QIR zeGl-#buQ}Tx#X<~>a!c}Nn_%$&bxpFx{Pz^X8t_qxvxi^{h1Cc`!I+vwiR<;@|76!N36v|g9Vmm#MQyH>&2%d^ zWx%qM`H(O>QjAzmb3>-rZ>i`-^s{@(&YePthdsi?(PG#H#V+#_KKHv3nNm;FnV+tb z_p05a7p>+^uM07gvG@Banjf8i%rXbRwnXl!y}g*P*RTYUpB|K!ruK_jNVlUB>_O_QSkbQI>21+`lu58oJGA)-@3swMv8&Ne}gn z78tf1LyoB@C~-JqEtldKl_ub^EZ?!lz&5c-peJ~g@ZNe?pK^1eJtX9ytlLC=izQ#a zcc(is2#XqKT=WXz=_^uFB!43Mqs~U#q#iq+DlJ@vJ#a%xT{~@YwCw7X>|XB&W%hP_ zkCvV}u3hJ8!KypvYllJ%Eac(V95E`C?@0!>wX)?CY*Zszt>>ko1S;%OXSXjHZ?VSS zD5{BUupVn?^fSA~|MHMSh!=A~wYQ(>sCqF5*7xRr=l(E={~1)Qq&}YMMZ^?osS0-% zV2dF%=p?~zdNPE6?0UNf@&xK0#gfQCb%*MHP4mhfd2upA;PTylPL58G%~{N7Qbdt&(K#(vWgXjwOh3hvCf;Hk~wBFg@l8 zdRK`w`zbY`)(p|=GCrUS zGfi9&#_rhc8^H#_U`fBY)RasJCwl7-Mmiu9GHe>wf}bC}6nCvgC%6gCWQE>XcrJ$& zh3zN2%ltn-QNfCsGcsBLCWzc|lB$40nK@0ExjP)st>2RJeb&&HFqOR0K=4IU41<)5(2RQr8U-)T zg7K-Km{3!jLCkYy{y=Qo)wa)ZKOIaab!_`DQlD9z`0i6YA-JiVX@ZNOC8p~jpvUSF zAiLo)E{KQeOcJj7?XgTEi*l#$X!+ml*XQ5weaPLOlNnRgG}92Ru%Kgid}nO_6kv4j z7Sr?nJNcPP#QSDmbQ4SL{GMAZgpB(x$6tR(&%r!f0$S|L;m`N4{PVwZOa3%(mGW}^ zPJByI0SoIUBLg}YMp!Zb$JBhCKH6EHV24ywBUjufF==G6=6oG^QuJ!>Ir)i`g^{LSPRS$uKuY*fOZc)DYh-b zF01_j;?$pbGp5chxHZDc4R;jI}$j+SykS*r~$q2B}=Ed}<8a^0=r zvv)H?QX)!^)3iJ4%{I-4D7ZDl6+I!IkSt!f|n==!e*{e6hR9~^wQGF&#!QJGwKHs zrT9HX?x=3OS%>Qj{`nUEei422ALRZKoj9m3=HE~885$9)z6v#*;(7y)z`qWMVxc9v zGBr-Lw)j7u>hG7%qy;x+y=r-=5rsN(|9aeQW`=Pi0h^Y)f1L>bc)i*+28QwGwaE{f zT>tSlz$c-+nc5r9IDz-C=R*Av#)=7UVy&otVDMjWU!emlR)ick$K^lX19%*dB-Uh2 zLNRJyj#YOo(QVcT0F|f(T3s}lvqIrnaO?kbG!%Lm^*zVWXY3220Qk$7o}Nzn$_Z-~ z6mmQ(Mgq@KA1UmG@)B_Dv4C}L0bT&d~hJ3=Lon&_rPqd7?g#4^5ZM_A?#5D zXy(PNKn!B}bk3CkRMXc?W2pS(G9c)2LG$rk0&o!IA2as~E0L%nV7vnr`TkrclVtwE zd0yYJQ39O=P)@l;%vIRXp9XAUc-b?Bc|v_Q&GtS752oy6UGD-<+C;U#&E$X z2&i4lz|hA6G>)|q7*q6qL2c9eXsy4_5?MxB3sP)vBZzpB?g;NXZ`BC zLKt0-KRmS^vHY>|7-rZW9K`Jkxb&)Y&$Z1jxmmOJ_8sB3y<}wE^4P7d74*3YA{XwB zypT)~E|3fa8HbthHLvU1E_@tRry>DJB?_Em$34(VLI5vPs&Asc4$xuyb;+&52y$*$ zXL)zzdR7eJv9cR0ga)O&cc%pcPIvWd%w;dF!twmpDXkVq+=qgnJ7HctV#TTi%R*Se zAUGFjg27-86?Nt*5S!p7fO=`gRcX7v*m3K)O%Vx-eHj^WURnXMzX-U=R$#^xmV>|07j}qJeB<`qD*uD?L%-VWKBKCRBq$ZK3=1`UgwgYwa}&%4C|R6xm}6s z?7J4aXajcZmca|(0SO=TY)KD0Bd4kloq!C;saIg2h5ts5glNB;2Q$FH^a)VL$UL4C zidq3hhG0Sm?s5N#KtBx_9YxcH0~_Nj@{-%gw(bP(RvK>RSz8wSqnxpEL5=~B*c|qV zN{3}Ix6#@w@#8kQimcIUag$Iw`kRxwi;rtitxiBTJvDL?50kDpAl0&+mOh$WQ^RF*bZL@ZVE&f z2-~$AFP&yRLcqtGt=dNB0ci2-P20kK;QM<8Y(4}tXYLy~(6|CutMY*0=EpNYk_ii2 zE!0(;eVRSq+^C|Tk^ha<3xI#d#>wJsoMw9E|Km-(gMloMNj}kneZHi&R|m7%=LKGR z2WwOc>{Es9U?zD(gAg(Q&kku#lb&PspfI|FxA9YpfLU_21xw3p)6Fqb`842$v7hdb zRvTiBm+uwLV~sHV9FaZ(>7?2B=)E#d{VkfwpBnrTKIIK!g$?!P6@%`Mj?(#MtpuCunV3MxYm7)64in}t^8MOt_G$G{jO%VWmuvkuIG zDBXxfEwsVGRE@nan3)tWFaH?6SVWk4+|*BPfLm>s-xZU-h|T_rkRb~zDFj6ve#VT? ziup(tSi5a%OESL3x^bI922aEz%yjFC|N}QXZ`7Ef(fBxvm$MYB0+j`o)mn zmloXejtFKm^QVy*G<$q_w{0=C*d7>G=$f(Qn2roF-SlEWKT-}oivZYuAsE893^Fk9&$8wi{R2mR zy&Xdw9&HhhE-3g4G;K1g*>k4}Bqt_wKX#fW+rI>td)36watLyrVq$;He4H`5JAqzy zR_bWMWz?Ms;;FsWM>utdyVBC*n?s0D&Y*jqFZ6)FG~U-dU{6$Uq3`x4*2rbA+&WiH z`a|y{?Z*q`0sgPLSRe=i!VOeXVAes3R68aV7CDSClD-b1WP)Mlw2hfE>tgV2*|>mJAXBV4oZkk$IF+-#8?(diFzhDr0;G@R z*u~G))VJb!t9**)1$B2KD>U7@YDPx|CilacJWr3kJvFp16BkT5ggzD1bYLIZ#FEasRxE6CaE=*br} z90x(N{crD25}Y0K<^VzYtKc4nGxjFsR!PB~97W9lek`Tm8E&{6_XxCjKcwqC7}#uG z3Z@ug{v{quznF4zU?ztw(kbLgF>ZTwqO}bds!b)WR!Ty8kI4x$AVDmvEI$APvh^u~ zWRD<7Czj_x%!~QW4fH2vS>3&FSiCp1R!nQ45-|d8++^&aGV#%Pm1abocbk;dvHUXM zcLh71JBcN;Th~Yy3!j=Jq6BLNmIvx=&Zt12lF;GP+Ym zrIYYVzthMUvep&x$MM^1JWJVqe07-KO<<+*%xG6a?3&fxX0}tAR{?vwH|qmS(r9`& zMpdN5N|yz(G&_0zbGWX$#w1UAcXDoCd|p?AM0awDSvxR>w3sA$;vg2%N&I0^?7S(cCPUls)6{w=GQWbA-a{viV0AC8x2eeUu3uFT z=Y3;3qU~=!5HR$qN4ob@uQdD<1x-72dOEXvSXE=!ZT6T%-huV%3A26sQMpO(esZ2v z!0)#$+K33-19g8nrhaujnx&Z;I(lNdPX$cYb$-c~1wVPb{PmEu#QQlg3O)@?OQ&eM}F|Gp$USUM>pg1)v1f)Ae3F`eKq}jCzbKFY%WP-Xvg{_9r1Xodp)@ zCUQ<~asJ zheemA;4H=`UI_8Un^88OdH8tYvMEsr`RVTT)?sg_{u$QtHn(!81M&u@+aTMu&d;+v zw|i)|j_(WfsOZ|&ZM2v)R>hn=`f!3+C@u_B(@k>kee;#&TO1cNP!&jy&<_T`kHPrs z^>UL(66-I4ED3dME9gkBg>|l8>$!B=JG{P%%6`vd9qGlhj&@d98XxE&-e!DXBpQyu z%O2BHf|>uCSuwo`Sf;!ed~lpq2Fq8wFq~=gL9Vgm-#4aO`Aj?`TI8xMpIhJ4AuA1U zinnLN&%UO5TN>%gZp9?|;hN*JzflCL>C{y(%l{^}A&ugesOCf;Oi@*OtWU6>N*)@Y zUG0`PrXmuUfD7-PSLGdjj^yBBevlosT$YfEHPmHF8T5jnIdQtM(SFV8!`FxJ$4EK_ z?nFFHOchu48%^lJ__|`nlA3yQZV=#^8FPO3!M7j9ZmvPi?4AX_s=j( z=w^67F{Oc?DLjp(WC#mse*#w{0TVj$x}sb9S!Tw$@S3Lkh4=U#8w^p5YD-t=>sH(M zb~$jP-%$y*|MDf?T_VbxF|E7`tl_7-!s0aVc~lJqIe!wJX>X5v3;Gc6sa_Gjj2_v< z9cODkTtKn)!464*Of$7-Nj_as-lKVwZuq>I;oEj>?#B;#7%9!lTN&`t6Y*xrMdaxD z3~6m;vs`D6;~+S(rPzGr6zQ0E(c&zlcfy%jcpla2Yus@z#c^lI`SJ4D#Q8(Uho24c z3vyP`aW)gLrhD#Oz|RIhxGKjzOlh3`K3kfDFQD+Kj{@>O9 zGV}2mH;0bNwBPu-);_r_4CQkm(V*Za&a%xk?iG3MAU-N)LmX25Cg5m*Ad&p%;N_;l z?B(hR*21#c=*9VE#Ku?Ionl_ir?_M3jId3wjdRvmV?^xetPIyOC#vzDn zwKiK8{8_rQueBhn@tn(6^hUG;V_kN!EVmPk+;Ii+jU2|@py%>pz&7a(1w7Nkv;wk0 z99O<)7XZInF#WmWzWx;L4(B`gBlTHi8-c^5>HN&&db0}G=)x+cJAVA52G)4t>18l) z>#MAtfGoY>T5^Re=}tLnEs?i;M$M!4y8w1?6~Ep;qEi;ox^0NAMSHOpSkgyxK;;}! zdWAK~A3~Zzf(E%yPZ^twlSqj^8b?M)E_Wd^%IEo3-`3i{V=!ul^7zKNQ7;h=^AmdV zT$f0K2Vy=*Q+PVAq8crqyJweFNVe2PMDCTs5z%_Ym!F>QX_QB+;g1Zd)yAKPb+>qK zkN0?Q7uu$ckB^W;Y-4;Uh-~R^(z|U_vPsjVoT(;K8;^TRAdT3LJK=EWA?(PU8^;mn zSYz%zY;+U+LtX+-%r!%21Ak6Sacwd}si%CnTr8W4YyNgu^v+QVMOZAd;1`^-#1cA4 zwP~p&R$?s0VjRUh62@=8zpuTpRVblR8j;IKIKC#`=k?od{Easvxf)_!ta_R0>};le zv!5mpmtD%!+>x6BB9Wu`;x6?u@24!*DY4chsL|L$m?QK)ahA_06yYC}>(MU(wF-o+ ze7+Lvt01{QJ8T;6$B!6~e?Z^u%Zi1-%1#*<8#IKGa_W&ys8 z$Lct%q(tg7pNTG8DGY854P^fDUSY(JVoTr@QmhmQEgx&dxBTKL?BUR~P@MckS*tt@ z0%PB%@B1aKaglw%xG-~e5=*lz>9HJe`x|T`Fof!4n9VbCTiJR;vmhGsQbssyaYj13#F1?fm}xvk_+VW3#Pf)*j4N=qB_MIf?U2l;sgk zik|VrB@eQ6Z{%6qfl__Y;VJ9P1`DF^tkn$$_2ba;lg;;}{T0}TT=rX<(Q{pej$m#~ zVxdX*chKp@H%5P)3DhcKjr{Pw;RCD$#y@o1>k51`IBEf0z{ZrsK}l1;z{gW9EwI2jkoxsIRBrJIK!<5xl-hin>eByKdM>!W z$^1DcE=fb=9yVcs`N=aVFE6}z_4JZX9O9=HVi!BI!#O3qig4sc=el)Mt}rK37yW?Z zrH9mkLl;$E&)Chp4$tLP_!7x+7$sp5+Q2;bMglAAgnFRJU_FDU)T{ZAy^9BBRb{I$ zceBq$8(-PuGnA$#3v_4tyzCGykd$-h5A|^vcoV^?RF& z1f*Se#uu*6)xn2TxNg0UUf74d{qPW({7BB@~nz;_<58I zRZNL4`{}~)%H(nkqfhVb(ZB38Mf11p@(CZNE4kc;Udh>0-_Rf^2u|3@L}m?r(v+%a zFgtqnMg}(C>@xR1vjEi88&9^Dij7O@h2ng8v;so1F?$0#FQHexz89uv!Qt&b`T0|L zR;F9;1PT+Q6ONAf1bx#r)RTQ~stFpMk5&}P1giNx1g98MYa_3rmR?a9&E19&M+XwI zukN?<0qgo|(^-oRPiWKkw`SV210%Vg29M`WN17`8o9}2y&mHF^)QtX8T*Rrt9Ou;X z^H?958xCABtaPX3SPDAwiEd6iXd%}KWxgplSR8+XS?#uY^CDr z4YXJ)wT83Co;Y{?W(~ zmaYlT&!#;!MAiBlz3|qValPcMxL+_Bq0hqur42GSL-CgU7`*5?QB+!A8WVjC{C6 zdK)il^L@h^yxrJ^_{X+yLHHT`gJ$q>*I}ZH4F2irl@PO*uaHXiV`wF}G;&iOqrqLS z^L^wt8~(!l8kzPHueFfwV#RN?g*Bp;Y>_A)Js7>biE9(3gm=`9O~*L_Gc&*S3`w3e ziSmy>SPNnY4ZbOkpKkILz(|S9Q_easr@AdNk2cb30*_XkS?6$8bc1uRaym?B7s2p$ zStG{6IOUnHrnoSz1;>jMx$J@Wteo<}4N8{?r$>p((p)Azz zKwAz;=wp|K3f=0!L^tRoCliC*f@rMD!CneNh@f!wfbsl%49aEtQ^y9P_5z_4zV5Ug zkx7|Yk@2CNRoaDBQ_2T+-6;fe5N2wnffPO%t|x=roNhigf$?fdM#HvldriY?;DlZ> zTsq&AtxuS~Qozg-o$!mPTsW^JwaH=eFyb?OD;ejds+6>63e^l>e0ns^6cu9+Y3636 zDyvkt(VCL!tgvBb;5I#D3jZyc0tXQXCxMBL)(#T-2!p`xiKt|m1H1@JLIqU=MD~_P z36v!!VB4s^8*`8CrG{(77HNxugrHN&o)uxtxx=8Zcs=$kBr;5RD%x^i*Z!5r3#*qe z^=3FJn9r9!E3mFd!vqQ+#rl4V_qlsmf@hsXx2`pu!NsE6dDO~?ztJdcsX(*m(JAS@ z=PG30;4H&Dw5N3JGwWC}V_P6^te)dnoh^=Dx8ip!nJdH2m(Zt#&X~Q8=6^kZSgDZD zD7thP<~bUhH7rFfATUx&bm)2XU5IeV^tUG?UZjw|{94vF_gb7iU4Obo1D?#{8co{M zd?IZCI^2scUGop2)MgD9sf4|U#S@xV-ew5JWhe=%AW&*0N;*sbc9v79Q%lZ0qpXrF!&?qHNX}Mp#x&7t%jsI~J3g|W2H9{v(j7mr zO%fjwK9E5li`s$h;MR|wmE#rbC9B}?aZS8E&p*;eT#at7eh*b=l5IF#3>aU@%jnO^cJ66qXE@3(xX*sI_{dl-O24Mg;C$^ z=3ywIOo~WkcK&#?wSUCuM|Gd4pZ!#?;xNUxL~MpenE7dif2dZxNR}n|;KLV-1D6S0 zny-u^@|9!a`}KsmpLR%FF(2vX2SlOw3-_Nd*py#BPkcxQZG-Cs5}K&qXl3qjz*o-E ztN1QHxo>(U*pWYh(42O1bQOLQCm6SpF>RD;!X^j|UMjA9cH62S}%$m7T zwo1=kNT;sM4%Pjdw%sP&m3-A4Ec#8v!i)&z_v)m}EtO~HZpdftUDxN2RP1_|I;sWD zph*#@&wY?Jr^tUa5?`=MiA#A>{7ZL54Rh*?OWLw5eoctH?xLbyZQ$XUt2(CF$SYYM z>8)l~OwEr4UV_Nev4=-WeGwtt5`0xdk$1Ov1Pgzl6_*l}Z*MdPqSbzLuUhT=MA3-2 z=3ScW7ssgJSu2q7g#`*X7ud&s^jRm{m=tV{y!#lQ?fL8bO{GXF+Z$QKpCA>R6hdl{ z(3>|cxLzEHd+nexOgcLr5U@?-nv&?%|5o%*Li1aqj>rgu(sdX zcp#TExjSdbUJltoOI5F)8-0Yn?04!jwYr*P6?(_R@DU}E`~kzbxNb!!f)Opc|A2O{ z-D!vl>#mHh^k_Sb=rxIsh+Bpevt}r^*5;}Ok2^0THHYdQ({qWtyOdSYTkFI_iP_?z zk_qw++sjmYy{gi!_m<4HpJzMWl;o+gT)7q8k5BG#3n8Xvt-h*eZmh>y5JP%QeSc@I zwbCH}L{?`&xlIt~H10a^3YlWpHGfccO-Z!EtSxJpxi(Ku0FMbLfIt?GG##4-e`@RN{14?y(TY7G+=f7OT6Gu;OM~7#W7wXg7&PJ?~&f%-fcS zk7xQR7KH}7F8B8y86V?#Hyk%CyLcIVYi>?%%xFwMo5iekXn)NvubW)3iH1X(PlRF2 z_+cCRZYcYPVl1UX+4r(4rTQ|=H?}V@X8RP|RE!Xz_iW{rPD~sY-)FGXam#N6tp?=o zv^_gWhIf$T2`*}FP_Qr7*--unl`36?I_C!q1hR&E4Wmvkv@-%BwThjW4tszE6xFI6vA`|A+ z;0}JKYfwxgjW;-NBuU}dZq^Hrs3c+Ko9+Y;cUP-vG?Jdq#NqySJA}SV-OPM8^>Ioz z%Qm)U$*@dkx?FIiLOWkznfphC;;X3g1LV?b+Jf=YI=6CcMAFk1f$=1&h0xbCmXR$? zr6TiNky+n}Mox$BD_@hw5cWmgKo8foXj7El@bLeYUuuXa4;O#}5_gCza z8PlsblN`VJ9OEt6s-%3G@$T0$vXJ-7WWIm?9ZrwNhOJn^^Uts4A9tU)hE`-a=f(}$ z;h3auQYCQ53-C{FM%#UoFF3>O?BdT-D4$rIF9X?Hp8y9 zAza|E5k1mqky-!n{_Mz)1!ZqWB2By_Bl z^eTIG=jMNM16*`~DA0^C#s2S`p5otPN))ZAPB;9|2SqBBp~!~q6z;qKebbk_3Z-=$ zlNrzdn{0UP30Mhky63DM=>K3L{=C=Mk^o=$_Nv7|_rEcU3~)XVs3U;&fyJzvz`^kb zWWFNF9+?V)_&KcblGNzG@CpFk;D;5b^@8{i53SF5{1uC72gwO9T&3{r|BQ zFYXp@m7>DnBAv}(_(_azp458Y4uBhEK!A&48N{n`L2l9e+hw_S4l$cvJ}q$TGex!K zD541Zsk1^M6{t}vqad*|T5HwSGav{CB94N&38VG4gFV#`nn-}&hPNhe zV*J)5I0N$U1E^0z!~vXUec)zhy;>XTLZ0Ra>!Dkv#qnw(-#EdTRGaWB^)y+2v zfCOC&Eca*-GYqaf%>K3jLQBgaC3r_P?|u@EINvTX#+ShlJq#N`KoUl4`4IfJSyUJr zW;ANbK~z6Df<%-zjDmiCHQapr6th#^7)%FQ9tGn}-VQ{M{|BD)f%>LoXMc%5$iC5- zg99P}GW0TvQ@afRkFl?gs%l%`RzyM?q(d6%P66o-1?g^(kTOt0x;xyogop}CD~d>W zgS1G4AW|Yy`n}70^qhO{?~iW`bqv|;y;saN=X{^{3Fvs+kAt&PDIv(2T<-u4f}EYO z9jvf+8CSf2-P(T;Qe-w1AGRg7flTKj;-F{+WD9=o;n~Ju@+aBQykwwpZ#ZoQoqPg> z-T~4Ia-A^{FZGVRrFN~l`U<@D1^cR7LP&O6P7tdWG2q2<$01Geho==;HBf|F;!7!I z;4Cq@8A76km7tE^ei@W2Hm`u*ugR%wK41;!7k*1>`0`L4wA7m+D9gqN`i3XX&;(9B z_ZogJ91I#oXgpeoZoLIf;vC`?X{P#+hSHBD`7?>Xql)kPGYSX;Ux?JRZ)E( zI;O&SbPDMe_nA!4dwG^v@OIL(UZ_!Gi$X4wViL80ZA5kexCfxwZ66*$YfEPiOnBe8 z56EIpRF~FFa+pHg$!U^n4?u3x;=X9!rQpYU7WW3UEF0dA@Mg?GI2UWMqs70*cpw^4 z@zp{iIWJ%ngzD)Vv1EY{M;&tiw7|w;Cp5P?;`K^=FA+l!3ltd!?)8= z3)BL14KAod$F?A>>uirnvOvI(V|Uo(hr)-jWdVc7zNr@J^(8>3yJ?8E2XYK4q=DGN zh#6=XkL+~u(VBxtT`uW--D%0=VN={ zg#l$PmyaU9+eYayp4A-9^SYzyQTsknbExOw@IRCscXL&0+(!@6)}gPTJ=^#O*gkUL zZt7Ccq~Hmh036PeGPz=d7dcjnG?rl{bvs?Bhh9TBKVy_%)s5l7-uf5;t%SD&gVrH_< zXUkv10SA$&?c4-8kcn9Crt)Ee3DWHns8BE;aA&mxF>;Zx!orHNrjQe%icn^PqHSsQ zr~q+?KUg%n{$SB^rEgc29ga*uq@y={>fqY+)QvvilRa}AXd{N{3=80mqOD{_H376E z41dIr)GU};Zlq%hI?i_cK@4a43R8OS4yJ?Tf0N{{h@lCG3CXF@ zOE?yo8g>(*t+EyXRpXqXL!U+>O_S_hzVZ-B+3$R%At;$|1NO2lru57zi1{CtbIIIe z@+o9GRkFE=t3GNC-J)vY6vnNY+@DU*S@aQ4u7HnzAC=%HrF|Z`=3JiNw2bBdL9~5k|!JDB46imH${{0 z!Oc8rtoSQ^dIn~~iWK6?ALJ_dtrUk<%*3r04?)47$r$TabPUF{A>dya+s%FeTs1{1 zT}Mad|9(Kvhsnh9YljLkIua%asXoH-+M#!&y>v_CgpVM!PL?khqCed|gw7}mh8uC% zKLYC7n~!b^gvnQ`A{;p@v6mkc7I`ylFh|Ohq(S%i`f%uX!sl$E6$iq7@{+qmSS*v5 z>vBZE&uiK4OL;q8pm-pUWy`euGKICViN2LTqn%tPrctm9Z}o_dQ9-vp#v0E_#)V*Z zvBHHg(yd)gm(;X%8l`SX9qJ58V>rQzKEgS(ivc#U;ikoCnOT!-n7$?ks{ z{j{#i=#7?`;ZPO^Q+iBPl0f|6S=}LU!NJHXnH3AGb>pHu-3j@KurBdb_h4ul^0g{Z zN7OQByrc8Lw|(u7PaI4({KAGfN(n*$bDqpD3O^}71|f7$i4f^*KkYIOV~7Rh*}CL< zK4jRnxs<+gxht}EnIW9U`ZCSeEB4FO^L3b3Jab^dOJ=AaT$?kZDZ$>&Cf(CvE{UnoqGc&M#GtHp;!1kJC4_Q{J%~+-4W9<*o}jV(gNrF1JvMd_&C`4kK`UeOQU z$?0J_Vcv}{=Qr5Am^%gM1|zKFq6;$QLM!+;cYzDex3lUc?UBELwk?+&3BKtKS;A)Y ziH<}J%MiL+)15-JvtF2!Oen0vR8)j&OH-u(oZ!}D`s7l_XUNfUFqYGBd1CV10#?!G z^H{v4vrA2tXkjVg$MZ6)N$Nc1D|mv2k^d&F+Q~m$&1g&2H}0fqpM4_8?$`wAMIpNr ztD2Zl455Td6ppcsq|dxrhoGXOP%Gf;ag${frS+#ibJMilm}*HjBt9%em2qFQrE0 zrfbx=eUKm}&5)A3BX?ymDbb+HSIbT3wBTpHfE#NgPwZ}KCC3nJa@f+wSBQ58|ejf9wYmY*tCl{!y7 zUEaO3d%Nj1D9!oL%nxke^t~k&Z!ZNpTWy7v@pIp<#l(lC&o1^-*f*-)D9BM#bft8$ zELGRg9c*EhDoA6)s~fW?!MaxSdhcG8nVYt<$$#%~%b4k}d@4+=y<2TY?&?jL2$&KsC15YJ#R#^^ggdpFd8>-(BhMvt<0f8SwK>TB=$r5nA<` zK+rc2(iqO^Nj&&gFOf<%?A3F`ztC1?!T6`nxJCe_$1`QAi{wxsU9&;Y@mWrH-+OQH zAfp-hzye>R@n5)$g+8{;veOHdsozqGvBbOI?hsP#bf9Nowblef)xk^uBM^hn3BG^v zd`YkV_pCW`9zNJvO_M!WnC>(U#+(s3p6k#-?4_HDOj%SGt@@{EqV%f26HACS8iOgf z?!*&(A9Xv{X8iTZB!?LiNrQz0<9{5b6qHv*& z*vCosQddI`ZJlVyvxLCD!8!1to^)xTYoYHp4nORZMY+Gjc0Xs+^*t+%`uAD8qr7ms zb3o0r=!$l)?tCcl`-?2G6=VuMuuHs2jey48L}=MbD=AoxrBRrB|;`)MhQ}fWtW+HVoA@%bdp5PQyi^;OY|szB)o*!G)m!2Z}A1I}i@u z1Z-(HFA~uS+vH!2)AfvEr0zlqI>dc=2bI<1d8_cd9_*>Zz?m=X z+4I*NxHMt|O<>;(=a$Sk2-v%(eW;{;8c7HA=+SB z#KU9S0l%85a@xX^U|$But+g==Z_|W>O7Q*ALV{A{l36vmXpFC*&xc_UiG#_XCiSPj zfDSgQ;R>wf3P)vzW(cd+CTc@;<4Dm|RLg7uL}uaqiQ=nFnY-%7T9VyK&%gY}A&|lw z0EMV#9sXZ)Oam7A z8Up^ucP?$T2vORn>gktzi+u1NE`zU~VyOy=NLKD(4Z$D2CX|=yT9a<}6LQR5O;#^= z-Gz}K?mzepamLhn>GcIlU;$lo4R;{@4yPEof%_(RmWs_eo{ird(_$TTGTN}`LnRkI zkjV+E(uPPv7KO~^pl^5{y}7v;pk&(&LkffH%}ZMNC*v=B9wcpZ;^p8DbF)=bI(QmQ*0!=z%Pwk$Vy0ZqS@w2NEXGq33=O7La zOmk{U?*aQ@zEOD)nuQXu>tbAC(?D6ae<~d9_e!h{pFl@LolhGahnh;GGD3uuM6bsp z-69g3CoYs#E6ed^6}aR3Jo|fP3*?Y{sH4J!Bl1Q!!na#B+`g66phwI&=LXF=He}{3 zeu8DGwicwyL3N3y6CpgGE}aED!ii2pD&~dWXn+P~U!nO{$HjL`mdxEJu{weLU%ZZ9^0tB4n`>eO&^$$2B!>i0c`DSl~R z?+?6=wJEp4Slegh zWQSyPG=pfs%3l8$HZ+UUnRDX%Q0+TPU19pr3tfEg>Q}Bt??Y|$fjebxG`qR(SyyR8 z#jkRyCJ605i#xcMbDak*J*{qQsL(?F@;CR18bcFFcnIe}5QFQudM76lrhpmA#BULO zUIN%HJxd75S;>`oYe^Fcd!Z$QTJ#Aj<=%~ zgMUdpZshz>;2>`bHljLn`e1Y&N%DyHdE+!`O;0|DovExG^6b|5hJ&S zxDP)H#~gKWrE_fnDUPdI>(@t8JE}NC5#k)dH*qiC&CaX1aE_&6X z65Y*)Lo2Z5%1_r^A~KZ~pufL74<3yD?uw6L{9nX7E#%=iw<9bp1=<^~F5u&e%ACSU z1!>3Btd&TUiZ7IOLZuEySWNr!=LXHKOJ_rfye3b3NV9r&Focim|6ODRK2`n;`Rb@! zFNKg3E4YZ&XUmfLtOZ(4DM#t2;F>mr3@YI@QVtb;`QTU(+XSI6nI6wsiXNcUJT80r zf{ejCdI1(f(NcEIn1sqS%JuARn^NHpmY{`PAe8bWYd}#f6R#uxHa<#Ih2-{biIdVD zN!&xZsp)34*%G^3pwJrMtM`y5F~_XzgqW1;2WV{bAzv9|<{^1w;>i>pq?UAZF4tmZ zi0{PNM1$2lMx96y>2|`hSHIMQ*P^w_oIfF-!|4tnX|diUqD8kpc>-3M-iG?xkSz4# z&6n5L%1pOOBI5Y%eIanAn7WEywR6vfx!K7AYs4GfupTW5d!l9JT@e-;(<0@t$+Dr^ z@0}D@;98(eEMsg>KrN8$(9D0JZU=Y!u*o+>){cO|1PuktWl*@dp3kfmi!rsi)h#Z; zgyfHpL$%WknJ}bVvk%T|cxzwU5He9Y0uYNoc@nYf2y%hQi8K)_e0Z=Ltj7|>l=jjC zum^*uE!Dz4krrhlf)b)D8Uzdi(gYXNS&tG}y28aNTkv-fM>Y(LXRZ)uGY5vg0)jj= zI((w5`O!QT?w>qlztcOts(yTo+LfJd2*2w0JXw1YiJhrClw|CZooW0IE5E3+LV}kH z?S6&%G#C;OC-amBz%c z=-~rEvnqSLcf38NsDDvVG6^3_9l(|>=%s~lo(t|_!V2K8ZKKX5*gpDnzqbio*r4}Q z4Yh?}4Z49221hiHuGwfEuWaGQfh{Y6vra)Ha~kt7bG^Jr5!ilH>axaLdK6EBEEaXa z2Qg=vH(`7$ByvrX3=t$$>eE9XArSWoKIMS~7-(}(LrRa^exmdu*@V;M>?V-?IQhsn zr=KVLq~shCHd3A8h{=%9vk}6@C>DAjo$nj1?nVX^V_@mbmzaF$W$*p-5&IJ`#W79RNa2l*VkncOF+D?Gb2e<(aNJyozI!eBl9z`Nk!j0E3!%goDqY zps|}u|M-qTNQjPGgh0rsRFB*bca1YfAs2ss{CSc~^$y@+{jc0zIq@ZqM0mqJ1td;sqUm?lCi+DMP$Rho7?*efaFIs)pPkV}5B5D=PQ( zLYOVZkXF(w*e5gdn#{O=P2j1=r`rDy*2GqQuhae05uw`X%NAXyO8Z_Hb5<((Ty?A` zAv9pMHqdi3UB07&1=S?*ahrmN>cnm(3YJ z^(zU~oAxU);!OUlxgbZ67YNvkU+pQHaU>kvsng-Itq)quX85Ux49!o@PzjM^#p2k< zppsr=v#s#6(29E&I(6}R*ivGoMcr4R0du(J@zw_uVxS`I@g;VpUygD7ao5%mC)SIQ zvI^x-o2)66frQ(CHZ)JB>b_Bb(AJ}-d-}(;RUd=g1ib^+l1%qX`z?X~fD|v#KrQ7Y=Jkl3odkS9BN@x7t&n8n(VK0DZFfFAo~}v+WXH z0IgmMMznxsQq*#iPioJe4W7^!Cax*O&AsYYOXLJsh{K~)eSyc9#B3V7ufMhwiTai- zo>XEm3RV_g`N85mKHS&n%N(y5kr3(t*c3@UN8_Wo8)2Z2zB>uf*5ya3)ydlz_VayO zi3spR62P3!G7;3SGZ&?vU6gY!zTT%2QFN_|9?WKRg+ujn97IV}G=CLD1^UBmC`# z3~wEI$>&#rt5H7|;Iu7hKuWx+br1C*%BMp8xkEETwg2x&wP7A>BwfHx4ZA1-wYx3< zrgaCamAJ|e6}=;0xfIlflOIHeoBu!^)g0EYRi!r3fnogi+s4#mmGE{1LK3hb^fWY& z{GQJ4@oWU&<*mhb>3;sBdKR;Q8b6an zpC?Z|tfcOLo53WxeqB7}#y@bJ5oYwL=S~`!!Eu$m*mK4_P2cZ^d?6J&sbA#Js3;_3 z_vziQG+UX04Cs4ho;Qqm`5*9+3+4*=(1d79xNq;;P0RhA58K2p>x|MSkk>v5+z$sf*IJ+(OGz#z@u10adi?EV_X1^ddAqx~0gM!Grh%NLo@ z5)_uTZJxdz(NXVIsEH9<6ZvzhU`k+lond%#HFs9B3e|G8u-tl0qa3NdyNP6)JMI&D zg`@}cn(Fq7mM*0}pZ|@k6&GQFVjkVU-d^hDyuRhdG?3=w7`4K1kSUeBpD0OVJSf&p zq+R;dm{jR6U_vHV@xC;69GTJOdQ`>tyLhb{njXJ&`PVO^q3%DlI&W2yM_TOiTdH3i ziZ#G%CG%#yo($lpx#j{!`0gt-=!Rs9zfm53xY@3hkdW{_UtBb5job_!95KcK-2se@$e?_E-Q-2|pvW`&ZWkD{wNl0WuC;V_P95 zEDSnGA;_9oVg9~)1iq-+K85$+Uv!-o4eDWR95Sx5M*V{Qj+78Kxaa4}^4{F52CPJBl2zHJTqTYG&l`IlO z8gAlDw9~Q2k|g90P>vD>6l)GPBL|GoBhL+oqJ!}m5DY5_#^}2{1tthFiMQ8Bxt&qI zJh&I6r#qY=8(|mQ+@_hY0?CZT+{!;=5^>&hv&w0>>HGFVvp_eOt_raoKKQOr^C1+2 zzX%5c?FH1KGK!4ufcSV!TK_A1|}P!)3?nz|KJb!f8{3DfN~o% zDbn&Swdf<;!Ae({GNgU9nxVw|6#_Ssl8=4FKF&Y^phR^dHuVj};Mk&&jQAaP7L{i^ z*Ch*n{@?2UVb!Hq9t%y-?xy|%|LCkUy`2u7K7yTbH~@W;fZ4h8OGbO3HL2A8rXE-` z=ZS@amj$0pC72|J*83ezzU{Gi1#-iU-~oto3|jaHcSELE=@g3wSSpmpAA`$p$gd40 zz?W4EQ1P{E7(BDVu7(<~S^#_mwxBhQp@eb$^}{dHP)5kd(@CjutKF@|sU_do0#^Wo z>s069h6|!Ok`hR6$yA0lc+Nw+_8jQU@t?h@zw63V)5ZE{I=7W=c>GzGFc;dRnf)DU zHZ3n4YTtHgjfo9?hdj(sh`O7(uUIK`XKPlm;Rv+&O(2OT90m8?GUz&oLpmbE%@a6c zjSp`Im8e4jI}ovH$>8j@hM?2%(o10G^7 zrwII0&cx0mZX2y#*>&W}m%6?~M9kTp?w39U& zM#h(5c;R5udMB760hv9c)PGSL_?FE13fz(fJmwWRdF|#8k>-^7(=%LYe`;#g(BDX6h)gZQaVUp4$~gekaKOzW%Bg&^#?_fhM%fBHPv@Wzs!8;% zasmeh5t2?wUqn|4aUOpTHpFFMCl`izdRWe6oUfzFfi%lGa1rF64{dV+fAbo86PNPP zN17B>m;kJmC%!6(ljzcLVz`^|4#Er2O+Q(qy@rku)oDdMy!7A^`y^O-#IDpseJ7Cx zL+dmq6(MH_WzYdjvMs;UrG*$lImn7>RwOsGof}$cUgxsKPYSmr#`Ia1JYc$Ey6fo+ z&*B`!q2hH{lLmKuW-aNpKNt$c zrre_dQI#EI!@~|ZYAT?*RBl0*W+)PKAdqZe{EvOvMe<+#2GiQ(U3=g+Sp4EQc>IIk zK%yq(i;yg!xXMg?jpRml;01z$IvL4Gorn(=;wSYARFEA2UvodoM>oXk%USNAFnhzYZoDJu9#2ZX_txvK+VT)yb)<^*$C~l_4 z&j4Y4Shf&wIOmylemOp<6(+wMAvg{Sgho|4s(}>pvq`(uQ&mnjyJ!q3N9E+DJ_WQv z9l2w|2*$NN-?K4Nn>~ICZz2+I3-LQL`r)&?MKs1q%JBS$upqX_AlXEJdM+p6hmY6y zX7RO*6*O1pioRNXBed=ISOK4v@G-6k-Xp9d|2Ui5&7V#BRIihv;f@Y0SApNK_vi6J zj7xV$Dc$9CdH)`$X&UIO1k-^17k!tx`W0Z%4~K{ENn?>>(^J-+-i^n*h~d7QfCSiC zn$RR)^?QIM6q&Xl&>q$WEiZaf}>)8!x>B$K^OIz(pXMH7OSL^DP-$g{QaslvT#C3qIlyDL0UBCTRi5K}w#AKLAJ$Z-L|> zp-v&@v?vZ2Y>{|sC;n9@b-%p8himuM#v5(83$rSAga5KZsaUWbe3_cidOf!Vycmo( zc2Pa_{fn!E1+Frk{eoC}W-FX`=>FmI6cv2xMB=dUYo39LtMGydJfP3_T*WQSj{Jn% zBuR%N9?EK{0qI949Hk*QO)YsptwIkZ1$E7KJbG|F(M zY7R^iiI}NeQk@@qP&Io9ChfyF1i9(iYIDwaDH-#GI(8r+$}mcRfN&_{8^0OfRZVR{ zDGjIg&_#Ai1J>hXi9HnEiwnWLs6w0dvB=;fq5zC>>!BX6hRIxFhAT!`mP$Wn?ro;4 za%3zcI_gO*j0EOC4^Bf;_$f7ll3hYB+^cJR!uWH(I_%bL&pO`$d4fn_$%Qhx34k*8 z&GXZFQ6CA|8(I?fsQDMXRe3&@0l#VTSSszVdm}jZbR^mzMqpoDjzl@haT(eNA1K!M zV8j^==;Q}BD-icu#N(PPiDP=mIxmfR_y^zCTSj}GFjm+`{PMNqso~Z!0p?>sXdE64 zD)EgC#1C(>Z=mXIq>sR8AU%w1cifwSH^ESd0lIWmW^EJrlZI6(dMuVvk5w_w`6irl zA>7(qw+t!5-(LT`zxF;l_Q`>t$F;Tdn371ClJg-OI>(vQ%g5#**%7fw7w@ieKxKCe zRSOIlQ2o9RPcNW-)x3Je$}emuOqh!3usW-KzFb0WP?c%dhYkrPZq~hc3T4SUHr;G> zjAIL7Y%BtJiyVfFYGTKK$P5 z2xxVNmRdr6R8WQa<<{mb_%>S+9eyEp(Ms_?&RF)9giQ!*A?u4JRn+YvAXN};urU)T zizd)5Q(DKV11&_--7f)GS@9vlrgHy#k}X=GObf(#bo!(Bu9XO|oB!GCKKzU|+mWnCfr<+i2(~%SEXzO5oV2iZ5wHM4 z)+)dI$>&F2NM9xzN)aMqp<&t~lwkABlE;Y%*NVW0Qh2|YwwO$F@L zoH{+_JIp*Ety@*Ns(x_!O6xHJwxJ=CsB4y6W#3ZECnqU>#mb4z_t#Idm~J$!cs=pXLVF8fS*F z&+RuY4vOiaCoA7O<*)jfTk_OjwXw}2DW0{oLbUijaCRy67E~LV6Z`nYEkkUlH9Ew} z^YyF-`mk}w3undQW|`UapN6!boB3;k!-VDXW5KQ>8y93U&H;jAw4vcyp%8VcinK3a$6pA4Nr2X{jb_*_(ESiQP! zjVGRa@!Cg`vWUIzVCiY?d8|Q)IhU+ucI;dJ^8I^%34?kHz7GBVxCi}CUv2(wJN>G; zWNykllvF6M*tPgnNVNF~;ZF20DR}+if7AatrV(3oj%=Y(+p?YBOZJs_)KdPp>bow1 zCTySGmVsZj!~5rbzkjVb5+P!@80+TzhLeB4LWq_ca$m)U<#eenQg=;Y&6blAI1v9C z%SX(@G~u}G6l2p2MetH>5hlLqquirHc)h zTBL`{fvDYBx0)m3ud*hPD)N*ciBQZ}?I_nAjv+&)3q*F%H4l6$b04GD;DxzfV%5-j zv_Ib=lgdE9JHiocj{UpB{tX*Lm3$eglHbLp$p7P9|8rH4w+$KE4RBih?@N2iP(UA! zC3^lJYB=A4!r#9X6(^%KG!C7ae6|vF zxHw@A5RhI~NNTk7U$AQNS*#ApYO-tjQS|?FlP{9N8MVskZ~uNC|Nivrr{SgQhs1j5 z|9eK|pd;WStB5lApQE~hgGda{rWP~)Jz9QW+o(_&HRTCtl=Kt%Ye!Xu54PJ7VWqFGAzn^H0+z&2W(ieZK+uvvZkPIvr4RJWG zD*k=4zmMcR4v-eC8J^ww-!Wf(3SKh463G$tzn^G`ST6p-b!LIbfD3_aaVJ3itx@a} zf$DFh8u1rPbZ(W{s)OyfRI6IP={91-I0wWR93;)cY8Oi36wdmJ8DHSe7$3sQc*Ce* z;4j4qJ$l+5bdFRZgw8+Ufdaw}F+traIDv=u417S^z7}@j?rI*NbxXv^_H?b6?h)W9 zDjNoES^^fSiRSfA)8MW*XYupU0C93dDAXrAZ(lMtr>3MBdZ(K4k{V&O{+`YrJ|!x) zproXby6bJ3;t%ZECyRH#t`b3}C~BnqKP?Ag>_By%TIOp8+!i+*wvld^3lc9s2gz(D z_(nQ(zb_|NpaA0)_KY^n3%-0KAcxNi_;K)yfDT37q3U%;XvhXrz68v~Y^IzCcY~v%nN5##r_a_Kq3sEc=5>)@y4k zh-26mc&a^~-^oTuNl3PWOVyy#w}NcNHxE*fMej3scab4{^BWsmP4ZT`pfw`` zEAjd4ET%j$&z86;2SAIi{k_je;yaE1abV;oe8^p(Y28Ox$euhfNxM=aIDfN9aaE~AXsRR7hT7Xb2@{B zYu?gCv7S1}dt3NnvGxd_l#NLQPRsgi$7q6%#Pc*kquXlkK>5xNa%)U7NZ7PAQX|)^ zHZ5g+0iK(^rbeHUvIlUJdbUmYR#k7xS$6JT03AfPvI9GGc(Fbqk*YPh$L*%w2!)Qw zrEwlni;P(W_^nb$a#B>rZ^bfb)obJ4-T5#}&HB5{D`RH3!d~bBT{t{&b@X`!w@A%6F4BMap-9_5CDKNrJvP zoZuzVlIYAGCSPFZDdB%g0ZjvE;8p7mMp`NfI*>aA-E5+KYyb5XsEX#G0;kD9lydQ4rQMg8ExMj1nlU!oU<9$m``*bRCU1hIaZS>nVttC3tk!zT zQr`wE&T#los}Ks}LJUj?Bf6j@IFG~ut1kdZWE@lV@XS(WRAS0yA-*H~7JCR@>dq=qDwJ+w7Py|gq( zT?p8n|8acQOSgS@VLK@4Y+pDP~P`lF-*^ije$ z!cOe_b19d5a%q=)qTijZY%=|(`|b`6_WW_uJC%94p;hK2=UpbJtQ!jaI!a9OII0Ux zetoUU#VHS?JZygcWR6v$bbaTRz3P*2!FEu^hB+R4$nb?$@BqEJv*8PmW8n&mGc`9C zJWfK}W7mYSW7kEiEea^&#E@-k3hil(N_xix-kxi_iKcXt*^Vr#*pqyPV8CirpiQig zF=I-vMkq$kX6@f2;*-4qxbAcjR#~npqFWhpibzujUZU^V_2O zy6kF_lrksvkhe?aFOR4)g=C5mE%O!i+bl|=$}})PviI0BJSWulAHg#=`$X^5(P6GW>5XKF2_dk`RC%)^f0Dxz4FUucWnp!vziZikK{vXeL+ z)4}B10rAYV(7F)4)TY59PPJLkX44*zz3x({G;SZ?+x!zFfO_U+Yh!Et{+p(%nl}`x zS>iVib4}P{D~Ss|w1W8L=vGilM6Nb^IL1mHw#|3(bPESNY(Ct{VvLQAWk5*i$rzWA(*T!{>j0xr^gC9(3}xb{gI}LMH+W?6mPn=`6iiI>C|`B4qGsNF zmsGy2<@SL_+=nOEPbC&-_t12Jigf|8DJ9R;UEO%`QJy+eJ!$tHzxv)$vYkfX%N|mL z9pj{nZ2gtFH!@Pl=Ob$P*a1dXqh;-G-;bz`{nT_j!aYF&g9)K*Zvj{QlI0Un?zuki zuhw{H@JA$jofB!t$0Y39ynP-=dnpVWmQx)Yu${KOU@w8=c-}+O9l+E~@%M;faYZjt z6E?p6^N33=R?L*TT+8`YjuVX2KeyiId2}CIMQ@1Ucst*%HFK1B0Z57(o(i}pS;v9&X9PGDP1L* zDEuL}!K6SuG|rWz$QIX2B}ZSdn;*u#@IudVkdOGAQmOnxak&B$2dqu>AC*#Fm*`0Lq925`C8DMSuULfRaa;KNGY@7_LDr||>GV!= zhH8N0>dDaocE8tMMKUgFKM(?+ucULjM3)YVRK==-d+xO+g>0TFD$4R|6nd~pxR`Vy zLl1*>d#g)QyT=n2FdMJ6=4^+uUKg@E6cSBKkP z@~Xi;d2U%+mD62PO(xB`_``4Fac>;|@J8|9FhnlDCj1ll^fP zlGoUT_~_nW#uJE6cp+yCeLn5pC0}5UX`B)DJM{Jnl9z-~ChM-As)RdUp}nG-^-Nz> z({A7|wdr1eo#oL+8F*n2%}GIUt*Dd>v-M>pJ6=y|dp8$zq8Fi3h|kwQ)wMbmTI$fS z!y=`eio@B;t346E&++dUup?}l(uG0j38rAbS7pmic}h^_)FYgwBOpTKd1!7mR8l@y zoqHjEYTIh(Gj`tGbwRmcBf+MTTHX2SX7Rb*awhVbDHO4Bad#y9fW&)d3foi(du|uZS-^}Su8ES3t68>VT{NMf1j6zcwZn@yHDb>ql4@; zE6pa?^ontoDCJKMwFu`?$>m#p=N9aLEO`fKS)<_ux}5cJp^1cQ1USLXHUXps>Vm8Fq4AoH?7ek_UyV zwdv;q$w+&76w+_tc`-Bi((x*!ix;=3ieWL`Z1!2hZCnd=!oOpo`J63=%{}cy!tWy1 zaEP#&MER<^d!NkXunW7_lHy38o=XUAu~S0vd3jTaF2wUmyS4Yz*tC<_$KjAT#Ny~W zXvg7SU)DDy%M-&}6Xql7X&dw=sq9tS`{~IuT;^7A$1l%@av8TG{tVUbb*k*aGP74d z$pgLni*CkV{INv&K9ad5s)ENmp|Uvq{n4a(#CnRXH~8-?QS? zpI=k@a-e%vZfM+=Xhi@|r=`4HJle|NQV$2!V|KqFCzQ^7g%yiw#@r#3eNApfx^nqv z?a8qG=N>Uk&%Yf(PepIgg$4>11V-+0M)eR5NYLRq;< z%>J;L&$TbbG0sR#wI%stq1~Kh-KYpJ!Hb8zR8_c|y^T1w{9hi|h4L`Ra;aY>>Fkkf z7l|$K%6uo;yWB+M+2_fKI)c{{TAw6}Y4Puf*~D#XS4*G-?&+W;96akpK1jALM`b!E zj6dPW_kXAPLpWn~v|3_ypu~nb7AMlCeffj@MKF6BGe;-1IeD>$vLD-PSBV$8u=QqGjv4whKd9ww z3Gj>w{y2+$S)tTzp*YY~BB||5o>#P;+=FE)`3GrIy)k;~euZOUasQ2}$h>E~;sp9H zA6+IV3hBKETStqHR^L-B=5IJskZ5WftubDZwQ1EMR9Ae=iIV2=t`9nsR`bo7vX{=I zXGka`yDQT{I>H|RjECT6F;REn>>W&j$b~%i!59iQ1)Kn!6_A=sGV}>&(+S7a3blxh zQ;IB!9tl6)|2V*qQFhC9g6YTI&@ZKF1ZE~*E0&}dRoEiy{}x1?MuxD=dwNhHL=>cX z2>!&9XFVYd+ldbGfNRNgfXdOmbe0BXRujQoo-KYYvQLk(wxLlivyGO~$#!Z6%lgA= z-ZdRxbo%)kbDNRbFtTprAe?*$gNVhJ)!tij-q(aYMk%}ug{1K@Vxlt^JgyeRq+hS8 zEykt5jm}t}+aB}oX(;yjOm|mde!Sr3=78XjN#ReneW6hn5|4i4SbqpQtmsinRQw(^ zQhtWteVSfw@4r)_3aDD5URESdS2y&oHyi#YvR~>q+&Ac>=D>tcsMNt|uF3Kq^EB3_ z<#)%gt4;d^L^vg8_;;{8V$NXL6vf9BwKFa3@-Y&3mQxCMqh1O)cy5JkE>sGLRZ;I6 zF~@R-Eu|TY|Im-^mlyStyymC&JnQ#F`4^tYawhN`TdX6QvSP*eh3~uzo9kQaEf*LA zQ54lt=?-uCdCOIUiv|_Sbyv?U*A*Im>q`V;Gj9BJy%Z-bfkFIP`J zQjgBb^V+3L6ymXAee4;gBc5tO`Gk*`h_@QKSTkuDjVXKaj&Ty6lTgj9C5XNBP@$m4 zwmzKJzgLuBnH?E$%yvwSc>zP4;=I1oJGa#jZkk>h1>*6kSA*5$|B0AdswzK}Q(;mU zJ(l?NW^1XKp!sK;zm@qF!Cotyz$5*^N~is_?l8Ogx@x!5yXnIuWWg^Y)y=p*5ojBA z_1~8XFEac5(v$fcU^QNwUY}_r@Ht~c2Jkc^y{-pN60N?Y?$22Rg zKPW~&zfv`0-D{t?I%nN9*sssQBiF#Ld>eFwFk6|tT@P5t$_X*27`kAw|88@pfa&N6qN@No@S+M!tu&yYEom`Es-rs@a*O|Uti!xmF?-rL;npq2dXJN>?tIAkl)1HTFx$^}1DCT%vjbov?OC~eHve9_2U2M8n z&Ek4>*?f!a+>wVx$c22}N97)tO}#n%MoZrd=5Az)uP=9hCcay3Zq)6yh-NU>72A*{ z?$rc#FikO(f@nv7wsmkTu92c4NQY*o2p#}zIG@RN&#}ht7KClDj3)-%>!^eydk`(o z>qIxEXDWUDyn)4Cd8QcG1>aVQLF)q8x3P5r#Tw;JC(TO620HsxX?sgTn%aDDdug2t3xZ%a?|>OF~`WW$9qU6Q zVGYLzy9icT8ZZRxpnT%?AQh$=u7KQQ-8;8eahA7O#RG`gL}@c`VmsfQyePpw(Ic5} zzZ+ysyi)Xtq;sOuKJ3Li%JcdbetQGOSN%17fUd)zBVh$T{XDpH*9kM~`eEy!gpoAC z9*J)mhD%8dSuc)En4Qj~<(J*2U-1EJFZvzhyn4J1q=Z;~9xu;Rj;H(dpv$|*t0}7$ z@3k8VEgLsE_WaRY^s45~Yo@z{*-NuGNij7NTEhl8Z^Vzjt=3Ra9~jlFC6sAaF&PH` zohy)&<9yFnDiMd@>~CInROqR!KnoxqaA6;^zrDN1q3@YTKO`p2GulVf7E0CjPNNd_ z=9SC(Qghpf8k}dh#_8{>xMuP<2L~LodvDAL3OP;Fr^H+!R{QatzbDs#c5zerBh zE@iSDT?ly+^gyBrZe`UkwXc!gUn2-0zdIlb;mKMO?BKW}VNy17fY9hPawNqiA#i*|yQ+yH{X!Lm^x|Sl5e|vSGH?<^7!}1Nm0Y;_Xka zd?lsC;!7F>yv#Z4k==+O!=Gl+HB9u?WT-4yacL#0iYGcVh58gT1;12o?X7Az$GmC@ zQx8_5FmQaMHeS*G#RGpKLtH8!|M>b9M;!qv?~~=UD-Npx^4SwCd2UrgS;BVy#Zz|K z?tMSaNT{lM<6&EvT8)Gz$#2fQ<%|)!Ti*{cFk4{e5e}@;?@xki9QP2Pp{|}QIT4wVg+$NPb{OBgkI6s#XN($*^jrgc2S0pZKsy%|5oK+) zBFLZH`0=@erD%<|?=7i?iNFuB*49CI9P}SP@HhPQCI7sh-kn{0+cKHi%^>5|!!FpN$~E zHz=M$FT4RiBD{WP1Xn5nwv@kHXA+Bu*RsYG2-M8#TB*gBQglB9F#XMo=J8w5nsrAL z&ijDV&IB~3mN(`;WlG(v$-M{mO4GZdceX4qfo$S4So~})bY6(KA{mWj{3K~FO|Hz~ zi_M-|pQwC%?~>Dnh40WO*qnlVuAdIzzVz_MFu`H7A7VcuV%cyCa_%4HE(G7xYGpWY zIX#MG<-DWYzYQsaJ{Mh!R^-J;5%tV&u$~oVy1viHJDYcY-XRFy_TS0TG7^)f88Svc z7b|nH6Y$PCbhMa?`1G$}XZSa8kG_ndKG$~9$rhK_oc%=6#8qNp!&8({X#RXEl5E`ZisLCKCQBdTukL`QJy-^5ic9 zqm#!V8=Hic!sa_)4JfRh*#8<|FxV-V?aZUv^EAB)%zJIE>0cU*sDp?oU3ymOr zUINv7AbTqXe;FPT@c`fvP6Dc72mS#S?@Nq^fs1K=39#)AAa;FoCeAs4)&_O34j9>} zrB=td>oi?C+TYw9`(Pc-J<1VGz5}hKN(54U8ySp&R{_e-k8R!M+ih1>w!TeG0h;QH zK)x239*CxX5*S{k7VrH1bD^X2D*VVCkalp(FApg$nwNRC4h-g%tc(5M)tUl`MzJ=% zR~AG8`Mx}k=#LQ*R=~-+#kTJH+gS3%eYcq*Baz#kpH-N(c0_zG`)DioAM_fJUVk?_ zKCxF{Mn(AN+9Q`=K#87d@YO|!dd-~6JQR8K?Xzp@!Z4~7OS6=hTD|_VEDA4UD#-Ekm0sg&;xUe%SR|#IO2lPV zbM(2{6tI$|$y0z+jkvp9k_7i1Y!{|GdM*k)!jnOn{YJc^3Gs$<0?8g=)D@oIlpT{Qylw|8xCIAj4lcQIcUKCW^&+ zo5pQ2iAYeHCm6EQzP_Qzdja|H3HL6X$b3yC5C3_x89?X155_*sO=hY~-5!&6$INb9 zb$#LAkQ|>&0G*qCp3e)lvZCIk^^%B-O%m)il;q~GPux%0Pu;IkdL$9*XH?CG#z_D7 zAG;`->A43hvHfNO-OF6*i72M{pqo!eszq)Vv@pM?S~24Fw;nAKPrP_n@SMSMpESkS za=fEC<)hi=c$Wd?U{^4?7*FWn++XA5ouGd4){TTsGtPh;TzS1@`G!`(iebt1ClSl) z#Eo|+zDVlO{vHyg1&HTuwesM{`1b$>-T*QD&RMIF6QG*cFE0QGRm)}NrR+RK%bMBk z52?>67|OuYY1h9+o8ET&Jn>|PON8*}4Cm*nU-53RER;8$nm86i=;#Q6G{my7RP3?$ z3VZzA&7}-jnjF-^o~f7qWZS&3$*^g|x9qv-xAZpk@7&P)SP}QJN-hM(C@joph1Q6r z9fzrpKGEr4(|1B`gQ3oHZ*@lX`b3rrjb2op7Eowk;?qjJ+L{16xe}|CQ;%IUMMhaN zJPYi)$(%pDhu-3cN@bK&QP^sf$s@JY`8QO%V68Z0gTUwYlWne=W=RNkkT*Khv zevMcnG6hz1S=>$YqGXpEFo#0Kvjk`CB(3-q$kV3rXNU!jd(t@CZbR)>#AJE} z`_H2I(ZlkacRJNNRRx`u7{TVSIAa5`Mh@BE5cu`)s@qamu|8q*P zZlFdo+C-AcEev7HlpD~YHI$X5Emd!5@ArkK?9Re@0j!z%oSTqp&m76W~(6ORv% zD`HX32ERA@enNjC<7=6rM2_$W+O5)ZQVZUOjMA2Pely)(g-FPV;GA+$Ki*m~ zN0C{*f}7h=$PXS=N42Vp@9T+hw(LYkrzU&X zIXPLP5Bf8NXZ0_LVhLteXiMtk`0IIkvsIrp%ELk zCG$z)E)YA}@v%?iC~MhU9D1RI!>v}J+fE%WZAYW_a2BIOazK1veYLa3I@=z%v5J19 zPDD)gaa#bX)~EJ>-t*o7c7hOR+Df)Fp;&u3E`1JG&|MmNY1F^|6BNHH9$l9Y&;52q zJce2{FF75h=6;Y}z@0WZ&_bsU( zrEVN6|9&_{MBm$a)Nd%;)639gDjXxGUT?qH#d4Q?zj{~$GS0gqT9Lsr)2(V6q$uB6Fr@BQR(_PCbdC^k ziJ&2BefxZzJ$4!0&y^rHD10(pu(h^H!MgnR<@t+8h--FnckylLD2vn%u1M{4|N9(! zsjr5|=GC3dMi?xeqiK@0Gh`yZ#|S&$wDM&=Ete5fuqE>&KVA6Jyj?I>?y8h^dwD}% zdA(La$GN*5r_AT+S-nFWwco&KcN$ak2@p{ID0zONHto9lrSye(RGo7m1T%eIllUg3qDlj&?v5=L8|+&HI1^sMerDJ3j3_3jndaCMy~A*SEb zrm7NlZ4@rxO3~2ZkV{e5k37R!j<$Li*m0MF*E;?EBV`bySzH9z>S^N}v{s<3wWZbDwPlw(GJKPa%St8=8wIq24!8~Dshy`RO^t4%-2=l*7_ zX#V-<(aH{5@TX98LElZWqZJyhse1&Hm1Hr@N?cHTQMA;S(B#X0{hByY?!z}rvM6kJwZ52ZfPf6^*U zA4of)`J$SV8oO_*g2o}@u`|kH9z>;b@5&`Lt2`LVA7%UqTCy}rXi!4NN-3Ikt6+3a znR|v$Gh@A}jm_UXEEZHnxTq73g~OI)9{X-jsufJXo_s&CLnilv7a?_KFm-aGP&`&@ zGV)e%-BRq$X@raJo0#{xe*8sk^p!2>35O?up?6Re?0>ZB0Pk6JNclHKOVL0P#ytuC zklqQg7QjSV1M6zvSUu1qJ==Bm=F!EZ!q`x!HV@k)G8NV@)8-_9Z!j3HsAJzBnY0ME zkZGRKG8OKy>1pGEE|N-u6ppAh{aT94g%Y@z5*Xx7~3prO<> z%`l(${E~?^Nl^rMmE~b)z3qq@b<$Mzk>ap;KGWj6n~$6lW}Q(LrwR#9LN@tjHUK$HuvaZ8iQ6O?w`^OcG zxWI`Tsj#2FlKCPrrOz^0@dtLB;BniJw-+v{sKmCf;&TJ{qP)KiwXBL^sXSC+a5{ zT6M4Qohd4I)?VYKXwd6NlkpLF^wcce>7-FzDo4`?mSb;y0-SX2TRZ99XK*rfVmOx6 z=P#@l4{g0Wp5bq7J7#q9XSNbyqL3^AeF{59^oHE4& zx=Esr7$MZdtfJkHpyY6gQkB@$ZG{Wlvp09_=PLy7_ms+av$-T9ZG5~Cw(b47Wp`o= z#)^H!25YB~cE(QnC9&~Ax?`j2J!wb}8yVZug{4#L7w#3-;tcC2evc*(ShM{c_+8Z4 z7zpcJN6+p=dZyW5ER2mcT0Z=lN0&t~%Q)8s2(+<`tTKcilFn+R%p+_P=Zqf`|J^E) z(%I7IM_VqyRb0?#(*O|n=EUiX012qEU@barFnmki*YRXQHR<|iF0Q*s`V4={Qba-9&rJ`y=_KuVd1< zRsC=OXr{;scvpNVUfQVh#C5Dl=HVkLQXS*F94stdi(`1Pa0Uw*j?V9N7ndFJ4#vMv zNcranc+%!|u3x4=*|41%^SUOQsOJ3KrFEox@oNnGvvR$X)BuY6gK@2>47&|nV_teJ zC3hRk1zwM|GV4>jB&Q zU?|b4${Q{EJmjb!ZS|<{QsSc$lFH>iPKa$u>Qv}A!$DKYww0Cs%E`Wh>1_L~!

K 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 Rd+J~UjMoF@%{)}+4w|#_ zQz#msOrK7VHdozzkHy_PJa*l-ZP5?hZgXjxmpTmckyJjwuB=?OEKShBCt@M|mdgCu zr_PP-do#uG&?}1r)6UbQO>4y@Ue<5iMl^>4??iM|pzJ59bMLRUyjtDq4_O|2a*uV` zpgmRU&1Rp0<4_WT$zr2dt#=Qe#pI`ij^t;hdt>`P%<31%{P4c*-`@(VHA--1(+kx8 zUcY<<2PM@u@2XZJyg# zCZTw1##x$Mn0~yvayE>gRneGLg`Mou#%I7o)P|y9T;{Do*OU39dyU%$oq~OX(rb^R!fe~gNL&5t5bmr5 z5ABK#yO&BITT((__G#Te=#$O&GZZx6E*2V`Q8~v!V$Mr9Xp}?XZWSny7GM2i5%Ht8Ce14Q`9C#(Pt> zR!fQJ(qeYkder%c7bXogYen{L%#_9g9m&<65EK)&JJ^`sN4;e|?d)T)XKSK&yLVg*=T(Z93c8;Z(%NKcK7VVKUZZ^(qa+&p&QOGxxgo!KS4-x! zazU#rOHt)m^rEP^^FhO@Cq>MfJw+P5R*Tyw85a+?Q+Zc2C$aXbH{P0kc4RZ#8m=O+ z?H?Adbg z!%*f$t1t@M@_e_D(nh1nt>qc?kbtcGZ#{0h*Mu^LI< zgqFL9Rf;j(TJ_vb$WG$$*kbVS7hV(Ht4dQH=ExE3$r6wiCJguZ>fn8-CxWK^jObTt zxsfVgsEKy8%X*B=`>mYH>|lOG^Kd>v^Uz#9DK|}4^+9O&XjAW^(G#xA#y^Z53rkvG z67g_l^P*pl=_ze;d%D(FV`R3_Qx({oqu6VFdP1`K30B{F4kLXrYZ^;&6f3>t0El8*8YSebE@Vj2;Wf#rzb*JG&=QlYohjOm-zk1nU zVv)*R{JPwp7VmrGMQ5{)AscQU+@$YycE-v%6OBpelLvI0wmMydepX9q>epj_FcS|q z&~4k^>+ENgPvsY~@-ZXHwsIopmC!4k-&^V4s0piPY;qFO?$f=nQ#jip!bxHd})+xse3f z!Wo4u7=G_{4Lk7@~1i$=b6ec)yZcuLc6PW3~)mUFw%20dyC}hI*LqmV(tnFY%bE(Sk4~u zt4YwW+P5X^o{Fo8kPEJMSY75$m#>sWBe`5V_tj!)U3VgFB5GSPu510Yxk3NQg$t~g zzMF-#Pc^=6ps(B)9vl8~ATVZTayHprEAMTX-LleThgX`;{>Bs9yw^2I+eCQTMxtA)+JeUMuutu&F)ylBT^a;MXF^p3|t+lLX0TeDvUSa^k& zqfVyY=fgK-ElDJ)*P}@wyHJt*s%)5Wt4n?X|3*)qN=KZ4l_A~Gv`2UvK1^utS0Ytn zY~wMf!Hda3g-}T{H*U7fVbfSi(ojnD86)#qJKPq^XizlA_-0QJ2{7QP>^I18I%J=dKSJ zZf~7^^=9cQ>4IROMI&ZfI2}73fBUk~p{x4Rd0K|7J6V~IKOPJvxj*Y7z&iB5v{$+Q z=?ebhasJ}9$`QxCxBPrOE9MS$>96u!INN>1J)#0%X>qO3tGa!RkZP$W^j3=&l{C

7sS=tJCSbNHjiuede_YJFH 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 +You are viewing documentation intended for people using **{{ OS }}**. + Use the OS dropdown in the top bar to switch to a different operating system. **Quick links** diff --git a/mkdocs/docs/HPC/interactive_debug.md b/mkdocs/docs/HPC/interactive_debug.md index 11b3a84dfaf..d4cf3d506ba 100644 --- a/mkdocs/docs/HPC/interactive_debug.md +++ b/mkdocs/docs/HPC/interactive_debug.md @@ -40,8 +40,9 @@ typical workloads for this cluster should be limited to: To submit jobs to the HPC-UGent interactive and debug cluster nicknamed `donphan`, first use: -

$ module swap cluster/donphan
-
+``` +module swap cluster/donphan +``` Then use the familiar `qsub`, `qstat`, etc. commands (see chapter [Running batch jobs](../running_batch_jobs/#running-batch-jobs)). diff --git a/mkdocs/docs/HPC/introduction.md b/mkdocs/docs/HPC/introduction.md index ad8d2e98994..da660ef93e8 100644 --- a/mkdocs/docs/HPC/introduction.md +++ b/mkdocs/docs/HPC/introduction.md @@ -59,15 +59,12 @@ extremely fast solution for all their data processing needs. The {{ hpc }} consists of: -
+| In technical terms | ... in human terms | +|:--------------------------------------------|:----------------------------------------------| +| over 280 nodes and over 11000 cores | ... or the equivalent of 2750 quad-core PCs | +| over 500 Terabyte of online storage | ... or the equivalent of over 60000 DVDs | +| up to 100 Gbit InfiniBand fiber connections | ... or allowing to transfer 3 DVDs per second | -|In technical terms | ... in human terms | -|:--------------------------------------------|:---------------------------------------------- | -| over 280 nodes and over 11000 cores | ... or the equivalent of 2750 quad-core PCs | -| over 500 Terabyte of online storage | ... or the equivalent of over 60000 DVDs | -| up to 100 Gbit InfiniBand fiber connections | ... or allowing to transfer 3 DVDs per second | - -
{%- endif %} diff --git a/mkdocs/docs/HPC/jobscript_examples.md b/mkdocs/docs/HPC/jobscript_examples.md index 7fd6faaafd4..1ada64baee7 100644 --- a/mkdocs/docs/HPC/jobscript_examples.md +++ b/mkdocs/docs/HPC/jobscript_examples.md @@ -17,18 +17,15 @@ The basic parameters should always be used. Some notes on the situational parame * To use a situational parameter, remove one '`#`' at the beginning of the line. -

simple_jobscript.sh

- -```shell +```shell title="simple_jobscript.sh" {% include "examples/Job-script-examples/simple_jobscript.sh" %} ``` ## Single-core job Here's an example of a single-core job script: -

single_core.sh

-```shell +```shell title="single_core.sh" {% include "examples/Job-script-examples/single_core.sh" %} ``` @@ -52,9 +49,7 @@ Here's an example of a single-core job script: Here's an example of a multi-core job script that uses `mympirun`: -

multi_core.sh

- -```shell +```shell title="multi_core.sh" {% include "examples/Job-script-examples/multi_core.sh" %} ``` @@ -73,17 +68,13 @@ This can be done with the `timeout` command. This command sets a limit of time a program can run for, and when this limit is exceeded, it kills the program. Here's an example job script using `timeout`: -

timeout.sh

- -```shell +```shell title="timeout.sh" {% include "examples/Job-script-examples/timeout.sh" %} ``` The example program used in this script is a dummy script that simply sleeps a specified amount of minutes: -

example_program.sh

- -```shell +```shell title="example_program.sh" {% include "examples/Job-script-examples/example_program.sh" %} ``` diff --git a/mkdocs/docs/HPC/jupyter.md b/mkdocs/docs/HPC/jupyter.md new file mode 100644 index 00000000000..a54d8809824 --- /dev/null +++ b/mkdocs/docs/HPC/jupyter.md @@ -0,0 +1,106 @@ +# Jupyter notebook + +## What is a Jupyter notebook + +A [Jupyter notebook](https://jupyter.org/) is an interactive, web-based environment that allows you to create documents that contain live code, equations, visualizations, and plaintext. The code blocks in these documents can be used to write Python, Java, R and Julia code, among others. The combination of code executions with text and visual outputs make it a useful tool for data analysis, machine learning and educational purposes. + +## Using Jupyter Notebooks on the HPC + +### Launching a notebook using the web portal + +Through the [HPC-UGent web portal](web_portal.md) you can easily start a Jupyter notebook on a workernode, via the *Jupyter Notebook* button under the *Interactive Apps* menu item. + +
+![image](img/ood_start_jupyter.png) +
+ +After starting the Jupyter notebook using the *Launch* button, you will see it being added in state *Queued* in the overview of interactive sessions (see *My Interactive Sessions* menu item): + +
+![image](img/ood_jupyter_queued.png) +
+ +When your job hosting the Jupyter notebook starts running, the status will first change the *Starting*: + +
+![image](img/ood_jupyter_starting.png) +
+ +and eventually the status will change to *Running*, and you will be able to connect to the Jupyter environment using the blue *Connect to Jupyter* button: + +
+![image](img/ood_jupyter_running.png) +
+ +This will launch the Jupyter environment in a new browser tab, where you can open an existing notebook by navigating to the directory where it is located and clicking it. You can also create a new notebook by clicking on `File`>`New`>`Notebook`: + +
+![image](img/ood_jupyter_new_notebook.png) +
+ +### Using extra Python packages + +A number of Python packages are readily available in modules on the HPC. To illustrate how to use them in a Jupyter notebook, we will make use of an example where we want to use numpy in our notebook. +The first thing we need to do is finding the modules that contain our package of choice. For numpy, this would be the `SciPy-bundle` modules. + +To find the appropriate modules, it is recommended to use the shell within the web portal under `Clusters`>`>_login Shell Access`. + +
+![image](img/ood_jupyter_open_shell.png) +
+ +We can see all available versions of the SciPy module by using `module avail SciPy-bundle`: + +```shell +$ module avail SciPy-bundle + +------------------ /apps/gent/RHEL8/zen2-ib/modules/all ------------------ + SciPy-bundle/2022.05-foss-2022a SciPy-bundle/2023.11-gfbf-2023b (D) + SciPy-bundle/2023.07-gfbf-2023a + + Where: + D: Default Module +... +``` + +Not all modules will work for every notebook, we need to use the one that uses the same toolchain as the notebook we want to launch. To find that toolchain, we can look at the `JupyterNotebook version` field when creating a notebook. In our example `7.2.0` is the version of the notebook and `GCCcore/13.2.0` is the toolchain used. + +
+![image](img/ood_jupyter_version.png) +
+ +Module names include the toolchain that was used to install the module (for example `gfbf-2023b` in `SciPy-bundle/2023.11-gfbf-2023b` means that that module uses the toolchain `gfbf/2023`). To see which modules are compatible with each other, you can check the table on the [page about Module conflicts](troubleshooting.md#module-conflicts). Another way to find out which `GCCcore` subtoolchain goes with the particular toolchain of the module (such as `gfbf/2023b`) is to use `module show`. In particular using `module show | grep GCC` (before the module has been loaded) will return this `GCCcore` version. + +```shell +$ module show gfbf/2023b | grep GCC +GNU Compiler Collection (GCC) based compiler toolchain, including +whatis("Description: GNU Compiler Collection (GCC) based compiler toolchain, including +load("GCC/13.2.0") +load("FlexiBLAS/3.3.1-GCC-13.2.0") +load("FFTW/3.3.10-GCC-13.2.0") +``` + +The toolchain used can then for example be found within the line `load("GCC/13.2.0")` and the included Python packages under the line `Included extensions`. + +It is also recommended to doublecheck the compatibility of the Jupyter notebook version and the extra modules by loading them all in a shell environment. +To do so, find the module containing the correct Jupyter notebook version (for our example case this is `JupyterNotebook/7.2.0-GCCcore-13.2.0`) and then use `module load ` for every module as follows: + +```shell +$ module load JupyterNotebook/7.2.0-GCCcore-13.2.0 +$ module load SciPy-bundle/2023.11-gfbf-2023b +``` +This throws no errors, since this module uses a toolchain that is compatible with the toolchain used by the notebook + +If we use a different SciPy module that uses an incompatible toolchain, we will get a module load conflict when trying to load it (For more info on these errors, see [here](troubleshooting.md#module-conflicts)). + +```shell +$ module load JupyterNotebook/7.2.0-GCCcore-13.2.0 +$ module load SciPy-bundle/2023.07-gfbf-2023a +Lmod has detected the following error: ... +``` + +Now that we found the right module for the notebook, add `module load ` in the `Custom code` field when creating a notebook and you can make use of the packages within that notebook. + +
+![image](img/ood_jupyter_custom_code.png) +
\ No newline at end of file diff --git a/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md b/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md index 18ad425fa1c..c48f0822d5a 100644 --- a/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md +++ b/mkdocs/docs/HPC/linux-tutorial/beyond_the_basics.md @@ -21,24 +21,26 @@ channels: `>` writes the (`stdout`) output of a command to a file and *overwrites* whatever was in the file before. -
$ echo hello > somefile
-$ cat somefile
+```
+$ echo hello > somefile
+$ cat somefile
 hello
-$ echo hello2 > somefile
-$ cat somefile
+$ echo hello2 > somefile
+$ cat somefile
 hello2
-
+``` `>>` appends the (`stdout`) output of a command to a file; it does not clobber whatever was in the file before: -
$ echo hello > somefile
-$ cat somefile 
+```
+$ echo hello > somefile
+$ cat somefile 
 hello
-$ echo hello2 >> somefile
+$ echo hello2 >> somefile
 $ cat somefile
 hello
 hello2
-
+``` ### Reading from `stdin` @@ -51,29 +53,32 @@ command and store the results in a file, so you don't have to repeat it while you refine your command line. For example, if you have a large directory structure you might save a list of all the files you're interested in and then reading in the file list when you are done: -
$ find . -name .txt > files
-$ xargs grep banana < files
-
+``` +$ find . -name .txt > files +$ xargs grep banana < files +``` ### Redirecting `stderr` To redirect the `stderr` output (warnings, messages), you can use `2>`, just like `>` -
$ ls one.txt nosuchfile.txt 2> errors.txt
+```
+$ ls one.txt nosuchfile.txt 2> errors.txt
 one.txt
-$ cat errors.txt
+$ cat errors.txt
 ls: nosuchfile.txt: No such file or directory
-
+``` ### Combining `stdout` and `stderr` To combine both output channels (`stdout` and `stderr`) and redirect them to a single file, you can use `&>` -
$ ls one.txt nosuchfile.txt &> ls.out
-$ cat ls.out
+```
+$ ls one.txt nosuchfile.txt &> ls.out
+$ cat ls.out
 ls: nosuchfile.txt: No such file or directory
 one.txt
-
+``` ## Command piping @@ -82,20 +87,27 @@ together to create useful results. The core of these is the pipe: `|`. For example, to see the number of files in a directory, we can pipe the (`stdout`) output of `ls` to `wc` (**w**ord **c**ount, but can also be used to count the number of lines with the `-l` flag). -
$ ls | wc -l
+```
+$ ls | wc -l
 42
-
+``` A common pattern is to pipe the output of a command to `less` so you can examine or search the output: -
$ find . | less
+``` +$ find . | less +``` Or to look through your command history: -
$ history | less
+``` +$ history | less +``` You can put multiple pipes in the same line. For example, which `cp` commands have we run? -
$ history | grep cp | less
+``` +$ history | grep cp | less +``` ## Shell expansion @@ -124,13 +136,19 @@ The shell will expand certain things, including: `ps` lists processes running. By default, it will only show you the processes running in the local shell. To see all of your processes running on the system, use: -
$ ps -fu $USER
+``` +$ ps -fu $USER +``` To see all the processes: -
$ ps -elf
+``` +$ ps -elf +``` To see all the processes in a forest view, use: -
$ ps auxf
+``` +$ ps auxf +``` The last two will spit out a lot of data, so get in the habit of piping it to `less`. @@ -148,17 +166,19 @@ together as we will see in the next section. this using the `kill` command. Kill will send a message ([SIGINT](https://en.wikipedia.org/wiki/Unix_signal#POSIX_signals)) to the process to ask it to stop. -
$ kill 1234
-$ kill $(pgrep misbehaving_process)
-
+``` +$ kill 1234 +$ kill $(pgrep misbehaving_process) +``` Usually, this ends the process, giving it the opportunity to flush data to files, etc. However, if the process ignored your signal, you can send it a different message ([SIGKILL](https://en.wikipedia.org/wiki/Unix_signal#POSIX_signals)) which the OS will use to unceremoniously terminate the process: -
$ kill -9 1234
-
+``` +$ kill -9 1234 +``` ### `top` @@ -186,22 +206,26 @@ performance analysis](http://brendangregg.com). `ulimit` is a utility to get or set user limits on the machine. For example, you may be limited to a certain number of processes. To see all the limits that have been set, use: -
$ ulimit -a
+``` +$ ulimit -a +``` ## Counting: `wc` To count the number of lines, words, and characters (or bytes) in a file, use `wc` (**w**ord **c**ount): -
$ wc example.txt
+```
+$ wc example.txt
       90     468     3189   example.txt
-
+``` The output indicates that the file named `example.txt` contains 90 lines, 468 words, and 3189 characters/bytes. To only count the number of lines, use `wc -l`: -
$ wc -l example.txt
+```
+$ wc -l example.txt
       90    example.txt
-
+``` ## Searching file contents: `grep` @@ -209,10 +233,11 @@ To only count the number of lines, use `wc -l`: "globally search a regular expression and print" but it's entered the common computing lexicon and people use 'grep' to mean searching for anything. To use grep, you give a pattern and a list of files. -
$ grep banana fruit.txt
-$ grep banana fruit_bowl1.txt fruit_bowl2.txt
-$ grep banana fruit*txt
-
+``` +$ grep banana fruit.txt +$ grep banana fruit_bowl1.txt fruit_bowl2.txt +$ grep banana fruit*txt +``` `grep` also lets you search for [Regular Expressions](https://en.wikipedia.org/wiki/Regular_expression), but @@ -226,7 +251,9 @@ lines where a string occurs and `cut` can pull out a particular field. For example, to pull the first column (`-f 1`, the first **f**ield) from (an unquoted) CSV (comma-separated values, so `-d ','`: **d**elimited by `,`) file, you can use the following: -
$ cut -f 1 -d ',' mydata.csv
+``` +$ cut -f 1 -d ',' mydata.csv +``` ## `sed` @@ -235,7 +262,9 @@ piped stream. In this way, it works like grep, but instead of just searching, it can also edit files. This is like "Search and Replace" in a text editor. `sed` has a lot of features, but almost everyone uses the extremely basic version of string replacement: -
$ sed 's/oldtext/newtext/g' myfile.txt
+``` +$ sed 's/oldtext/newtext/g' myfile.txt +``` By default, sed will just print the results. If you want to edit the file inplace, use `-i`, but be very careful that the results will be @@ -254,12 +283,16 @@ whitespace. For example, if you have padded fields then might be an uncertain number of spaces between each field. `awk` does better whitespace splitting. So, pulling out the fourth field in a whitespace delimited file is as follows: -
$ awk '{print $4}' mydata.dat
+``` +$ awk '{print $4}' mydata.dat +``` You can use `-F ':'` to change the delimiter (F for field separator). The next example is used to sum numbers from a field: -
$ awk -F ',' '{sum += $1} END {print sum}' mydata.csv
+``` +$ awk -F ',' '{sum += $1} END {print sum}' mydata.csv +``` ## Basic Shell Scripting The basic premise of a script is to execute automate the execution of @@ -356,9 +389,10 @@ done Subcommands are used all the time in shell scripts. What they do is storing the output of a command in a variable. So this can later be used in a conditional or a loop for example. -
CURRENTDIR=`pwd`  # using backticks
+```
+CURRENTDIR=`pwd`  # using backticks
 CURRENTDIR=$(pwd)  # recommended (easier to type)
-
+``` In the above example you can see the 2 different methods of using a subcommand. `pwd` will output the current working directory, and its @@ -372,14 +406,18 @@ error. How do you properly deal with these situations? Firstly a useful thing to know for debugging and testing is that you can run any command like this: -
command 2>&1 output.log   # one single output file, both output and errors
+``` +command 2>&1 output.log # one single output file, both output and errors +``` If you add `2>&1 output.log` at the end of any command, it will combine `stdout` and `stderr`, outputting it into a single file named `output.log`. If you want regular and error output separated you can use: -
command > output.log 2> output.err  # errors in a separate file
+``` +command > output.log 2> output.err # errors in a separate file +``` this will write regular output to `output.log` and error output to `output.err`. @@ -388,7 +426,9 @@ You can then look for the errors with `less` or search for specific text with `grep`. In scripts, you can use: -
set -e
+``` +set -e +``` This will tell the shell to stop executing any subsequent commands when diff --git a/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md b/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md index 2ad2ea1ab93..4c2d58a29cd 100644 --- a/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md +++ b/mkdocs/docs/HPC/linux-tutorial/common_pitfalls.md @@ -21,29 +21,33 @@ different `$VSC_*` variables. Filenames should **not** contain any spaces! If you have a long filename you should use underscores or dashes (e.g., `very_long_filename`). -
$ cat some file
+```
+$ cat some file
 No such file or directory 'some'
-
+``` Spaces are permitted, however they result in surprising behaviour. To cat the file `'some file'` as above, you can escape the space with a backslash ("`\ `") or you can put the filename in quotes: -
$ cat some\ file
+```
+$ cat some\ file
 ...
-$ cat "some file"
+$ cat "some file"
 ...
-
+``` This is especially error-prone if you are piping results of `find`: -
$ find . -type f | xargs cat
+```
+$ find . -type f | xargs cat
 No such file or directory name ’some’
 No such file or directory name ’file’
-
+``` This can be worked around using the `-print0` flag: -
$ find . -type f -print0 | xargs -0 cat
+```
+$ find . -type f -print0 | xargs -0 cat
 ...
-
+``` But, this is tedious, and you can prevent errors by simply colouring within the lines and not using spaces in filenames. @@ -69,14 +73,18 @@ be careful to make sure that the environment variable exists. If you mistype an environment variable then it will resolve into a blank string. This means the following resolves to `rm -r ~/*` which will remove every file in your home directory! -
$ rm -r ~/$PROJETC/*
+``` +$ rm -r ~/$PROJETC/* +``` ### Typing dangerous commands A good habit when typing dangerous commands is to precede the line with `#`, the comment character. This will let you type out the command without fear of accidentally hitting enter and running something unintended. -
$ #rm -r ~/$POROJETC/*
+``` +$ #rm -r ~/$POROJETC/* +``` Then you can go back to the beginning of the line (`Ctrl-A`) and remove the first character (`Ctrl-D`) to run the command. You can also just press enter to put the command in your history so you can come back to @@ -89,31 +97,36 @@ variables). After copying files from a windows machine, a file might look funny when looking at it on the cluster. -
$ cat script.sh
+```
+$ cat script.sh
 #!/bin/bash^M
 #PBS -l nodes^M
 ...
-
+``` Or you can get errors like: -
$ qsub fibo.pbs
+```
+$ qsub fibo.pbs
 qsub: script is written in DOS/Windows text format
-
+``` See section [dos2unix](uploading_files.md#dos2unix) to fix these errors with `dos2unix`. {% endif %} ### Permissions -
$ ls -l script.sh # File with correct permissions
+```
+$ ls -l script.sh # File with correct permissions
 -rwxr-xr-x 1 vsc40000 vsc40000 2983 Jan 30 09:13 script.sh
-$ ls -l script.sh # File with incorrect permissions
+$ ls -l script.sh # File with incorrect permissions
 -rw-r--r-- 1 vsc40000 vsc40000 2983 Jan 30 09:13 script.sh
-
+``` Before submitting the script, you'll need to add execute permissions to make sure it can be executed: -
$ chmod +x script_name.sh
+``` +$ chmod +x script_name.sh +``` ## Help @@ -126,13 +139,15 @@ consider the error as one thing, and won't show results just containing these words in random order. If you need help about a certain command, you should consult its so-called "man page": -
$ man command
+``` +$ man command +``` This will open the manual of this command. This manual contains detailed explanation of all the options the command has. Exiting the manual is done by pressing 'q'. -**Don't be afraid to contact
{{hpcinfo}}. They are here to help and will do so for even the +**Don't be afraid to contact <{{hpcinfo}}>. They are here to help and will do so for even the smallest of problems!** # More information diff --git a/mkdocs/docs/HPC/linux-tutorial/getting_started.md b/mkdocs/docs/HPC/linux-tutorial/getting_started.md index 5273479f057..a9365f87a80 100644 --- a/mkdocs/docs/HPC/linux-tutorial/getting_started.md +++ b/mkdocs/docs/HPC/linux-tutorial/getting_started.md @@ -17,7 +17,7 @@ To get help: ``` 2. use Google -3. contact {{hpcinfo}} in case +3. contact [{{hpcinfo}}](mailto:{{hpcinfo}}) in case of problems or questions (even for basic things!) ### Errors @@ -27,7 +27,7 @@ will be error output or a message explaining you this. Read this carefully and try to act on it. Try googling the error first to find any possible solution, but if you can't come up with something in 15 minutes, don't hesitate to mail -{{hpcinfo}}. +[{{hpcinfo}}](mailto:{{hpcinfo}}) ## Basic terminal usage @@ -36,8 +36,11 @@ The basic interface is the so-called shell prompt, typically ending with You use the shell by executing commands, and hitting ``. For example: -
$ echo hello 
- hello 
+ +``` +$ echo hello +hello +``` You can go to the start or end of the command line using `Ctrl-A` or `Ctrl-E`. @@ -50,12 +53,13 @@ To go through previous commands, use `` and A powerful feature is that you can "search" through your command history, either using the `history` command, or using `Ctrl-R`: -
$ history
+```
+$ history
     1 echo hello
 
 # hit Ctrl-R, type 'echo' 
 (reverse-i-search)`echo': echo hello
-
+``` ### Stopping commands @@ -73,9 +77,10 @@ They can be thought of as placeholders for things we need to remember. For example, to print the path to your home directory, we can use the shell variable named `HOME`: -
$ echo $HOME 
+```
+$ echo $HOME 
 /user/home/gent/vsc400/vsc40000
-
+``` This prints the value of this variable. @@ -87,10 +92,12 @@ For a full overview of defined environment variables in your current session, you can use the `env` command. You can sort this output with `sort` to make it easier to search in: -
$ env | sort 
+```
+$ env | sort 
 ...
 HOME=/user/home/gent/vsc400/vsc40000 
-... 
+... +``` !!! info In Linux, the pipe operator (`|`) is used to pass output from one command as input to another. @@ -101,13 +108,17 @@ You can also use the `grep` command to search for a piece of text. The following command will output all VSC-specific variable names and their values: -
$ env | sort | grep VSC
+``` +$ env | sort | grep VSC +``` ### Defining variables -It is also possible to define your own variables. this is done with the `export` command: +It is also possible to define your own variables. This is done with the `export` command: -
$ export MYVARIABLE="value"
+``` +$ export MYVARIABLE="value" +``` !!! note @@ -116,7 +127,9 @@ It is also possible to define your own variables. this is done with the `export` If we then do -
$ echo $MYVARIABLE
+``` +$ echo $MYVARIABLE +``` this will output `value`. Note that the quotes are not included, they were only used when defining the variable to escape @@ -134,20 +147,20 @@ Basic information about the system you are logged into can be obtained in a variety of ways. We limit ourselves to determining the hostname: -
$ hostname 
+```
+$ hostname 
 gligar01.gligar.os
 
-$ echo $HOSTNAME 
+$ echo $HOSTNAME 
 gligar01.gligar.os 
-
+``` And querying some basic information about the Linux kernel: -
$ uname -a 
+```
+$ uname -a 
 Linux gligar01.gligar.os 2.6.32-573.8.1.el6.ug.x86_64 #1 SMP Mon Nov 16 15:12:09
-    CET 2015 x86_64 x86_64 x86_64 GNU/Linux
-
- - + CET 2015 x86_64 x86_64 x86_64 GNU/Linux +``` ## Exercises diff --git a/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md b/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md index 51c156e9990..d777d4391ef 100644 --- a/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md +++ b/mkdocs/docs/HPC/linux-tutorial/hpc_infrastructure.md @@ -20,16 +20,17 @@ Space is limited on the cluster's storage. To check your quota, see section To figure out where your quota is being spent, the `du` (**d**isk **u**sage) command can come in useful: -
$ du -sh test
+```
+$ du -sh test
 59M test
-
+``` Do *not* (frequently) run `du` on directories where large amounts of data are stored, since that will: 1. take a long time -2. result in increased load on the shared storage since (the metadata +2. result in an increased load on the shared storage since (the metadata of) every file in those directories will have to be inspected. ## Modules diff --git a/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md b/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md index 939bb41f772..074b22fa895 100644 --- a/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md +++ b/mkdocs/docs/HPC/linux-tutorial/manipulating_files_and_directories.md @@ -10,21 +10,22 @@ commands short to type. To print the contents of an entire file, you can use `cat`; to only see the first or last N lines, you can use `head` or `tail`: -
$ cat one.txt
+```
+$ cat one.txt
 1
 2
 3
 4
 5
 
-$ head -2 one.txt
+$ head -2 one.txt
 1
 2
 
-$ tail -2 one.txt
+$ tail -2 one.txt
 4
 5
-
+``` To check the contents of long text files, you can use the `less` or `more` commands which support scrolling with "<up>", "<down>", @@ -32,17 +33,20 @@ To check the contents of long text files, you can use the `less` or ## Copying files: "cp" -
$ cp source target
-
+``` +$ cp source target +``` This is the `cp` command, which copies a file from source to target. To copy a directory, we use the `-r` option: -
$ cp -r sourceDirectory target
-
+``` +$ cp -r sourceDirectory target +``` A last more complicated example: -
$ cp -a sourceDirectory target
-
+``` +$ cp -a sourceDirectory target +``` Here we used the same `cp` command, but instead we gave it the `-a` option which tells cp to copy all the files and keep timestamps and @@ -50,25 +54,28 @@ permissions. ## Creating directories: "mkdir" -
$ mkdir directory
-
+``` +$ mkdir directory +``` which will create a directory with the given name inside the current directory. ## Renaming/moving files: "mv" -
$ mv source target
-
+``` +$ mv source target +``` `mv` will move the source path to the destination path. Works for both directories as files. ## Removing files: "rm" -
$ rm filename
-
-`rm` will remove a file or directory. (`rm -rf directory` will remove every file inside a given directory). +``` +rm filename +``` +`rm` will remove a file or directory. (`rm -rf ` will remove every file inside a given directory). !!! danger There are NO backups, there is no 'trash bin'. If you remove files/directories, they are gone. @@ -100,20 +107,22 @@ by the so-called *umask* setting, and are by default `rw-rw-r--` for files and ` ## Changing permissions: "chmod" -
$ ls -l
+```
+$ ls -l
 total 1
 -rw-r--r--. 1 vsc40000 mygroup 4283648 Apr 12 15:13 articleTable.csv
 drwxr-x---. 2 vsc40000 mygroup 40 Apr 12 15:00 Project_GoldenDragon
-
+``` We use `chmod` to change the modifiers to the directory to let people in the group write to the directory: -
$ chmod g+w Project_GoldenDragon
-$ ls -l
+```
+$ chmod g+w Project_GoldenDragon
+$ ls -l
 total 1
 -rw-r--r--. 1 vsc40000 mygroup 4283648 Apr 12 15:13 articleTable.csv
 drwxrwx---. 2 vsc40000 mygroup 40 Apr 12 15:00 Project_GoldenDragon
-
+``` The syntax used here is `g+x` which means group was given write permission. To revoke it again, we use `g-w`. The other roles are `u` @@ -134,10 +143,11 @@ However, this means that all users in `mygroup` can add or remove files. This could be problematic if you only wanted one person to be allowed to help you administer the files in the project. We need a new group. To do this in the HPC environment, we need to use access control lists (ACLs): -
$ setfacl -m u:otheruser:w Project_GoldenDragon
-$ ls -l Project_GoldenDragon
+```
+$ setfacl -m u:otheruser:w Project_GoldenDragon
+$ ls -l Project_GoldenDragon
 drwxr-x---+ 2 vsc40000 mygroup 40 Apr 12 15:00 Project_GoldenDragon
-
+``` This will give the **u**ser `otheruser` permissions to **w**rite to `Project_GoldenDragon` @@ -158,31 +168,35 @@ used frequently. This means they will use less space and thus you get more out of your quota. Some types of files (e.g., CSV files with a lot of numbers) compress as much as 9:1. The most commonly used compression format on Linux is gzip. To compress a file using gzip, we use: -
$ ls -lh myfile
+```
+$ ls -lh myfile
 -rw-r--r--. 1 vsc40000 vsc40000 4.1M Dec 2 11:14 myfile
-$ gzip myfile
-$ ls -lh myfile.gz
+$ gzip myfile
+$ ls -lh myfile.gz
 -rw-r--r--. 1 vsc40000 vsc40000 1.1M Dec 2 11:14 myfile.gz
-
+``` !!! note If you zip a file, the original file will be removed. If you unzip a file, the compressed file will be removed. To keep both, we send the data to `stdout` and redirect it to the target file: -
$ gzip -c myfile > myfile.gz
-    $ gunzip -c myfile.gz > myfile
-    
+ ``` + $ gzip -c myfile > myfile.gz + $ gunzip -c myfile.gz > myfile + ``` ### "zip" and "unzip" Windows and macOS seem to favour the zip file format, so it's also important to know how to unpack those. We do this using unzip: -
$ unzip myfile.zip
-
+``` +$ unzip myfile.zip +``` If we would like to make our own zip archive, we use zip: -
$ zip myfiles.zip myfile1 myfile2 myfile3
-
+``` +$ zip myfiles.zip myfile1 myfile2 myfile3 +``` ## Working with tarballs: "tar" @@ -191,37 +205,42 @@ bigger file. You will normally want to unpack these files more often than you make them. To unpack a `.tar` file you use: -
$ tar -xf tarfile.tar
-
+``` +$ tar -xf tarfile.tar +``` Often, you will find `gzip` compressed `.tar` files on the web. These are called tarballs. You can recognize them by the filename ending in `.tar.gz`. You can uncompress these using `gunzip` and then unpacking them using `tar`. But `tar` knows how to open them using the `-z` option: -
$ tar -zxf tarfile.tar.gz
-$ tar -zxf tarfile.tgz
-
+``` +$ tar -zxf tarfile.tar.gz +$ tar -zxf tarfile.tgz +``` ### Order of arguments Note: Archive programs like `zip`, `tar`, and `jar` use arguments in the "opposite direction" of copy commands. -
# cp, ln: <source(s)> <target>
-$ cp source1 source2 source3 target
-$ ln -s source target
+```
+# cp, ln: <source(s)> <target>
+$ cp source1 source2 source3 target
+$ ln -s source target
 
 # zip, tar: <target> <source(s)>
-$ zip zipfile.zip source1 source2 source3
-$ tar -cf tarfile.tar source1 source2 source3
-
+$ zip zipfile.zip source1 source2 source3 +$ tar -cf tarfile.tar source1 source2 source3 +``` If you use `tar` with the source files first then the first file will be overwritten. You can control the order of arguments of `tar` if it helps you remember: -
$ tar -c source1 source2 source3 -f tarfile.tar
+``` +$ tar -c source1 source2 source3 -f tarfile.tar +``` ## Exercises diff --git a/mkdocs/docs/HPC/linux-tutorial/navigating.md b/mkdocs/docs/HPC/linux-tutorial/navigating.md index 5ba6173489c..0042b6e50f1 100644 --- a/mkdocs/docs/HPC/linux-tutorial/navigating.md +++ b/mkdocs/docs/HPC/linux-tutorial/navigating.md @@ -131,12 +131,13 @@ $ pwd The `file` command can be used to inspect what type of file you're dealing with: -
$ file afile.txt
+```
+$ file afile.txt
 afile.txt: ASCII text
 
-$ file some_directory 
+$ file some_directory 
 some_directory: directory
-
+``` ## Finding files/directories: "find" diff --git a/mkdocs/docs/HPC/linux-tutorial/uploading_files.md b/mkdocs/docs/HPC/linux-tutorial/uploading_files.md index 0cf4252e925..b5fced76644 100644 --- a/mkdocs/docs/HPC/linux-tutorial/uploading_files.md +++ b/mkdocs/docs/HPC/linux-tutorial/uploading_files.md @@ -24,8 +24,9 @@ sbatch: error: instead of expected UNIX line breaks (\n). To fix this problem, you should run the ``dos2unix`` command on the file: -
$ dos2unix filename
-
+``` +$ dos2unix filename +``` ## Symlinks for data/scratch [//]: # (sec:symlink-for-data) @@ -40,15 +41,16 @@ This will create 4 symbolic links {% if OS == windows %} (they're like "shortcuts" on your desktop) {% endif %} pointing to the respective storages: -
$ cd $HOME
-$ ln -s $VSC_SCRATCH scratch
-$ ln -s $VSC_DATA data
-$ ls -l scratch data
+```
+$ cd $HOME
+$ ln -s $VSC_SCRATCH scratch
+$ ln -s $VSC_DATA data
+$ ls -l scratch data
 lrwxrwxrwx 1 vsc40000 vsc40000 31 Mar 27 2009 data ->
     /user/data/gent/vsc400/vsc40000
 lrwxrwxrwx 1 vsc40000 vsc40000 34 Jun 5 2012 scratch ->
     /user/scratch/gent/vsc400/vsc40000
-
+``` @@ -83,7 +85,9 @@ Installing `rsync` is the easiest on Linux: it comes pre-installed with a lot of distributions. For example, to copy a folder with lots of CSV files: -
$ rsync -rzv testfolder vsc40000@login.hpc.ugent.be:data/
+``` +$ rsync -rzv testfolder vsc40000@login.hpc.ugent.be:data/ +``` will copy the folder `testfolder` and its contents to `$VSC_DATA`, assuming the `data` symlink is present in your home directory, see @@ -98,7 +102,9 @@ To copy large files using `rsync`, you can use the `-P` flag: it enables both showing of progress and resuming partially downloaded files. To copy files to your local computer, you can also use `rsync`: -
$ rsync -rzv vsc40000@login.hpc.ugent.be:data/bioset local_folder
+``` +$ rsync -rzv vsc40000@login.hpc.ugent.be:data/bioset local_folder +``` This will copy the folder `bioset` and its contents on `$VSC_DATA` to a local folder named `local_folder`. diff --git a/mkdocs/docs/HPC/multi_core_jobs.md b/mkdocs/docs/HPC/multi_core_jobs.md index 9c527db4eae..00834138cbd 100644 --- a/mkdocs/docs/HPC/multi_core_jobs.md +++ b/mkdocs/docs/HPC/multi_core_jobs.md @@ -28,79 +28,15 @@ approaches to parallel programming. In addition there are many problem specific libraries that incorporate parallel capabilities. The next three sections explore some common approaches: (raw) threads, OpenMP and MPI. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
Parallel programming approaches
-
- Tool - - Available languages binding - - Limitations -
- Raw threads pthreads, boost:: threading, ... - - Threading libraries are available for all common programming languages - - Threading libraries are available for all common programming languages & Threads are limited to shared memory systems. They are more often used on single node systems rather than for {{ hpc }}. Thread management is hard. -
- OpenMP - - Fortran/C/C++ - - Limited to shared memory systems, but large shared memory systems for HPC are not uncommon (e.g., SGI UV). Loops and task can be parallelized by simple insertion of compiler directives. Under the hood threads are used. Hybrid approaches exist which use OpenMP to parallelize the work load on each node and MPI (see below) for communication between nodes. -
- Lightweight threads with clever scheduling, Intel TBB, Intel Cilk Plus - - C/C++ - - Limited to shared memory systems, but may be combined with MPI. Thread management is taken care of by a very clever scheduler enabling the programmer to focus on parallelization itself. Hybrid approaches exist which use TBB and/or Cilk Plus to parallelise the work load on each node and MPI (see below) for communication between nodes. -
- MPI - - Fortran/C/C++, Python - - Applies to both distributed and shared memory systems. Cooperation between different nodes or cores is managed by explicit calls to library routines handling communication routines. -
- Global Arrays library - - C/C++, Python - - Mimics a global address space on distributed memory systems, by distributing arrays over many nodes and one sided communication. This library is used a lot for chemical structure calculation codes and was used in one of the first applications that broke the PetaFlop barrier. -
+ +| **Tool** | **Available languages binding** | **Limitations** | +|------------------------------------------------------------------------|------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Raw threads (pthreads, boost::threading, ...) | Threading libraries are available for all common programming languages | Threading libraries are available for all common programming languages & Threads are limited to shared memory systems. They are more often used on single node systems rather than for {{ hpc }}. Thread management is hard. | +| OpenMP | Fortran/C/C++ | Limited to shared memory systems, but large shared memory systems for HPC are not uncommon (e.g., SGI UV). Loops and task can be parallelized by simple insertion of compiler directives. Under the hood threads are used. Hybrid approaches exist which use OpenMP to parallelize the work load on each node and MPI (see below) for communication between nodes. | +| Lightweight threads with clever scheduling, Intel TBB, Intel Cilk Plus | C/C++ | Limited to shared memory systems, but may be combined with MPI. Thread management is taken care of by a very clever scheduler enabling the programmer to focus on parallelization itself. Hybrid approaches exist which use TBB and/or Cilk Plus to parallelise the work load on each node and MPI (see below) for communication between nodes. | +| MPI | Fortran/C/C++, Python | Applies to both distributed and shared memory systems. Cooperation between different nodes or cores is managed by explicit calls to library routines handling communication routines. | +| Global Arrays library | C/C++, Python | Mimics a global address space on distributed memory systems, by distributing arrays over many nodes and one sided communication. This library is used a lot for chemical structure calculation codes and was used in one of the first applications that broke the PetaFlop barrier. | + !!! tip You can request more nodes/cores by adding following line to your run script. @@ -150,28 +86,30 @@ runs a simple function that only prints "Hello from thread". Go to the example directory: -
$ cd ~/{{ exampledir }}
-
+``` +cd ~/{{ exampledir }} +``` !!! note If the example directory is not yet present, copy it to your home directory: -
$ cp -r {{ examplesdir }} ~/
+ ``` + cp -r {{ examplesdir }} ~/ + ``` Study the example first: -
-- T_hello.c --
- -```C +```C title="T_hello.c" {% include "./examples/Multi_core_jobs_Parallel_Computing/T_hello.c" %} ``` And compile it (whilst including the thread library) and run and test it on the login-node: -
$ module load GCC
-$ gcc -o T_hello T_hello.c -lpthread
-$ ./T_hello
+```
+$ module load GCC
+$ gcc -o T_hello T_hello.c -lpthread
+$ ./T_hello
 spawning thread 0
 spawning thread 1
 spawning thread 2
@@ -182,13 +120,14 @@ spawning thread 3
 spawning thread 4
 Hello from thread 3!
 Hello from thread 4!
-
+``` Now, run it on the cluster and check the output: -
$ qsub T_hello.pbs
+```
+$ qsub T_hello.pbs
 {{ jobid }}
-$ more T_hello.pbs.o{{ jobid }}
+$ more T_hello.pbs.o{{ jobid }}
 spawning thread 0
 spawning thread 1
 spawning thread 2
@@ -199,7 +138,7 @@ spawning thread 3
 spawning thread 4
 Hello from thread 3!
 Hello from thread 4!
-
+``` !!! tip If you plan engaging in parallel programming using threads, this book @@ -256,18 +195,17 @@ Parallelising for loops is really simple (see code below). By default, loop iteration counters in OpenMP loop constructs (in this case the i variable) in the for loop are set to private variables. -
-- omp1.c --
- -```C +```C title="omp1.c" {% include "./examples/Multi_core_jobs_Parallel_Computing/omp1.c" %} ``` And compile it (whilst including the "*openmp*" library) and run and test it on the login-node: -
$ module load GCC
-$ gcc -fopenmp -o omp1 omp1.c
-$ ./omp1
+```
+$ module load GCC
+$ gcc -fopenmp -o omp1 omp1.c
+$ ./omp1
 Thread 6 performed 125 iterations of the loop.
 Thread 7 performed 125 iterations of the loop.
 Thread 5 performed 125 iterations of the loop.
@@ -276,12 +214,13 @@ Thread 0 performed 125 iterations of the loop.
 Thread 2 performed 125 iterations of the loop.
 Thread 3 performed 125 iterations of the loop.
 Thread 1 performed 125 iterations of the loop.
-
+``` Now run it in the cluster and check the result again. -
$ qsub omp1.pbs
-$ cat omp1.pbs.o*
+```
+$ qsub omp1.pbs
+$ cat omp1.pbs.o*
 Thread 1 performed 125 iterations of the loop.
 Thread 4 performed 125 iterations of the loop.
 Thread 3 performed 125 iterations of the loop.
@@ -290,7 +229,7 @@ Thread 5 performed 125 iterations of the loop.
 Thread 7 performed 125 iterations of the loop.
 Thread 2 performed 125 iterations of the loop.
 Thread 6 performed 125 iterations of the loop.
-
+``` ### Critical Code @@ -301,18 +240,17 @@ you do things like updating a global variable with local results from each thread, and you don't have to worry about things like other threads writing to that global variable at the same time (a collision). -
-- omp2.c --
- -```C +```C title="omp2.c" {% include "./examples/Multi_core_jobs_Parallel_Computing/omp2.c" %} ``` And compile it (whilst including the "*openmp*" library) and run and test it on the login-node: -
$ module load GCC
-$ gcc -fopenmp -o omp2 omp2.c
-$ ./omp2
+```
+$ module load GCC
+$ gcc -fopenmp -o omp2 omp2.c
+$ ./omp2
 Thread 3 is adding its iterations (12500) to sum (0), total is now 12500.
 Thread 7 is adding its iterations (12500) to sum (12500), total is now 25000.
 Thread 5 is adding its iterations (12500) to sum (25000), total is now 37500.
@@ -322,12 +260,13 @@ Thread 4 is adding its iterations (12500) to sum (62500), total is now 75000.
 Thread 1 is adding its iterations (12500) to sum (75000), total is now 87500.
 Thread 0 is adding its iterations (12500) to sum (87500), total is now 100000.
 Total # loop iterations is 100000
-
+``` Now run it in the cluster and check the result again. -
$ qsub omp2.pbs
-$ cat omp2.pbs.o*
+```
+$ qsub omp2.pbs
+$ cat omp2.pbs.o*
 Thread 2 is adding its iterations (12500) to sum (0), total is now 12500.
 Thread 0 is adding its iterations (12500) to sum (12500), total is now 25000.
 Thread 1 is adding its iterations (12500) to sum (25000), total is now 37500.
@@ -337,7 +276,7 @@ Thread 3 is adding its iterations (12500) to sum (62500), total is now 75000.
 Thread 5 is adding its iterations (12500) to sum (75000), total is now 87500.
 Thread 6 is adding its iterations (12500) to sum (87500), total is now 100000.
 Total # loop iterations is 100000
-
+``` ### Reduction @@ -349,27 +288,27 @@ example above, where we used the "critical code" directive to accomplish this. The map-reduce paradigm is so common that OpenMP has a specific directive that allows you to more easily implement this. -
-- omp3.c --
- -```C +```C title="omp3.c" {% include "./examples/Multi_core_jobs_Parallel_Computing/omp3.c" %} ``` And compile it (whilst including the "*openmp*" library) and run and test it on the login-node: -
$ module load GCC
-$ gcc -fopenmp -o omp3 omp3.c
-$ ./omp3
+```
+$ module load GCC
+$ gcc -fopenmp -o omp3 omp3.c
+$ ./omp3
 Total # loop iterations is 100000
-
+``` Now run it in the cluster and check the result again. -
$ qsub omp3.pbs
-$ cat omp3.pbs.o*
+```
+$ qsub omp3.pbs
+$ cat omp3.pbs.o*
 Total # loop iterations is 100000
-
+``` ### Other OpenMP directives @@ -439,38 +378,36 @@ return the results to the main process, and print the messages. Study the MPI-programme and the PBS-file: -
-- mpi_hello.c --
- -```C +```C title="mpi_hello.c" {% include "./examples/Multi_core_jobs_Parallel_Computing/mpi_hello.c" %} ``` -
-- mpi_hello.pbs --
- -```bash +```bash title="mpi_hello.pbs" {% include "./examples/Multi_core_jobs_Parallel_Computing/mpi_hello.pbs" %} ``` and compile it: -
$ module load intel
-$ mpiicc -o mpi_hello mpi_hello.c
-
+``` +$ module load intel +$ mpiicc -o mpi_hello mpi_hello.c +``` mpiicc is a wrapper of the Intel C++ compiler icc to compile MPI programs (see [the chapter on compilation](./compiling_your_software.md) for details). Run the parallel program: -
$ qsub mpi_hello.pbs
-$ ls -l
+```
+$ qsub mpi_hello.pbs
+$ ls -l
 total 1024
 -rwxrwxr-x 1 {{ userid }} 8746 Sep 16 14:19 mpi_hello*
 -rw-r--r-- 1 {{ userid }} 1626 Sep 16 14:18 mpi_hello.c
 -rw------- 1 {{ userid }}    0 Sep 16 14:22 mpi_hello.o{{ jobid }}
 -rw------- 1 {{ userid }}  697 Sep 16 14:22 mpi_hello.o{{ jobid }}
 -rw-r--r-- 1 {{ userid }}  304 Sep 16 14:22 mpi_hello.pbs
-$ cat mpi_hello.o{{ jobid }}
+$ cat mpi_hello.o{{ jobid }}
 0: We have 16 processors
 0: Hello 1! Processor 1 reporting for duty
 0: Hello 2! Processor 2 reporting for duty
@@ -487,7 +424,7 @@ total 1024
 0: Hello 13! Processor 13 reporting for duty
 0: Hello 14! Processor 14 reporting for duty
 0: Hello 15! Processor 15 reporting for duty
-
+``` The runtime environment for the MPI implementation used (often called mpirun or mpiexec) spawns multiple copies of the program, with the total diff --git a/mkdocs/docs/HPC/multi_job_submission.md b/mkdocs/docs/HPC/multi_job_submission.md index 5177d79fa33..d336959cb85 100644 --- a/mkdocs/docs/HPC/multi_job_submission.md +++ b/mkdocs/docs/HPC/multi_job_submission.md @@ -48,30 +48,32 @@ scenario that can be reduced to a **MapReduce** approach.[^1] ## The worker Framework: Parameter Sweeps First go to the right directory: -
$ cd ~/examples/Multi-job-submission/par_sweep
+ +``` +cd ~/examples/Multi-job-submission/par_sweep +``` Suppose the user wishes to run the "*weather*" program, which takes three parameters: a temperature, a pressure and a volume. A typical call of the program looks like: -
$ ./weather -t 20 -p 1.05 -v 4.3
-T: 20  P: 1.05  V: 4.3
+ +``` +$ ./weather -t 20 -p 1.05 -v 4.3 +T: 20 P: 1.05 V: 4.3 +``` For the purpose of this exercise, the weather program is just a simple bash script, which prints the 3 variables to the standard output and waits a bit: -

par_sweep/weather

- -```shell +```shell title="par_sweep/weather" {% include "examples/Multi-job-submission/par_sweep/weather" %} ``` A job script that would run this as a job for the first parameters (p01) would then look like: -

par_sweep/weather_p01.pbs

- -```shell +```shell title="par_sweep/weather_p01.pbs" {% include "examples/Multi-job-submission/par_sweep/weather_p01.pbs" %} ``` @@ -80,7 +82,10 @@ particular instance of the parameters, i.e., temperature = 20, pressure = 1.05, and volume = 4.3. To submit the job, the user would use: -
$ qsub weather_p01.pbs
+ +``` + $ qsub weather_p01.pbs +``` However, the user wants to run this program for many parameter instances, e.g., he wants to run the program on 100 instances of temperature, pressure and volume. The 100 parameter instances can be @@ -88,14 +93,17 @@ stored in a comma separated value file (.csv) that can be generated using a spreadsheet program such as Microsoft Excel or RDBMS or just by hand using any text editor (do **not** use a word processor such as Microsoft Word). The first few lines of the file "*data.csv*" would look like: -
$ more data.csv
+
+```
+$ more data.csv
 temperature, pressure, volume
 293, 1.0e5, 107
 294, 1.0e5, 106
 295, 1.0e5, 105
 296, 1.0e5, 104
 297, 1.0e5, 103
-...
+... +``` It has to contain the names of the variables on the first line, followed by 100 parameter instances in the current example. @@ -103,9 +111,7 @@ by 100 parameter instances in the current example. In order to make our PBS generic, the PBS file can be modified as follows: -

par_sweep/weather.pbs

- -```shell +```shell title="par_sweep/weather.pbs" {% include "examples/Multi-job-submission/par_sweep/weather.pbs" %} ``` @@ -128,10 +134,13 @@ minutes, i.e., 4 hours to be on the safe side. The job can now be submitted as follows (to check which `worker` module to use, see subsection [Using explicit version numbers](running_batch_jobs.md#using-explicit-version-numbers)): -
$ module load worker/1.6.12-foss-2021b
-$ wsub -batch weather.pbs -data data.csv
+
+```
+$ module load worker/1.6.12-foss-2021b
+$ wsub -batch weather.pbs -data data.csv
 total number of work items: 41
-{{jobid}}
+{{jobid}} +``` Note that the PBS file is the value of the -batch option. The weather program will now be run for all 100 parameter instances -- 8 @@ -140,17 +149,26 @@ a parameter instance is called a work item in Worker parlance. !!! warning When you attempt to submit a worker job on a non-default cluster, you might encounter an `Illegal instruction` error. In such cases, the solution is to use a different `module swap` command. For example, to submit a worker job to the [`donphan` debug cluster](interactive_debug.md) from the login nodes, use: -
$ module swap env/slurm/donphan
-    
+ + ``` + module swap env/slurm/donphan + ``` + instead of -
$ module swap cluster/donphan 
+ + ``` + module swap cluster/donphan + ``` We recommend using a `module swap cluster` command after submitting the jobs. Additional information about this as well as more comprehensive details concerning the 'Illegal instruction' error can be accessed [here](troubleshooting.md#multi-job-submissions-on-a-non-default-cluster). ## The Worker framework: Job arrays [//]: # (sec:worker-framework-job-arrays) First go to the right directory: -
$ cd ~/examples/Multi-job-submission/job_array
+ +``` +cd ~/examples/Multi-job-submission/job_array +``` As a simple example, assume you have a serial program called *myprog* that you want to run on various input files *input\[1-100\]*. @@ -187,7 +205,10 @@ The details are script/program to specialise for that job The job could have been submitted using: -
$ qsub -t 1-100 my_prog.pbs
+ +``` +qsub -t 1-100 my_prog.pbs +``` The effect was that rather than 1 job, the user would actually submit 100 jobs to the queue system. This was a popular feature of TORQUE, but @@ -200,9 +221,7 @@ arrays" in its own way. A typical job script for use with job arrays would look like this: -

job_array/job_array.pbs

- -```shell +```shell title="job_array/job_array.pbs" {% include "examples/Multi-job-submission/job_array/job_array.pbs" %} ``` @@ -213,14 +232,17 @@ with those parameters. Input for the program is stored in files with names such as input_1.dat, input_2.dat, ..., input_100.dat in the ./input subdirectory. -
$ ls ./input
+
+```
+$ ls ./input
 ...
-$ more ./input/input_99.dat
+$ more ./input/input_99.dat
 This is input file \#99
 Parameter #1 = 99
 Parameter #2 = 25.67
 Parameter #3 = Batch
-Parameter #4 = 0x562867
+Parameter #4 = 0x562867 +``` For the sole purpose of this exercise, we have provided a short "test_set" program, which reads the "input" files and just copies them @@ -229,18 +251,14 @@ file. The corresponding output computed by our "*test_set*" program will be written to the *"./output*" directory in output_1.dat, output_2.dat, ..., output_100.dat. files. -

job_array/test_set

- -```shell +```shell title="job_array/test_set" {% include "examples/Multi-job-submission/job_array/test_set" %} ``` Using the "worker framework", a feature akin to job arrays can be used with minimal modifications to the job script: -

job_array/test_set.pbs

- -```shell +```shell title="job_array/test_set.pbs" {% include "examples/Multi-job-submission/job_array/test_set.pbs" %} ``` @@ -253,10 +271,13 @@ Note that walltime=04:00:00). The job is now submitted as follows: -
$ module load worker/1.6.12-foss-2021b
-$ wsub -t 1-100 -batch test_set.pbs
+
+```
+$ module load worker/1.6.12-foss-2021b
+$ wsub -t 1-100 -batch test_set.pbs
 total number of work items: 100
-{{jobid}}
+{{jobid}} +``` The "*test_set*" program will now be run for all 100 input files -- 8 concurrently -- until all computations are done. Again, a computation @@ -265,16 +286,18 @@ work item in Worker speak. Note that in contrast to TORQUE job arrays, a worker job array only submits a single job. -
$ qstat
+
+```
+$ qstat
 Job id          Name          User      Time   Use S Queue
 --------------- ------------- --------- ---- ----- - -----
 {{jobid}}  test_set.pbs  {{userid}}          0 Q
 
 And you can now check the generated output files:
-$ more ./output/output_99.dat
+$ more ./output/output_99.dat
 This is output file #99
 Calculations done, no results
-
+``` ## MapReduce: prologues and epilogue @@ -299,33 +322,36 @@ is executed just once after the work on all work items has finished. Technically, the master, i.e., the process that is responsible for dispatching work and logging progress, executes the prologue and epilogue. -
$ cd ~/examples/Multi-job-submission/map_reduce
+ +``` +cd ~/examples/Multi-job-submission/map_reduce +``` The script "pre.sh" prepares the data by creating 100 different input-files, and the script "post.sh" aggregates (concatenates) the data. First study the scripts: -

map_reduce/pre.sh

-```shell +```shell title="map_reduce/pre.sh" {% include "examples/Multi-job-submission/map_reduce/pre.sh" %} ``` -

map_reduce/post.sh

- -```shell +```shell title="map_reduce/post.sh" {% include "examples/Multi-job-submission/map_reduce/post.sh" %} ``` Then one can submit a MapReduce style job as follows: -
$ wsub -prolog pre.sh -batch test_set.pbs -epilog post.sh -t 1-100
+
+```
+$ wsub -prolog pre.sh -batch test_set.pbs -epilog post.sh -t 1-100
 total number of work items: 100
 {{jobid}}
-$ cat all_output.txt
+$ cat all_output.txt
 ...
-$ rm -r -f ./output/
+$ rm -r -f ./output/ +``` Note that the time taken for executing the prologue and the epilogue should be added to the job's total walltime. @@ -356,11 +382,17 @@ from the job's name and the job's ID, i.e., it has the form `.log`. For the running example, this could be `run.pbs.log{{jobid}}`, assuming the job's ID is {{jobid}}. To keep an eye on the progress, one can use: -
$ tail -f run.pbs.log{{jobid}}
+ +``` +tail -f run.pbs.log{{jobid}} +``` Alternatively, `wsummarize`, a Worker command that summarises a log file, can be used: -
$ watch -n 60 wsummarize run.pbs.log{{jobid}}
+ +``` +watch -n 60 wsummarize run.pbs.log{{jobid}} +``` This will summarise the log file every 60 seconds. @@ -398,13 +430,19 @@ processed. Worker makes it very easy to resume such a job without having to figure out which work items did complete successfully, and which remain to be computed. Suppose the job that did not complete all its work items had ID "445948". -
$ wresume -jobid {{jobid}}
+ +``` +wresume -jobid {{jobid}} +``` This will submit a new job that will start to work on the work items that were not done yet. Note that it is possible to change almost all job parameters when resuming, specifically the requested resources such as the number of cores and the walltime. -
$ wresume -l walltime=1:30:00 -jobid {{jobid}}}
+ +``` +wresume -l walltime=1:30:00 -jobid {{jobid}} +``` Work items may fail to complete successfully for a variety of reasons, e.g., a data file that is missing, a (minor) programming error, etc. @@ -413,7 +451,10 @@ done, so resuming a job will only execute work items that did not terminate either successfully, or reporting a failure. It is also possible to retry work items that failed (preferably after the glitch why they failed was fixed). -
$ wresume -jobid {{jobid}} -retry
+ +``` +wresume -jobid {{jobid}} -retry +``` By default, a job's prologue is not executed when it is resumed, while its epilogue is. "wresume" has options to modify this default behaviour. @@ -423,7 +464,9 @@ its epilogue is. "wresume" has options to modify this default behaviour. This how-to introduces only Worker's basic features. The wsub command has some usage information that is printed when the -help option is specified: -
$ wsub -help
+
+```
+$ wsub -help
 ### usage: wsub  -batch <batch-file>          
 #                [-data <data-files>]         
 #                [-prolog <prolog-file>]      
@@ -453,7 +496,7 @@ specified:
 #   -t <array-req>        : qsub's PBS array request options, e.g., 1-10
 #   <pbs-qsub-options>    : options passed on to the queue submission
 #                           command
-
+``` ## Troubleshooting diff --git a/mkdocs/docs/HPC/mympirun.md b/mkdocs/docs/HPC/mympirun.md index 98fd91cd0c4..93a55fc44e3 100644 --- a/mkdocs/docs/HPC/mympirun.md +++ b/mkdocs/docs/HPC/mympirun.md @@ -12,8 +12,9 @@ README](https://github.com/hpcugent/vsc-mympirun/blob/master/README.md). Before using `mympirun`, we first need to load its module: -
$ module load vsc-mympirun
-
+``` +module load vsc-mympirun +``` As an exception, we don't specify a version here. The reason is that we want to ensure that the latest version of the `mympirun` script is @@ -47,14 +48,15 @@ The `--hybrid` option requires a positive number. This number specifies the number of processes started on each available physical *node*. It will ignore the number of available *cores* per node. -
$ echo $PBS_NUM_NODES
+```
+$ echo $PBS_NUM_NODES
 2
-$ mympirun --hybrid 2 ./mpihello
+$ mympirun --hybrid 2 ./mpihello
 Hello world from processor node3400.doduo.os, rank 1 out of 4 processors 
 Hello world from processor node3401.doduo.os, rank 3 out of 4 processors 
 Hello world from processor node3401.doduo.os, rank 2 out of 4 processors 
 Hello world from processor node3400.doduo.os, rank 0 out of 4 processors
-
+``` ### Other options @@ -74,6 +76,7 @@ You can do a so-called "dry run", which doesn't have any side-effects, but just prints the command that `mympirun` would execute. You enable this with the `--dry-run` flag: -
$ mympirun --dry-run ./mpi_hello
+```
+$ mympirun --dry-run ./mpi_hello
 mpirun ... -genv I_MPI_FABRICS shm:dapl ... -np 16 ... ./mpi_hello
-
+``` diff --git a/mkdocs/docs/HPC/openFOAM.md b/mkdocs/docs/HPC/openFOAM.md index 8f83201d6a4..04ed7a29c77 100644 --- a/mkdocs/docs/HPC/openFOAM.md +++ b/mkdocs/docs/HPC/openFOAM.md @@ -71,7 +71,8 @@ First of all, you need to pick and load one of the available `OpenFOAM` modules. To get an overview of the available modules, run '`module avail OpenFOAM`'. For example: -
$ module avail OpenFOAM
+```
+$ module avail OpenFOAM
 ------------------ /apps/gent/CO7/sandybridge/modules/all ------------------
    OpenFOAM/v1712-foss-2017b     OpenFOAM/4.1-intel-2017a
    OpenFOAM/v1712-intel-2017b    OpenFOAM/5.0-intel-2017a
@@ -81,7 +82,7 @@ modules. To get an overview of the available modules, run
    OpenFOAM/2.4.0-intel-2017a    OpenFOAM/5.0-20180108-intel-2018a
    OpenFOAM/3.0.1-intel-2016b    OpenFOAM/6-intel-2018a            (D)
    OpenFOAM/4.0-intel-2016b
-
+``` To pick a module, take into account the differences between the different OpenFOAM versions w.r.t. features and API (see also [Different OpenFOAM releases](./#different-openfoam-releases)). If @@ -94,8 +95,9 @@ that includes `intel-{{ current_year}}a`. To prepare your environment for using OpenFOAM, load the `OpenFOAM` module you have picked; for example: -
$ module load OpenFOAM/4.1-intel-2017a
-
+``` +module load OpenFOAM/11-foss-2023a +``` ### Sourcing the `$FOAM_BASH` script @@ -107,8 +109,9 @@ location to this script. Assuming you are using `bash` in your shell session or job script, you should always run the following command after loading an `OpenFOAM` module: -
$ source $FOAM_BASH
-
+``` +source $FOAM_BASH +``` ### Defining utility functions used in tutorial cases @@ -117,8 +120,9 @@ If you would like to use the `getApplication`, `runApplication`, are used in OpenFOAM tutorials, you also need to `source` the `RunFunctions` script: -
$  source $WM_PROJECT_DIR/bin/tools/RunFunctions
-
+``` +source $WM_PROJECT_DIR/bin/tools/RunFunctions +``` Note that this needs to be done **after** sourcing `$FOAM_BASH` to make sure `$WM_PROJECT_DIR` is defined. @@ -129,8 +133,9 @@ If you are seeing `Floating Point Exception` errors, you can undefine the `$FOAM_SIGFPE` environment variable that is defined by the `$FOAM_BASH` script as follows: -
$ unset $FOAM_SIGFPE
-
+``` +unset $FOAM_SIGFPE +``` Note that this only prevents OpenFOAM from propagating floating point exceptions, which then results in terminating the simulation. However, @@ -218,8 +223,9 @@ processes used in a parallel OpenFOAM execution, the `$MYMPIRUN_VARIABLESPREFIX` environment variable must be defined as follows, prior to running the OpenFOAM simulation with `mympirun`: -
$ export MYMPIRUN_VARIABLESPREFIX=WM_PROJECT,FOAM,MPI
-
+``` +export MYMPIRUN_VARIABLESPREFIX=WM_PROJECT,FOAM,MPI +``` Whenever you are instructed to use a command like `mpirun -np ...`, use `mympirun ...` instead; `mympirun` will automatically detect the @@ -236,8 +242,9 @@ make sure that the number of subdomains matches the number of processor cores that will be used by `mympirun`. If not, you may run into an error message like: -
number of processor directories = 4 is not equal to the number of processors = 16
-
+``` +number of processor directories = 4 is not equal to the number of processors = 16 +``` In this case, the case was decomposed in 4 subdomains, while the OpenFOAM simulation was started with 16 processes through `mympirun`. To @@ -264,8 +271,9 @@ by minimising the number of processor boundaries. To visualise the processor domains, use the following command: -
$ mympirun foamToVTK -parallel -constant -time 0 -excludePatches '(".*.")'
-
+``` +mympirun foamToVTK -parallel -constant -time 0 -excludePatches '(".*.")' +``` and then load the VTK files generated in the `VTK` folder into ParaView. @@ -292,7 +300,7 @@ specify in `system/controlDict` (see also of plane) rather than the entire domain; - if you do not plan to change the parameters of the OpenFOAM - simulation while it is running, **set runTimeModifiable to false** to avoid that OpenFOAM re-reads each + simulation while it is running, set **runTimeModifiable** to **false** to avoid that OpenFOAM re-reads each of the `system/*Dict` files at every time step; - if the results per individual time step are large, consider setting @@ -322,7 +330,6 @@ See . Example job script for `damBreak` OpenFOAM tutorial (see also ): -
-- OpenFOAM_damBreak.sh --
-```bash +```bash title="OpenFOAM_damBreak.sh" {% include "./examples/OpenFOAM/OpenFOAM_damBreak.sh" %} ``` diff --git a/mkdocs/docs/HPC/program_examples.md b/mkdocs/docs/HPC/program_examples.md index 96fbb42dccd..34138392886 100644 --- a/mkdocs/docs/HPC/program_examples.md +++ b/mkdocs/docs/HPC/program_examples.md @@ -2,11 +2,16 @@ # Program examples { #ch:program-examples} If you have **not done so already** copy our examples to your home directory by running the following command: -
 cp -r {{ examplesdir }} ~/
-`~`(tilde) refers to your home directory, the directory you arrive by default when you login. +``` + cp -r {{ examplesdir }} ~/ +``` + +`~`(tilde) refers to your home directory, the directory you arrive by default when you login. Go to our examples: -
cd ~/{{exampledir}}
+``` +cd ~/{{exampledir}} +``` Here, we just have put together a number of examples for your convenience. We did an effort to put comments inside the source files, @@ -36,27 +41,26 @@ so the source code files are (should be) self-explanatory. The above 2 OMP directories contain the following examples: -| C Files | Fortran Files | Description | -|-------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------| -| omp_hello.c | omp_hello.f | Hello world | -| omp_workshare1.c | omp_workshare1.f | Loop work-sharing | -| omp_workshare2.c | omp_workshare2.f | Sections work-sharing | -| omp_reduction.c | omp_reduction.f | Combined parallel loop reduction | -| omp_orphan.c | omp_orphan.f | Orphaned parallel loop reduction | -| omp_mm.c | omp_mm.f | Matrix multiply | -| omp_getEnvInfo.c | omp_getEnvInfo.f | Get and print environment information | -| omp_bug1.c
omp_bug1fix.c
omp_bug2.c
omp_bug3.c
omp_bug4.c
omp_bug4fix
omp_bug5.c
omp_bug5fix.c
omp_bug6.c | omp_bug1.f
omp_bug1fix.f
omp_bug2.f
omp_bug3.f
omp_bug4.f
omp_bug4fix
omp_bug5.f
omp_bug5fix.f
omp_bug6.f
| Programs with bugs and their solution | +| C Files | Fortran Files | Description | +|------------------|------------------|---------------------------------------| +| omp_hello.c | omp_hello.f | Hello world | +| omp_workshare1.c | omp_workshare1.f | Loop work-sharing | +| omp_workshare2.c | omp_workshare2.f | Sections work-sharing | +| omp_reduction.c | omp_reduction.f | Combined parallel loop reduction | +| omp_orphan.c | omp_orphan.f | Orphaned parallel loop reduction | +| omp_mm.c | omp_mm.f | Matrix multiply | +| omp_getEnvInfo.c | omp_getEnvInfo.f | Get and print environment information | +| omp_bug* | omp_bug* | Programs with bugs and their solution | Compile by any of the following commands: - - - - - - - - - -
C:icc -openmp omp_hello.c -o hello\newline pgcc -mp omp_hello.c -o hello\newline gcc -fopenmp omp_hello.c -o hello
Fortran:ifort -openmp omp_hello.f -o hello\newline pgf90 -mp omp_hello.f -o hello\newline gfortran -fopenmp omp_hello.f -o hello
+ +| **Language** | **Commands** | +|--------------|----------------------------------------| +| **C:** | icc -openmp omp_hello.c -o hello | +| | pgcc -mp omp_hello.c -o hello | +| | gcc -fopenmp omp_hello.c -o hello | +| **Fortran:** | ifort -openmp omp_hello.f -o hello | +| | pgf90 -mp omp_hello.f -o hello | +| | gfortran -fopenmp omp_hello.f -o hello | Be invited to explore the examples. diff --git a/mkdocs/docs/HPC/quick_reference_guide.md b/mkdocs/docs/HPC/quick_reference_guide.md index 6141d038567..05de5dfeb77 100644 --- a/mkdocs/docs/HPC/quick_reference_guide.md +++ b/mkdocs/docs/HPC/quick_reference_guide.md @@ -3,282 +3,50 @@ Remember to substitute the usernames, login nodes, file names, ...for your own. - - - - - - - - - - - - - - - - - - - - - - - - -
-
Login
-
- Login - - ssh {{userid}}@{{loginnode}} -
- Where am I? - - hostname -
- Copy to {{hpc}} - - scp foo.txt {{userid}}@{{loginnode}}: -
- Copy from {{hpc}} - - scp {{userid}}@{{loginnode}}:foo.txt -
- Setup ftp session - - sftp {{userid}}@{{loginnode}} -
+| **Login** | | +|-------------------|-----------------------------------------| +| Login | `ssh {{userid}}@{{loginnode}}` | +| Where am I? | `hostname` | +| Copy to {{hpc}} | `scp foo.txt {{userid}}@{{loginnode}}:` | +| Copy from {{hpc}} | `scp {{userid}}@{{loginnode}}:foo.txt` | +| Setup ftp session | `sftp {{userid}}@{{loginnode}}` | - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
Modules
-
- List all available modules - - Module avail -
- List loaded modules - - module list -
- Load module - - module load example -
- Unload module - - module unload example -
- Unload all modules - - module purge -
- Help on use of module - - module help -
+| **Modules** | | +|----------------------------|-----------------------| +| List all available modules | Module avail | +| List loaded modules | module list | +| Load module | module load example | +| Unload module | module unload example | +| Unload all modules | module purge | +| Help on use of module | module help | - - - - - - - - - - - - -{% if site != (gent or brussel) %} - - - - - - - - -{% endif %} - - - - - - - - - - - - - - - - -{% if site != (gent or brussel) %} - - - - -{% endif %} - - - - -
-
Jobs
-
- Submit job with job script script.pbs - - qsub script.pbs -
- Status of job with ID 12345 - - qstat 12345 -
- Possible start time of job with ID 12345 (not available everywhere) - - showstart 12345 -
- Check job with ID 12345 (not available everywhere) - - checkjob 12345 -
- Show compute node of job with ID 12345 - - qstat -n 12345 -
- Delete job with ID 12345 - - qdel 12345 -
- Status of all your jobs - - qstat -
- Detailed status of your jobs + a list nodes they are running on - - qstat -na -
- Show all jobs on queue (not available everywhere) - - showq -
- Submit Interactive job - - qsub -I -
+| Command | Description | +|-----------------------------------------------|---------------------------------------------------------| +| `qsub script.pbs` | Submit job with job script `script.pbs` | +| `qstat 12345` | Status of job with ID 12345 | +{% if site != (gent or brussel) %} | `showstart 12345` | Possible start time of job with ID 12345 (not available everywhere) | +| `checkjob 12345` | Check job with ID 12345 (not available everywhere) | +{% endif %} | `qstat -n 12345` | Show compute node of job with ID 12345 | +| `qdel 12345` | Delete job with ID 12345 | +| `qstat` | Status of all your jobs | +| `qstat -na` | Detailed status of your jobs + a list of nodes they are running on | +{% if site != (gent or brussel) %} | `showq` | Show all jobs on queue (not available everywhere) | +{% endif %} | `qsub -I` | Submit Interactive job | - - - - -{% if site == gent %} - - - - -{% else %} - - - - - - - - -{% endif %} - - - - -
-
Disk quota
-
- Check your disk quota - - see https://account.vscentrum.be -
- Check your disk quota - - mmlsquota -
- Check your disk quota nice - - show_quota.py -
- Disk usage in current directory (.) - - du -h -
- - - - - - - - - - - - - - - - - - - - -
-
Worker Framework
-
- Load worker module - - module load worker/1.6.12-foss-2021b Don't forget to specify a version. To list available versions, use module avail worker/ -
- Submit parameter sweep - - wsub -batch weather.pbs -data data.csv -
- Submit job array - - wsub -t 1-100 -batch test_set.pbs -
- Submit job array with prolog and epilog - - wsub -prolog pre.sh -batch test_set.pbs -epilog post.sh -t 1-100 -
+| **Disk quota** | | +|-----------------------------------------------|-------------------------------------------------| +{% if site == gent %} | Check your disk quota | see [https://account.vscentrum.be](https://account.vscentrum.be) | +{% else %} | Check your disk quota | `mmlsquota` | +| Check your disk quota nice | `show_quota.py` | +{% endif %} | Disk usage in current directory (`.`) | `du -h` | + + + +| **Worker Framework** | | +|-----------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| +| Load worker module | `module load worker/1.6.12-foss-2021b` Don't forget to specify a version. To list available versions, use `module avail worker/` | +| Submit parameter sweep | `wsub -batch weather.pbs -data data.csv` | +| Submit job array | `wsub -t 1-100 -batch test_set.pbs` | +| Submit job array with prolog and epilog | `wsub -prolog pre.sh -batch test_set.pbs -epilog post.sh -t 1-100` | diff --git a/mkdocs/docs/HPC/running_batch_jobs.md b/mkdocs/docs/HPC/running_batch_jobs.md index 9eb61a2d09f..9c9eaf554bc 100644 --- a/mkdocs/docs/HPC/running_batch_jobs.md +++ b/mkdocs/docs/HPC/running_batch_jobs.md @@ -88,8 +88,9 @@ command, you can replace `module` with `ml`. A large number of software packages are installed on the {{ hpc }} clusters. A list of all currently available software can be obtained by typing: -
$ module available
-
+``` +module available +``` It's also possible to execute `module av` or `module avail`, these are shorter to type and will do the same thing. @@ -133,8 +134,9 @@ same toolchain name and version can work together without conflicts. To "activate" a software package, you load the corresponding module file using the `module load` command: -
$ module load example
-
+``` +module load example +``` This will load the most recent version of *example*. @@ -145,8 +147,9 @@ lexicographical last after the `/`). **However, you should specify a particular version to avoid surprises when newer versions are installed: -
$ module load secondexample/2.7-intel-2016b
-
+``` +module load secondexample/2.7-intel-2016b +``` The `ml` command is a shorthand for `module load`: `ml example/1.2.3` is equivalent to `module load example/1.2.3`. @@ -154,8 +157,9 @@ equivalent to `module load example/1.2.3`. Modules need not be loaded one by one; the two `module load` commands can be combined as follows: -
$ module load example/1.2.3 secondexample/2.7-intel-2016b
-
+``` +module load example/1.2.3 secondexample/2.7-intel-2016b +``` This will load the two modules as well as their dependencies (unless there are conflicts between both modules). @@ -166,14 +170,15 @@ Obviously, you need to be able to keep track of the modules that are currently loaded. Assuming you have run the `module load` commands stated above, you will get the following: -
$ module list
+```
+$ module list
 Currently Loaded Modulefiles: 
 1) example/1.2.3                                        6) imkl/11.3.3.210-iimpi-2016b 
 2) GCCcore/5.4.0                                        7) intel/2016b 
 3) icc/2016.3.210-GCC-5.4.0-2.26                        8) examplelib/1.2-intel-2016b 
 4) ifort/2016.3.210-GCC-5.4.0-2.26                      9) secondexample/2.7-intel-2016b 
 5) impi/5.1.3.181-iccifort-2016.3.210-GCC-5.4.0-2.26
-
+``` You can also just use the `ml` command without arguments to list loaded modules. @@ -193,15 +198,16 @@ However, the dependencies of the package are NOT automatically unloaded; you will have to unload the packages one by one. When the `secondexample` module is unloaded, only the following modules remain: -
$ module unload secondexample
-$ module list
+```
+$ module unload secondexample
+$ module list
 Currently Loaded Modulefiles: 
 Currently Loaded Modulefiles: 
 1) example/1.2.3                        5) impi/5.1.3.181-iccifort-2016.3.210-GCC-5.4.0-2.26 
 2) GCCcore/5.4.0                        6) imkl/11.3.3.210-iimpi-2016b 
 3) icc/2016.3.210-GCC-5.4.0-2.26        7) intel/2016b 
 4) ifort/2016.3.210-GCC-5.4.0-2.26      8) examplelib/1.2-intel-2016b
-
+``` To unload the `secondexample` module, you can also use `ml -secondexample`. @@ -217,8 +223,9 @@ loaded will *not* result in an error. In order to unload all modules at once, and hence be sure to start in a clean state, you can use: -
$ module purge
-
+``` +module purge +``` {% if site == gent -%} This is always safe: the `cluster` module (the module that specifies which cluster jobs will get submitted to) will not be unloaded (because @@ -244,13 +251,15 @@ Consider the following example: the user decides to use the `example` module and at that point in time, just a single version 1.2.3 is installed on the cluster. The user loads the module using: -
$ module load example
-
+``` +module load example +``` rather than -
$ module load example/1.2.3
-
+``` +module load example/1.2.3 +``` Everything works fine, up to the point where a new version of `example` is installed, 4.5.6. From then on, the user's `load` command will load @@ -259,28 +268,23 @@ unexpected problems. See for example [the following section on Module Conflicts] Consider the following `example` modules: -
$ module avail example/
+```
+$ module avail example/
 example/1.2.3 
 example/4.5.6
-
+``` Let's now generate a version conflict with the `example` module, and see what happens. -
$ module av example/
+```
+$ module av example/
 example/1.2.3       example/4.5.6
-$ module load example/1.2.3  example/4.5.6
+$ module load example/1.2.3  example/4.5.6
 Lmod has detected the following error: A different version of the 'example' module is already loaded (see output of 'ml').
-$ module swap example/4.5.6
-
- - +$ module swap example/4.5.6 +``` Note: A `module swap` command combines the appropriate `module unload` and `module load` commands. @@ -289,7 +293,8 @@ and `module load` commands. With the `module spider` command, you can search for modules: -
$ module spider example
+```
+$ module spider example
 --------------------------------------------------------------------------------
   example:
 --------------------------------------------------------------------------------
@@ -305,11 +310,12 @@ With the `module spider` command, you can search for modules:
 
     module spider example/1.2.3
 --------------------------------------------------------------------------------
-
+``` It's also possible to get detailed information about a specific module: -
$ module spider example/1.2.3
+```
+$ module spider example/1.2.3
 ------------------------------------------------------------------------------------------
   example: example/1.2.3
 ------------------------------------------------------------------------------------------
@@ -337,21 +343,23 @@ It's also possible to get detailed information about a specific module:
         More information 
         ================ 
          - Homepage: https://example.com
-
+``` ### Get detailed info To get a list of all possible commands, type: -
$ module help
-
+``` +module help +``` Or to get more information about one specific module package: -
$ module help example/1.2.3
+```
+$ module help example/1.2.3
 ----------- Module Specific Help for 'example/1.2.3' --------------------------- 
   This is just an example - Homepage: https://example.com/
-
+``` ### Save and load collections of modules @@ -364,52 +372,59 @@ In each `module` command shown below, you can replace `module` with First, load all modules you want to include in the collections: -
$ module load example/1.2.3 secondexample/2.7-intel-2016b
-
+``` +module load example/1.2.3 secondexample/2.7-intel-2016b +``` Now store it in a collection using `module save`. In this example, the collection is named `my-collection`. -
$ module save my-collection
-
+``` +module save my-collection +``` Later, for example in a jobscript or a new session, you can load all these modules with `module restore`: -
$ module restore my-collection
-
+``` +module restore my-collection +``` You can get a list of all your saved collections with the `module savelist` command: -
$ module savelistr
+```
+$ module savelist
 Named collection list (For LMOD_SYSTEM_NAME = "CO7-sandybridge"):
   1) my-collection
-
+``` To get a list of all modules a collection will load, you can use the `module describe` command: -
$ module describe my-collection
+```
+$ module describe my-collection
 1) example/1.2.3                                        6) imkl/11.3.3.210-iimpi-2016b 
 2) GCCcore/5.4.0                                        7) intel/2016b 
 3) icc/2016.3.210-GCC-5.4.0-2.26                        8) examplelib/1.2-intel-2016b 
 4) ifort/2016.3.210-GCC-5.4.0-2.26                      9) secondexample/2.7-intel-2016b 
 5) impi/5.1.3.181-iccifort-2016.3.210-GCC-5.4.0-2.26
-
+``` To remove a collection, remove the corresponding file in `$HOME/.lmod.d`: -
$ rm $HOME/.lmod.d/my-collection
-
+``` +rm $HOME/.lmod.d/my-collection +``` ### Getting module details To see how a module would change the environment, you can use the `module show` command: -
$ module show Python/2.7.12-intel-2016b
+```
+$ module show Python/2.7.12-intel-2016b
 whatis("Description: Python is a programming language that lets youwork more quickly and integrate your systems more effectively. - Homepage: http://python.org/ ") 
 conflict("Python")
 load("intel/2016b") 
@@ -417,7 +432,7 @@ load("bzip2/1.0.6-intel-2016b")
 ...
 prepend_path(...)
 setenv("EBEXTSLISTPYTHON","setuptools-23.1.0,pip-8.1.2,nose-1.3.7,numpy-1.11.1,scipy-0.17.1,ytz-2016.4", ...)
-
+``` It's also possible to use the `ml show` command instead: they are equivalent. @@ -428,20 +443,6 @@ bunch of extensions: `numpy`, `scipy`, ... You can also see the modules the `Python/2.7.12-intel-2016b` module loads: `intel/2016b`, `bzip2/1.0.6-intel-2016b`, ... - - - If you're not sure what all of this means: don't worry, you don't have to know; just load the module and try to use the software. ## Getting system information about the HPC infrastructure @@ -455,7 +456,8 @@ information about scheduled downtime, status of the system, ... To check how much jobs are running in what queues, you can use the `qstat -q` command: -
$ qstat -q
+```
+$ qstat -q
 Queue            Memory CPU Time Walltime Node  Run Que Lm  State
 ---------------- ------ -------- -------- ----  --- --- --  -----
 default            --      --       --      --    0   0 --   E R
@@ -466,7 +468,7 @@ q1h                --      --    01:00:00   --    0   1 --   E R
 q24h               --      --    24:00:00   --    0   0 --   E R
                                                ----- -----
                                                 337  82
-
+``` Here, there are 316 jobs running on the `long` queue, and 77 jobs queued. We can also see that the `long` queue allows a maximum wall time @@ -482,8 +484,9 @@ filled with jobs, completely filled with jobs, .... You can also get this information in text form (per cluster separately) with the `pbsmon` command: -
$ module swap cluster/donphan
-$ pbsmon
+```
+$ module swap cluster/donphan
+$ pbsmon
  4001 4002 4003 4004 4005 4006 4007
     _    j    j    j    _    _    .
 
@@ -501,7 +504,7 @@ with the `pbsmon` command:
 
 Node type:
  ppn=36, mem=751GB
-
+``` `pbsmon` only outputs details of the cluster corresponding to the currently loaded `cluster` module see [the section on Specifying the cluster on which to run](./#specifying-the-cluster-on-which-to-run). @@ -526,14 +529,16 @@ to your home directory, so that you have your **own personal** copy (editable an over-writable) and that you can start using the examples. If you haven't done so already, run these commands now: -
$ cd
-$ cp -r {{ examplesdir }} ~/
-
+``` +cd +cp -r {{ examplesdir }} ~/ +``` First go to the directory with the first examples by entering the command: -
$ cd ~/examples/Running-batch-jobs
-
+``` +cd ~/examples/Running-batch-jobs +``` Each time you want to execute a program on the {{ hpc }} you'll need 2 things: @@ -564,11 +569,12 @@ provided for you in the examples subdirectories. List and check the contents with: -
$ ls -l
+```
+$ ls -l
 total 512
 -rw-r--r-- 1 {{ userid }} 193 Sep 11 10:34 fibo.pbs
 -rw-r--r-- 1 {{ userid }} 609 Sep 11 10:25 fibo.pl
-
+``` In this directory you find a Perl script (named "fibo.pl") and a job script (named "fibo.pbs"). @@ -584,7 +590,8 @@ login-node), so that you can see what the program does. On the command line, you would run this using: -
$ ./fibo.pl
+```
+$ ./fibo.pl
 [0] -> 0
 [1] -> 1
 [2] -> 1
@@ -615,9 +622,9 @@ On the command line, you would run this using:
 [27] -> 196418
 [28] -> 317811
 [29] -> 514229
-
+``` -Remark: Recall that you have now executed the Perl script locally on one of +Remark: Recall that you have now executed the Perl script locally on one of the login-nodes of the {{ hpc }} cluster. Of course, this is not our final intention; we want to run the script on any of the compute nodes. Also, it is not considered as good practice, if you "abuse" the login-nodes @@ -630,9 +637,7 @@ since these jobs require very little computing power. The job script contains a description of the job by specifying the command that need to be executed on the compute node: -
-- fibo.pbs --
- -```bash +```bash title="fibo.pbs" {% include "./examples/Running_batch_jobs/fibo.pbs" %} ``` @@ -644,15 +649,16 @@ specified on the command line. This job script can now be submitted to the cluster's job system for execution, using the qsub (Queue SUBmit) command: -
$ qsub fibo.pbs
+```
+$ qsub fibo.pbs
 {{ jobid }}
-
+``` The qsub command returns a job identifier on the HPC cluster. The important part is the number (e.g., "{{ jobid }} "); this is a unique identifier for the job and can be used to monitor and manage your job. -Remark: the modules that were loaded when you submitted the job will *not* be +Remark: the modules that were loaded when you submitted the job will *not* be loaded when the job is started. You should always specify the `module load` statements that are required for your job in the job script itself. @@ -669,19 +675,21 @@ monitor jobs in the queue. After your job was started, and ended, check the contents of the directory: -
$ ls -l
+```
+$ ls -l
 total 768
 -rw-r--r-- 1 {{ userid }} {{ userid }}   44 Feb 28 13:33 fibo.pbs
 -rw------- 1 {{ userid }} {{ userid }}    0 Feb 28 13:33 fibo.pbs.e{{ jobid }}
 -rw------- 1 {{ userid }} {{ userid }} 1010 Feb 28 13:33 fibo.pbs.o{{ jobid }}
 -rwxrwxr-x 1 {{ userid }} {{ userid }}  302 Feb 28 13:32 fibo.pl
-
+``` Explore the contents of the 2 new files: -
$ more fibo.pbs.o{{ jobid }}
-$ more fibo.pbs.e{{ jobid }}
-
+``` +$ more fibo.pbs.o{{ jobid }} +$ more fibo.pbs.e{{ jobid }} +``` These files are used to store the standard output and error that would otherwise be shown in the terminal window. By default, they have the @@ -766,8 +774,9 @@ the environment so you get access to all modules installed on the `{{ otherclust cluster, and to be able to submit jobs to the `{{ othercluster }}` scheduler so your jobs will start on `{{ othercluster }}` instead of the default `{{ defaultcluster }}` cluster. -
$ module swap cluster/{{ othercluster }}
-
+``` +module swap cluster/{{ othercluster }} +``` Note: the `{{ othercluster }}` modules may not work directly on the login nodes, because the login nodes do not have the same architecture as the `{{ othercluster }}` cluster, they have @@ -778,7 +787,8 @@ this. To list the available cluster modules, you can use the `module avail cluster/` command: -
$ module avail cluster/
+```
+$ module avail cluster/
 --------------------------------------- /etc/modulefiles/vsc ----------------------------------------
    cluster/accelgor (S)    cluster/doduo   (S,L)    cluster/gallade (S)    cluster/skitty  (S)
    cluster/default         cluster/donphan (S)      cluster/joltik  (S)
@@ -789,8 +799,8 @@ To list the available cluster modules, you can use the
    D:  Default Module
 
 If you need software that is not listed, 
-request it via https://www.ugent.be/hpc/en/support/software-installation-request
-
+request it via https://www.ugent.be/hpc/en/support/software-installation-request +``` As indicated in the output above, each `cluster` module is a so-called sticky module, i.e., it will not be unloaded when `module purge` (see [the section on purging modules](./#purging-all-modules)) @@ -841,8 +851,9 @@ Using the job ID that `qsub` returned, there are various ways to monitor the status of your job. In the following commands, replace `12345` with the job ID `qsub` returned. -
$ qstat 12345
-
+``` +qstat 12345 +``` {% if site != (gent or brussel) %} To show an estimated start time for your job (note that this may be very @@ -867,25 +878,28 @@ error messages that may prevent your job from starting: To show on which compute nodes your job is running, at least, when it is running: -
$ qstat -n 12345
-
+``` +qstat -n 12345 +``` To remove a job from the queue so that it will not run, or to stop a job that is already running. -
$ qdel 12345
-
+``` +qdel 12345 +``` When you have submitted several jobs (or you just forgot about the job ID), you can retrieve the status of all your jobs that are submitted and are not yet finished using: -
$ qstat
+```
+$ qstat
 :
 Job ID      Name    User      Time Use S Queue
 ----------- ------- --------- -------- - -----
 {{ jobid }} ....     mpi  {{ userid }}     0    Q short
-
+``` Here: @@ -1068,8 +1082,9 @@ properly. The **qsub** command takes several options to specify the requirements, of which we list the most commonly used ones below. -
$ qsub -l walltime=2:30:00
-
+``` +qsub -l walltime=2:30:00 ... +``` For the simplest cases, only the amount of maximum estimated execution time (called "walltime") is really important. Here, the job requests 2 @@ -1088,8 +1103,9 @@ before the walltime kills your main process, you have to kill the main command yourself before the walltime runs out and then copy the file back. See [the section on Running a command with a maximum time limit](../jobscript_examples/#running-a-command-with-a-maximum-time-limit) for how to do this. -
$ qsub -l mem=4gb
-
+``` +qsub -l mem=4gb ... +``` The job requests 4 GB of RAM memory. As soon as the job tries to use more memory, it will be "killed" (terminated) by the job scheduler. @@ -1106,15 +1122,17 @@ per node" and "number of cores in a node" please consult . {% endif %} -
$ qsub -l nodes=5:ppn=2
-
+``` +qsub -l nodes=5:ppn=2 ... +``` The job requests 5 compute nodes with two cores on each node (ppn stands for "processors per node", where "processors" here actually means "CPU cores"). -
$ qsub -l nodes=1:westmere
-
+``` +qsub -l nodes=1:westmere +``` The job requests just one node, but it should have an Intel Westmere processor. A list with site-specific properties can be found in the next @@ -1123,8 +1141,9 @@ website. These options can either be specified on the command line, e.g. -
$ qsub -l nodes=1:ppn,mem=2gb fibo.pbs
-
+``` +qsub -l nodes=1:ppn,mem=2gb fibo.pbs +``` or in the job script itself using the #PBS-directive, so "fibo.pbs" could be modified to: @@ -1193,13 +1212,14 @@ located by default in the directory where you issued the *qsub* command. When you navigate to that directory and list its contents, you should see them: -
$ ls -l
+```
+$ ls -l
 total 1024
 -rw-r--r-- 1 {{ userid }}  609 Sep 11 10:54 fibo.pl
 -rw-r--r-- 1 {{ userid }}   68 Sep 11 10:53 fibo.pbs
 -rw------- 1 {{ userid }}   52 Sep 11 11:03 fibo.pbs.e{{ jobid }}
 -rw------- 1 {{ userid }} 1307 Sep 11 11:03 fibo.pbs.o{{ jobid }}
-
+``` In our case, our job has created both output ('fibo.pbs.') and error files ('fibo.pbs.') containing info written to *stdout* and *stderr* @@ -1207,11 +1227,12 @@ respectively. Inspect the generated output and error files: -
$ cat fibo.pbs.o{{ jobid }}
+```
+$ cat fibo.pbs.o{{ jobid }}
 ...
-$ cat fibo.pbs.e{{ jobid }}
+$ cat fibo.pbs.e{{ jobid }}
 ...
-
+``` ## E-mail notifications {% if site != gent %} @@ -1259,15 +1280,17 @@ or These options can also be specified on the command line. Try it and see what happens: -
$ qsub -m abe fibo.pbs
-
+``` +qsub -m abe fibo.pbs +``` The system will use the e-mail address that is connected to your VSC account. You can also specify an alternate e-mail address with the `-M` option: -
$ qsub -m b -M john.smith@example.com fibo.pbs
-
+``` +qsub -m b -M john.smith@example.com fibo.pbs +``` will send an e-mail to john.smith@example.com when the job begins. @@ -1279,9 +1302,10 @@ might be a problem as they might both be run at the same time. So the following example might go wrong: -
$ qsub job1.sh
-$ qsub job2.sh
-
+``` +$ qsub job1.sh +$ qsub job2.sh +``` You can make jobs that depend on other jobs. This can be useful for breaking up large jobs into smaller jobs that can be run in a pipeline. @@ -1289,9 +1313,10 @@ The following example will submit 2 jobs, but the second job (`job2.sh`) will be held (`H` status in `qstat`) until the first job successfully completes. If the first job fails, the second will be cancelled. -
$ FIRST_ID=$ (qsub job1.sh)
-$ qsub -W depend=afterok:$FIRST_ID job2.sh
-
+``` +$ FIRST_ID=$(qsub job1.sh) +$ qsub -W depend=afterok:$FIRST_ID job2.sh +``` `afterok` means "After OK", or in other words, after the first job successfully completed. diff --git a/mkdocs/docs/HPC/running_interactive_jobs.md b/mkdocs/docs/HPC/running_interactive_jobs.md index f33d546de70..8b97fa70d3b 100644 --- a/mkdocs/docs/HPC/running_interactive_jobs.md +++ b/mkdocs/docs/HPC/running_interactive_jobs.md @@ -21,8 +21,9 @@ the computing resources. The syntax for *qsub* for submitting an interactive PBS job is: -
$ qsub -I <... pbs directives ...>
-
+``` +$ qsub -I <... pbs directives ...> +``` ## Interactive jobs, without X support @@ -31,18 +32,20 @@ The syntax for *qsub* for submitting an interactive PBS job is: First of all, in order to know on which computer you're working, enter: -
$ hostname -f
+```
+$ hostname -f
 {{ loginhost }}
-
+``` This means that you're now working on the login node ` {{ loginhost }} ` of the cluster. The most basic way to start an interactive job is the following: -
$ qsub -I
+```
+$ qsub -I
 qsub: waiting for job {{ jobid }} to start
 qsub: job {{ jobid }} ready
-
+``` There are two things of note here. @@ -57,9 +60,10 @@ There are two things of note here. In order to know on which compute-node you're working, enter again: -
$ hostname -f
+```
+$ hostname -f
 {{ computenode }}
-
+``` Note that we are now working on the compute-node called "*{{ computenode }}*". This is the compute node, which was assigned to us by the scheduler after issuing @@ -87,10 +91,11 @@ Now, go to the directory of our second interactive example and run the program "primes.py". This program will ask you for an upper limit ($> 1$) and will print all the primes between 1 and your upper limit: -
$ cd ~/{{ exampledir }}
-$ ./primes.py
+```
+$ cd ~/{{ exampledir }}
+$ ./primes.py
 This program calculates all primes between 1 and your upper limit.
-Enter your upper limit (>1): 50
+Enter your upper limit (>1): 50
 Start Time:  2013-09-11 15:49:06
 [Prime#1] = 1
 [Prime#2] = 2
@@ -110,12 +115,13 @@ Start Time:  2013-09-11 15:49:06
 [Prime#16] = 47
 End Time:  2013-09-11 15:49:06
 Duration:  0 seconds.
-
+``` You can exit the interactive session with: -
$ exit
-
+``` +$ exit +``` Note that you can now use this allocated node for 1 hour. After this hour you will be automatically disconnected. You can change this "usage @@ -125,8 +131,9 @@ watching the clock on the wall.) You can work for 3 hours by: -
$ qsub -I -l walltime=03:00:00
-
+``` +qsub -I -l walltime=03:00:00 +``` If the walltime of the job is exceeded, the (interactive) job will be killed and your connection to the compute node will be closed. So do @@ -160,9 +167,7 @@ Download the latest version of the XQuartz package on: and install the XQuartz.pkg package. -
![image](img/img0512.png) -
The installer will take you through the installation procedure, just continue clicking ++"Continue"++ on the various screens that will pop-up until your @@ -171,9 +176,7 @@ installation was successful. A reboot is required before XQuartz will correctly open graphical applications. -
![image](img/img0513.png) -
{% endif %} {% if OS == windows %} ##### Install Xming @@ -191,9 +194,7 @@ The first task is to install the Xming software. 4. When selecting the components that need to be installed, make sure to select "*XLaunch wizard*" and "*Normal PuTTY Link SSH client*". -
![image](img/img0500.png) -
5. We suggest to create a Desktop icon for Xming and XLaunch. @@ -206,28 +207,20 @@ And now we can run Xming: 2. Select ++"Multiple Windows"++. This will open each application in a separate window. -
![image](img/img0501.png) -
3. Select ++"Start no client"++ to make XLaunch wait for other programs (such as PuTTY). -
![image](img/img0502.png) -
4. Select ++"Clipboard"++ to share the clipboard. -
![image](img/img0503.png) -
5. Finally ++"Save configuration"++ into a file. You can keep the default filename and save it in your Xming installation directory. -
![image](img/img0504.png) -
6. Now Xming is running in the background ... and you can launch a graphical application in your PuTTY terminal. @@ -237,27 +230,27 @@ And now we can run Xming: 8. In order to test the X-server, run "*xclock*". "*xclock*" is the standard GUI clock for the X Window System. -
$ xclock
-
+``` +xclock +``` You should see the XWindow clock application appearing on your Windows machine. The "*xclock*" application runs on the login-node of the {{ hpc }}, but is displayed on your Windows machine. -
![image](img/img0505.png) -
You can close your clock and connect further to a compute node with again your X-forwarding enabled: -
$ qsub -I -X
+```
+$ qsub -I -X
 qsub: waiting for job {{ jobid }} to start
 qsub: job {{ jobid }} ready
-$ hostname -f
+$ hostname -f
 {{ computenode }}
-$ xclock
-
+$ xclock +``` and you should see your clock again. @@ -309,9 +302,7 @@ the cluster 2. In the "*Category*" pane, expand ++"Connection>SSh"++, and select as show below: -
![image](img/img0506.png) -
3. In the ++"Source port"++ field, enter the local port to use (e.g., *5555*). @@ -334,41 +325,40 @@ running on a compute node on the {{ hpc }}) transferred to your personal screen, you will need to reconnect to the {{ hpc }} with X-forwarding enabled, which is done with the "-X" option. -
![image](img/ch5-interactive-mode.png) -
First exit and reconnect to the {{ hpc }} with X-forwarding enabled: -
$ exit
-$ ssh -X {{ userid }}@{{ loginnode }}
-$ hostname -f
+```
+$ exit
+$ ssh -X {{ userid }}@{{ loginnode }}
+$ hostname -f
 {{ loginhost }}
-
+``` We first check whether our GUIs on the login node are decently forwarded to your screen on your local machine. An easy way to test it is by running a small X-application on the login node. Type: -
$ xclock
-
+``` +$ xclock +``` And you should see a clock appearing on your screen. -
![image](img/img0507.png) -
You can close your clock and connect further to a compute node with again your X-forwarding enabled: -
$ qsub -I -X
+```
+$ qsub -I -X
 qsub: waiting for job {{ jobid }} to start
 qsub: job {{ jobid }} ready
-$ hostname -f
+$ hostname -f
 {{ computenode }}
-$ xclock
-
+$ xclock +``` and you should see your clock again. {% endif %} @@ -380,15 +370,14 @@ screen, but also asks you to click a button. Now run the message program: -
$ cd ~/{{ exampledir }}
-./message.py
-
+``` +cd ~/{{ exampledir }} +./message.py +``` You should see the following message appearing. -
![image](img/img0508.png) -
Click any button and see what happens. diff --git a/mkdocs/docs/HPC/running_jobs_with_input_output_data.md b/mkdocs/docs/HPC/running_jobs_with_input_output_data.md index c8393da45de..af9bb1bfecd 100644 --- a/mkdocs/docs/HPC/running_jobs_with_input_output_data.md +++ b/mkdocs/docs/HPC/running_jobs_with_input_output_data.md @@ -13,18 +13,22 @@ and where that you can collect your results. First go to the directory: -
$ cd ~/{{ exampledir }}
-
+``` +cd ~/{{ exampledir }} +``` !!! note If the example directory is not yet present, copy it to your home directory: -
$ cp -r {{ examplesdir }} ~/
+ ``` +cp -r {{ examplesdir }} ~/ + ``` List and check the contents with: -
ls -l
+```
+$ ls -l
 total 2304
 -rwxrwxr-x 1 {{ userid }}   682 Sep 13 11:34 file1.py
 -rw-rw-r-- 1 {{ userid }}   212 Sep 13 11:54 file1a.pbs
@@ -34,13 +38,12 @@ total 2304
 -rwxrwxr-x 1 {{ userid }}  2393 Sep 13 10:40 file2.py
 -rw-r--r-- 1 {{ userid }}  1393 Sep 13 10:41 file3.pbs
 -rwxrwxr-x 1 {{ userid }}  2393 Sep 13 10:40 file3.py
-
+``` Now, let us inspect the contents of the first executable (which is just a Python script with execute permission). -
-- file1.py --
-```python +```python title="file1.py" {% include "./examples/Running_jobs_with_input_output_data/file1.py" %} ``` @@ -55,8 +58,7 @@ The code of the Python script, is self explanatory: Check the contents of the first job script: -
-- file1a.pbs --
-```bash +```bash title="file1a.pbs" {% include "./examples/Running_jobs_with_input_output_data/file1a.pbs" %} ``` @@ -66,13 +68,15 @@ paths. Submit it: -
$ qsub file1a.pbs
-
+``` +qsub file1a.pbs +``` After the job has finished, inspect the local directory again, i.e., the directory where you executed the *qsub* command: -
ls -l
+```
+$ ls -l
 total 3072
 -rw-rw-r-- 1 {{ userid }}   90 Sep 13 13:13 Hello.txt
 -rwxrwxr-x 1 {{ userid }}  693 Sep 13 13:03 file1.py*
@@ -85,7 +89,7 @@ total 3072
 -rwxrwxr-x 1 {{ userid }} 2393 Sep 13 10:40 file2.py*
 -rw-r--r-- 1 {{ userid }} 1393 Sep 13 10:41 file3.pbs
 -rwxrwxr-x 1 {{ userid }} 2393 Sep 13 10:40 file3.py*
-
+``` Some observations: @@ -99,11 +103,12 @@ Some observations: Inspect their contents ... and remove the files -
$ cat Hello.txt
-$ cat file1a.pbs.o{{ jobid }}
-$ cat file1a.pbs.e{{ jobid }}
-$ rm Hello.txt file1a.pbs.o{{ jobid }} file1a.pbs.e{{ jobid }}
-
+``` +$ cat Hello.txt +$ cat file1a.pbs.o{{ jobid }} +$ cat file1a.pbs.e{{ jobid }} +$ rm Hello.txt file1a.pbs.o{{ jobid }} file1a.pbs.e{{ jobid }} +``` !!! tip Type `cat H` and press the Tab button (looks like ++tab++), and it will **expand** into @@ -113,18 +118,18 @@ Inspect their contents ... and remove the files Check the contents of the job script and execute it. -
-- file1b.pbs --
-```bash +```bash title="file1b.pbs" {% include "./examples/Running_jobs_with_input_output_data/file1b.pbs" %} ``` Inspect the contents again ... and remove the generated files: -
$ ls
+```
+$ ls
 Hello.txt file1a.pbs file1c.pbs file2.pbs file3.pbs my_serial_job.e{{ jobid }}
 file1.py* file1b.pbs file2.py* file3.py* my_serial_job.o{{ jobid }}
-$ rm Hello.txt my_serial_job.*
-
+$ rm Hello.txt my_serial_job.* +``` Here, the option "`-N`" was used to explicitly assign a name to the job. This overwrote the JOBNAME variable, and resulted in a different name @@ -137,8 +142,7 @@ defaults to the name of the job script. You can also specify the name of *stdout* and *stderr* files explicitly by adding two lines in the job script, as in our third example: -
-- file1c.pbs --
-```bash +```bash title="file1c.pbs" {% include "./examples/Running_jobs_with_input_output_data/file1c.pbs" %} ``` @@ -156,98 +160,21 @@ store your data depends on the purpose, but also the size and type of usage of the data. The following locations are available: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -{% if site == gent %} - - - - - - - - + +| **Variable** | **Description** | +|-------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| | *Long-term storage slow filesystem, intended for smaller files* | +| `$VSC_HOME` | For your configuration files and other small files, see [the section on your home directory.](./#your-home-directory-vsc_home) The default directory is `user/{{ site }}/xxx/{{ userid }}`. The same file system is accessible from all sites, i.e., you'll see the same contents in $VSC_HOME on all sites. | +| `$VSC_DATA` | A bigger "workspace", for **datasets**, results, logfiles, etc. see [the section on your data directory.](./#your-data-directory-vsc_data) The default directory is `data/{{ site }}/xxx/{{ userid }}`. The same file system is accessible from all sites. | +| | *Fast temporary storage* | +| `$VSC_SCRATCH_NODE` | For **temporary** or transient data on the local compute node, where fast access is important; see [the section on your scratch space.](./#your-scratch-space-vsc_scratch) This space is available per node. The default directory is `/tmp`. On different nodes, you'll see different content. | +| `$VSC_SCRATCH` | For **temporary** or transient data that has to be accessible from all nodes of a cluster (including the login nodes). The default directory is `scratch/{{ site }}/xxx/{{ userid }}`. This directory is cluster- or site-specific: On different sites, and sometimes on different clusters on the same site, you'll get a different directory with different content. | +| `$VSC_SCRATCH_SITE` | Currently the same as $VSC_SCRATCH, but could be used for a scratch space shared across all clusters at a site in the future. See [the section on your scratch space.](./#your-scratch-space-vsc_scratch) | +| `$VSC_SCRATCH_GLOBAL` | Currently the same as $VSC_SCRATCH, but could be used for a scratch space shared across all clusters of the VSC in the future. See [the section on your scratch space.](./#your-scratch-space-vsc_scratch) | + {% if site == gent %} | `$VSC_SCRATCH_CLUSTER` | The scratch filesystem closest to the cluster. | +| `$VSC_SCRATCH_ARCANINE` | A separate (smaller) shared scratch filesystem, powered by SSDs. This scratch filesystem is intended for very I/O-intensive workloads. | {% endif %} -
- Variable - - Description -
-
Long-term storage slow filesystem, intended for smaller files
-
- $VSC_HOME - - For your configuration files and other small files, see the section on your home directory. - The default directory is user/{{ site }}/xxx/{{ userid }}. - The same file system is accessible from all sites, i.e., you'll see the same contents in $VSC_HOME on all sites. -
- $VSC_DATA - - A bigger "workspace", for datasets, results, logfiles, etc. see the section on your data directory. - The default directory is data/{{ site }}/xxx/{{ userid }}. - The same file system is accessible from all sites. -
-
Fast temporary storage
-
- $VSC_SCRATCH_NODE - - For temporary or transient data on the local compute node, where fast access is important; see the section on your scratch space. - This space is available per node. The default directory is /tmp. On different nodes, you'll see different content. -
- $VSC_SCRATCH - - For temporary or transient data that has to be accessible from all nodes of a cluster (including the login nodes)
- The default directory is scratch/{{ site }}/xxx/{{ userid }}. This directory is cluster- or site-specific: On different sites, and sometimes on different clusters on the same site, you'll get a different directory with different content. -
- $VSC_SCRATCH_SITE - - Currently the same as $VSC_SCRATCH, but could be used for a scratch space shared accross all clusters at a site in the future. See the section on your scratch space. -
- $VSC_SCRATCH_GLOBAL - - Currently the same as $VSC_SCRATCH, but could be used for a scratch space shared accross all clusters of the VSC in the future. See the section on your scratch space. -
- $VSC_SCRATCH_CLUSTER - - The scratch filesystem closest to the cluster. -
- $VSC_SCRATCH_ARCANINE - - A separate (smaller) shared scratch filesystem, powered by SSDs. This scratch filesystem is intended for very I/O-intensive workloads. -
+ Since these directories are not necessarily mounted on the same locations over all sites, you should always (try to) use the environment @@ -379,15 +306,17 @@ access your UGent home drive and shares. To allow this you need a ticket. This requires that you first authenticate yourself with your UGent username and password by running: -
$ kinit yourugentusername@UGENT.BE
+```
+$ kinit yourugentusername@UGENT.BE
 Password for yourugentusername@UGENT.BE:
-
+``` Now you should be able to access your files running -
$ ls /UGent/yourugentusername
+```
+$ ls /UGent/yourugentusername
 home shares www
-
+``` Please note the shares will only be mounted when you access this folder. You should specify your complete username - tab completion will not @@ -396,48 +325,54 @@ work. If you want to use the UGent shares longer than 24 hours, you should ask a ticket for up to a week by running -
$ kinit yourugentusername@UGENT.BE -r 7d
-
+``` +kinit yourugentusername@UGENT.BE -r 7 +``` You can verify your authentication ticket and expiry dates yourself by running klist -
$ klist
+```
+$ klist
 ...
 Valid starting     Expires            Service principal
 14/07/20 15:19:13  15/07/20 01:19:13  krbtgt/UGENT.BE@UGENT.BE
 	renew until 21/07/20 15:19:13
 
-
+``` Your ticket is valid for 10 hours, but you can renew it before it expires. To renew your tickets, simply run -
$ kinit -R
-
+``` +kinit -R +``` If you want your ticket to be renewed automatically up to the maximum expiry date, you can run -
$ krenew -b -K 60
-
+``` +krenew -b -K 60 +``` Each hour the process will check if your ticket should be renewed. We strongly advise to disable access to your shares once it is no longer needed: -
$ kdestroy
-
+``` +kdestroy +``` If you get an error "*Unknown credential cache type while getting default ccache*" (or similar) and you use conda, then please deactivate conda before you use the commands in this chapter. -
$ conda deactivate
-
+``` +conda deactivate +``` ### UGent shares with globus @@ -447,7 +382,8 @@ endpoint. To do that, you have to ssh to the globus endpoint from a loginnode. You will be prompted for your UGent username and password to authenticate: -
$ ssh globus
+```
+$ ssh globus
 UGent username:ugentusername
 Password for ugentusername@UGENT.BE:
 Shares are available in globus endpoint at /UGent/ugentusername/
@@ -460,16 +396,17 @@ Valid starting     Expires            Service principal
 	renew until 05/08/20 15:56:40
 Tickets will be automatically renewed for 1 week
 Connection to globus01 closed.
-
+``` Your shares will then be available at /UGent/ugentusername/ under the globus VSC tier2 endpoint. Tickets will be renewed automatically for 1 week, after which you'll need to run this again. We advise to disable access to your shares within globus once access is no longer needed: -
$ ssh globus01 destroy
+```
+$ ssh globus01 destroy
 Succesfully destroyed session
-
+``` {% endif %} ### Pre-defined quotas @@ -568,15 +505,16 @@ Check the Python and the PBS file, and submit the job: Remember that this is already a more serious (disk-I/O and computational intensive) job, which takes approximately 3 minutes on the {{ hpc }}. -
$ cat file2.py
-$ cat file2.pbs
-$ qsub file2.pbs
-$ qstat
-$ ls -l
-$ echo $VSC_SCRATCH
-$ ls -l $VSC_SCRATCH
-$ more $VSC_SCRATCH/primes_1.txt
-
+``` +$ cat file2.py +$ cat file2.pbs +$ qsub file2.pbs +$ qstat +$ ls -l +$ echo $VSC_SCRATCH +$ ls -l $VSC_SCRATCH +$ more $VSC_SCRATCH/primes_1.txt +``` ## Reading Input files @@ -601,13 +539,14 @@ In this exercise, you will Check the Python and the PBS file, and submit the job: -
$ cat file3.py
-$ cat file3.pbs
-$ qsub file3.pbs
-$ qstat
-$ ls -l
-$ more $VSC_SCRATCH/primes_2.txt
-
+``` +$ cat file3.py +$ cat file3.pbs +$ qsub file3.pbs +$ qstat +$ ls -l +$ more $VSC_SCRATCH/primes_2.txt +``` ## How much disk space do I get? ### Quota @@ -694,23 +633,25 @@ into the login nodes of that VSC site). {% else %} The "`show_quota`" command has been developed to show you the status of your quota in a readable format: -
$ show_quota
+```
+$ show_quota
 VSC_DATA:    used 81MB (0%)  quota 25600MB
 VSC_HOME:    used 33MB (1%)  quota 3072MB
 VSC_SCRATCH:   used 28MB (0%)  quota 25600MB
 VSC_SCRATCH_GLOBAL: used 28MB (0%)  quota 25600MB
 VSC_SCRATCH_SITE:   used 28MB (0%)  quota 25600MB
-
+``` or on the UAntwerp clusters -
$ module load scripts
-$ show_quota
+```
+$ module load scripts
+$ show_quota
 VSC_DATA:    used 81MB (0%)  quota 25600MB
 VSC_HOME:    used 33MB (1%)  quota 3072MB
 VSC_SCRATCH:   used 28MB (0%)  quota 25600MB
 VSC_SCRATCH_GLOBAL: used 28MB (0%)  quota 25600MB
 VSC_SCRATCH_SITE:   used 28MB (0%)  quota 25600MB
-
+``` With this command, you can follow up the consumption of your total disk quota easily, as it is expressed in percentages. Depending of on which @@ -725,14 +666,15 @@ directories are responsible for the consumption of your disk space. You can check the size of all subdirectories in the current directory with the "`du`" (**Disk Usage**) command: -
$ du
+```
+$ du
 256 ./ex01-matlab/log
 1536 ./ex01-matlab
 768 ./ex04-python
 512 ./ex02-python
 768 ./ex03-python
 5632
-
+``` This shows you first the aggregated size of all subdirectories, and finally the total size of the current directory "." (this includes files @@ -741,28 +683,31 @@ stored in the current directory). If you also want this size to be "human-readable" (and not always the total number of kilobytes), you add the parameter "-h": -
$ du -h
+```
+$ du -h
 256K ./ex01-matlab/log
 1.5M ./ex01-matlab
 768K ./ex04-python
 512K ./ex02-python
 768K ./ex03-python
 5.5M .
-
+``` If the number of lower level subdirectories starts to grow too big, you may not want to see the information at that depth; you could just ask for a summary of the current directory: -
$ du -s
+```
+$ du -s
 5632 .
-$ du -s -h
-
+$ du -s -h +``` If you want to see the size of any file or top-level subdirectory in the current directory, you could use the following command: -
$ du -h --max-depth 1
+```
+$ du -h --max-depth 1
 1.5M ./ex01-matlab
 512K ./ex02-python
 768K ./ex03-python
@@ -770,7 +715,7 @@ current directory, you could use the following command:
 256K ./example.sh
 1.5M ./intro-HPC.pdf
 700M ./.cache
-
+``` Finally, if you don't want to know the size of the data in your current directory, but in some other directory (e.g., your data directory), you @@ -778,13 +723,14 @@ just pass this directory as a parameter. The command below will show the disk use in your home directory, even if you are currently in a different directory: -
$ du -h --max-depth 1 $VSC_HOME
+```
+$ du -h --max-depth 1 $VSC_HOME
 22M {{ homedir }}/dataset01
 36M {{ homedir }}/dataset02
 22M {{ homedir }}/dataset03
 3.5M {{ homedir }}/primes.txt
 24M {{ homedir }}/.cache
-
+``` {% if site == gent %} {% else %} @@ -796,8 +742,9 @@ listing of files. Try: -
$ tree -s -d
-
+``` +$ tree -s -d +``` However, we urge you to only use the `du` and `tree` commands when you really need them as they can put a heavy strain on the file system and @@ -816,8 +763,9 @@ infrastructure. To change the group of a directory and it's underlying directories and files, you can use: -
$ chgrp -R groupname directory
-
+``` +chgrp -R groupname directory +``` ### Joining an existing group @@ -864,9 +812,10 @@ You can get details about the current state of groups on the HPC infrastructure with the following command (`example` is the name of the group we want to inspect): -
$ getent group example
+```
+$ getent group example
 example:*:1234567:vsc40001,vsc40002,vsc40003
-
+``` We can see that the VSC id number is 1234567 and that there are three members in the group: `vsc40001`, `vsc40002` and `vsc40003`. diff --git a/mkdocs/docs/HPC/setting_up_python_virtual_environments.md b/mkdocs/docs/HPC/setting_up_python_virtual_environments.md new file mode 100644 index 00000000000..1d228c44b05 --- /dev/null +++ b/mkdocs/docs/HPC/setting_up_python_virtual_environments.md @@ -0,0 +1,324 @@ +# Python Virtual Environments (venv's) + +## Introduction + +A Python virtual environment ("venv" for short) +is a tool to create an isolated Python workspace. +Within this isolated environment, +you can install additional Python packages without affecting the system-wide Python installation. +Because a normal user cannot install packages globally, +using a virtual environment allows you to install packages locally without needing administrator privileges. +This is especially useful when you need to use a package that is not available as a module on the HPC cluster. + +## Managing Python Environments + +This section will explain how to create, activate, use and deactivate Python virtual environments. + +### Creating a Python virtual environment + +A Python virtual environment can be created with the following command: + +```bash +python -m venv myenv # Create a new virtual environment named 'myenv' +``` + +This command creates a new subdirectory named `myenv` in the current working directory. +This directory will contain the packages, scripts, and binaries that are needed to manage the virtual environment. + +!!! warning + When you create a virtual environment on top of a loaded Python module, + the environment becomes specific to the cluster you're working on. + This is because modules are built and optimized for the operating system and CPUs of the cluster. + This means that you should create a new virtual environment for each cluster you work on. + See [Creating a virtual environment for a specific cluster](#creating-a-virtual-environment-for-a-specific-cluster) for more information. + + +### Activating a virtual environment + +To use the virtual environment, you need to *activate* it. +This will modify the shell environment to use the Python interpreter and packages from the virtual environment. + +```bash +source myenv/bin/activate # Activate the virtual environment +``` + +### Installing packages in a virtual environment + +After activating the virtual environment, you can install additional Python packages with `pip install`: + +```bash +pip install example_package1 +pip install example_package2 +``` + +These packages will be scoped to the virtual environment and will not affect the system-wide Python installation, +and are only available when the virtual environment is activated. +No administrator privileges are required to install packages in a virtual environment. + +It is now possible to run Python scripts that use the installed packages in the virtual environment. + +!!! tip + When creating a virtual environment, it's best to install only *pure* Python + packages. Pure Python packages consist solely of Python code and don't require compilation. + The installation method of these packages doesn't impact performance since they're not compiled. + + Compiled libraries with a Python wrapper (*non-pure* Python packages) are better loaded as modules + rather than installed in the virtual environment. + This is because modules are optimized for the HPC cluster’s specific hardware and operating system. + If a non-pure Python package isn't available as a module, you can + [submit a software installation request](https://www.ugent.be/hpc/en/support/software-installation-request). + + To check if a package is available as a module, use: + + ```bash + module av package_name + ``` + + Some Python packages are installed as extensions of modules. For example, `numpy`, `scipy` and `pandas` are + part of the `SciPy-bundle` module. You can use + + ```bash + module show module_name + ``` + + to check which extensions are included in a module (if any). + +### Using a virtual environment + +Once the environment is activated and packages are installed, +you can run Python scripts that use the installed packages: + +```python title="example.py" +import example_package1 +import example_package2 +... +``` + +```bash +python example.py +``` + + +### Deactivating a virtual environment + +When you are done using the virtual environment, you can deactivate it. +To do that, run: + +```bash +deactivate +``` + +## Combining virtual environments with centrally installed modules + +You can combine Python packages installed in a virtual environment with environment modules. +The following script uses PyTorch (which is available as a module) +and Poutyne (which we assume is not centrally installed): + +```python title="pytorch_poutyne.py" +import torch +import poutyne + +... +``` + +We load a PyTorch package as a module and install Poutyne in a virtual environment: + +```bash +module load PyTorch/2.1.2-foss-2023a +python -m venv myenv +source myenv/bin/activate +pip install Poutyne +``` + +While the virtual environment is activated, we can run the script without any issues: + +```bash +python pytorch_poutyne.py +``` + +Deactivate the virtual environment when you are done: + +```bash +deactivate +``` + + +## Creating a virtual environment for a specific cluster + +To create a virtual environment for a specific cluster, you need to start an interactive shell on that cluster. +Let's say you want to create a virtual environment on the `donphan` cluster. + +```bash +module swap cluster/donphan +qsub -I +``` + +After some time, a shell will be started on the `donphan` cluster. +You can now create a virtual environment as described in [the first section](#creating-a-venv). +This virtual environment can be used by jobs running on the `donphan` cluster. + +!!! note "Naming a virtual environment" + When naming a virtual environment, it is recommended to include the name of the cluster it was created for. + We can use the `$VSC_INSTITUTE_CLUSTER` variable to get the name of the current cluster. + + ```bash + python -m venv myenv_${VSC_INSTITUTE_CLUSTER} + ``` + + +## Example Python job + +This section will combine the concepts discussed in the previous sections to: + +1. Create a virtual environment on a specific cluster. +2. Combine packages installed in the virtual environment with modules. +3. Submit a job script that uses the virtual environment. + +The example script that we will run is the following: + +```python title="pytorch_poutyne.py" +import torch +import poutyne + +print(f"The version of PyTorch is: {torch.__version__}") +print(f"The version of Poutyne is: {poutyne.__version__}") +``` + +First, we create a virtual environment on the `donphan` cluster: + +```bash +module swap cluster/donphan +qsub -I +# Load module dependencies +module load PyTorch/2.1.2-foss-2023a +python -m venv myenv +source myenv/bin/activate +# install virtual environment dependencies +pip install Poutyne +deactivate +``` + +Type `exit` to exit the interactive shell. +We now create a job script that loads the PyTorch module, enters the virtual environment and executes the script: + +```bash title="jobscript.pbs" +#!/bin/bash + +# Basic parameters +#PBS -N python_job_example ## Job name +#PBS -l nodes=1:ppn=1 ## 1 node, 1 processors per node +#PBS -l walltime=01:00:00 ## Max time your job will run (no more than 72:00:00) + +module load PyTorch/2.1.2-foss-2023a # Load the PyTorch module +cd $PBS_O_WORKDIR # Change working directory to the location where the job was submitted +source myenv/bin/activate # Activate the virtual environment + +python pytorch_poutyne.py # Run your Python script, or any other command within the virtual environment + +deactivate # Deactivate the virtual environment +``` + +Next, we submit the job script: + +```bash +qsub jobscript.pbs +``` + +Two files will be created in the directory where the job was submitted: +`python_job_example.o{{jobid}}` and `python_job_example.e{{job_id}}`, where {{jobid}} is the id of your job. +The `.o` file contains the output of the job. + + +## Troubleshooting + +### Illegal instruction error + +Activating a virtual environment created on a different cluster can cause issues. +This happens +because the binaries in the virtual environments from cluster A might not work with the CPU architecture of cluster B. + +For example, if we create a virtual environment on the skitty cluster, + +```bash +module swap cluster/skitty +qsub -I +$ python -m venv myenv +``` + +return to the login node by pressing CTRL+D and try to use the virtual environment: + +```bash +$ source myenv/bin/activate +$ python +Illegal instruction (core dumped) +``` + +we are presented with the illegal instruction error. More info on this [here](troubleshooting.md#illegal-instruction-error) + +### Error: GLIBC not found + +When running a virtual environment across clusters with different major OS versions, +you might encounter a variation of the following error: + +``` +python: /lib64/libc.so.6: version `GLIBC_2.34' not found (required by python) +``` + +Make sure you do not activate a virtual environment created on a different cluster. +For more information on how to create a virtual environment for a specific cluster, +see [Creating a virtual environment for a specific cluster](#creating-a-virtual-environment-for-a-specific-cluster). +When following these steps, make sure you do not have any modules loaded when starting the interactive job. + + +### Error: cannot open shared object file: No such file or directory + +There are two main reasons why this error could occur. + +1. You have not loaded the `Python` module that was used to create the virtual environment. +2. You loaded or unloaded modules while the virtual environment was activated. + +#### Entering a virtual environment while the Python module used to create it is not active + +If you loaded a `Python` module when creating a virtual environment, you need to make sure that the same module +is loaded when you enter the environment. This is because the virtual environment keeps a reference to the base python +used to create it. + +The following commands illustrate this issue: + +```bash +$ module load Python/3.10.8-GCCcore-12.2.0 # Load a python module +$ python -m venv myenv # Create a virtual environment with loaded python module +$ module purge # unload all modules (WRONG!) +$ source myenv/bin/activate # Activate the virtual environment +$ python # Start python +python: error while loading shared libraries: libpython3.10.so.1.0: cannot open shared object file: No such file or directory +``` + +Here, the virtual environment tries to use the python module that was loaded when the environment was created. +Since we used `module purge`, that module is no longer available. +The solution is to load the same python module before activating the virtual environment: + +```bash +module load Python/3.10.8-GCCcore-12.2.0 # Load the same python module +source myenv/bin/activate # Activate the virtual environment +``` + +#### Modifying modules while in a virtual environment + +You must not load or unload modules while in a virtual environment. +Loading and unloading modules modifies the `$PATH` variable in the current shell. When activating a virtual environment, +it will store the `$PATH` variable of the shell at that moment. If you modify the `$PATH` variable while in a virtual environment by loading or unloading modules, +and deactivate the virtual environment, the `$PATH` variable will be reset to the one stored in the virtual environment. +Trying to use those modules will lead to errors: + +```bash +$ module load Python/3.10.8-GCCcore-12.2.0 # Load a python module +$ python -m venv myenv # Create a virtual environment +$ source myenv/bin/activate # Activate the virtual environment (saves state of $PATH) +$ module purge # Unload all modules (modifies the $PATH) +$ deactivate # Deactivate the virtual environment (resets $PATH to saved state) +$ python # PATH contains a reference to the unloaded module +python: error while loading shared libraries: libpython3.10.so.1.0: cannot open shared object file: No such file or directory +``` + +The solution is to only modify modules when not in a virtual environment. diff --git a/mkdocs/docs/HPC/sites/antwerpen/available-modules.md b/mkdocs/docs/HPC/sites/antwerpen/available-modules.md index 474d3ab5d1b..71c8382b85c 100644 --- a/mkdocs/docs/HPC/sites/antwerpen/available-modules.md +++ b/mkdocs/docs/HPC/sites/antwerpen/available-modules.md @@ -1,4 +1,5 @@ -
$ module av 2>&1 | more
+```
+$ module av 2>&1 | more
 ------------- /apps/antwerpen/modules/hopper/2015a/all ------------
 ABINIT/7.10.2-intel-2015a
 ADF/2014.05
@@ -9,16 +10,17 @@ Boost/1.57.0-intel-2015a-Python-2.7.9
 bzip2/1.0.6-foss-2015a
 bzip2/1.0.6-intel-2015a
 ...
-
+``` Or when you want to check whether some specific software, some compiler or some application (e.g., LAMMPS) is installed on the {{hpc}}. -
$ module av 2>&1 | grep -i -e "LAMMPS"
+```
+$ module av 2>&1 | grep -i -e "LAMMPS"
 LAMMPS/9Dec14-intel-2015a
 LAMMPS/30Oct14-intel-2014a
 LAMMPS/5Sep14-intel-2014a
-
+``` As you are not aware of the capitals letters in the module name, we looked for a case-insensitive name with the "-i" option. diff --git a/mkdocs/docs/HPC/sites/gent/available-modules.md b/mkdocs/docs/HPC/sites/gent/available-modules.md index 13956ab2346..fc246514453 100644 --- a/mkdocs/docs/HPC/sites/gent/available-modules.md +++ b/mkdocs/docs/HPC/sites/gent/available-modules.md @@ -1,4 +1,5 @@ -
$ module av | more
+```
+module avail
 --- /apps/gent/RHEL8/zen2-ib/modules/all ---
    ABAQUS/2021-hotfix-2132
    ABAQUS/2022-hotfix-2214
@@ -6,16 +7,17 @@
    ABAQUS/2023
    ABAQUS/2024-hotfix-2405                                                (D)
    ...
-
+``` Or when you want to check whether some specific software, some compiler or some application (e.g., MATLAB) is installed on the {{hpc}}. -
$ module av matlab
+```
+module avail matlab
 --- /apps/gent/RHEL8/zen2-ib/modules/all ---
    LIBSVM-MATLAB/3.30-GCCcore-11.3.0-MATLAB-2022b-r5
    MATLAB/2019b
    MATLAB/2021b
    MATLAB/2022b-r5                                   (D)
    SPM/12.5_r7771-MATLAB-2021b
-
+``` diff --git a/mkdocs/docs/HPC/torque_frontend_via_jobcli.md b/mkdocs/docs/HPC/torque_frontend_via_jobcli.md new file mode 100644 index 00000000000..c2fbbf4897f --- /dev/null +++ b/mkdocs/docs/HPC/torque_frontend_via_jobcli.md @@ -0,0 +1,153 @@ +# Torque frontend via jobcli + +## What is Torque + +[Torque](https://en.wikipedia.org/wiki/TORQUE) is a resource manager for submitting and managing jobs on an HPC cluster. It is an implementation of [PBS (Portable Batch System)](https://en.wikipedia.org/wiki/Portable_Batch_System). +Torque is not widely used anymore, so the {{hpcinfra}} no longer uses Torque in the backend since 2021 in favor of Slurm. +The Torque user interface, which consists of commands like `qsub` and `qstat`, was kept however, to avoid that researchers had to learn other commands to submit and manage jobs. + +## Slurm backend + +[Slurm](https://en.wikipedia.org/wiki/Slurm_Workload_Manager) is a resource manager for submitting and managing jobs on an HPC cluster, similar to Torque (but more advanced/modern in some ways). Currently, Slurm is the most popular workload manager on HPC systems worldwide, but it has a user interface that is different and in some sense less user friendly than Torque/PBS. + +## jobcli + +Jobcli is a Python library that was developed by {{hpcteam}} to make it possible for the {{hpcinfra}} to use a Torque frontend and a Slurm backend. In addition to that, it adds some additional options for Torque commands. Put simply, jobcli can be thought of as a Python script that "translates" Torque commands into equivalent Slurm commands, and in the case of `qsub` also makes some changes to the provided job script to make it compatible with Slurm. + +### Additional options for Torque commands supported by jobcli + +#### help option + +Adding `--help` to a Torque command when using it on the {{hpcinfra}} will output an extensive overview of all supported options for that command, including all possible options for that command (including the original ones from Torque and the ones added by jobcli) and a short description for each one. + +For example: +```shell +$ qsub --help +usage: qsub [--version] [--debug] [--dryrun] [--pass OPTIONS] [--dump PATH]... + +Submit job script + +positional arguments: + script_file_path Path to job script to be submitted (default: read job + script from stdin) + +optional arguments: + -A ACCOUNT Charge resources used by this job to specified account + ... +``` + +#### dryrun option + +Adding `--dryrun` to a Torque command when using it on the {{hpcinfra}} will show the user what Slurm commands are generated by that Torque command by jobcli. Using `--dryrun` will not actually execute the Slurm backend command. + +See also [the examples](./#examples) below. + +#### debug option + +Similarly to `--dryrun`, adding `--debug` to a Torque command when using it on the {{hpcinfra}} will show the user what Slurm commands are generated by that Torque command by jobcli. However in contrast to `--dryrun`, using `--debug` will actually run the Slurm backend command. + +See also [the examples](./#examples) below. + +#### Examples + +The following examples illustrate the working of the `--dryrun` and `--debug` options with an example jobscript. + +`example.sh`: + +```shell +#/bin/bash +#PBS -l nodes=1:ppn=8 +#PBS -l walltime=2:30:00 + +module load SciPy-bundle/2023.11-gfbf-2023b + +python script.py > script.out.${PBS_JOBID} +``` + +##### Example of the dryrun option + +Running the following command: + +```shell +$ qsub --dryrun example.sh -N example +``` + +will generate this output: + +```shell + +Command that would have been run: +--------------------------------- + +/usr/bin/sbatch + +Job script that would have been submitted: +------------------------------------------ + +#!/bin/bash +#SBATCH --chdir="/user/gent/400/{{userid}}" +#SBATCH --error="/kyukon/home/gent/400/{{userid}}/examples/%x.e%A" +#SBATCH --export="NONE" +#SBATCH --get-user-env="60L" +#SBATCH --job-name="example" +#SBATCH --mail-type="NONE" +#SBATCH --nodes="1" +#SBATCH --ntasks-per-node="8" +#SBATCH --ntasks="8" +#SBATCH --output="/kyukon/home/gent/400/{{userid}}/examples/%x.o%A" +#SBATCH --time="02:30:00" + +### (start of lines that were added automatically by jobcli) +# +# original submission command: +# qsub --dryrun example.sh -N example +# +# directory where submission command was executed: +# /kyukon/home/gent/400/{{userid}}/examples +# +# original script header: +# #PBS -l nodes=1:ppn=8 +# #PBS -l walltime=2:30:00 +# +### (end of lines that were added automatically by jobcli) + +#/bin/bash + +module load SciPy-bundle/2023.11-gfbf-2023b + +python script.py > script.out.${PBS_JOBID} +``` +This output consist of a few components. For our example the most important lines are the ones that start with `#SBATCH` since these contain the translation of the Torque commands to Slurm commands. For example the job-name is the one we specified with the `-N` option in the command. + +With this dryrun, you can see that the only changes were made to the header, the job script itself is not changed at all. If the job script were to use any PBS-related structures, like `$PBS_JOBID`, they are retained. Slurm is configured such on the {{hpcinfra}} that common `PBS_*` environment variables are defined in the job environment, next to the Slurm equivalents. + +##### Example of the debug option + +Similarly to the `--dryrun` example, we start by running the following command: + +```shell +$ qsub --debug example.sh -N example +``` + +which generates this output: + +```shell +DEBUG: Submitting job script location at example.sh +DEBUG: Generated script header +#SBATCH --chdir="/user/gent/400/{{userid}}" +#SBATCH --error="/kyukon/home/gent/400/{{userid}}/examples/%x.e%A" +#SBATCH --export="NONE" +#SBATCH --get-user-env="60L" +#SBATCH --job-name="example" +#SBATCH --mail-type="NONE" +#SBATCH --nodes="1" +#SBATCH --ntasks-per-node="8" +#SBATCH --ntasks="8" +#SBATCH --output="/kyukon/home/gent/400/{{userid}}/examples/%x.o%A" +#SBATCH --time="02:30:00" +DEBUG: HOOKS: Looking for hooks in directory '/etc/jobcli/hooks' +DEBUG: HOOKS: Directory '/etc/jobcli/hooks' does not exist, so no hooks there +DEBUG: Running command '/usr/bin/sbatch' +64842138 +``` +The output once again consists of the translated Slurm commands with some additional debug information and a job id for the job that was submitted. \ No newline at end of file diff --git a/mkdocs/docs/HPC/torque_options.md b/mkdocs/docs/HPC/torque_options.md index 55c6e0709f5..cc7da6c4812 100644 --- a/mkdocs/docs/HPC/torque_options.md +++ b/mkdocs/docs/HPC/torque_options.md @@ -4,20 +4,20 @@ Below is a list of the most common and useful directives. -| Option | System type | Description| -|:------:|:-----------:|:----------| -| -k | All | Send "stdout" and/or "stderr" to your home directory when the job runs
**#PBS -k o** or **#PBS -k e** or **#PBS -koe**
| -| -l | All | Precedes a resource request, e.g., processors, wallclock | -| -M | All | Send an e-mail messages to an alternative e-mail address
**#PBS -M me@mymail.be**
| -| -m | All | Send an e-mail address when a job **b**egins execution and/or **e**nds or **a**borts
**#PBS -m b** or **#PBS -m be** or **#PBS -m ba** | -| mem | Shared Memory | Memory & Specifies the amount of memory you need for a job.
**#PBS -I mem=90gb** | -| mpiproces | Clusters | Number of processes per node on a cluster. This should equal number of processors on a node in most cases.
**#PBS -l mpiprocs=4** | -| -N | All | Give your job a unique name
**#PBS -N galaxies1234**
| -| -ncpus | Shared Memory | The number of processors to use for a shared memory job.
**#PBS ncpus=4**
| -| -r | All | ontrol whether or not jobs should automatically re-run from the start if the system crashes or is rebooted. Users with check points might not wish this to happen.
**#PBS -r n**

**#PBS -r y**
| -| select | Clusters | Number of compute nodes to use. Usually combined with the mpiprocs directive
**#PBS -l select=2**
| -| -V | All | Make sure that the environment in which the job **runs** is the same as the environment in which it was **submitted
#PBS -V
** -| Walltime | All | The maximum time a job can run before being stopped. If not used a default of a few minutes is used. Use this flag to prevent jobs that go bad running for hundreds of hours. Format is HH:MM:SS
**#PBS -l walltime=12:00:00**
| +| Option | System type | Description | +|:---------:|:-------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| -k | All | Send "stdout" and/or "stderr" to your home directory when the job runs
**#PBS -k o** or **#PBS -k e** or **#PBS -koe**
| +| -l | All | Precedes a resource request, e.g., processors, wallclock | +| -M | All | Send an e-mail messages to an alternative e-mail address
**#PBS -M me@mymail.be**
| +| -m | All | Send an e-mail address when a job **b**egins execution and/or **e**nds or **a**borts
**#PBS -m b** or **#PBS -m be** or **#PBS -m ba** | +| mem | Shared Memory | Memory & Specifies the amount of memory you need for a job.
**#PBS -I mem=90gb** | +| mpiproces | Clusters | Number of processes per node on a cluster. This should equal number of processors on a node in most cases.
**#PBS -l mpiprocs=4** | +| -N | All | Give your job a unique name
**#PBS -N galaxies1234**
| +| -ncpus | Shared Memory | The number of processors to use for a shared memory job.
**#PBS ncpus=4**
| +| -r | All | ontrol whether or not jobs should automatically re-run from the start if the system crashes or is rebooted. Users with check points might not wish this to happen.
**#PBS -r n**

**#PBS -r y**
| +| select | Clusters | Number of compute nodes to use. Usually combined with the mpiprocs directive
**#PBS -l select=2**
| +| -V | All | Make sure that the environment in which the job **runs** is the same as the environment in which it was **submitted
#PBS -V
** | +| Walltime | All | The maximum time a job can run before being stopped. If not used a default of a few minutes is used. Use this flag to prevent jobs that go bad running for hundreds of hours. Format is HH:MM:SS
**#PBS -l walltime=12:00:00**
| ## Environment Variables in Batch Job Scripts @@ -55,25 +55,25 @@ When a batch job is started, a number of environment variables are created that can be used in the batch job script. A few of the most commonly used variables are described here. -| Variable | Description | -|:--------:|:-----------| -| PBS_ENVIRONMENT | set to PBS_BATCH to indicate that the job is a batch job; otherwise, set to PBS_INTERACTIVE to indicate that the job is a PBS interactive job. | -| PBS_JOBID | the job identifier assigned to the job by the batch system. This is the same number you see when you do *qstat*. | -| PBS_JOBNAME | the job name supplied by the user | -| PBS_NODEFILE | the name of the file that contains the list of the nodes assigned to the job . Useful for Parallel jobs if you want to refer the node, count the node etc. | -| PBS_QUEUE | the name of the queue from which the job is executed -| PBS_O_HOME | value of the HOME variable in the environment in which *qsub* was executed | -| PBS_O_LANG | value of the LANG variable in the environment in which *qsub* was executed | -| PBS_O_LOGNAME | value of the LOGNAME variable in the environment in which *qsub* was executed | -| PBS_O_PATH | value of the PATH variable in the environment in which *qsub* was executed | -| PBS_O_MAIL | value of the MAIL variable in the environment in which *qsub* was executed | -| PBS_O_SHELL | value of the SHELL variable in the environment in which *qsub* was executed | -| PBS_O_TZ | value of the TZ variable in the environment in which *qsub* was executed | -| PBS_O_HOST | the name of the host upon which the *qsub* command is running | -| PBS_O_QUEUE | the name of the original queue to which the job was submitted | -| PBS_O_WORKDIR | the absolute path of the current working directory of the *qsub* command. This is the most useful. Use it in every job script. The first thing you do is, cd $PBS_O_WORKDIR after defining the resource list. This is because, pbs throw you to your $HOME directory. | -| PBS_VERSION | Version Number of TORQUE, e.g., TORQUE-2.5.1 | -| PBS_MOMPORT | active port for mom daemon | -| PBS_TASKNUM | number of tasks requested | -| PBS_JOBCOOKIE | job cookie | -| PBS_SERVER | Server Running TORQUE | +| Variable | Description | +|:---------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| PBS_ENVIRONMENT | set to PBS_BATCH to indicate that the job is a batch job; otherwise, set to PBS_INTERACTIVE to indicate that the job is a PBS interactive job. | +| PBS_JOBID | the job identifier assigned to the job by the batch system. This is the same number you see when you do *qstat*. | +| PBS_JOBNAME | the job name supplied by the user | +| PBS_NODEFILE | the name of the file that contains the list of the nodes assigned to the job . Useful for Parallel jobs if you want to refer the node, count the node etc. | +| PBS_QUEUE | the name of the queue from which the job is executed | +| PBS_O_HOME | value of the HOME variable in the environment in which *qsub* was executed | +| PBS_O_LANG | value of the LANG variable in the environment in which *qsub* was executed | +| PBS_O_LOGNAME | value of the LOGNAME variable in the environment in which *qsub* was executed | +| PBS_O_PATH | value of the PATH variable in the environment in which *qsub* was executed | +| PBS_O_MAIL | value of the MAIL variable in the environment in which *qsub* was executed | +| PBS_O_SHELL | value of the SHELL variable in the environment in which *qsub* was executed | +| PBS_O_TZ | value of the TZ variable in the environment in which *qsub* was executed | +| PBS_O_HOST | the name of the host upon which the *qsub* command is running | +| PBS_O_QUEUE | the name of the original queue to which the job was submitted | +| PBS_O_WORKDIR | the absolute path of the current working directory of the *qsub* command. This is the most useful. Use it in every job script. The first thing you do is, cd $PBS_O_WORKDIR after defining the resource list. This is because, pbs throw you to your $HOME directory. | +| PBS_VERSION | Version Number of TORQUE, e.g., TORQUE-2.5.1 | +| PBS_MOMPORT | active port for mom daemon | +| PBS_TASKNUM | number of tasks requested | +| PBS_JOBCOOKIE | job cookie | +| PBS_SERVER | Server Running TORQUE | diff --git a/mkdocs/docs/HPC/troubleshooting.md b/mkdocs/docs/HPC/troubleshooting.md index 3ae43d5f8fb..fd65e6ecad8 100644 --- a/mkdocs/docs/HPC/troubleshooting.md +++ b/mkdocs/docs/HPC/troubleshooting.md @@ -98,8 +98,9 @@ and thus requesting multiple cores and/or nodes will only result in wasted resou If you get from your job output an error message similar to this: -
=>> PBS: job killed: walltime <value in seconds> exceeded limit  <value in seconds>
-
+``` +=>> PBS: job killed: walltime exceeded limit +``` This occurs when your job did not complete within the requested walltime. See @@ -119,7 +120,6 @@ option is to request extra quota for your VO to the VO moderator/s. See section on [Pre-defined user directories](../running_jobs_with_input_output_data/#pre-defined-user-directories) and [Pre-defined quotas](../running_jobs_with_input_output_data/#pre-defined-quotas) for more information about quotas and how to use the storage endpoints in an efficient way. {% endif %} - ## Issues connecting to login node { #sec:connecting-issues} @@ -128,8 +128,9 @@ the key/lock analogy in [How do SSH keys work?](../account/#how-do-ssh-keys-work If you have errors that look like: -
{{ userid }}@{{ loginnode }}: Permission denied
-
+``` +{{ userid }}@{{ loginnode }}: Permission denied +``` or you are experiencing problems with connecting, here is a list of things to do that should help: @@ -150,12 +151,13 @@ things to do that should help: 2. Use `ssh-add` (see section [Using an SSH agent](../account/#using-an-ssh-agent-optional)) *OR;* 3. Specify the location of the key in `$HOME/.ssh/config`. You will need to replace the VSC login id in the `User` field with your own: -
                Host {{ hpcname }}
+                ```
+                Host {{ hpcname }}
                     Hostname {{ loginnode }}
-                    IdentityFile /path/to/private/key
-                    User {{ userid }}
-                
- Now you can just connect with ssh {{ hpcname }}. + IdentityFile /path/to/private/key + User {{ userid }} + ``` + Now you can connect with `ssh {{ hpcname }}`. {% endif %} 4. Please double/triple check your VSC login ID. It should look @@ -193,8 +195,9 @@ things to do that should help: {% if OS == windows %} If you are using PuTTY and get this error message: -
server unexpectedly closed network connection
-
+``` +server unexpectedly closed network connection +``` it is possible that the PuTTY version you are using is too old and doesn't support some required (security-related) features. @@ -217,49 +220,35 @@ and include it in the email. 2. Single click on the saved configuration -
![image](img/831change01.png) -
3. Then click ++"Load"++ button -
![image](img/831change02.png) -
4. Expand SSH category (on the left panel) clicking on the "+" next to SSH -
![image](img/831change03.png) -
5. Click on Auth under the SSH category -
![image](img/831change04.png) -
6. On the right panel, click ++"Browse"++ button -
![image](img/831change05.png) -
7. Then search your private key on your computer (with the extension ".ppk") 8. Go back to the top of category, and click Session -
![image](img/831change06.png) -
9. On the right panel, click on ++"Save"++ button -
![image](img/831change07.png) -
### Check whether your private key in PuTTY matches the public key on the accountpage @@ -269,28 +258,20 @@ Follow the instructions in [Change PuTTY private key for a saved configuration]( then select all text (push ++"Ctrl"++ + ++"a"++ ), then copy the location of the private key (push ++"Ctrl"++ + ++"c"++) -
![image](img/832check05.png) -
2. Open PuTTYgen -
![image](img/832check06.png) -
3. Enter menu item "File" and select "Load Private key" -
![image](img/832check07.png) -
4. On the "Load private key" popup, click in the textbox next to "File name:", then paste the location of your private key (push ++"Ctrl"++ + ++"v"++), then click ++"Open"++ -
![image](img/832check08.png) -
5. Make sure that your Public key from the "Public key for pasting into OpenSSH authorized_keys file" textbox is in your "Public @@ -298,15 +279,14 @@ Follow the instructions in [Change PuTTY private key for a saved configuration]( (Scroll down to the bottom of "View Account" tab, you will find there the "Public keys" section) -
![image](img/832check09.png) -
{% else %} Please add `-vvv` as a flag to `ssh` like: -
ssh -vvv {{ userid }}@{{ loginnode }}
-
+``` +ssh -vvv {{ userid }}@{{ loginnode }} +``` and include the output of that command in the message. {% endif %} @@ -320,7 +300,8 @@ system you are connecting to has changed. {% if OS == (linux or macos) %} -
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
+```
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
 @     WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!    @
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! 
@@ -331,10 +312,10 @@ The fingerprint for the ECDSA key sent by the remote host is
 SHA256:1MNKFTfl1T9sm6tTWAo4sn7zyEfiWFLKbk/mlT+7S5s. 
 Please contact your system administrator. 
 Add correct host key in  ~/.ssh/known_hosts to get rid of this message. 
-Offending ECDSA key in  ~/.ssh/known_hosts:21
+Offending ECDSA key in  ~/.ssh/known_hosts:21
 ECDSA host key for {{ loginnode }} has changed and you have requested strict checking.
 Host key verification failed.
-
+``` You will need to remove the line it's complaining about (in the example, line 21). To do that, open `~/.ssh/known_hosts` in an editor, and remove the @@ -344,8 +325,9 @@ to. Alternatively you can use the command that might be shown by the warning under `remove with:` and it should be something like this: -
ssh-keygen -f "~/.ssh/known_hosts" -R "{{loginnode}}"
-
+``` +ssh-keygen -f "~/.ssh/known_hosts" -R "{{loginnode}}" +``` If the command is not shown, take the file from the "Offending ECDSA key in", and the host name from "ECDSA host key for" lines. @@ -356,8 +338,9 @@ After you've done that, you'll need to connect to the {{ hpc }} again. See [Warn You will need to verify that the fingerprint shown in the dialog matches one of the following fingerprints: -
{{ puttyFirstConnect }}
-
+``` +{{ puttyFirstConnect }} +``` **Do not click "Yes" until you verified the fingerprint. Do not press "No" in any case.** @@ -367,9 +350,7 @@ If it doesn't (like in the example) or you are in doubt, take a screenshot, pres {% include "../macros/sshedfingerprintnote.md" %} -
![image](img/putty_security_alert.jpg) -
{% if site == gent %} If you use X2Go client, you might get one of the following fingerprints: @@ -389,33 +370,38 @@ If it doesn't, or you are in doubt, take a screenshot, press "Yes" and contact { If you get errors like: -
qsub fibo.pbs
+```
+$ qsub fibo.pbs
 qsub: script is written in DOS/Windows text format
-
+``` or -
sbatch: error: Batch script contains DOS line breaks (\r\n)
-
+``` +sbatch: error: Batch script contains DOS line breaks (\r\n) +``` It's probably because you transferred the files from a Windows computer. -See the [section about `dos2unix` in Linux tutorial](https://hpcugent.github.io/vsc_user_docs/linux-tutorial/uploading_files/#dos2unix) to fix this error. +See the [section about `dos2unix` in Linux tutorial](../linux-tutorial/uploading_files/#dos2unix) to fix this error. ## Warning message when first connecting to new host {% if OS == (linux or macos) %} -
ssh {{userid}}@{{loginnode}}
-The authenticity of host {{loginnode}} (<IP-adress>) can't be established. 
-<algorithm> key fingerprint is <hash>
+```
+$ ssh {{userid}}@{{loginnode}}
+The authenticity of host {{loginnode}} () can't be established. 
+ key fingerprint is 
 Are you sure you want to continue connecting (yes/no)?
-
+``` Now you can check the authenticity by checking if the line that is at the place of the underlined piece of text matches one of the following lines: -
{{opensshFirstConnect}}
+``` +{{opensshFirstConnect}} +``` {% endif %} {% if site == gent %} @@ -473,8 +459,6 @@ you via the `ulimit -v` command *in your job script*. See [Generic resource requirements](../running_batch_jobs/#generic-resource-requirements) to set memory and other requirements, see [Specifying memory requirements](../fine_tuning_job_specifications/#specifying-memory-requirements) to finetune the amount of memory you request. - {% if site == gent %} ## Module conflicts @@ -496,7 +480,6 @@ While processing the following module(s): Module fullname Module Filename --------------- --------------- HMMER/3.1b2-intel-2017a /apps/gent/CO7/haswell-ib/modules/all/HMMER/3.1b2-intel-2017a.lua -
``` This resulted in an error because we tried to load two modules with different @@ -539,11 +522,12 @@ As a rule of thumb, toolchains in the same row are compatible with each other: Another common error is: -
$ module load cluster/{{othercluster}}
+```
+$ module load cluster/{{othercluster}}
 Lmod has detected the following error: A different version of the 'cluster' module is already loaded (see output of 'ml').
 
 If you don't understand the warning or error, contact the helpdesk at hpc@ugent.be
-
+``` This is because there can only be one `cluster` module active at a time. The correct command is `module swap cluster/{{othercluster}}`. See also [Specifying the cluster on which to run](../running_batch_jobs/#specifying-the-cluster-on-which-to-run). @@ -556,22 +540,24 @@ The correct command is `module swap cluster/{{othercluster}}`. See also [Specify When running software provided through modules (see [Modules](../running_batch_jobs/#modules)), you may run into errors like: -
$ module swap cluster/donphan
+```
+$ module swap cluster/donphan
 The following have been reloaded with a version change:
   1) cluster/doduo => cluster/donphan         3) env/software/doduo => env/software/donphan
   2) env/slurm/doduo => env/slurm/donphan     4) env/vsc/doduo => env/vsc/donphan
 
-$ module load Python/3.10.8-GCCcore-12.2.0
-$ python
+$ module load Python/3.10.8-GCCcore-12.2.0
+$ python
 Please verify that both the operating system and the processor support
 Intel(R) MOVBE, F16C, FMA, BMI, LZCNT and AVX2 instructions.
-
+``` or errors like: -
$ python
+```
+$ python
 Illegal instruction
-
+``` When we swap to a different cluster, the available modules change so they work for that cluster. That means that if the cluster and the login @@ -587,8 +573,9 @@ all our modules will get reloaded. This means that all current modules will be unloaded and then loaded again, so they'll work on the newly loaded cluster. Here's an example of how that would look like: -
$ module load Python/3.10.8-GCCcore-12.2.0
-$ module swap cluster/donphan
+```
+$ module load Python/3.10.8-GCCcore-12.2.0
+$ module swap cluster/donphan
 
 Due to MODULEPATH changes, the following have been reloaded:
   1) GCCcore/12.2.0                   8) binutils/2.39-GCCcore-12.2.0
@@ -602,7 +589,7 @@ Due to MODULEPATH changes, the following have been reloaded:
 The following have been reloaded with a version change:
   1) cluster/doduo => cluster/donphan         3) env/software/doduo => env/software/donphan
   2) env/slurm/doduo => env/slurm/donphan     4) env/vsc/doduo => env/vsc/donphan
-
+``` This might result in the same problems as mentioned above. When swapping to a different cluster, you can run `module purge` to unload all modules @@ -613,9 +600,10 @@ to avoid problems (see [Purging all modules](../running_batch_jobs/#purging-all- When using a tool that is made available via modules to submit jobs, for example [Worker](multi_job_submission.md), you may run into the following error when targeting a non-default cluster: -
$  wsub
-/apps/gent/.../.../software/worker/.../bin/wsub: line 27: 2152510 Illegal instruction     (core dumped) ${PERL} ${DIR}/../lib/wsub.pl "$@"
-
+``` +$ wsub +/apps/gent/.../.../software/worker/.../bin/wsub: line 27: 2152510 Illegal instruction (core dumped) ${PERL} ${DIR}/../lib/wsub.pl "$@" +``` When executing the `module swap cluster` command, you are not only changing your session environment to submit to that specific cluster, but also to use the part of the central software stack that is specific to that cluster. @@ -630,9 +618,13 @@ The same goes for the other clusters as well of course. !!! Tip To submit a Worker job to a specific cluster, like the [`donphan` interactive cluster](interactive_debug.md) for instance, use: -
$ module swap env/slurm/donphan 
+ ``` + $ module swap env/slurm/donphan + ``` instead of -
$ module swap cluster/donphan 
+ ``` + $ module swap cluster/donphan + ``` We recommend using a `module swap cluster` command after submitting the jobs. diff --git a/mkdocs/docs/HPC/useful_linux_commands.md b/mkdocs/docs/HPC/useful_linux_commands.md index 258dfa70d25..afaa87575e9 100644 --- a/mkdocs/docs/HPC/useful_linux_commands.md +++ b/mkdocs/docs/HPC/useful_linux_commands.md @@ -6,73 +6,32 @@ All the {{hpc}} clusters run some variant of the "{{operatingsystembase}}" opera that, when you connect to one of them, you get a command line interface, which looks something like this: -
{{userid}}@ln01[203] $
-
+``` +{{userid}}@ln01[203] $ +``` When you see this, we also say you are inside a "shell". The shell will accept your commands, and execute them. - - - - - - - - - - - - - -{% if site == gent %} - - - - -{% else %} - - - - +| Command | Description | +|---------|----------------------------------------------------| +| `ls` | Shows you a list of files in the current directory | +| `cd` | Change current working directory | +| `rm` | Remove file or directory | +| `echo` | Prints its parameters to the screen | +{% if site == gent %} | `nano` | Text editor | +{% else %} | `joe` | Text editor | {% endif %} - - - - -
- ls - - Shows you a list of files in the current directory -
- cd - - Change current working directory -
- rm - - Remove file or directory -
- nano - - Text editor -
- joe - - Text editor -
- echo - - Prints its parameters to the screen -
+ Most commands will accept or even need parameters, which are placed after the command, separated by spaces. A simple example with the "echo" command: -
$ echo This is a test
+```
+$ echo This is a test
 This is a test
-
+``` Important here is the "$" sign in front of the first line. This should not be typed, but is a convention meaning "the rest of this line should @@ -84,10 +43,11 @@ explained then if necessary. If not, you can usually get more information about a command, say the item or command "ls", by trying either of the following: -
$ ls --help 
-$ man ls
-$  info ls 
-
+``` +$ ls --help +$ man ls +$ info ls +``` (You can exit the last two "manuals" by using the "q" key.) For more exhaustive tutorials about Linux usage, please refer to the following @@ -125,38 +85,43 @@ hostname You can type both lines at your shell prompt, and the result will be the following: -
$ echo "Hello! This is my hostname:"
+```
+$ echo "Hello! This is my hostname:"
 Hello! This is my hostname:
-$ hostname
+$ hostname
 {{loginhost}}
-
+``` Suppose we want to call this script "foo". You open a new file for editing, and name it "foo", and edit it with your favourite editor {% if site == gent %} -
$ nano foo
-
+``` +nano foo +``` {% else %} -
$ vi foo
-
+``` +$ vi foo +``` {% endif %} or use the following commands: -
$ echo "echo Hello! This is my hostname:" > foo
-$ echo hostname >> foo
-
+``` +echo "echo Hello! This is my hostname:" > foo +echo hostname >> foo +``` The easiest ways to run a script is by starting the interpreter and pass the script as parameter. In case of our script, the interpreter may either be "sh" or "bash" (which are the same on the cluster). So start the script: -
$ bash foo
+```
+$ bash foo
 Hello! This is my hostname:
 {{loginhost}}
-
+``` Congratulations, you just created and started your first shell script! @@ -171,9 +136,10 @@ the following line on top of your shell script You can find this path with the "which" command. In our case, since we use bash as an interpreter, we get the following path: -
$ which bash
+```
+$ which bash
 /bin/bash
-
+``` We edit our script and change it with this information: @@ -188,15 +154,17 @@ script. Finally, we tell the operating system that this script is now executable. For this we change its file attributes: -
$  chmod +x foo
-
+``` +chmod +x foo +``` Now you can start your script by simply executing it: -
$ ./foo
+```
+$ ./foo
 Hello! This is my hostname:
 {{loginhost}}
-
+``` The same technique can be used for all other scripting languages, like Perl and Python. @@ -209,400 +177,99 @@ not ignore these lines, you may get strange results ... ### Archive Commands - - - - - - - - - - - - - - - - - -
- tar - - An archiving program designed to store and extract files from an archive known as a tar file. -
- tar -cvf foo.tar foo/ - - compress the contents of foo folder to foo.tar -
- tar -xvf foo.tar - - extract foo.tar -
- tar -xvzf foo.tar.gz - - extract gzipped foo.tar.gz -
+| Command | Description | +|-------------------------|-----------------------------------------------------------------------------------------------| +| `tar` | An archiving program designed to store and extract files from an archive known as a tar file. | +| `tar -cvf foo.tar foo/` | Compress the contents of `foo` folder to `foo.tar` | +| `tar -xvf foo.tar` | Extract `foo.tar` | +| `tar -xvzf foo.tar.gz` | Extract gzipped `foo.tar.gz` | + ### Basic Commands - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- ls - - Shows you a list of files in the current directory -
- cd - - Change the current directory -
- rm - - Remove file or directory -
- mv - - Move file or directory -
- echo - - Display a line or text -
- pwd - - Print working directory -
- mkdir - - Create directories -
- rmdir - - Remove directories -
+| Command | Description | +|---------|----------------------------------------------------| +| `ls` | Shows you a list of files in the current directory | +| `cd` | Change the current directory | +| `rm` | Remove file or directory | +| `mv` | Move file or directory | +| `echo` | Display a line or text | +| `pwd` | Print working directory | +| `mkdir` | Create directories | +| `rmdir` | Remove directories | ### Editor - - - - - - - - - - - - - -
- emacs - - -
- nano - - Nano's ANOther editor, an enhanced free Pico clone -
- vi - - A programmers text editor -
+| Command | Description | +|---------|----------------------------------------------------| +| `emacs` | | +| `nano` | Nano's ANOther editor, an enhanced free Pico clone | +| `vi` | A programmer's text editor | + ### File Commands - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- cat - - Read one or more files and print them to standard output -
- cmp - - Compare two files byte by byte -
- cp - - Copy files from a source to the same or different target(s) -
- du - - Estimate disk usage of each file and recursively for directories -
- find - - Search for files in directory hierarchy -
- grep - - Print lines matching a pattern -
- ls - - List directory contents -
- mv - - Move file to different targets -
- rm - - Remove files -
- sort - - Sort lines of text files -
- wc - - Print the number of new lines, words, and bytes in files -
+| Command | Description | +|---------|------------------------------------------------------------------| +| `cat` | Read one or more files and print them to standard output | +| `cmp` | Compare two files byte by byte | +| `cp` | Copy files from a source to the same or different target(s) | +| `du` | Estimate disk usage of each file and recursively for directories | +| `find` | Search for files in directory hierarchy | +| `grep` | Print lines matching a pattern | +| `ls` | List directory contents | +| `mv` | Move file to different targets | +| `rm` | Remove files | +| `sort` | Sort lines of text files | +| `wc` | Print the number of new lines, words, and bytes in files | + ### Help Commands - - - - - -
- man - - Displays the manual page of a command with its name, synopsis, description, author, copyright etc. -
+| Command | Description | +|---------|-----------------------------------------------------------------------------------------------------| +| `man` | Displays the manual page of a command with its name, synopsis, description, author, copyright, etc. | + ### Network Commands - - - - - - - - - - - - - -
- hostname - - show or set the system's host name -
- ifconfig - - Display the current configuration of the network interface. It is also useful to get the information about IP address, subnet mask, set remote IP address, netmask etc. -
- ping - - send ICMP ECHO_REQUEST to network hosts, you will get back ICMP packet if the host responds. This command is useful when you are in a doubt whether your computer is connected or not. -
+| Command | Description | +|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `hostname` | Show or set the system's host name | +| `ifconfig` | Display the current configuration of the network interface. It is also useful to get the information about IP address, subnet mask, set remote IP address, netmask, etc. | +| `ping` | Send ICMP ECHO_REQUEST to network hosts. You will get back an ICMP packet if the host responds. This command is useful to check whether your computer is connected or not. | + ### Other Commands - - - - - - - - - - - - - - - - - -
- logname - - Print user's login name -
- quota - - Display disk usage and limits -
- which - - Returns the pathnames of the files that would be executed in the current environment -
- whoami - - Displays the login name of the current effective user -
+| Command | Description | +|-----------|--------------------------------------------------------------------------------------| +| `logname` | Print user's login name | +| `quota` | Display disk usage and limits | +| `which` | Returns the pathnames of the files that would be executed in the current environment | +| `whoami` | Displays the login name of the current effective user | + ### Process Commands - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- & - - In order to execute a command in the background, place an ampersand (&) on the command line at the end of the command. A user job number (placed in brackets) and a system process number are displayed. A system process number is the number by which the system identifies the job whereas a user job number is the number by which the user identifies the job -
- at - - executes commands at a specified time -
- bg - - Places a suspended job in the background -
- crontab - - crontab is a file which contains the schedule of entries to run at specified times -
- fg - - A process running in the background will be processed in the foreground -
- jobs - - Lists the jobs being run in the background -
- kill - - Cancels a job running in the background, it takes argument either the user job number or the system process number -
- ps - - Reports a snapshot of the current processes -
- top - - Display Linux tasks -
+| Command | Description | +|-----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `&` | In order to execute a command in the background, place an ampersand (`&`) at the end of the command line. A user job number (in brackets) and a system process number are displayed. The system process number identifies the job, while the user job number is used by the user. | +| `at` | Executes commands at a specified time | +| `bg` | Places a suspended job in the background | +| `crontab` | A file which contains the schedule of entries to run at specified times | +| `fg` | A process running in the background will be processed in the foreground | +| `jobs` | Lists the jobs being run in the background | +| `kill` | Cancels a job running in the background; it takes either the user job number or the system process number as an argument | +| `ps` | Reports a snapshot of the current processes | +| `top` | Displays Linux tasks | + ### User Account Commands - - - - - -
- chmod - - Modify properties for users -
\ No newline at end of file +| Command | Description | +|---------|------------------------------------| +| `chmod` | Modify properties for users | diff --git a/mkdocs/docs/HPC/web_portal.md b/mkdocs/docs/HPC/web_portal.md index 9c95a20f72d..615a962904a 100644 --- a/mkdocs/docs/HPC/web_portal.md +++ b/mkdocs/docs/HPC/web_portal.md @@ -12,11 +12,7 @@ required to connect to your VSC account via this web portal.\ Please note that we do recommend to use our interactive and debug cluster (see chapter [interactive and debug cluster](./interactive_debug.md)) with `OoD`. -To connect to the HPC-UGent infrastructure via the web portal, visit: - -
- -
+To connect to the HPC-UGent infrastructure via the web portal, visit Note that you may only see a "*Submitting...*" message appear for a couple of seconds, which is perfectly normal. @@ -66,9 +62,7 @@ requested to let the web portal access some of your personal information (VSC login ID, account status, login shell and institute name), as shown in this screenshot below: -
![image](img/ood_permission.png) -
**Please click "Authorize" here.** @@ -79,9 +73,7 @@ afterwards. Once logged in, you should see this start page: -
![image](img/ood_start.png) -
This page includes a menu bar at the top, with buttons on the left providing access to the different features supported by the web portal, @@ -92,9 +84,7 @@ high-level overview of the HPC-UGent Tier-2 clusters. If your browser window is too narrow, the menu is available at the top right through the "hamburger" icon: -
![image](img/ood_hamburger.png) -
## Features @@ -112,9 +102,7 @@ The drop-down menu provides short-cuts to the different `$VSC_*` directories and filesystems you have access to. Selecting one of the directories will open a new browser tab with the *File Explorer*: -
![image](img/ood_file_explorer.png) -
Here you can: @@ -188,9 +176,7 @@ Jobs* menu item under *Jobs*. A new browser tab will be opened that shows all your current queued and/or running jobs: -
![image](img/ood_active_jobs.png) -
You can control which jobs are shown using the *Filter* input area, or select a particular cluster from the drop-down menu *All Clusters*, both @@ -213,9 +199,7 @@ To submit new jobs, you can use the *Job Composer* menu item under *Jobs*. This will open a new browser tab providing an interface to create new jobs: -
![image](img/ood_job_composer.png) -
This extensive interface allows you to create jobs from one of the available templates, or by copying an existing job. @@ -232,9 +216,7 @@ Don't forget to actually submit your job to the system via the green In addition, you can inspect provided job templates, copy them or even create your own templates via the *Templates* button on the top: -
![image](img/ood_job_templates.png) -
### Shell access @@ -242,9 +224,7 @@ Through the *Shell Access* button that is available under the *Clusters* menu item, you can easily open a terminal (shell) session into your VSC account, straight from your browser! -
![image](img/ood_shell.png) -
Using this interface requires being familiar with a Linux shell environment (see @@ -263,9 +243,7 @@ terminal multiplexer tool like `screen` or `tmux`). To create a graphical desktop environment, use on of the *desktop on... node* buttons under *Interactive Apps* menu item. For example: -
![image](img/ood_launch_desktop.png) -
You can either start a desktop environment on a login node for some lightweight tasks, or on a workernode of one of the HPC-UGent Tier-2 @@ -279,58 +257,11 @@ To access the desktop environment, click the *My Interactive Sessions* menu item at the top, and then use the *Launch desktop on \... node* button if the desktop session is *Running*: -
![image](img/ood_desktop_running.png) -
#### Jupyter notebook -Through the web portal you can easily start a [Jupyter -notebook](https://jupyter.org/) on a workernode, via the *Jupyter -Notebook* button under the *Interactive Apps* menu item. - -
-![image](img/ood_start_jupyter.png) -
- -After starting the Jupyter notebook using the *Launch* button, you will -see it being added in state *Queued* in the overview of interactive -sessions (see *My Interactive Sessions* menu item): - -
-![image](img/ood_jupyter_queued.png) -
- -When your job hosting the Jupyter notebook starts running, the status -will first change the *Starting*: - -
-![image](img/ood_jupyter_starting.png) -
- -and eventually the status will change to *Running*, and you will be able -to connect to the Jupyter environment using the blue *Connect to -Jupyter* button: - -
-![image](img/ood_jupyter_running.png) -
- -This will launch the Jupyter environment in a new browser tab, where you -can open an existing notebook by navigating to the directory where it -located and clicking it, or using the *New* menu on the top right: - -
-![image](img/ood_jupyter_new_notebook.png) -
- -Here's an example of a Jupyter notebook in action. Note that several -non-standard Python packages (like *numpy*, *scipy*, *pandas*, -*matplotlib*) are readily available: - -
-![image](img/ood_jupyter_notebook_example.png) -
+See [dedicated page on Jupyter notebooks](../jupyter) ## Restarting your web server in case of problems @@ -340,9 +271,7 @@ web server running in your VSC account. You can do this via the *Restart Web Server* button under the *Help* menu item: -
![image](img/ood_help_restart_web_server.png) -
Of course, this only affects your own web portal session (not those of others). diff --git a/mkdocs/docs/HPC/x2go.md b/mkdocs/docs/HPC/x2go.md index f2daea36ff9..eb9af197d15 100644 --- a/mkdocs/docs/HPC/x2go.md +++ b/mkdocs/docs/HPC/x2go.md @@ -54,9 +54,7 @@ There are two ways to connect to the login node: This is the easier way to setup X2Go, a direct connection to the login node. -
![image](img/ch19-x2go-configuration-gent.png) -
1. Include a session name. This will help you to identify the session @@ -76,9 +74,7 @@ node. 1. Click on the "Use RSA/DSA.." folder icon. This will open a file browser. -
![image](img/ch19-x2go-ssh-key.png) -
{% if OS == (macos or linux) %} 2. You should look for your **private** SSH key generated in [Generating a public/private key pair](../account/#generating-a-publicprivate-key-pair). This file has been stored in the directory "*~/.ssh/*" (by default "**id_rsa**"). @@ -109,9 +105,7 @@ node. copy-pasting support. {% endif %} -
![image](img/ch19-x2go-configuration-xterm.png) -
1. **[optional]:** Change the session icon. @@ -123,9 +117,7 @@ This option is useful if you want to resume a previous session or if you want to set explicitly the login node to use. In this case you should include a few more options. Use the same **Option A** setup but with these changes: -
![image](img/ch19-x2go-configuration-gent-proxy.png) -
1. Include a session name. This will help you to identify the session if you have more than one (in our example "HPC UGent proxy login"). @@ -146,9 +138,7 @@ include a few more options. Use the same **Option A** setup but with these chang did for the server configuration (The "RSA/DSA key" field must be set in both sections) -
![image](img/ch19-x2go-proxy-key.png) -
4. Click the ++"OK"++ button after these changes. @@ -161,9 +151,7 @@ open session or if you click on the "shutdown" button from X2Go. If you want to suspend your session to continue working with it later just click on the "pause" icon. -
![image](img/ch19-x2go-pause.png) -
X2Go will keep the session open for you (but only if the login node is not rebooted). @@ -175,8 +163,9 @@ session, you should know which login node were used at first place. You can get this information before logging out from your X2Go session. Just open a terminal and execute: -
$ hostname
-
+``` +hostname +``` ![image](img/ch19-x2go-xterm.png) diff --git a/mkdocs/docs/HPC/xdmod.md b/mkdocs/docs/HPC/xdmod.md index 725f3aa7996..4c510bae823 100644 --- a/mkdocs/docs/HPC/xdmod.md +++ b/mkdocs/docs/HPC/xdmod.md @@ -4,11 +4,7 @@ The XDMoD web portal provides information about completed jobs, storage usage and the HPC UGent cloud infrastructure usage. To connect to the XDMoD portal, turn on your VPN connection to UGent and -visit - -
- -
+visit . Note that you may need to authorise XDMoD to obtain information from your VSC account through the VSC accountpage. @@ -18,8 +14,5 @@ web application shows you several features through a series of tips. Located in the upper right corner of the web page is the help button, taking you to the XDMoD User Manual. As things may change, we recommend -checking out the provided documenation for information on XDMoD use: - -
- -
+checking out the provided documenation for information on XDMoD use +. diff --git a/mkdocs/docs/macros/firsttimeconnection.md b/mkdocs/docs/macros/firsttimeconnection.md index 22b390a34a5..0e0f3d0ba63 100644 --- a/mkdocs/docs/macros/firsttimeconnection.md +++ b/mkdocs/docs/macros/firsttimeconnection.md @@ -3,7 +3,10 @@ Alert will appear and you will be asked to verify the authenticity of the login node. Make sure the fingerprint in the alert matches one of the following: -
{{ puttyFirstConnect }}
+ +``` +{{ puttyFirstConnect }} +``` If it does, press ***Yes***, if it doesn't, please contact {{ hpcinfo }}. diff --git a/scripts/HPC_chatbot_preprocessor/README.md b/scripts/HPC_chatbot_preprocessor/README.md new file mode 100644 index 00000000000..6cfd9be8231 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/README.md @@ -0,0 +1,196 @@ +# Chatbot parser + +`chatbot_parser.py` is a script that transforms the markdown sourcefiles into a structured directory as input for a chatbot. + +## Usage + +The script can be ran in a shell environment with the following command: + +```shell +python chatbot_parser.py +``` + +This command has the following possible options: + +```shell +chatbot_parser.py [-h] -src SOURCE -dst DESTINATION [-st] [-pl MIN_PARAGRAPH_LENGTH] [-td MAX_TITLE_DEPTH] [-l] [-dd] +``` + +### Options + +#### `h`/`help` + +Display the help message + +#### `src`/`source` + +This is a required option that specifies the source directory of the input files for the script. This location is also used to look for jinja templates when using jinja to parse the source files (such as the `macros` directory within `vsc_user_docs/mkdocs/docs/HPC`). + +#### `dst`/`destination` + +This is a required option that specifies where the output of the script should be written. The script also generates extra intermediate subdirectories, so subdirectories with the following names shouldn't be present in the destination directory: `parsed_mds`, `copies` and `if_mangled_files`. If any of these pose a problem, the name of the intermediate subdirectory used for the script can be changed in the macros at the top of the script. + +#### `st`/`split_on_titles` + +Including this option will split the source files based on the titles and subtitles in the markdown text. Not including this option will split the text on paragraphs with a certain minimum length. + +#### `pl`/`min_paragraph_length` + +This option allows the user to configure the minimum length a paragraph must be. Some deviations from this minimum length are possible (for example at the end of a file). The default value for this minimum paragraph length is 512 tokens. This options only works if `split_on_titles` is not enabled. + +#### `td`/`max_title_depth` + +This option allows the user to configure the maximum "title depth" (the amount of `#` in front) to be used as borders between sections if `split_on_titles` is enabled. The default value is 4. + +#### `l`/`links` + +Some of the sourcefiles might contain links. Including this option will retain the links in the plaintext. If this option is not included, the links will be dropped from the plaintext. + +#### `dd`/`deep_directories` + +Including this option will make the script generate a "deep directory" where every title encountered will be made into a subdirectory of its parent title (So for example a title with three `#`s will be made a subdirectory of the most recent title with two `#`s). This option only works if `split_on_titles` is enabled. + +## Generated file structure + +The generated directory structure is written as a subdirectory of `parsed_mds`. In `parsed_mds`, two subdirectories can be found: + +- `generic` contains the parts of the markdown sources that were non-OS-specific +- `os_specific` contains the parts of the markdown sources that were OS-specific + +Within `os_specific` a further distinction is made for each of the three possible operating systems included in the documentation. + +Both the generic and each of the three os-specific directories then contain a directory for each source file. + +If the option `deep_directories` is not enabled, all paragraphs of the source file and their corresponding metadata will be saved in this directory. The (processed) plaintext of the paragraph is written to a `.txt` file and the metadata is written to a `.json` file. + +If the option `deep_directories` is enabled, the directory of each source file will contain a subdirectory structure corresponding to the structure of the subtitles at different levels in the source file. Each subtitle in the source file corresponds to a directory nested in the directory of its parent title (So for example a title with three `#`s will be made a subdirectory of the most recent title with two `#`s). + +Finally, each of these subtitle-specific subdirectories contains a `.txt` file with the (processed) plaintext of that section and a `.json` file with the metadata of that section. + +## Requirements + +- The required Python packages are listed in `requirements.txt` + +## Restrictions on source-files + +Due to the nature of the script, some restrictions should be taken into account about the markdown files it can use as input. + +### Nested if structures + +The script uses the if-structures in the source-files to split the documentation into general documentation and os-specific documentation. As such it needs to keep track of which types of if-structures (os-related/non-os-related) it is reading from. When using certain nested if-structures, this will cause problems. The supported nested if-structures are determined by the macros `NON_OS_IF`, `NON_OS_IF_IN_OS_IF`, `OS_IF` and `OS_IF_IN_OS_IF`. So respectively a non-os-related if-structure, a non-os-related if nested in an os-related one, an os-related if-structure and an os-related if-structure nested in another os-related if-structure. All of these are allowed to be nested in an undetermined amount of non-os-related if-structures, but no non-os-related if structures should be nested in them. It is also not allowed to nest any of the allowed structures in more os-related if-structures. + +#### Examples of valid and invalid if-structures + +##### Allowed + +###### non-os-related in os-related + +This is an example of one of the basic allowed if-structures (`NON_OS_IF_IN_OS_IF`) + +``` +if OS == windows: + if site == Gent: + ... + endif +endif +``` + +###### os-related in os-related in non-os-related + +This is an example of the basic allowed if-structure `OS_IF_IN_OS_IF` nested in a non-os-specific if. + +``` +if site == Gent: + if OS == windows: + ... + else: + if OS == Linux: + ... + endif + endif +endif +``` + +##### Not allowed + +###### non-os-related in os-related in os-related + +This is an example of a non-os-related if-structure nested in one of the basic allowed if-structures (`OS_IF_IN_OS_IF`). + +``` +if OS != windows: + if OS == Linux: + if site == Gent: + ... + endif + endif +endif +``` + +This will result in the parser "forgetting" it opened an os-specific if-statement with OS != windows and not properly closing it. + +###### os-related in non-os-related in os-related + +This is an example of the basic allowed if-structure `OS_IF` (indirectly) nested in an os-specific if-structure. + +``` +if OS != windows: + if site == Gent: + if OS == Linux: + ... + endif + endif +endif +``` + +This will also result in the parser "forgetting" it opened an os-specific if-statement with OS != windows and not properly closing it. + +### Non OS-related if-statements + +Due to the way jinja parses the sourcefiles, the script slightly alters non os-specific if-statements as well. It expects if-statements of the following form: + +``` +{%- if site == gent %} +{% if site != (gent or brussel) %} +``` + +All spaces and the dash are optional. City names don't need to be fully lowercase since the parser will capitalize them properly anyway. + +### html syntax + +The input shouldn't contain any html syntax. While some failsafes are in place, the script isn't made with the use case of handling html syntax in mind. + +### Comments + +Any comments within the markdown files (for example TODO's) should follow the following syntax: + +``` + +``` + and should be limited to one line. + +Comments can be written in such a way that the script will keep them as input for the bot. To do that, the marker `INPUT_FOR_BOT` should be put in front of the content of the comment as such. + +``` + +``` + +This will be reworked to + +``` +your comment for the bot +``` + +in the final output. + +### Long filepaths + +Due to the nature of this script, it can generate large directories with very long names if `deep_directories` is enabled. Depending on the operating system, this can cause problems with filepaths being to long, resulting in files not being able to open. A possible fix for this is to make sure the filepath to where the script is located is not too long. Another solution is lowering the `max_title_depth` or disabling `deep_directories`. + +### Markdown lists + +The parser is made in a way to detect lists and not split them in multiple paragraphs. The kinds of lists it can detect is all lists with denominators `-`, `+`, `*` and list indexed with numbers or letters (one letter per list entry). It can handle list entries being spread out over multiple lines if there is an indentation of at least two spaces. It can also handle multiple paragraph list entries in this way, as long as the indentation stays. + +### Links + +Part of the metadata of the parser are links. In order for the links to be built up in the right way, links to external sites should always start with either `https://` or `http://`. diff --git a/scripts/HPC_chatbot_preprocessor/chatbot_parser.py b/scripts/HPC_chatbot_preprocessor/chatbot_parser.py new file mode 100644 index 00000000000..9b6e8dc7f2d --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/chatbot_parser.py @@ -0,0 +1,1237 @@ +#!/usr/bin/env python3 + +import argparse +import copy +import json +import os +import re +import shutil +import tiktoken +import yaml +from itertools import chain, tee, zip_longest +from pathlib import Path +from jinja2 import FileSystemLoader, Environment, ChoiceLoader, FunctionLoader, Template + +#################### define macro's #################### +# options +SOURCE_DIRECTORY = "SOURCE_DIRECTORY" +DESTINATION_DIRECTORY = "DESTINATION_DIRECTORY" +SPLIT_ON_TITLES = "SPLIT_ON_TITLES" +MIN_PARAGRAPH_LENGTH = "MIN_PARAGRAPH_LENGTH" +MAX_TITLE_DEPTH = "MAX_TITLE_DEPTH" +INCLUDE_LINKS_IN_PLAINTEXT = "INCLUDE_LINKS_IN_PLAINTEXT" +SPLIT_ON_PARAGRAPHS = "SPLIT_ON_PARAGRAPHS" +DEEP_DIRECTORIES = "DEEP_DIRECTORIES" +VERBOSE = "VERBOSE" + +# directories +PARSED_MDS = "parsed_mds" +COPIES = "copies" +IF_MANGLED_FILES = "if_mangled_files" +LINUX_TUTORIAL = "linux-tutorial" +RETURN_DIR = ".." +MKDOCS_DIR = "mkdocs" +DOCS_DIR = "docs" +HPC_DIR = "HPC" +EXTRA_DIR = "extra" +GENERIC_DIR = "generic" +OS_SPECIFIC_DIR = "os_specific" +MACROS = "macros" + +# OSes +LINUX = "linux" +WINDOWS = "windows" +MACOS = "macos" +GENERIC = "generic" +LINK_OS = {LINUX: "Linux", WINDOWS: "Windows", MACOS: "macOS"} # OS needs different capitalisation for use in links + +# urls +REPO_URL = 'https://github.com/hpcugent/vsc_user_docs' +DOCS_URL = "https://docs.hpc.ugent.be" + +# OS-related if-states +ACTIVE = "active" +INACTIVE = "inactive" + +# if mangler states +NON_OS_IF = 0 +NON_OS_IF_IN_OS_IF = 1 +OS_IF = 2 +OS_IF_IN_OS_IF = 3 + +# if mangler macros +IF_MANGLED_PART = "-if-" + +# actions +DONE = "done" +WRITE_TEXT = "write_text" +CHECK_EXTRA_MESSAGE = "check_extra_message" +WRITE_TEXT_AND_CHECK_EXTRA_MESSAGE = "write_text_and_check_extra_message" + +# Metadata attributes +SOURCE_FILE = "source_file" +MAIN_TITLE = "main_title" +SUBTITLE = "subtitle" +TITLE_DEPTH = "title_depth" +DIRECTORY = "directory" +LINKS = "links" +PARENT_TITLE = "parent_title" +PREVIOUS_SUBTITLE = "previous_title" +NEXT_SUBTITLE = "next_title" +METADATA_OS = "OS" +REFERENCE_LINK = "reference_link" + +# if-structure components +IF = "if" +ELSE = "else" +ENDIF = "endif" + +# link indicator +LINK_MARKER = r'§link§link§' + +# HTML tags +HTML_TAGS = ["pre", "b", "code", "sub", "br", "center", "p", "div", "u", "p", "i", "tt", "a", "t", "span"] # make sure these are always lowercase + +# regex patterns +IF_MANGLED_PATTERNS = { + IF: r'({' + IF_MANGLED_PART + r'%[-\s]*if\s+OS\s*[!=]=\s*.+?[-\s]*%' + IF_MANGLED_PART + '})', + ELSE: r'({' + IF_MANGLED_PART + r'%\s*-?\s*else\s*-?\s*%' + IF_MANGLED_PART + '})', + ENDIF: r'({' + IF_MANGLED_PART + r'%\s*-?\s*endif\s*-?\s*%' + IF_MANGLED_PART + '})' + } + +# filenames (and parts of filenames) +TEMP_JINJA_FILE = "jinja_file.txt" +_PARAGRAPH_ = "_paragraph_" +METADATA_EXTENSION = "_metadata" + +# Marker for comments for the bot +INPUT_FOR_BOT = "INPUT_FOR_BOT: " + +# Standard strings for verbose output +LINE = "------------------------------------------------------------------------------------------------------\n" + + +################### define functions ################### + +def check_for_title(line, in_code_block, curr_dirs, options): + """ + function that checks for titles in the current line. Used by split_text to split the text among the subtitles + + :param line: the current line to be checked for a title + :param in_code_block: boolean indicating whether the current line is part of a codeblock to be sure comments aren't counted as titles + :param curr_dirs: the current working directories for each level of subtitle, to be updated when a new title is found + :param options: dictionary containing the options given by the user + :return title_length: The amount of hashtags in front of the title on the current line + """ + # detect titles + match = re.match(r'^#+ ', line) + if match and len(match.group(0)) <= options[MAX_TITLE_DEPTH] + 1 and not in_code_block: + title_length = len(match.group(0)) - 1 + if options[DEEP_DIRECTORIES]: + curr_dirs[title_length] = os.path.join(curr_dirs[title_length - 1], make_valid_title(line[title_length + 1:-1].replace(' ', '-'))) + + # update the higher order current directories + for i in range(title_length + 1, options[MAX_TITLE_DEPTH] + 1): + curr_dirs[i] = curr_dirs[title_length] + + return title_length + else: + return 0 + + +def make_valid_link(link, main_title, is_linux_tutorial): + """ + Function that converts a string to a valid link to be used in the metadata + + :param link: the input string to be turned into a valid link + :param main_title: the main title of the file that contains the link + :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial + :return link: the valid link + """ + + # ugly fix for problem with links + linux_tutorial_files = ["beyond_the_basics", "common_pitfalls", "getting_started", "hpc_infrastructure", "index", "manipulating_files_and_directories", "navigating", "uploading_files"] + if is_linux_tutorial and any([linux_tutorial_files[i] in link for i in range(len(linux_tutorial_files))]): + linux_part = LINUX_TUTORIAL + '/' + else: + linux_part = "" + + if link.startswith('http://') or link.startswith('https://') or link.startswith('mailto:'): + pass + else: + if link.startswith("./"): + link = link.replace('./', '') + elif link.startswith("../"): + link = link.replace('../', '') + + if link.startswith("#"): + link = DOCS_URL + '/' + linux_part + main_title.replace(".md", "") + "/" + link + elif link.endswith(".md") and ("/" not in link or "." not in link.split("/")[0]): + link = DOCS_URL + '/' + linux_part + link.replace(".md", "") + elif '.md#' in link: + link = DOCS_URL + '/' + linux_part + link.replace(".md", "/") + else: + link = DOCS_URL + '/' + linux_part + link + + link = link.replace('index/', '').replace('/index', '') + + return link + + +def replace_markdown_markers(curr_line, linklist, in_code_block, main_title, is_linux_tutorial): + """ + function that replaces certain markdown structures with the equivalent used on the website + + :param curr_line: the current line on which markdown structures need to be replaced + :param linklist: the list used to store links that need to be printed at the end of the file + :param in_code_block: boolean indicating whether the current line is part of a code block + :param main_title: the main title of the file that is being processed + :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial + :return curr_line: the adapted current line + :return linklist: the updated linklist + """ + + # replace images with an empty line + if re.search(r'(?i)!\[image]\(.*?\)', curr_line) or re.search(r'!\[.*?]\(img/.*?\.png\)', curr_line): + curr_line = "" + + # replace links with a reference + matches = re.findall(r'\[(.*?)]\((.*?)\)', curr_line) + if matches: + for match in matches: + curr_line = curr_line.replace(f"[{match[0]}]({match[1]})", match[0] + LINK_MARKER + str(len(linklist)) + LINK_MARKER) + + linklist.append(make_valid_link(match[1], main_title, is_linux_tutorial)) + + # codeblock (with ``` -> always stands on a separate line, so line can be dropped) + if '```' in curr_line: + curr_line = "" + + # structures within <> + match = re.findall(r'<(.*?)>', curr_line) + if match: + for i, content in enumerate(match): + html_tags_variations = list(chain.from_iterable([[element, element + "/", "/" + element] for element in HTML_TAGS])) + html_tags_style = [element + " style=.*" for element in HTML_TAGS] + + # add references for every link of format + if re.search(r'a href=.*', content): + link = content[7:] + curr_line = re.sub(f'<{content}>', LINK_MARKER + str(len(linklist)) + LINK_MARKER, curr_line) + linklist.append(link) + + # drop the syntax words + elif content.lower() in html_tags_variations: + curr_line = re.sub(f'<{content}>', "", curr_line) + + # drop the version of the HTML_TAGS followed by " style=" + elif any(re.match(pattern, content) for pattern in html_tags_style): + curr_line = re.sub(r'<.*?>', "", curr_line) + + # keep comments for bot + elif re.fullmatch(r'!--' + INPUT_FOR_BOT + r'.*?--', content): + curr_line = re.sub(r'', lambda m: m.group(1), curr_line) + + # drop comments + elif re.fullmatch(r'!--.*?--', content): + curr_line = re.sub(r'<.*?>', "", curr_line) + + # drop the <> around links + elif re.match(r'http://', content) or re.match(r'https://', content): + curr_line = re.sub(r'<' + content + '>', content, curr_line ) + + # keep the rest + else: + pass + + # structures with !!! (info, tips, warnings) + if '!!!' in curr_line: + curr_line = re.sub(r'!!!', "", curr_line) + + # structures with ??? (collapsable admonitions) + if '???' in curr_line: + curr_line = re.sub(r'\?\?\?', "", curr_line) + + # get rid of other indicators (`, *, +, _) + if not in_code_block: + + backquotes = re.findall(r'`(.*?)`', curr_line) + if backquotes: + for i, content in enumerate(backquotes): + curr_line = curr_line.replace(f"`{content}`", content) + + asterisks = re.findall(r'(?' in line) ^ ('
' in line)): + in_code_block = not in_code_block + if options[VERBOSE]: + if in_code_block: + print("Detected start of a codeblock, not registering titles") + else: + print("Detected end of codeblock, registering titles again") + + # only split up if current line is in a fully non-os-specific section + if in_if_statement == 0: + + title_level = check_for_title(line, in_code_block, curr_dirs, options) + + # line is a title with a maximum depth of 4 + if title_level > 0: + if after_first_title: + + # write text of previous file + if previous_contained_if: + paragraphs_os_text[title] = current_paragraph + if options[VERBOSE]: + print("Saved os-specific chunk with temporary title: " + title + "\n") + else: + paragraphs_os_free_text[title] = current_paragraph + if options[VERBOSE]: + print("Saved generic chunk with title: " + title + "\n") + + # write metadata of previous file + paragraphs_metadata[title] = write_metadata(main_title, title, link_list, last_title_level, last_dir, options[SOURCE_DIRECTORY] + '/' + main_title + '.md') + + # make a new title + title = make_valid_title(line[title_level + 1:-1]) + + # create an entry for the file in the paragraphs text dictionary + current_paragraph = "" + + after_first_title = True + subtitle_order.append(title) + + # reset link_list + link_list = [] + + previous_contained_if = False + + # line is not a title + elif after_first_title: + line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) + if line != "\n": + current_paragraph += line + + # keep track of title level and directory to write to metadata upon discovering a new subtitle + if title_level > 0: + last_title_level = title_level + last_dir = curr_dirs[last_title_level] + else: + previous_contained_if = True + line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) + if line != "\n": + current_paragraph += line + + # write dictionaries for the last file + if previous_contained_if: + paragraphs_os_text[title] = current_paragraph + if options[VERBOSE]: + print("Saved os-specific chunk with temporary title: " + title + "\n") + else: + paragraphs_os_free_text[title] = current_paragraph + if options[VERBOSE]: + print("Saved generic chunk with title: " + title + "\n") + paragraphs_metadata[title] = write_metadata(main_title, title, link_list, last_title_level, curr_dirs[last_title_level], options[SOURCE_DIRECTORY] + '/' + main_title + '.md') + + return paragraphs_os_text, paragraphs_os_free_text, paragraphs_metadata, subtitle_order + + +def split_on_paragraphs(file, main_title, options, is_linux_tutorial, current_paragraph_number=-1, OS=GENERIC): + """ + Function that splits the text into smaller sections based on the paragraph structure and makes them into two dictionaries containing text and metadata + + :param file: the filepath of the file to be split + :param main_title: the main title of the file + :param options: dictionary containing the options given by the user + :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial + :param current_paragraph_number: number of the paragraph that is being split, only applicable when splitting an os-specific paragraph + :param OS: the OS of the file to be split, only applicable when splitting an os-specific paragraph + :return paragraphs_text: dictionary containing the split sections of text + :return paragraphs_metadata: dictionary containing the metadata of each split section of text + :return subtitle_order: list containing all encountered subtitles in order of appearance + """ + + if options[VERBOSE]: + print("Splitting on paragraphs\n") + + # start of assuming we are not in a code_block + in_code_block = False + + # define initial dictionaries + paragraphs_os_free_text = {} + paragraphs_os_text = {} + paragraphs_metadata = {} + + # variable to keep track of the current paragraph + current_paragraph = "" + + # list to keep track of links in the text + link_list = [] + + # list to keep track of the order of the subtitles + subtitle_order = [] + + # variable to keep track of how many if-statements deep the current line is + in_if_statement = 0 + + # variable to indicate that previous section was one with if-statements + previous_contained_if = False + + # variable to indicate that the previous line was part of a list + in_list = False + + # paragraph number to add to title + paragraph_number = 1 + + # metadata title + metadata_title = main_title + + # define metadata data if split occurs on paragraphs and last_title and title_level are known (will be replaced later on in the process) + if current_paragraph_number != -1: + last_title_level = 4 + last_dir = "PLACEHOLDER" + + # list to keep track of most recent directories on each title level + curr_dirs = [main_title for _ in range(options[MAX_TITLE_DEPTH] + 1)] + + with open(file, 'r') as readfile: + + # Create two independent iterators from the original file iterator (needed to check for lists) + current_line, next_line = tee(readfile) + + # Advance the next_line iterator by one step, so it is always one step ahead + next(next_line, None) + + # Process the lines + for line, nxt in zip_longest(current_line, next_line, fillvalue=""): + + # detect if-statements starting or ending on the current line + in_if_statement += len(re.findall(IF_MANGLED_PATTERNS[IF], line)) - len( + re.findall(IF_MANGLED_PATTERNS[ENDIF], line)) + + # detect whether the current line is in a list + if re.search(r'^(\s*)([*+-]|\d+\.|[a-zA-Z]\.)\s+.*$', line): # beginning of a list entry + in_list = True + if options[VERBOSE]: + print("First line of new list entry found, not starting new paragraphs: " + line[:-1]) + elif re.search(r'^\s{2,}.+$', line) and in_list: # middle of a list entry + pass + elif re.search(r'^(\s*)([*+-]|\d+\.|[a-zA-Z]\.)\s+.*$|^\s{2,}.+$|^\n', nxt) and in_list: # line(s) between list entries + pass + elif re.search(r'^(\s*)([*+-]|\d+\.|[a-zA-Z]\.)\s+.*$', nxt): + in_list = True + elif in_list: + if options[VERBOSE]: + print("List ended, starting new paragraphs again") + in_list = False + else: + in_list = False + + # detect codeblocks to make sure titles aren't detected in them + if '```' in line or (('
' in line) ^ ('
' in line)): + in_code_block = not in_code_block + if options[VERBOSE]: + if in_code_block: + print("Detected start of a codeblock, not starting new paragraphs") + else: + print("Detected end of codeblock, starting new paragraphs again") + + # only split up if current line is in a fully non-os-specific section + if in_if_statement == 0: + + title_level = check_for_title(line, in_code_block, curr_dirs, options) + + # check whether a new paragraph should be started + if line == "\n" and paragraph_long_enough(re.sub(r'\{' + IF_MANGLED_PART + '%.*?%' + IF_MANGLED_PART + '}', "", current_paragraph), options) and not in_code_block and not in_list: + + # create a title for the previous paragraph + if current_paragraph_number == -1: + paragraph_title = main_title + _PARAGRAPH_ + f"{paragraph_number:03}" + else: + paragraph_title = main_title + "_" + OS + _PARAGRAPH_ + f"{current_paragraph_number:03}.{paragraph_number:03}" + paragraph_number += 1 + + # write text of previous file + if previous_contained_if: + paragraphs_os_text[paragraph_title] = current_paragraph + if options[VERBOSE]: + print("Saved os-specific chunk with temporary title: " + paragraph_title + "\n") + else: + paragraphs_os_free_text[paragraph_title] = current_paragraph + if options[VERBOSE]: + print("Saved generic chunk with title: " + paragraph_title + "\n") + + # write metadata of previous file + paragraphs_metadata[paragraph_title] = write_metadata(main_title, metadata_title, link_list, last_title_level, last_dir, source_file=options[SOURCE_DIRECTORY] + '/' + main_title + '.md') + subtitle_order.append(paragraph_title) + + # reset the current paragraph + current_paragraph = "" + + # reset link_list + link_list = [] + + previous_contained_if = False + + # line is a title with a maximum depth of 4 + elif title_level > 0: + + # make a new title + metadata_title = make_valid_title(line[title_level + 1:-1]) + + line, link_list = replace_markdown_markers(line[title_level + 1:], link_list, in_code_block, main_title, is_linux_tutorial) + current_paragraph += line + + # line is not a title or the beginning of a new paragraph + elif line != "\n" or previous_contained_if: + line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) + current_paragraph += line + + # keep track of title level and directory to write to metadata upon discovering a new subtitle + if title_level > 0: + last_title_level = title_level + last_dir = curr_dirs[last_title_level] + else: + previous_contained_if = True + line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) + current_paragraph += line + + # create a title for the last paragraph + if current_paragraph_number == -1: + paragraph_title = main_title + _PARAGRAPH_ + f"{paragraph_number:03}" + else: + paragraph_title = main_title + "_" + OS + _PARAGRAPH_ + f"{current_paragraph_number:03}.{paragraph_number:03}" + + # write dictionaries for the last file + if previous_contained_if: + paragraphs_os_text[paragraph_title] = current_paragraph + if options[VERBOSE]: + print("Saved os-specific chunk with temporary title: " + paragraph_title + "\n") + else: + paragraphs_os_free_text[paragraph_title] = current_paragraph + if options[VERBOSE]: + print("Saved generic chunk with title: " + paragraph_title + "\n") + paragraphs_metadata[paragraph_title] = write_metadata(main_title, metadata_title, link_list, last_title_level, curr_dirs[last_title_level], source_file=options[SOURCE_DIRECTORY] + '/' + main_title + '.md') + subtitle_order.append(paragraph_title) + + return paragraphs_os_text, paragraphs_os_free_text, paragraphs_metadata, subtitle_order + + +def paragraph_long_enough(paragraph, options): + """ + Function that checks if the paragraph is long enough to be split of + + :param paragraph: current paragraph + :param options: dictionary containing the options given by the user + :return: + """ + encoding = tiktoken.get_encoding("cl100k_base") + token_amount = len(encoding.encode(paragraph)) + + return token_amount >= options[MIN_PARAGRAPH_LENGTH] + + +def write_metadata(main_title, subtitle, links, title_level, directory, source_file): + """ + Function that writes metadata about a text section to a dictionary + + :param main_title: The main title of the file containing the section + :param subtitle: the title of the section + :param links: a list of links contained within the section + :param title_level: the depth of the title of the section + :param directory: the directory where the section will eventually be written (can either be generic or os-specific) + :param source_file: the source file that the section originates from + :return paragraph_metadata: dictionary containing the metadata about the section + """ + + paragraph_metadata = {MAIN_TITLE: main_title, SUBTITLE: subtitle, SOURCE_FILE: source_file, TITLE_DEPTH: title_level, DIRECTORY: Path(directory).as_posix()} + + if len(links) > 0: + paragraph_metadata[LINKS] = {} + for i, link in enumerate(links): + paragraph_metadata[LINKS][str(i)] = link + + paragraph_metadata[PARENT_TITLE] = Path(directory).parent.name + + return paragraph_metadata + + +def jinja_parser(filename, copy_location, options): + """ + function that let's jinja do its thing to format the files except for the os-related if-statements + + :param filename: the name of the file that needs to be formatted using jinja + :param copy_location: the location of the file that needs to be formatted using jinja + :param options: dictionary containing the options given by the user + :return: + """ + # YAML file location + yml_file_path = os.path.join(RETURN_DIR, RETURN_DIR, MKDOCS_DIR, EXTRA_DIR, 'gent.yml') + + if options[VERBOSE]: + print("Reading YAML file from location: " + yml_file_path) + + # Read the YAML file + with open(yml_file_path, 'r') as yml_file: + words_dict = yaml.safe_load(yml_file) + + # ugly fix for index.md error that occurs because of the macro "config.repo_url" in mkdocs/docs/HPC/index.md + additional_context = { + 'config': { + 'repo_url': REPO_URL + } + } + combined_context = {**words_dict, **additional_context} + + if options[VERBOSE]: + print("Mangling OS-specific if-statements") + + # Mangle the OS-related if-statements + mangle_ifs(copy_location, filename, options) + + if options[VERBOSE]: + print("Altering other if-statements to parse properly") + + # Alter the other if-statements + alter_ifs(filename, options) + + # Use Jinja2 to replace the macros + template_loader = ChoiceLoader([FileSystemLoader(searchpath=[os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES), options[SOURCE_DIRECTORY], os.path.join(options[SOURCE_DIRECTORY], RETURN_DIR)]), FunctionLoader(load_macros)]) + templateEnv = Environment(loader=template_loader) + template = templateEnv.get_template(filename) + rendered_content = template.render(combined_context) + + if options[VERBOSE]: + print("jinja parsing finished\nWriting jinja-parsed file to location: " + copy_location) + + # Save the rendered content to a new file + with open(copy_location, 'w', encoding='utf-8', errors='ignore') as output_file: + output_file.write(rendered_content) + + +def load_macros(name): + """ + function used by the jinja FunctionLoader to retrieve templates from the macros folder since the normal FileSystemLoader can't locate them properly + + :param name: name of the package + :return: + """ + + macros_location = os.path.join(RETURN_DIR, RETURN_DIR, MKDOCS_DIR, DOCS_DIR, MACROS) + + if "../" + MACROS + "/" in name: + package_name = name.split("../" + MACROS + "/")[1] + file_location = os.path.join(macros_location, package_name) + + with open(file_location, 'r') as readfile: + return readfile.read() + + +def mangle_os_ifs(line, is_os, options): + """ + function that mangles the os-related if-statements. This is needed because we want to keep these if-statements intact after jinja-parsing to build the directory structure. + We don't want to mangle all if-related statements (such as else and endif) so we need to keep track of the context of the last few if-statements. + + :param line: the current line to check for os-related if-statements + :param is_os: variable keep track of the current os-state of the if-statements. Can be NON_OS_IF, NON_OS_IF_IN_OS_IF, OS_IF or OS_IF_IN_OS_IF + NON_OS_IF: not in an os-if + NON_OS_IF_IN_OS_IF: in a non-os-if nested in an os-if + OS_IF: in an os-if + OS_IF_IN_OS_IF: in an os-if nested in an os-if + :param options: dictionary containing the options given by the user + :return line: the modified line with mangled os-related if-statements + """ + + match = re.search(r'\{%(.*?)%}(.*)', line) + + start_index = 0 + added_length = 0 + + while match: + + constr_match = re.search(r'\{%.*?%}', match.string) + if_match = re.search(r'if ', match.group(1)) + if_os_match = re.search(r'if OS', match.group(1)) + endif_match = re.search(r'endif', match.group(1)) + else_match = re.search(r'else', match.group(1)) + + # mangle positions + pos_first_mangle = constr_match.start() + start_index + added_length + 1 + pos_second_mangle = constr_match.end() + start_index + added_length - 1 + + # different parts of the original string + part_before_mangling = line[:pos_first_mangle] + part_between_mangling = line[pos_first_mangle:pos_second_mangle] + part_after_mangling = line[pos_second_mangle:] + + # this logic isn't flawless, there are number of nested if-constructions that are technically possible that would break this logic, but these don't appear in the documentation as it doesn't make sense to have these + if endif_match: + if is_os in (OS_IF, OS_IF_IN_OS_IF): + if options[VERBOSE]: + print("OS-specific endif statement found in line: " + line[:-1]) + line = part_before_mangling + IF_MANGLED_PART + part_between_mangling + IF_MANGLED_PART + part_after_mangling + added_length += 2 * len(IF_MANGLED_PART) + if is_os == OS_IF: + is_os = NON_OS_IF + elif is_os == OS_IF_IN_OS_IF: + is_os = OS_IF + elif is_os == NON_OS_IF_IN_OS_IF: + is_os = OS_IF + + elif if_match: + if if_os_match: + if options[VERBOSE]: + print("OS-specific if statement found in line: " + line[:-1]) + line = part_before_mangling + IF_MANGLED_PART + part_between_mangling + IF_MANGLED_PART + part_after_mangling + added_length += 2 * len(IF_MANGLED_PART) + if is_os == OS_IF: + is_os = OS_IF_IN_OS_IF + else: + is_os = OS_IF + else: + if is_os == OS_IF: + is_os = NON_OS_IF_IN_OS_IF + else: + is_os = NON_OS_IF + + elif else_match: + if is_os in (OS_IF, OS_IF_IN_OS_IF): + if options[VERBOSE]: + print("OS-specific else statement found in line: " + line[:-1]) + line = part_before_mangling + IF_MANGLED_PART + part_between_mangling + IF_MANGLED_PART + part_after_mangling + added_length += 2 * len(IF_MANGLED_PART) + + start_index += constr_match.end() + match = re.search(r'\{%(.*?)%}(.*)', match.group(2)) + return line, is_os + + +def mangle_ifs(directory, filename, options): + """ + function that writes the if-mangled version of a file to a location where the jinja parser will use it + + :param directory: the directory of the file to be if mangled + :param filename: the filename of the file to be mangled + :param options: dictionary containing the options given by the user + :return: + """ + # variable to keep track of latest if-statement scope + is_os = NON_OS_IF + + with open(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES, filename), 'w') as write_file: + with open(directory, 'r') as read_file: + for line in read_file: + new_line, is_os = mangle_os_ifs(line, is_os, options) + write_file.write(new_line) + + +def alter_ifs(filename, options): + """ + Function that further adapts the if-statements in a file and writes it to a location where the jinja parser will use it. + This is because the jinja parser doesn't seem to be able to handle statements like {% site == gent %} with context {'site': 'Gent'} in this case. + These statements get changed to {% site == 'Gent' %} in this function. + + :param filename: the filename of the file to be transformed + :param options: dictionary containing the options given by the user + :return: + """ + + with open(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES, filename), 'r') as read_file: + content = read_file.read() + + pattern = r'(\{%-?\s?[a-zA-Z\s]*?[!=]=\s?\(?)([a-zA-Z\s]+(?:\sor\s[a-zA-Z\s]+)*)(\)?\s?%})' + content = re.sub(pattern, + lambda match: (f"{match.group(1)}" + + " or ".join([f"'{city.strip().capitalize()}'" for city in match.group(2).split(" or ")]) + + f"{match.group(3)}" + ), + content) + + with open(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES, filename), 'w') as write_file: + write_file.write(content) + + +def make_valid_title(title): + """ + function that makes sure all titles can be used as valid filenames + + :param title: the string that will be used as title and filename + :return valid_filename: the adapted title that can be used as filename + """ + # Define a regex pattern for invalid characters on both Windows and Linux + invalid_chars = r'[<>:"/\\|?*\0]' + + # get rid of extra information between {} brackets + title = re.sub(r'\{.*?}', '', title) + + # Remove invalid characters + valid_filename = re.sub(invalid_chars, '', title) + + # Strip leading/trailing whitespace + valid_filename = valid_filename.strip().strip('-').replace(' ', '-').replace("--", "-") + + return valid_filename + + +def write_generic_file(title, paragraphs_text, paragraphs_metadata, title_order, title_order_number, options, is_linux_tutorial): + """ + Function that writes text and metadata of a generic (non-os-specific) file + + :param title: title of section + :param paragraphs_text: dictionary containing all paragraphs of text + :param paragraphs_metadata: dictionary containing the metadata for all paragraphs of text + :param title_order: list containing all subtitles in order + :param title_order_number: order number of the title of the section that is being written + :param options: dictionary containing the options given by the user + :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial + :return: + """ + + if len(paragraphs_text[title]) > 0: + # make the directory needed for the files that will be written + filepath = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, GENERIC_DIR, paragraphs_metadata[title][DIRECTORY]) + os.makedirs(filepath, exist_ok=True) + + if options[VERBOSE]: + print("Writing generic section " + title + " to filepath: " + str(filepath)) + + write_files(title, paragraphs_text[title], paragraphs_metadata, title_order, title_order_number, filepath, GENERIC, options, is_linux_tutorial) + else: + # don't write empty files + pass + + +def write_files(title, text, paragraphs_metadata, title_order, title_order_number, filepath, OS, options, is_linux_tutorial): + """ + Function to write files to a certain filepath + + :param title: title of the section to be written + :param text: section of text to be written + :param paragraphs_metadata: dictionary containing the metadata for all paragraphs of text + :param title_order: list containing all subtitles in order + :param title_order_number: order number of the title of the section that is being written + :param filepath: filepath to write files to + :param OS: OS to be included in the metadata + :param options: dictionary containing the options given by the user + :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial + :return: + """ + + metadata = copy.deepcopy(paragraphs_metadata[title]) + + file_title = title + + # write text file + with open(os.path.join(filepath, file_title + ".txt"), 'w') as writefile: + if LINKS in paragraphs_metadata[title].keys(): + adapted_text, metadata[LINKS] = insert_links(text, metadata[LINKS], options) + writefile.write(adapted_text) + else: + writefile.write(text) + + # write metadata + # check if links in metadata is not empty + if LINKS in metadata.keys() and len(metadata[LINKS].keys()) == 0: + del metadata[LINKS] + + # add previous subtitle + if title_order_number != 0: + metadata[PREVIOUS_SUBTITLE] = title_order[title_order_number - 1] + else: + metadata[PREVIOUS_SUBTITLE] = None + + # add next subtitle + if title_order_number != len(title_order) - 1: + metadata[NEXT_SUBTITLE] = title_order[title_order_number + 1] + else: + metadata[NEXT_SUBTITLE] = None + + # add OS + metadata[METADATA_OS] = OS + + # add reference link + if is_linux_tutorial: + linux_part = LINUX_TUTORIAL + "/" + else: + linux_part = "" + if OS == GENERIC: + os_part = "" + else: + os_part = LINK_OS[OS] + "/" + if "index" not in paragraphs_metadata[title][MAIN_TITLE]: + metadata[REFERENCE_LINK] = DOCS_URL + "/" + os_part + linux_part + paragraphs_metadata[title][MAIN_TITLE] + "/#" + ''.join(char.lower() for char in paragraphs_metadata[title][SUBTITLE] if char.isalnum() or char == '-').strip('-') + else: + metadata[REFERENCE_LINK] = DOCS_URL + + # write metadata to file + with open(os.path.join(filepath, file_title + METADATA_EXTENSION + ".json"), 'w') as writefile: + json.dump(metadata, writefile, indent=4) + + +def insert_links(text, links, options): + """ + Function that inserts links in the plaintext or takes out the references to the links depending on the value of INCLUDE_LINKS_IN_PLAINTEXT + + :param text: The plaintext that needs to be adapted + :param links: The links that might need to be inserted + :param options: dictionary containing the options given by the user + :return text: The adapted plaintext + :return links: The links that were actually present in the text + """ + + present_links = [] + new_links = {} + for link_number in re.finditer(LINK_MARKER + r'([0-9]*?)' + LINK_MARKER, text): + present_links.append(link_number.group(1)) + if options[INCLUDE_LINKS_IN_PLAINTEXT]: + text = re.sub(LINK_MARKER + link_number.group(1) + LINK_MARKER, " " + links[link_number.group(1)] + " ", text) + else: + text = re.sub(LINK_MARKER + link_number.group(1) + LINK_MARKER, "", text) + + for link_number in links.keys(): + if link_number in present_links: + new_links[str(len(new_links.keys()))] = links[link_number] + + return text, new_links + + +def split_and_write_os_specific_section(text, metadata, subtitle_order, title_order_number, all_metadata, options, is_linux_tutorial): + """ + Function that splits os-specific sections into subtitles, parses them using jinja and writes them away + + :param text: full os specific section + :param metadata: metadata generated for the full os specific section + :param subtitle_order: order of the subtitles generated by the splitter + :param title_order_number: order number of the section + :param all_metadata: all metadata generated by the splitter + :param options: dictionary containing the options given by the user + :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial + :return: + """ + + # Unmangle if's to use jinja parser + text = re.sub(IF_MANGLED_PART, "", text) + + for OS in [LINUX, WINDOWS, MACOS]: + + # slightly alter if-statements to be able to use predefined macros + text = re.sub(OS, '"' + OS + '"', text) + + # Use jinja to render a different version of the text for each OS + template = Template(text) + jinja_text = template.render(OS=OS) + + if len(jinja_text) != 0: + + # add first subtitle in front of section again + if options[SPLIT_ON_TITLES] or metadata[SUBTITLE] not in make_valid_title(jinja_text[:len(metadata[SUBTITLE]) + 1]): + jinja_text = "#" * metadata[TITLE_DEPTH] + " " + metadata[SUBTITLE].replace("-", " ") + "\n" + jinja_text + else: + jinja_text = "#" * metadata[TITLE_DEPTH] + " " + jinja_text + + # re-adjust text to correct overcorrections + jinja_text = re.sub('"' + OS + '"', OS, jinja_text) + + with open(TEMP_JINJA_FILE, 'w') as writefile: + writefile.write(jinja_text) + + # split in right way + _, os_specific_text, os_specific_metadata, os_subtitle_order = split_text(TEMP_JINJA_FILE, metadata[MAIN_TITLE], options, is_linux_tutorial, current_paragraph_number=subtitle_order[title_order_number].split('_')[-1], OS=OS) + + # prepare variables to fix metadata + total_subtitle_order = subtitle_order[:title_order_number] + os_subtitle_order + subtitle_order[title_order_number+1:] + all_metadata.update(os_specific_metadata) + + # write to files + for os_i, os_subtitle in enumerate(os_subtitle_order): + # check that file actually has some content + if len(os_specific_text[os_subtitle]) > 0: + # add the links to the metadata + if LINKS in metadata.keys(): + os_specific_metadata[os_subtitle][LINKS] = metadata[LINKS] + + # fix parent in the metadata + parent_i = 0 + parent_depth = os_specific_metadata[os_subtitle][TITLE_DEPTH] - 1 + parent = os_specific_metadata[os_subtitle][MAIN_TITLE] + + while total_subtitle_order[parent_i] != os_subtitle and parent_i != len(total_subtitle_order): + if all_metadata[total_subtitle_order[parent_i]][TITLE_DEPTH] == parent_depth: + parent = total_subtitle_order[parent_i] + parent_i += 1 + + if options[SPLIT_ON_PARAGRAPHS] and parent != os_specific_metadata[os_subtitle][MAIN_TITLE]: + os_specific_metadata[os_subtitle][PARENT_TITLE] = all_metadata[parent][SUBTITLE] + else: + os_specific_metadata[os_subtitle][PARENT_TITLE] = parent + + # fix directory in the metadata if needed + if options[DEEP_DIRECTORIES]: + if parent == os_specific_metadata[os_subtitle][MAIN_TITLE]: + os_specific_metadata[os_subtitle][DIRECTORY] = os.path.join(parent, os_specific_metadata[os_subtitle][SUBTITLE]) + else: + os_specific_metadata[os_subtitle][DIRECTORY] = os.path.join(all_metadata[parent][DIRECTORY], os_specific_metadata[os_subtitle][SUBTITLE]) + os_specific_metadata[os_subtitle][DIRECTORY] = Path(os_specific_metadata[os_subtitle][DIRECTORY]).as_posix() + + # make a directory to save the files + filepath = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, OS_SPECIFIC_DIR, OS, os_specific_metadata[os_subtitle][DIRECTORY]) + os.makedirs(filepath, exist_ok=True) + + if options[VERBOSE]: + print("Writing os-specific section " + os_subtitle + " to filepath: " + str(filepath)) + + # write to files + write_files(os_subtitle, os_specific_text[os_subtitle], os_specific_metadata, total_subtitle_order, os_i + title_order_number, filepath, OS, options, is_linux_tutorial) + else: + # don't write empty files + pass + else: + # don't split empty texts + pass + + +def main(options): + """ + main function + + :param options: dictionary containing the options specified by the user to run the script: + {SOURCE_DIRECTORY: The source directory where the original files are located, + DESTINATION_DIRECTORY: The destination directory where the processed files should be written to, + SPLIT_ON_TITLES: boolean indicating whether to split on titles, + SPLIT_ON_PARAGRAPHS: boolean indicating whether to split on paragraphs (should always be the opposite of SPLIT_ON_TITLES), + MIN_PARAGRAPH_LENGTH: integer representing the minimum length of a paragraph, + MAX_TITLE_DEPTH: integer representing the maximum depth of a title for it to be used when splitting the text, + INCLUDE_LINKS_IN_PLAINTEXT: boolean indicating whether links should be included in the plaintext, + DEEP_DIRECTORIES: boolean indicating whether the generated directories should be nested by title-structure or not, + VERBOSE: enable or disable verbose mode} + :return: + """ + + if options[VERBOSE]: + print("Running chatbot parser with options: " + str(options)) + + if options[DEEP_DIRECTORIES] and options[VERBOSE]: + print("WARNING: This script generates a file structure that contains rather long filepaths. Depending on where the script is ran, some of these paths might exceed the maximum length allowed by the system resulting in problems opening the files.") + + # remove the directories from a previous run of the parser if they weren't cleaned up properly for some reason + shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS), ignore_errors=True) + shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], COPIES), ignore_errors=True) + shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES), ignore_errors=True) + + # make the necessary directories + for directory in [COPIES, PARSED_MDS, IF_MANGLED_FILES]: + directory = os.path.join(options[DESTINATION_DIRECTORY], directory) + if not os.path.exists(directory): + os.makedirs(directory) + + ################### define loop-invariant variables ################### + + # constant that keeps track of the source directory + source_directory = options[SOURCE_DIRECTORY] + + # list of all the filenames + filenames = {} + all_items = os.listdir(source_directory) + files = [f for f in all_items if os.path.isfile(os.path.join(source_directory, f)) and ".md" in f[-3:]] + for file in files: + filenames[file] = os.path.join(source_directory, file) + + # for loops over all files + for filename in filenames.keys(): + ################### define/reset loop specific variables ################### + + # boolean indicating whether the current file is part of the linux tutorial + is_linux_tutorial = bool(LINUX_TUTORIAL in filenames[filename]) + + # make a copy of the original file in order to make sure the original does not get altered + copy_file = os.path.join(options[DESTINATION_DIRECTORY], COPIES, filename) + shutil.copyfile(filenames[filename], copy_file) + + # variable that keeps track of the directories that are used to write in at different levels + root_dir_generic = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, GENERIC_DIR) + root_dir_os_specific = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, OS_SPECIFIC_DIR) + root_dir_os_specific_linux = os.path.join(root_dir_os_specific, LINUX) + root_dir_os_specific_windows = os.path.join(root_dir_os_specific, WINDOWS) + root_dir_os_specific_macos = os.path.join(root_dir_os_specific, MACOS) + + # variable for the main title (needed for reference links) + main_title = filename[:-3] + + # variable that keeps track of the directories that are used to write in at different levels + curr_dirs = [filename[:-3] for _ in range(options[MAX_TITLE_DEPTH] + 1)] + + ################### actually parse the md file ################### + + if options[VERBOSE]: + print(LINE + "Processing " + filename) + print("Location: " + filenames[filename]) + print("\nMaking directories:") + + # create directories for the source markdown file + for directory in [root_dir_generic, root_dir_os_specific, root_dir_os_specific_linux, root_dir_os_specific_windows, root_dir_os_specific_macos, os.path.join(root_dir_generic, curr_dirs[0]), os.path.join(root_dir_os_specific_linux, curr_dirs[0]), os.path.join(root_dir_os_specific_windows, curr_dirs[0]), os.path.join(root_dir_os_specific_macos, curr_dirs[0])]: + if options[VERBOSE]: + print(directory) + os.makedirs(directory, exist_ok=True) + + if options[VERBOSE]: + print("\nParsing the sourcefile with jinja") + + # process the jinja macros + jinja_parser(filename, copy_file, options) + + if options[VERBOSE]: + print("\nSplitting the file for the first time (split in sufficiently small generic sections and large os-specific chunks)") + + # split the text in paragraphs + paragraphs_os_text, paragraphs_os_free_text, paragraphs_metadata, subtitle_order = split_text(copy_file, main_title, options, is_linux_tutorial) + + if options[VERBOSE]: + print("\nFurther splitting os-specific chunks and writing generic and os-specific sections to files with metadata") + + # for every section, either make the whole section generic, or create an os-specific file for each OS + for i, subtitle in enumerate(subtitle_order): + + # generic + if subtitle in paragraphs_os_free_text.keys(): + write_generic_file(subtitle, paragraphs_os_free_text, paragraphs_metadata, subtitle_order, i, options, is_linux_tutorial) + + # os-specific + else: + split_and_write_os_specific_section(paragraphs_os_text[subtitle], paragraphs_metadata[subtitle], subtitle_order, i, paragraphs_metadata, options, is_linux_tutorial) + + if options[VERBOSE]: + print("\nFinished processing " + filename) + + if options[VERBOSE]: + print(LINE + "Cleaning up directories:") + print(os.path.join(options[DESTINATION_DIRECTORY], COPIES)) + print(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES)) + print(os.path.join(options[DESTINATION_DIRECTORY], LINUX_TUTORIAL)) + # clean up temporary directories and files + shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], COPIES), ignore_errors=True) + shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES), ignore_errors=True) + shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], LINUX_TUTORIAL), ignore_errors=True) + if os.path.exists(TEMP_JINJA_FILE): + os.remove(TEMP_JINJA_FILE) + + if options[VERBOSE]: + print("Parsing finished successfully") + + +################### run the script ################### +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Preprocessing script for the chatbot\n") + + # adding command-line options + parser.add_argument("-src", "--source", required=True, type=str, help="The source directory where the original files are located") + parser.add_argument("-dst", "--destination", required=True, type=str, help="The destination directory where the processed files should be written to") + parser.add_argument("-st", "--split_on_titles", action="store_true", help="Splits the text based on titles and subtitles instead of paragraphs with a minimum length.") + parser.add_argument("-pl", "--min_paragraph_length", type=int, default=512, help="Minimum length in characters of a paragraph, only works if split on titles is disabled (default: 683)") + parser.add_argument("-td", "--max_title_depth", type=int, default=4, help="Maximum depth of titles that divide the source text into sections, only works if split on titles is enabled (default: 4)") + parser.add_argument("-l", "--links", action="store_true", help="Add links to the output texts") + parser.add_argument("-dd", "--deep_directories", action="store_true", help="Generate a nested directory structure following the structure of the subtitles. Only works if split on titles is enabled") + parser.add_argument("-v", "--verbose", action="store_true", help="Run the script with verbose output") + + args = parser.parse_args() + + options_dict = {SOURCE_DIRECTORY: args.source, + DESTINATION_DIRECTORY: args.destination, + SPLIT_ON_TITLES: args.split_on_titles, + SPLIT_ON_PARAGRAPHS: not args.split_on_titles, + MIN_PARAGRAPH_LENGTH: args.min_paragraph_length, + MAX_TITLE_DEPTH: args.max_title_depth, + INCLUDE_LINKS_IN_PLAINTEXT: args.links, + DEEP_DIRECTORIES: args.deep_directories and args.split_on_titles, + VERBOSE: args.verbose} + + main(options_dict) diff --git a/scripts/HPC_chatbot_preprocessor/requirements.txt b/scripts/HPC_chatbot_preprocessor/requirements.txt new file mode 100644 index 00000000000..1b9cb4a5052 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/requirements.txt @@ -0,0 +1,5 @@ +PyYAML==6.0.2 +Jinja2==3.1.4 +tiktoken~=0.7.0 +pathlib~=1.0.1 +pytest \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt new file mode 100644 index 00000000000..94270ff37e3 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt @@ -0,0 +1,6 @@ +Main title +This is the first paragraph of text. It is non-os-specific, however it does contain a link. +It also contains some other Markdown syntax and an +example code block. +This intro needs to be sufficiently long as will be explained in the following section (we want to hit the minimum +character limit for a section). diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json new file mode 100644 index 00000000000..31cbf626d8d --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tps1", + "subtitle": "Main-title", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 1, + "directory": "tps1", + "links": { + "0": "https://docs.hpc.ugent.be/generic" + }, + "parent_title": "", + "previous_title": null, + "next_title": "tps1_paragraph_002", + "OS": "generic", + "reference_link": "https://docs.hpc.ugent.be/tps1/#main-title" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt new file mode 100644 index 00000000000..58eedc06aa0 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt @@ -0,0 +1,3 @@ +Conclusion +Coming up with what to write in test texts is very hard. I think I got the most important test cases in there, but I +might add to this if needed. \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json new file mode 100644 index 00000000000..cc7b47a8b5a --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json @@ -0,0 +1,12 @@ +{ + "main_title": "tps1", + "subtitle": "Conclusion", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 2, + "directory": "tps1", + "parent_title": "", + "previous_title": "tps1_paragraph_002", + "next_title": null, + "OS": "generic", + "reference_link": "https://docs.hpc.ugent.be/tps1/#conclusion" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt new file mode 100644 index 00000000000..d0ee9ce8256 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt @@ -0,0 +1,4 @@ +OS specific sections +This is the second section, it is the start of some +text specific to OSes that aren't windows. I feel like there is no need to make this section very long, however I will +still add a link. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json new file mode 100644 index 00000000000..fb165c8e7fc --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tps1", + "subtitle": "OS-specific-sections", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 2, + "directory": "tps1", + "parent_title": "Main-title", + "links": { + "0": "https://docs.hpc.ugent.be/linuxmacos" + }, + "previous_title": "tps1_paragraph_001", + "next_title": "tps1_linux_paragraph_002.002", + "OS": "linux", + "reference_link": "https://docs.hpc.ugent.be/Linux/tps1/#os-specific-sections" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt new file mode 100644 index 00000000000..1a3867e69fa --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt @@ -0,0 +1,3 @@ +Non Windows section +Whereas the Windows version of this section had a lot of unnecessary newlines, this one will just be a short and concise +section that ends right here. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json new file mode 100644 index 00000000000..36cda85cfcc --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json @@ -0,0 +1,12 @@ +{ + "main_title": "tps1", + "subtitle": "Non-Windows-section", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 3, + "directory": "tps1", + "parent_title": "OS-specific-sections", + "previous_title": "tps1_linux_paragraph_002.001", + "next_title": "tps1_paragraph_003", + "OS": "linux", + "reference_link": "https://docs.hpc.ugent.be/Linux/tps1/#non-windows-section" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt new file mode 100644 index 00000000000..e0642d6ac96 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt @@ -0,0 +1,4 @@ +OS specific sections +This is the second section, it is the start of some +text specific to OSes that aren't "windows". I feel like there is no need to make this section very long, however I will +still add a link. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json new file mode 100644 index 00000000000..2de51c7c0e1 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tps1", + "subtitle": "OS-specific-sections", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 2, + "directory": "tps1", + "parent_title": "Main-title", + "links": { + "0": "https://docs.hpc.ugent.be/linuxmacos" + }, + "previous_title": "tps1_paragraph_001", + "next_title": "tps1_macos_paragraph_002.002", + "OS": "macos", + "reference_link": "https://docs.hpc.ugent.be/macOS/tps1/#os-specific-sections" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt new file mode 100644 index 00000000000..1a3867e69fa --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt @@ -0,0 +1,3 @@ +Non Windows section +Whereas the Windows version of this section had a lot of unnecessary newlines, this one will just be a short and concise +section that ends right here. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json new file mode 100644 index 00000000000..fb48000e679 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json @@ -0,0 +1,12 @@ +{ + "main_title": "tps1", + "subtitle": "Non-Windows-section", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 3, + "directory": "tps1", + "parent_title": "OS-specific-sections", + "previous_title": "tps1_macos_paragraph_002.001", + "next_title": "tps1_paragraph_003", + "OS": "macos", + "reference_link": "https://docs.hpc.ugent.be/macOS/tps1/#non-windows-section" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt new file mode 100644 index 00000000000..9a9cbe1f3d2 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt @@ -0,0 +1,7 @@ +OS specific sections +This is the second section, it is the start of some text specific to windows. +In this section it is probably no longer needed to test the Markdown syntax again, however I will make it somewhat longer +to make sure we get a long section that is over the minimum required length for the next newline character to be +classified as the end of this section. I am doing this because for the next sections I want to test whether they will be +grouped together if they are not long enough to reach the minimum paragraph length on their own. Also, before I forget, +let's add a link in this section as well. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json new file mode 100644 index 00000000000..00b7fcee452 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tps1", + "subtitle": "OS-specific-sections", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 2, + "directory": "tps1", + "parent_title": "Main-title", + "links": { + "0": "https://docs.hpc.ugent.be/windows" + }, + "previous_title": "tps1_paragraph_001", + "next_title": "tps1_windows_paragraph_002.002", + "OS": "windows", + "reference_link": "https://docs.hpc.ugent.be/Windows/tps1/#os-specific-sections" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt new file mode 100644 index 00000000000..6b57235f68f --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt @@ -0,0 +1,6 @@ +Windows specific section +Like this. +And this. +And also this. +These section should all be grouped together under the windows specific section of the output. The addition of this long +section at the end should make sure the combination of sections comes to an end here. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json new file mode 100644 index 00000000000..0e38a476d04 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json @@ -0,0 +1,12 @@ +{ + "main_title": "tps1", + "subtitle": "Windows-specific-section", + "source_file": "tests/test_files/ftps/tps1.md", + "title_depth": 3, + "directory": "tps1", + "parent_title": "OS-specific-sections", + "previous_title": "tps1_windows_paragraph_002.001", + "next_title": "tps1_paragraph_003", + "OS": "windows", + "reference_link": "https://docs.hpc.ugent.be/Windows/tps1/#windows-specific-section" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md new file mode 100644 index 00000000000..d9b10d0c524 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md @@ -0,0 +1,43 @@ +# Main title + +This is the first paragraph of text. It is non-os-specific, however it does contain [a link](generic.md). +It also contains some `other` *Markdown* _syntax_ and an +```shell +example code block. +``` +This intro needs to be sufficiently long as will be explained in the following section (we want to hit the minimum +character limit for a section). + +## OS specific sections + +This is the second section, it is the start of some {% if OS == windows %} text specific to windows. +In this section it is probably no longer needed to test the Markdown syntax again, however I will make it somewhat longer +to make sure we get a long section that is over the minimum required length for the next newline character to be +classified as the end of this section. I am doing this because for the next sections I want to test whether they will be +grouped together if they are not long enough to reach the minimum paragraph length on their own. Also, before I forget, +let's add [a link](windows.md) in this section as well. + +### Windows specific section + +Like this. + +And this. + +And also this. + +These section should all be grouped together under the windows specific section of the output. The addition of this long +section at the end should make sure the combination of sections comes to an end here. +{% else %} +text specific to OSes that aren't windows. I feel like there is no need to make this section very long, however I will +still add [a link](linuxmacos.md). + +### Non Windows section + +Whereas the Windows version of this section had a lot of unnecessary newlines, this one will just be a short and concise +section that ends right here. +{% endif %} + +## Conclusion + +Coming up with what to write in test texts is very hard. I think I got the most important test cases in there, but I +might add to this if needed. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt new file mode 100644 index 00000000000..f62a4f31fee --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt @@ -0,0 +1,2 @@ +blablabla +blablablabla diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json new file mode 100644 index 00000000000..e481468cefe --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json @@ -0,0 +1,12 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-1", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 2, + "directory": "tts1/Main-title/Subtitle-1", + "parent_title": "Main-title", + "previous_title": "Main-title", + "next_title": "Subtitle-2-g", + "OS": "generic", + "reference_link": "https://docs.hpc.ugent.be/tts1/#subtitle-1" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt new file mode 100644 index 00000000000..bdf68551202 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt @@ -0,0 +1 @@ +blablabla \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json new file mode 100644 index 00000000000..100766dd865 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json @@ -0,0 +1,12 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-5-g", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 2, + "directory": "tts1/Main-title/Subtitle-5-g", + "parent_title": "Main-title", + "previous_title": "Subtitle-2-g", + "next_title": null, + "OS": "generic", + "reference_link": "https://docs.hpc.ugent.be/tts1/#subtitle-5-g" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt new file mode 100644 index 00000000000..48125d91679 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt @@ -0,0 +1,4 @@ +blablabla generic +blablabla generic +blablabla Linux macOS +blablablabla Linux macOS with a link diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json new file mode 100644 index 00000000000..6f42345d013 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-2-g", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 2, + "directory": "tts1/Main-title/Subtitle-2-g", + "parent_title": "Main-title", + "links": { + "0": "https://docs.hpc.ugent.be/linuxmacos" + }, + "previous_title": "Subtitle-1", + "next_title": "Subtitle-4-l&m", + "OS": "linux", + "reference_link": "https://docs.hpc.ugent.be/Linux/tts1/#subtitle-2-g" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt new file mode 100644 index 00000000000..b221f26074b --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt @@ -0,0 +1,3 @@ +blablabla Linux macOS +blablablabla Linux macOS +blablabla generic with a link \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json new file mode 100644 index 00000000000..351b6f5cca6 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-4-l&m", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 3, + "directory": "tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m", + "parent_title": "Subtitle-2-g", + "links": { + "0": "https://docs.hpc.ugent.be/generic" + }, + "previous_title": "Subtitle-2-g", + "next_title": "Subtitle-5-g", + "OS": "linux", + "reference_link": "https://docs.hpc.ugent.be/Linux/tts1/#subtitle-4-lm" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt new file mode 100644 index 00000000000..48125d91679 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt @@ -0,0 +1,4 @@ +blablabla generic +blablabla generic +blablabla Linux macOS +blablablabla Linux macOS with a link diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json new file mode 100644 index 00000000000..30249d3d155 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-2-g", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 2, + "directory": "tts1/Main-title/Subtitle-2-g", + "parent_title": "Main-title", + "links": { + "0": "https://docs.hpc.ugent.be/linuxmacos" + }, + "previous_title": "Subtitle-1", + "next_title": "Subtitle-4-l&m", + "OS": "macos", + "reference_link": "https://docs.hpc.ugent.be/macOS/tts1/#subtitle-2-g" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt new file mode 100644 index 00000000000..b221f26074b --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt @@ -0,0 +1,3 @@ +blablabla Linux macOS +blablablabla Linux macOS +blablabla generic with a link \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json new file mode 100644 index 00000000000..087fe810609 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-4-l&m", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 3, + "directory": "tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m", + "parent_title": "Subtitle-2-g", + "links": { + "0": "https://docs.hpc.ugent.be/generic" + }, + "previous_title": "Subtitle-2-g", + "next_title": "Subtitle-5-g", + "OS": "macos", + "reference_link": "https://docs.hpc.ugent.be/macOS/tts1/#subtitle-4-lm" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt new file mode 100644 index 00000000000..f9f20592832 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt @@ -0,0 +1,4 @@ +blablabla generic +blablabla generic +blablabla windows +blablabla windows with a link diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json new file mode 100644 index 00000000000..da3c61d3edc --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-2-g", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 2, + "directory": "tts1/Main-title/Subtitle-2-g", + "parent_title": "Main-title", + "links": { + "0": "https://docs.hpc.ugent.be/windows" + }, + "previous_title": "Subtitle-1", + "next_title": "Subtitle-3-w", + "OS": "windows", + "reference_link": "https://docs.hpc.ugent.be/Windows/tts1/#subtitle-2-g" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt new file mode 100644 index 00000000000..0b587cef85a --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt @@ -0,0 +1,3 @@ +blablabla windows +blablablabla windows +blablabla generic with a link \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json new file mode 100644 index 00000000000..e07586cf55e --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json @@ -0,0 +1,15 @@ +{ + "main_title": "tts1", + "subtitle": "Subtitle-3-w", + "source_file": "tests/test_files/ftts/tts1.md", + "title_depth": 3, + "directory": "tts1/Main-title/Subtitle-2-g/Subtitle-3-w", + "parent_title": "Subtitle-2-g", + "links": { + "0": "https://docs.hpc.ugent.be/generic" + }, + "previous_title": "Subtitle-2-g", + "next_title": "Subtitle-5-g", + "OS": "windows", + "reference_link": "https://docs.hpc.ugent.be/Windows/tts1/#subtitle-3-w" +} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md new file mode 100644 index 00000000000..2f3ad7f9c08 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md @@ -0,0 +1,31 @@ +# Main title + +## Subtitle 1 + +blablabla +blablablabla + +## Subtitle 2 g + +blablabla generic +blablabla generic +{% if OS == windows %}blablabla windows +blablabla windows with a [link](windows.md) + +### Subtitle 3 w + +blablabla windows +blablablabla windows +{% else %}blablabla Linux macOS +blablablabla Linux macOS with a [link](linuxmacos.md) + +### Subtitle 4 l&m + +blablabla Linux macOS +blablablabla Linux macOS +{% endif %} +blablabla generic with a [link](generic.md) + +## Subtitle 5 g + +blablabla diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md new file mode 100644 index 00000000000..6a74b3c0181 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md @@ -0,0 +1,4 @@ +test1: OS_IF +{% if OS == windows %} +test1 +{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md new file mode 100644 index 00000000000..2f9cdc38294 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md @@ -0,0 +1,4 @@ +test1: OS_IF +{-if-% if OS == windows %-if-} +test1 +{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md new file mode 100644 index 00000000000..360a4a59ba3 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md @@ -0,0 +1,7 @@ +test2: OS_IF in NON_OS_IF +{% if site == Gent %} +test2 +{% if OS == windows %} +test2 +{% endif %} +{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md new file mode 100644 index 00000000000..798dcf6db24 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md @@ -0,0 +1,7 @@ +test2: OS_IF in NON_OS_IF +{% if site == Gent %} +test2 +{-if-% if OS == windows %-if-} +test2 +{-if-% endif %-if-} +{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md new file mode 100644 index 00000000000..d93125a5971 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md @@ -0,0 +1,6 @@ +test3: OS_IF with else +{% if OS == linux %} +test3 +{% else %} +test3 +{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md new file mode 100644 index 00000000000..02141961338 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md @@ -0,0 +1,6 @@ +test3: OS_IF with else +{-if-% if OS == linux %-if-} +test3 +{-if-% else %-if-} +test3 +{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md new file mode 100644 index 00000000000..cc15fae1df1 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md @@ -0,0 +1,4 @@ +test4: OS_IF with wrong syntax +{ if OS == macos } +test4 +{ endif } \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md new file mode 100644 index 00000000000..cc15fae1df1 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md @@ -0,0 +1,4 @@ +test4: OS_IF with wrong syntax +{ if OS == macos } +test4 +{ endif } \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md new file mode 100644 index 00000000000..bdb288474e2 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md @@ -0,0 +1,11 @@ +test5: OS_IF in OS_IF +{% if OS == windows %} +test5 +{% else %} +{% if OS == linux %} +test5 +{% else %} +test5 +{% endif %} +test5 +{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md new file mode 100644 index 00000000000..10443eb67a4 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md @@ -0,0 +1,11 @@ +test5: OS_IF in OS_IF +{-if-% if OS == windows %-if-} +test5 +{-if-% else %-if-} +{-if-% if OS == linux %-if-} +test5 +{-if-% else %-if-} +test5 +{-if-% endif %-if-} +test5 +{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md new file mode 100644 index 00000000000..0731ee3588c --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md @@ -0,0 +1,8 @@ +test6: NON_OS_IF in OS_IF +{% if OS == macos %} +test6 +{% if site == Gent %} +test6 +{% endif %} +test6 +{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md new file mode 100644 index 00000000000..cd37117cb00 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md @@ -0,0 +1,8 @@ +test6: NON_OS_IF in OS_IF +{-if-% if OS == macos %-if-} +test6 +{% if site == Gent %} +test6 +{% endif %} +test6 +{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md new file mode 100644 index 00000000000..6a72a338527 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md @@ -0,0 +1,9 @@ +test7: weird spacing and dashes + {%if OS == windows %} + test7 +{%- else%} + test7 + {% if OS == linux%} +test7 + {%-endif %} +{%endif%} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md new file mode 100644 index 00000000000..dfe342ebfb1 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md @@ -0,0 +1,9 @@ +test7: weird spacing and dashes + {-if-%if OS == windows %-if-} + test7 +{-if-%- else%-if-} + test7 + {-if-% if OS == linux%-if-} +test7 + {-if-%-endif %-if-} +{-if-%endif%-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md new file mode 100644 index 00000000000..fb8c1f8b539 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md @@ -0,0 +1,55 @@ +test1: OS_IF +{% if OS == windows %} +test1 +{% endif %} + +test2: OS_IF in NON_OS_IF +{% if site == Gent %} +test2 +{% if OS == windows %} +test2 +{% endif %} +{% endif %} + +test3: OS_IF with else +{% if OS == linux %} +test3 +{% else %} +test3 +{% endif %} + +test4: OS_IF with wrong syntax +{ if OS == macos } +test4 +{ endif } + +test5: OS_IF in OS_IF +{% if OS == windows %} +test5 +{% else %} +{% if OS == linux %} +test5 +{% else %} +test5 +{% endif %} +test5 +{% endif %} + +test6: NON_OS_IF in OS_IF +{% if OS == macos %} +test6 +{% if site == Gent %} +test6 +{% endif %} +test6 +{% endif %} + +test7: weird spacing and dashes + {%if OS == windows %} + test7 +{%- else%} + test7 + {% if OS == linux%} +test7 + {%-endif %} +{%endif%} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md new file mode 100644 index 00000000000..796e94348fa --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md @@ -0,0 +1,55 @@ +test1: OS_IF +{-if-% if OS == windows %-if-} +test1 +{-if-% endif %-if-} + +test2: OS_IF in NON_OS_IF +{% if site == Gent %} +test2 +{-if-% if OS == windows %-if-} +test2 +{-if-% endif %-if-} +{% endif %} + +test3: OS_IF with else +{-if-% if OS == linux %-if-} +test3 +{-if-% else %-if-} +test3 +{-if-% endif %-if-} + +test4: OS_IF with wrong syntax +{ if OS == macos } +test4 +{ endif } + +test5: OS_IF in OS_IF +{-if-% if OS == windows %-if-} +test5 +{-if-% else %-if-} +{-if-% if OS == linux %-if-} +test5 +{-if-% else %-if-} +test5 +{-if-% endif %-if-} +test5 +{-if-% endif %-if-} + +test6: NON_OS_IF in OS_IF +{-if-% if OS == macos %-if-} +test6 +{% if site == Gent %} +test6 +{% endif %} +test6 +{-if-% endif %-if-} + +test7: weird spacing and dashes + {-if-%if OS == windows %-if-} + test7 +{-if-%- else%-if-} + test7 + {-if-% if OS == linux%-if-} +test7 + {-if-%-endif %-if-} +{-if-%endif%-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md new file mode 100644 index 00000000000..1e18a1495d5 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md @@ -0,0 +1,15 @@ +# Title + +Some explanation about the following list that is quite long. This could be problematic since this could mean that the explanation of the content of the list would be part of a different paragraph than the list. + +1. First entry that is very verbose since we want to hit the character limit for a paragraph to make sure a list can't be split in the middle. If this entry is long enough, the character limit should make it so that any of the following newlines can be the start of a new section if the splitter doesn't know it is in a list. + +2. Second entry + +3. Third entry + + ![image](img/an_image_for_the_third_entry.png) + +4. Fourth entry that is very verbose, so we hit the character limit for a section split, even though it shouldn't be necessary since the explanation of the list is already well above the character limit. + +And now the text continues like normal in a new section. \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_full_script.py b/scripts/HPC_chatbot_preprocessor/tests/test_full_script.py new file mode 100644 index 00000000000..99baf41ebc0 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_full_script.py @@ -0,0 +1,68 @@ +import pytest +import os +import shutil +from chatbot_parser import main + + +@pytest.mark.parametrize("input_directory,actual_output_directory,expected_output_directory, options", [ + ("tests/test_files/ftps", "tests/test_files/ftps/actual", + "tests/test_files/ftps/output", + {"SOURCE_DIRECTORY": "tests/test_files/ftps", + "DESTINATION_DIRECTORY": "tests/test_files/ftps/actual", + "SPLIT_ON_TITLES": False, + "SPLIT_ON_PARAGRAPHS": True, + "MIN_PARAGRAPH_LENGTH": 50, + "MAX_TITLE_DEPTH": 4, + "INCLUDE_LINKS_IN_PLAINTEXT": False, + "DEEP_DIRECTORIES": False, + "VERBOSE": False} + ), + ("tests/test_files/ftts", "tests/test_files/ftts/actual", + "tests/test_files/ftts/output", + {"SOURCE_DIRECTORY": "tests/test_files/ftts", + "DESTINATION_DIRECTORY": "tests/test_files/ftts/actual", + "SPLIT_ON_TITLES": True, + "SPLIT_ON_PARAGRAPHS": False, + "MIN_PARAGRAPH_LENGTH": 160, + "MAX_TITLE_DEPTH": 4, + "INCLUDE_LINKS_IN_PLAINTEXT": False, + "DEEP_DIRECTORIES": True, + "VERBOSE": False} + ) +]) +def test_full_script_generated_directories(input_directory, actual_output_directory, expected_output_directory, options): + # run the script + main(options) + + # Compare directories and files + for dirpath, dirnames, filenames in os.walk(expected_output_directory): + relative_path = os.path.relpath(dirpath, expected_output_directory) + actual_dir = os.path.join(actual_output_directory, relative_path) + + # Check if the directory exists + assert os.path.isdir(actual_dir), f"Directory '{actual_dir}' is missing." + + # Check for files + for filename in filenames: + ref_file = os.path.join(dirpath, filename) + gen_file = os.path.join(actual_dir, filename) + + # Check if the file exists + assert os.path.isfile(gen_file), f"File '{gen_file}' is missing." + + # Check file content + with open(ref_file, 'r') as ref_f, open(gen_file, 'r') as gen_f: + ref_content = ref_f.read().strip() + gen_content = gen_f.read().strip() + assert ref_content == gen_content, f"Content of file '{gen_file}' does not match." + + # check that not too many directories have been generated + for dirpath, dirnames, filenames in os.walk(actual_output_directory): + relative_path = os.path.relpath(dirpath, actual_output_directory) + expected_dir = os.path.join(expected_output_directory, relative_path) + + # Check if the directory exists + assert os.path.isdir(expected_dir), f"Directory '{relative_path}' was made, but shouldn't have been." + + # remove directory + shutil.rmtree(actual_output_directory, ignore_errors=True) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py b/scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py new file mode 100644 index 00000000000..c2ae9fea19e --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py @@ -0,0 +1,32 @@ +import pytest +import os +import shutil +from chatbot_parser import mangle_ifs + + +@pytest.mark.parametrize("input_file,output_file", [ + ("if_mangler_1_input.md", "if_mangler_1_output.md"), + ("if_mangler_2_input.md", "if_mangler_2_output.md"), + ("if_mangler_3_input.md", "if_mangler_3_output.md"), + ("if_mangler_4_input.md", "if_mangler_4_output.md"), + ("if_mangler_5_input.md", "if_mangler_5_output.md"), + ("if_mangler_6_input.md", "if_mangler_6_output.md"), + ("if_mangler_7_input.md", "if_mangler_7_output.md") +]) +def test_if_mangler(input_file, output_file): + # make directory + os.makedirs(os.path.join("if_mangled_files"), exist_ok=True) + + # make filepaths + input_file_path = os.path.join("tests", "test_files", "if_mangler_test_files", input_file) + expected_output_file_path = os.path.join("tests", "test_files", "if_mangler_test_files", output_file) + actual_output_file_path = os.path.join("if_mangled_files", input_file) + mangle_ifs(input_file_path, input_file, {"DESTINATION_DIRECTORY": '.', "VERBOSE": False}) + + # check every line + with open(expected_output_file_path, "r") as expected_read_file: + with open(actual_output_file_path, "r") as actual_read_file: + assert all([expected_line == actual_line for expected_line, actual_line in zip(expected_read_file, actual_read_file)]) + + # remove directory + shutil.rmtree("if_mangled_files", ignore_errors=True) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py b/scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py new file mode 100644 index 00000000000..9109f2518ad --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py @@ -0,0 +1,31 @@ +import pytest +from chatbot_parser import insert_links + +options_include = {"INCLUDE_LINKS_IN_PLAINTEXT": True} +options_leave_out = {"INCLUDE_LINKS_IN_PLAINTEXT": False} +links_input = {"0": "https://first_link.com", "1": "https://second_link.be", "2": "https://docs.hpc.ugent.be/account#welcome-e-mail", "3": "https://final-link.org"} + + +@pytest.mark.parametrize("text_input, options_input, text_output, new_links", [ + # Text without links + # don't include links + ("Text without links\nand with two lines.", options_leave_out, "Text without links\nand with two lines.", {}), + # include links + ("Text without links\nand with two lines.", options_include, "Text without links\nand with two lines.", {}), + # Text with all links + # don't include links + ("Text with all the links\nand with multiple lines.\n§link§link§0§link§link§\n§link§link§1§link§link§\n§link§link§2§link§link§\n§link§link§3§link§link§", options_leave_out, + "Text with all the links\nand with multiple lines.\n\n\n\n", links_input), + # include links + ("Text with all the links\nand with multiple lines.\n§link§link§0§link§link§\n§link§link§1§link§link§\n§link§link§2§link§link§\n§link§link§3§link§link§", options_include, + "Text with all the links\nand with multiple lines.\n https://first_link.com \n https://second_link.be \n https://docs.hpc.ugent.be/account#welcome-e-mail \n https://final-link.org ", links_input), + # Text with some links + # don't include links + ("Text with all the links\nand with multiple lines.\n§link§link§1§link§link§\n§link§link§3§link§link§", options_leave_out, + "Text with all the links\nand with multiple lines.\n\n", {"0": "https://second_link.be", "1": "https://final-link.org"}), + # include links + ("Text with all the links\nand with multiple lines.\n§link§link§0§link§link§\n§link§link§2§link§link§", options_include, + "Text with all the links\nand with multiple lines.\n https://first_link.com \n https://docs.hpc.ugent.be/account#welcome-e-mail ", {"0": "https://first_link.com", "1": "https://docs.hpc.ugent.be/account#welcome-e-mail"}) +]) +def test_insert_links(text_input, options_input, text_output, new_links): + assert insert_links(text_input, links_input, options_input) == (text_output, new_links) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_links.py b/scripts/HPC_chatbot_preprocessor/tests/test_links.py new file mode 100644 index 00000000000..a13675dd3ad --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_links.py @@ -0,0 +1,71 @@ +import os +import pytest +from urllib import request +from chatbot_parser import main +import json + +#################################################### IMPORTANT: This test still fails because there are some invalid links in the documentation #################################################### + +whitelist = ["mailto:hpc@ugent.be"] +slow_list = ["https://login.hpc.ugent.be", "https://www.edx.org/course/introduction-linux-linuxfoundationx-lfs101x-0"] + +options_general = {"SOURCE_DIRECTORY": "../../mkdocs/docs/HPC", + "DESTINATION_DIRECTORY": ".", + "SPLIT_ON_TITLES": False, + "SPLIT_ON_PARAGRAPHS": True, + "MIN_PARAGRAPH_LENGTH": 683, + "MAX_TITLE_DEPTH": 4, + "INCLUDE_LINKS_IN_PLAINTEXT": False, + "DEEP_DIRECTORIES": False, + "VERBOSE": False} +options_os_specific = {"SOURCE_DIRECTORY": "../../mkdocs/docs/HPC/linux-tutorial", + "DESTINATION_DIRECTORY": "./linux-tutorial", + "SPLIT_ON_TITLES": False, + "SPLIT_ON_PARAGRAPHS": True, + "MIN_PARAGRAPH_LENGTH": 683, + "MAX_TITLE_DEPTH": 4, + "INCLUDE_LINKS_IN_PLAINTEXT": False, + "DEEP_DIRECTORIES": False, + "VERBOSE": False} + + +@pytest.mark.parametrize("options", [options_general, options_os_specific]) +def test_all_links(options): + all_links = {} + main(options) + broken_links = {} + empty_links = {} + + for (dirpath, dirnames, filenames) in os.walk(os.path.join(options['DESTINATION_DIRECTORY'], 'parsed_mds')): + for filename in filenames: + all_links[filename] = [] + if filename.endswith('metadata.json'): + data = json.load(open(os.path.join(dirpath, filename))) + if 'links' in data.keys(): + for key in data['links'].keys(): + all_links[filename].append(data['links'][key]) + all_links[filename].append(data['reference_link'].split("#")[0]) + + for filename in all_links.keys(): + all_links[filename] = list(set(all_links[filename])) + for link in all_links[filename]: + if len(link) != 0: + try: + if link not in whitelist and link not in slow_list: + with request.urlopen(link) as res: + if res.status == 200: + pass + except: + print("Broken link in " + filename + ": " + link) + if filename in broken_links.keys(): + broken_links[filename].append(link) + else: + broken_links[filename] = [link] + else: + print("Empty link in " + filename) + if filename in empty_links.keys(): + empty_links[filename].append(link) + else: + empty_links[filename] = [link] + assert len(empty_links.keys()) == 0 + assert len(broken_links.keys()) == 0 diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_lists.py b/scripts/HPC_chatbot_preprocessor/tests/test_lists.py new file mode 100644 index 00000000000..56ac3348dfa --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_lists.py @@ -0,0 +1,46 @@ +import pytest +from chatbot_parser import split_on_paragraphs + + +@pytest.mark.parametrize("file, main_title, options, is_linux_tutorial, expected_text", [ + ("./tests/test_files/list_file/list_test.md", + "list_test.md", + { + "SOURCE_DIRECTORY": "./test_files/list_file", + "DESTINATION_DIRECTORY": "./test_files/list_file", + "SPLIT_ON_TITLES": False, + "SPLIT_ON_PARAGRAPHS": True, + "MIN_PARAGRAPH_LENGTH": 100, + "MAX_TITLE_DEPTH": 4, + "INCLUDE_LINKS_IN_PLAINTEXT": False, + "DEEP_DIRECTORIES": False, + "VERBOSE": False + }, + False, + {'list_test.md_paragraph_001': 'Title\n' + 'Some explanation about the following list that ' + 'is quite long. This could be problematic since ' + 'this could mean that the explanation of the ' + 'content of the list would be part of a ' + 'different paragraph than the list.\n' + '1. First entry that is very verbose since we ' + 'want to hit the character limit for a ' + "paragraph to make sure a list can't be split " + 'in the middle. If this entry is long enough, ' + 'the character limit should make it so that any ' + 'of the following newlines can be the start of ' + "a new section if the splitter doesn't know it " + 'is in a list.\n' + '2. Second entry\n' + '3. Third entry\n' + '4. Fourth entry that is very verbose, so we ' + 'hit the character limit for a section split, ' + "even though it shouldn't be necessary since " + 'the explanation of the list is already well ' + 'above the character limit.\n', + 'list_test.md_paragraph_002': 'And now the text continues like normal in a ' + 'new section.'} + ) +]) +def test_links(file, main_title, options, is_linux_tutorial, expected_text): + assert split_on_paragraphs(file, main_title, options, is_linux_tutorial)[1] == expected_text diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py b/scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py new file mode 100644 index 00000000000..225c368477d --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py @@ -0,0 +1,14 @@ +import pytest +from chatbot_parser import make_valid_title + + +@pytest.mark.parametrize("input_string,expected", [ + ("", ""), + ("A-good-filename-with-dashes", "A-good-filename-with-dashes"), + (" A very good filename beginning and ending in a space ", "A-very-good-filename-beginning-and-ending-in-a-space"), + ("-A-very-good-filename-beginning-and-ending-in-a-dash-", "A-very-good-filename-beginning-and-ending-in-a-dash"), + ("A filename containing bad characters <>:\"/\\|?*\0", "A-filename-containing-bad-characters"), + ("A filename ending with {some jinja garbage}", "A-filename-ending-with") +]) +def test_make_valid_title(input_string, expected): + assert make_valid_title(input_string) == expected diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py b/scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py new file mode 100644 index 00000000000..d9150290f34 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py @@ -0,0 +1,46 @@ +import pytest +from chatbot_parser import replace_markdown_markers + + +@pytest.mark.parametrize("input_line, input_linklist, in_code_block, main_title, expected_line, expected_linklist", [ + # baseline test + ("A normal line with nothing special", [], False, "", "A normal line with nothing special", []), + # image 1 + ("![image](a-nice-image.png)", [], False, "", "", []), + # image 2 + ("![](img/Look-at-this-photograph.png)", [], False, "", "", []), + # link 1 (outside docs) + ("A line with a [link](https://a-nice-link.com)", ["https://another-link.be"], False, "", + "A line with a link§link§link§1§link§link§", ["https://another-link.be", "https://a-nice-link.com"]), + # link 2 (another document within the docs) + ("A line with a [link to the docs](account.md#welcome-e-mail)", ["https://another-link.be"], False, "", + "A line with a link to the docs§link§link§1§link§link§", ["https://another-link.be", "https://docs.hpc.ugent.be/account/#welcome-e-mail"]), + # link 3 (the same document) + ("A line with a [link to the same doc](#welcome-e-mail)", ["https://another-link.be"], False, "account.md", + "A line with a link to the same doc§link§link§1§link§link§", ["https://another-link.be", "https://docs.hpc.ugent.be/account/#welcome-e-mail"]), + # codeblock + ("```shell", [], True, "", "", []), + # html syntax 1 (normal syntax) + ("A line with something in Bold", [], False, "", "A line with something in Bold", []), + # html syntax 2 (link) + ("A line with another link
", ["other-website.com"], False, "", + "A line with another link§link§link§1§link§link§", ["other-website.com", "website.com"]), + # html syntax 3 (style) + ("

A line with style

", [], False, "", "A line with style", []), + # Bot comment + ("", [], False, "", "Something about the following table", []), + # non-Bot comment + ("", [], False, "", "", []), + # something else with <> + ("A line with an example where you should put ", [], False, "", "A line with an example where you should put ", []), + # info/tips/warnings + ("!!! warning", [], False, "", " warning", []), + # collapsable admonitions + ("??? note", [], False, "", " note", []), + # Markdown syntax 1 (not in code block) + ("`Line` **with** ++a++ _lot_ *of* _++markdown++_ `syntax`", [], False, "", "Line with a lot of markdown syntax", []), + # Markdown syntax 2 (in code block) + ("`Line` **with** ++slightly++ _less_ *markdown* _++syntax++_", [], True, "", "`Line` **with** ++slightly++ _less_ *markdown* _++syntax++_", []) +]) +def test_replace_markdown_markers(input_line, input_linklist, in_code_block, main_title, expected_line, expected_linklist): + assert replace_markdown_markers(input_line, input_linklist, in_code_block, main_title, False) == (expected_line, expected_linklist) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py b/scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py new file mode 100644 index 00000000000..6c30fef7985 --- /dev/null +++ b/scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py @@ -0,0 +1,15 @@ +import pytest +import os +from chatbot_parser import write_metadata + + +@pytest.mark.parametrize("main_title,subtitle,links,title_level,directory,source_file,output", [ + ("", "", [], 1, "", "", {"source_file": "", "main_title": "", "subtitle": "", "title_depth": 1, "directory": "", "parent_title": ""}), + ("A_very_good_main_title", "An_extremely_good_subtitle", ["the_first.link", "the_second.link"], 2, + os.path.join("A_very_good_main_title", "An_awesome_parent_file", "An_extremely_good_subtitle"), "source", + {"source_file": "source", "main_title": "A_very_good_main_title", "subtitle": "An_extremely_good_subtitle", "title_depth": 2, + "directory": os.path.join("A_very_good_main_title", "An_awesome_parent_file", "An_extremely_good_subtitle"), + "parent_title": "An_awesome_parent_file", "links": {"0": "the_first.link", "1": "the_second.link"}}) +]) +def test_write_metadata(main_title, subtitle, links, title_level, directory, source_file, output): + assert write_metadata(main_title, subtitle, links, title_level, directory, source_file) == output diff --git a/scripts/README.md b/scripts/README.md index eed5a73e4d5..a88bd42cc46 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,3 +1,4 @@ Scripts that can be used to automatically generate markdown files, can be found here. -* [`available_software`](available_software): script to generate overview of available environment modules; \ No newline at end of file +* [`available_software`](available_software): script to generate overview of available environment modules; +* [`chatbot_preprocessor`](HPC_chatbot_preprocessor): script to generate input files for the chatbot; \ No newline at end of file From b1aa41cfb05faf2953ea871856ecc537e9b3a6ff Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Thu, 5 Sep 2024 15:19:44 +0200 Subject: [PATCH 14/15] remove bot script --- scripts/HPC_chatbot_preprocessor/README.md | 196 --- .../chatbot_parser.py | 1237 ----------------- .../HPC_chatbot_preprocessor/requirements.txt | 5 - .../generic/tps1/tps1_paragraph_001.txt | 6 - .../tps1/tps1_paragraph_001_metadata.json | 15 - .../generic/tps1/tps1_paragraph_003.txt | 3 - .../tps1/tps1_paragraph_003_metadata.json | 12 - .../tps1/tps1_linux_paragraph_002.001.txt | 4 - ...tps1_linux_paragraph_002.001_metadata.json | 15 - .../tps1/tps1_linux_paragraph_002.002.txt | 3 - ...tps1_linux_paragraph_002.002_metadata.json | 12 - .../tps1/tps1_macos_paragraph_002.001.txt | 4 - ...tps1_macos_paragraph_002.001_metadata.json | 15 - .../tps1/tps1_macos_paragraph_002.002.txt | 3 - ...tps1_macos_paragraph_002.002_metadata.json | 12 - .../tps1/tps1_windows_paragraph_002.001.txt | 7 - ...s1_windows_paragraph_002.001_metadata.json | 15 - .../tps1/tps1_windows_paragraph_002.002.txt | 6 - ...s1_windows_paragraph_002.002_metadata.json | 12 - .../tests/test_files/ftps/tps1.md | 43 - .../tts1/Main-title/Subtitle-1/Subtitle-1.txt | 2 - .../Subtitle-1/Subtitle-1_metadata.json | 12 - .../Main-title/Subtitle-5-g/Subtitle-5-g.txt | 1 - .../Subtitle-5-g/Subtitle-5-g_metadata.json | 12 - .../Main-title/Subtitle-2-g/Subtitle-2-g.txt | 4 - .../Subtitle-2-g/Subtitle-2-g_metadata.json | 15 - .../Subtitle-4-l&m/Subtitle-4-l&m.txt | 3 - .../Subtitle-4-l&m_metadata.json | 15 - .../Main-title/Subtitle-2-g/Subtitle-2-g.txt | 4 - .../Subtitle-2-g/Subtitle-2-g_metadata.json | 15 - .../Subtitle-4-l&m/Subtitle-4-l&m.txt | 3 - .../Subtitle-4-l&m_metadata.json | 15 - .../Main-title/Subtitle-2-g/Subtitle-2-g.txt | 4 - .../Subtitle-2-g/Subtitle-2-g_metadata.json | 15 - .../Subtitle-3-w/Subtitle-3-w.txt | 3 - .../Subtitle-3-w/Subtitle-3-w_metadata.json | 15 - .../tests/test_files/ftts/tts1.md | 31 - .../if_mangler_1_input.md | 4 - .../if_mangler_1_output.md | 4 - .../if_mangler_2_input.md | 7 - .../if_mangler_2_output.md | 7 - .../if_mangler_3_input.md | 6 - .../if_mangler_3_output.md | 6 - .../if_mangler_4_input.md | 4 - .../if_mangler_4_output.md | 4 - .../if_mangler_5_input.md | 11 - .../if_mangler_5_output.md | 11 - .../if_mangler_6_input.md | 8 - .../if_mangler_6_output.md | 8 - .../if_mangler_7_input.md | 9 - .../if_mangler_7_output.md | 9 - .../if_mangler_test_files/if_mangler_input.md | 55 - .../if_mangler_output.md | 55 - .../tests/test_files/list_file/list_test.md | 15 - .../tests/test_full_script.py | 68 - .../tests/test_if_mangler.py | 32 - .../tests/test_insert_links.py | 31 - .../tests/test_links.py | 71 - .../tests/test_lists.py | 46 - .../tests/test_make_valid_title.py | 14 - .../tests/test_replace_markdown_markers.py | 46 - .../tests/test_write_metadata.py | 15 - 62 files changed, 2340 deletions(-) delete mode 100644 scripts/HPC_chatbot_preprocessor/README.md delete mode 100644 scripts/HPC_chatbot_preprocessor/chatbot_parser.py delete mode 100644 scripts/HPC_chatbot_preprocessor/requirements.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_full_script.py delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_links.py delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_lists.py delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py delete mode 100644 scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py diff --git a/scripts/HPC_chatbot_preprocessor/README.md b/scripts/HPC_chatbot_preprocessor/README.md deleted file mode 100644 index 6cfd9be8231..00000000000 --- a/scripts/HPC_chatbot_preprocessor/README.md +++ /dev/null @@ -1,196 +0,0 @@ -# Chatbot parser - -`chatbot_parser.py` is a script that transforms the markdown sourcefiles into a structured directory as input for a chatbot. - -## Usage - -The script can be ran in a shell environment with the following command: - -```shell -python chatbot_parser.py -``` - -This command has the following possible options: - -```shell -chatbot_parser.py [-h] -src SOURCE -dst DESTINATION [-st] [-pl MIN_PARAGRAPH_LENGTH] [-td MAX_TITLE_DEPTH] [-l] [-dd] -``` - -### Options - -#### `h`/`help` - -Display the help message - -#### `src`/`source` - -This is a required option that specifies the source directory of the input files for the script. This location is also used to look for jinja templates when using jinja to parse the source files (such as the `macros` directory within `vsc_user_docs/mkdocs/docs/HPC`). - -#### `dst`/`destination` - -This is a required option that specifies where the output of the script should be written. The script also generates extra intermediate subdirectories, so subdirectories with the following names shouldn't be present in the destination directory: `parsed_mds`, `copies` and `if_mangled_files`. If any of these pose a problem, the name of the intermediate subdirectory used for the script can be changed in the macros at the top of the script. - -#### `st`/`split_on_titles` - -Including this option will split the source files based on the titles and subtitles in the markdown text. Not including this option will split the text on paragraphs with a certain minimum length. - -#### `pl`/`min_paragraph_length` - -This option allows the user to configure the minimum length a paragraph must be. Some deviations from this minimum length are possible (for example at the end of a file). The default value for this minimum paragraph length is 512 tokens. This options only works if `split_on_titles` is not enabled. - -#### `td`/`max_title_depth` - -This option allows the user to configure the maximum "title depth" (the amount of `#` in front) to be used as borders between sections if `split_on_titles` is enabled. The default value is 4. - -#### `l`/`links` - -Some of the sourcefiles might contain links. Including this option will retain the links in the plaintext. If this option is not included, the links will be dropped from the plaintext. - -#### `dd`/`deep_directories` - -Including this option will make the script generate a "deep directory" where every title encountered will be made into a subdirectory of its parent title (So for example a title with three `#`s will be made a subdirectory of the most recent title with two `#`s). This option only works if `split_on_titles` is enabled. - -## Generated file structure - -The generated directory structure is written as a subdirectory of `parsed_mds`. In `parsed_mds`, two subdirectories can be found: - -- `generic` contains the parts of the markdown sources that were non-OS-specific -- `os_specific` contains the parts of the markdown sources that were OS-specific - -Within `os_specific` a further distinction is made for each of the three possible operating systems included in the documentation. - -Both the generic and each of the three os-specific directories then contain a directory for each source file. - -If the option `deep_directories` is not enabled, all paragraphs of the source file and their corresponding metadata will be saved in this directory. The (processed) plaintext of the paragraph is written to a `.txt` file and the metadata is written to a `.json` file. - -If the option `deep_directories` is enabled, the directory of each source file will contain a subdirectory structure corresponding to the structure of the subtitles at different levels in the source file. Each subtitle in the source file corresponds to a directory nested in the directory of its parent title (So for example a title with three `#`s will be made a subdirectory of the most recent title with two `#`s). - -Finally, each of these subtitle-specific subdirectories contains a `.txt` file with the (processed) plaintext of that section and a `.json` file with the metadata of that section. - -## Requirements - -- The required Python packages are listed in `requirements.txt` - -## Restrictions on source-files - -Due to the nature of the script, some restrictions should be taken into account about the markdown files it can use as input. - -### Nested if structures - -The script uses the if-structures in the source-files to split the documentation into general documentation and os-specific documentation. As such it needs to keep track of which types of if-structures (os-related/non-os-related) it is reading from. When using certain nested if-structures, this will cause problems. The supported nested if-structures are determined by the macros `NON_OS_IF`, `NON_OS_IF_IN_OS_IF`, `OS_IF` and `OS_IF_IN_OS_IF`. So respectively a non-os-related if-structure, a non-os-related if nested in an os-related one, an os-related if-structure and an os-related if-structure nested in another os-related if-structure. All of these are allowed to be nested in an undetermined amount of non-os-related if-structures, but no non-os-related if structures should be nested in them. It is also not allowed to nest any of the allowed structures in more os-related if-structures. - -#### Examples of valid and invalid if-structures - -##### Allowed - -###### non-os-related in os-related - -This is an example of one of the basic allowed if-structures (`NON_OS_IF_IN_OS_IF`) - -``` -if OS == windows: - if site == Gent: - ... - endif -endif -``` - -###### os-related in os-related in non-os-related - -This is an example of the basic allowed if-structure `OS_IF_IN_OS_IF` nested in a non-os-specific if. - -``` -if site == Gent: - if OS == windows: - ... - else: - if OS == Linux: - ... - endif - endif -endif -``` - -##### Not allowed - -###### non-os-related in os-related in os-related - -This is an example of a non-os-related if-structure nested in one of the basic allowed if-structures (`OS_IF_IN_OS_IF`). - -``` -if OS != windows: - if OS == Linux: - if site == Gent: - ... - endif - endif -endif -``` - -This will result in the parser "forgetting" it opened an os-specific if-statement with OS != windows and not properly closing it. - -###### os-related in non-os-related in os-related - -This is an example of the basic allowed if-structure `OS_IF` (indirectly) nested in an os-specific if-structure. - -``` -if OS != windows: - if site == Gent: - if OS == Linux: - ... - endif - endif -endif -``` - -This will also result in the parser "forgetting" it opened an os-specific if-statement with OS != windows and not properly closing it. - -### Non OS-related if-statements - -Due to the way jinja parses the sourcefiles, the script slightly alters non os-specific if-statements as well. It expects if-statements of the following form: - -``` -{%- if site == gent %} -{% if site != (gent or brussel) %} -``` - -All spaces and the dash are optional. City names don't need to be fully lowercase since the parser will capitalize them properly anyway. - -### html syntax - -The input shouldn't contain any html syntax. While some failsafes are in place, the script isn't made with the use case of handling html syntax in mind. - -### Comments - -Any comments within the markdown files (for example TODO's) should follow the following syntax: - -``` - -``` - and should be limited to one line. - -Comments can be written in such a way that the script will keep them as input for the bot. To do that, the marker `INPUT_FOR_BOT` should be put in front of the content of the comment as such. - -``` - -``` - -This will be reworked to - -``` -your comment for the bot -``` - -in the final output. - -### Long filepaths - -Due to the nature of this script, it can generate large directories with very long names if `deep_directories` is enabled. Depending on the operating system, this can cause problems with filepaths being to long, resulting in files not being able to open. A possible fix for this is to make sure the filepath to where the script is located is not too long. Another solution is lowering the `max_title_depth` or disabling `deep_directories`. - -### Markdown lists - -The parser is made in a way to detect lists and not split them in multiple paragraphs. The kinds of lists it can detect is all lists with denominators `-`, `+`, `*` and list indexed with numbers or letters (one letter per list entry). It can handle list entries being spread out over multiple lines if there is an indentation of at least two spaces. It can also handle multiple paragraph list entries in this way, as long as the indentation stays. - -### Links - -Part of the metadata of the parser are links. In order for the links to be built up in the right way, links to external sites should always start with either `https://` or `http://`. diff --git a/scripts/HPC_chatbot_preprocessor/chatbot_parser.py b/scripts/HPC_chatbot_preprocessor/chatbot_parser.py deleted file mode 100644 index 9b6e8dc7f2d..00000000000 --- a/scripts/HPC_chatbot_preprocessor/chatbot_parser.py +++ /dev/null @@ -1,1237 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import copy -import json -import os -import re -import shutil -import tiktoken -import yaml -from itertools import chain, tee, zip_longest -from pathlib import Path -from jinja2 import FileSystemLoader, Environment, ChoiceLoader, FunctionLoader, Template - -#################### define macro's #################### -# options -SOURCE_DIRECTORY = "SOURCE_DIRECTORY" -DESTINATION_DIRECTORY = "DESTINATION_DIRECTORY" -SPLIT_ON_TITLES = "SPLIT_ON_TITLES" -MIN_PARAGRAPH_LENGTH = "MIN_PARAGRAPH_LENGTH" -MAX_TITLE_DEPTH = "MAX_TITLE_DEPTH" -INCLUDE_LINKS_IN_PLAINTEXT = "INCLUDE_LINKS_IN_PLAINTEXT" -SPLIT_ON_PARAGRAPHS = "SPLIT_ON_PARAGRAPHS" -DEEP_DIRECTORIES = "DEEP_DIRECTORIES" -VERBOSE = "VERBOSE" - -# directories -PARSED_MDS = "parsed_mds" -COPIES = "copies" -IF_MANGLED_FILES = "if_mangled_files" -LINUX_TUTORIAL = "linux-tutorial" -RETURN_DIR = ".." -MKDOCS_DIR = "mkdocs" -DOCS_DIR = "docs" -HPC_DIR = "HPC" -EXTRA_DIR = "extra" -GENERIC_DIR = "generic" -OS_SPECIFIC_DIR = "os_specific" -MACROS = "macros" - -# OSes -LINUX = "linux" -WINDOWS = "windows" -MACOS = "macos" -GENERIC = "generic" -LINK_OS = {LINUX: "Linux", WINDOWS: "Windows", MACOS: "macOS"} # OS needs different capitalisation for use in links - -# urls -REPO_URL = 'https://github.com/hpcugent/vsc_user_docs' -DOCS_URL = "https://docs.hpc.ugent.be" - -# OS-related if-states -ACTIVE = "active" -INACTIVE = "inactive" - -# if mangler states -NON_OS_IF = 0 -NON_OS_IF_IN_OS_IF = 1 -OS_IF = 2 -OS_IF_IN_OS_IF = 3 - -# if mangler macros -IF_MANGLED_PART = "-if-" - -# actions -DONE = "done" -WRITE_TEXT = "write_text" -CHECK_EXTRA_MESSAGE = "check_extra_message" -WRITE_TEXT_AND_CHECK_EXTRA_MESSAGE = "write_text_and_check_extra_message" - -# Metadata attributes -SOURCE_FILE = "source_file" -MAIN_TITLE = "main_title" -SUBTITLE = "subtitle" -TITLE_DEPTH = "title_depth" -DIRECTORY = "directory" -LINKS = "links" -PARENT_TITLE = "parent_title" -PREVIOUS_SUBTITLE = "previous_title" -NEXT_SUBTITLE = "next_title" -METADATA_OS = "OS" -REFERENCE_LINK = "reference_link" - -# if-structure components -IF = "if" -ELSE = "else" -ENDIF = "endif" - -# link indicator -LINK_MARKER = r'§link§link§' - -# HTML tags -HTML_TAGS = ["pre", "b", "code", "sub", "br", "center", "p", "div", "u", "p", "i", "tt", "a", "t", "span"] # make sure these are always lowercase - -# regex patterns -IF_MANGLED_PATTERNS = { - IF: r'({' + IF_MANGLED_PART + r'%[-\s]*if\s+OS\s*[!=]=\s*.+?[-\s]*%' + IF_MANGLED_PART + '})', - ELSE: r'({' + IF_MANGLED_PART + r'%\s*-?\s*else\s*-?\s*%' + IF_MANGLED_PART + '})', - ENDIF: r'({' + IF_MANGLED_PART + r'%\s*-?\s*endif\s*-?\s*%' + IF_MANGLED_PART + '})' - } - -# filenames (and parts of filenames) -TEMP_JINJA_FILE = "jinja_file.txt" -_PARAGRAPH_ = "_paragraph_" -METADATA_EXTENSION = "_metadata" - -# Marker for comments for the bot -INPUT_FOR_BOT = "INPUT_FOR_BOT: " - -# Standard strings for verbose output -LINE = "------------------------------------------------------------------------------------------------------\n" - - -################### define functions ################### - -def check_for_title(line, in_code_block, curr_dirs, options): - """ - function that checks for titles in the current line. Used by split_text to split the text among the subtitles - - :param line: the current line to be checked for a title - :param in_code_block: boolean indicating whether the current line is part of a codeblock to be sure comments aren't counted as titles - :param curr_dirs: the current working directories for each level of subtitle, to be updated when a new title is found - :param options: dictionary containing the options given by the user - :return title_length: The amount of hashtags in front of the title on the current line - """ - # detect titles - match = re.match(r'^#+ ', line) - if match and len(match.group(0)) <= options[MAX_TITLE_DEPTH] + 1 and not in_code_block: - title_length = len(match.group(0)) - 1 - if options[DEEP_DIRECTORIES]: - curr_dirs[title_length] = os.path.join(curr_dirs[title_length - 1], make_valid_title(line[title_length + 1:-1].replace(' ', '-'))) - - # update the higher order current directories - for i in range(title_length + 1, options[MAX_TITLE_DEPTH] + 1): - curr_dirs[i] = curr_dirs[title_length] - - return title_length - else: - return 0 - - -def make_valid_link(link, main_title, is_linux_tutorial): - """ - Function that converts a string to a valid link to be used in the metadata - - :param link: the input string to be turned into a valid link - :param main_title: the main title of the file that contains the link - :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial - :return link: the valid link - """ - - # ugly fix for problem with links - linux_tutorial_files = ["beyond_the_basics", "common_pitfalls", "getting_started", "hpc_infrastructure", "index", "manipulating_files_and_directories", "navigating", "uploading_files"] - if is_linux_tutorial and any([linux_tutorial_files[i] in link for i in range(len(linux_tutorial_files))]): - linux_part = LINUX_TUTORIAL + '/' - else: - linux_part = "" - - if link.startswith('http://') or link.startswith('https://') or link.startswith('mailto:'): - pass - else: - if link.startswith("./"): - link = link.replace('./', '') - elif link.startswith("../"): - link = link.replace('../', '') - - if link.startswith("#"): - link = DOCS_URL + '/' + linux_part + main_title.replace(".md", "") + "/" + link - elif link.endswith(".md") and ("/" not in link or "." not in link.split("/")[0]): - link = DOCS_URL + '/' + linux_part + link.replace(".md", "") - elif '.md#' in link: - link = DOCS_URL + '/' + linux_part + link.replace(".md", "/") - else: - link = DOCS_URL + '/' + linux_part + link - - link = link.replace('index/', '').replace('/index', '') - - return link - - -def replace_markdown_markers(curr_line, linklist, in_code_block, main_title, is_linux_tutorial): - """ - function that replaces certain markdown structures with the equivalent used on the website - - :param curr_line: the current line on which markdown structures need to be replaced - :param linklist: the list used to store links that need to be printed at the end of the file - :param in_code_block: boolean indicating whether the current line is part of a code block - :param main_title: the main title of the file that is being processed - :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial - :return curr_line: the adapted current line - :return linklist: the updated linklist - """ - - # replace images with an empty line - if re.search(r'(?i)!\[image]\(.*?\)', curr_line) or re.search(r'!\[.*?]\(img/.*?\.png\)', curr_line): - curr_line = "" - - # replace links with a reference - matches = re.findall(r'\[(.*?)]\((.*?)\)', curr_line) - if matches: - for match in matches: - curr_line = curr_line.replace(f"[{match[0]}]({match[1]})", match[0] + LINK_MARKER + str(len(linklist)) + LINK_MARKER) - - linklist.append(make_valid_link(match[1], main_title, is_linux_tutorial)) - - # codeblock (with ``` -> always stands on a separate line, so line can be dropped) - if '```' in curr_line: - curr_line = "" - - # structures within <> - match = re.findall(r'<(.*?)>', curr_line) - if match: - for i, content in enumerate(match): - html_tags_variations = list(chain.from_iterable([[element, element + "/", "/" + element] for element in HTML_TAGS])) - html_tags_style = [element + " style=.*" for element in HTML_TAGS] - - # add references for every link of format
- if re.search(r'a href=.*', content): - link = content[7:] - curr_line = re.sub(f'<{content}>', LINK_MARKER + str(len(linklist)) + LINK_MARKER, curr_line) - linklist.append(link) - - # drop the syntax words - elif content.lower() in html_tags_variations: - curr_line = re.sub(f'<{content}>', "", curr_line) - - # drop the version of the HTML_TAGS followed by " style=" - elif any(re.match(pattern, content) for pattern in html_tags_style): - curr_line = re.sub(r'<.*?>', "", curr_line) - - # keep comments for bot - elif re.fullmatch(r'!--' + INPUT_FOR_BOT + r'.*?--', content): - curr_line = re.sub(r'', lambda m: m.group(1), curr_line) - - # drop comments - elif re.fullmatch(r'!--.*?--', content): - curr_line = re.sub(r'<.*?>', "", curr_line) - - # drop the <> around links - elif re.match(r'http://', content) or re.match(r'https://', content): - curr_line = re.sub(r'<' + content + '>', content, curr_line ) - - # keep the rest - else: - pass - - # structures with !!! (info, tips, warnings) - if '!!!' in curr_line: - curr_line = re.sub(r'!!!', "", curr_line) - - # structures with ??? (collapsable admonitions) - if '???' in curr_line: - curr_line = re.sub(r'\?\?\?', "", curr_line) - - # get rid of other indicators (`, *, +, _) - if not in_code_block: - - backquotes = re.findall(r'`(.*?)`', curr_line) - if backquotes: - for i, content in enumerate(backquotes): - curr_line = curr_line.replace(f"`{content}`", content) - - asterisks = re.findall(r'(?' in line) ^ ('
' in line)): - in_code_block = not in_code_block - if options[VERBOSE]: - if in_code_block: - print("Detected start of a codeblock, not registering titles") - else: - print("Detected end of codeblock, registering titles again") - - # only split up if current line is in a fully non-os-specific section - if in_if_statement == 0: - - title_level = check_for_title(line, in_code_block, curr_dirs, options) - - # line is a title with a maximum depth of 4 - if title_level > 0: - if after_first_title: - - # write text of previous file - if previous_contained_if: - paragraphs_os_text[title] = current_paragraph - if options[VERBOSE]: - print("Saved os-specific chunk with temporary title: " + title + "\n") - else: - paragraphs_os_free_text[title] = current_paragraph - if options[VERBOSE]: - print("Saved generic chunk with title: " + title + "\n") - - # write metadata of previous file - paragraphs_metadata[title] = write_metadata(main_title, title, link_list, last_title_level, last_dir, options[SOURCE_DIRECTORY] + '/' + main_title + '.md') - - # make a new title - title = make_valid_title(line[title_level + 1:-1]) - - # create an entry for the file in the paragraphs text dictionary - current_paragraph = "" - - after_first_title = True - subtitle_order.append(title) - - # reset link_list - link_list = [] - - previous_contained_if = False - - # line is not a title - elif after_first_title: - line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) - if line != "\n": - current_paragraph += line - - # keep track of title level and directory to write to metadata upon discovering a new subtitle - if title_level > 0: - last_title_level = title_level - last_dir = curr_dirs[last_title_level] - else: - previous_contained_if = True - line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) - if line != "\n": - current_paragraph += line - - # write dictionaries for the last file - if previous_contained_if: - paragraphs_os_text[title] = current_paragraph - if options[VERBOSE]: - print("Saved os-specific chunk with temporary title: " + title + "\n") - else: - paragraphs_os_free_text[title] = current_paragraph - if options[VERBOSE]: - print("Saved generic chunk with title: " + title + "\n") - paragraphs_metadata[title] = write_metadata(main_title, title, link_list, last_title_level, curr_dirs[last_title_level], options[SOURCE_DIRECTORY] + '/' + main_title + '.md') - - return paragraphs_os_text, paragraphs_os_free_text, paragraphs_metadata, subtitle_order - - -def split_on_paragraphs(file, main_title, options, is_linux_tutorial, current_paragraph_number=-1, OS=GENERIC): - """ - Function that splits the text into smaller sections based on the paragraph structure and makes them into two dictionaries containing text and metadata - - :param file: the filepath of the file to be split - :param main_title: the main title of the file - :param options: dictionary containing the options given by the user - :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial - :param current_paragraph_number: number of the paragraph that is being split, only applicable when splitting an os-specific paragraph - :param OS: the OS of the file to be split, only applicable when splitting an os-specific paragraph - :return paragraphs_text: dictionary containing the split sections of text - :return paragraphs_metadata: dictionary containing the metadata of each split section of text - :return subtitle_order: list containing all encountered subtitles in order of appearance - """ - - if options[VERBOSE]: - print("Splitting on paragraphs\n") - - # start of assuming we are not in a code_block - in_code_block = False - - # define initial dictionaries - paragraphs_os_free_text = {} - paragraphs_os_text = {} - paragraphs_metadata = {} - - # variable to keep track of the current paragraph - current_paragraph = "" - - # list to keep track of links in the text - link_list = [] - - # list to keep track of the order of the subtitles - subtitle_order = [] - - # variable to keep track of how many if-statements deep the current line is - in_if_statement = 0 - - # variable to indicate that previous section was one with if-statements - previous_contained_if = False - - # variable to indicate that the previous line was part of a list - in_list = False - - # paragraph number to add to title - paragraph_number = 1 - - # metadata title - metadata_title = main_title - - # define metadata data if split occurs on paragraphs and last_title and title_level are known (will be replaced later on in the process) - if current_paragraph_number != -1: - last_title_level = 4 - last_dir = "PLACEHOLDER" - - # list to keep track of most recent directories on each title level - curr_dirs = [main_title for _ in range(options[MAX_TITLE_DEPTH] + 1)] - - with open(file, 'r') as readfile: - - # Create two independent iterators from the original file iterator (needed to check for lists) - current_line, next_line = tee(readfile) - - # Advance the next_line iterator by one step, so it is always one step ahead - next(next_line, None) - - # Process the lines - for line, nxt in zip_longest(current_line, next_line, fillvalue=""): - - # detect if-statements starting or ending on the current line - in_if_statement += len(re.findall(IF_MANGLED_PATTERNS[IF], line)) - len( - re.findall(IF_MANGLED_PATTERNS[ENDIF], line)) - - # detect whether the current line is in a list - if re.search(r'^(\s*)([*+-]|\d+\.|[a-zA-Z]\.)\s+.*$', line): # beginning of a list entry - in_list = True - if options[VERBOSE]: - print("First line of new list entry found, not starting new paragraphs: " + line[:-1]) - elif re.search(r'^\s{2,}.+$', line) and in_list: # middle of a list entry - pass - elif re.search(r'^(\s*)([*+-]|\d+\.|[a-zA-Z]\.)\s+.*$|^\s{2,}.+$|^\n', nxt) and in_list: # line(s) between list entries - pass - elif re.search(r'^(\s*)([*+-]|\d+\.|[a-zA-Z]\.)\s+.*$', nxt): - in_list = True - elif in_list: - if options[VERBOSE]: - print("List ended, starting new paragraphs again") - in_list = False - else: - in_list = False - - # detect codeblocks to make sure titles aren't detected in them - if '```' in line or (('
' in line) ^ ('
' in line)): - in_code_block = not in_code_block - if options[VERBOSE]: - if in_code_block: - print("Detected start of a codeblock, not starting new paragraphs") - else: - print("Detected end of codeblock, starting new paragraphs again") - - # only split up if current line is in a fully non-os-specific section - if in_if_statement == 0: - - title_level = check_for_title(line, in_code_block, curr_dirs, options) - - # check whether a new paragraph should be started - if line == "\n" and paragraph_long_enough(re.sub(r'\{' + IF_MANGLED_PART + '%.*?%' + IF_MANGLED_PART + '}', "", current_paragraph), options) and not in_code_block and not in_list: - - # create a title for the previous paragraph - if current_paragraph_number == -1: - paragraph_title = main_title + _PARAGRAPH_ + f"{paragraph_number:03}" - else: - paragraph_title = main_title + "_" + OS + _PARAGRAPH_ + f"{current_paragraph_number:03}.{paragraph_number:03}" - paragraph_number += 1 - - # write text of previous file - if previous_contained_if: - paragraphs_os_text[paragraph_title] = current_paragraph - if options[VERBOSE]: - print("Saved os-specific chunk with temporary title: " + paragraph_title + "\n") - else: - paragraphs_os_free_text[paragraph_title] = current_paragraph - if options[VERBOSE]: - print("Saved generic chunk with title: " + paragraph_title + "\n") - - # write metadata of previous file - paragraphs_metadata[paragraph_title] = write_metadata(main_title, metadata_title, link_list, last_title_level, last_dir, source_file=options[SOURCE_DIRECTORY] + '/' + main_title + '.md') - subtitle_order.append(paragraph_title) - - # reset the current paragraph - current_paragraph = "" - - # reset link_list - link_list = [] - - previous_contained_if = False - - # line is a title with a maximum depth of 4 - elif title_level > 0: - - # make a new title - metadata_title = make_valid_title(line[title_level + 1:-1]) - - line, link_list = replace_markdown_markers(line[title_level + 1:], link_list, in_code_block, main_title, is_linux_tutorial) - current_paragraph += line - - # line is not a title or the beginning of a new paragraph - elif line != "\n" or previous_contained_if: - line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) - current_paragraph += line - - # keep track of title level and directory to write to metadata upon discovering a new subtitle - if title_level > 0: - last_title_level = title_level - last_dir = curr_dirs[last_title_level] - else: - previous_contained_if = True - line, link_list = replace_markdown_markers(line, link_list, in_code_block, main_title, is_linux_tutorial) - current_paragraph += line - - # create a title for the last paragraph - if current_paragraph_number == -1: - paragraph_title = main_title + _PARAGRAPH_ + f"{paragraph_number:03}" - else: - paragraph_title = main_title + "_" + OS + _PARAGRAPH_ + f"{current_paragraph_number:03}.{paragraph_number:03}" - - # write dictionaries for the last file - if previous_contained_if: - paragraphs_os_text[paragraph_title] = current_paragraph - if options[VERBOSE]: - print("Saved os-specific chunk with temporary title: " + paragraph_title + "\n") - else: - paragraphs_os_free_text[paragraph_title] = current_paragraph - if options[VERBOSE]: - print("Saved generic chunk with title: " + paragraph_title + "\n") - paragraphs_metadata[paragraph_title] = write_metadata(main_title, metadata_title, link_list, last_title_level, curr_dirs[last_title_level], source_file=options[SOURCE_DIRECTORY] + '/' + main_title + '.md') - subtitle_order.append(paragraph_title) - - return paragraphs_os_text, paragraphs_os_free_text, paragraphs_metadata, subtitle_order - - -def paragraph_long_enough(paragraph, options): - """ - Function that checks if the paragraph is long enough to be split of - - :param paragraph: current paragraph - :param options: dictionary containing the options given by the user - :return: - """ - encoding = tiktoken.get_encoding("cl100k_base") - token_amount = len(encoding.encode(paragraph)) - - return token_amount >= options[MIN_PARAGRAPH_LENGTH] - - -def write_metadata(main_title, subtitle, links, title_level, directory, source_file): - """ - Function that writes metadata about a text section to a dictionary - - :param main_title: The main title of the file containing the section - :param subtitle: the title of the section - :param links: a list of links contained within the section - :param title_level: the depth of the title of the section - :param directory: the directory where the section will eventually be written (can either be generic or os-specific) - :param source_file: the source file that the section originates from - :return paragraph_metadata: dictionary containing the metadata about the section - """ - - paragraph_metadata = {MAIN_TITLE: main_title, SUBTITLE: subtitle, SOURCE_FILE: source_file, TITLE_DEPTH: title_level, DIRECTORY: Path(directory).as_posix()} - - if len(links) > 0: - paragraph_metadata[LINKS] = {} - for i, link in enumerate(links): - paragraph_metadata[LINKS][str(i)] = link - - paragraph_metadata[PARENT_TITLE] = Path(directory).parent.name - - return paragraph_metadata - - -def jinja_parser(filename, copy_location, options): - """ - function that let's jinja do its thing to format the files except for the os-related if-statements - - :param filename: the name of the file that needs to be formatted using jinja - :param copy_location: the location of the file that needs to be formatted using jinja - :param options: dictionary containing the options given by the user - :return: - """ - # YAML file location - yml_file_path = os.path.join(RETURN_DIR, RETURN_DIR, MKDOCS_DIR, EXTRA_DIR, 'gent.yml') - - if options[VERBOSE]: - print("Reading YAML file from location: " + yml_file_path) - - # Read the YAML file - with open(yml_file_path, 'r') as yml_file: - words_dict = yaml.safe_load(yml_file) - - # ugly fix for index.md error that occurs because of the macro "config.repo_url" in mkdocs/docs/HPC/index.md - additional_context = { - 'config': { - 'repo_url': REPO_URL - } - } - combined_context = {**words_dict, **additional_context} - - if options[VERBOSE]: - print("Mangling OS-specific if-statements") - - # Mangle the OS-related if-statements - mangle_ifs(copy_location, filename, options) - - if options[VERBOSE]: - print("Altering other if-statements to parse properly") - - # Alter the other if-statements - alter_ifs(filename, options) - - # Use Jinja2 to replace the macros - template_loader = ChoiceLoader([FileSystemLoader(searchpath=[os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES), options[SOURCE_DIRECTORY], os.path.join(options[SOURCE_DIRECTORY], RETURN_DIR)]), FunctionLoader(load_macros)]) - templateEnv = Environment(loader=template_loader) - template = templateEnv.get_template(filename) - rendered_content = template.render(combined_context) - - if options[VERBOSE]: - print("jinja parsing finished\nWriting jinja-parsed file to location: " + copy_location) - - # Save the rendered content to a new file - with open(copy_location, 'w', encoding='utf-8', errors='ignore') as output_file: - output_file.write(rendered_content) - - -def load_macros(name): - """ - function used by the jinja FunctionLoader to retrieve templates from the macros folder since the normal FileSystemLoader can't locate them properly - - :param name: name of the package - :return: - """ - - macros_location = os.path.join(RETURN_DIR, RETURN_DIR, MKDOCS_DIR, DOCS_DIR, MACROS) - - if "../" + MACROS + "/" in name: - package_name = name.split("../" + MACROS + "/")[1] - file_location = os.path.join(macros_location, package_name) - - with open(file_location, 'r') as readfile: - return readfile.read() - - -def mangle_os_ifs(line, is_os, options): - """ - function that mangles the os-related if-statements. This is needed because we want to keep these if-statements intact after jinja-parsing to build the directory structure. - We don't want to mangle all if-related statements (such as else and endif) so we need to keep track of the context of the last few if-statements. - - :param line: the current line to check for os-related if-statements - :param is_os: variable keep track of the current os-state of the if-statements. Can be NON_OS_IF, NON_OS_IF_IN_OS_IF, OS_IF or OS_IF_IN_OS_IF - NON_OS_IF: not in an os-if - NON_OS_IF_IN_OS_IF: in a non-os-if nested in an os-if - OS_IF: in an os-if - OS_IF_IN_OS_IF: in an os-if nested in an os-if - :param options: dictionary containing the options given by the user - :return line: the modified line with mangled os-related if-statements - """ - - match = re.search(r'\{%(.*?)%}(.*)', line) - - start_index = 0 - added_length = 0 - - while match: - - constr_match = re.search(r'\{%.*?%}', match.string) - if_match = re.search(r'if ', match.group(1)) - if_os_match = re.search(r'if OS', match.group(1)) - endif_match = re.search(r'endif', match.group(1)) - else_match = re.search(r'else', match.group(1)) - - # mangle positions - pos_first_mangle = constr_match.start() + start_index + added_length + 1 - pos_second_mangle = constr_match.end() + start_index + added_length - 1 - - # different parts of the original string - part_before_mangling = line[:pos_first_mangle] - part_between_mangling = line[pos_first_mangle:pos_second_mangle] - part_after_mangling = line[pos_second_mangle:] - - # this logic isn't flawless, there are number of nested if-constructions that are technically possible that would break this logic, but these don't appear in the documentation as it doesn't make sense to have these - if endif_match: - if is_os in (OS_IF, OS_IF_IN_OS_IF): - if options[VERBOSE]: - print("OS-specific endif statement found in line: " + line[:-1]) - line = part_before_mangling + IF_MANGLED_PART + part_between_mangling + IF_MANGLED_PART + part_after_mangling - added_length += 2 * len(IF_MANGLED_PART) - if is_os == OS_IF: - is_os = NON_OS_IF - elif is_os == OS_IF_IN_OS_IF: - is_os = OS_IF - elif is_os == NON_OS_IF_IN_OS_IF: - is_os = OS_IF - - elif if_match: - if if_os_match: - if options[VERBOSE]: - print("OS-specific if statement found in line: " + line[:-1]) - line = part_before_mangling + IF_MANGLED_PART + part_between_mangling + IF_MANGLED_PART + part_after_mangling - added_length += 2 * len(IF_MANGLED_PART) - if is_os == OS_IF: - is_os = OS_IF_IN_OS_IF - else: - is_os = OS_IF - else: - if is_os == OS_IF: - is_os = NON_OS_IF_IN_OS_IF - else: - is_os = NON_OS_IF - - elif else_match: - if is_os in (OS_IF, OS_IF_IN_OS_IF): - if options[VERBOSE]: - print("OS-specific else statement found in line: " + line[:-1]) - line = part_before_mangling + IF_MANGLED_PART + part_between_mangling + IF_MANGLED_PART + part_after_mangling - added_length += 2 * len(IF_MANGLED_PART) - - start_index += constr_match.end() - match = re.search(r'\{%(.*?)%}(.*)', match.group(2)) - return line, is_os - - -def mangle_ifs(directory, filename, options): - """ - function that writes the if-mangled version of a file to a location where the jinja parser will use it - - :param directory: the directory of the file to be if mangled - :param filename: the filename of the file to be mangled - :param options: dictionary containing the options given by the user - :return: - """ - # variable to keep track of latest if-statement scope - is_os = NON_OS_IF - - with open(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES, filename), 'w') as write_file: - with open(directory, 'r') as read_file: - for line in read_file: - new_line, is_os = mangle_os_ifs(line, is_os, options) - write_file.write(new_line) - - -def alter_ifs(filename, options): - """ - Function that further adapts the if-statements in a file and writes it to a location where the jinja parser will use it. - This is because the jinja parser doesn't seem to be able to handle statements like {% site == gent %} with context {'site': 'Gent'} in this case. - These statements get changed to {% site == 'Gent' %} in this function. - - :param filename: the filename of the file to be transformed - :param options: dictionary containing the options given by the user - :return: - """ - - with open(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES, filename), 'r') as read_file: - content = read_file.read() - - pattern = r'(\{%-?\s?[a-zA-Z\s]*?[!=]=\s?\(?)([a-zA-Z\s]+(?:\sor\s[a-zA-Z\s]+)*)(\)?\s?%})' - content = re.sub(pattern, - lambda match: (f"{match.group(1)}" + - " or ".join([f"'{city.strip().capitalize()}'" for city in match.group(2).split(" or ")]) + - f"{match.group(3)}" - ), - content) - - with open(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES, filename), 'w') as write_file: - write_file.write(content) - - -def make_valid_title(title): - """ - function that makes sure all titles can be used as valid filenames - - :param title: the string that will be used as title and filename - :return valid_filename: the adapted title that can be used as filename - """ - # Define a regex pattern for invalid characters on both Windows and Linux - invalid_chars = r'[<>:"/\\|?*\0]' - - # get rid of extra information between {} brackets - title = re.sub(r'\{.*?}', '', title) - - # Remove invalid characters - valid_filename = re.sub(invalid_chars, '', title) - - # Strip leading/trailing whitespace - valid_filename = valid_filename.strip().strip('-').replace(' ', '-').replace("--", "-") - - return valid_filename - - -def write_generic_file(title, paragraphs_text, paragraphs_metadata, title_order, title_order_number, options, is_linux_tutorial): - """ - Function that writes text and metadata of a generic (non-os-specific) file - - :param title: title of section - :param paragraphs_text: dictionary containing all paragraphs of text - :param paragraphs_metadata: dictionary containing the metadata for all paragraphs of text - :param title_order: list containing all subtitles in order - :param title_order_number: order number of the title of the section that is being written - :param options: dictionary containing the options given by the user - :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial - :return: - """ - - if len(paragraphs_text[title]) > 0: - # make the directory needed for the files that will be written - filepath = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, GENERIC_DIR, paragraphs_metadata[title][DIRECTORY]) - os.makedirs(filepath, exist_ok=True) - - if options[VERBOSE]: - print("Writing generic section " + title + " to filepath: " + str(filepath)) - - write_files(title, paragraphs_text[title], paragraphs_metadata, title_order, title_order_number, filepath, GENERIC, options, is_linux_tutorial) - else: - # don't write empty files - pass - - -def write_files(title, text, paragraphs_metadata, title_order, title_order_number, filepath, OS, options, is_linux_tutorial): - """ - Function to write files to a certain filepath - - :param title: title of the section to be written - :param text: section of text to be written - :param paragraphs_metadata: dictionary containing the metadata for all paragraphs of text - :param title_order: list containing all subtitles in order - :param title_order_number: order number of the title of the section that is being written - :param filepath: filepath to write files to - :param OS: OS to be included in the metadata - :param options: dictionary containing the options given by the user - :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial - :return: - """ - - metadata = copy.deepcopy(paragraphs_metadata[title]) - - file_title = title - - # write text file - with open(os.path.join(filepath, file_title + ".txt"), 'w') as writefile: - if LINKS in paragraphs_metadata[title].keys(): - adapted_text, metadata[LINKS] = insert_links(text, metadata[LINKS], options) - writefile.write(adapted_text) - else: - writefile.write(text) - - # write metadata - # check if links in metadata is not empty - if LINKS in metadata.keys() and len(metadata[LINKS].keys()) == 0: - del metadata[LINKS] - - # add previous subtitle - if title_order_number != 0: - metadata[PREVIOUS_SUBTITLE] = title_order[title_order_number - 1] - else: - metadata[PREVIOUS_SUBTITLE] = None - - # add next subtitle - if title_order_number != len(title_order) - 1: - metadata[NEXT_SUBTITLE] = title_order[title_order_number + 1] - else: - metadata[NEXT_SUBTITLE] = None - - # add OS - metadata[METADATA_OS] = OS - - # add reference link - if is_linux_tutorial: - linux_part = LINUX_TUTORIAL + "/" - else: - linux_part = "" - if OS == GENERIC: - os_part = "" - else: - os_part = LINK_OS[OS] + "/" - if "index" not in paragraphs_metadata[title][MAIN_TITLE]: - metadata[REFERENCE_LINK] = DOCS_URL + "/" + os_part + linux_part + paragraphs_metadata[title][MAIN_TITLE] + "/#" + ''.join(char.lower() for char in paragraphs_metadata[title][SUBTITLE] if char.isalnum() or char == '-').strip('-') - else: - metadata[REFERENCE_LINK] = DOCS_URL - - # write metadata to file - with open(os.path.join(filepath, file_title + METADATA_EXTENSION + ".json"), 'w') as writefile: - json.dump(metadata, writefile, indent=4) - - -def insert_links(text, links, options): - """ - Function that inserts links in the plaintext or takes out the references to the links depending on the value of INCLUDE_LINKS_IN_PLAINTEXT - - :param text: The plaintext that needs to be adapted - :param links: The links that might need to be inserted - :param options: dictionary containing the options given by the user - :return text: The adapted plaintext - :return links: The links that were actually present in the text - """ - - present_links = [] - new_links = {} - for link_number in re.finditer(LINK_MARKER + r'([0-9]*?)' + LINK_MARKER, text): - present_links.append(link_number.group(1)) - if options[INCLUDE_LINKS_IN_PLAINTEXT]: - text = re.sub(LINK_MARKER + link_number.group(1) + LINK_MARKER, " " + links[link_number.group(1)] + " ", text) - else: - text = re.sub(LINK_MARKER + link_number.group(1) + LINK_MARKER, "", text) - - for link_number in links.keys(): - if link_number in present_links: - new_links[str(len(new_links.keys()))] = links[link_number] - - return text, new_links - - -def split_and_write_os_specific_section(text, metadata, subtitle_order, title_order_number, all_metadata, options, is_linux_tutorial): - """ - Function that splits os-specific sections into subtitles, parses them using jinja and writes them away - - :param text: full os specific section - :param metadata: metadata generated for the full os specific section - :param subtitle_order: order of the subtitles generated by the splitter - :param title_order_number: order number of the section - :param all_metadata: all metadata generated by the splitter - :param options: dictionary containing the options given by the user - :param is_linux_tutorial: boolean indicating whether the current file is part of the linux tutorial - :return: - """ - - # Unmangle if's to use jinja parser - text = re.sub(IF_MANGLED_PART, "", text) - - for OS in [LINUX, WINDOWS, MACOS]: - - # slightly alter if-statements to be able to use predefined macros - text = re.sub(OS, '"' + OS + '"', text) - - # Use jinja to render a different version of the text for each OS - template = Template(text) - jinja_text = template.render(OS=OS) - - if len(jinja_text) != 0: - - # add first subtitle in front of section again - if options[SPLIT_ON_TITLES] or metadata[SUBTITLE] not in make_valid_title(jinja_text[:len(metadata[SUBTITLE]) + 1]): - jinja_text = "#" * metadata[TITLE_DEPTH] + " " + metadata[SUBTITLE].replace("-", " ") + "\n" + jinja_text - else: - jinja_text = "#" * metadata[TITLE_DEPTH] + " " + jinja_text - - # re-adjust text to correct overcorrections - jinja_text = re.sub('"' + OS + '"', OS, jinja_text) - - with open(TEMP_JINJA_FILE, 'w') as writefile: - writefile.write(jinja_text) - - # split in right way - _, os_specific_text, os_specific_metadata, os_subtitle_order = split_text(TEMP_JINJA_FILE, metadata[MAIN_TITLE], options, is_linux_tutorial, current_paragraph_number=subtitle_order[title_order_number].split('_')[-1], OS=OS) - - # prepare variables to fix metadata - total_subtitle_order = subtitle_order[:title_order_number] + os_subtitle_order + subtitle_order[title_order_number+1:] - all_metadata.update(os_specific_metadata) - - # write to files - for os_i, os_subtitle in enumerate(os_subtitle_order): - # check that file actually has some content - if len(os_specific_text[os_subtitle]) > 0: - # add the links to the metadata - if LINKS in metadata.keys(): - os_specific_metadata[os_subtitle][LINKS] = metadata[LINKS] - - # fix parent in the metadata - parent_i = 0 - parent_depth = os_specific_metadata[os_subtitle][TITLE_DEPTH] - 1 - parent = os_specific_metadata[os_subtitle][MAIN_TITLE] - - while total_subtitle_order[parent_i] != os_subtitle and parent_i != len(total_subtitle_order): - if all_metadata[total_subtitle_order[parent_i]][TITLE_DEPTH] == parent_depth: - parent = total_subtitle_order[parent_i] - parent_i += 1 - - if options[SPLIT_ON_PARAGRAPHS] and parent != os_specific_metadata[os_subtitle][MAIN_TITLE]: - os_specific_metadata[os_subtitle][PARENT_TITLE] = all_metadata[parent][SUBTITLE] - else: - os_specific_metadata[os_subtitle][PARENT_TITLE] = parent - - # fix directory in the metadata if needed - if options[DEEP_DIRECTORIES]: - if parent == os_specific_metadata[os_subtitle][MAIN_TITLE]: - os_specific_metadata[os_subtitle][DIRECTORY] = os.path.join(parent, os_specific_metadata[os_subtitle][SUBTITLE]) - else: - os_specific_metadata[os_subtitle][DIRECTORY] = os.path.join(all_metadata[parent][DIRECTORY], os_specific_metadata[os_subtitle][SUBTITLE]) - os_specific_metadata[os_subtitle][DIRECTORY] = Path(os_specific_metadata[os_subtitle][DIRECTORY]).as_posix() - - # make a directory to save the files - filepath = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, OS_SPECIFIC_DIR, OS, os_specific_metadata[os_subtitle][DIRECTORY]) - os.makedirs(filepath, exist_ok=True) - - if options[VERBOSE]: - print("Writing os-specific section " + os_subtitle + " to filepath: " + str(filepath)) - - # write to files - write_files(os_subtitle, os_specific_text[os_subtitle], os_specific_metadata, total_subtitle_order, os_i + title_order_number, filepath, OS, options, is_linux_tutorial) - else: - # don't write empty files - pass - else: - # don't split empty texts - pass - - -def main(options): - """ - main function - - :param options: dictionary containing the options specified by the user to run the script: - {SOURCE_DIRECTORY: The source directory where the original files are located, - DESTINATION_DIRECTORY: The destination directory where the processed files should be written to, - SPLIT_ON_TITLES: boolean indicating whether to split on titles, - SPLIT_ON_PARAGRAPHS: boolean indicating whether to split on paragraphs (should always be the opposite of SPLIT_ON_TITLES), - MIN_PARAGRAPH_LENGTH: integer representing the minimum length of a paragraph, - MAX_TITLE_DEPTH: integer representing the maximum depth of a title for it to be used when splitting the text, - INCLUDE_LINKS_IN_PLAINTEXT: boolean indicating whether links should be included in the plaintext, - DEEP_DIRECTORIES: boolean indicating whether the generated directories should be nested by title-structure or not, - VERBOSE: enable or disable verbose mode} - :return: - """ - - if options[VERBOSE]: - print("Running chatbot parser with options: " + str(options)) - - if options[DEEP_DIRECTORIES] and options[VERBOSE]: - print("WARNING: This script generates a file structure that contains rather long filepaths. Depending on where the script is ran, some of these paths might exceed the maximum length allowed by the system resulting in problems opening the files.") - - # remove the directories from a previous run of the parser if they weren't cleaned up properly for some reason - shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS), ignore_errors=True) - shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], COPIES), ignore_errors=True) - shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES), ignore_errors=True) - - # make the necessary directories - for directory in [COPIES, PARSED_MDS, IF_MANGLED_FILES]: - directory = os.path.join(options[DESTINATION_DIRECTORY], directory) - if not os.path.exists(directory): - os.makedirs(directory) - - ################### define loop-invariant variables ################### - - # constant that keeps track of the source directory - source_directory = options[SOURCE_DIRECTORY] - - # list of all the filenames - filenames = {} - all_items = os.listdir(source_directory) - files = [f for f in all_items if os.path.isfile(os.path.join(source_directory, f)) and ".md" in f[-3:]] - for file in files: - filenames[file] = os.path.join(source_directory, file) - - # for loops over all files - for filename in filenames.keys(): - ################### define/reset loop specific variables ################### - - # boolean indicating whether the current file is part of the linux tutorial - is_linux_tutorial = bool(LINUX_TUTORIAL in filenames[filename]) - - # make a copy of the original file in order to make sure the original does not get altered - copy_file = os.path.join(options[DESTINATION_DIRECTORY], COPIES, filename) - shutil.copyfile(filenames[filename], copy_file) - - # variable that keeps track of the directories that are used to write in at different levels - root_dir_generic = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, GENERIC_DIR) - root_dir_os_specific = os.path.join(options[DESTINATION_DIRECTORY], PARSED_MDS, OS_SPECIFIC_DIR) - root_dir_os_specific_linux = os.path.join(root_dir_os_specific, LINUX) - root_dir_os_specific_windows = os.path.join(root_dir_os_specific, WINDOWS) - root_dir_os_specific_macos = os.path.join(root_dir_os_specific, MACOS) - - # variable for the main title (needed for reference links) - main_title = filename[:-3] - - # variable that keeps track of the directories that are used to write in at different levels - curr_dirs = [filename[:-3] for _ in range(options[MAX_TITLE_DEPTH] + 1)] - - ################### actually parse the md file ################### - - if options[VERBOSE]: - print(LINE + "Processing " + filename) - print("Location: " + filenames[filename]) - print("\nMaking directories:") - - # create directories for the source markdown file - for directory in [root_dir_generic, root_dir_os_specific, root_dir_os_specific_linux, root_dir_os_specific_windows, root_dir_os_specific_macos, os.path.join(root_dir_generic, curr_dirs[0]), os.path.join(root_dir_os_specific_linux, curr_dirs[0]), os.path.join(root_dir_os_specific_windows, curr_dirs[0]), os.path.join(root_dir_os_specific_macos, curr_dirs[0])]: - if options[VERBOSE]: - print(directory) - os.makedirs(directory, exist_ok=True) - - if options[VERBOSE]: - print("\nParsing the sourcefile with jinja") - - # process the jinja macros - jinja_parser(filename, copy_file, options) - - if options[VERBOSE]: - print("\nSplitting the file for the first time (split in sufficiently small generic sections and large os-specific chunks)") - - # split the text in paragraphs - paragraphs_os_text, paragraphs_os_free_text, paragraphs_metadata, subtitle_order = split_text(copy_file, main_title, options, is_linux_tutorial) - - if options[VERBOSE]: - print("\nFurther splitting os-specific chunks and writing generic and os-specific sections to files with metadata") - - # for every section, either make the whole section generic, or create an os-specific file for each OS - for i, subtitle in enumerate(subtitle_order): - - # generic - if subtitle in paragraphs_os_free_text.keys(): - write_generic_file(subtitle, paragraphs_os_free_text, paragraphs_metadata, subtitle_order, i, options, is_linux_tutorial) - - # os-specific - else: - split_and_write_os_specific_section(paragraphs_os_text[subtitle], paragraphs_metadata[subtitle], subtitle_order, i, paragraphs_metadata, options, is_linux_tutorial) - - if options[VERBOSE]: - print("\nFinished processing " + filename) - - if options[VERBOSE]: - print(LINE + "Cleaning up directories:") - print(os.path.join(options[DESTINATION_DIRECTORY], COPIES)) - print(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES)) - print(os.path.join(options[DESTINATION_DIRECTORY], LINUX_TUTORIAL)) - # clean up temporary directories and files - shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], COPIES), ignore_errors=True) - shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], IF_MANGLED_FILES), ignore_errors=True) - shutil.rmtree(os.path.join(options[DESTINATION_DIRECTORY], LINUX_TUTORIAL), ignore_errors=True) - if os.path.exists(TEMP_JINJA_FILE): - os.remove(TEMP_JINJA_FILE) - - if options[VERBOSE]: - print("Parsing finished successfully") - - -################### run the script ################### -if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Preprocessing script for the chatbot\n") - - # adding command-line options - parser.add_argument("-src", "--source", required=True, type=str, help="The source directory where the original files are located") - parser.add_argument("-dst", "--destination", required=True, type=str, help="The destination directory where the processed files should be written to") - parser.add_argument("-st", "--split_on_titles", action="store_true", help="Splits the text based on titles and subtitles instead of paragraphs with a minimum length.") - parser.add_argument("-pl", "--min_paragraph_length", type=int, default=512, help="Minimum length in characters of a paragraph, only works if split on titles is disabled (default: 683)") - parser.add_argument("-td", "--max_title_depth", type=int, default=4, help="Maximum depth of titles that divide the source text into sections, only works if split on titles is enabled (default: 4)") - parser.add_argument("-l", "--links", action="store_true", help="Add links to the output texts") - parser.add_argument("-dd", "--deep_directories", action="store_true", help="Generate a nested directory structure following the structure of the subtitles. Only works if split on titles is enabled") - parser.add_argument("-v", "--verbose", action="store_true", help="Run the script with verbose output") - - args = parser.parse_args() - - options_dict = {SOURCE_DIRECTORY: args.source, - DESTINATION_DIRECTORY: args.destination, - SPLIT_ON_TITLES: args.split_on_titles, - SPLIT_ON_PARAGRAPHS: not args.split_on_titles, - MIN_PARAGRAPH_LENGTH: args.min_paragraph_length, - MAX_TITLE_DEPTH: args.max_title_depth, - INCLUDE_LINKS_IN_PLAINTEXT: args.links, - DEEP_DIRECTORIES: args.deep_directories and args.split_on_titles, - VERBOSE: args.verbose} - - main(options_dict) diff --git a/scripts/HPC_chatbot_preprocessor/requirements.txt b/scripts/HPC_chatbot_preprocessor/requirements.txt deleted file mode 100644 index 1b9cb4a5052..00000000000 --- a/scripts/HPC_chatbot_preprocessor/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -PyYAML==6.0.2 -Jinja2==3.1.4 -tiktoken~=0.7.0 -pathlib~=1.0.1 -pytest \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt deleted file mode 100644 index 94270ff37e3..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001.txt +++ /dev/null @@ -1,6 +0,0 @@ -Main title -This is the first paragraph of text. It is non-os-specific, however it does contain a link. -It also contains some other Markdown syntax and an -example code block. -This intro needs to be sufficiently long as will be explained in the following section (we want to hit the minimum -character limit for a section). diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json deleted file mode 100644 index 31cbf626d8d..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_001_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "Main-title", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 1, - "directory": "tps1", - "links": { - "0": "https://docs.hpc.ugent.be/generic" - }, - "parent_title": "", - "previous_title": null, - "next_title": "tps1_paragraph_002", - "OS": "generic", - "reference_link": "https://docs.hpc.ugent.be/tps1/#main-title" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt deleted file mode 100644 index 58eedc06aa0..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003.txt +++ /dev/null @@ -1,3 +0,0 @@ -Conclusion -Coming up with what to write in test texts is very hard. I think I got the most important test cases in there, but I -might add to this if needed. \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json deleted file mode 100644 index cc7b47a8b5a..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/generic/tps1/tps1_paragraph_003_metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "Conclusion", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 2, - "directory": "tps1", - "parent_title": "", - "previous_title": "tps1_paragraph_002", - "next_title": null, - "OS": "generic", - "reference_link": "https://docs.hpc.ugent.be/tps1/#conclusion" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt deleted file mode 100644 index d0ee9ce8256..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001.txt +++ /dev/null @@ -1,4 +0,0 @@ -OS specific sections -This is the second section, it is the start of some -text specific to OSes that aren't windows. I feel like there is no need to make this section very long, however I will -still add a link. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json deleted file mode 100644 index fb165c8e7fc..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.001_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "OS-specific-sections", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 2, - "directory": "tps1", - "parent_title": "Main-title", - "links": { - "0": "https://docs.hpc.ugent.be/linuxmacos" - }, - "previous_title": "tps1_paragraph_001", - "next_title": "tps1_linux_paragraph_002.002", - "OS": "linux", - "reference_link": "https://docs.hpc.ugent.be/Linux/tps1/#os-specific-sections" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt deleted file mode 100644 index 1a3867e69fa..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002.txt +++ /dev/null @@ -1,3 +0,0 @@ -Non Windows section -Whereas the Windows version of this section had a lot of unnecessary newlines, this one will just be a short and concise -section that ends right here. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json deleted file mode 100644 index 36cda85cfcc..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/linux/tps1/tps1_linux_paragraph_002.002_metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "Non-Windows-section", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 3, - "directory": "tps1", - "parent_title": "OS-specific-sections", - "previous_title": "tps1_linux_paragraph_002.001", - "next_title": "tps1_paragraph_003", - "OS": "linux", - "reference_link": "https://docs.hpc.ugent.be/Linux/tps1/#non-windows-section" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt deleted file mode 100644 index e0642d6ac96..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001.txt +++ /dev/null @@ -1,4 +0,0 @@ -OS specific sections -This is the second section, it is the start of some -text specific to OSes that aren't "windows". I feel like there is no need to make this section very long, however I will -still add a link. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json deleted file mode 100644 index 2de51c7c0e1..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.001_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "OS-specific-sections", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 2, - "directory": "tps1", - "parent_title": "Main-title", - "links": { - "0": "https://docs.hpc.ugent.be/linuxmacos" - }, - "previous_title": "tps1_paragraph_001", - "next_title": "tps1_macos_paragraph_002.002", - "OS": "macos", - "reference_link": "https://docs.hpc.ugent.be/macOS/tps1/#os-specific-sections" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt deleted file mode 100644 index 1a3867e69fa..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002.txt +++ /dev/null @@ -1,3 +0,0 @@ -Non Windows section -Whereas the Windows version of this section had a lot of unnecessary newlines, this one will just be a short and concise -section that ends right here. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json deleted file mode 100644 index fb48000e679..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/macos/tps1/tps1_macos_paragraph_002.002_metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "Non-Windows-section", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 3, - "directory": "tps1", - "parent_title": "OS-specific-sections", - "previous_title": "tps1_macos_paragraph_002.001", - "next_title": "tps1_paragraph_003", - "OS": "macos", - "reference_link": "https://docs.hpc.ugent.be/macOS/tps1/#non-windows-section" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt deleted file mode 100644 index 9a9cbe1f3d2..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001.txt +++ /dev/null @@ -1,7 +0,0 @@ -OS specific sections -This is the second section, it is the start of some text specific to windows. -In this section it is probably no longer needed to test the Markdown syntax again, however I will make it somewhat longer -to make sure we get a long section that is over the minimum required length for the next newline character to be -classified as the end of this section. I am doing this because for the next sections I want to test whether they will be -grouped together if they are not long enough to reach the minimum paragraph length on their own. Also, before I forget, -let's add a link in this section as well. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json deleted file mode 100644 index 00b7fcee452..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.001_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "OS-specific-sections", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 2, - "directory": "tps1", - "parent_title": "Main-title", - "links": { - "0": "https://docs.hpc.ugent.be/windows" - }, - "previous_title": "tps1_paragraph_001", - "next_title": "tps1_windows_paragraph_002.002", - "OS": "windows", - "reference_link": "https://docs.hpc.ugent.be/Windows/tps1/#os-specific-sections" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt deleted file mode 100644 index 6b57235f68f..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002.txt +++ /dev/null @@ -1,6 +0,0 @@ -Windows specific section -Like this. -And this. -And also this. -These section should all be grouped together under the windows specific section of the output. The addition of this long -section at the end should make sure the combination of sections comes to an end here. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json deleted file mode 100644 index 0e38a476d04..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/output/parsed_mds/os_specific/windows/tps1/tps1_windows_paragraph_002.002_metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "main_title": "tps1", - "subtitle": "Windows-specific-section", - "source_file": "tests/test_files/ftps/tps1.md", - "title_depth": 3, - "directory": "tps1", - "parent_title": "OS-specific-sections", - "previous_title": "tps1_windows_paragraph_002.001", - "next_title": "tps1_paragraph_003", - "OS": "windows", - "reference_link": "https://docs.hpc.ugent.be/Windows/tps1/#windows-specific-section" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md deleted file mode 100644 index d9b10d0c524..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftps/tps1.md +++ /dev/null @@ -1,43 +0,0 @@ -# Main title - -This is the first paragraph of text. It is non-os-specific, however it does contain [a link](generic.md). -It also contains some `other` *Markdown* _syntax_ and an -```shell -example code block. -``` -This intro needs to be sufficiently long as will be explained in the following section (we want to hit the minimum -character limit for a section). - -## OS specific sections - -This is the second section, it is the start of some {% if OS == windows %} text specific to windows. -In this section it is probably no longer needed to test the Markdown syntax again, however I will make it somewhat longer -to make sure we get a long section that is over the minimum required length for the next newline character to be -classified as the end of this section. I am doing this because for the next sections I want to test whether they will be -grouped together if they are not long enough to reach the minimum paragraph length on their own. Also, before I forget, -let's add [a link](windows.md) in this section as well. - -### Windows specific section - -Like this. - -And this. - -And also this. - -These section should all be grouped together under the windows specific section of the output. The addition of this long -section at the end should make sure the combination of sections comes to an end here. -{% else %} -text specific to OSes that aren't windows. I feel like there is no need to make this section very long, however I will -still add [a link](linuxmacos.md). - -### Non Windows section - -Whereas the Windows version of this section had a lot of unnecessary newlines, this one will just be a short and concise -section that ends right here. -{% endif %} - -## Conclusion - -Coming up with what to write in test texts is very hard. I think I got the most important test cases in there, but I -might add to this if needed. diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt deleted file mode 100644 index f62a4f31fee..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1.txt +++ /dev/null @@ -1,2 +0,0 @@ -blablabla -blablablabla diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json deleted file mode 100644 index e481468cefe..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-1/Subtitle-1_metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-1", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 2, - "directory": "tts1/Main-title/Subtitle-1", - "parent_title": "Main-title", - "previous_title": "Main-title", - "next_title": "Subtitle-2-g", - "OS": "generic", - "reference_link": "https://docs.hpc.ugent.be/tts1/#subtitle-1" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt deleted file mode 100644 index bdf68551202..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g.txt +++ /dev/null @@ -1 +0,0 @@ -blablabla \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json deleted file mode 100644 index 100766dd865..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/generic/tts1/Main-title/Subtitle-5-g/Subtitle-5-g_metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-5-g", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 2, - "directory": "tts1/Main-title/Subtitle-5-g", - "parent_title": "Main-title", - "previous_title": "Subtitle-2-g", - "next_title": null, - "OS": "generic", - "reference_link": "https://docs.hpc.ugent.be/tts1/#subtitle-5-g" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt deleted file mode 100644 index 48125d91679..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt +++ /dev/null @@ -1,4 +0,0 @@ -blablabla generic -blablabla generic -blablabla Linux macOS -blablablabla Linux macOS with a link diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json deleted file mode 100644 index 6f42345d013..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-2-g", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 2, - "directory": "tts1/Main-title/Subtitle-2-g", - "parent_title": "Main-title", - "links": { - "0": "https://docs.hpc.ugent.be/linuxmacos" - }, - "previous_title": "Subtitle-1", - "next_title": "Subtitle-4-l&m", - "OS": "linux", - "reference_link": "https://docs.hpc.ugent.be/Linux/tts1/#subtitle-2-g" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt deleted file mode 100644 index b221f26074b..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt +++ /dev/null @@ -1,3 +0,0 @@ -blablabla Linux macOS -blablablabla Linux macOS -blablabla generic with a link \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json deleted file mode 100644 index 351b6f5cca6..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/linux/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-4-l&m", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 3, - "directory": "tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m", - "parent_title": "Subtitle-2-g", - "links": { - "0": "https://docs.hpc.ugent.be/generic" - }, - "previous_title": "Subtitle-2-g", - "next_title": "Subtitle-5-g", - "OS": "linux", - "reference_link": "https://docs.hpc.ugent.be/Linux/tts1/#subtitle-4-lm" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt deleted file mode 100644 index 48125d91679..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt +++ /dev/null @@ -1,4 +0,0 @@ -blablabla generic -blablabla generic -blablabla Linux macOS -blablablabla Linux macOS with a link diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json deleted file mode 100644 index 30249d3d155..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-2-g", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 2, - "directory": "tts1/Main-title/Subtitle-2-g", - "parent_title": "Main-title", - "links": { - "0": "https://docs.hpc.ugent.be/linuxmacos" - }, - "previous_title": "Subtitle-1", - "next_title": "Subtitle-4-l&m", - "OS": "macos", - "reference_link": "https://docs.hpc.ugent.be/macOS/tts1/#subtitle-2-g" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt deleted file mode 100644 index b221f26074b..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m.txt +++ /dev/null @@ -1,3 +0,0 @@ -blablabla Linux macOS -blablablabla Linux macOS -blablabla generic with a link \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json deleted file mode 100644 index 087fe810609..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/macos/tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m/Subtitle-4-l&m_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-4-l&m", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 3, - "directory": "tts1/Main-title/Subtitle-2-g/Subtitle-4-l&m", - "parent_title": "Subtitle-2-g", - "links": { - "0": "https://docs.hpc.ugent.be/generic" - }, - "previous_title": "Subtitle-2-g", - "next_title": "Subtitle-5-g", - "OS": "macos", - "reference_link": "https://docs.hpc.ugent.be/macOS/tts1/#subtitle-4-lm" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt deleted file mode 100644 index f9f20592832..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g.txt +++ /dev/null @@ -1,4 +0,0 @@ -blablabla generic -blablabla generic -blablabla windows -blablabla windows with a link diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json deleted file mode 100644 index da3c61d3edc..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-2-g_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-2-g", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 2, - "directory": "tts1/Main-title/Subtitle-2-g", - "parent_title": "Main-title", - "links": { - "0": "https://docs.hpc.ugent.be/windows" - }, - "previous_title": "Subtitle-1", - "next_title": "Subtitle-3-w", - "OS": "windows", - "reference_link": "https://docs.hpc.ugent.be/Windows/tts1/#subtitle-2-g" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt deleted file mode 100644 index 0b587cef85a..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w.txt +++ /dev/null @@ -1,3 +0,0 @@ -blablabla windows -blablablabla windows -blablabla generic with a link \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json deleted file mode 100644 index e07586cf55e..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/output/parsed_mds/os_specific/windows/tts1/Main-title/Subtitle-2-g/Subtitle-3-w/Subtitle-3-w_metadata.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "main_title": "tts1", - "subtitle": "Subtitle-3-w", - "source_file": "tests/test_files/ftts/tts1.md", - "title_depth": 3, - "directory": "tts1/Main-title/Subtitle-2-g/Subtitle-3-w", - "parent_title": "Subtitle-2-g", - "links": { - "0": "https://docs.hpc.ugent.be/generic" - }, - "previous_title": "Subtitle-2-g", - "next_title": "Subtitle-5-g", - "OS": "windows", - "reference_link": "https://docs.hpc.ugent.be/Windows/tts1/#subtitle-3-w" -} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md deleted file mode 100644 index 2f3ad7f9c08..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/ftts/tts1.md +++ /dev/null @@ -1,31 +0,0 @@ -# Main title - -## Subtitle 1 - -blablabla -blablablabla - -## Subtitle 2 g - -blablabla generic -blablabla generic -{% if OS == windows %}blablabla windows -blablabla windows with a [link](windows.md) - -### Subtitle 3 w - -blablabla windows -blablablabla windows -{% else %}blablabla Linux macOS -blablablabla Linux macOS with a [link](linuxmacos.md) - -### Subtitle 4 l&m - -blablabla Linux macOS -blablablabla Linux macOS -{% endif %} -blablabla generic with a [link](generic.md) - -## Subtitle 5 g - -blablabla diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md deleted file mode 100644 index 6a74b3c0181..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_input.md +++ /dev/null @@ -1,4 +0,0 @@ -test1: OS_IF -{% if OS == windows %} -test1 -{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md deleted file mode 100644 index 2f9cdc38294..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_1_output.md +++ /dev/null @@ -1,4 +0,0 @@ -test1: OS_IF -{-if-% if OS == windows %-if-} -test1 -{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md deleted file mode 100644 index 360a4a59ba3..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_input.md +++ /dev/null @@ -1,7 +0,0 @@ -test2: OS_IF in NON_OS_IF -{% if site == Gent %} -test2 -{% if OS == windows %} -test2 -{% endif %} -{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md deleted file mode 100644 index 798dcf6db24..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_2_output.md +++ /dev/null @@ -1,7 +0,0 @@ -test2: OS_IF in NON_OS_IF -{% if site == Gent %} -test2 -{-if-% if OS == windows %-if-} -test2 -{-if-% endif %-if-} -{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md deleted file mode 100644 index d93125a5971..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_input.md +++ /dev/null @@ -1,6 +0,0 @@ -test3: OS_IF with else -{% if OS == linux %} -test3 -{% else %} -test3 -{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md deleted file mode 100644 index 02141961338..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_3_output.md +++ /dev/null @@ -1,6 +0,0 @@ -test3: OS_IF with else -{-if-% if OS == linux %-if-} -test3 -{-if-% else %-if-} -test3 -{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md deleted file mode 100644 index cc15fae1df1..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_input.md +++ /dev/null @@ -1,4 +0,0 @@ -test4: OS_IF with wrong syntax -{ if OS == macos } -test4 -{ endif } \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md deleted file mode 100644 index cc15fae1df1..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_4_output.md +++ /dev/null @@ -1,4 +0,0 @@ -test4: OS_IF with wrong syntax -{ if OS == macos } -test4 -{ endif } \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md deleted file mode 100644 index bdb288474e2..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_input.md +++ /dev/null @@ -1,11 +0,0 @@ -test5: OS_IF in OS_IF -{% if OS == windows %} -test5 -{% else %} -{% if OS == linux %} -test5 -{% else %} -test5 -{% endif %} -test5 -{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md deleted file mode 100644 index 10443eb67a4..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_5_output.md +++ /dev/null @@ -1,11 +0,0 @@ -test5: OS_IF in OS_IF -{-if-% if OS == windows %-if-} -test5 -{-if-% else %-if-} -{-if-% if OS == linux %-if-} -test5 -{-if-% else %-if-} -test5 -{-if-% endif %-if-} -test5 -{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md deleted file mode 100644 index 0731ee3588c..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_input.md +++ /dev/null @@ -1,8 +0,0 @@ -test6: NON_OS_IF in OS_IF -{% if OS == macos %} -test6 -{% if site == Gent %} -test6 -{% endif %} -test6 -{% endif %} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md deleted file mode 100644 index cd37117cb00..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_6_output.md +++ /dev/null @@ -1,8 +0,0 @@ -test6: NON_OS_IF in OS_IF -{-if-% if OS == macos %-if-} -test6 -{% if site == Gent %} -test6 -{% endif %} -test6 -{-if-% endif %-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md deleted file mode 100644 index 6a72a338527..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_input.md +++ /dev/null @@ -1,9 +0,0 @@ -test7: weird spacing and dashes - {%if OS == windows %} - test7 -{%- else%} - test7 - {% if OS == linux%} -test7 - {%-endif %} -{%endif%} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md deleted file mode 100644 index dfe342ebfb1..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_7_output.md +++ /dev/null @@ -1,9 +0,0 @@ -test7: weird spacing and dashes - {-if-%if OS == windows %-if-} - test7 -{-if-%- else%-if-} - test7 - {-if-% if OS == linux%-if-} -test7 - {-if-%-endif %-if-} -{-if-%endif%-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md deleted file mode 100644 index fb8c1f8b539..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_input.md +++ /dev/null @@ -1,55 +0,0 @@ -test1: OS_IF -{% if OS == windows %} -test1 -{% endif %} - -test2: OS_IF in NON_OS_IF -{% if site == Gent %} -test2 -{% if OS == windows %} -test2 -{% endif %} -{% endif %} - -test3: OS_IF with else -{% if OS == linux %} -test3 -{% else %} -test3 -{% endif %} - -test4: OS_IF with wrong syntax -{ if OS == macos } -test4 -{ endif } - -test5: OS_IF in OS_IF -{% if OS == windows %} -test5 -{% else %} -{% if OS == linux %} -test5 -{% else %} -test5 -{% endif %} -test5 -{% endif %} - -test6: NON_OS_IF in OS_IF -{% if OS == macos %} -test6 -{% if site == Gent %} -test6 -{% endif %} -test6 -{% endif %} - -test7: weird spacing and dashes - {%if OS == windows %} - test7 -{%- else%} - test7 - {% if OS == linux%} -test7 - {%-endif %} -{%endif%} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md deleted file mode 100644 index 796e94348fa..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/if_mangler_test_files/if_mangler_output.md +++ /dev/null @@ -1,55 +0,0 @@ -test1: OS_IF -{-if-% if OS == windows %-if-} -test1 -{-if-% endif %-if-} - -test2: OS_IF in NON_OS_IF -{% if site == Gent %} -test2 -{-if-% if OS == windows %-if-} -test2 -{-if-% endif %-if-} -{% endif %} - -test3: OS_IF with else -{-if-% if OS == linux %-if-} -test3 -{-if-% else %-if-} -test3 -{-if-% endif %-if-} - -test4: OS_IF with wrong syntax -{ if OS == macos } -test4 -{ endif } - -test5: OS_IF in OS_IF -{-if-% if OS == windows %-if-} -test5 -{-if-% else %-if-} -{-if-% if OS == linux %-if-} -test5 -{-if-% else %-if-} -test5 -{-if-% endif %-if-} -test5 -{-if-% endif %-if-} - -test6: NON_OS_IF in OS_IF -{-if-% if OS == macos %-if-} -test6 -{% if site == Gent %} -test6 -{% endif %} -test6 -{-if-% endif %-if-} - -test7: weird spacing and dashes - {-if-%if OS == windows %-if-} - test7 -{-if-%- else%-if-} - test7 - {-if-% if OS == linux%-if-} -test7 - {-if-%-endif %-if-} -{-if-%endif%-if-} \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md b/scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md deleted file mode 100644 index 1e18a1495d5..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_files/list_file/list_test.md +++ /dev/null @@ -1,15 +0,0 @@ -# Title - -Some explanation about the following list that is quite long. This could be problematic since this could mean that the explanation of the content of the list would be part of a different paragraph than the list. - -1. First entry that is very verbose since we want to hit the character limit for a paragraph to make sure a list can't be split in the middle. If this entry is long enough, the character limit should make it so that any of the following newlines can be the start of a new section if the splitter doesn't know it is in a list. - -2. Second entry - -3. Third entry - - ![image](img/an_image_for_the_third_entry.png) - -4. Fourth entry that is very verbose, so we hit the character limit for a section split, even though it shouldn't be necessary since the explanation of the list is already well above the character limit. - -And now the text continues like normal in a new section. \ No newline at end of file diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_full_script.py b/scripts/HPC_chatbot_preprocessor/tests/test_full_script.py deleted file mode 100644 index 99baf41ebc0..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_full_script.py +++ /dev/null @@ -1,68 +0,0 @@ -import pytest -import os -import shutil -from chatbot_parser import main - - -@pytest.mark.parametrize("input_directory,actual_output_directory,expected_output_directory, options", [ - ("tests/test_files/ftps", "tests/test_files/ftps/actual", - "tests/test_files/ftps/output", - {"SOURCE_DIRECTORY": "tests/test_files/ftps", - "DESTINATION_DIRECTORY": "tests/test_files/ftps/actual", - "SPLIT_ON_TITLES": False, - "SPLIT_ON_PARAGRAPHS": True, - "MIN_PARAGRAPH_LENGTH": 50, - "MAX_TITLE_DEPTH": 4, - "INCLUDE_LINKS_IN_PLAINTEXT": False, - "DEEP_DIRECTORIES": False, - "VERBOSE": False} - ), - ("tests/test_files/ftts", "tests/test_files/ftts/actual", - "tests/test_files/ftts/output", - {"SOURCE_DIRECTORY": "tests/test_files/ftts", - "DESTINATION_DIRECTORY": "tests/test_files/ftts/actual", - "SPLIT_ON_TITLES": True, - "SPLIT_ON_PARAGRAPHS": False, - "MIN_PARAGRAPH_LENGTH": 160, - "MAX_TITLE_DEPTH": 4, - "INCLUDE_LINKS_IN_PLAINTEXT": False, - "DEEP_DIRECTORIES": True, - "VERBOSE": False} - ) -]) -def test_full_script_generated_directories(input_directory, actual_output_directory, expected_output_directory, options): - # run the script - main(options) - - # Compare directories and files - for dirpath, dirnames, filenames in os.walk(expected_output_directory): - relative_path = os.path.relpath(dirpath, expected_output_directory) - actual_dir = os.path.join(actual_output_directory, relative_path) - - # Check if the directory exists - assert os.path.isdir(actual_dir), f"Directory '{actual_dir}' is missing." - - # Check for files - for filename in filenames: - ref_file = os.path.join(dirpath, filename) - gen_file = os.path.join(actual_dir, filename) - - # Check if the file exists - assert os.path.isfile(gen_file), f"File '{gen_file}' is missing." - - # Check file content - with open(ref_file, 'r') as ref_f, open(gen_file, 'r') as gen_f: - ref_content = ref_f.read().strip() - gen_content = gen_f.read().strip() - assert ref_content == gen_content, f"Content of file '{gen_file}' does not match." - - # check that not too many directories have been generated - for dirpath, dirnames, filenames in os.walk(actual_output_directory): - relative_path = os.path.relpath(dirpath, actual_output_directory) - expected_dir = os.path.join(expected_output_directory, relative_path) - - # Check if the directory exists - assert os.path.isdir(expected_dir), f"Directory '{relative_path}' was made, but shouldn't have been." - - # remove directory - shutil.rmtree(actual_output_directory, ignore_errors=True) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py b/scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py deleted file mode 100644 index c2ae9fea19e..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_if_mangler.py +++ /dev/null @@ -1,32 +0,0 @@ -import pytest -import os -import shutil -from chatbot_parser import mangle_ifs - - -@pytest.mark.parametrize("input_file,output_file", [ - ("if_mangler_1_input.md", "if_mangler_1_output.md"), - ("if_mangler_2_input.md", "if_mangler_2_output.md"), - ("if_mangler_3_input.md", "if_mangler_3_output.md"), - ("if_mangler_4_input.md", "if_mangler_4_output.md"), - ("if_mangler_5_input.md", "if_mangler_5_output.md"), - ("if_mangler_6_input.md", "if_mangler_6_output.md"), - ("if_mangler_7_input.md", "if_mangler_7_output.md") -]) -def test_if_mangler(input_file, output_file): - # make directory - os.makedirs(os.path.join("if_mangled_files"), exist_ok=True) - - # make filepaths - input_file_path = os.path.join("tests", "test_files", "if_mangler_test_files", input_file) - expected_output_file_path = os.path.join("tests", "test_files", "if_mangler_test_files", output_file) - actual_output_file_path = os.path.join("if_mangled_files", input_file) - mangle_ifs(input_file_path, input_file, {"DESTINATION_DIRECTORY": '.', "VERBOSE": False}) - - # check every line - with open(expected_output_file_path, "r") as expected_read_file: - with open(actual_output_file_path, "r") as actual_read_file: - assert all([expected_line == actual_line for expected_line, actual_line in zip(expected_read_file, actual_read_file)]) - - # remove directory - shutil.rmtree("if_mangled_files", ignore_errors=True) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py b/scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py deleted file mode 100644 index 9109f2518ad..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_insert_links.py +++ /dev/null @@ -1,31 +0,0 @@ -import pytest -from chatbot_parser import insert_links - -options_include = {"INCLUDE_LINKS_IN_PLAINTEXT": True} -options_leave_out = {"INCLUDE_LINKS_IN_PLAINTEXT": False} -links_input = {"0": "https://first_link.com", "1": "https://second_link.be", "2": "https://docs.hpc.ugent.be/account#welcome-e-mail", "3": "https://final-link.org"} - - -@pytest.mark.parametrize("text_input, options_input, text_output, new_links", [ - # Text without links - # don't include links - ("Text without links\nand with two lines.", options_leave_out, "Text without links\nand with two lines.", {}), - # include links - ("Text without links\nand with two lines.", options_include, "Text without links\nand with two lines.", {}), - # Text with all links - # don't include links - ("Text with all the links\nand with multiple lines.\n§link§link§0§link§link§\n§link§link§1§link§link§\n§link§link§2§link§link§\n§link§link§3§link§link§", options_leave_out, - "Text with all the links\nand with multiple lines.\n\n\n\n", links_input), - # include links - ("Text with all the links\nand with multiple lines.\n§link§link§0§link§link§\n§link§link§1§link§link§\n§link§link§2§link§link§\n§link§link§3§link§link§", options_include, - "Text with all the links\nand with multiple lines.\n https://first_link.com \n https://second_link.be \n https://docs.hpc.ugent.be/account#welcome-e-mail \n https://final-link.org ", links_input), - # Text with some links - # don't include links - ("Text with all the links\nand with multiple lines.\n§link§link§1§link§link§\n§link§link§3§link§link§", options_leave_out, - "Text with all the links\nand with multiple lines.\n\n", {"0": "https://second_link.be", "1": "https://final-link.org"}), - # include links - ("Text with all the links\nand with multiple lines.\n§link§link§0§link§link§\n§link§link§2§link§link§", options_include, - "Text with all the links\nand with multiple lines.\n https://first_link.com \n https://docs.hpc.ugent.be/account#welcome-e-mail ", {"0": "https://first_link.com", "1": "https://docs.hpc.ugent.be/account#welcome-e-mail"}) -]) -def test_insert_links(text_input, options_input, text_output, new_links): - assert insert_links(text_input, links_input, options_input) == (text_output, new_links) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_links.py b/scripts/HPC_chatbot_preprocessor/tests/test_links.py deleted file mode 100644 index a13675dd3ad..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_links.py +++ /dev/null @@ -1,71 +0,0 @@ -import os -import pytest -from urllib import request -from chatbot_parser import main -import json - -#################################################### IMPORTANT: This test still fails because there are some invalid links in the documentation #################################################### - -whitelist = ["mailto:hpc@ugent.be"] -slow_list = ["https://login.hpc.ugent.be", "https://www.edx.org/course/introduction-linux-linuxfoundationx-lfs101x-0"] - -options_general = {"SOURCE_DIRECTORY": "../../mkdocs/docs/HPC", - "DESTINATION_DIRECTORY": ".", - "SPLIT_ON_TITLES": False, - "SPLIT_ON_PARAGRAPHS": True, - "MIN_PARAGRAPH_LENGTH": 683, - "MAX_TITLE_DEPTH": 4, - "INCLUDE_LINKS_IN_PLAINTEXT": False, - "DEEP_DIRECTORIES": False, - "VERBOSE": False} -options_os_specific = {"SOURCE_DIRECTORY": "../../mkdocs/docs/HPC/linux-tutorial", - "DESTINATION_DIRECTORY": "./linux-tutorial", - "SPLIT_ON_TITLES": False, - "SPLIT_ON_PARAGRAPHS": True, - "MIN_PARAGRAPH_LENGTH": 683, - "MAX_TITLE_DEPTH": 4, - "INCLUDE_LINKS_IN_PLAINTEXT": False, - "DEEP_DIRECTORIES": False, - "VERBOSE": False} - - -@pytest.mark.parametrize("options", [options_general, options_os_specific]) -def test_all_links(options): - all_links = {} - main(options) - broken_links = {} - empty_links = {} - - for (dirpath, dirnames, filenames) in os.walk(os.path.join(options['DESTINATION_DIRECTORY'], 'parsed_mds')): - for filename in filenames: - all_links[filename] = [] - if filename.endswith('metadata.json'): - data = json.load(open(os.path.join(dirpath, filename))) - if 'links' in data.keys(): - for key in data['links'].keys(): - all_links[filename].append(data['links'][key]) - all_links[filename].append(data['reference_link'].split("#")[0]) - - for filename in all_links.keys(): - all_links[filename] = list(set(all_links[filename])) - for link in all_links[filename]: - if len(link) != 0: - try: - if link not in whitelist and link not in slow_list: - with request.urlopen(link) as res: - if res.status == 200: - pass - except: - print("Broken link in " + filename + ": " + link) - if filename in broken_links.keys(): - broken_links[filename].append(link) - else: - broken_links[filename] = [link] - else: - print("Empty link in " + filename) - if filename in empty_links.keys(): - empty_links[filename].append(link) - else: - empty_links[filename] = [link] - assert len(empty_links.keys()) == 0 - assert len(broken_links.keys()) == 0 diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_lists.py b/scripts/HPC_chatbot_preprocessor/tests/test_lists.py deleted file mode 100644 index 56ac3348dfa..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_lists.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest -from chatbot_parser import split_on_paragraphs - - -@pytest.mark.parametrize("file, main_title, options, is_linux_tutorial, expected_text", [ - ("./tests/test_files/list_file/list_test.md", - "list_test.md", - { - "SOURCE_DIRECTORY": "./test_files/list_file", - "DESTINATION_DIRECTORY": "./test_files/list_file", - "SPLIT_ON_TITLES": False, - "SPLIT_ON_PARAGRAPHS": True, - "MIN_PARAGRAPH_LENGTH": 100, - "MAX_TITLE_DEPTH": 4, - "INCLUDE_LINKS_IN_PLAINTEXT": False, - "DEEP_DIRECTORIES": False, - "VERBOSE": False - }, - False, - {'list_test.md_paragraph_001': 'Title\n' - 'Some explanation about the following list that ' - 'is quite long. This could be problematic since ' - 'this could mean that the explanation of the ' - 'content of the list would be part of a ' - 'different paragraph than the list.\n' - '1. First entry that is very verbose since we ' - 'want to hit the character limit for a ' - "paragraph to make sure a list can't be split " - 'in the middle. If this entry is long enough, ' - 'the character limit should make it so that any ' - 'of the following newlines can be the start of ' - "a new section if the splitter doesn't know it " - 'is in a list.\n' - '2. Second entry\n' - '3. Third entry\n' - '4. Fourth entry that is very verbose, so we ' - 'hit the character limit for a section split, ' - "even though it shouldn't be necessary since " - 'the explanation of the list is already well ' - 'above the character limit.\n', - 'list_test.md_paragraph_002': 'And now the text continues like normal in a ' - 'new section.'} - ) -]) -def test_links(file, main_title, options, is_linux_tutorial, expected_text): - assert split_on_paragraphs(file, main_title, options, is_linux_tutorial)[1] == expected_text diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py b/scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py deleted file mode 100644 index 225c368477d..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_make_valid_title.py +++ /dev/null @@ -1,14 +0,0 @@ -import pytest -from chatbot_parser import make_valid_title - - -@pytest.mark.parametrize("input_string,expected", [ - ("", ""), - ("A-good-filename-with-dashes", "A-good-filename-with-dashes"), - (" A very good filename beginning and ending in a space ", "A-very-good-filename-beginning-and-ending-in-a-space"), - ("-A-very-good-filename-beginning-and-ending-in-a-dash-", "A-very-good-filename-beginning-and-ending-in-a-dash"), - ("A filename containing bad characters <>:\"/\\|?*\0", "A-filename-containing-bad-characters"), - ("A filename ending with {some jinja garbage}", "A-filename-ending-with") -]) -def test_make_valid_title(input_string, expected): - assert make_valid_title(input_string) == expected diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py b/scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py deleted file mode 100644 index d9150290f34..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_replace_markdown_markers.py +++ /dev/null @@ -1,46 +0,0 @@ -import pytest -from chatbot_parser import replace_markdown_markers - - -@pytest.mark.parametrize("input_line, input_linklist, in_code_block, main_title, expected_line, expected_linklist", [ - # baseline test - ("A normal line with nothing special", [], False, "", "A normal line with nothing special", []), - # image 1 - ("![image](a-nice-image.png)", [], False, "", "", []), - # image 2 - ("![](img/Look-at-this-photograph.png)", [], False, "", "", []), - # link 1 (outside docs) - ("A line with a [link](https://a-nice-link.com)", ["https://another-link.be"], False, "", - "A line with a link§link§link§1§link§link§", ["https://another-link.be", "https://a-nice-link.com"]), - # link 2 (another document within the docs) - ("A line with a [link to the docs](account.md#welcome-e-mail)", ["https://another-link.be"], False, "", - "A line with a link to the docs§link§link§1§link§link§", ["https://another-link.be", "https://docs.hpc.ugent.be/account/#welcome-e-mail"]), - # link 3 (the same document) - ("A line with a [link to the same doc](#welcome-e-mail)", ["https://another-link.be"], False, "account.md", - "A line with a link to the same doc§link§link§1§link§link§", ["https://another-link.be", "https://docs.hpc.ugent.be/account/#welcome-e-mail"]), - # codeblock - ("```shell", [], True, "", "", []), - # html syntax 1 (normal syntax) - ("A line with something in Bold", [], False, "", "A line with something in Bold", []), - # html syntax 2 (link) - ("A line with another link
", ["other-website.com"], False, "", - "A line with another link§link§link§1§link§link§", ["other-website.com", "website.com"]), - # html syntax 3 (style) - ("

A line with style

", [], False, "", "A line with style", []), - # Bot comment - ("", [], False, "", "Something about the following table", []), - # non-Bot comment - ("", [], False, "", "", []), - # something else with <> - ("A line with an example where you should put ", [], False, "", "A line with an example where you should put ", []), - # info/tips/warnings - ("!!! warning", [], False, "", " warning", []), - # collapsable admonitions - ("??? note", [], False, "", " note", []), - # Markdown syntax 1 (not in code block) - ("`Line` **with** ++a++ _lot_ *of* _++markdown++_ `syntax`", [], False, "", "Line with a lot of markdown syntax", []), - # Markdown syntax 2 (in code block) - ("`Line` **with** ++slightly++ _less_ *markdown* _++syntax++_", [], True, "", "`Line` **with** ++slightly++ _less_ *markdown* _++syntax++_", []) -]) -def test_replace_markdown_markers(input_line, input_linklist, in_code_block, main_title, expected_line, expected_linklist): - assert replace_markdown_markers(input_line, input_linklist, in_code_block, main_title, False) == (expected_line, expected_linklist) diff --git a/scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py b/scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py deleted file mode 100644 index 6c30fef7985..00000000000 --- a/scripts/HPC_chatbot_preprocessor/tests/test_write_metadata.py +++ /dev/null @@ -1,15 +0,0 @@ -import pytest -import os -from chatbot_parser import write_metadata - - -@pytest.mark.parametrize("main_title,subtitle,links,title_level,directory,source_file,output", [ - ("", "", [], 1, "", "", {"source_file": "", "main_title": "", "subtitle": "", "title_depth": 1, "directory": "", "parent_title": ""}), - ("A_very_good_main_title", "An_extremely_good_subtitle", ["the_first.link", "the_second.link"], 2, - os.path.join("A_very_good_main_title", "An_awesome_parent_file", "An_extremely_good_subtitle"), "source", - {"source_file": "source", "main_title": "A_very_good_main_title", "subtitle": "An_extremely_good_subtitle", "title_depth": 2, - "directory": os.path.join("A_very_good_main_title", "An_awesome_parent_file", "An_extremely_good_subtitle"), - "parent_title": "An_awesome_parent_file", "links": {"0": "the_first.link", "1": "the_second.link"}}) -]) -def test_write_metadata(main_title, subtitle, links, title_level, directory, source_file, output): - assert write_metadata(main_title, subtitle, links, title_level, directory, source_file) == output From cb5a853e83e8334ff882ffd913db541f47a165ed Mon Sep 17 00:00:00 2001 From: Lukas Barragan Torres Date: Thu, 5 Sep 2024 15:21:13 +0200 Subject: [PATCH 15/15] readme back to normal --- scripts/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/README.md b/scripts/README.md index a88bd42cc46..eed5a73e4d5 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,4 +1,3 @@ Scripts that can be used to automatically generate markdown files, can be found here. -* [`available_software`](available_software): script to generate overview of available environment modules; -* [`chatbot_preprocessor`](HPC_chatbot_preprocessor): script to generate input files for the chatbot; \ No newline at end of file +* [`available_software`](available_software): script to generate overview of available environment modules; \ No newline at end of file