diff --git a/tool/apt-fast/ss-apt-fast b/tool/apt-fast/ss-apt-fast
index 9f8217a..1734187 100755
--- a/tool/apt-fast/ss-apt-fast
+++ b/tool/apt-fast/ss-apt-fast
@@ -1,21 +1,25 @@
 #!/bin/bash
-#	
-# apt-fast v1.9
+#
+# apt-fast v1.10.0
 # Use this just like aptitude or apt-get for faster package downloading.
 #
 # Copyright: 2008-2012 Matt Parnell, http://www.mattparnell.com
-# Improvements, maintenance, revisions - 2012, 2017-2018 Dominique Lasserre
+# Improvements, maintenance, revisions - 2012, 2017-2019 Dominique Lasserre
 #
 # You may distribute this file under the terms of the GNU General
 # Public License as published by the Free Software Foundation; either
 # version 3 of the License, or (at your option) any later version.
 #
+
+shopt -s nullglob
 [ -n "$DEBUG" ] && set -xv
 
 # Print colored messages.
 # Usage: msg "message text" "message type" "optional: err"
 # Message types are 'normal', 'hint' or 'warning'. Warnings and messages with a
 # third argument are piped to stderr.
+
+THREADS=$(nproc 2>/dev/null || echo 4)
 msg(){
   msg_options=()
   case "$2" in
@@ -34,7 +38,7 @@ msg(){
 }
 
 # Search for known options and decide if root privileges are needed.
-root=1  # default value: we need root privileges
+root=$#
 option=
 for argument in "$@"; do
   case "$argument" in
@@ -70,7 +74,6 @@ TMP__APTMGR="${_APTMGR-${TMP_RANDOM}}"
 TMP_APTCACHE="${APTCACHE-${TMP_RANDOM}}"
 TMP_DLDIR="${DLDIR-${TMP_RANDOM}}"
 TMP_DLLIST="${DLLIST-${TMP_RANDOM}}"
-TMP_LISTDIR="${LISTDIR-${TMP_RANDOM}}"
 TMP__MAXNUM="${MAXNUM-${TMP_RANDOM}}"
 TMP__MAXCONPERSRV="${MAXCONPERSRV-${TMP_RANDOM}}"
 TMP__SPLITCON="${SPLITCON-${TMP_RANDOM}}"
@@ -78,6 +81,7 @@ TMP__MINSPLITSZ=${MINSPLITSZ-${TMP_RANDOM}}
 TMP__PIECEALGO=${PIECEALGO-${TMP_RANDOM}}
 TMP_aptfast_prefix="${aptfast_prefix-${TMP_RANDOM}}"
 TMP_APT_FAST_TIMEOUT="${APT_FAST_TIMEOUT-${TMP_RANDOM}}"
+TMP_APT_FAST_APT_AUTH="${APT_FAST_APT_AUTH-${TMP_RANDOM}}"
 TMP_VERBOSE_OUTPUT="${VERBOSE_OUTPUT-${TMP_RANDOM}}"
 TMP_ftp_proxy="${ftp_proxy-${TMP_RANDOM}}"
 TMP_http_proxy="${http_proxy-${TMP_RANDOM}}"
@@ -85,7 +89,7 @@ TMP_https_proxy="${https_proxy-${TMP_RANDOM}}"
 
 # Check for proper privileges.
 # Call explicitly with environment variables to get them into root conext.
-if [ "$root" = 1 ] && [ "$UID" != 0 ]; then
+if [ "$root" -ne 0 ] && [ "$UID" != 0 ]; then
   exec sudo DEBUG="$DEBUG" \
             LCK_FILE="$TMP_LCK_FILE" \
             DOWNLOADBEFORE="$TMP_DOWNLOADBEFORE" \
@@ -93,7 +97,6 @@ if [ "$root" = 1 ] && [ "$UID" != 0 ]; then
             APTCACHE="$TMP_APTCACHE" \
             DLDIR="$TMP_DLDIR" \
             DLLIST="$TMP_DLLIST" \
-            LISTDIR="$TMP_LISTDIR" \
             _MAXNUM="$TMP__MAXNUM" \
             _MAXCONPERSRV="$TMP__MAXCONPERSRV" \
             _SPLITCON="$TMP__SPLITCON" \
@@ -101,6 +104,7 @@ if [ "$root" = 1 ] && [ "$UID" != 0 ]; then
             _PIECEALGO="$TMP__PIECEALGO" \
             aptfast_prefix="$TMP_aptfast_prefix" \
             APT_FAST_TIMEOUT="$TMP_APT_FAST_TIMEOUT" \
+            APT_FAST_APT_AUTH="$TMP_APT_FAST_APT_AUTH" \
             VERBOSE_OUTPUT="$TMP_VERBOSE_OUTPUT" \
             ftp_proxy="$TMP_ftp_proxy" \
             http_proxy="$TMP_http_proxy" \
@@ -108,7 +112,6 @@ if [ "$root" = 1 ] && [ "$UID" != 0 ]; then
             "$0" "$@"
 fi
 
-
 # Define lockfile.
 # Use /tmp as directory because everybody (not only root) has to have write
 # permissions.
@@ -123,27 +126,39 @@ LCK_FD=99
 
 # Set default package manager, APT cache, temporary download dir,
 # temporary download list file, and maximal parallel downloads
-_APTMGR=apt-get
+_APTMGR=apt-get	
 eval "$(apt-config shell APTCACHE Dir::Cache::archives/d)"
 # Check if APT config option Dir::Cache::archives::apt-fast-partial is set.
 eval "$(apt-config shell apt_fast_partial Dir::Cache::archives::apt-fast-partial/d)"
 if [ -z "$apt_fast_partial" ]; then
-  eval "$(apt-config -o Dir::Cache::archives::apt-fast-partial=apt-fast shell DLDIR Dir::Cache::archives::apt-fast-partial/d)"
+  DLDIR="$(realpath "${APTCACHE}/../apt-fast")"
 else
-  eval "$(apt-config shell DLDIR Dir::Cache::archives::apt-fast-partial/d)"
+  DLDIR="${apt_fast_partial}"
 fi
-# Currently not needed.
-eval "$(apt-config shell LISTDIR Dir::State::lists/d)"
+
+# Check for apt auth files
+eval "$(apt-config shell NETRC Dir::Etc::netrc/f)"
+eval "$(apt-config shell NETRCDIR Dir::Etc::netrcparts/d)"
+APTAUTHFILES=()
+if [ -f "$NETRC" ]; then
+    APTAUTHFILES=("$NETRC")
+fi
+APTAUTHFILES+=("$NETRCDIR"*)
+
 if [ "$IS_ACE_ENV" != "" ];then
 DLLIST="/tmp/apt-fast-in-container.list"
 else
 DLLIST="/tmp/apt-fast.list"
 fi
+
+
+
 _MAXNUM=5
 _MAXCONPERSRV=10
 _SPLITCON=8
 _MINSPLITSZ="1M"
 _PIECEALGO="default"
+MIRRORS=()
 
 # Prefix in front of apt-fast output:
 aptfast_prefix=
@@ -162,6 +177,9 @@ APT_FAST_TIMEOUT=60
 # Ask for download confirmation if unset
 DOWNLOADBEFORE=
 
+# Enable APT authentication support
+APT_FAST_APT_AUTH=1
+
 # Formatted package list in download confirmation if unset
 VERBOSE_OUTPUT=
 
@@ -188,7 +206,6 @@ https_proxy=
 [ "$TMP_APTCACHE" = "$TMP_RANDOM" ] || APTCACHE="$TMP_APTCACHE"
 [ "$TMP_DLDIR" = "$TMP_RANDOM" ] || DLDIR="$TMP_DLDIR"
 [ "$TMP_DLLIST" = "$TMP_RANDOM" ] || DLLIST="$TMP_DLLIST"
-[ "$TMP_LISTDIR" = "$TMP_RANDOM" ] || LISTDIR="$TMP_LISTDIR"
 [ "$TMP__MAXNUM" = "$TMP_RANDOM" ] || _MAXNUM="$TMP__MAXNUM"
 [ "$TMP__MAXCONPERSRV" = "$TMP_RANDOM" ] || _MAXCONPERSRV="$TMP__MAXCONPERSRV"
 [ "$TMP__SPLITCON" = "$TMP_RANDOM" ] || _SPLITCON="$TMP__SPLITCON"
@@ -196,6 +213,7 @@ https_proxy=
 [ "$TMP__PIECEALGO" = "$TMP_RANDOM" ] || _PIECEALGO="$TMP__PIECEALGO"
 [ "$TMP_aptfast_prefix" = "$TMP_RANDOM" ] || aptfast_prefix="$TMP_aptfast_prefix"
 [ "$TMP_APT_FAST_TIMEOUT" = "$TMP_RANDOM" ] || APT_FAST_TIMEOUT="$TMP_APT_FAST_TIMEOUT"
+[ "$TMP_APT_FAST_APT_AUTH" = "$TMP_RANDOM" ] || APT_FAST_APT_AUTH="$TMP_APT_FAST_APT_AUTH"
 [ "$TMP_VERBOSE_OUTPUT" = "$TMP_RANDOM" ] || VERBOSE_OUTPUT="$TMP_VERBOSE_OUTPUT"
 [ "$TMP_ftp_proxy" = "$TMP_RANDOM" ] || ftp_proxy="$TMP_ftp_proxy"
 [ "$TMP_http_proxy" = "$TMP_RANDOM" ] || http_proxy="$TMP_http_proxy"
@@ -279,7 +297,8 @@ cleanup_dllist()
 
 cleanup_aptfast()
 {
-  [ "$CLEANUP_STATE" -eq 0 ] && CLEANUP_STATE=$?
+  local last_exit_code=$?
+  [ "$CLEANUP_STATE" -eq 0 ] && CLEANUP_STATE=$last_exit_code
   cleanup_dllist
   _remove_lock
 }
@@ -308,7 +327,7 @@ get_mirrors(){
     for mirror in "${mirrors[@]}"; do
       # Real expension.
       if [[ "$1" == "$mirror"* ]]; then
-        filepath=${1#${mirror}}
+        filepath="${1#"${mirror}"}"
         # Build list for aria download list.
         list="${mirrors[*]:1}"
         echo -e "${list// /${filepath}\\t}$filepath\n"
@@ -319,67 +338,128 @@ get_mirrors(){
   # No other mirrors found.
   echo "$1"
 }
+
 ##########SPARK ADJUST: END
+
+AUTH_INFO_PARSED=()
+# Parse apt authentication files.
+# Undefined behavior on whitespaces in host, username or password.
+prepare_auth(){
+  if [ "$APT_FAST_APT_AUTH" -eq 0 ]; then
+    return
+  fi
+  for auth_file in "${APTAUTHFILES[@]}"; do
+    # auth files have netrc syntax, possible multiline entries starting with "machine"
+    auth_info="$(tr '\n' ' ' < "$auth_file" | sed 's/\(\<machine\>\)/\n\1/g' | sed '1d')"
+    while IFS= read -r auth; do
+      machine="$(echo "$auth" | sed 's/.*\<machine\>[ \t]\+\([^ \t]\+\).*/\1/')"
+      login="$(echo "$auth" | sed 's/.*\<login\>[ \t]\+\([^ \t]\+\).*/\1/')"
+      password="$(echo "$auth" | sed 's/.*\<password\>[ \t]\+\([^ \t]\+\).*/\1/')"
+      # if machine does not have protocol, try https://
+      if ! [[ "$machine" =~ ^.*:// ]]; then
+        machine="https://$machine"
+      fi
+      if [ -z "$machine" ] || [ -z "$login" ] || [ -z "$password" ]; then
+        msg "Could not parse apt authentication (skipping): $auth ($auth_file)" "warning"
+        continue
+      fi
+      # use space separated string to convert back to array later
+      AUTH_INFO_PARSED+=("$machine $login $password")
+    done <<< "$auth_info"
+  done
+}
+
+# Gets URI as parameter and tries to add basic http credentials. Will fail on
+# credentials that contain characters that need URL-encoding.
+get_auth(){
+  if [ "$APT_FAST_APT_AUTH" -eq 0 ]; then
+    echo "$1"
+    return
+  fi
+  for auth_info in "${AUTH_INFO_PARSED[@]}"; do
+    # convert to array, don't escape variable here
+    auth_info_arr=($auth_info)
+    machine="${auth_info_arr[0]}"
+    # takes first match
+    if [[ "$1" == "$machine"* ]]; then
+      login="${auth_info_arr[1]}"
+      password="${auth_info_arr[2]}"
+      uri="$(echo "$1" | sed "s|^\([^:]\+://\)|\1$login:$password@|")"
+      echo "$uri"
+      return
+    fi
+  done
+  echo "$1"
+}
+
 # Globals to save package name, version, size and overall size.
 DOWNLOAD_DISPLAY=
 DOWNLOAD_SIZE=0
 
+# 获取包的URI
 # Get the package URLs.
 get_uris(){
-
   if [ ! -d "$(dirname "$DLLIST")" ]
   then
     if ! mkdir -p -- "$(dirname "$DLLIST")"
     then
       msg "Could not create download file directory." "warning"
-      msg "无法创建下载文件夹" "warning"
-      exit 1
+      msg "无法创建下载目录" "warning"
+      CLEANUP_STATE=1
+      exit
     fi
   elif [ -f "$DLLIST" ]; then
     if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null
     then
-      msg "Unable to write to download file. Try restarting with root permissions or run 'aptss clean' first." "warning"
+      msg "Unable to write to download file. Try restarting with root permissions or run 'apt-fast clean' first." "warning"
       msg "无法下载文件。尝试使用root权限,或者运行 'aptss clean'" "warning"
-      exit 1
+      CLEANUP_STATE=1
+      exit
     fi
   fi
 
   # Add header to overwrite file.
   echo "# apt-fast mirror list: $(date)" > "$DLLIST"
-  #NOTE: aptitude doesn't have this functionality, so we use apt-get to get
-  #      package URIs.
-#  case "$_APTMGR" in
-#    apt|apt-get) uri_mgr=$_APTMGR;;
-#    *) uri_mgr=apt-get;;
-#  esac
-  # NOTE:apt可能出现变动,不建议在脚本中使用,因此在此统一改用apt-get
-uri_mgr=apt-get
+  # NOTE: "aptitude" doesn't have this functionality
+  # so we use "${_APTMGR}" to get package URI's
+  case "$(basename "${_APTMGR}")" in
+    'apt'|'apt-get') uri_mgr="${_APTMGR}";;
+    *) uri_mgr='apt-get';;
+  esac
   uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")"
-  uris_full_ret="$?"
-  if [ "$uris_full_ret" -ne 0 ]
+  CLEANUP_STATE="$?"
+  if [ "$CLEANUP_STATE" -ne 0 ]
   then
     msg "Package manager quit with exit code.Here is the log" "warning"
     msg "包管理器以错误代码退出.日志如下" "warning"
     msg "${uris_full}"
-    exit "$uris_full_ret"
+    exit"$CLEANUP_STATE"
   fi
-  while read -r pkg_uri_info
-  do
-    [ -z "$pkg_uri_info" ] && continue
-    ## --print-uris format is:
-    # 'fileurl' filename filesize checksum_hint:filechecksum
-    uri="$(echo "$pkg_uri_info" | cut -d' ' -f1 | tr -d "'")"
-    filename="$(echo "$pkg_uri_info" | cut -d' ' -f2)"
-    filesize="$(echo "$pkg_uri_info" | cut -d' ' -f3)"
-    checksum_string="$(echo "$pkg_uri_info" | cut -d' ' -f4)"
-    hash_algo="$(echo "$checksum_string" | cut -d':' -f1)"
-    checksum="$(echo "$checksum_string" | cut -d':' -f2)"
+  prepare_auth
+ local tmpdir=$(mktemp -d) || {
+    msg "Failed to create tmp dir" "warning"
+    msg "无法创建临时目录" "warning"
+    exit 1
+  }
+  ## --print-uris format is:
+  # 'fileurl' filename filesize checksum_hint:filechecksum
+  process_package() {
+    local pkg_uri_info="$@"
+
+    local display_line=""   # 添加局部变量并初始化为空
+
+    IFS=' ' read -r uri filename filesize checksum_string _ <<<"$pkg_uri_info"
+    [ -z "$uri" ] && continue
+    uri="$(get_auth "${uri//"'"/}")"
+    IFS=':' read -r hash_algo checksum _ <<<"$checksum_string"
 
     filename_decoded="$(urldecode "$filename")"
-    DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY}$(echo "$filename_decoded" | cut -d'_' -f1)"
-    DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY} $(echo "$filename_decoded" | cut -d'_' -f2)"
-    DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY} $(echo "$filesize" | numfmt --to=iec-i --suffix=B)\n"
-    DOWNLOAD_SIZE=$((DOWNLOAD_SIZE + filesize))
+    IFS='_' read -r pkg_name_decoded pkg_version_decoded _ <<<"$filename_decoded"
+    
+
+
+    display_line="${display_line}$pkg_name_decoded $pkg_version_decoded"
+    display_line="${display_line} $(echo "$filesize" | numfmt --to=iec-i --suffix=B)\n"
 
     ## whole uri comes encoded (urlencoded). Filename must NOT be decoded because
     # plain aptitude do not decode it when download and install it. Therefore, we
@@ -397,40 +477,44 @@ uri_mgr=apt-get
         *) hash_algo=
       esac
 
-      # Using apt-cache show package=version to ensure recover single and
+
+       # Using apt-cache show package=version to ensure recover single and
       # correct package version.
       # Warning: assuming that package naming uses '_' as field separator.
-      # Therefore, this code expects package-name_version_arch.deb Otherways
+      # Therefore, this code expects package-name_version_arch.deb Otherwise
       # below code will fail resoundingly
       if [ -z "$hash_algo" ]; then
-        pkg_name="$(echo "$filename" | cut -d'_' -f1)"
-        pkg_version="$(echo "$filename" | cut -d'_' -f2)"
-        pkg_version="$(urldecode "$pkg_version")"
-        package_info="$(apt-cache show "$pkg_name=$pkg_version")"
+        IFS='_' read -r pkg_name _ <<<"$filename"
+        pkg_version="$pkg_version_decoded"
+        # Transform multi-line field output from apt-cache to single line and sort checksums, strongest first
+        package_info="$(apt-cache show "$pkg_name=$pkg_version" | sed ':r;$!{N;br};s/\n / /g' | sort -r)"
 
-        patch_checksum=
-        if [ -n "$SHA512_SUPPORTED" ]; then
-          patch_checksum="$(echo "$package_info" | grep SHA512 | head -n 1)"
-          [ -n "$patch_checksum" ] && hash_algo="sha-512"
-        fi
-        if [ -z "$patch_checksum" ] && [ -n "$SHA256_SUPPORTED" ]; then
-          patch_checksum="$(echo "$package_info" | grep SHA256 | head -n 1)"
-          [ -n "$patch_checksum" ] && hash_algo="sha-256"
-        fi
-        if [ -z "$patch_checksum" ] && [ -n "$SHA1_SUPPORTED" ]; then
-          patch_checksum="$(echo "$package_info" | grep SHA1 | head -n 1)"
-          [ -n "$patch_checksum" ] && hash_algo="sha-1"
-        fi
-        if [ -z "$patch_checksum" ] && [ -n "$MD5sum_SUPPORTED" ]; then
-          patch_checksum="$(echo "$package_info" | grep MD5sum | head -n 1)"
-          [ -n "$patch_checksum" ] && hash_algo="md5"
-        fi
+        while IFS=': ' read -r field checksum _
+        do
+          case "$field" in
+            SHA512)
+              [ -n "$SHA512_SUPPORTED" ] || continue
+              hash_algo="sha-512"
+              break ;;
+            SHA256)
+              [ -n "$SHA256_SUPPORTED" ] || continue
+              hash_algo="sha-256"
+              break ;;
+            SHA1)
+              [ -n "$SHA1_SUPPORTED" ] || continue
+              hash_algo="sha-1"
+              break ;;
+            MD5sum)
+              [ -n "$MD5sum_SUPPORTED" ] || continue
+              hash_algo="md5"
+              break ;;
+          esac
+        done <<<"$package_info"
 
