### for raw view on ios where the
### 1st or 2nd lines are cut off
### by the screen
printf "NOTICE: this does NOT package special files like pts/tty devices, anything in /dev, and so on however it CAN package fifo's, named pipes, and sockets, into the archive... continuing in 4 seconds\nnote: sed '5s//<new>/g' replaces line 5 with whatever u want\n"
# sleep 4

fatal() { echo error: cannot embed "'$path'" into executable: "'$path'" does not exist; exit; }

fatal2() { echo error: cannot embed "'$path'" into executable: "'$path'" does not contain any valid files; exit; }

fatal3() { echo error: cannot embed "'$path'" into executable: "'$path'" is a "'$type'" file; exit; }

fatal4() { echo error: cannot embed "'$1'" into executable: "'$1'" is of type "'$2'"; exit; }

strippath()
{
    realpath1=$(readlink -f "$1")
    pathdir1=$(dirname "$realpath1")
    pathdir1="$pathdir1/"
    echo "$pathdir1"
}

preinitmulti() { mkdir -v Converted ; mkdir -v Converted/"$pathbaseprefix" ; cd Converted/"$pathbaseprefix" 
printf '%b' '/* */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <assert.h>
#include <string.h>
#include <errno.h>
#include <libgen.h>
#include <sys/stat.h>
#include <sys/types.h>



// "look deep into yourself, Clarice"  -- Hanibal Lector
char findyourself_save_pwd[PATH_MAX];
char findyourself_save_argv0[PATH_MAX];
char findyourself_save_path[PATH_MAX];
char findyourself_path_separator='"'/'"';
char findyourself_path_separator_as_string[2]="/";
char findyourself_path_list_separator[8]=":";  // could be ":; "
char findyourself_debug=0;

int findyourself_initialized=0;

void findyourself_init(char *argv0)
{

  getcwd(findyourself_save_pwd, sizeof(findyourself_save_pwd));

  strncpy(findyourself_save_argv0, argv0, sizeof(findyourself_save_argv0));
  findyourself_save_argv0[sizeof(findyourself_save_argv0)-1]=0;

  strncpy(findyourself_save_path, getenv("PATH"), sizeof(findyourself_save_path));
  findyourself_save_path[sizeof(findyourself_save_path)-1]=0;
  findyourself_initialized=1;
}


int find_yourself(char *result, size_t size_of_result)
{
  char newpath[PATH_MAX+256];
  char newpath2[PATH_MAX+256];

  assert(findyourself_initialized);
  result[0]=0;

  if(findyourself_save_argv0[0]==findyourself_path_separator) {
    if(findyourself_debug) printf("  absolute path\\n");
     realpath(findyourself_save_argv0, newpath);
     if(findyourself_debug) printf("  newpath=\"%s\"\\n", newpath);
     if(!access(newpath, F_OK)) {
        strncpy(result, newpath, size_of_result);
        result[size_of_result-1]=0;
        return(0);
     } else {
    perror("access failed 1");
      }
  } else if( strchr(findyourself_save_argv0, findyourself_path_separator )) {
    if(findyourself_debug) printf("  relative path to pwd\\n");
    strncpy(newpath2, findyourself_save_pwd, sizeof(newpath2));
    newpath2[sizeof(newpath2)-1]=0;
    strncat(newpath2, findyourself_path_separator_as_string, sizeof(newpath2));
    newpath2[sizeof(newpath2)-1]=0;
    strncat(newpath2, findyourself_save_argv0, sizeof(newpath2));
    newpath2[sizeof(newpath2)-1]=0;
    realpath(newpath2, newpath);
    if(findyourself_debug) printf("  newpath=\"%s\"\\n", newpath);
    if(!access(newpath, F_OK)) {
        strncpy(result, newpath, size_of_result);
        result[size_of_result-1]=0;
        return(0);
     } else {
    perror("access failed 2");
      }
  } else {
    if(findyourself_debug) printf("  searching $PATH\\n");
    char *saveptr;
    char *pathitem;
    for(pathitem=strtok_r(findyourself_save_path, findyourself_path_list_separator,  &saveptr); pathitem; pathitem=strtok_r(NULL, findyourself_path_list_separator, &saveptr) ) {
       if(findyourself_debug>=2) printf("pathitem=\"%s\"\\n", pathitem);
       strncpy(newpath2, pathitem, sizeof(newpath2));
       newpath2[sizeof(newpath2)-1]=0;
       strncat(newpath2, findyourself_path_separator_as_string, sizeof(newpath2));
       newpath2[sizeof(newpath2)-1]=0;
       strncat(newpath2, findyourself_save_argv0, sizeof(newpath2));
       newpath2[sizeof(newpath2)-1]=0;
       realpath(newpath2, newpath);
       if(findyourself_debug) printf("  newpath=\"%s\"\\n", newpath);
      if(!access(newpath, F_OK)) {
          strncpy(result, newpath, size_of_result);
          result[size_of_result-1]=0;
          return(0);
      } 
    } // end for
    perror("access failed 3");

  } // end else
  // if we get here, we have tried all three methods on argv[0] and still haven'"'"'t succeeded.   Include fallback methods here.
  return(1);
}

#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>

int
make_named_socket (const char *filename)
{
    struct sockaddr_un name;
    int sock;
    size_t size;

    /* Create the socket. */
    sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
    if (sock < 0)
        {
            perror ("socket");
            exit (EXIT_FAILURE);
        }

    /* Bind a name to the socket. */
    name.sun_family = AF_LOCAL;
    strncpy (name.sun_path, filename, sizeof (name.sun_path));
    name.sun_path[sizeof (name.sun_path) - 1] = '"'\\\0'"';

    /* The size of the address is
        the offset of the start of the filename,
        plus its length (not including the terminating null byte).
        Alternatively you can just do:
        size = SUN_LEN (&name);
    */
    size = (offsetof (struct sockaddr_un, sun_path)
            + strlen (name.sun_path));

    if (bind (sock, (struct sockaddr *) &name, size) < 0)
        {
            perror ("bind");
            exit (EXIT_FAILURE);
        }

    return sock;
}

int main(int argc, char **argv)
{
  findyourself_init(argv[0]);

  char newpath[PATH_MAX];
  find_yourself(newpath, sizeof(newpath));
  if(1 || strcmp(argv[0],newpath)) { }
  char *dummy  = strdup( newpath );
  char *dname = dirname( dummy );
  printf("Extracting...\\n");
' > main.c; }

objectconvert() {
path="$1" && objectfile=$(echo "$path" | sed 's/.*\///') && symbol=$(echo "$path" | tr '\000-\057\072-\100\133-\140\173-\255' '_') && mkdir Converted ; mkdir Converted/"$objectfile" ; cd Converted/"$objectfile" && object=$(objcopy --input binary --output elf64-x86-64 --binary-architecture i386 "$path" "$objectfile".o -v | sed 's/.*to `//' | sed s/\'.*//) && start=$(nm "$object" | sed 's/.* _/_/' | grep "$symbol"start) && size=$(nm "$object" | sed 's/.* _/_/' | grep "$symbol"size) && end=$(nm "$object" | sed 's/.* _/_/' | grep "$symbol"end) && printf '%b' '/* */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <assert.h>
#include <string.h>
#include <errno.h>
#include <libgen.h>

// "look deep into yourself, Clarice"  -- Hanibal Lector
char findyourself_save_pwd[PATH_MAX];
char findyourself_save_argv0[PATH_MAX];
char findyourself_save_path[PATH_MAX];
char findyourself_path_separator='"'/'"';
char findyourself_path_separator_as_string[2]="/";
char findyourself_path_list_separator[8]=":";  // could be ":; "
char findyourself_debug=0;

int findyourself_initialized=0;

void findyourself_init(char *argv0)
{

  getcwd(findyourself_save_pwd, sizeof(findyourself_save_pwd));

  strncpy(findyourself_save_argv0, argv0, sizeof(findyourself_save_argv0));
  findyourself_save_argv0[sizeof(findyourself_save_argv0)-1]=0;

  strncpy(findyourself_save_path, getenv("PATH"), sizeof(findyourself_save_path));
  findyourself_save_path[sizeof(findyourself_save_path)-1]=0;
  findyourself_initialized=1;
}


int find_yourself(char *result, size_t size_of_result)
{
  char newpath[PATH_MAX+256];
  char newpath2[PATH_MAX+256];

  assert(findyourself_initialized);
  result[0]=0;

  if(findyourself_save_argv0[0]==findyourself_path_separator) {
    if(findyourself_debug) printf("  absolute path\\n");
     realpath(findyourself_save_argv0, newpath);
     if(findyourself_debug) printf("  newpath=\"%s\"\\n", newpath);
     if(!access(newpath, F_OK)) {
        strncpy(result, newpath, size_of_result);
        result[size_of_result-1]=0;
        return(0);
     } else {
    perror("access failed 1");
      }
  } else if( strchr(findyourself_save_argv0, findyourself_path_separator )) {
    if(findyourself_debug) printf("  relative path to pwd\\n");
    strncpy(newpath2, findyourself_save_pwd, sizeof(newpath2));
    newpath2[sizeof(newpath2)-1]=0;
    strncat(newpath2, findyourself_path_separator_as_string, sizeof(newpath2));
    newpath2[sizeof(newpath2)-1]=0;
    strncat(newpath2, findyourself_save_argv0, sizeof(newpath2));
    newpath2[sizeof(newpath2)-1]=0;
    realpath(newpath2, newpath);
    if(findyourself_debug) printf("  newpath=\"%s\"\\n", newpath);
    if(!access(newpath, F_OK)) {
        strncpy(result, newpath, size_of_result);
        result[size_of_result-1]=0;
        return(0);
     } else {
    perror("access failed 2");
      }
  } else {
    if(findyourself_debug) printf("  searching $PATH\\n");
    char *saveptr;
    char *pathitem;
    for(pathitem=strtok_r(findyourself_save_path, findyourself_path_list_separator,  &saveptr); pathitem; pathitem=strtok_r(NULL, findyourself_path_list_separator, &saveptr) ) {
       if(findyourself_debug>=2) printf("pathitem=\"%s\"\\n", pathitem);
       strncpy(newpath2, pathitem, sizeof(newpath2));
       newpath2[sizeof(newpath2)-1]=0;
       strncat(newpath2, findyourself_path_separator_as_string, sizeof(newpath2));
       newpath2[sizeof(newpath2)-1]=0;
       strncat(newpath2, findyourself_save_argv0, sizeof(newpath2));
       newpath2[sizeof(newpath2)-1]=0;
       realpath(newpath2, newpath);
       if(findyourself_debug) printf("  newpath=\"%s\"\\n", newpath);
      if(!access(newpath, F_OK)) {
          strncpy(result, newpath, size_of_result);
          result[size_of_result-1]=0;
          return(0);
      } 
    } // end for
    perror("access failed 3");

  } // end else
  // if we get here, we have tried all three methods on argv[0] and still haven'"'"'t succeeded.   Include fallback methods here.
  return(1);
}

#include <stddef.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>

int
make_named_socket (const char *filename)
{
    struct sockaddr_un name;
    int sock;
    size_t size;

    /* Create the socket. */
    sock = socket (PF_LOCAL, SOCK_DGRAM, 0);
    if (sock < 0)
        {
            perror ("socket");
            exit (EXIT_FAILURE);
        }

    /* Bind a name to the socket. */
    name.sun_family = AF_LOCAL;
    strncpy (name.sun_path, filename, sizeof (name.sun_path));
    name.sun_path[sizeof (name.sun_path) - 1] = '"'\\\0'"';

    /* The size of the address is
        the offset of the start of the filename,
        plus its length (not including the terminating null byte).
        Alternatively you can just do:
        size = SUN_LEN (&name);
    */
    size = (offsetof (struct sockaddr_un, sun_path)
            + strlen (name.sun_path));

    if (bind (sock, (struct sockaddr *) &name, size) < 0)
        {
            perror ("bind");
            exit (EXIT_FAILURE);
        }

    return sock;
}

int main(int argc, char **argv)
{
  findyourself_init(argv[0]);

  char newpath[PATH_MAX];
  find_yourself(newpath, sizeof(newpath));
  if(1 || strcmp(argv[0],newpath)) { }
  char *dummy  = strdup( newpath );
  char *dname = dirname( dummy );
  printf("Extracting...\\n");
' > main.c && printf '
        // OBJECT START
        extern char '"$start"';
        extern char '"$size"'; // we keep this just in case we ever need it
        extern char '"$end"';
        char * p = &'"$start"';
        FILE *fp;
        chdir(dname);
        fp = fopen("'"$objectfile"'", ("'"w+"'"));
        while ( p != &'"$end"' ) fputc(*p++, fp); // credit for fputc(*p++, fp): flawless_snowflake from kik messenger
        // char y[3];
        // strcpy(y, x);
        fclose(fp);
        // OBJECT END
        ' >> main.c ; }

objectconvertMulti() {
path="$1" && objectfile=$(echo "$path" | tr '\000-\057\072-\100\133-\140\173-\255' '_') && symbol=$(echo "$path" | tr '\000-\057\072-\100\133-\140\173-\255' '_') && object=$(objcopy --input binary --output elf64-x86-64 --binary-architecture i386 "$path" "$2".o -v | sed 's/.*to `//' | sed s/\'.*// | sed 's/ /_/g') && objectlist+="$object " && start=$(nm "$object" | sed 's/.* _/_/' | grep "$symbol"start) && size=$(nm "$object" | sed 's/.* _/_/' | grep "$symbol"size) && end=$(nm "$object" | sed 's/.* _/_/' | grep "$symbol"end) && printf '
        // OBJECT START
        extern char '"$start"';
        extern char '"$size"'; // we keep this just in case we ever need it
        extern char '"$end"';
        char * '"a$2"'p = &'"$start"';
        FILE *'"a$2"'fp;
        chdir(dname);
        
        ' >> main.c
        patha5rray=($(echo "$3" | sed s/"\/"/\ /g))
        for b in ${patha5rray[@]}
            do 
                printf '%b' 'mkdir("'"$b"'", 0777); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        chdir("'"$b"'"); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        ' >> main.c
        done
        printf '
        '"a$2"'fp = fopen("'"./$4"'", ("'"w+"'"));
        while ( '"a$2"'p != &'"$end"' ) fputc(*'"a$2"'p++, '"a$2"'fp); // credit for fputc(*p++, fp): flawless_snowflake from kik messenger
        fclose('"a$2"'fp);
        chmod("'"./$4"'", '"$5"');
        chdir(dname);
        
        // OBJECT END
        ' >> main.c ; }

mksymlink() {
printf '
        // SYMLINK START
        chdir(dname);
        
        ' >> "$orgp2/main.c"
        patha5rray=($(echo "$1" | sed s/"\/"/\ /g))
        for b in ${patha5rray[@]}
            do 
                printf '%b' 'mkdir("'"$b"'", 0777); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        chdir("'"$b"'"); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        ' >> "$orgp2/main.c"
        done
        printf '
        symlink("'"$3"'", "'"$2"'");
        chmod("'"./$2"'", '"$4"');
        chdir(dname);
        
        // SYMLINK END
        ' >> "$orgp2/main.c" ; }
mkfifoC() {
printf '
        // FIFO START
        chdir(dname);
        
        ' >> main.c
        patha5rray=($(echo "$1" | sed s/"\/"/\ /g))
        for b in ${patha5rray[@]}
            do 
                printf '%b' 'mkdir("'"$b"'", 0777); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        chdir("'"$b"'"); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        ' >> main.c
        done
        printf '
        mkfifo("'"$2"'", '"$3"');
        chdir(dname);
        
        // FIFO END
        ' >> main.c ; }

mkdirs() {
printf '
        // MKDIRS START
        chdir(dname);
        
        ' >> main.c
        patha5rray=($(echo "$1" | sed s/"\/"/\ /g))
        for b in ${patha5rray[@]}
            do 
                printf '%b' 'mkdir("'"$b"'", 0777);
         // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        chdir("'"$b"'"); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        ' >> main.c
        done
        printf '
        chdir(dname);
        
        // MKDIRS END
        ' >> main.c ; }

chmoddir() {
printf '
        // CHMODDIR START
        chdir(dname);
        chmod("'"$1"'", '"$2"');
        chdir(dname);
        
        // CHMODDIR END
        ' >> main.c ; }
        
mksocket() {
printf '
        // SOCKET START
        chdir(dname);
        
        ' >> main.c
        patha5rray=($(echo "$1" | sed s/"\/"/\ /g))
        for b in ${patha5rray[@]}
            do 
                printf '%b' 'mkdir("'"$b"'", 0777); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        chdir("'"$b"'"); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        ' >> main.c
        done
        printf '
        make_named_socket("'"$2"'");
        chmod("'"./$2"'", '"$3"');
        chdir(dname);
        
        // SOCKET END
        ' >> main.c ; }

mkemptyfile() {
printf '
        // EMPTY FILE START
        chdir(dname);
        
        ' >> "$orgp2/main.c"
        patha5rray=($(echo "$1" | sed s/"\/"/\ /g))
        for b in ${patha5rray[@]}
            do 
                printf '%b' 'mkdir("'"$b"'", 0777); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        chdir("'"$b"'"); // Simulates the mkdir -p ( mkdir --help: -p, --parents ) argument of the mkdir binary found in /bin/mkdir or /usr/bin/mkdir
        ' >> "$orgp2/main.c"
        done
        printf '
        FILE *'"e$4"'fp;
        '"e$4"'fp = fopen("'"./$2"'", ("'"w+"'"));
        fclose('"e$4"'fp);
        chmod("'"./$2"'", '"$3"');
        chdir(dname);
        
        // EMPTY FILE END
        ' >> "$orgp2/main.c" ; }

compile() { gcc -g main.c "$object" -static && wait
}

compilemulti() { gcc -g main.c $objectlist -static && wait
}

compiledebug() { cat ./main.c && gcc -g main.c "$object" -static && wait && echo size of "$path" is $( wc -c < "$path" ) && declare -p path objectfile object start end
}

compilemultidebug() { cat ./main.c && gcc -g main.c $objectlist -static && wait
}

fin() { printf '
  free( dummy );
  printf("Extracted\\n");
  return 0;
    }

' >> main.c
}

finmulti() { printf '
  free( dummy );
  printf("Extracted\\n");
  return 0;
    }

' >> main.c
}

finish() { if [[ -f "$path" || -f "$replacement" ]] ; then
cd "$origin"
    printf "\
    package created \n\
"
fi
}

finishdebug() { if [[ -f "$path" || -f "$replacement" ]] ; then
pwd
printf "\
    path=        $(ls -Ls ""$path"" )\n\
    object=      $(ls -Ls ""$object"")\n\
    replacement= $(ls -Ls ""$replacement"")\n\
    output=      $(ls -Ls ./""$object""'bject')\n\
    package created \n\
"
cd "$origin"
fi
}

finishmulti() { if [[ -f "$path" || -f "$replacement" ]] ; then
cd "$origin"
    printf "\
    \n\
package created with $(echo "${objectlist[@]}" | tr ' ' '\n' | wc -l) embeddable files ($(find "$origin"/Converted/Multi | grep "\.o$" | wc -l) recorded files, $(find "$pathreal" -type f | wc -l) physical files, $(find "$pathreal" -type d | wc -l) physical directories, $(echo "${objectlist[@]}" | tr ' ' '\n' | grep -v ^$ | wc -l) non-empty files worth $(echo "${objectlist[@]}" | wc -c) characters, $(echo "${objectlist[@]}" | tr ' ' '\n' | grep ^$ | wc -l) empty, $(echo "${objectlist[@]}" | tr ' ' '\n' | uniq -D | wc -l) duplicates, $(echo "${symlinksreal[@]}" | tr ' ' '\n' | wc -l) symlinks, $(echo "${fifosreal[@]}" | tr ' ' '\n' | wc -l) fifo's (named pipes), and $(echo "${socketsreal[@]}" | tr ' ' '\n' | wc -l) sockets) \n\
    "
fi
}

finishmultidebug() { if [[ -f "$path" || -f "$replacement" ]] ; then
pwd
printf "\
    objects= $(ls -L $objectlist | tr "\n" " ")\n\
    output=  $(ls -Ls ./a.out) \n\
    package created \n\
"
cd "$origin"
fi
}

replacement="$(whereis "$1" | cut -d ' ' -f2)"

origin=$(pwd)
# im just going to assume that $0 will NEVER ever contain any of a script's arguments in any cercimstance
path="$1"

if [[ -d "$path" ]]; then
    echo "$path" is a directory
#    stat -c %a ./test/2 # permisions in chmod format
#    stat -c %F ./test/2 # type
    stripped="$(strippath "$path" )"
    pathreal="$(readlink -f "$path" )"
    pathdir="$(dirname "${pathreal[i]}")"
    pathdir="$pathdir/"
    pathbaseprefix=("${pathreal[i]#$pathdir}")
    mapfile -d '' -t blocksreal < <(find "${pathreal[0]}" '(' -not -type d ')' -not -empty -type b -print0)
    
    mapfile -d '' -t characterall < <(find "${pathreal[0]}" '(' -not -type d ')' -not -empty -type c -print0)
    
    mapfile -d '' -t dirsreal < <(find "${pathreal[0]}" -type d -print0)
    mapfile -d '' -t fifosreal < <(find "${pathreal[0]}" '(' -not -type d ')' -not -empty -type p -print0)
    
    mapfile -d '' -t filesreal < <(find "${pathreal[0]}" '(' -not -type d ')' -not -empty -type f -print0)

    mapfile -d '' -t emptyreal < <(find "${pathreal[0]}" '(' -not -type d ')' -empty -type f -print0)
    
    mapfile -d '' -t symlinksreal < <(find "${pathreal[0]}" '(' -not -type d ')' -not -empty -type l -print0)
    
    mapfile -d '' -t socketsreal < <(find "${pathreal[0]}" '(' -not -type d ')' -not -empty -type s -print0)
    if [[ -z ${dirsreal[@]} && -z ${fifosreal[@]} && -z ${filesreal[@]} && -z ${emptyreal[@]} && -z ${symlinksreal[@]} ]] ; then
        fatal2
    fi
    orgp="$(pwd)"
    preinitmulti
    orgp2="$(pwd)"
    for i in ${!filesreal[@]}
    do
        pathdir="$(dirname "${filesreal[i]}")"
        pathdir="$pathdir/"
        pathbase=("${filesreal[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        objectconvertMulti "${filesreal[i]}" "$i" "$pathstripped" "${pathbase[0]}" "$(stat -c '%05a' "${filesreal[i]}")"
        echo "${filesreal[i]}" processed
    done
    cd "$orgp"
    for i in ${!emptyreal[@]}
    do
        pathdir="$(dirname "${emptyreal[i]}")"
        pathdir="$pathdir/"
        pathbase=("${emptyreal[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        mkemptyfile "$pathstripped" "${pathbase[0]}" "$(stat -c '%05a' "${emptyreal[i]}")" "emp$i"
        echo "${emptyreal[i]}" processed
    done
    for i in "${!symlinksreal[@]}"
    do
        echo "${symlinksreal[i]}" is a symlink, following...
        pathdir="$(dirname "${symlinksreal[i]}")"
        pathdir="$pathdir/"
        cd "$pathdir"
        pathbase=("${symlinksreal[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        symlinkorigin+=("${symlinksreal[i]}")
        symlinkvalue+=("$(readlink "${symlinksreal[i]}")")
        symlinktypevalue+=("$(stat -c %F "${symlinkvalue[i]}")")
#         echo "symlinkorigin    = ${symlinkorigin[i]}"
#         echo "symlinkvalue     = ${symlinkvalue[i]}"
#         echo "symlinktypevalue = ${symlinktypevalue[i]}"
        if [[ ${symlinktypevalue[i]} != "symbolic link" ]]
        then
            symlinkfullpath+=("$(readlink -f $(readlink "${symlinksreal[i]}"))")
            symlinktypepath+=("$(stat -c %F "${symlinkfullpath[i]}")")
#             echo "symlinkfullpath  = ${symlinkfullpath[i]}"
#             echo "symlinktypepath  = ${symlinktypepath[i]}"
            if [[ ! -e ${symlinkfullpath[i]} ]] ; then
            fatal4 "${symlinkfullpath[i]}" "${symlinktypepath[i]}"
            elif [[ -S ${symlinkfullpath[i]} ]] ; then
            type='socket'
            fatal4 "${symlinkfullpath[i]}" "${symlinktypepath[i]}"
            elif [[ -p ${symlinkfullpath[i]} ]] ; then
            type='named pipe (fifo)'
            fatal4 "${symlinkfullpath[i]}" "${symlinktypepath[i]}"
            elif [[ -c ${symlinkfullpath[i]} ]] ; then
            type='character'
            fatal4 "${symlinkfullpath[i]}" "${symlinktypepath[i]}"
            elif [[ -b ${symlinkfullpath[i]} ]] ; then
            type='block'
            fatal4 "${symlinkfullpath[i]}" "${symlinktypepath[i]}"
            elif [[ ! -s ${symlinkfullpath[i]} ]] ; then
            type='empty'
            pathdir="$(dirname "${symlinkfullpath[i]}")"
            pathdir="$pathdir/"
            pathbase=("${symlinkfullpath[i]#$pathdir}")
            pathstripped=("${pathdir#$stripped}")
            mkemptyfile "$pathstripped" "${pathbase[0]}" "$(stat -c '%05a' "${symlinkfullpath[i]}")" "sym$i"
            echo "${symlinkfullpath[i]}" processed
#             fatal4 "${symlinkfullpath[i]}" "${symlinktypepath[i]}"
    #         elif [[ -f $path ]] ; then
    #         type='regular'
    #         fatal4
            fi
        else
            symlinkfullpath+=("null")
        fi
    cd "$orgp"
    done
    for i in ${!symlinkvalue[@]}
    do
    cd "$orgp"
        echo "${symlinkorigin[i]} is a symlink to ${symlinkvalue[i]} (${symlinkfullpath[i]}) with type ${symlinktypevalue[i]}"
        pathdir="$(dirname "${symlinkorigin[i]}")"
        pathdir="$pathdir/"
        cd "$pathdir"
        pathbase=("${symlinkorigin[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        mksymlink "$pathstripped" "${pathbase[0]}" "${symlinkvalue[i]}" "$(stat -c '%05a' "${symlinkorigin[i]}")"
        echo "${symlinkorigin[i]}" processed
    cd "$orgp"
    done
    cd "$orgp2"
    for i in ${!fifosreal[@]}
    do
        pathdir="$(dirname "${fifosreal[i]}")"
        pathdir="$pathdir/"
        pathbase=("${fifosreal[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        mkfifoC "$pathstripped" "${pathbase[0]}" "$(stat -c '%05a' "${fifosreal[i]}")"
        echo "${fifosreal[i]}" processed
    done
    for i in ${!socketsreal[@]}
    do
        pathdir="$(dirname "${socketsreal[i]}")"
        pathdir="$pathdir/"
        pathbase=("${socketsreal[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        mksocket "$pathstripped" "${pathbase[0]}" "$(stat -c '%05a' "${socketsreal[i]}")"
        echo "${socketsreal[i]}" processed
    done
    for i in ${!dirsreal[@]}
    do
        pathdir="$(dirname "${dirsreal[i]}")"
        if [[ $pathdir = "/" ]]
            then
                pathdir=
        fi
        pathdir="$pathdir/"
        pathbase=("${dirsreal[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        if [[ $pathstripped = "/" ]]
            then
                pathstripped=
        fi
        mkdirs "$pathstripped$pathbase"
        echo "${dirsreal[i]}" processed
    done
    for i in ${!dirsreal[@]}
    do
        pathdir="$(dirname "${dirsreal[i]}")"
        if [[ $pathdir = "/" ]]
            then
                pathdir=
        fi
        pathdir="$pathdir/"
        pathbase=("${dirsreal[i]#$pathdir}")
        pathstripped=("${pathdir#$stripped}")
        if [[ $pathstripped = "/" ]]
            then
                pathstripped=
        fi
        chmoddir "$pathstripped$pathbase" "$(stat -c '%05a' "${dirsreal[i]}")"
        echo "$pathstripped$pathbase" processed
    done
    finmulti
    compilemulti
    finishmulti
    exit
elif [ "$(printf '%s\n' "$path" | grep -e ^"/")" ]; then
    if [[ -L $path ]] ; then
    echo $path is a symlink, following...
    path="$(readlink $path)"
        if [[ ! -e $path ]] ; then
        fatal
        elif [[ -S $path ]] ; then
        type='socket'
        fatal3
        elif [[ -p $path ]] ; then
        type='named pipe (fifo)'
        fatal3
        elif [[ -c $path ]] ; then
        type='character'
        fatal3
        elif [[ -b $path ]] ; then
        type='block'
        fatal3
        elif [[ ! -s $path ]] ; then
        type='empty'
        fatal3
#         elif [[ -f $path ]] ; then
#         type='regular'
#         fatal3
        fi
    elif [[ ! -e $path ]] ; then
    fatal
    elif [[ -S $path ]] ; then
    type='socket'
    fatal3
    elif [[ -p $path ]] ; then
    type='named pipe (fifo)'
    fatal3
    elif [[ -c $path ]] ; then
    type='character'
    fatal3
    elif [[ -b $path ]] ; then
    type='block'
    fatal3
    elif [[ ! -s $path ]] ; then
    type='empty'
    fatal3
#     elif [[ -f $path ]] ; then
#     type='regular'
#     fatal3
    fi
    path="$path"
elif [ "$(printf '%s\n' "$path" | grep -e ^"./" -e ^"../")" ]; then
    if [[ -L $path ]] ; then
    echo $path is a symlink, following...
    symlinkvalue="$(readlink $path)"
    symlinkfullpath="$(readlink -f "$(readlink $path)")"
    stat -c %F "$symlinkfullpath"
    declare -p symlinkfullpath symlinkvalue
    path=$symlinkfullpath
        if [[ ! -e $path ]] ; then
        fatal
        elif [[ -S $path ]] ; then
        type='socket'
        fatal3
        elif [[ -p $path ]] ; then
        type='named pipe (fifo)'
        fatal3
        elif [[ -c $path ]] ; then
        type='character'
        fatal3
        elif [[ -b $path ]] ; then
        type='block'
        fatal3
        elif [[ ! -s $path ]] ; then
        type='empty'
        fatal3
#         elif [[ -f $path ]] ; then
#         type='regular'
#         fatal3
        fi
    elif [[ ! -e $path ]] ; then
    fatal
    elif [[ -S $path ]] ; then
    type='socket'
    fatal3
    elif [[ -p $path ]] ; then
    type='named pipe (fifo)'
    fatal3
    elif [[ -c $path ]] ; then
    type='character'
    fatal3
    elif [[ -b $path ]] ; then
    type='block'
    fatal3
    elif [[ ! -s $path ]] ; then
    type='empty'
    fatal3
#     elif [[ -f $path ]] ; then
#     type='regular'
#     fatal3
    fi
    echo converting "$path" to absolute path
    pathfile=("$(find "$path" -type f)")
    pathfilefull+=("$(readlink -f "${pathfile[i]}")")
    echo converted to absolute path
    path="$pathfilefull"
elif [[ -f "$replacement" ]]; then
    : > /dev/null
else
    fatal
fi

if [[ -f "$path" ]] ; then
   objectconvert "$path"
   fin
   compile
   finish
   exit
elif [[ -f "$replacement" ]] ; then
    echo Warning: "$path" does not exist however "$replacement" does, using "$replacement"
    objectconvert "$replacement"
    fin
    compile
    finish
    exit
else
    fatal
fi