From 0be8c55a795866bc89a9ae1b5e4fb29c8872efe6 Mon Sep 17 00:00:00 2001 From: Clay Gomera Date: Tue, 13 Aug 2024 09:07:56 -0400 Subject: [PATCH] Updated --- config/.bash_logout | 2 - config/.bash_profile | 43 +++-- config/.bashrc | 143 +++++++++++----- config/.config/X11/xinitrc | 6 +- config/.config/btop/btop.conf | 2 +- config/.config/doom/config.el | 4 +- config/.config/doom/config.org | 4 +- config/.config/gtk-2.0/gtkrc-2.0 | 2 +- config/.config/gtk-3.0/settings.ini | 2 +- config/etc/bash.bash_logout | 6 - config/etc/crypttab | 14 -- config/etc/default/grub | 22 --- config/etc/dracut.conf | 4 - config/etc/issue | 13 -- etc/crypttab | 13 ++ etc/default/grub | 63 +++++++ etc/issue | 13 ++ etc/mkinitcpio.conf | 81 +++++++++ etc/pacman.conf | 100 +++++++++++ etc/vconsole.conf | 1 + source/dmenu/scripts/dmenu_edit | 5 +- source/dmenu/scripts/dmenu_power | 108 +++++------- source/dmenu/scripts/dmenu_scrot | 162 ++++++------------ source/dmenu/scripts/dmenu_wall | 67 ++++---- source/dmenu/scripts/dmenu_wifi | 57 ++---- source/dwm/config.h | 27 +-- source/dwm/dwm.c | 53 ++++-- .../patches/dwm-sendmon_keepfocus-6.2.diff | 40 +++++ ...dwm-uselessgap-20211119-58414bee958f2.diff | 101 +++++++++++ source/dwm/scripts/autostart | 30 ++-- source/st/config.h | 2 +- source/st/st | Bin 133464 -> 0 bytes templates/README.md | 2 - templates/ani-cli/template | 16 -- templates/distrobox/INSTALL.msg | 5 - templates/distrobox/template | 16 -- templates/ytfzf/template | 13 -- 37 files changed, 763 insertions(+), 479 deletions(-) delete mode 100644 config/.bash_logout delete mode 100644 config/etc/bash.bash_logout delete mode 100644 config/etc/crypttab delete mode 100644 config/etc/default/grub delete mode 100644 config/etc/dracut.conf delete mode 100644 config/etc/issue create mode 100644 etc/crypttab create mode 100644 etc/default/grub create mode 100644 etc/issue create mode 100644 etc/mkinitcpio.conf create mode 100644 etc/pacman.conf create mode 100644 etc/vconsole.conf create mode 100644 source/dwm/patches/dwm-sendmon_keepfocus-6.2.diff create mode 100644 source/dwm/patches/dwm-uselessgap-20211119-58414bee958f2.diff delete mode 100755 source/st/st delete mode 100644 templates/README.md delete mode 100644 templates/ani-cli/template delete mode 100644 templates/distrobox/INSTALL.msg delete mode 100644 templates/distrobox/template delete mode 100644 templates/ytfzf/template diff --git a/config/.bash_logout b/config/.bash_logout deleted file mode 100644 index 1380a21b0..000000000 --- a/config/.bash_logout +++ /dev/null @@ -1,2 +0,0 @@ -# ~/.bash_logout -clear diff --git a/config/.bash_profile b/config/.bash_profile index f17e8b03f..81ac686d5 100644 --- a/config/.bash_profile +++ b/config/.bash_profile @@ -20,18 +20,15 @@ export INPUTRC="$HOME/.config/X11/inputrc" export GNUPGHOME="$HOME/.local/share/gnupg" export LESSHISTFILE="-" export BASHRC="$HOME/.bashrc" +export GOPATH="$HOME/.go" # Default apps export TERMINAL="st" export EDITOR="$HOME/.local/bin/lvim" export VISUAL="st -n editor -c editor -e $EDITOR" -export BROWSER="flatpak run com.brave.Browser" +export BROWSER="brave" export VIEWER="zathura" -# Dev Tools Envs -export GOPATH="$HOME/.go" -export DOTNET_ROOT="$HOME/.dotnet" - # Set path if [ -d "$HOME/.bin" ]; then PATH="$HOME/.bin:$PATH" @@ -42,35 +39,37 @@ fi if [ -d "$HOME/.cargo/bin" ]; then PATH="$HOME/.cargo/bin:$PATH" fi +if [ -d "$GOPATH/bin" ]; then + PATH="$GOPATH/bin:$PATH" +fi +if [ -d "$HOME/.local/lib/flutter/bin" ]; then + PATH="$HOME/.local/lib/flutter/bin:$PATH" +fi +if [ -d $HOME/.dotnet/tools ]; then + PATH="$HOME/.dotnet/tools:$PATH" +fi if [ -d "$HOME/Applications" ]; then PATH="$HOME/Applications:$PATH" fi -if [ -d "$HOME/.go/bin" ]; then - PATH="$HOME/.go/bin:$PATH" -fi -if [ -d $XDG_DATA_HOME/JetBrains/Toolbox/scripts ]; then +if [ -d "$XDG_DATA_HOME/JetBrains/Toolbox/scripts" ]; then PATH="$XDG_DATA_HOME/JetBrains/Toolbox/scripts:$PATH" fi -if [ -d $HOME/.dotnet/ ]; then - PATH="$HOME/.dotnet/:$PATH" -fi -if [ -d $HOME/.dotnet/tools/ ]; then - PATH="$HOME/.dotnet/tools/:$PATH" -fi -if [ -d "$HOME/.flutter/bin" ]; then - PATH="$HOME/.flutter/bin/:$PATH" +if [ -d "$HOME/.config/vifm/scripts" ]; then + PATH="$HOME/.config/vifm/scripts:$PATH" fi -# Bashrc -source "$BASHRC" +# export SSH_AUTH_SOCK +if [[ -z "${SSH_CONNECTION}" ]]; then + export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket" +fi # Create config directories if they don't exist if [ ! -d "$WGETDIR" ] || [ ! -d "$GNUPGHOME" ]; then mkdir -p "$WGETDIR" "$GNUPGHOME" fi -if [ ! -f "$WGETRC" ]; then - touch "$WGETRC" -fi + +# Bashrc +source "$BASHRC" # Starting xsession if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then diff --git a/config/.bashrc b/config/.bashrc index 851b8b771..fde808e04 100644 --- a/config/.bashrc +++ b/config/.bashrc @@ -3,7 +3,7 @@ export TERM="xterm-256color" # getting proper colors export HISTCONTROL=ignoredups:erasedups # no duplicate entries ### "bat" as manpager -export MANPAGER="bat -p" +export MANPAGER="sh -c 'sed -u -e \"s/\\x1B\[[0-9;]*m//g; s/.\\x08//g\" | bat -p -lman'" # use bash-completion, if available [[ $PS1 && -f /usr/share/bash-completion/bash_completion ]] && \ @@ -128,11 +128,12 @@ fi # function to detect os and assign aliases to package managers alias \ - pkg-update="sudo xbps-install -Su" \ - pkg-install="sudo xbps-install -S" \ - pkg-remove="sudo xbps-remove -R" \ - pkg-autoremove="sudo xbps-remove -Oo" \ - pkg-search="sudo xbps-query -s" \ + pkg-update="paru -Syyu" \ + pkg-install="paru -S" \ + pkg-remove="paru -Rcns" \ + pkg-remove-sec="paru -R" \ + pkg-autoremove="paru -Scc && paru -Rns (pacman -Qtdq)" \ + pkg-search="paru -Ss" # colorize grep output (good for log files) alias \ @@ -210,10 +211,6 @@ alias \ yt="ytfzf -ftsl" \ ytm="ytfzf -mtsl" -# distrobox -alias \ - dv="distrobox enter devbox" - # network and bluetooth alias \ netstats="nmcli dev" \ @@ -224,6 +221,76 @@ alias \ wfi-off="nmcli radio wifi off" \ blt="bluetoothctl" +# Automatically add completion for all aliases to commands having completion functions +# this currently slows startup a bit, but it isn't terrible +function alias_completion { + local namespace="alias_completion" + + # parse function based completion definitions, where capture group 2 => function and 3 => trigger + local compl_regex='complete( +[^ ]+)* -F ([^ ]+) ("[^"]+"|[^ ]+)' + # parse alias definitions, where capture group 1 => trigger, 2 => command, 3 => command arguments + local alias_regex="alias ([^=]+)='(\"[^\"]+\"|[^ ]+)(( +[^ ]+)*)'" + + # create array of function completion triggers, keeping multi-word triggers together + eval "local completions=($(complete -p | sed -Ene "/$compl_regex/s//'\3'/p"))" + (( ${#completions[@]} == 0 )) && return 0 + + # create temporary file for wrapper functions and completions + command rm -f "/tmp/${namespace}-*.tmp" &> /dev/null # preliminary cleanup + local tmp_file; tmp_file="$(mktemp "/tmp/${namespace}-${RANDOM}XXX.tmp")" || return 1 + + local completion_loader; completion_loader="$(complete -p -D 2>/dev/null | sed -Ene 's/.* -F ([^ ]*).*/\1/p')" + + # read in " '' ''" lines from defined aliases + local line; while read line; do + eval "local alias_tokens; alias_tokens=($line)" 2>/dev/null || continue # some alias arg patterns cause an eval parse error + local alias_name="${alias_tokens[0]}" alias_cmd="${alias_tokens[1]}" alias_args="${alias_tokens[2]# }" + + # skip aliases to pipes, boolean control structures and other command lists + # (leveraging that eval errs out if $alias_args contains unquoted shell metacharacters) + eval "local alias_arg_words; alias_arg_words=($alias_args)" 2>/dev/null || continue + # avoid expanding wildcards + read -a alias_arg_words <<< "$alias_args" + + # skip alias if there is no completion function triggered by the aliased command + if [[ ! " ${completions[*]} " =~ " $alias_cmd " ]]; then + if [[ -n "$completion_loader" ]]; then + # force loading of completions for the aliased command + eval "$completion_loader $alias_cmd" + # 124 means completion loader was successful + [[ $? -eq 124 ]] || continue + completions+=($alias_cmd) + else + continue + fi + fi + local new_completion="$(complete -p "$alias_cmd")" + + # create a wrapper inserting the alias arguments if any + if [[ -n $alias_args ]]; then + local compl_func="${new_completion/#* -F /}"; compl_func="${compl_func%% *}" + # avoid recursive call loops by ignoring our own functions + if [[ "${compl_func#_$namespace::}" == $compl_func ]]; then + local compl_wrapper="_${namespace}::${alias_name}" + echo "function $compl_wrapper { + (( COMP_CWORD += ${#alias_arg_words[@]} )) + COMP_WORDS=($alias_cmd $alias_args \${COMP_WORDS[@]:1}) + (( COMP_POINT -= \${#COMP_LINE} )) + COMP_LINE=\${COMP_LINE/$alias_name/$alias_cmd $alias_args} + (( COMP_POINT += \${#COMP_LINE} )) + $compl_func + }" >> "$tmp_file" + new_completion="${new_completion/ -F $compl_func / -F $compl_wrapper }" + fi + fi + + # replace completion trigger by alias + new_completion="${new_completion% *} $alias_name" + echo "$new_completion" >> "$tmp_file" + done < <(alias -p | sed -Ene "s/$alias_regex/\1 '\2' '\3'/p") + source "$tmp_file" && command rm -f "$tmp_file" &> /dev/null +}; alias_completion + ### PROMPT # get current branch in git repo function parse_git_branch() { @@ -231,7 +298,7 @@ function parse_git_branch() { if [ ! "${BRANCH}" == "" ]; then STAT=$(parse_git_dirty) echo "[${BRANCH}${STAT}]" - else + else echo "" fi } @@ -257,37 +324,29 @@ function parse_git_dirty { renamed=$(echo -n "${status}" 2> /dev/null | grep "renamed:" &> /dev/null; echo "$?") deleted=$(echo -n "${status}" 2> /dev/null | grep "deleted:" &> /dev/null; echo "$?") bits='' - if [ "${renamed}" == "0" ]; then - bits=">${bits}" - fi - if [ "${ahead}" == "0" ]; then - bits="*${bits}" - fi - if [ "${newfile}" == "0" ]; then - bits="+${bits}" - fi - if [ "${untracked}" == "0" ]; then - bits="?${bits}" - fi - if [ "${deleted}" == "0" ]; then - bits="x${bits}" - fi - if [ "${dirty}" == "0" ]; then - bits="!${bits}" - fi - if [ ! "${bits}" == "" ]; then - echo " ${bits}" - else - echo "" - fi + if [ "${renamed}" == "0" ]; then + bits=">${bits}" + fi + if [ "${ahead}" == "0" ]; then + bits="*${bits}" + fi + if [ "${newfile}" == "0" ]; then + bits="+${bits}" + fi + if [ "${untracked}" == "0" ]; then + bits="?${bits}" + fi + if [ "${deleted}" == "0" ]; then + bits="x${bits}" + fi + if [ "${dirty}" == "0" ]; then + bits="!${bits}" + fi + if [ ! "${bits}" == "" ]; then + echo " ${bits}" + else + echo "" + fi } export PS1="[\[\e[31m\]\u\[\e[m\]\[\e[35m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\]] [\[\e[33m\]\W\[\e[m\]\[\e[34m\]\`parse_git_branch\`\[\e[m\]] 󱞪 " - -export SSH_AUTH_SOCK=${HOME}/.ssh/agent -if ! pgrep -u ${USER} ssh-agent > /dev/null; then - rm -f ${SSH_AUTH_SOCK} -fi -if [ ! -S ${SSH_AUTH_SOCK} ]; then - eval $(ssh-agent -a ${SSH_AUTH_SOCK} 2> /dev/null) -fi diff --git a/config/.config/X11/xinitrc b/config/.config/X11/xinitrc index dbb003b99..193edab4f 100755 --- a/config/.config/X11/xinitrc +++ b/config/.config/X11/xinitrc @@ -37,9 +37,7 @@ export XDG_SESSION_TYPE=X11 export XCURSOR_PATH="$XDG_DATA_HOME/icons/" export XCURSOR_THEME="Simp1e-Gruvbox-Dark" export GTK_THEME="Gruvbox-Dark" -export GTK_ICON_THEME="Papirus-Dark" - -export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/gcr/ssh" +export GTK_ICON_THEME="Gruvbox-Plus-Dark" # initialize dwm -dbus-launch dwm +exec dwm diff --git a/config/.config/btop/btop.conf b/config/.config/btop/btop.conf index 8548fed23..315c63a4f 100644 --- a/config/.config/btop/btop.conf +++ b/config/.config/btop/btop.conf @@ -53,7 +53,7 @@ graph_symbol_proc = "default" shown_boxes = "cpu mem net proc" #* Update time in milliseconds, recommended 2000 ms or above for better sample times for graphs. -update_ms = 500 +update_ms = 1000 #* Processes sorting, "pid" "program" "arguments" "threads" "user" "memory" "cpu lazy" "cpu direct", #* "cpu lazy" sorts top process over time (easier to follow), "cpu direct" updates top process directly. diff --git a/config/.config/doom/config.el b/config/.config/doom/config.el index e89e29b12..f3e995aac 100644 --- a/config/.config/doom/config.el +++ b/config/.config/doom/config.el @@ -335,7 +335,7 @@ :desc "Zap to char" "z" #'zap-to-char :desc "Zap up to char" "Z" #'zap-up-to-char) -(set-frame-parameter nil 'alpha-background 98) ; For current frame -(add-to-list 'default-frame-alist '(alpha-background . 98)) ; For all new frames henceforth +(set-frame-parameter nil 'alpha-background 95) ; For current frame +(add-to-list 'default-frame-alist '(alpha-background . 95)) ; For all new frames henceforth (when (daemonp) (exec-path-from-shell-initialize)) diff --git a/config/.config/doom/config.org b/config/.config/doom/config.org index 074984901..dda80329e 100644 --- a/config/.config/doom/config.org +++ b/config/.config/doom/config.org @@ -752,8 +752,8 @@ the second occurrence of 'e'. Transparent window #+BEGIN_SRC emacs-lisp -(set-frame-parameter nil 'alpha-background 98) ; For current frame -(add-to-list 'default-frame-alist '(alpha-background . 98)) ; For all new frames henceforth +(set-frame-parameter nil 'alpha-background 95) ; For current frame +(add-to-list 'default-frame-alist '(alpha-background . 95)) ; For all new frames henceforth (when (daemonp) (exec-path-from-shell-initialize)) #+END_SRC diff --git a/config/.config/gtk-2.0/gtkrc-2.0 b/config/.config/gtk-2.0/gtkrc-2.0 index a7c6c15d0..527570d20 100644 --- a/config/.config/gtk-2.0/gtkrc-2.0 +++ b/config/.config/gtk-2.0/gtkrc-2.0 @@ -1,5 +1,5 @@ gtk-theme-name="Gruvbox-Dark" -gtk-icon-theme-name="Papirus-Dark" +gtk-icon-theme-name="Gruvbox-Plus-Dark" gtk-font-name="Inter 10" gtk-cursor-theme-name="Simp1e-Gruvbox-Dark" gtk-cursor-theme-size=0 diff --git a/config/.config/gtk-3.0/settings.ini b/config/.config/gtk-3.0/settings.ini index c0ac43703..03c1808d2 100644 --- a/config/.config/gtk-3.0/settings.ini +++ b/config/.config/gtk-3.0/settings.ini @@ -1,6 +1,6 @@ [Settings] gtk-theme-name=Gruvbox-Dark -gtk-icon-theme-name=Papirus-Dark +gtk-icon-theme-name=Gruvbox-Plus-Dark gtk-font-name=Inter 10 gtk-cursor-theme-name=Simp1e-Gruvbox-Dark gtk-cursor-theme-size=0 diff --git a/config/etc/bash.bash_logout b/config/etc/bash.bash_logout deleted file mode 100644 index 5aad3995d..000000000 --- a/config/etc/bash.bash_logout +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -# ~/.bash_logout: executed by bash(1) when login shell exits. - -if [ "$SHLVL" = 1 ]; then - [ -x /usr/bin/clear ] && /usr/bin/clear -q -fi diff --git a/config/etc/crypttab b/config/etc/crypttab deleted file mode 100644 index 844a9ab92..000000000 --- a/config/etc/crypttab +++ /dev/null @@ -1,14 +0,0 @@ -# crypttab: mappings for encrypted partitions -# -# Each mapped device will be created in /dev/mapper, so your /etc/fstab -# should use the /dev/mapper/ paths for encrypted devices. -# -# NOTE: Do not list your root (/) partition here. - -# -# home /dev/hda4 /etc/mypassword1 -# data1 /dev/hda3 /etc/mypassword2 -# data2 /dev/hda5 /etc/cryptfs.key -# swap /dev/hdx4 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256 -# vol /dev/hdb7 none -thklvm /dev/nvme0n1p2 /boot/volume.key luks diff --git a/config/etc/default/grub b/config/etc/default/grub deleted file mode 100644 index 2ba18315e..000000000 --- a/config/etc/default/grub +++ /dev/null @@ -1,22 +0,0 @@ -# -# Configuration file for GRUB. -# -GRUB_DEFAULT=0 -GRUB_HIDDEN_TIMEOUT=1 -GRUB_HIDDEN_TIMEOUT_QUIET=true -GRUB_TIMEOUT=0 -GRUB_DISTRIBUTOR="Void" -GRUB_CMDLINE_LINUX_DEFAULT="rd.lvm.vg=thkvg rd.luks.uuid=a2d27caa-9675-4e07-ad78-51d796c879de loglevel=3 quiet" -# Uncomment to use basic console -#GRUB_TERMINAL_INPUT="console" -# Uncomment to disable graphical terminal -#GRUB_TERMINAL_OUTPUT=console -#GRUB_BACKGROUND=/usr/share/void-artwork/splash.png -#GRUB_GFXMODE=1920x1080x32 -#GRUB_DISABLE_LINUX_UUID=true -#GRUB_DISABLE_RECOVERY=true -# Uncomment and set to the desired menu colors. Used by normal and wallpaper -# modes only. Entries specified as foreground/background. -#GRUB_COLOR_NORMAL="light-blue/black" -#GRUB_COLOR_HIGHLIGHT="light-cyan/blue" -GRUB_ENABLE_CRYPTODISK=y diff --git a/config/etc/dracut.conf b/config/etc/dracut.conf deleted file mode 100644 index 76d652c7b..000000000 --- a/config/etc/dracut.conf +++ /dev/null @@ -1,4 +0,0 @@ -# PUT YOUR CONFIG IN separate files -# in /etc/dracut.conf.d named ".conf" -# SEE man dracut.conf(5) for options -add_drivers+=" i915 " diff --git a/config/etc/issue b/config/etc/issue deleted file mode 100644 index 82609729f..000000000 --- a/config/etc/issue +++ /dev/null @@ -1,13 +0,0 @@ - -\e[H\e[2J -\e[0;32m - _______ - \\_____ `- ____ ____ .__ .___ .____ .__ - /\\ ___ `- \\ \\ \\ / /___ |__| __| _/ | | |__| ____ __ _____ ___ - | | / \\ | | \\ Y / _ \\| |/ __ | | | | |/ \\| | \\ \\/ / - | | \\___/ | | \\ ( <_> ) / /_/ | | |___| | | \\ | /> < - \\ `-_____ \\/ \\___/ \\____/|__\\____ | |_______ \\__|___| /____//__/\\_ \\ - `-______\\ \\/ \\/ \\/ \\/ - -\e[0m -Welcome Back! Linux Version: \r (\n) (\l) diff --git a/etc/crypttab b/etc/crypttab new file mode 100644 index 000000000..6c2eaa994 --- /dev/null +++ b/etc/crypttab @@ -0,0 +1,13 @@ +# Configuration for encrypted block devices. +# See crypttab(5) for details. + +# NOTE: Do not list your root (/) partition here, it must be set up +# beforehand by the initramfs (/etc/mkinitcpio.conf). + +# +# home UUID=b8ad5c18-f445-495d-9095-c9ec4f9d2f37 /etc/mypassword1 +# data1 /dev/sda3 /etc/mypassword2 +# data2 /dev/sda5 /etc/cryptfs.key +# swap /dev/sdx4 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,size=256 +# vol /dev/sdb7 none +# luks diff --git a/etc/default/grub b/etc/default/grub new file mode 100644 index 000000000..da6ade6d7 --- /dev/null +++ b/etc/default/grub @@ -0,0 +1,63 @@ +# GRUB boot loader configuration + +GRUB_DEFAULT=0 +GRUB_TIMEOUT=2 +GRUB_DISTRIBUTOR="Arch" +GRUB_CMDLINE_LINUX_DEFAULT="rd.luks.name== rd.luks.key== loglevel=3 quiet systemd.show_status=auto rd.udev.log_level=3 splash" +GRUB_CMDLINE_LINUX="" + +# Preload both GPT and MBR modules so that they are not missed +GRUB_PRELOAD_MODULES="part_gpt part_msdos" + +# Uncomment to enable booting from LUKS encrypted devices +GRUB_ENABLE_CRYPTODISK=y + +# Set to 'countdown' or 'hidden' to change timeout behavior, +# press ESC key to display menu. +GRUB_TIMEOUT_STYLE=hidden + +# Uncomment to use basic console +GRUB_TERMINAL_INPUT=console + +# Uncomment to disable graphical terminal +#GRUB_TERMINAL_OUTPUT=console + +# The resolution used on graphical terminal +# note that you can use only modes which your graphic card supports via VBE +# you can see them in real GRUB with the command `videoinfo' +GRUB_GFXMODE=auto + +# Uncomment to allow the kernel use the same resolution used by grub +GRUB_GFXPAYLOAD_LINUX=keep + +# Uncomment if you want GRUB to pass to the Linux kernel the old parameter +# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx" +#GRUB_DISABLE_LINUX_UUID=true + +# Uncomment to disable generation of recovery mode menu entries +GRUB_DISABLE_RECOVERY=true + +# Uncomment and set to the desired menu colors. Used by normal and wallpaper +# modes only. Entries specified as foreground/background. +#GRUB_COLOR_NORMAL="light-blue/black" +#GRUB_COLOR_HIGHLIGHT="light-cyan/blue" + +# Uncomment one of them for the gfx desired, a image background or a gfxtheme +#GRUB_BACKGROUND="/path/to/wallpaper" +#GRUB_THEME="/path/to/gfxtheme" + +# Uncomment to get a beep at GRUB start +#GRUB_INIT_TUNE="480 440 1" + +# Uncomment to make GRUB remember the last selection. This requires +# setting 'GRUB_DEFAULT=saved' above. +#GRUB_SAVEDEFAULT=true + +# Uncomment to disable submenus in boot menu +#GRUB_DISABLE_SUBMENU=y + +# Probing for other operating systems is disabled for security reasons. Read +# documentation on GRUB_DISABLE_OS_PROBER, if still want to enable this +# functionality install os-prober and uncomment to detect and include other +# operating systems. +GRUB_DISABLE_OS_PROBER=true diff --git a/etc/issue b/etc/issue new file mode 100644 index 000000000..96a033257 --- /dev/null +++ b/etc/issue @@ -0,0 +1,13 @@ +  +       ### ### ## +     ## ## + ┌ #### ### ###   ####   ## ### ## ### ### ### ### ###  ### ### + │  ##  ### ##  ##   ###  ## ## ## ### ## ## ##   ## ## + │ #####  ##   ##   ## ## ## ## ## ## ## ##   ### + │ ## ##  ##   ##   ## ## ## ## ## ## ##  ##   ## ##  + │ ######  ##   ####  ### ### #### #### ### ### ######  ###   ### + └─────────────────────────────────────────── A simple, lightweight distribution. +  + OS: Arch\s Kernel: \r Processor: \m TTY: \l + + diff --git a/etc/mkinitcpio.conf b/etc/mkinitcpio.conf new file mode 100644 index 000000000..689eb1e24 --- /dev/null +++ b/etc/mkinitcpio.conf @@ -0,0 +1,81 @@ +# vim:set ft=sh +# MODULES +# The following modules are loaded before any boot hooks are +# run. Advanced users may wish to specify all system modules +# in this array. For instance: +# MODULES=(usbhid xhci_hcd) +MODULES=(i915) + +# BINARIES +# This setting includes any additional binaries a given user may +# wish into the CPIO image. This is run last, so it may be used to +# override the actual binaries included by a given hook +# BINARIES are dependency parsed, so you may safely ignore libraries +BINARIES=() + +# FILES +# This setting is similar to BINARIES above, however, files are added +# as-is and are not parsed in any way. This is useful for config files. +FILES=(/boot/volume.key) + +# HOOKS +# This is the most important setting in this file. The HOOKS control the +# modules and scripts added to the image, and what happens at boot time. +# Order is important, and it is recommended that you do not change the +# order in which HOOKS are added. Run 'mkinitcpio -H ' for +# help on a given hook. +# 'base' is _required_ unless you know precisely what you are doing. +# 'udev' is _required_ in order to automatically load modules +# 'filesystems' is _required_ unless you specify your fs modules in MODULES +# Examples: +## This setup specifies all modules in the MODULES setting above. +## No RAID, lvm2, or encrypted root is needed. +# HOOKS=(base) +# +## This setup will autodetect all modules for your system and should +## work as a sane default +# HOOKS=(base udev autodetect modconf block filesystems fsck) +# +## This setup will generate a 'full' image which supports most systems. +## No autodetection is done. +# HOOKS=(base udev modconf block filesystems fsck) +# +## This setup assembles a mdadm array with an encrypted root file system. +## Note: See 'mkinitcpio -H mdadm_udev' for more information on RAID devices. +# HOOKS=(base udev modconf keyboard keymap consolefont block mdadm_udev encrypt filesystems fsck) +# +## This setup loads an lvm2 volume group. +# HOOKS=(base udev modconf block lvm2 filesystems fsck) +# +## This will create a systemd based initramfs which loads an encrypted root filesystem. +# HOOKS=(base systemd autodetect modconf kms keyboard sd-vconsole sd-encrypt block filesystems fsck) +# +## NOTE: If you have /usr on a separate partition, you MUST include the +# usr and fsck hooks. +HOOKS=(base systemd plymouth autodetect microcode modconf kms keyboard keymap sd-vconsole block sd-encrypt lvm2 filesystems fsck) + +# COMPRESSION +# Use this to compress the initramfs image. By default, zstd compression +# is used for Linux ≥ 5.9 and gzip compression is used for Linux < 5.9. +# Use 'cat' to create an uncompressed image. +#COMPRESSION="zstd" +#COMPRESSION="gzip" +#COMPRESSION="bzip2" +#COMPRESSION="lzma" +#COMPRESSION="xz" +#COMPRESSION="lzop" +#COMPRESSION="lz4" + +# COMPRESSION_OPTIONS +# Additional options for the compressor +#COMPRESSION_OPTIONS=() + +# MODULES_DECOMPRESS +# Decompress loadable kernel modules and their firmware during initramfs +# creation. Switch (yes/no). +# Enable to allow further decreasing image size when using high compression +# (e.g. xz -9e or zstd --long --ultra -22) at the expense of increased RAM usage +# at early boot. +# Note that any compressed files will be placed in the uncompressed early CPIO +# to avoid double compression. +#MODULES_DECOMPRESS="no" diff --git a/etc/pacman.conf b/etc/pacman.conf new file mode 100644 index 000000000..c834223c6 --- /dev/null +++ b/etc/pacman.conf @@ -0,0 +1,100 @@ +# +# /etc/pacman.conf +# +# See the pacman.conf(5) manpage for option and repository directives + +# +# GENERAL OPTIONS +# +[options] +# The following paths are commented out with their default values listed. +# If you wish to use different paths, uncomment and update the paths. +#RootDir = / +#DBPath = /var/lib/pacman/ +#CacheDir = /var/cache/pacman/pkg/ +#LogFile = /var/log/pacman.log +#GPGDir = /etc/pacman.d/gnupg/ +#HookDir = /etc/pacman.d/hooks/ +HoldPkg = pacman glibc +#XferCommand = /usr/bin/curl -L -C - -f -o %o %u +#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u +#CleanMethod = KeepInstalled +Architecture = auto + +# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup +#IgnorePkg = +#IgnoreGroup = + +#NoUpgrade = +#NoExtract = + +# Misc options +#UseSyslog +Color +#NoProgressBar +CheckSpace +#VerbosePkgLists +ParallelDownloads = 5 +ILoveCandy + +# By default, pacman accepts packages signed by keys that its local keyring +# trusts (see pacman-key and its man page), as well as unsigned packages. +SigLevel = Required DatabaseOptional +LocalFileSigLevel = Optional +#RemoteFileSigLevel = Required + +# NOTE: You must run `pacman-key --init` before first using pacman; the local +# keyring can then be populated with the keys of all official Arch Linux +# packagers with `pacman-key --populate archlinux`. + +# +# REPOSITORIES +# - can be defined here or included from another file +# - pacman will search repositories in the order defined here +# - local/custom mirrors can be added here or in separate files +# - repositories listed first will take precedence when packages +# have identical names, regardless of version number +# - URLs will have $repo replaced by the name of the current repo +# - URLs will have $arch replaced by the name of the architecture +# +# Repository entries are of the format: +# [repo-name] +# Server = ServerName +# Include = IncludePath +# +# The header [repo-name] is crucial - it must be present and +# uncommented to enable the repo. +# + +# The testing repositories are disabled by default. To enable, uncomment the +# repo name header and Include lines. You can add preferred servers immediately +# after the header, and they will be used before the default mirrors. + +#[core-testing] +#Include = /etc/pacman.d/mirrorlist + +[core] +Include = /etc/pacman.d/mirrorlist + +#[extra-testing] +#Include = /etc/pacman.d/mirrorlist + +[extra] +Include = /etc/pacman.d/mirrorlist + +# If you want to run 32 bit applications on your x86_64 system, +# enable the multilib repositories as required here. + +#[multilib-testing] +#Include = /etc/pacman.d/mirrorlist + +#[multilib] +#Include = /etc/pacman.d/mirrorlist + +# An example of a custom package repository. See the pacman manpage for +# tips on creating your own repositories. +#[custom] +#SigLevel = Optional TrustAll +#Server = file:///home/custompkgs +[chaotic-aur] +Include = /etc/pacman.d/chaotic-mirrorlist diff --git a/etc/vconsole.conf b/etc/vconsole.conf new file mode 100644 index 000000000..b64ed5e52 --- /dev/null +++ b/etc/vconsole.conf @@ -0,0 +1 @@ +FONT=ter-122n diff --git a/source/dmenu/scripts/dmenu_edit b/source/dmenu/scripts/dmenu_edit index 30a6327f4..8483829cb 100755 --- a/source/dmenu/scripts/dmenu_edit +++ b/source/dmenu/scripts/dmenu_edit @@ -4,10 +4,9 @@ # - Description: A simple script for file editing in dmenu # - Dependencies: dmenu, fd -########## -## main ## -########## +# start from home directory cd "$HOME" || exit 0 + file=1 while [ "$file" ]; do file=$(fd -LHpd 1 | dmenu -i -l 10 -p "󰈙 Open file in text editor $(basename "$(pwd)")") diff --git a/source/dmenu/scripts/dmenu_power b/source/dmenu/scripts/dmenu_power index 252b370ec..5b38efd86 100755 --- a/source/dmenu/scripts/dmenu_power +++ b/source/dmenu/scripts/dmenu_power @@ -1,12 +1,10 @@ #!/usr/bin/env bash -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple power menu dmenu script -# - Dependencies: dmenu, power-profiles-daemon, slock +# *** Script by Clay Gomera (Drake) *** +# Description: A dmenu script for managing power options +# Dependencies: dmenu, powerprofilesctl, slock, systemctl, notify-send -####################### -## Main manu options ## -####################### +# Main menu options option1=" Logout" option2=" Reboot" option3=" Power off" @@ -16,121 +14,99 @@ option6=" Change power profile" option7="󱎘 Exit" options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6\n$option7" -#################################### -## Power profiles submenu options ## -#################################### +# Power profiles submenu options pwr1="󰓅 Performance" pwr2="󰾅 Balanced" pwr3="󰾆 Power Saver" pwr4=" Cancel" pwrs="$pwr1\n$pwr2\n$pwr3\n$pwr4" -## This variable will store the current power profile +# Store the current power profile currentpwr=$(powerprofilesctl get) -## This variable will store the current wallpaper set by feh +# Store the current wallpaper set by feh currentwall=$(tail --lines=1 "$HOME/.fehbg" | awk '{print $4}' | sed "s/'//g") -# Check for missing dependencies -check_dependencies() { - if ! [ -x "$(command -v dmenu)" ]; then - echo "Missing dependency: dmenu is required." - exit 1 - fi - - local missing_deps=() - for dep in loginctl powerprofilesctl notify-send; do - if ! command -v "$dep" &> /dev/null; then - missing_deps+=("$dep") - fi - done - - if [ ${#missing_deps[@]} -ne 0 ]; then - echo "Missing dependencies: ${missing_deps[*]}" - exit 1 - fi -} - -## Ask yes/no for action confirmation +# Ask user for confirmation with yes/no options confirm_action() { local prompt="$1" echo -e " Yes\n No" | dmenu -l 2 -i -p "$prompt" | grep -q " Yes" } -#################### -# Main Script Flow # -#################### - -# Check for dependencies -check_dependencies - -action=$(echo -e "$options" | dmenu -i -p " Power Options"); # main menu prompt +# Show main menu and get user action +action=$(echo -e "$options" | dmenu -i -p " Power Options") if [ -z "$action" ]; then exit 0 fi case "$action" in - "$option1") + "$option1") if confirm_action " Are you sure you want to logout?"; then pkill X fi ;; "$option2") if confirm_action " Are you sure you want to reboot?"; then - loginctl reboot + systemctl reboot fi ;; "$option3") if confirm_action " Are you sure you want to power off?"; then - loginctl poweroff + systemctl poweroff fi - ;; + ;; "$option4") - slock -b "$currentwall" loginctl suspend + systemctl suspend ;; "$option5") slock -b "$currentwall" ;; "$option6") - ##### - ## These conditions will be used for the prompt - ##### - if [ "$currentpwr" = "performance" ]; then - currentpwr="$pwr1" - elif [ "$currentpwr" = "balanced" ]; then - currentpwr="$pwr2" - elif [ "$currentpwr" = "power-saver" ]; then - currentpwr="$pwr3" - fi - pwraction=$(echo -e "$pwrs" | dmenu -i -p " Power Profile Menu - Currently set to: $currentpwr") # power profiles submenu prompt + # Determine current power profile for submenu + case "$currentpwr" in + "performance") + currentpwr="$pwr1" + ;; + "balanced") + currentpwr="$pwr2" + ;; + "power-saver") + currentpwr="$pwr3" + ;; + *) + currentpwr="Unknown" + ;; + esac + + # Show power profile submenu and get user action + pwraction=$(echo -e "$pwrs" | dmenu -i -p " Power Profile Menu - Currently set to: $currentpwr") case "$pwraction" in "$pwr1") - if [ "$currentpwr" = "$pwr1" ]; then # if the power profile is already set to performance + if [ "$currentpwr" = "$pwr1" ]; then notify-send "The power profile is already set to performance" - exit 1 else - powerprofilesctl set performance && notify-send "Power profile switched to performance" # if not, set the powerprofile to performance + powerprofilesctl set performance && notify-send "Power profile switched to performance" fi ;; "$pwr2") - if [ "$currentpwr" = "$pwr2" ]; then # if the power profile is already set to balanced + if [ "$currentpwr" = "$pwr2" ]; then notify-send "The power profile is already set to balanced" - exit 1 else - powerprofilesctl set balanced && notify-send "Power profile switched to balanced" # if not, set the powerprofile to balanced + powerprofilesctl set balanced && notify-send "Power profile switched to balanced" fi ;; "$pwr3") - if [ "$currentpwr" = "$pwr3" ]; then # if the power profile is already set to power saver + if [ "$currentpwr" = "$pwr3" ]; then notify-send "The power profile is already set to power saver" - exit 1 else - powerprofilesctl set power-saver && notify-send "Power profile switched to power saver" # if not, set the powerprofile to power saver + powerprofilesctl set power-saver && notify-send "Power profile switched to power saver" fi ;; "$pwr4") exit 0 - esac;; + ;; + esac + ;; "$option7") exit 0 ;; diff --git a/source/dmenu/scripts/dmenu_scrot b/source/dmenu/scripts/dmenu_scrot index f80d14fab..4c0db12d9 100755 --- a/source/dmenu/scripts/dmenu_scrot +++ b/source/dmenu/scripts/dmenu_scrot @@ -1,26 +1,26 @@ #!/usr/bin/env bash -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple screenshot/screencast dmenu script -# - Dependencies: maim, slop, ffmpeg, dmenu, libnotify +# *** Script by Clay Gomera (Drake) *** +# Description: A simple screenshot/screencast dmenu script +# Dependencies: maim, slop, ffmpeg, dmenu, libnotify -## Screenshot & Screencast Directory +## Define directories for saving screenshots and screencasts SHOTDIR="$XDG_PICTURES_DIR/Screenshots" CASTDIR="$XDG_VIDEOS_DIR/Screencasts" mkdir -p "$SHOTDIR" "$CASTDIR" -## Format Variables +## Define available formats for images and videos image_formats="jpg\npng" video_formats="mp4\nmkv" -## Main menu choices +## Define choices for the main menu mcho1="󰹑 Take a screenshot" mcho2="󰐍 Record the screen" mcho3="󰙧 Stop recording" mcho4="󱎘 Exit" mchos="$mcho1\n$mcho2\n$mcho3\n$mcho4" -## Main submenu choices +## Define choices for the screenshot submenu mscho1="󱣴 Capture the entire screen" mscho2="󱎫 Capture the entire screen (With delay)" mscho3="󱕻 Capture area" @@ -28,20 +28,18 @@ mscho4="󰖯 Capture active window" mscho5="󱎘 Exit" mschos="$mscho1\n$mscho2\n$mscho3\n$mscho4\n$mscho5" -## Save/clip submenu choices +## Define choices for saving screenshots svcho1="󰆏 Copy to clipboard" svcho2="󰠘 Save to $SHOTDIR" svchos="$svcho1\n$svcho2" -## Delay subsubmenu +## Define delay options for screenshots del1="󱑀 3 sec delay" del2="󱑂 5 sec delay" del3="󱑇 10 sec delay" dels="$del1\n$del2\n$del3" -##### -## This function will check for dependencies -##### +# Check if required dependencies are installed check_dependencies() { local dependencies=("maim" "ffmpeg" "dmenu" "notify-send" "xclip" "xdotool" "xdpyinfo") for dep in "${dependencies[@]}"; do @@ -52,46 +50,32 @@ check_dependencies() { done } -##### -## This function uses the svchos variable to ask the user what to do with the -## screenshot -##### +# Prompt the user to choose an action for saving the screenshot fsvchos() { svchoice=$(echo -e "$svchos" | dmenu -i -l 2 -p " What do you want to do with this screenshot?") } -##### -## This function uses the dels variable to ask the user which delay option to -## choose -##### +# Prompt the user to choose a delay option for screenshots fdel() { del=$(echo -e "$dels" | dmenu -i -p " Select Delay") } -##### -## This function allows the user to choose the screenshot format -##### +# Prompt the user to choose the image format for screenshots fimage_format() { image_format=$(echo -e "$image_formats" | dmenu -i -p " Choose screenshot format") } -##### -## This function allows the user to choose the recording format -##### +# Prompt the user to choose the video format for recordings fvideo_format() { video_format=$(echo -e "$video_formats" | dmenu -i -p " Choose video format") } -##### -## This function does a full screen screenshot without delay, depending on what -## the user chooses on the fsvchos function, the screenshot will be saved to the -## clipboard or to $SHOTDIR -##### +# Capture a full-screen screenshot without delay shot_screen() { fimage_format fsvchos if [ "$svchoice" = "$svcho1" ]; then - maim | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard" + maim -f "$image_format" | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard" elif [ "$svchoice" = "$svcho2" ]; then maim -f "$image_format" "$SHOTDIR/$(date +%s).$image_format" && notify-send "Screenshot saved" else @@ -99,12 +83,7 @@ shot_screen() { fi } -##### -## This function does a full screen screenshot with delay, depending on what the -## user chooses on the fsvchos function, the screenshot will be saved to the -## clipboard or to $SHOTDIR. And depending on what the user chooses on the fdel -## function, the delay will be between 3 and 10 seconds -##### +# Capture a full-screen screenshot with a user-defined delay shot_screen_delay() { fimage_format fsvchos @@ -132,54 +111,41 @@ shot_screen_delay() { sleep 1 if [ "$svchoice" = "$svcho1" ]; then - maim | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard"; + maim -f "$image_format" | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard" elif [ "$svchoice" = "$svcho2" ]; then - maim -f "$image_format" "$SHOTDIR/$(date +%s).$image_format" && notify-send "Screenshot saved to $SHOTDIR"; + maim -f "$image_format" "$SHOTDIR/$(date +%s).$image_format" && notify-send "Screenshot saved to $SHOTDIR" else exit 0 fi } -##### -## This function allows the user to select the area on the screen to screenshot -## depending on what the user chooses on the fsvchos function, the screenshot will -## be saved to the clipboard or to $SHOTDIR -##### +# Capture a user-defined area of the screen shot_area() { fimage_format fsvchos if [ "$svchoice" = "$svcho1" ]; then - maim -s | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard"; + maim -f "$image_format" -s | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard" elif [ "$svchoice" = "$svcho2" ]; then - maim -s -f "$image_format" "$SHOTDIR/$(date +%s).$image_format" && notify-send "Screenshot saved to $SHOTDIR"; + maim -s -f "$image_format" "$SHOTDIR/$(date +%s).$image_format" && notify-send "Screenshot saved to $SHOTDIR" else exit 0 fi } -##### -## This function does a screenshot of the currently active window, depending -## on what the user chooses on the fsvchos function, the screenshot will be -## saved to the clipboard or to $SHOTDIR -##### +# Capture a screenshot of the currently active window shot_window() { fimage_format fsvchos if [ "$svchoice" = "$svcho1" ]; then - maim -i "$(xdotool getactivewindow)" | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard"; + maim -f "$image_format" -i "$(xdotool getactivewindow)" | xclip -selection clipboard -t image/"$image_format" && notify-send "Screenshot saved to clipboard" elif [ "$svchoice" = "$svcho2" ]; then - maim -i "$(xdotool getactivewindow)" -f "$image_format" "$SHOTDIR/$(date +%s).$image_format" && notify-send "Screenshot saved to $SHOTDIR"; + maim -i "$(xdotool getactivewindow)" -f "$image_format" "$SHOTDIR/$(date +%s).$image_format" && notify-send "Screenshot saved to $SHOTDIR" else exit 0 fi } -##### -## This function uses ffmpeg to record the screen, It will check if ffmpeg is -## already running (already recording), to prevent the user from executing -## another ffmpeg instance, if it's not running, it will grab the screen -## resolution with xdpyinfo and use it to record the screen with ffmpeg. -##### +# Start recording the entire screen using ffmpeg rec_screen() { fvideo_format if pgrep -x "ffmpeg" > /dev/null; then @@ -192,9 +158,7 @@ rec_screen() { fi } -##### -## This function will record the screen with a given delay -##### +# Start recording the entire screen with a user-defined delay rec_screen_delay() { fvideo_format fdel @@ -230,7 +194,7 @@ rec_screen_delay() { fi } -## This function allows the user to record a selected area of the screen +# Start recording a user-defined area of the screen rec_area() { fvideo_format if pgrep -x "ffmpeg" > /dev/null; then @@ -248,7 +212,7 @@ rec_area() { fi } -## This function allows the user to record the currently active window +# Start recording the currently active window rec_window() { fvideo_format if pgrep -x "ffmpeg" > /dev/null; then @@ -266,66 +230,44 @@ rec_window() { fi } -##### -## This function stops screen recording, it first checks if ffmpeg is already -## running (already recording), to only stop a recording if there's an ffmpeg -## instance running -##### +# Stop the ongoing screen recording stop_recording() { if pgrep -x "ffmpeg" > /dev/null; then pkill -f "ffmpeg -f x11grab" notify-send "Screen recording stopped. Video saved to $CASTDIR" else - notify-send "You aren't recording anything at the moment" + notify-send "No recording in progress." fi } -## main -check_dependencies; -mchoice=$(echo -e "$mchos" | dmenu -i -l 4 -p " Screen Capture Menu") # main menu prompt +# Main script execution +check_dependencies + +# Display the main menu and handle user choice +mchoice=$(echo -e "$mchos" | dmenu -i -l 4 -p " Screen Capture Menu") case $mchoice in "$mcho1") - mschoice=$(echo -e "$mschos" | dmenu -i -l 9 -p " Screenshot Menu") # screenshot menu prompt + # Display the screenshot submenu and handle user choice + mschoice=$(echo -e "$mschos" | dmenu -i -l 9 -p " Screenshot Menu") case $mschoice in - "$mscho1") - shot_screen; - ;; - "$mscho2") - shot_screen_delay; - ;; - "$mscho3") - shot_area; - ;; - "$mscho4") - shot_window; - ;; - "$mscho5") - exit 0 + "$mscho1") shot_screen ;; + "$mscho2") shot_screen_delay ;; + "$mscho3") shot_area ;; + "$mscho4") shot_window ;; + "$mscho5") exit 0 ;; esac ;; "$mcho2") - mschoice=$(echo -e "$mschos" | dmenu -i -l 9 -p " Screencast Menu") # screenshot menu prompt + # Display the screencast submenu and handle user choice + mschoice=$(echo -e "$mschos" | dmenu -i -l 9 -p " Screencast Menu") case $mschoice in - "$mscho1") - rec_screen; - ;; - "$mscho2") - rec_screen_delay; - ;; - "$mscho3") - rec_area; - ;; - "$mscho4") - rec_window; - ;; - "$mscho5") - exit 0 + "$mscho1") rec_screen ;; + "$mscho2") rec_screen_delay ;; + "$mscho3") rec_area ;; + "$mscho4") rec_window ;; + "$mscho5") exit 0 ;; esac ;; - "$mcho3") - stop_recording; - ;; - "$mcho4") - exit 0; - ;; + "$mcho3") stop_recording ;; + "$mcho4") exit 0 ;; esac diff --git a/source/dmenu/scripts/dmenu_wall b/source/dmenu/scripts/dmenu_wall index b66dacb6d..e9b8c1a3d 100755 --- a/source/dmenu/scripts/dmenu_wall +++ b/source/dmenu/scripts/dmenu_wall @@ -1,18 +1,16 @@ #!/usr/bin/env bash -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple dmenu script to set the wallpaper on X -# - Dependencies: dmenu, fd, feh +# *** Script by Clay Gomera (Drake) *** +# Description: A dmenu script to set the wallpaper on X using feh +# Dependencies: dmenu, fd, feh -########################## -## Wallpapers Directory ## -########################## +# Directory containing wallpapers walldir="$XDG_PICTURES_DIR/Wallpapers" -cd "$walldir" || exit # we cd into $walldir in order to get only the file name on the main prompt -####################### -## Wallpaper options ## -####################### +# Change to wallpaper directory or exit if it fails +cd "$walldir" || exit + +# Define wallpaper options for feh option1="Fill" option2="Center" option3="Tile" @@ -20,30 +18,31 @@ option4="Max" option5="Scale" options="$option1\n$option2\n$option3\n$option4\n$option5" -########## -## main ## -########## -wallpaper=$(fd -p ./ | dmenu -i -p " 󰋩 Select a wallpaper ") # main prompt -if [ "$wallpaper" ]; then # if the user made a choice - chosenwall=$wallpaper # reassign $wallpaper to $chosenwall -else - exit 0 +# Prompt user to select a wallpaper +wallpaper=$(fd -p ./ | dmenu -i -p "󰋩 Select a wallpaper") +if [ -z "$wallpaper" ]; then + exit 0 fi -action=$(echo -e "$options" | dmenu -i -p "  Chose the format ") # options prompt + +# Store the selected wallpaper +chosenwall="$wallpaper" + +# Prompt user to select a wallpaper format +action=$(echo -e "$options" | dmenu -i -p " Choose the format") case "$action" in - $option1*) - feh --bg-fill "$chosenwall"; - ;; - $option2*) - feh --bg-center "$chosenwall"; - ;; - $option3*) - feh --bg-tile "$chosenwall"; - ;; - $option4*) - feh --bg-max "$chosenwall"; - ;; - $option5*) - feh --bg-scale "$chosenwall"; - ;; + "$option1") + feh --bg-fill "$chosenwall" + ;; + "$option2") + feh --bg-center "$chosenwall" + ;; + "$option3") + feh --bg-tile "$chosenwall" + ;; + "$option4") + feh --bg-max "$chosenwall" + ;; + "$option5") + feh --bg-scale "$chosenwall" + ;; esac diff --git a/source/dmenu/scripts/dmenu_wifi b/source/dmenu/scripts/dmenu_wifi index d9a536825..c7ca962d1 100755 --- a/source/dmenu/scripts/dmenu_wifi +++ b/source/dmenu/scripts/dmenu_wifi @@ -1,10 +1,10 @@ #!/usr/bin/env bash -# ***This script was made by Clay Gomera (Drake)*** -# - Description: A simple wifi dmenu script -# - Dependencies: dmenu, NetworkManager +# *** Script by Clay Gomera (Drake) *** +# Description: A simple WiFi management script using dmenu and NetworkManager +# Dependencies: dmenu, NetworkManager, notify-send -## Main menu options +# Main menu options option1=" Turn on WiFi" option2=" Turn off WiFi" option3="󱛅 Disconnect WiFi" @@ -13,15 +13,11 @@ option5="󱛆 Setup captive portal" option6="󱎘 Exit" options="$option1\n$option2\n$option3\n$option4\n$option5\n$option6" -##### -## These variables will store specific information about the wireless interface -##### +# Retrieve wireless interface information wifi_info=$(nmcli dev | awk '/wifi/ {print $1,$3; exit}') -read -r wlan constate <<< "$wifi_info" +read -r wlan state <<< "$wifi_info" -##### -## This function uses nmcli to turn off wifi and then sends a notification -##### +# Function to turn off WiFi turnoff() { nmcli radio wifi off if [ $? -eq 0 ]; then @@ -31,9 +27,7 @@ turnoff() { fi } -##### -## This function uses nmcli to turn on wifi and then sends a notification -##### +# Function to turn on WiFi turnon() { nmcli radio wifi on if [ $? -eq 0 ]; then @@ -43,14 +37,11 @@ turnon() { fi } -##### -## This function uses nmcli and the $wlan and $constate variables to disconnect -## from the wifi network and then sends a notification -##### +# Function to disconnect WiFi disconnect() { - if [ "$constate" = "disconnected" ]; then + if [ "$state" = "disconnected" ]; then notify-send "WiFi is already disconnected" - elif [ "$constate" = "connected" ]; then + elif [ "$state" = "connected" ]; then nmcli device disconnect "$wlan" if [ $? -eq 0 ]; then notify-send "WiFi has been disconnected" @@ -62,14 +53,11 @@ disconnect() { fi } -##### -## This function uses nmcli to first scan for available networks and then the -## $bssid variable will store the SSID of the network that the user chooses -##### +# Function to select and connect to a WiFi network connect() { notify-send -t 5000 "Scanning networks..." nmcli dev wifi rescan - wifinet=$(nmcli -f BSSID,SSID,BARS,SECURITY dev wifi list | sed -n '1!p' | dmenu -i -l 10 -p " Select a Wifi Network") + local wifinet=$(nmcli -f BSSID,SSID,BARS,SECURITY dev wifi list | sed -n '1!p' | dmenu -i -l 10 -p " Select a Wifi Network") if [ -z "$wifinet" ]; then exit 0 fi @@ -77,9 +65,7 @@ connect() { ssid=$(echo "$wifinet" | awk '{print $2}') } -##### -## This function will store the WiFi password in the $pass variable -##### +# Function to prompt for WiFi password password() { if nmcli connection show | awk -v ssid="$ssid" '$1 == ssid {found=1} END {exit !found}'; then pass="" @@ -93,10 +79,7 @@ password() { fi } -##### -## This function will actually connect to the chosen WiFi network using the -## $bssid and $pass variables -##### +# Function to connect to the selected WiFi network action() { if [ -n "$pass" ]; then nmcli dev wifi connect "$bssid" password "$pass" @@ -110,15 +93,13 @@ action() { fi } -########## -## main ## -########## -cases=$(echo -e "$options" | dmenu -l 6 -i -p " Wifi Settings") -if [ -z "$cases" ]; then +# Show menu and handle user choice +case=$(echo -e "$options" | dmenu -l 6 -i -p " WiFi Settings") +if [ -z "$case" ]; then exit 0 fi -case "$cases" in +case "$case" in "$option1") turnon ;; diff --git a/source/dwm/config.h b/source/dwm/config.h index 27bb790d5..1fe5f616f 100644 --- a/source/dwm/config.h +++ b/source/dwm/config.h @@ -1,6 +1,7 @@ /* Appearance */ static const unsigned int borderpx = 1; /* border pixel of windows */ static const unsigned int snap = 32; /* snap pixel */ +static const unsigned int gappx = 6; /* gaps between windows */ static const int showbar = 1; /* 0 means no bar */ static const int topbar = 1; /* 0 means bottom bar */ static const int vertpad = 0; /* vertical padding of bar */ @@ -153,7 +154,7 @@ static const Rule rules[] = { {"Xournalpp", NULL, NULL, 1 << 6, 0, -1}, {"Com.github.xournalpp.xournalpp", NULL, NULL, 1 << 6, 0, -1}, /* 8 - Office Tag */ - {"DesktopEditors", NULL, NULL, 1 << 7, 0, -1}, + {"ONLYOFFICE Desktop Editors", NULL, NULL, 1 << 7, 0, -1}, {"Soffice", "soffice", NULL, 1 << 7, 0, -1}, {"libreoffice-startcenter", NULL, NULL, 1 << 7, 0, -1}, {"libreoffice-calc", NULL, NULL, 1 << 7, 0, -1}, @@ -205,7 +206,7 @@ static const Rule rules[] = { /* Layout(s) */ static const float mfact = 0.5; /* factor of master area size [0.05..0.95] */ static const int nmaster = 1; /* number of clients in master area */ -static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ +static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ static const Layout layouts[] = { /* symbol arrange function */ @@ -235,13 +236,14 @@ static const Layout layouts[] = { static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "st", NULL }; static const char *editor[] = { "emacsclient", "-c", "-a", "'emacs'", NULL }; -static const char *browser[] = { "flatpak", "run", "com.brave.Browser", NULL }; +static const char *browser[] = { "brave", NULL }; static const char *chat[] = { "flatpak", "run", "org.signal.Signal", NULL }; static const char *vm[] = { "virt-manager", NULL }; -static const char *office[] = { "flatpak", "run", "org.libreoffice.LibreOffice", NULL }; +static const char *office[] = { "flatpak", "run", "org.onlyoffice.desktopeditors", NULL }; static const char *videoeditor[] = { "flatpak", "run", "org.kde.kdenlive", NULL }; static const char *imageeditor[] = { "flatpak", "run", "org.gimp.GIMP", NULL }; static const char *audioeditor[] = { "flatpak", "run", "org.audacityteam.Audacity", NULL }; +static const char *game[] = { "flatpak", "run", "com.valvesoftware.Steam", NULL }; /* Keybindings */ static Keychord *keychords[] = { @@ -260,14 +262,15 @@ static Keychord *keychords[] = { &((Keychord){2, {{MODKEY, XK_p}, {0, XK_q}}, spawn, SHCMD("$HOME/.config/suckless/dmenu/scripts/dmenu_power") }), /* Launch power menu */ /* Apps */ - &((Keychord){2, {{MODKEY, XK_a}, {0, XK_e}}, spawn, {.v = editor } }), /* Launch text editor (tag 1) */ - &((Keychord){2, {{MODKEY, XK_a}, {0, XK_v}}, spawn, {.v = vm } }), /* Launch vm manager (tag 2) */ - &((Keychord){2, {{MODKEY, XK_a}, {0, XK_w}}, spawn, {.v = browser } }), /* Launch web browser (tag 3) */ - &((Keychord){2, {{MODKEY, XK_a}, {0, XK_c}}, spawn, {.v = chat } }), /* Launch chat app (tag 4) */ + &((Keychord){2, {{MODKEY, XK_a}, {0, XK_e}}, spawn, {.v = editor } }), /* Launch text editor (tag 1) */ + &((Keychord){2, {{MODKEY, XK_a}, {0, XK_v}}, spawn, {.v = vm } }), /* Launch vm manager (tag 2) */ + &((Keychord){2, {{MODKEY, XK_a}, {0, XK_w}}, spawn, {.v = browser } }), /* Launch web browser (tag 3) */ + &((Keychord){2, {{MODKEY, XK_a}, {0, XK_c}}, spawn, {.v = chat } }), /* Launch chat app (tag 4) */ &((Keychord){2, {{MODKEY, XK_a}, {0, XK_a}}, spawn, {.v = audioeditor } }), /* Launch audio editor (tag 5) */ &((Keychord){2, {{MODKEY, XK_a}, {0, XK_k}}, spawn, {.v = videoeditor } }), /* Launch video editor (tag 6) */ &((Keychord){2, {{MODKEY, XK_a}, {0, XK_i}}, spawn, {.v = imageeditor } }), /* Launch image editor (tag 7) */ &((Keychord){2, {{MODKEY, XK_a}, {0, XK_o}}, spawn, {.v = office } }), /* Launch office suite (tag 8) */ + &((Keychord){2, {{MODKEY, XK_a}, {0, XK_g}}, spawn, {.v = game } }), /* Launch office suite (tag 9) */ /* Keyboard Layouts */ &((Keychord){2, {{MODKEY, XK_x}, {0, XK_e}}, spawn, SHCMD("setxkbmap -layout es && pkill -RTMIN+10 dwmblocks") }), /* Switch to Spanish keyboard layout */ @@ -323,10 +326,10 @@ static Keychord *keychords[] = { &((Keychord){1, {{MODKEY|Mod1Mask, XK_space}}, togglefloating, {0} }), /* Toggle floating mode on active window */ &((Keychord){1, {{MODKEY, XK_0}}, view, {.ui = ~0 } }), /* View all windows from all tags */ &((Keychord){1, {{MODKEY|ShiftMask, XK_0}}, tag, {.ui = ~0 } }), /* View active window on all tags (similar to sticky, more nuclear) */ - &((Keychord){1, {{MODKEY, XK_comma}}, focusmon, {.i = +1 } }), /* Focus next screen */ - &((Keychord){1, {{MODKEY, XK_period}}, focusmon, {.i = -1 } }), /* Focus previous screen */ - &((Keychord){1, {{MODKEY|ShiftMask, XK_comma}}, tagmon, {.i = +1 } }), /* Move active window to next screen */ - &((Keychord){1, {{MODKEY|ShiftMask, XK_period}}, tagmon, {.i = -1 } }), /* Move active window to previous screen */ + &((Keychord){1, {{MODKEY, XK_comma}}, focusmon, {.i = -1 } }), /* Focus next screen */ + &((Keychord){1, {{MODKEY, XK_period}}, focusmon, {.i = +1 } }), /* Focus previous screen */ + &((Keychord){1, {{MODKEY|ShiftMask, XK_comma}}, tagmon, {.i = -1 } }), /* Move active window to next screen */ + &((Keychord){1, {{MODKEY|ShiftMask, XK_period}}, tagmon, {.i = +1 } }), /* Move active window to previous screen */ &((Keychord){1, {{MODKEY, XK_b}}, togglebar, {0} }), /* Toggle bar */ /* Scratchpads */ diff --git a/source/dwm/dwm.c b/source/dwm/dwm.c index d75a38baa..289e10ec0 100644 --- a/source/dwm/dwm.c +++ b/source/dwm/dwm.c @@ -56,8 +56,8 @@ #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]) || C->issticky) #define LENGTH(X) (sizeof X / sizeof X[0]) #define MOUSEMASK (BUTTONMASK|PointerMotionMask) -#define WIDTH(X) ((X)->w + 2 * (X)->bw) -#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) #define NUMTAGS (LENGTH(tags) + LENGTH(scratchpads)) #define TAGMASK ((1 << NUMTAGS) - 1) #define SPTAG(i) ((1 << LENGTH(tags)) << (i)) @@ -619,6 +619,9 @@ void combotag(const Arg *arg) { combo = 1; selmon->sel->tags = arg->ui & TAGMASK; } + // Set the monitor's selected tag to the new tag + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + focus(NULL); arrange(selmon); } @@ -1906,17 +1909,39 @@ void resize(Client *c, int x, int y, int w, int h, int interact) { void resizeclient(Client *c, int x, int y, int w, int h) { XWindowChanges wc; + unsigned int n; + unsigned int gapoffset; + unsigned int gapincr; + Client *nbc; + + wc.border_width = c->bw; - c->oldx = c->x; c->x = wc.x = x; - c->oldy = c->y; c->y = wc.y = y; - c->oldw = c->w; c->w = wc.width = w; - c->oldh = c->h; c->h = wc.height = h; + /* Get number of clients for the client's monitor */ + for (n = 0, nbc = nexttiled(c->mon->clients); nbc; nbc = nexttiled(nbc->next), n++); + + /* Do nothing if layout is floating */ + if (c->isfloating || c->mon->lt[c->mon->sellt]->arrange == NULL) { + gapincr = gapoffset = 0; + } else { + /* Remove border and gap if layout is monocle or only one client */ + if (c->mon->lt[c->mon->sellt]->arrange == monocle || n == 1) { + gapoffset = 0; + gapincr = -2 * borderpx; + wc.border_width = 0; + } else { + gapoffset = gappx; + gapincr = 2 * gappx; + } + } + + c->oldx = c->x; c->x = wc.x = x + gapoffset; + c->oldy = c->y; c->y = wc.y = y + gapoffset; + c->oldw = c->w; c->w = wc.width = w - gapincr; + c->oldh = c->h; c->h = wc.height = h - gapincr; if (c->beingmoved) return; - wc.border_width = c->bw; - XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); configure(c); XSync(dpy, False); @@ -2080,15 +2105,21 @@ void scan(void) { void sendmon(Client *c, Monitor *m) { if (c->mon == m) return; + int hadfocus = (c == selmon->sel); unfocus(c, 1); detach(c); detachstack(c); + arrange(c->mon); c->mon = m; c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ attachbottom(c); attachstack(c); - focus(NULL); - arrange(NULL); + arrange(m); + if (hadfocus) { + focus(c); + restack(m); + } else + focus(NULL); } void setclientstate(Client *c, long state) { @@ -2396,7 +2427,7 @@ void tile(Monitor *m) { if (i < m->nmaster) { h = (m->wh - my) / (MIN(n, m->nmaster) - i); resize(c, m->rmaster ? m->wx + m->ww - mw : m->wx, - m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); + m->wy + my, mw - (2*c->bw) + (n > 1 ? gappx : 0), h - (2*c->bw), 0); if (my + HEIGHT(c) < m->wh) my += HEIGHT(c); } else { diff --git a/source/dwm/patches/dwm-sendmon_keepfocus-6.2.diff b/source/dwm/patches/dwm-sendmon_keepfocus-6.2.diff new file mode 100644 index 000000000..ebb2d7a76 --- /dev/null +++ b/source/dwm/patches/dwm-sendmon_keepfocus-6.2.diff @@ -0,0 +1,40 @@ +From 812695104701acaaa5b31afad08fdb576486ae72 Mon Sep 17 00:00:00 2001 +From: Bakkeby +Date: Thu, 27 Jun 2024 17:55:57 +0200 +Subject: [PATCH] sendmon_keepfocus patch + +--- + dwm.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/dwm.c b/dwm.c +index 4465af1..2def4a1 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -1412,15 +1412,21 @@ sendmon(Client *c, Monitor *m) + { + if (c->mon == m) + return; ++ int hadfocus = (c == selmon->sel); + unfocus(c, 1); + detach(c); + detachstack(c); ++ arrange(c->mon); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); +- focus(NULL); +- arrange(NULL); ++ arrange(m); ++ if (hadfocus) { ++ focus(c); ++ restack(m); ++ } else ++ focus(NULL); + } + + void +-- +2.45.2 + diff --git a/source/dwm/patches/dwm-uselessgap-20211119-58414bee958f2.diff b/source/dwm/patches/dwm-uselessgap-20211119-58414bee958f2.diff new file mode 100644 index 000000000..f8a3aecc0 --- /dev/null +++ b/source/dwm/patches/dwm-uselessgap-20211119-58414bee958f2.diff @@ -0,0 +1,101 @@ +From 58414bee958f2e7ed91d6fe31f503ec4a406981b Mon Sep 17 00:00:00 2001 +From: cirala +Date: Fri, 19 Nov 2021 18:14:07 +0100 +Subject: [PATCH] Fix for dwm-uselessgap +Previous versions of the patch doubles the +gap between the master and slave stacks. + +--- + config.def.h | 3 ++- + dwm.c | 38 +++++++++++++++++++++++++++++++------- + 2 files changed, 33 insertions(+), 8 deletions(-) + +diff --git a/config.def.h b/config.def.h +index a2ac963..17a205f 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -2,6 +2,7 @@ + + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ ++static const unsigned int gappx = 6; /* gaps between windows */ + static const unsigned int snap = 32; /* snap pixel */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ +@@ -34,7 +35,7 @@ static const Rule rules[] = { + /* layout(s) */ + static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ + static const int nmaster = 1; /* number of clients in master area */ +-static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */ ++static const int resizehints = 0; /* 1 means respect size hints in tiled resizals */ + static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ + + static const Layout layouts[] = { +diff --git a/dwm.c b/dwm.c +index 5e4d494..b626e89 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -52,8 +52,8 @@ + #define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) + #define LENGTH(X) (sizeof X / sizeof X[0]) + #define MOUSEMASK (BUTTONMASK|PointerMotionMask) +-#define WIDTH(X) ((X)->w + 2 * (X)->bw) +-#define HEIGHT(X) ((X)->h + 2 * (X)->bw) ++#define WIDTH(X) ((X)->w + 2 * (X)->bw + gappx) ++#define HEIGHT(X) ((X)->h + 2 * (X)->bw + gappx) + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + +@@ -1277,12 +1277,36 @@ void + resizeclient(Client *c, int x, int y, int w, int h) + { + XWindowChanges wc; ++ unsigned int n; ++ unsigned int gapoffset; ++ unsigned int gapincr; ++ Client *nbc; + +- c->oldx = c->x; c->x = wc.x = x; +- c->oldy = c->y; c->y = wc.y = y; +- c->oldw = c->w; c->w = wc.width = w; +- c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; ++ ++ /* Get number of clients for the client's monitor */ ++ for (n = 0, nbc = nexttiled(c->mon->clients); nbc; nbc = nexttiled(nbc->next), n++); ++ ++ /* Do nothing if layout is floating */ ++ if (c->isfloating || c->mon->lt[c->mon->sellt]->arrange == NULL) { ++ gapincr = gapoffset = 0; ++ } else { ++ /* Remove border and gap if layout is monocle or only one client */ ++ if (c->mon->lt[c->mon->sellt]->arrange == monocle || n == 1) { ++ gapoffset = 0; ++ gapincr = -2 * borderpx; ++ wc.border_width = 0; ++ } else { ++ gapoffset = gappx; ++ gapincr = 2 * gappx; ++ } ++ } ++ ++ c->oldx = c->x; c->x = wc.x = x + gapoffset; ++ c->oldy = c->y; c->y = wc.y = y + gapoffset; ++ c->oldw = c->w; c->w = wc.width = w - gapincr; ++ c->oldh = c->h; c->h = wc.height = h - gapincr; ++ + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +@@ -1688,7 +1712,7 @@ tile(Monitor *m) + for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + if (i < m->nmaster) { + h = (m->wh - my) / (MIN(n, m->nmaster) - i); +- resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); ++ resize(c, m->wx, m->wy + my, mw - (2*c->bw) + (n > 1 ? gappx : 0), h - (2*c->bw), 0); + if (my + HEIGHT(c) < m->wh) + my += HEIGHT(c); + } else { +-- +2.33.1 + diff --git a/source/dwm/scripts/autostart b/source/dwm/scripts/autostart index 2d979de34..17edf0c5c 100755 --- a/source/dwm/scripts/autostart +++ b/source/dwm/scripts/autostart @@ -8,9 +8,11 @@ # activate neccesary env variables for ssh-agent and other stuff dbus-update-activation-environment DISPLAY XAUTHORITY & +# bind gnome secrets component to currently running gnome-keyring instance launched with PAM on login (this unlocks the keyring) +gnome-keyring-daemon --start --components=secrets & + # autostart programs, use pidof || program, to prevent relaunching stuff if dwm is restarted -pidof pipewire || pipewire & -pidof polkit-gnome-authentication-agent-1 || /usr/libexec/polkit-gnome-authentication-agent-1 & +pidof polkit-gnome-authentication-agent-1 || /usr/lib/polkit-gnome-authentication-agent-1 & pidof dwmblocks || dwmblocks & pidof unclutter || unclutter --hide-on-touch & pidof dunst || dunst --config $HOME/.config/dunst/dunstrc & @@ -21,7 +23,7 @@ pidof emacs || /usr/bin/emacs --daemon & # set theming and font thingy gsettings set org.gnome.desktop.interface cursor-theme 'Simp1e-Gruvbox-Dark' & gsettings set org.gnome.desktop.interface cursor-size 16 & -gsettings set org.gnome.desktop.interface icon-theme 'Papirus-Dark' & +gsettings set org.gnome.desktop.interface icon-theme 'Gruvbox-Plus-Dark' & gsettings set org.gnome.desktop.interface gtk-theme 'Gruvbox-Dark' & gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark' & gsettings set org.gnome.desktop.interface font-name 'Inter 10' & @@ -32,29 +34,25 @@ gsettings set org.gnome.desktop.interface font-hinting 'full' & # grab monitor status (varies with the machine) ### T480 monitors -monitor1=$(cat /sys/class/drm/card0-DP-1/status) -monitor2=$(cat /sys/class/drm/card0-HDMI-A-2/status) +monitor1=$(cat /sys/class/drm/card1-HDMI-A-2/status) +monitor2=$(cat /sys/class/drm/card1-DP-1/status) # if monitors are connected, then use xrandr to set desired settings if [ "$monitor1" = "connected" ] && [ "$monitor2" = "connected" ]; then - xrandr --output eDP1 --mode 1920x1080 --pos 0x0 --rotate normal \ - --output DP1 --primary --mode 1920x1080 --rate 100.00 --pos 1924x0 --rotate normal \ - --output HDMI2 --mode 1280x1024 --rate 75.00 --pos 3844x0 --rotate normal & + xrandr --output eDP1 --mode 1920x1080 --pos 3200x0 --rotate normal \ + --output HDMI2 --primary --mode 1920x1080 --rate 100.00 --pos 1280x0 --rotate normal \ + --output DP1 --mode 1280x1024 --rate 75.00 --pos 0x0 --rotate normal & elif [ "$monitor1" = "connected" ]; then xrandr --output eDP1 --primary --auto \ - --output DP1 --auto --scale-from 1920x1080 --same-as eDP1 & + --output HDMI2 --auto --scale-from 1920x1080 --same-as eDP1 & elif [ "$monitor2" = "connected" ]; then xrandr --output eDP1 --primary --auto \ - --output HDMI2 --auto --scale-from 1920x1080 --same-as eDP1 & + --output DP1 --auto --scale-from 1920x1080 --same-as eDP1 & else xrandr --output eDP1 --primary --auto \ - --output DP1 --off \ - --output HDMI2 --off & + --output HDMI2 --off \ + --output DP1 --off & fi # set wallpaper sh "$HOME"/.fehbg & - -# bind gnome secrets component to currently running gnome-keyring instance launched with PAM on login (this unlocks the keyring) -gnome-keyring-daemon --start --components=secrets & - diff --git a/source/st/config.h b/source/st/config.h index 71de4d195..3869876e5 100644 --- a/source/st/config.h +++ b/source/st/config.h @@ -117,7 +117,7 @@ char *termname = "st-256color"; unsigned int tabspaces = 4; /* bg opacity */ -float alpha = 0.98; +float alpha = 0.95; /* Terminal colors (16 first used in escape sequence) */ static const char *colorname[] = { diff --git a/source/st/st b/source/st/st deleted file mode 100755 index 05490b7fe143d73cdf546c52c996ec50b1a5a8e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133464 zcmeGFd3Y36`o@iSCtVPbSOIB`2og0Y5z(kb(?V++8mushL_kFpL&yS=khDoRn?M4c zNXoJy?&!GSGK!AQM8{!}QOE)$Dvk|qh+D+1nihadx}S{EN3;Z6noryFs$J$GYy5Hd(ezTcRz?c7g4DTOas4 z@XxffUiZYo6MyD4!H~9iTq#^KIsV`})WA0LYNk$C3K#1y>qf)JyxNisP2nVR&ZZCi z&1RoH*Og6%Hm_nhmR>r~f#sTVwGqy|is7hi(w7?Htk*`;>6|OZTvApvx~#N3 zuz2+1%qvD;G3Mf`iiy440 zJ7e6}@)-4A6@%X$gWnh<{-zlG?=jlv1u^b-d<^?dG0MRaqa3Ekh-ZBa{_hy^JQyQg zCC2@J6Qezhj1m9*80{f0M!Fxzu>Um1eO1Tc55(Ya#E8Et#{E7TgZ~ucetj|G|2{^3 zro?C`<6`jBW0c$TG1~Lc82NuaM*n>%M!MZG?sr3s`+Y4&JX2!i=kyr)zb}UUtue|W zGe&-{jd8#C#kj9+G1~dvG4gXyjC7C2h<`+k`^}BPJ7dJ37=ueO+M5=m96pXwo@p`S zPl!>!i(=T{9)q79gKvw$Ju%8Z9OHiH$GG1$G3>Kql*5u3d|ixo@>Y!e-yS3Xx5lu) zB1Zmq#E551jP~|c*j{_|tlzZxU| zkH$#%BcA*id|{08pMi+~=s87?k^k>w-0zVX<@{ERbiFa`568&=?J?pRhWw{k3kUiy zG4ij*i02E0`J-~U2s{P(84@F(-^Ab&;y>4#N$3d5d7$kq zTUH~rq?7wnw*2hrx%oxKmBn*QtNg{4({m@3Rg@P`FPKwSY|GD|yP%>xzsg@w>CewM zO#jeu#)OLUg~gTrX~kv5h5pita@&k+i~Tp1mKRkl^7#FgrE>!Q;wsyWX@I#(X}RBU zPpUv{l@)>VBHIj4Sy@Hlw9=);+&j0xUpVi^(yBl~S$26zg>8lxar=w&Dl2?QXo+pc zb;XPQ6Bibj`&qO-DNk8cUR-ILF{vz2H4i>Z$_s5XZYVc%ot>Lqj@v2smlpVoClr*G z%_%6HZ<~=@;4?C7n=zrX7+!g$ix(95jJq&1JYilz`P}0Fz9}Qbq>6I?gg|9g1rlE{ zC#Rxfe!w>kcV0f1bWFk|Gk;#fmvsfw@WS5tsYW!VS+iE*nVoCa2de?&zPttgf;k0MW({0hT(O|oUx~KHNY_o(7a%ZtsjGh)d`m>bHgko^g~qI$YnPpMBT%q#Fy#d`z3veH5{ zW?K*P6cvrHs33Kxzhr3 zs{EyX^man?3Mx@@CvAAfkc*QMQNLk*{bZ!@@5z+e{Ka^w71?H#_$eq=1&@{xC7E4b zRJ@qP4dob8=1(f1j#c7EW9xDMcdQha+A14{j9NAlz;H+nqQvj5ELe1H*%IG8N_LvB z7~@I_Yhx1^`!Nbt-GGi@+8MP)YDQT}kx`C33aVl9IGGx2h&{*{0gU8~PHUT6l)V6* z59N;rjN0MaNMurF#ezHxG8~$PJvV;=Mz@N>^!#!ZEX#6nPdW37K{=D_WKHpG_cR4= zfI2kesHp65o~+n;bMj04`6Vcp{6aQ*+CZx275IwDF(*(`Qe2r|P*jv(SW#5$t6;m)RDU z@Msqml=^+R4TPi;V5Jl&v-zsn;sJpcl@=MLSm;|~D_K-oiqV8}umJa(kEF{hsDKLC zI-_6?HA!D7+8XY70lhf7f?P8$z4WBJ#BaP%0-sw%&dbSUF8+(|lV2sBw zM(9$8&;Y1T2(Wn3UrOc#mM-lHRA_izo0C0$LjGkJkFlAqORqfXJV`GXoIU=RU7SH{ zGQ7Lu|DAM+Bn}qFe+G?bO0*!i8I~+fzmr#k(Wj#)tvI}0>uqgV^Hiff??|ld>@jkYxTtC3HWShnHYfL+A^SC~Zg^#yYaUB>^3Rj$MIX>yn zeE*4MIr|IGH?EodeYMFOIM1^1*IdSWU9s>@oab5i8=TLu@Fvb@TlhB4=UI3==ROPH z$$9#ny`Ljyah_@6Va~HG`~%Jv3*W_x7JfeGofdu}=SMC4V$N;LdbhXBI8U(fD>zTG@T)jaws1G+ zDHiVGe58eYInT53_#cdZJ=?;^>^Jy43x6(RaG!-=%Xz(ppQ{`84Ket73%74E>^E8X z);A3vw(t(lJ1u<1+lGA#KPO|3SEqbu@N^4TIM1~3RbLzSiiMxe`MkQ`^=s<9yL$7N z-G=sA_^X^ZSorIlH(L0coQEyEh4W4e-@$p(>fZTzoAY!F{}1PR7QUNvpM`(Kd4q-T z<-F0tzu-J<;rlr6wD9jZPpa>o|NWe&TlhiF^DO)j=ROPnjq?TzKf!sUg~wfO;lnuhS$Hbv4Hllpd837=a~`(v49+_(+{Jm)-M#al z#d*4gPvkt$!Y6a?v+(OUZ?NziIB&G@nVg3$ynypg3oqt8N$Z{e+c{6S@N&-cEWDC) zpM@7*W5nBF;S0HaqlGW!JZ#}BIPbLZRh%c?(>wonah`7BJ^k0h@8U3MY~gQm z-f7|6I8UM%ulO_P5p!Hkw{UY@&9m@#csxD}-_3c0g@3|%qlI^H9=7oBIq$UagPbR= z?VbN$IZwB6bDYn!aC4mZS@`cfo(2n#=l!D5!uxX`w(x19&EJm+ju--3!lSzr-hs2The{K^KZ^0=@xFzJ9!pv&M!U-H|LiI3peMNMhiFR zm#~GK^Gm0NoAXQ3{k`*V&M)Z}Zq6@x7H-ZjJ_|SJmj(+j;pN$A;l*b8Te!JC?6h!m zeV9ZC!-Vn2Tpy-exVb*evv70W;#=kTH`il%7GA;Q@maXJE^4rFb6wPE;S0_3xA3K$cUt&LGyf0u&VN1U=@!10^E?ZG zh;yHXKhAlBg+Il4qlItaJZ#~A=e*OxH*%izaPR!T$$7ekZ{s}A!rM9bS@?ULH(2;b zoHttd=bVQv{2R_YEj-G3(z@RH|B>@_3qQ2@F<2>EMFXcSX!ms4qXW`dy-eBR^a^7g+Q#cP>_)VO5TKFu^lOFAz z|6#>Uzs`Asg*S8FXyI>h9=7oJIPbLZk2z0ztatvu%3+^ok=3pdL->B-*t zH|Mo<3peMNJPS9+d7p)w<86b5o8w`lg`4A5*uu^6q|?I9{+_hHcmB=(m~P=_f623O zvpvtY@Ugu8%(L(bW_z>nNt`dX@as8WZ{cSA8!X(6ztO@|GK~A&WZ`D~9TslJuUoho zf2W1t#`Ag9!p-3$Nk!>nvR1_UkQtHMeiH@H}q6$->ug`*sVT!R^Bq{vfySu<+U3Ubpba zxcyNJpU3TOPxr2`XSjWmh5NXDvW36M?MGVpVs4*q;jeJ}EDNvU_KJmX;`TEvyq??7 zw(zao-e=(r+*KqrJ7T(`&+~;BoAIaZy)L8fh+`hrWGm~+k7Jut3+&gM}~Q+#Em5_*Zhi-eRwEzQMxp<-F0tAK~2W-)8(zah}Qhft8#6&&m~x z{R=#vp7DUSdYdhcbF<%D<1zcI$zS32^DOZvO)>h5&%)p2_KPii@fC)>*}u*BTe-bC z&zpP$w>Q@dChz3D(Gq{^gT@VpE&SDo4c=+tn>kN<*~pg}e>>;t7CvdG5l>zW?z8X* zxqX9$>zp@Q_yPXjJZ#}roOj0HNq_5||04b#Jl(<%+|ToG;om%9aG!-g%Xx!^KX$~h zZ;ZjiF?gqio8_7G_ulz8d3p?<7lZpOdb zwTIelK7q>uUo3F*Y#@2p2z;PmUoUX+`$7!@KTWV-Cvf^b67z4pz?~+QRMlEBXs?2`qaD)1D6j}Z7sfuAq%bb((W@JxY^6nK`v(*&*v{6c}} z34D~mX9)ZvfzKBBXo1fY_{9SE3H%a)FBW*Zz-t74sle+6ewn}<1b(@|*9m-#z}E|$ z9fIb58wAdO!io7b3j9hTo=pOG3A{<*R|&jb;9~_I7Wg=U?-96L;2i?LTHw0CuMv2s zz_SE?RNx+g+g6=y|KkOoAn*wSPZGFS;K>4?DDV`4PZIb@fnO`|bb%`Z&lGsJz_SEC zS>TGm|0M7{f#(Q(hQM zzfIt}!1D#(De&0>KPvD7f!l&7+y5MaCkVVy;7I~65_qz}iv^w{@DhQK6!=_$rwe?Z zz%vD2D)20U-!5=P;QZ)6^UV`@nP5Ld;0pvkTj1papC|ANf%^pR6Zm3*-y!fCfmaH= zUf@*%ZxFa&;Ohh)5cqn5FBJF&fiDtxqrevne3QVJ2)s$)O9kF8@H+(_7WguO?-BTN zfp-Xeg}`-zR|~vT;57n2D)5y8x7D6(|EmO^An>5TlLTHX@MMA42|PvMcL{u?z*h@A zUEuWs&lI>S@GODfEpSEPn!xh}eviOs2s|Y4*#ci9@Oc7XD{!B{8w9>s;P(o=M&S1e zyk6k<3%o(#4+wmnz#kO&dVxPA@C^cgSm2EUUnlTQ0)JHCO#=V3z}p4>n83pVe_Y^u z1pb7;I|Tluz;%JI7kH<@pAz^{fj=#98~K?HZpYrf5xJa`dhDb*@ z{zkNrriZ~unCZ==<489#{VM5r(v3{NNZLVqJ=0H31K+<8RuOdB&bQ9B;kv@%dBhwd>9!z>Y)8~?Ql5Svn20zXknBGhJ zY|=KScat7Yy7M^Q|J$TfNOv&ZLi!xiVWu~eK9_V8)31^~k8~r`FOp6ry`Jf(Nsl1i z!1SY}&nI2O^nIi+AnjxNZqg%3&t`fR=`_-LOfMyUA?YlpD@l(cozC>_q%R_!!t@-{ zqe&+*J(Kjsq-{)3C4C9$&fi)6lTIhy!Ss02my!-MeHH1;NH;Nk8R^SOH!^)8=`p0& zGkq@U4AKou4Df%LBArb-kLjhPCzH-%x{~yt zNT)M>JLw$KDNN5Hol822>6xUjBW+`PD(NYtJG)r@lg=aE!Ss02*OLx2eHH1cq??$& zjPx|pjZ9xidOGR#OrJ~o2GR{o4MO1gw}4b%6Lo=e)t^xdRs0*cILdKKwX z(s@iTC4D>TET$_-&nKPE^zEd}NT)D8hx7u{NlecqT~6A@^i+vi%HLB zI*v4LEl2X0?m7#4Dd{Yx50So;bUM@fNiQRv!t_4U%Sk6Oy_fU~(l(}dlddM+d4$zJ z=^D}{h3Pq@L!^_Ko=JKQX&cj1Nv|c{ zd6?Bd=?2mrOphmhFX=GTSCPJtbQ9B;k-ndFBhwd>et`6Prq3n)An69Chmd}VbPdyk zNIy*4$8>+v>qyULI*#-sr1O~W8Up<&=`5xXk^VF3bf)){evEVq)B8w2PCAL{y`-NY zZDV>j=_g5d{>ti~^m@`AOt+AJigcLi&7_|u-Nf{(q@N+($n=Y(pC!GX>8DBmg>(bc zkCJ|lbPdz@k$#@EkLkNfZy-IJ=~bj(Af3nbQqnJy&SHA+V7sk^>WlqddLUcfb(^B@ zQ-a@g=1re?Y15@|DIxd%^)_3#^ItIirQ~9HI5kfjTkpc}%!ybVhonJtaUJzLv0Q!# zhO}Jn*WDoxuOZu3euaI+OZFN2=#q9qQ9G69gV!j{N8=Uy4rSK~|6oK=%p*wX?kJIm zdryY{Sw6d~#{DwF+5)3)P=f9uu(T=axBdZ&=H7Uw-KM9Z7W5)~?2zhUXPv90VPzHk_>K=Q*)^2R146yK_y5$vj7^ywx$j9NW6d2aOF;F*5IG(3uADyly< zAzS^RNYNZ4M#5iFy{RKFZEEX7(JFPj1LrFmNRcwi@R#der@K=-@Ys@h%Ph~Wo>`vT zJo&BJ>Io&}PfeD$T%-Slb*$Q&qm`v5XNM+s<1XVDRb>Z{+ZUE(2Y({CTfo*~7l;C!IuIpQ*lr2x%uDG^WzVCSh!E8CM1M;f5 zC~?YIf|{J89#qsey&a)*)gL0c@L};s!=5)Noyb^_Z1`M`t9}v2Sk1W<4^Wyk_<6g{ zb#z5xyt@xvX>BXpcA)^3!ZxL}>HXX}NoYeCsJ}J;HaxApw26L@KCMkD>_*eP62X!B z(G(@9Cn<$*E6ray6np#OEXf`iRJVJ@slm*YKtJ*f?zaaHso_>5q$VY@kdC9|7u{ah zz4&HLip;g!LV4Y;qw;lKb%z&cY0}4>bjsHqa-CQ<4wYInJM@Is3z@NeTE2es!Wg@yEZ|ZMc^!wZwA} z&KvS{yMFV?*Bw>e@50B`DNotqIwW5gR-Mhz$jIRmgw*YuSx( zSe}?c!oEXaN$G3S6Hv{1T(HAl*BwY#)+wRE+bO(~)`BW=c#!>&qoG8ukQ7+T18qOc z6^Yr*sSIchcH8~-RtlB)Nfw#%!0Jaz+72Z&<`r0#8+yk zdO~fBe$J@DcA?%oHR;P@l-7>rVfBcCH*3;82w&H|V!D>NgFM@-GD3^c^4-sZM+ZQU z2p+TtPjvf-VMu{IT}5dOemHoQEwGOUnP7{<)n3`DxmP22=%#L0i+nBWA%n8DB!VIJ z+t3udqGe2{_!5H6_TX=J|1Q*xe29OTbzPt~Qv`ODh%5#KVpce zYmy(NaS&#MqchSdGR;}fA{*QieKoCFDSQikU?C%p_DBmN@u)i^J8|`@9X!BI@XpaL zYKh3`X^MthR)?+I)Os1yow|%4VaCn#E!1 z?dGoGX<k%We(w?Fe9#)#aa~$@jOLn<-A*H8&uS04CFD3-d9dMy0G7kzh z;W<1}a>#WXkqH-yPOkeHPyMK-+GjziY?HlXuaRpXf{MIBUc2S`2`F|=+CGO38j6M~ zOYH-`<}vtt(5l?e!HXJqSia{S)LbM854AI`ovJ(W5qK)vfMz8a!C)<|Ac-6w_S&g* zX28_G-=m&xKS)t#Lu!d#>roB6mc5~N#!LI*PHX4wv|TBE%V?*+U7)r#cMnhdt@JI{ zPARQW;xLw0PBUhPNK*7(wI%IsrEoVgG1$n&E+Z4p-wG%b`;du&l!^E8}4L_>*dDHSbemyw%# z)=b+_J}Ax8LzPstYiSQIG93v`(}tzOJa`P*X(S6N15$HdfKOLg-6dbwt|s<}kaJp8 zsUP`CXD|zL_gMTen_EQT*o??AUuJv^w-Q?MyS^1oa5I~&LK$zH@I}Dju{i%&&HXnp zeHNx@m-Hl@EBdI?!?`%w)Qm%apV7xZH@9(IGZmiwVDd{(3*`iaw z_^0mfO{|h=6FTH^U}(OatR3UEoW2Q@G;iMlY9BS+uie|P$=!{p7G*T=OKScqq2Jry zel2P^5y&2GR^LYK9wYXdJ+X&7dF;{k@SbUSkL~e(rN?_^$PbeZqS&`9X{`Y)J~8ucOE9J|w6K39(hS!fz(Rty@zp~L&E)!% zNB}d1hl%R7}3zLT3Zw5f#|Eq=#|!tUPl?d14%{ihj+5odklF`g?Ho*Drzn9FuuKZ z@=kNqZhZ{-PGi0qd*HjZKi%o6peJjPJ*cQ%>IpoRjk(Egd!2R-S=MsYwx5;1)^t7L zzh=?!nyv=_1vOodZ=y{)+1r^_pV0@_!NlQz#&Wo|rt8T~`G!yQo0W-u0c#+)igW2bsN2y;sf4v2v-iZ6=YFGzGsYiplCwSDo=p3~P zp2;@YXyaNG%%d_rRSjVGs(VnAN+Ftvv;)EM#I`59@CT*&TZjCw=_4J7cVN}E67hM0 z+w9)4BOZdy@*!>Bkx40l2y`zGRI;*Y!ks+fWFg^Sx{pWe z=+QF)1>;cEpA|d?I#9o;Es53EQO6=hLBGeNlYc1YdWZT`@T+TrZ`ITfIIa00o|*AT z^#dMT9Vn?eyQv)xjytmZ-01`oZv^N+*j|q(Z1me!R=Lri`O|JvuczFEOPg5xm6o6r zDB94l{teRCoVP(@Fe<`)PHW82yiUdbx#EiY^A*?UmFMMzic%fg*c|mcJ%gH?x+4ce zM+YVgbdw~QRP8gnU(1`gsU74)PpUnS(1BsdToUWTO5uL0KP7k|Df&ooY)as%Xp62! zsKf5Q869@TkZJ#>qEWxpGm#kjp=;P?cvK&}rM0z9nolb0Rxu=-CJ;t^IxDjTi{?JU5BdA&=UU*>H29|qU(_V zl1+45uAltrt*(qegI6ChuFHOOxmT0^-nhz-)7rk(<*p>SJKE-Q`{3d@=)N7I+draB z8V`q2P}2$FPs^ALm*yUaPu-8XqLmtndR+Y(JymapMVmALeiW`v>cd@{luWn8o9Ib#yoTv;(Qbj*xrUZ}`;zf<3*U`&~F~{{C&!>u}Isjh68aT$=k$viTKH zDy%tZ(&Nyy7;cA6uP3c!^+WX?JY5A6>fVy;X#DkR84ttStGVxCml1cc%jim6&}Z?9 zN0R}nyPRAZW%$&Skr{Qg8&0n)VBp441DSd z*s!F5qE!!L*&qD{PhL6As+0*ogy>M6SHKnB(|e{(_F&SdN08~M13c=xu8*tx(irbi zKhmbBCU{-@tNVLZtmQvM@h50GsRK}9^|UV2q`rub_6yqODZ426L_GE{)}+oG81}k4 zy?6+mSa(3KKg{gkGd*;8?8nAff^Bi0CT%h>;!ZH5N}v%2)h4gqi;&rc+c9>pYI(V&M7y3q!Z1V-M_q|+Zj*-S{#q=C#aprmaA))Q^)^8UF#1nGCa`pv96vPEs~%K;)DL5z!_2T*uf@|u^dBDBD?tawN+W00UIcm$ zzs871vD7w40#yul2nTpwzgEAW6B^eqM=L@G|Kh=*iNxq$Wi^TVAMZS~XE-&ShQ`)~ zU%bR9N84%I7(7{jh&9ZOhymLwSnXV;sN~+1p z{H-IOs$Za5s!ie*f`j@hE2w&e>jS&?f}b`>~#+ZQoqoXXnh!@b#Lot zswOs{X>KQc^}DHeziY-Nl>9OL&}pxdzYQgSDzc|Z8{idcpwjvOTlmXiDi*%`Spu5# z!>OzSx`YbIP$@;a#eZVmt|cyo)TH$=q>}zm+84nccB8o6^c?M+3IEW5QLeX_U6)hX zGCAa6yN79SXQzd;n>$!>ANhnz9K~9~k{i%R(OgD(k2zgYFU7($mps&Q1K9#aPsnk# z1j4MCli31*m09m`8yieHq13x`u+|xD)9G6HCvqG@z5_xqx zEwEQ#h)*?)65NSisuVg_Vtcu}V`bL|C`7q#0DQrz`TVF?El2Px89`+cDIhX}ND69? z$P^-{fnad);|W4?<7ah)?Q!+e7&zEKU=-D26lG*T;(^VXWYcjxx|aeC2qq4NwnyHD zXK+Lk+$SQ>{*lPR~8v}GCD+C-+ydQ5NY zZTcul8k*=1LS%YsvNlStBfo%~#6cpRa&*isB~0g)&p zC@ivZ68VG?jD$quiL`+P-7{%SuN-?OA`UDOBajh6bgm}7Hw8^r!Qk*VIr6%NiYmps^5|xLoQ}&Ic>c}78#sFY zO*0?1rhNsU^R&}~U4!M-PazX(IJ?ksSB|~2yJJfhG~LUUchV%=>d0|@Ee9U~L{0D1 zPFvYUd6L)OgK=tQ*Y{|(@|t|OL#vX}m4ZhvT@+HA5Zme;`_b+WY99T9iN`~jext7h zNBjcE@#qHN0PuHENzq4xBR+@Y$LPJ>`aP(GXfQZp2OLM(8#LU-M!Z+VU7XQ#7oiTc z$C>{<@J}m|e{7P|q*(|p50vKMf_d=-?oyh{+#8sCGTcg`Q@akA=6%MC1;jrWSReE$ z4ZHWiZme`W464pWcbf%=xJ|VKf^_T|3+gHd)eQ=>*gC$8TJ z`(V@_c;l8sq5MGwN%>alhfWvZNjzJ(@`?s0Xo>i0Q0XS9o|Z)HnoGU zw60M?-qaLwCDE&0w$(f50u<_j&v9pT)A}^HX#J+YO%5y!jNK7^)W^8vOuc9iC`vly zp7%HY5U!`7o_i0TLHF}HY~}b8N>Fn@3^B^B;xpK0*QD3T(PWqZezf`fI6T+r_fSKj z?0L1(h4A!ZgWiD!az5M>UB~6M*CLv1bsHNU@Y3iKieRw=&&^|yXU!Rp|5*SQaM)Oe z#3C+UI)MNE!T)(rJO$Ay+N~`q?6Jm+6}3aI#S1^1VsD-3`cbYeqg15he=-`5BUN+W zi}+cJ*x55uyz~D_ihn~?3hlysLX*0&uA)~57g2)P5M(b%@Z$9I%F}|&Z7Fiy+2nyI zO?pN>;B}2jT`nP4E0VAwZx8hM>~N&^&&9*7omOtFv?u_L5+KzQE~#t7^ncPa z`T^GN_#a&04pz)y<@F}i|GB(6C-d?`&wrNOg_De>s=Za4G#HE5$frmS@$%O&VP-$H zCHme;_6BE>dYEE=WgcnVI@6j|07((u*DIpcED+x3Y^Ol%IiDRSrIHyG`HGM9{CtGu%i?#LcV(mr{ zdry$FdxE@a1WE4I*J&pNyG#zY*wfs{@w!DHgKml~&5K;pLC8P_?$M#{2!2-`kPdI_ z4qO%Ns7BWtXRr1e(|pk<7^kKf3Dd2P`${(+$A;R(;0Ildan%Nu_Idl>T->n8ez zl%v}!vGRvx%=tKZAlyxDY62K;NE_X6I8sOReSxy$ z?v}AiFG3AutKZVGx>G0%FP-F|&F%}Z%^gg<^)5T|9m<$XldSr&z6+&^#LL^HkMX#PzK-)A2jp7p zpxL(2goUy*vfPeBP}@{V_pr^0dOEzd1^;aN7sv_~(_HitZCE?}sp7=bA`58Ay9d?B z4~w*J-iVa8cv$>j8u8Dg_@x_>2@EmnA`IfXw2QU+t9PUHR6K9(MZRCzfIMmLt`u{L zFbvp{$)M>=lA%Jgg>4!e?@%DDJf)9_rsxIgW_cc&9ZR^iph8sqf8Z&qH1D(H$btw z*>Wn5x)L&OJ&|=|nVx_d4R*)LYjH-yra$u@Wpq0&WTCdxt+(mrNRS38+JeH=LY=q$ zd3Zm>_;$weM%#w|Va#T^+C`}_dV!2QG^~Z(e<62<;eL|bY2?-}XQK=J?tY8V)ZwL*Z~%{D#Z+3NN^9J0kn((XHku~^N2Trv*I%9=3X=pLn6mEeN~U7Qq!w? zBwDDAtw#)Fj1xBfh92KjNlt=f-Tg=X6tpp8g>xzLtKa$`*76=?rAf<~**HpPl>POG z;r|jsM%GgISdMcX{xkLYJ(g2@EH8j1f==lHrxVcTkF3FSTej>y5YZ4rjyC#>Rd$s9 zfgB(@e2_%bOfoWv$4G3RL@HsWPsSjOh1Y)#@tRbF;kZP_vO`+RT;9~U6553?!D6xx z)^S?~Q`>RduQof_duUbY890I0Yc#&t7>x_wWw-t)N`MB`P)7JKtb^W+1JXtbP!Ht78-{BI%$8{7Y_o2dF* zvAKKfO)9FOdl6!{R}aJXhWev=P+y3yMlahmDW7tp+g2Ni8#%5 zT_^36eFWblUl_Ch5NsRhk6{U5R4IiYq&Z)M#U^$*qSMu~f})|ZHToSzV?U%iAAr9R zelH$)^;^yGtgTR0;rz&0w3R*RGMK1(Uazi0S?K>jvx^=ORs-xb<1uS#(~v(@zYBMT zBA07_L0i!4-!Uq{jS9%aSUFVhLjx@}ldbeZTfd1KCp||PCk~CBQqNX;iINj4OHGY5 zQRXP%yRd{KMc)QT#wh zo%?B`zzbP$y$zN|K^;d?j1SeOn6F}-Z(Kty^VSw!AApBMoUeio`Rt*|-L8-1+-3~q z^Dxi$>sRq-MV`;VG54`IA&YN}W5N^8NHpkdpQ|pQweUeb;~Od_tb-1+B3OrKb<7ZpaqzJ<31*d_;JhP? z8qw0j$=l1a5b+Qev7657)4d1RZ650$4Gs#5$DaOo=2t9iVf%OIO#SDw0f6Pcq{S| zy6AH>EG!%kVx4v_JoF3MU?rVSK^YxPbg)4ah=#^I&cbMJ^-g&Gc8KyTEr&a|@JH;@ zzHG$Ewj0oG+OXf#UtiU~J&B&0?73(4fnUC^Y7h z9Ce?5Ce7%Y`zrF`s1Hzt4z!`yVM6-FKOV12vbAxkc%_i4JCS=j$$^LL=$AZ{cZ59<3+O9)xG?)iFMzs_&C}^0o90C{mz&hZbay48wOe&2T4t!(x%Z6WrF)w6E8=? zC8{$W7gf5LKHV4L)2n8rvCHW5=~6%9JX|cJW6x7&f_hB-6?X%=u%maG>$jc+6#^s&O-) z-b#%h18q;@c&gMKBSxY`Xllm(Br;NtX!RMh*n?y34jRjxbAjm0=%ZBl(!H5zTne3f z&fTRt{{%lx$|eiUi>t^YaXwkxLGNU9cc{{6_|f|xKSK<)8_wP z{i2PGaOV?&U3*vjQ{59UWx)M^-iMpVl3do361_X(!b zNKfUZNo7!4#%=gi3jcGmZr-L9mZl_VQV^l?Zptofq8-9+f8T`eF@0%+vm7l5@u#ri zK+70O@wm^%r+y)B7bElFRC%D&1rRAfmFeH(zS#oc1xyqAOxoUKO;!AA&3`r5;D|5% zSpBw1?#ofabVr5KtCvwtI-gIs+je;4a3swA7@R168ljZXc;g!q3R-Ze(yqQz&nBeZ zidwrX0Zw^KQm|{R|4tPCGE5Y9LkBw9)7W_XjyN=m50FBzOJ1>68~qlXoBJbT)~YaL zWdi7*($J>j`yJ9bNP66?Kxy#U7&Z76y}k&T3~Tqp@J-~} z_HXjXRuu6q=y}F`C*cQ^M4bYnVU#FV${Ak>Lq>(4F=6N{aJ@QhN%gh-ZhD=Q!LFkF2&RI9-H?mMpuz1q*r_>Jnof=3SxGtS5&acB zx!^DkzF_9)TklQnOYCujO_VoY#B`{~=Ayn?@|MrZW=Rhlj4q&;H0zFFN4&f-C$%rW zTGX%IQ}0L(9_#jJG#`r#el2^jZu0c|d}4iBs=cNQhr6(_iEsY4Prna6Kx}!PRFjEC zJbiH?>Y#@WVQ(DIS;J}LyL&Q5v+wZ{aii8?6c_!3?W0HOi2ON;XrE``Hn&j!z;yBz z&Kl~sV7`c)$|~6*KhP399w$H1RNErgRl|xJ#u|(_XaNqnb`~7i_bo*W3?Az**Byb@ zhCRIxr(K4zmeH&AkB6E5c`IfkY|7Jwv;(^zm>24r(Vxc-n~Pxnfw~i0eUY_@h_$Nd z_xi#c5S@-WqH=(F%5(!YqWLWGj9Wnw*Mronu&3Y}{och`xU5-^J3<`|y{PU}f2)2I z&X-Zm4*}0f>)H5&9}*HTqYS({HC( z55HcC)S?aW`l6Q?im>ZG6k#&uubeuCmiR_53u*~n7|hsDdBFDx@|A=txc32s-$NE` z4Aw>u#_dF2!_sBkEdQMdQAQyK3n9D|;yHwnw>aM$MZ;UhBp}?12d2iY{Hp~k8ux3X zQDiGrRx>z@{0xk9LZhc5$2c1?iCx?oxI|hhx%q*65l0=u=v${#eBu-lNIf|{um`%} zu~W2R>pL(;dWSuZOXN(%p>e)PHFXf0RCl#pn+=CIw5Y}t zJTcrOKeP>f>YKyTpbERKDKNYKR=mT16E|UFABUx`ay%#o?!+Dt92?Lg55W)BxoBzd zSf7Q^KS zaZbo1YcK-(axb;mV`N%TVaCYIZwBs>ApMvd!NEJwET1~KP_`)@s za~4mj?h?ekp~gQb=)RO*7UC`au{-2iY)50NPXQSp8a#4k*9myZtK%sj^bM@|3#l%b z#o4oQB8oQC^>g0DLeD<>AnGmh8MaA-?MbTi`vSabt@|c0Uz2`9deqNC(>|~1%8^&ELNIybZoHYV zdIA|K9DFa9*xmbT-mX!dA;ce{jLYHB&!quoD0yU@2W>1r6AAVu=sq8?`N#O+_jdht>=Z_RLY59o zr-3H<`|1ft(e>`sm(Ikf;77{KP#Ujegfm(?UbEm_IrcNlFeG(+7;MMaRrbOic?pqh zLebjNj;d0a$fF=y;!|*H&WG`dep7?XRxGb=`pc+IL_YivA`gzJhgmc-6XA_JJq@|U z2vz9Jqi8f~2`+7p25P6#U5Yj=5)X`qbnojl3hiJ^QPR?BFlf|2#fyr_0LqQ??-!w< z#v{+q!9mYNp~T0~4C;pt3`Vnp$F5#@ikr2PyFSO6!Zzvm`IH8^Hp8C&l+ft;2vFlL z!sj*qQMiX&s2#1_;fTXq@i5-0$w3UXnAyI~-ioTEziPa#ir%tNx36)~!Do6)z75g5f zRW(w@9v|~DysJJ45hu8oWeHse}d855v`VA$ngzi8z&Zn8v{b!s_ zQS4m`w%3Av&_Lvk*W2rzyWttsQ^wsOuilAU$Bc}!@*AztIJ<=yqc3Sv5ezZO)NV(K z(L>0WxJF3exrBLnWG|jW+;D3d_ur0H{0@9~6IXpHzK0v}qlah`wSzj$`DA$--0@N= zEO1=cJ&P>!$Z|3)gYI80wA&sjY87I6A~G*Ap9e|IVc4pa3fLhBQ7 zf+!MC(Tq3;K3_(T^oKjq33o~)N^bXqh!K*?X1L>}zm_8BZCb|jxatpKj*B!f%dvvxC2(u*m9R*I<#MttBg+zIIZ&{aSe&;| zoI8x3Jb?_|%ur7|nfPaLYZ;fpFpV1yA;ZDUa4R$PUxY8N`#qTCRy!<{Tulh&(~N;w zUqn0SU-Y9Ab#|~XcT4>cDf$~Vv&c5Xr$4fFazjCLe+Ntb-i-+Q3=A~sI+mbOq2u9Z zqtkm}Sr2Y>IGnvA;e;tW1-3W6+bw}XV zU!=Rdm?ioNG@e%d`Rx0;e@1p`^^=JHrDdFnv^8lO#fig|KWT0Ufc^{iByfHO?+>-a z%i$M{;48;+=*t93>U=W3sT-TmM!~niII@krq<0VkDOC^CGMeB-e9qT!HSC@wyT@S1 zPP%mRl`4uljtqvLxnxT!1e@8v%YwV|M8EY;;F&{=TA67F~!Og~0 z&HXjLAFj{9_D$psW;RzayXBj{S7Wh^i{Z?g)1St0j@{kN{T)KR|8xr(FfqV3$Co_-6bm%?}V!c z=VZ|_OM)ZHp?;547@`2;SY(bNrb8Tw++c`nA%0|sBM{~)h%ediU_gw9*c!Q*%vO#V z4pEIR0EJy0bw3^%T2fKG&td^jb=4Oh*t0Ff0_AtCpfzbac8Br34+2pDGf;>ERq#N& z;h{?ZAsad`hH;7odXoTs?>jVpU+`$(MWpaSh=4yrkdhExnkR&*A=TdID6>W%Kk z)HUhvxFU;+ zFFcM&etHc9vs7~|(=WG4HpD`Ik=7Suq@Cs?{upiFFYpieZq&#-?w{R~1r&o;z-5H-@>gvBMdBb)h~LgeA!^d8 zFyl+@h>ljLNnv+j(FxBhPz*b=ZUXxqHe%*q8T?qT3IJ)79|U`8{0fwDk-!?>MC zNnQ@QAxW+sg{yuM4kt#=A=h(_^pu5fp5nW{GwfNLE=F`-+1r6Fjh!@TWQ<_AK?zZc+@Q#j%YT=2Tdfuj5x zW;yYxVf-cxpxvK%SXxaEx$bcUIV`P#i1VMJId6vp-!XxCXuyT8X8E31;7@0FuZPE2 zX)QeDwRFc?;si2vy6}lCpNk6?t5dO9rcEXGmAm-SLn+YcnH1I za2g)j!t7*8;c=z;dq=Re(pEd;F2vB^!Y!8S+aH`I5qDGmoVz9y8C!aP?NrKWZt zi-xs~ZtSw5ul;~gF+#s&(k6w@MghUft9Igj$8aR&9W~+un0Z{=yz-O|ZCD!#`)4SH zX1GwfePD#w1!2wEiNM~peZ~tnhf?@6du40ikzKfx{i;%ET!Oyo74)QxyC{;-^i-@a zP;I63I8VQ1(k3PLO8-fUaMXzDLi&lmpD!z*L^iJlYGZMusk-xmS#oo85Md5V|lI1u@h{xwy32U__K>AhhngP@)@E<;}Z z*3WEH7SqWK_)25XX1VcuREMSaZ^iZzHhd1CVbD$rZf8H1?6e*71{GxFRru(u(DQq3 zR{htBuDZi3=Hq7s=*#6FviC}!EfhSuRNbGpmp!i2x1}8D5 zmY+cwc0`kZf7{qV>&(K|vt#RR@YLIXz(_xsB@t~7*rdKHI?PbNAIv2MMElFz2(AJp%73BOW;D!lm&T41N3VABp^lA3%3E<2umv%&Rc ze`811TzI9S?ugGA4W?#Xz(OD@%ztOWT&Gv_nllMFtwnVv;99r4dIU0xqgQu72fs|c z^?5e%BE&10^NgiHH3n!ZSL}zm-^X!PyzbA`hhQ#^ZtM9`wUs|4p%Svy4{+(Hv1EhY4!JI#Ebt3!ZQyX>Oq=4`gV#Et+SD2X zp$Ae~B%*&ypi@h{_H?vP&owwMlHJ^Vv=5tFl=t@`zx@VpQ~EuyjRjZtg_hXq$2zbB z$L@EJhdmnzam2YFX+O^Ve}n+0E(dJ zm2)yXRsDZI0U^NM?JB<-|w(=2rwyd#$hP}M}j{E z&l>;41c_6#fk1Q^D@MGvr@g1M@OmNoF~)fkn~;m%oimV+NyhwH1>Ex%Y|Ei({HWjX z0^LdLiYxN{--FGT#LUF#hst>bp|y?(*&9KkMFJu=RZ zCx$b@*lunTdE$H*>5dc8gTWEUZ^Bn2jYFrw?r#67E5G~kN&KME3FBMy#=)_z*jmGl zC*XvriXY-wl!7Oha}kC9IL0_dyE9$ihWmhHB>e`6q+jv0`SlQEAlf>M+FlM)s%u(t z3Huh>H4y0N^sS$G=?W5BI%3@kmwqi`)uds}9A~vc?j4j?4Rytkn;NU`H{5664EH?4 zJ(=9MlAAJ0ue)k|^ zgw~5MX%~*Jz7a9wEhA1VEhZ;gv*tdPa-Yq5Esipw^-aRLT=K=2xQ#o_f%2-e6WX${ zhl)w31t&DdfU$DIFUF-NV3Zlmj*SG8aVPwDH_%|_V1Q>ii0;u(#|YBX>+!w1W7(El zz;P1=@5;*Aq_CZ59AB0gid*1MhWxwTV_9zZYZ+IuI&l99nbAwAHZf$GUjXj|osBMo zN9@|8R0tToGDphTTE#NMvPQ!b`ZZ1{SHycKIld?nD%PZ%HhNuA*6sR8QkMh(byUsLSDNe=Y( zy(loF9&oVXNBtd08lPHw@V}`9(D+a$+TvuhB)S%3=-INKiXm_+#uNvRuqDW${~vqr z0UuSB1^&-VG7uoiL?wsG2?B=v|Wzr??AQ1Z~u^Rp#22e zlyNGA#Q3vS2(J^^Zb#~Vn0x%YOaj{Mn7W0xjMwCCzyTG|W{EJ&Jey4kDC2SQo%#g< znT~1iIHorf&^Eulih#ax%!>a5-bj9tC;oRzY@;LfZ5Wf*C`Of(E5v!iq+Fy3k4Z{b zLZD35E|T1!<^IrIjj=vaggJ!Ysjn@)zeo<4f8s=&=>4BoVVv8_I6)X`cEXGkS{Ppt z#s!-3_ZDNjR>sc42w#}7a|`1+!Z=Vf*1#wctPyWYiPVNMsy1}2suI7}?uC-}jEFSb zt2$^)(?Zpeki%5F=mI>Z{I1%9jn7sdABD@}c6=q2Nkr;vM`BDeWish&&SkI7H`v~F zihVV(sk$xGTFrE(#bp2M8kx=Vu@}>RFU}ILqr3qNzf6Rd|*kO{@B`CI2& zz)Q5_x|Nbm0oVA?n2eD6Vjb`1v_DALR(){?2-0Nl8BUI4VB?|`F!85@`PwmSC%Rnr zl2zab>~#G0w=g(X)$`ZtJq0uR5Kqa#pZ~0_3gfk!>M~U^y%Wf|oGc_7OA%?_LcOmn zMR?k=0xrfa@nXGq9{mE*3OuJy#%Dn~;^ zbdIu=mU6UArRGDkJxLLj&c<8H!8W!?#w25r3^aoMXSAj{K^ov-#(2#aB1~o7T61%5 zCycIE1Ugv}NNI_{BhTVF-tzo{cA414ws`(tJZ1WjsPDEso398*y;eMzTb}>0JYR0{ zoGG5S;%PSC20PtG|KUDgx&6=e`QFXy2>awGvf;)4R-R#VvZXmG`e}lesTbodCU!Wx z`7<=jM7gI(;-v2xNP6cfi>Uc+>*g6c#qIpAT4Zowx1B$u3Rl3s2dZE?35lOB?>%Pl zx6e2JJ+~fO(%nxdJx|^b@YZ$JyUOw%6W>A2lXh`e)0-H@P=@#ZJ&uj`ArP|PmA{US z{m+q?{;~W;7r$4)wFqFIg0?*Y`z6FR5Ptyc2_${SU#R9=RQW>n!&*{7_s(y>*uwr< zu&XG)+EQbnyeD{oG4b$g9Tjug!+?4kztqn1p*n%gvsUOubH&d(h%dPz_`p2 z_W2-dIt7vnfms)glzZm69(3_YhD%#Tswh((O3QE46Y>Wa476F&_VzY?;5gN64zXN89fb$C$2lE>W@EpuZ!! z7KeYl(?7nee@e1{O80~Ickqk$dAut-85I10eGBjEI;&@tBQB8iIF7n~X^%w{THW`F zzNE*PPsio-bz)NMjE1_shwByAp|2!W20iubLRMs2+kbVOjx+V$ zhzp55Mx3-LuXuF>NsF@h=u@CFn(DfxO(>~^!f0yeIwg`WyQ_z!C{u!9o))+KK>v(j z8QG39M^as2+TVc)_a-*bfrRE%VO?mI9&3gwkdy!puR~CqU*963$j}r)^Q?M7M$_D` z6mZ=x6b%v&e-E~dQRj1wR+6O0YJdW+zYE1f$Ot3;EQklC&KhA~kGrP5NT+C-f0r4) zuVn~KPyVZ1|E@NrN2Y_UO+_Wvw2**yh@om4LZFk8MV%nw5wVdH${~q*o3W{5RR+pY z8V!y+;QA6ZE#k6jDtCLwH$@$BhnxStGW0L-j_ddH*UzU2psr(Hh$l$@$lI) zi!FDX-T&9W_GK5b)4yANx*!;rZ9J!JiTllV`Z|@AHl(HoA09T0K9)Z{S?<6rebwUG z@AM!3pA_UvjW1=Q=WOFum3=e=yTYNbu|j8H>-B$xjs}cVI=Wr~S66^} z6UC?LEv$XzmnP{gDGhb(Sh8|QY;1{tBnNxcvE`-7QO(bo7h@xBCdzBQc&9RiXI|Xx zf7#>T)+WOi3~C4@<&TwGd;Ozma+lk&al5gT@}mYa9)AN(KtKEyP6jMY#d?zG5(_nI z0$~plMFt*QVS1PM9(Kri-@@d!F0220QavQ9+hka#8c?WN?Ta=tF$Jn@OuPoW)!R7V9kk|AOQBvI)tMK>DjwKRY z1r&}}d5#q=OPnV#s^ri%Tdbr0bd1d`&BmBEHP8aqvpy}yEwQ+_R9nnhrc^o0B!?)y zfr->-9sQ$`omeJO>$k1MKROOb6mcaGW|@j6zFf?M@)PCa!l!^w=Nny|IgWF;pt7Kn7a8`d?-N#WNSnbbexjXv?uOo-1 z4*l!3S6tperBhA@aj$2Ym%E_^yP%E-D3!0`B}|N@}e`I$L-F#G}d=PZg3hG zoj%I@vOKPtp5Xr?R~C~P&w#ohke+6V%o33vL^9fW7UTEhJ34FD;MkgHa{OPonTAfv z$yydy^RRwv4=N{EW5}JIkUFj>Q>|S0*43uk9QD6b@7x;U4UA**3RCq4mZzDGH>*h| z(|?0CJ&p%4-~%~3%=OpH^Z?U%8957N2>GQs6-;2bL!$Z(WrH5|ckXq41z&8u|LQo45wJ_b*ZA7qLK2 z^kVaGmiY6<_NR*N=Zo!gQWu+)^S+ISABldmDa4pjRwM$IX-Y$?0*ug63HrfEKiNO?uE%;mYx?wc+I#zUdRLsG6TP zzr%(i>e!W^uaW$alJ2Gc^gmC!yXW|Kdd7w3nT@I3(ffF3b<+j z<^hbU`BW8*U!9Lfh(^Y6=bZDuLO=EOueR1m0`r%Ze4UpxRYzd9Vbq^_6Y=yQ* z0at;9_8v6^UlZXh5ho$pRneXR$QSt>5-c1YgZ4MhXK{?m_k9rA0uR`i!%m!juc5(fijKbv!a&mZG{ z3Det{dRI?yWM;trtg!O=j8QPSv))=tZGqTa-lFXTl{m+Q_yIUtMFo=1>#zYL+#_5&_rv)vKASv&*r-|^}pa16DH4qluL!~?F4Fqos!j80*c zZ<71aR$DANT`#k6!a!`h^O=~7LVQFk*WZMK1M&AF&Cf|txnH5X8Jk7k)o}yw!L6K` zV0A$hyTY;R8eGx|sBJ0Dd|pLxE4NB1jVRE{RMlr&r34I+(eA^TzbCn`e@~+sYq?V! zKc)oCO717QJvSn^{lo^_+OL4C8eo1wwa}Ez;3Uw0*n?tOpJK;vGzA6IqmRO1{>E!f zO<=^TOLm(rX06@IuC@Ebh8<@GzR(K%AZP8(DC4Q5r z4+HVjp~X+37YcfspsBB<2Tt{+)|n(RgZy~jiKnuTA+SZq--8F$y8ChTX=SXHtHSiQ zM50V0;S-7WCD0lTa+&a)u(u{4KS7 z_)DT9f zKl!YxVmwS8EFTEqQHT$=+|O%0664-BdMxt;Y5kwAP3!VhkX z;<(Vy^s_EUBOdm9yX(G>T6U@@IIgyC$4Fkn2*w?}fR5+CJi!ZkdV)DUnV5Kp_D*fiw5HH1 zX$YTTE3d6-6MwS$znH~NzEOerr37=RF>!?yFKm#HmL*C{Vf!lu)=~dQFoF1QX$m~S z3!VP{YvJ-IUCUo}(P&oEN}M&1H!t$|lU|0(-`}SwE)$AO`l&nYe+Mo7PtsB|$sN3s zLu1CGvCWl_O#n%hW%3}OcpJo<4a2OsCVfipH6rT&ByZ>+P@3giP5ytWZkAd1Avs1# zPHid4H5Ws})oEPzf4&aX{X{tE*MlQh5ulAv9oFrQb^8yy>-NU*p_aOTB^rm_#%9rQ z{Tzs<3&gJPO8q&M)wsP$JI_T;4p2B3~sTYMiFR5%G$P3s9L3WwV zozJHezhHfvX}oU$PsB2sLe{r}3b>}W$U0S-xqZBZEqau3%sL5QYSR`4I#&H&a4b2> zr0!ybm}ijgW7G4OOw#i*WsmfHiCg5YN<&YuT_9}x)*O$mOxSL**d7bB$sRh`Y|~*I z&z1&FsFBVzPz3GIZUeNSr5FJ!;jv9!Kss?#7?3{Y|<4xBPGCzVk^z6$ z<_o;^{QUc^OQ575pDks9KU0&vYV<=pEfY)r{WLCJ%_~-^S$jWA?TqhM&?IE4?OeC< zE|Z9~r8g^uwb|Ik#;x4K?Rg!RZk?;{nvr`%V!a*mcxC^CDB%opPK>df%vEc=T%2IP znWD@s3fB6ozE0ud_+?-<$*jh&S;L*6$#$ve%PfI-zsJJwo;=6sZEByhxrew~1By>( zgv;d3EGSDF^Pd&NG(ROHC7S*t-d;ql#$kyO+X%gDvbXuCNvA(1g-^Tjwm-8kb436o~H>>aU(F#)0 zN@bBIE~mKitxH_k1z&pX{S`CBGnFm!Xz{t03oJfonMf|Mkma^mmWxXqsk>Qn+eID$ zFHZUqe^kEgb+I&2rOE@xz+H~tm~>q*!$+W~b9K5KKVLcf<%dA!TOP1~{})C4sszQl ziH=>G?9o3_>@tsz-9#NbVzr-GnG%!Fbquyur<->^K{f7I`R!9i8H;~l^H(`wp2G!QLd{b9QV!fRhm^)TY7VniQj}sXZ zL(z=C4CfP~b-I5Cxr>6RekfN`TuF5yXI&tVm$=((*#sOvB7%H}MgFjmkB3~2bO$p2 zW?}yz*kZ8FS9^oC#&(XZ)5Yxb{WBfKB;J#{f-0R;@LeD@d>z!KvF}Lg3T3;oW24L& zHhvMUraNT5p{sfSn+$#IpQQy*Y z4{Bt!7GwSGuH4!AbQn~F$4*vJg}*7!zn`>xN?0i5Wq^6#RfwqFb7XzqJHwi*0Ks?U9#Z1b|5kO*HZMu+H7DEIppH%dSh2uJ;I zRFE974qVk$+L}bG8zSas#$Kr!u=*bq4V6Gd@2rCuYTecavIR6?|6qVr)M5jHDMZr} zcNsIa2+R*>v=cFp(<$T-pu{UMh89_B7CM1VOTt+~k8$o4rPJq;X{IR3DJY}=H4=vC zGY-|(OaN0W7-?2Uz%6^w787A_U_2UYjYa;naQN7n&768n&_9b21vBo?Q=v}X8E#3R zC##$6A~_I$KG-Lc;SW~__dspdQY$rmEM{??Wc~6~?n_t=k<^BDqdNG`#WIQ{6=&DV zIP>=YGAmHG?*8zh)AitkOko_f7lUy6-mok-TI6%Z z%4EWidku?vx()s%!OL;q=6klZ>|=|?+~oeR`T6dZpGb0Bt{zLk=BX6M3qq;qr`L%B zH(@<32H>uHAGLmH-U5<|S#cKO2Cg3Xmt-cV1E&o z$0bs9I4f~m8Nv6Iahn?#X--RgT3hj_2F6X56XBw$2H$*zX`H0G*~#d`FwLP zb0f_cy8|`(fvaN7k=O(>UP1k2I~lfEMcJyhloSm8<@IJw}`-A}v*P(t*AxrS#Rv z8^u_#c^;n+@S!`Sx?|7FePXlcS>3UxqYy8BvU(8oc6U~f<7%>7l%S)!cIU;fiIDP~ zNI6|g5dq`1fNaN2%v?PBZ$1v5GzkVS1e>AwD!OwySdWpoWr5-EyJf^8u9f22;opzV z{^>>v_zzORA0%}V1F*W!sS6`U-`+tD2klSw;lQS^mnh5|QB(faswrng%;(7|6E;>m z^O%z5l1dc(xKq@s_RtI_M&|9l(;5soKdJ$n&^qv8A1Uk_RhDd6=#hS1o-?8^q?~(PN4C zaONUzhcX7@XR{dun3=4@GbK_FviULp2izF-n6R7Gx2g~g?}#3i_*D;*UZU*dicXrr zyGo;E4GE`Zcq2EE{+{fJcv_0aFnF8kPPj^X6G5{1R7)k#qBEA#?BA@FrQSq)GcaI( zpT8g|xY!+r^8{?Sy+9DC%K0#|;%0Wbd# zZBIkgC$9s`gzLwo6%*=*7E;lI8C}i0-A-6wh9Xz=(#>j=3BhI#RyD9XGqB3VtY;u& zk7zI8YJ%AG&^2IfuX`%*KQ*|hblbB85 z`wVXGA>^+o7?bbu+Z)B{*qHL1c-WuiZ%#0dT@CRMC`1?Hv?0+qkkg`vM114E_Vk=$ z#2I~~N%8`dyLz}#I{s5o!Kod8_9wlIYlBl*>{}JfURaWLBhDLrjbh2}?&-5Lko2gq zcoKj1+aJKieIPe$(~7qLMHmC5#(svl{PuGIJM2#WN)A&lTsR$f^@7U2Oho(bc@JI;PB?RngEPlMsT4H=0&}S3f!Y)}QX~Z*NNymE$7Rs1 zN*A3_?v0|tNb>~jM<5BrU(b*(khF@w8i{`(V=W%AEf%)T6|fcl zAV-zW)7DC0_T|buey##ZjS6JUQ@}L_U=FxK(cNjG(gby76Z3`ZM8llF7sL}Hm(^k! zZ)C_l2Y9p-54R|dmM)vT?azWS-UrW7-v0ua^CZEH0jO<~WO*x-xeCB=3yf^#ef(j? z`-H`Nzwq{kH_Ydy!vNm}7LeY&3X^u0VU(=MBNq0rtVm;^lqIudR}x*8#Y)O2zsVI#_0)E^VzJc;ykRsvwC@0Hbrp`oGPlj zxA3s~4xi~z?JV7JhGR_1dHq}+`Eza|h;gyjgdmEGlLpZJ>~j9HYI^-DUZssbt)^9B zpU~8x$TW#}S4O)vF|6b}ERpYv zUuKKQv*56XkLhiPk6Pk0kQ0%6h3gu)cGySalunF!g-n13GH$adRtbd-HJMK{a#5`n zd=-NIgD54KF#@;MgMD0r4`vK+L2MAj4!a$M{BTBTXE^qs=O~4o4cfeNA=KD0vn)@X zE#zt^u6@hd64m%JNU;Ce3S=BqNY}pr=Fl@mhSk1AbQ`e`SqYZ5D5B>mQ_+dyBb!uQ z_X_`D8lb?<${-=JL+kxkkNP~am@u$El7$*sPS;uL%TRY-b5yG z8l7YH@*Okz2wPW2{Z%wZ^emTsF4IhG7m~|UgUQ>~d|lHl7|hO+M^u8+?eJYkPidh2 z;!HMS7Jz8)7+{~l%aw68e8PD$zH$^pC@;V*JqX7@$Kp#s#HT>UXk&4<`1Z5poFZ~y zJVP^@oemP>&aRVmx0wLut~P?OK(>H$IhbP)=iedWnk7>9}Btx zDk8?fjJjc;`ZR`rv&H+WkL^4x@w4U;9bW}EmRQ|GK*s9|xMl;)TB&UU_6s54?qss{ zl(^JDQWqlkm_#@0wVHt6x^5vlsUJk5s~?A|-F^1M*Q!2UgX}9*)K>P?lv&xsU2M#v z2a>MluPTLB_gZ~^N0cdFT*+=Tq{@^}U~yxh$MtwOVoL2sx1YYhHAyAYNP42u^(SPS zpA!({kS@|g%4{h{H5Z_fZ06tC5|L=FxYt2V(J2$AdoPy+$8Qi6y&3_=YHkM zoTs@0+0EGFabB7N8F27{Vp(PJ_Gw~6n0&UlLgW@uVbWlD zXd1GmX#i%5CA$4zG)>0g*yKs>0>9Jy3Gq9AJW7ZEA8&>z-`HN zRFFhBg{2(XYBQ3X(q-~C&7AqROuBAWaWP=a>GP>nq;RHsl`V;UZ!hK+I_z?6dV}7O z)BAW!m_2ub_WJoe660th%qAgr_LZ>Xwu`ih{j6m`x7=*ZCRZ73d9oOmF00MS`uyr@ z$EM3;N>={Fkny8HG~B7uo(9Im;p{5ajqD_Poq0L`X1`f?z{#~xIc5&m_zzUcA7tJa z`T|v~lH;p{-`&lgqE-9kg@h4ISH~*Zf7-mlv5L9LP?PMmmkoX+k+D2)cTsX?U0HHA z^M-V2$!`01XNV~>B=s=E9k=WQwIh(Fvt_S)1GAF7T*E;&^n=!BB}>vevS}Dn|JP;5 zi*HGpWm0xFVsS*yT(p@3QPYZSnDxj8!WZ)bPpQw89$kua{cq;7m(b&X*$ga4G1n%q zBl>IzRP}&-iSJ@+dHUvEWqNewzH9JhZ;E5p<5(S6@_ZKT$Qa=gciqdFO^Tc&*y25M>?nC(R?B2hgu10EP_NwpUw~r6M{4)?!Yo7 zZW`Zx07*cn3*a&jYeep{_-u|o*jfB*r!#%q$R-V0rm1u7;I*COHywyC-vj4`Uc~F% z@x=u)tG)8wUdA-PQ9`!^n(t$#!m;XISaTekWY?>9OZs;m$a)=x-N@$`d*8a_XImfGq2~C43Ii#1El5%Y8CbURV9Sx z0wM9wz!b1|MF?z7!8|($uX;Qvk}L_2X$d7F;RxM`rcV&boom9Ev3E6j+2q(5znE8p zLu8JPuNhzG`ajXzt%BL|@iroGuCPA=J9()%*9&K(W8+J3z2n%JG+YFH?cth9w`%b$ zwgX_zI$=vnQfw8%wp+0U$B<}y6zHI*9s3h5(46Y?kOcV;;T;Drs(LR;QaKoAOI160 zM^#+UsZ?df)(Y}!VM~PVsCJ0u&bF6M%_^3BA=lVC!=6MW=JOph0pT7ribDDEe<$rU z*DvBl#s885u7?2TeFYLs(w_+u>CS`p5n!FZ-U0jkRk}n3I!D1&sYJMz2-DWN${ytV zZ7xmKyhmEK#5UzNc2Gl!W20+dXSxE>u3=EBqZ@ph9dyPHh0bs)w0wh3Zi%qw7J?a{ z3=iLjSG$0){97y!hK0e5H}FHblZc6`*v%xCre&1TL)1Y98r#}*%b}}84qXi{k{Ev; z%d`q#U9(ri>#f_F&A?-UID_$L0KyBZ_YgAzxDH_U5!uqYfXk)0_CDLZle21g`oHe5 z`Oup^xAUc@oUi>EQJ@AL*x;-&tb0D*x?Qsp==sW`>O!%LC;46PpGK=1YVXTb(O*7D z``LZxS_mgQ%9eGh3$fau5Y1e%cMm)i7n`E>+dn&1Cw_|x>!7_J|0tg$khF_Pu6niR z6cy=bg~hy|y14mMJ#CY*14>f&Fu?qQjBI|RO?`aKoV3-+x=<8In-VL#Gjh#WFXffy zDc0OW1rN?qf3}@$VQ4wOgc^vQLbNd>#r%MbBw8jOT_dy9#N+vZ<^skUU2&M_tRf=! zF~J#3>MQ!REE@@u63Ej zbX}p4)ck>97fP`HetVjO5we0AwUBX5ibV9uIhMS4h?um!$dg%XEzc|RIOiquP6;F( zTnSOoe!7y{eODWqqgrLo*D~)tuFP*4Lzv&r3(LI2lDXwhiPBLr+qKF(P094thU4g{ z4=CwYy6+O1cUdwQ1(L>EGAp#q=885kT?4UB{nHqUwfNbZhrx_%S_y6w0;Xyr^CFmW zWh=o|LO=Avwo3dF`)htUV4tDFzToJvLx|N$eHBVE9Qnq0OZaRuwiGx=!k=S>PcOMg z{raO)v9(pw8ZGIp<4Q^rNlC4eIvy?Q##Tw^Yf0Zx5L)7NMmSC{WFYAUZSUU*Nn|FK zwu(7KS&^iDeq1s2BBox8*?+VcSF4zZwV02OE5;>aTw2UWM~jJX6;rCkymMSJ2h$OA zP#2IrM~nHGKy-ecqs8n#u9%G?W}_DK%F$x})+*-RnU-$09aqc(5wk#x*`i3K#_UZp zrJ0Ic-;;`(8auL=+$KM6LzIsCe8Oy6_tQ~@=DJpbu|go_k`4 zwTZuG-)EtEhz$^`FK%6Q!Hsu=psoI!=po~;A+~&}-B-_GNvc&3uNit*ex61xp{^VJ z#{Wj!?|;`Pr{X7v`{TEDq{UzL9Bs>t0Vu=a;p8K0pSk`6G`EKb%eHRJ?=c%c^NdRg zBoM#3g{56w{gtiB+&0(&VCBePuV|#t_*#v462&t-4)P##uO}KFAP#VSc zL+fR{eL_PsbMIx5M6{#dV0_~CEo>3B5XsDIT_e+VfnzVGkrksFxC*C|FD^)Nim zE`U7$znMR=G&O8RZIrEsuh?%>f}1wOw8LIS(DL)bDg7$0@;pfzsAgL%8;0-4w#_?GGch1Vvtn6tA~kuz zh3HX{b0!|cZyxo_atcMx^cFdB$Z39b)pN@_OIRXJW?A?QR{#C&DFSt_M*ucQy~`h{IT?x&K>Uf*AvT441vp7^c+`_EHlNF8> zqY5t+z8jZQxq3R7J3p{hEZoJkThP!wdzN6KY8P~XY<5YV_o;`QdQa^(xxm=>~2bLuFLv|tK*Kfv^&f3G;85% zs=-ArHNB$Y4q*%0SEizT?%Iw)v+Qj2+h4%dbf&~4kn|;PFJB2Xy@9A^_GP*5Jr4u< z+hW9dgu?IICWXVF@u&hx_bL#-4zR`l{Uc0G<)2T6`C?ao&+Z1Sy&Sc**nDTzxxRLZWH#`{7&ToS zkDg9ix=-qy#5B6%gZwk%UHOp%nZw+0yTd+h~)%TmD077kH;)Kr-W^#{(H$2 zcBwnAy8{PaBZD&xnmjL`QqTLq<2U>4scSIgF!I^PuHA=`DpSzTW3Z`i|L1JHJV1h& zL*DD~T_~3$u#$F$x)$5BYM-M%hY+}*devsfs^K{Od-$RTQ`y;EcVJyHf{Q89x%lCV zajf!NE+!Hm$3LOQ&vd0$g2A^kvZ{nNBve9q}{nA)(S{5 z|CtwN<~x(V)L_3s^1a<;z9-fz7v=-#GCl73=_$&kMfLp0H+df&lTJVDb>=ACld{e&@@L*X$x;7up^PJsiLX7{2)& z)q1e=dFV9rI3!OB$$ChdD0nso=p&nClQ>fr^m?eI8hL>=+1Nvvoe3{B7fm zuu9O9oJtWjQ$($`m{MU<5$t?Ev4T8~Q+jP8=n|GxVOaSIr`be00HXyN>Vy0yt=1?I#fwa)>FI|t+BL+ELJj(|cvore-~rk>Ij-W}2K zJ|eu*SC)KRHLo2uYUw!Ja;DKrPDCZDQ;4{9=D6y6;OGDF(1)0Py5y}2)ZOP>3Dx+S z9$m7>_>QuW?Ek7yBTCl_4@Y{U1e`^{s6&iAy-#CA&V{K`h3Yhk-pk~G3g7?1p$`z7 z$Co7tD!I>3VGUsf38Eu9F@4@JK+L;8N z*JrcRX$09rLUt=;s3Ohgo2)G_9m{J+Uj)lbSF;&Za}p1yW8;^>oKAHVBsp~!Es+Yw zwd=FP?LU$uS1z=e#xxO}jo=*Pi`=>$iFs;Gr+ya`X6`^mECpFQPph7#TfoOSQ*6si zTr4H6<8Pd!{(H25i+fx8k{`JEK*PnBtFxp2T3qmF3x5&S0sdWU*15Th#J`K0OI0ab zB(lMAcK`Qvo1+}Ln;Q?y#*XCRMXfY!%nrsZ59Zt1^x^Poid3uO_y)07#gRZXt%@Vf za#3+iwp<)ixx#Wex%$9zWjj_$Clihpj(P(Ps%-N}8EQwaouwA>+p#PjG@LoAZA!xf_o}!zG11Ld{>$u`u7JU2VEqb27L7Z%*NA zwry5`l2vUP|0#@j3FFKN#>l)Sy6qIVife=LhmEUNm`H5Z6JYl|dM%UUM*64{tZs%}G659? zfa4HcB3DmX1c2Sfu1KR43A0*mCYWK}LlOF!&QBo2RKRrvU{1}KB^Mgz2qRIuw_Xt6 zNAb1x(r&d_AGBDX5zoi*Y??~9O8AqHRjpr$d_rVGBnm}!$p%LJ5vJT$ZL@{eE415% zHbTXzOLAa_-1aw9pQ=azx1pOAFpA!*@Z~zjK zw&t}#=x-AGtXBD{Mx)Z_F-g2qsEdVKzLo1gto90F0crjN?EhNj`W_@Tcas|j3doc$ zgNx}A-06@>^F36Wl2oahr8S_jGPKsiC9I2tVGxEiDJ|w6_C5R~z8_B{9IK;1%eCr- zBfQQc*ynMu{z@a~izCRirb`dWq``ZVx50j$RE1U87s4C#i@%%(<|{;eXu9`Uf` zS^bn?Ouq<%S|KQepy>(HCG&c<5z`FEUc+JDn;X93q0V&)%(i7&YEL#d^{f3gtTTaS zaV0g@oS7#g?fn#DWUARL?+nAUdh`Uf{6*@^MDb&6mT10=V78b2@B=dW?XVxwE}1l9 zLyvW@1nceG#efgPEz$o{&QZ6zrLw2G2USyeg^D4*#AqbZ zw4qWjL?y3H|+4{E*?mct%lq19})stnY|wGb^wMUN9| zRb;41gxdUfa{#G7TA^GB_6>*VEwxf8JR~<&>+3D^HVIqQlgo;vV>Om$vrcAF`^QNt z-D-i6H>bQkO=rZ`oGm+Kn$OD(jHLEDOtE3ho$Ni}C`^A^NQMt=Gc98ag5s5Zdh)Go zFMIXq*~m1O>@aKmD8{kL(OtQrcpq^F7ATPQbheuNRUr0OD?Ve7nV4GU;&*D*a~1=A*v>b4ur z?fBzg!g)@PYVghXysVu*?!r6m;P#lB=7ZZ~Yu*iHdJA8cwC5RLjaU-vdu7GTi6#Ei zI0whhMW+-cwA$`yt-eLgi_91mw%31HYDRWA#%)q&*L*t~WmZ~>+7`*BlfRQ1IH`e? z8aSzelNvawfs-0IsezLkIH`e?8aSzelNvawf&Wi6z!q(hKVD7{0!J~YupF3e3oReV zbl#Zas;c7Z!qg#|eTF-8%L^-bE%Z6dYZlHcu5wnCI4cXP3KkaoimR%fsVPN$WLKE_ zS$xBt^9qWbRrBXL3oFVhsvxQ9r~bDPM#`UGQtK@6`Kp{LMb4V?%gZYkmmecf~k)xC@O|ibA-bW)1QcLaY3oCw0yp^gxFP<7CBQE6gf)@O3R9i zhC5TLJK72tl$I4aN#DZKa>6Te7S$9xeHG5?()r~DWv$^=`+Q4UmEkNaE}!pP0AYo* ztfG8=N1KmGmR?yr+)2a;O1(+Ah)OA{ZHcxm9PiTdMFnNV$I{znu9TvF&PtcWC{n+v zMa3lrHDx|B=LE_l^U&pjg7PAgg~f_8 ztu`fX@C@gwEBa>5unu&8*^ z!19{1GNN2lT`-^2r&K#<_Ae-1G#gOpEG#Rit`=tr`Y-p1Yrb=SaRmldwM5>^o#j}U zxGJ0_WXkN0&X(WI{!^X4QXfdXeXY*L&c&tWMHP!ni}0A)AMe77g$q%Db7n!+{A%Zb z0Rv{Y$obzKpZ;aeveNQm=S(q|IW5sasf7jQ=lYz*6ssaD_NLN_=Bc*`&(i@_fonaaFlCTS`Rn<;tQ9%F5;y6ke_bS;kC0%n**;37U9- zb4*1I_FZ1#b5`KtEG@6B@j1!2(!$~alGih)6#H@~OfM*_DXu;alN3CQhdf(QQRKvG zYlL&gn5tsROYWHCFjdU+6_kd^E-o*Uv`z_AOsw#gmMn1=FDfqgDZ0Xz^r4Q5La8#WB6V&`wHWijn(C^7;!!rR zn!-^$u(GsvVL@f}z-r%s%JTU(-@-~)a%wfXa&Gm&0e$z~e9gdt^UrlIby7|B2iZ~F z^Q($0o&5`PDxBx0rlv0N`6`#npX#OaD=HThS1p}iOzly+v;;g4=u%4Tz=2B_FJ3%r zK%bcf{jYTQza*`H)_~c4XAYk|DgrSuJGpntsN`O*IsKQ-?%QW+YU;v*`Q?=0S)*!w zu9~Xy;q!c@3x-F?fJ&lNQ(k%nKu7#iLK-ko;xv5Lz*z%TxRQ)MBb>Qor?^HqXF7X2 z`(NoyCb`bp&fdM9#f1whtk9I@q*IA1P=PmloIhFvR|a)xL_#dCno3>1nd@ zWy+F;^D4@!ofC^O2(f(Ugo^Tt;pA3vnN+N17lGz+R-zN(ty;RQ9miUrg} z>P-d8pM`LhS6p5iA?Uvl60V)4RV$fq8Isi9mNhP}vf2{r^okmv6eOv$Y}Bu#s%T5KfpM3?L)F1DlPWh-)}`E}R1cRXMHPKjF-fV=CDsaDyr^{A;AktU zRU#V6(uzV~nR9CHq%l**Or3gh8^8I*zRJZlrMfv?j8#eHwxptFR7cwsZ%$sGZOo*+ zX%i++vE}7X%$Z`FnlpLA7Dl?g=@zX;X40+q{!-iBD^yq~@_IdfH-XSS29? zE2}CB2c{GaEL>b<8$cP>=?&Kt^HB2T*dEPrZE@kEO2uTQ#Fi>8RiBoIFx&voE2u6W zn%=Pm-_k%*0Z7)S6w2RO#}X7)mpX0TW~P*mNGY9cQ}vK!1~I^Pswx&bs}~fPmFetO z^;a9ci7^#BF*te))O_TgMH=7Hwr}-~JU8+Dj^_s3zO`$3{$Sg;uFkgameshy-{9xD zmM6&bTifP`ZJYmw>u#QaZQsr7c;LJlikolddCIo$x+i#^#JvJ2?@!~tjR&5a|H1PB z&o#Dve%}4}*j|Cmf0u3ZUu>H<*{aJZd^TysoyzGfs-V4)W@TZ4uW&&}+v4KV`3p3K zQRq-uQ?UZFw9SLr5TG}!N1}(Eqbx$6bGj$5Dxjd6Bn@~#9tl_pv zs+87-i>8B`1l1N+l$Vswr>UGXBWJ?s9FOgy33EI-c{x*a=2(3&+nk9xQ|EwHB`5rn zJ7&_vV=*nX`MDn3w5ek==S-P8Id|eXTXkiHFHc%Z8eCgtRdI1qsn1QXymVfTuejPa zMs-wFJ`|N!SC$nl=}3VZpz1Umc^Q$Uq%EdF{1us!{i&w;p zh^(oquBa-RF9O3(&{Z_Bm9@eZc7nEIL^q;Rf{J_-&&6V=%0s&Zxu6B9T`AQA zQmWCTGi^ZTfQ*i|l(HIIxPvWrbOC<`jTr0&$b(gNn^cR#4V0$}_h_IzKHMIlJd1FT z0rJeu7%^CEGDH64@K`c4#^M~$gLrYKi}z5Abf~xoTkiBS+;y>v!p38Zlo3xOpoTq}PlIIGZYMvUN#XL)3A|fOSFvJ4s7Ra!`PzwyR zK&Ax-lWt+KK)MAoEHKmp!z_?#fx#$87%Y%(feZ@_wZJe7WLjXbXb=Vqq+1}v0z)k@ z%mSGLF0plsw{=^NE5p*vPz5H5Qb?Z#GAuCE0z)j24w!VIMP`8v3kqqn?hYEJsfLZP zsD^2(OhuKcsWLTHrl!i&R9T8DOH*ZOsw_>FWl;^*b*M!(IL)F0T6USHsiZK>983Z= zv@CIurXtT2UjNlpVS62-sfK7OW&MNGHC4I}FmFFY-iZ)s);Np^QBS0Ga;hEAnR?g1%_B4-2xdF7;1rG7Rax$)s`-l7GO?IWf6m= zIrN{4s~FVTdJQTXoHlrntyf{;;PgR7wq9A8S;Gbu*m@NW%gPdbdPZhOW~Qyzyg@?; zXAZUX8k(6^G!*}W%&e@;bm#|X4jBe4nU|h51UN5q-n_xkl@!b?8eC%Ql{us!BMbhb zA(=z7=J8%!m^Q4?)~k445rnp08R{o09h@=LYHqsC95uAi$_Kh>3v6RmpH${l$|~q( zc?+sa=G9zzrD{AmW_Y~c@5b=`T6ZWUF#Ig!eL2rRG`<-)4S#urChU%cVctkw*u6V~ zKaBft;qk(ieO#~d%p^|RG&~Kryr1al`wM=;{&9q0psl4;FazBlz%hwBP?t?_Jmf7UTe( zy&@F)qlV(%f;;jN+<*GKQ636?!gDnJgWwvEgBQAY2rntZFFC>;mUDgt?!Jh)hW(ER zYv5T9?KeQ-2|tmvw?@c~#E0FHVf_;s^1KGm!h*I>7`Km;?|1NA&+}r$vkCXP@W>;) zVfrwPls8?|WC4%B7wLD>{eM;;$ICCtlO;OO#JwuQeZ2g7`d9qJJhw&A2~YUh!+k*$ z=l!31{(w#XljlR8TZz{eo`3UnAx;nTyus6c|M2kkF3KOsMnD|M$?{x!d6Hf=o$6U!HWH^Y!BePUew&s?rGKzj-c$XE9Gb&yAY@4&ePf zkLmYclD8e2{r>^o573-V+~(0PUCnbZPXTEQ@cffU(p*bAZ|B*~^KYKb=x;T;GkLo3 zF3&XbGVIO-KPSRZ@aJm($_TnJy+8>=!WDNK@CN84E)s5go`3SboA)r!HstRC_a5;N z;{*;QE!Xgf`$k~6AI3?n|K@i-#G}$Ph7QZj8a`sAi#H|7h>DJ}w`(8Up<}1G_ykAd zDW{&+IjPI(UC*#&pV_T@kF(Bp_B^Loa!T)WQ~UHiuV4QG1Jec#=A`}q1wSm^CJU}1 z4w71zO(q^URx1R{Sys7HyJ5xN1BX}G8ulKLcUEre2e>WQfoCn4nyueQDVTk|^}Zro zL9bTiH~ z0>=Hu2;+~&lSaJJ!?ju#I=uU7h{i!iHVMhiZNnrG3{g9#oA+IVxwcDVvX3CL?b&YJ38BlYo8d?IkvOW zIlgm;&h0yQ>KxU%UFU?(ZIt%^;ET~Mdc;3Ca>(T?w!I0IU{289bw((Z3Vay23%^^> z-Q8#hfu8P+F@Y}ucLGQBpzZ`t0v-U?0%JJf{4TI7@G!6+@Hb~65BLRe zDsbi5$OB&73wc0C3T-2BSa0M2uL7o0zib0~fSt|_g(`vWRK`fadx5*ezfUL>M;(*V zm--&~FJKX{(|LTk1lSjNGw^2M2H<)9;0Im;+y#6e_#^Ni{X?Pr4y^ePARJ&q8g#(n zgJ_?CtAU+ad;QB`(gAGGk(O(LwqeKxJ_u|8?ghRFd}KKB?}U7y2bee_6q*Yh16&F; zMutM`fC(Jl=1geVAg2#1iTA)E$~6$UBIF-)CIu1f$sr70e%Z~ zc&MG@ZMLeh^cR3v0xN-QfNOwjfp-CYd z3H}c1d(Qr>0j{GjvjJE{ALamX>gD7!%|LP)<8RWct;0oY!;LX6hfE$1tfKLG% zfxCdO08QYJz?f68BgR18fwuwEftQq{2jKmcq0rsH?Y>ZGFL2{x^8Zxwfg3(jfnArN zH{fVs8SuF)Ne8gqRfGqe2HXSO0Q?qs+EVyW!`^@+fu}Dc{_oHHrop~heAGJ?Cr0^!&z$f_I$gk6Fwg%ux;A_CCz&r0iK5*80{JYw0 zDfeQhz#o8Rz_T|X54Z!k0a$S#V@Kc;;9kMskDb!}=)4hq0dEJs2t1!Q^#IThj62h2 z+XPGoCeg-b0xtqi1^)Rl^Z;!CIC=oidjh?6v)TR$Oao4({hJHC0_X!i23!MdPkVP8 z@VVy+2YCJq)EnKgN1z8d`X$l@lpktUKjX^DHlsGt=oZ&L_6DPUqTq#OPiNXvi$wiB zK0P)Xrte^tSzAKl*o3YZI65tkU11w_=7_#Sl9d?Y_wZCAmnx#=hnd=D@m!e1H8L72 zxJn*BIPsI8m#3a*H#n|iATbGv*GG*`=z3lB=mcjlW^_X8wRU$x+Uj=hgv`43o`lL} z9TPG^xD!$#fDne!39)YK2a&&vXH6H5+5zP!xKDU~0#_~weu6v9bJ6M4SAyUtxH!TW zTpxw8a87V#;0hyf>ENCO*CPVw1-BL4^%1yP;6`-~h2}@#D#85@+)Wy%(hu$w+LS%g zY5BGE&z*O|^h^HkLe}lwL!n23Hg`f|T~yRF9WC|PFk#yP@Iz={QpMkskQn8)eA9WA zFKUdU&5`_+cmyRMu8nplI9JD@?mD|CA+0(gm3Mbo?MkKxzVYx~Abj}=iPLp}sl3j` zZwY>5#SfX+M!~yUWY)zjOXx}r$vnJ757$C_6SPAmZoj67?C2iG@eBc0$;&;+y4uN= zc(~=4$@4k5SHSTpfD@%JJL>a}ZBvM0IU!FaZ~oSkb^^DhS5HFMDDooFt+bm4IuDwk zpm{`Sj!G-4i@LU>(wvoMvdQwNL5iKu^Ak(anjU$`JG6pH_K zI~kX-%Ng~-3F4lKEF1mfbLh8Q|HZ%`tz}Mg2aC$yg#S2b|i8nj&rOyN}kNX z&zBJj(JfHApNdAL{7V142K)lS^K>7Mff&A6E~DJ3k^RfkM!~F z;5G>YzPcz+LUvV{%d(BV(5!h82GVTLgb>U(a*-^Bk#9oBWyZwX5O@mlG(td{;`UAu7!4N=h}jE<`7 zNdKcv*HQHk;^;$`T|ysQ!a2STWJj$&Cd*X2;Dy&YlX04kV@tb`9d%V?BOgV8^z(tlX zDf2OLHrt2b`{TCsdpTBY@yK{vWG@vz=`Su$h!t6x;HS>g{TA?Z;79|X4}LCqRc{~F z$B;e{9R(+?E47u?X_q><9-jU1T=+|6rI4IEs;mfa1H7S2L!oXbuD`RR?>M%ciJpIi z_k(#{rz7FE*1JSA`W8ZyNUD}!bd*ZP`$y)#FT}0%kZoC@$noH}3%{;nf01&W(T>PI zf#^-<8J=REpf7IQCA7&}Z!+)jGWg$U8B&+ejZQHV7K}}(9Gg(T)Ru0 zo`R?6f>21N%&mO8O68mQ?ZIy}ev`yc+NK;UzT)>Sel_?_(SD0`VUqYIVjK_Pce&-4 z7*&!G+Yfgt_z?I7f*%{%?}?fmp{jAx-;*$AKtHUMajT?9!k=dalEWG(XG-8x7YaRxTk<=~GFMf1%);+| z{N5D5$aW!nd4#oE?d%$8e{+4?_S6a6UEps5zd_58b|F8CUb&uk5Sp#foPNWJX)t&0 zxupGqhOUzO&E@Zp;BEvr@jofkHyBY@Q&w{*tCvxnqURd=Z6PwuBRD3uIiP3WiGkw_j;}m-79Nxj!Q@#mylMQkXWvZk1ra$F2>9#tRMdmPC}pRQzi28z6o~35hZ`5xr)E4}iZ^ z@ccy1RB&&A8!ZUrT%_el+gFL-4-&?&+ptH}eDyE1eNxUEkazI*P^egk6*V^@R_aQb zKOe(<_e@>JPt+&g8xws#N|x!=WBSCZ{bN3T`klJ3a8!RTYJ9jOXR}Ftmj~_D(B2ut z3$(`%)1xY4(cMz$KmSYHdDI)geFsj}h0qAy-QZI1)_ob?^LZWvR|syi81%2z1+@8p z>Ubhcf}dY9PaJClyB`XLY6KBkUY${8;YM3@k`CQj8$+SLA4^BO*V?*ET{{=rd!W5g z=ff}5S52$^2)s=AKBFMEm6Lqy|oE;G_mlYT%>>PHNz!22N_= zqy|oE;QzlG*rg_XZMGXU{704yG8kuR_>_hX8gA8ar-mXCJT!yVX!?3@h7Kp-ct?=2W zTiubay(hqjX=XehcKv6t(`Rkzy!!o`kK5wUI_f>_Yvmquy|ET1{QkyK?;joY{_msS z4b?I_@8|3HIE#%52g|_{kNVX*ElJ^Zz_cr^ceW9#pAO!}c0~2d z)c!J0F2AtC1{loK&ejUF~+F$0!o1bRm z+b>r9WJ*$gu`&U~PX{C0HPnx(5cSI(Yr!!7u-+^cj(2u%%U?%B&Cdzuhme&XoQm{k z{k}%?hxB_m9}ejEbI!8l9ntT<3lmuA|LuS0UVZ!s44rF5WvqtNH7wC^k%p@^T&v-F z4IkBTyM}LS_?dOo2SFqu(yUoH5{wqbPY>1T%_S@4cBV8Uc*N<+^*r98h)nXK@Hm#>hLw}ts&>v zt@LX+UBeO$7iqX!!?hZ&*YHsdw`=&OhM#G8P{VdbI(!X#YdBQHu^LX-utdW}8m`uG zt%mD0d{o2j8osIFXBr;VuwAhZU&G!S4%Kk1hSN1H(QuK5t2JD!;d%`p)o{CpZ)*6N zh6golSE9q$u(yUoH5{wqbPY>1T%_S@4cBV8Uc*N<+^*r98h)nXK@Ho@*Wqi}Tf?Cm zj@59whFp82ev33*t>Ib?*K7EwhTAoKQ^U_RJg8y21v-2UduupU!?7Ap*RVvxMH;Tw zaIJ>xHGEXV?HazR;b$5i)UaKt4qwCG8V=QPtcKGyEYWb0hO0GPtKoVLAJuTXhHq;4 znT7{7YIRve$kAJFPS-O_N8;? z7R)OwDlVD7p!BlK%NCYbR9;c_Kid29@VJUA-|CiRNtSKNHeeguAhX&rk}YqTu*sWj zfj6*?#rqgqt?t`WZ;G_EHqlnX1L7W%)RM9 z5IVC-dW@r5(r%%%T$_HM&^i6p%qQs|VmgzRO@CC1_HRh0gM?V?MrAe-gTJ z3ng@^pTAo48!Y`kv*_EHPJT#7_&Adj!^)f7?nw!^+>L&t|%mU+7|=`Tqm`D2IH}uicSe=*z71-(f{0{}ZhAHhr}t zz1V+)BfZf7mm|IC7j>i;x@V=omGu|;8B7mz1%Kb7XDs?wi=O`<=&|EXNjRCh-AdnY zrT=$}ewIbwVbRaE=sPX?`4;^Si+-U+|A9r9{!i?4r$zr~EB##-UHUgk|3iy@iIx6t zi!S|_q`$|aUty)+Wzl7Pko3DP`nRm~Co^6A?>eSS`xkm012;P8^-RCnL6`Qk!$Gg% z^mjYxa$kR+gD&^^4?F1M|MvJOtap^JS+I_P4bu@1V}XQG2H z_Bqf&7yBIMpiBAf`HAQ+bbEfX&azL7C12=bpLq_t*ym^mUF@^iK^OaUI_P4bwGO)2 zXQP8I<+tZoQa+*E^Q-31j3-F{bGjveG}}+?)8n9vd>MblzhajC?fHdGx92B97yH`t z51Ve!KZGv&+4B#ZZqGl=U4yxQp)%R?51Ve!KZGv!wdWr;-JX94UG%r-A2!{df7G%4 zr9Ki?{Rv&_*R$wrt@^X?zihgF|0Q(M-@gB{>Gu8CM$TXA-=3e_bbEd-bg{oZKey@j z{9Ndwzdb+SVCmOq*-z+_zkUBAbdhi0zno&p&sy?@F7oaB1EGt2`~Ki3EMNSi-;ytM zk$;whF7=T;!mO|6S^!H*@-LS@ioY{cmv4MgJQebkYB22VL~v;h>BDcRT2! z|9uvnzDZwxJnW#0{*OE8qW?1vdOK(Gyn`Ok9|9cL)=>KO2 zUG)FdK^Oh2+a)KX@I#h<4Gy}b8tb5oev=$@(QlfAF8a-|=s&geYje;=zat%V(eHQ% zUG!V-po@NMEc(Niej6Qh(eIxebkWaq&_%zrgD(0NEczpse&;yoqTdA$y6AVYgD(1g z(?J*guD9rqTKaw0K^OgQanMD-I~;V;Z?}Uk`aNjTAG7p(!a*1Po^jAczZV>I(eE_} zUG&>y(I2<;d(S}^{XTNgMZZrSbkVP7kw{Ydko-lz(H8v)OTT>`bdfsQK^OfFcF;w? znGU+>H`k&+Y3XN=-~VCJ?eXy`i*AoUKeOm||NgW^xBJ&;EV|vl{oJD4{mU;by4}8? zwdi*H`lUs;{rfqKZu{4-EV^C4&s%hRe)NJxx91-(T6BASf61cTKpIE%pC3 z{ptT;{?hJKoKBt-Wcd1(W2EOWx?gsixz1VTyNK~Y3va*4@Nc&86^wt~!q+l>iG_DD zewBrHGrrBj`xyVOh36Q*)xwL6-(lgK8Q*2$7cqXngzn!deGWxqc`m+*?=ud$N+>3j`FWJ- zKe)P*F7qd$|Hz_?e4#&X(Ph3bzXNnUCGz$6(o5^x+wnhKIW1h5Z~2lXUv8eheD#JI&24jA=d{j7+VbNFT$pjqX8uDzFn>e?|B)YaBg5E{{gpyqI#LWfPDjVD#%nkx|0d>yCI^eKl@`~y@& zXvRL|h-0d2@LfMu(?jGh?MHP~Raf%~1)&j1lJ#F;4(~s{8&J&*%46dAMHJscJd^fW zPw_a#_uq$FZp}kDRZkmt2ZF{?)t^+?)3SxS0i>+{w0ewb$y@2_Gjmm4_Z)Jl{@h&Q z6*(*5fYqv|>ItMnxvIfie<9)rAu^IIQAH~LnIhHIZ)&FMRiITh)zB|aRZZ3OX6>5w zbef_I+^`NJn?~GI1T>-s@e#XgmLaZ2+)2ofMxKKptg7jaD>^IEPiHk+g$N82P}@j~ zU5!|XPT?B~JB_gK6Go@-4+(o3r|SC&qf__^!sx|W)xRW+PT^N^YB+|ps{PA!6o14$ z(5CjUtkqjUYX8=FFX-VBZD6haWS<);qY)Xp_-yuw;{x{wiB_bkb;4;h(t)J4{g42_{ms;;|*I2%Iy9z;^>ZXp`pxkj{!s`^OC z3ehQiIZn0fD8==J(JA~r!nP5%gD^UUcN5k@*iQ+gQ}}0uy-nB)gwZMdTf)vJ>>a}B z6#j^?U*lB$Ibn1P*Q4Yis=DxaifyCVREq7S*x?j=m||@ddy!&CQ;f_SUPdu8M|cgz zwo~j>irq!A7{wl^Sejz5P;7u=?^EnNidEwjz8I&P*CDy~0PWWea}cktJ&-DB#J32a z)_4`-;Q9n9YtI??J;cW~)xK8qC%~gf$KQ_B(aGTcT|*d_9yJ;08x7+SRrS~6M4)!M zMpduV%XO`)r^=w}VgGNSugo;nzDj;D;uX+p->iR3D^O2uex-2Mq7{c<2JiUhy2WF@ zM%+IGy>96ky_QJtB&}OkHx3-5Mw|fwbsY^`z}2Lx*CD9i3g&A?Se4pm4zVn+B0<&l zRrIoPebDer9Tq*14e1W+Lm<>){R02tEcikb8jeOBbvYYMIPj$=>UgT>(ZzxICjn=W zfLhW9z_~~^)JqD>SBNEzQwvzGu3*6zX__XC4UKE88Z&v!p<~9QV-B~fsxik;>fD!L zWJ)@yP@`&?R@XTm6h^U=60!5F=6QL!r*`A*2~O4U%R7X&4`>8q?6ArA@0N(kPv1TCIp5JvIb&8>$YR zd|=ZA^vSFaMvlhuA)ON9DPa?74r)UQ^Dp%>ze1Z&TCT<&8_@wY*REI&qtDew(KGk z&F54kQb3O|cTNOfYENbsL=vg&Kr)jk<11vCsciu<^=0!xGj$?EQt=^noz}-UnDNEp zI9){&(R4C3sFtM?3+6>O;w$Yc(-+4_k13NJWI!lI3ko?#%cNy|mC9y%@daU=D4(IL zLdH+_X1utDq4$lL9L4!(vZ=SLU+U6`YGUC}n4?Y0zM_D(pmn6peqFT4e zSzbP?G7(DdpH)`I%mScs&yNvmvM}~C#nf@qhQ#B;%~3W~DT4}&#ZxM>IGar=*hyDR zS^2$eM%Uqzwl<#8H@BpNLdH9`*UNbMWDJ+le5~(SI7G{WdCe`o%`I!@G`ILc{Mg=1 z0jXLN2p1mJlFX!%84s86g4m{(SPGwLZpr1dffoys*$fD2FW>96L{lkzJv#%gOyC2} zXA7BlGSiEEg1%C6PMFOjr##h7OCpm+x^&uz0&k0#&u6kAtnFNebCB{|(%HC|IyRX} z2FYlu#VdL-m@ycnPjib?7U#^@4pVXpkN=At=F2o#wnH8TTVLpdxzDLR}Sx(y7gM%BED1#m#) z5aDYroMvN$%X?WQ)jC8%YO-2E^JX2_fr{w(zDnNXU{HLU4H1$f?|BiNZYM)(A0_XF z5d02AhSUFU;3VfI)^jB%cm!ccja7Hi%^MCeG|f;6-)-SEFq51^Q^akCb_#!of8yWH z{QD4y;}7^Je6xkW51izj$8z*Hq=3<&OZeB)h~U^_0(IF~k~3MU=Z&6q#~T9Om=gc! zjJf7Ojb{9821K6;j9<$543>W|0WByl)z6=;N!*UsE*KbjwM{ zC5)fQxI9Lt8#Qeox&z0tHmn1+o%zqB`5}&k3DoV(|G>`;|7Fa75A*L~{sRnIJ)rsb zQ|Y2;+3WM)vveTmwAF_?wLX@T&&67T0uq!1(I( z%=HnBf5P}#=NnwwT{X%<@*ibBA{Uw?xL(MgOir$N^G|h-n_b@K+R}%Z&$M{<;XA<-42SD&Qd4JOw z#-C*VMs|=E#-9gHe$u`lB6P5QUSj@Zn4g=C`aSb+V>?K>-er6{ZT`OaYe zcOEo={w@ik^ECftb&;k2B9M@_zeU_H-d{%b6I z7FoWmUlTjfa~hKK-s48jNhVPLoALH13^0-F@j}Ms{aZATp<^rK=Raw#zs~$u0@wav z>3;*`IScsx8h9@`VC$b)}nGO8{^KX2{@ab=%Ao`BT zdCuVan)CBE&iD- z|5AD|iQ_yj*IdS%eq-=sOrVZqd?n)x7+=Ns`HXMFH614*Bt84AdOVf!wHDs3ap-@W zQAGSU!Tc*M{;b9^j?<$?9L=o%0Lzi}dbrdFJq;y&=2>>Q95~ro-Uk})Z9|9+TZl)hha5U>P{FC|RJ%Mj?xjth4?Ob2& z@MAhgV4T8_n2=Mwy!M_+ufGj~=v3zKw)hWc zyvxGrmqpS?*7=HG(f1xnzWjd8-Jd#!c;FEZY3;THfOZho>=^W(n58XvD?6?{Lg|Pzxt^5 zlPdZDkCrn*biKB@HnLLt$2-p9dz)E^Ck;XogwG|m@g!3+n!z=5xD;HNn7 zUX3@Z)t8t|^>;53%`pCPlPT94*6D1V0;5TkH)c>ar&O; zIF6SGw>j`1JMhPWk3~D($7&bPYW_yGoG0@7yCBHu6^ESva^Tfyk4=!@F7td=wgLEX z`XA!JTO9b&4!pyGZ`3$`M4V#mSzvuU#{Z?k;4+^%(;B-5 zNRzMrz6^AFlJP5lY!v)C>-kHEoM}x;HN(!`JP%=ZwTI=5=k_A^Qy)0wj6g>{T)FlG zJ{EuS3#IfMhdTJ@Iq<~}{3VP#!{xhy^R46lP4ew=$eDnCgZx?6=?j0s!N0|U-=OhE zRr{&26h+z$fx(*4p-jSSk790J|OdrJ-`p*yvl=c z{qS=3)p(<-;pZy+xJorU_}d)#(JUu%g~^ozwamf4k@-L3cBH>ugruiA__M&NzWS{B z=eaDWjUT|suyHx#&0CB<`g_ZWUc-3%MFzj!1Ztbc`Jybi#ev`Hz#nqpzjEMvG~TGD zo@+9Ff%Ev>$;!u+>7&`L21&qJukn<-8J{}K_$PZg{L9eBeivU8&v{HDpUm-C&dalR-EW-|YY{9x=r zrp*OD7WYBT)_n(kk9W9wT;#w{bl_139ysvx9r*PcZ&XikeYLXwHvy+{x!M{Z?{dg_ zgyqQkSbCmI$FmOpLou%)JIk6A8H4udeD_zf?@h+p&mD5cjW+E|_U8%z6yU?zd8PwD z-hr=n;0Xsl2%Oq`JKuNHszN$0aPVL6!2jKWKjgq)cHr+i@c-6$qdJ5A_6(z@s(17= zlO1@g1MhU;n`nL*MrC$$h8(PS@b^0Kq65F!f!_d}#z*^p;TFx`sD4*(=E)xGv(q8x z5eNPP%aQ#JxYWlR4*m~;lb;l=`N<`4+Tr~6Gl!h9xMdxVe~QK%)lK&rJ>F-14t4M! z1)TKBS^Bg)_&XeUj|1;_;9qy(*E#SV8gIn!EvCNo_c>9v-Hh+%`Lq63D)65=r2mYi3 zf5m~n=fI)Nuf# za?a)FCwH=(Cm5G~Wzz0maLD;j2mV(FUgPL*_jTaY9C)k78`bf>z^EC&4jm8_5$3Kie&%*xI!N1#qKkdL@cHqBv;8jm_Cjf6QH!#Of1y24m(ej^|Lr%W~zrcZS0X|&5-_`t$>aJ}@ z5t%>V%=nf3JYg#9c{k(F@qGJg#_!iSUz7zuXa47z@i%;9^P+?Q9pL&os#Pz_G5@Cz zJ5hUl^GcIxJLf%8<7J9)bg~1d@2#V$?tPRkWF18y(!6@|13`h_^3!Mo66=@aUh?BIzcXv^}1eOC9{dR>WTW^ zf_W%Pq}L0uIM+|Y2ssLA3A=YD@(JNKhx@R&9m8W%%>c_cF1*Z5tg#=9AI$t5uI!{56#`Dnu zRYb*R3h5LUFe|SgMpHf5j^O37ZNcl$X9rY&(ogmzQ%PiA$fRLuEPRh)-E$G^tvyvN zWUxaap2%V^LJ`u2E`9hHOpu{K#o;}EwAWM7d~g43Rire2E}HjD!jg!nA4?`9y0W6Q z9YHe^kB{`8&c>$-jt%&+DCn_16QaJOg;bz9iC&q3RwV}2i9Saab@JAkjw%4XBio}sKYpiicnid029D|WVYbd%Sc8qD=+MRH!uSH(E2Y-6b7 z0yY<9VuLE3MZxl(Uf-WBqRO(Vcn@3~PLmykgB6o$>>J5Yh*kL5Trfz{q}h;=q^6d~ z9u!g@uA##uwx{%YXd(n^S2MnnS3S7e6eQDLwh*XTA@67N8uH;*p0DdiH=`h#7*yEO zki%MgiUQ12Yw!bDFjnx5(p31KG&rCt;<+gLDbFWrMJ22=pDB&s=@>Gg)lK{6oUMB9JZ zQS6<7(^74EnL<8AHo?A|!LlgIj#dIM*EIw0FUE7QX^dRE7*|F3yC%{$mA)R(`+9V3 zk}I2NEE?4wI6WCwqRj zkdJw*q8YUK{JH>LZ?EczEkVy&rd-6+JAwLoBIuM77~!zjCqjcuF01na!PIBhlDr2$ zUz;pa6~Q8z__BVCVDQEKrV3U2ddj;W6f%+Q)nl3JTJ8lKVSwzwTDUcAIH(3=s_q$yL26~rKY;p z6?%MBe*w+4BepggU|h^BipRNrOpj$66ugBt;!x!xN4T2t8q#dzDscyvfMRrFh((Q4 zs(c({T_h4KVtZ0DqetbEs^r+CYp-3}DAKSrD>qE^`Mjuve2~Dr4K_-3fO7+}_+(lt% zMwd}x9Q0H&l^tGvm^`hwC2}vOH$jpjs%ulvV(OeC7|eQNX4htfs=AcH+40#@4dHOPAPnAC88F(W}()aCLJv$ut zYmqngrd$aaT%bLT94W6d&jh-TOt1!>7dKDwGNTNJXH58L`b*P+Qqr~~wO{C|DA#JF zCm&6w;PGhCb4rXwFPrx0CS@Qtkc^l0bK0V4hva_TFapfkxk@S&L@%O;fU^EhI&bO( zWZZ!TF@Mg>kh;zr8erE9U{k5eQ9F)RHf?lmv^_A=L*sTS*SS<3xSJ>eT3blmxT+Jw z5e=N?2B;4=bu^)%Aw6SqUR}VPC$Ig@8kQpD^Qf&@-zIF%O%9DQaQju!oEg_Dy7HxF zGcR>C>3!kX)|6(uEs zD|NeAm5nD8N$U4uEZn)AlJpDFR447?#@%9h?NMd*Cx)2<74vbbXBa}y8POp1U15-| zoGFzCQ<;C^MkAS{=_iIe+)`DJ{?u$LYykUEN1?|}ni}!`^e$?|OOt*s6~#0a{SN6& zd$aepBJS(sLuOlAz>O*9lrWU`K=uOM<0{Ogv=pj*%*s0T%#fggXo_xCX@H;^M7px8 z1QcY4+>h*)%*KLBB)50t-h>XMqNrV~QEO&|?TFE=hUPPst;XD>VYj_@KC4N^`p{r2 zByK9Zn>Hheu56j1;zleI>G6HGX&Sd4@Q036!S7R;BGcf5E(l#PtSX%=x2pu))vw44 zcLA76CeXjCAlr-CfOZ+QUFzBQnqrahJD125e)-VMiRLemLHp+QZC%&N*(^^|Nm5rT z5jV4JJ>`M(`I%vSvll}l)#dC6^(K0xF^VrjX_B~;M0E#A-_$GhF7#ZbqBs$+n5^vF zFjb&ONu_RsovtEP*(8dz-GIjcu}vN5!OcAj-;(eRLLT-vqq3QdEQNd1lZ!HE#k@m% zdgm%V1o1=@=0s!TetxLSMwQ?R7^X`YQxaJp-lHcgk5Yr>9I6O44I1nvy5bt4GL2ca`h#hD=+{a;kq-MLrY9FU)v8|) zfLA=U=Hy0i2-0r_X~Cm311(zI*+TC^XeIVOy#GP9#s@RV!i1QQX$o$+eR{@Geh~o; zV`G#Oa4eU?ivzTsS`lsS#Z7fRD`SKCAC{TfIJh)JpGLC|#MP=9#NWA#qAY zc|m~I3$N6`+Yca~vH?QRDO%CBsaAU31l`QE;sI@;7wKu*3EW)j_m&8$2NT$Sq3H39 zDKKX_496;6=W*kMM&j@NH2WV$up>>cOyr-r)I?tAE8!GNqWKke2s{{3ER~UM7iuA= zm#}?^RmbFaQGsbcS9$s(r)f&Iv?+$wxw3p8Hu@`ippBpoBTj+}59AwG|PvsmS}7(@WTX znBkQC?ef#lMwEWBVN(k`Ohm#uwjZUZwJCP`8-Y;~MZW6B1s&b`tR|SCbhhiCeikcF z-`s6jC42zCBbFbm4%RA| z(oi%yRR4UbUO|M`uvIZ2?;Vj)>@56pE#X@rV5v z>qx(5m*ITIN?={8(>T3tzXN_`ICo0Luo9A9!d^%Er|&Zyyj-