-        if [ -n "$patch_checksum" ]; then
-          checksum="$(echo "$patch_checksum" | cut -d' ' -f2)"
-        else
+        if [ -z "$hash_algo" ]; then
+          checksum=
           msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning"
-	  msg "无法获得 $pkg_name ($pkg_version) 的受支持的散列验证值" "warning"
+          msg "无法获得 $pkg_name ($pkg_version) 版本受到支持的散列验证值" "warning"
           REMOVE_WORKING_MESSAGE=
         fi
       fi
@@ -438,21 +522,64 @@ uri_mgr=apt-get
       hash_algo=
     fi
 
-    {
-      get_mirrors "$uri"
-      #echo " dir=$DLDIR"
-      if [ -n "$hash_algo" ]; then
-        echo " checksum=$hash_algo=$checksum"
-      fi
-      echo " out=$filename"
-    } >> "$DLLIST"
-  done <<<"$(echo "$uris_full" | grep -E "^'(http(s|)|(s|)ftp)://")"
 
+    # 使用文件锁安全写入下载列表
+    (
+      flock -x 200 # 获取排他锁
+      {
+        get_mirrors "$uri"
+        [ -n "$hash_algo" ] && echo " checksum=$hash_algo=$checksum"
+        echo " out=$filename"
+      } >> "$DLLIST"
+    ) 200>>"$DLLIST" # 使用文件描述符200关联锁文件
+
+    # 将显示信息和文件大小存入临时文件
+    echo "$display_line" >> "$tmpdir/display"
+    echo "$filesize" >> "$tmpdir/sizes"
+  }
+
+  # 主并行处理逻辑(新增线程控制)
+  mapfile -t pkg_uri_list < <(echo "$uris_full" | grep -E "^'(http(s|)|(s|)ftp)://")
+  total_pkgs=${#pkg_uri_list[@]}
+  threads=${THREADS:-4}  # 默认4线程
+  per_thread=$(( (total_pkgs + threads - 1) / threads ))  # 向上取整
+
+  # 分割任务到不同线程
+  for ((i=0; i<threads; i++)); do
+    start=$((i * per_thread))
+    end=$((start + per_thread -1))
+    [ $end -ge $total_pkgs ] && end=$((total_pkgs -1))
+    
+    # 启动后台线程处理任务块
+    (
+      for ((j=start; j<=end; j++)); do
+        [ -z "${pkg_uri_list[j]}" ] && continue
+        process_package "${pkg_uri_list[j]}"
+      done
+    ) &
+  done
+
+  # 等待所有后台任务完成
+  wait
+
+  # 合并显示信息
+  if [ -f "$tmpdir/display" ]; then
+    DOWNLOAD_DISPLAY+="\n$(cat "$tmpdir/display")"
+  fi
+
+  # 计算总下载大小
+  if [ -f "$tmpdir/sizes" ]; then
+    DOWNLOAD_SIZE=$(awk '{sum+=$1} END{print sum}' "$tmpdir/sizes")
+  fi
+
+  # 清理临时目录
+  rm -rf "$tmpdir"
+  
   #cat "$DLLIST"
-  #LCK_RM
   #exit
 }
 
+
 display_downloadfile(){
   if [ -n "$VERBOSE_OUTPUT" ]; then
     cat "$DLLIST"
@@ -460,11 +587,8 @@ display_downloadfile(){
     DISPLAY_SORT_OPTIONS=(-k 1,1)
     # Sort output after package download size (decreasing):
     #DISPLAY_SORT_OPTIONS=(-k 3,3 -hr)
-    while read -r line; do
-        [ -z "$line" ] && continue
-        pkg="$(echo "$line" | cut -d' ' -f1)"
-        ver="$(echo "$line" | cut -d' ' -f2)"
-        size="$(echo "$line" | cut -d' ' -f3)"
+    while IFS=' ' read -r pkg ver size _; do
+        [ -z "$pkg" ] && continue
         printf '%s%-40s %-20s %10s\n' "$aptfast_prefix" "$pkg" "$ver" "$size"
     done <<<"$(echo -e "$DOWNLOAD_DISPLAY" | sort "${DISPLAY_SORT_OPTIONS[@]}")"
   fi
@@ -472,6 +596,7 @@ display_downloadfile(){
   msg "下载大小: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
 }
 
+
 # Create and insert a PID number to lockfile.
 
 _create_lock
@@ -481,19 +606,21 @@ CMD="$(echo "$_DOWNLOADER" | sed 's/^\s*\([^ ]\+\).*$/\1/')"
 if [ ! "$(command -v "$CMD")" ]; then
   msg "Command not found: $CMD" "normal" "err"
   msg "You must configure $CONFFILE to use aria2c or another supported download manager" "normal" "err"
-  exit 1
+  CLEANUP_STATE=1
+  exit
 fi
 
 # Make sure package manager is available.
 if [ ! "$(command -v "$_APTMGR")" ]; then
   msg "\`$_APTMGR\` command not available." "warning"
   msg "You must configure $CONFFILE to use either apt-get or aptitude." "normal" "err"
-  exit 1
+  CLEANUP_STATE=1
+  exit
 fi
 
 # Disable script warning if apt is used.
 APT_SCRIPT_WARNING=()
-if [ "$_APTMGR" == "apt" ]; then
+if [ "$(basename "${_APTMGR}")" == 'apt' ]; then
     APT_SCRIPT_WARNING=(-o "Apt::Cmd::Disable-Script-Warning=true")
 fi
 
@@ -540,6 +667,8 @@ while true; do
       d)
         DOWNLOAD_ONLY=true
         ;;
+      *)
+        ;;
     esac
   done
   ((OPTIND++))
@@ -582,7 +711,7 @@ if [ "$option" == "install" ]; then
     msg "Do you want to download the packages? [Y/n] " "question"
 
     while ((!updsys)); do
-      read -r -sn1 -t "$APT_FAST_TIMEOUT" answer || { msg; msg "Timed out." "warning"; exit 1; }
+      read -r -sn1 -t "$APT_FAST_TIMEOUT" answer || { msg; msg "Timed out." "warning"; CLEANUP_STATE=1; exit; }
       case "$answer" in
         [JjYy])    result=1; updsys=1 ;;
         [Nn])      result=0; updsys=1 ;;
@@ -604,7 +733,7 @@ if [ "$option" == "install" ]; then
           mkdir -p -- "$DLDIR"
         fi
 
-        cd "$DLDIR" &>/dev/null || exit 1
+        cd "$DLDIR" &>/dev/null || { msg; msg "Not able to change into download directory." "warning"; CLEANUP_STATE=1; exit; }
 
         eval "${_DOWNLOADER}"  # execute downloadhelper command
         if [ "$(find "$DLDIR" -printf . | wc -c)" -gt 1 ]; then
@@ -624,22 +753,26 @@ if [ "$option" == "install" ]; then
         cd - &>/dev/null || msg "Failed to change back directory" "warning"
       fi
     else
-      exit 1
+      CLEANUP_STATE=1
+      exit
     fi
   else
     [ -t 1 ] && tput el
   fi
 
-  if [ -z "$DOWNLOAD_ONLY" ] || [ "$_APTMGR" == "aptitude" ]; then
+  # different problem resolving for aptitude
+  if [ -z "$DOWNLOAD_ONLY" ] || [ "$(basename "${_APTMGR}")" == 'aptitude' ]; then
     "${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
   fi
 
 
 elif [ "$option" == "clean" ]; then
   "${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@" && {
-    find "$DLDIR" -maxdepth 1 -type f -delete
-    CLEANUP_STATE="$?"
-    [ -f "$DLLIST" ] && rm -f -- "$DLLIST"* || true
+    if [ -d "$DLDIR" ]; then
+      find "$DLDIR" -maxdepth 1 -type f -delete
+      CLEANUP_STATE="$?"
+      [ -f "$DLLIST" ] && rm -f -- "$DLLIST"* || true
+    fi
   }
 
 elif [ "$option" == "download" ]; then
@@ -657,7 +790,8 @@ elif [ "$option" == "download" ]; then
     eval "${_DOWNLOADER}"
   fi
 
-  if [ "$_APTMGR" == "aptitude" ]; then
+  # different problem resolving for aptitude
+  if [ "$(basename "${_APTMGR}")" == 'aptitude' ]; then
     "${_APTMGR}" "$@"
   fi