#!/bin/bash
# -*- ENCODING: UTF-8 -*-

# pica-ii
#
# Install to internal disk.
#
# Copyright (c) 2013-2026: Alexis Puente Montiel   < pica (a) picalibre.org >
#
# Licensed according to GNU AGPL version 3.0.
#
# It is libre/free software; you can use, redistribute and/or modify it according to the terms of GNU AGPL as published by GNU, version 3.0, 19 November 2007.
#
# It is distributed in the hope that it will be useful, but without any warranty. Read GNU AGPL version 3.0 for additional details.
#
# A copy of GNU AGPL version 3.0 is available at /usr/share/doc/<software-package-name>/agpl-3.0.txt (additionally on Internet as text at https://www.gnu.org/licenses/agpl-3.0.txt and as HTML at https://www.gnu.org/licenses/agpl-3.0-standalone.html ).
#
# Note: Additionally to the official e-mails, picalibre.org is strictly the only official site for this software project, please consider using it to download, report bugs and contribute.
#
# Depends: apt, bash, bc, coreutils, dialog | yad | yad-pica | zenity, debconf, dpkg, findutils, gawk | mawk | original-awk, gparted | parted | partitionmanager, grep, initramfs-tools, libc-bin, lsof, mount, passwd, procps, rsync, sed, util-linux
# Recommends: console-setup, locales | locales-all, lxterminal | sakura | xfce4-terminal, menu, pica-skel, tzdata, x11-xkb-utils, xkb-data
# Suggests: btrfs-progs, cryptsetup, cryptsetup-initramfs, dmsetup, dosfstools, e2fsprogs, efibootmgr, expect, inetutils-ping | iputils-ping, lvm2, mdadm, nilfs-tools, ntfs-3g, symlinks, tcplay, wget


### SCRIPT VARIABLES ########################################

CNAME="pica-ii"
VERSION="1.3.1"
TITLE="Pica-II"
ICON="/usr/share/icons/pica-ii.png"

# Location of dependent lib files
LIBDEP=/usr/share/$CNAME

# Translations
if [ "$LANG" = "" ] ; then export $(cat /etc/default/locale | grep -a 'LANG=') ; fi
TEXTDOMAIN=pica-ii
TEXTDOMAINDIR=/usr/share/locale/

# Write errors to log
ERRORLOG="$HOME/.${CNAME}.log"
if [ -e "$ERRORLOG" ] ; then
	mv -f $ERRORLOG ${ERRORLOG}.ant
fi
if [ -e "$ERRORLOG" ] ; then rm -rf "$ERRORLOG" ; fi

if [ "$(echo "$*" | grep -a '\-s' )" != "" ] ; then
DEBUG="N"
else
for i in /etc/pica-global.dist /etc/pica-global.orig /etc/pica-global /etc/pica-global.local ~/.pica-global ~/pica-global ; do
	if [ -f "$i" ] ; then
	cat "$i"
	source "$i"
	source <(cat $i | sed -e "s/=\(YES\|Yes\|yes\|y\|SÍ\|SI\|Sí\|Si\|sí\|si\|S\|s\)/=Y/g" -e "s/=\(No\|no\|n\)/=N/g" -e "s/=\"\(YES\|Yes\|yes\|y\|SÍ\|SI\|Sí\|Si\|sí\|si\|S\|s\)\"/=Y/g" -e "s/=\"\(No\|no\|n\)\"/=N/g")
	fi
done
fi
if [ "$DEBUG" = "Y" ] ; then
	set -xv
	DEBUG="Y"
else
	ERRORLOG="/tmp/.${CNAME}_$(id -nu).log"
	if [ -e "$ERRORLOG" ] ; then mv -f $ERRORLOG ${ERRORLOG}.ant ; fi
	if [ -e "$ERRORLOG" ] ; then rm -rf "$ERRORLOG" ; fi
fi
#if [ "$DEBUG" = "" ] ; then DEBUG="N" ; fi
if [ "$DEBUG" != "N" ] ; then
exec > >(tee -a "$ERRORLOG") 2>&1
echo "$0" "$*" >> "$ERRORLOG"
echo "$CNAME" "$VERSION" >> "$ERRORLOG"
echo $(date +%Y-%m-%d_%H:%M:%S) $"Start" >> "$ERRORLOG"
echo "env:" >> "$ERRORLOG"
env >> "$ERRORLOG"
echo "set:" >> "$ERRORLOG"
set >> "$ERRORLOG"
#else
#exec 2>>"$ERRORLOG"
fi

# Description:
BDESCRIP=$"Install to internal disk."
LDESCRIP=$"$TITLE is a tool to install the operating system to the internal disk."

# Documentation:
docu_info () {
echo "$CNAME ($VERSION) - $BDESCRIP"
echo 
echo $"Usage:" $CNAME [$"OPTIONS"]
echo 
echo $"Options:"
echo -e "$ODESCRIP"
echo 
echo $"'man $CNAME' for more information."
echo 
}
ODESCRIP=" -s""\t"$"Do not show detailed information.""\n"" -t""\t"$"Use terminal interface.""\n"" -k""\t"$"Use 'kdialog' if possible.""\n"" -y""\t"$"Use 'yad' if possible (by default in graphical sessions).""\n"" -z""\t"$"Use 'zenity' if possible.""\n"" -x""\t"$"Show help documentation.""\n\n"$"Optionally, it is possible to set variables in a '/tmp/iivar' file."

while getopts tkyzxs OPTION ; do
	case $OPTION in
		t )   T="Y" ; G="N"      ;;
		k )   SDIALOG="kdialog"  ;;
		y )   SDIALOG="yad"      ;;
		z )   SDIALOG="zenity"   ;;
		x )   docu_info ; exit 0 ;;
		s )   true               ;;
	esac
done

# Options:

# The following lines is only for 'recommended name' purposes:
DISTROLABEL="picalibre"
#if [ "$(cat /etc/picalibre_version | cut -d '.' -f 1 )" != "" ] ; then
#	DISTROLABEL="picalibre-$(cat /etc/picalibre_version | cut -d '.' -f 1 )"
#else
#	DISTROLABEL="picalibre"
#fi

# $DTMP
DTMP=/dtmp


### DIALOG ########################################

#DEFAULTDIALOGLIST="yad zenity kdialog"
DEFAULTDIALOGLIST="yad zenity"

#if [ -t 0 ] ; then
if [ "$(setxkbmap 1>/dev/null 2>&1 ; echo $? )" -ne 0 ] ; then
	G="N" ; T="Y"
fi

if [ "$G" != "N" ] ; then
	
	if   [ "$SDIALOG" = "kdialog" ] ; then
		DIALOGLIST="kdialog yad zenity"
	elif [ "$SDIALOG" = "yad" ] ; then
		DIALOGLIST="yad zenity kdialog"
	elif [ "$SDIALOG" = "zenity" ] ; then
		DIALOGLIST="zenity yad kdialog"
	else
		DIALOGLIST="$DEFAULTDIALOGLIST"
	fi
	
	if [ "$DIALOGLIST" = "" ] ; then
		if [ "$DEFAULTDIALOGLIST" != "" ] ; then
			DIALOGLIST="$DEFAULTDIALOGLIST"
		else
			DIALOGLIST="yad zenity kdialog"
		fi
	fi
	
	if [ "$(command -v $DIALOGLIST)" = "" ] ; then
		G="N" ; T="Y"
	fi

fi


if [ "$G" = "N" ] ; then

	if [ "$(command -v dialog)" = "" ] ; then
		echo $"ERROR: No supported dialog is installed. $TITLE cannot continue."
		exit 1
	else
		
		DIALOG="dialog --cr-wrap --keep-window --output-fd 1"
		#DIALOG="dialog --cr-wrap --keep-window --output-fd 1 --no-lines --no-shadow"
		if [ "$TITLE" != "" ] ; then
			WICON="--backtitle $(echo $TITLE | sed 's| |-|g')"
		fi
		WTITLE="--title"
		WTEXT=""
		H="0"
		W="0"
		LH="0"
		CALENDAR="--calendar"
		DATEFORMAT="--date-format %Y-%m-%d"
		WTIME="--timebox"
		TIMEFORMAT="--time-format %H:%M:%S"
		DSEL="--dselect"
		FSEL="--fselect"
		WRITE="--inputbox"
		PREWRITE=""
		COLUMN=""
		PRINTCOLUMN1=""
		PRINTCOLUMN2=""
		HIDECOLUMN1=""
		HIDECOLUMN2=""
		#INPUTSEPARATOR="--column-separator"
		#OUTPUTSEPARATOR="--separate-output"
		MONOLIST="--menu"
		#MONOLIST="--radiolist"
		MULTIPLELIST="--separate-output --checklist"
		PRE=""
		POST="off"
		PRES=""
		POSTS="on"

		INFO="--msgbox"
		WAIT="--infobox"

		QYN="--yesno"
		QYNC="--yesno"
		WYN="--yesno"
		WCC="--yesno"
		WYNC="--yesno"
		WM="--msgbox"
		ERROR="--msgbox"

		FORM="--form"
		FORMT=""
		FORMSELPRE=""
		FORMSELPOST=""
		#FORMCALPRE=""
		#FORMCALPOST=""
		#FORMCLPRE=""
		#FORMCLPOST=""
		PRELAB1="1 1"
		POSTLAB1="1 10 999 0"
		PRELAB2="2 1"
		POSTLAB2="2 10 999 0"
		PRELAB3="3 1"
		POSTLAB3="3 10 999 0"

		YES="--yes-label"
		NO="--no-label"
		OK="--ok-label"
		CONTINUE="--ok-label"
		CANCEL="--cancel-label"
		EXTRABUTTON="--extra-button --extra-label"
	
	fi

else

	for i in $DIALOGLIST ; do

		if [ "$(command -v $i)" != "" ] ; then
	
			if [ "$i" = "yad" ] ; then
		
				if [ "$(yad --version | tail -n 1 | cut -d ' ' -f 1 | cut -d '.' -f 1)" -lt 2 ] ; then
					DIALOG="yad --center"  # --selectable-labels (bug in Yad < 2.0) https://github.com/v1cont/yad/blob/master/NEWS
				else
					DIALOG="yad --center --selectable-labels"  # --on-top
				fi
				if [ "$ICON" != "" ] ; then
					WICON="--window-icon $ICON"
				fi
				WTITLE="--title"
				WTEXT="--text"
				H=""
				if [ "$(yad --version | tail -n 1 | grep -aE ^'7.2')" != "" ] ; then
					W="--width=640"
				else
					W="--width=640 --text-width=640 --fixed"  # https://github.com/v1cont/yad/issues/107  https://github.com/v1cont/yad/issues/140
				fi
				LH=""
				CALENDAR="--calendar"
				DATEFORMAT="--date-format %Y-%m-%d"
				WTIME="--separator=\n --columns 3 --form"
				#TIMEFORMAT="--time-format %H:%M:%S"
				DSEL="--file --directory --filename"  # Deleted *-selection alias for --file in Yad 4.0
				FSEL="--file --filename"              # Deleted *-selection alias for --file in Yad 4.0
				WRITE="--entry"
				PREWRITE="--entry-text"
				COLUMN="--column="
				PRINTCOLUMN1="--print-column=01"
				PRINTCOLUMN2="--print-column=02"
				HIDECOLUMN1="--hide-column=01"
				HIDECOLUMN2="--hide-column=02"
				#INPUTSEPARATOR="--item-separator"
				#OUTPUTSEPARATOR="--separator="
				#MONOLIST="--entry"
				MONOLIST="--separator=\n --list --search-column=1 --no-headers"
				MONOLISTH="--separator=\n --list --search-column=1"
				MULTIPLELIST="--separator= --list --checklist --search-column=2 --no-headers"
				MULTIPLELISTH="--separator= --list --checklist --search-column=2"
				PRE="FALSE"
				POST=""
				PRES="TRUE"
				POSTS=""
				# standard gtk keybindings for next and previous search are ctrl+g and ctrl+shift+g while you can redefine them in gtk-keys.css for your theme  # https://github.com/v1cont/yad/issues/127
			
				INFO="--image=/usr/share/icons/picalibre/rm/play.png --button="$"OK"
				WAIT="--image=/usr/share/icons/picalibre/rm/play.png --no-buttons"
			
				QYN="--image=/usr/share/icons/picalibre/rm/question.png --button="$"Yes"":0 --button="$"No"":1"
				QYNC="--image=/usr/share/icons/picalibre/rm/question.png --button="$"Yes"":0 --button="$"No"":1 --button="$"Cancel"":1"
				WYN="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"Yes"":0 --button="$"No"":1"
				WCC="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"Continue"":0 --button="$"Cancel"":1"
				WYNC="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"Yes"":0 --button="$"No"":1 --button="$"Cancel"":1"
				WM="--image=/usr/share/icons/picalibre/rm/warning.png --button="$"OK"
				ERROR="--image=/usr/share/icons/picalibre/rm/error.png --button="$"OK"
			
				FORM="--separator=\n --form"
				FORMT="--field"
				FORMSELPRE="--field"
				FORMSELPOST=":FL"
				FORMCALPRE="--field"
				FORMCALPOST=":DT"
				FORMCLPRE="--field"
				FORMCLPOST=":CB"
				PRELAB1=""
				POSTLAB1=""
				PRELAB2=""
				POSTLAB2=""
				PRELAB3=""
				POSTLAB3=""
			
				YES="--button"
				NO="--button"
				OK="--button"
				CONTINUE="--button"
				CANCEL="--button"
				EXTRABUTTON="--button"
		
			elif [ "$i" = "zenity" ] ; then
		
				DIALOG="zenity"
				if [ "$ICON" != "" ] ; then
					WICON="--window-icon $ICON"
				fi
				WTITLE="--title"
				WTEXT="--text"
				H=""
				W="--width=640"
				LH=""
				CALENDAR="--calendar"
				DATEFORMAT="--date-format %Y-%m-%d"
				WTIME="--separator : --forms"
				#TIMEFORMAT="--time-format %H:%M:%S"
				DSEL="--file-selection --directory --filename"
				FSEL="--file-selection --filename"
				WRITE="--entry"
				PREWRITE="--entry-text"
				COLUMN="--column="
				PRINTCOLUMN1="--print-column=01"
				PRINTCOLUMN2="--print-column=02"
				HIDECOLUMN1="--hide-column=01"
				HIDECOLUMN2="--hide-column=02"
				#INPUTSEPARATOR=""
				#OUTPUTSEPARATOR="--separator=\n"
				MONOLIST="--separator=\n --list --hide-header"
				MONOLISTH="--separator=\n --list"
				MULTIPLELIST="--separator=\n --list --checklist --hide-header"
				MULTIPLELISTH="--separator=\n --list --checklist"
				PRE="FALSE"
				POST=""
				PRES="TRUE"
				POSTS=""
			
				INFO="--info"
				WAIT="--info"
			
				QYN="--question"
				QYNC="--question"
				WYN="--question"
				WCC="--question"
				WYNC="--question"
				WM="--warning"
				ERROR="--error"
			
				FORM="--forms"
				FORMT="--add-entry"
				FORMSELPRE="--add-entry"
				FORMSELPOST=""
				FORMCALPRE="--add-calendar"
				FORMCALPOST=""
				if [ "$(zenity --version | cut -d '.' -f 1 )" -ge 3 ] || [ "$(zenity --version | sed 's|\.||g')" -ge 3102 ] ; then
					FORMCLPOST="--combo-values"
					FORMCLPRE="--add-combo"
				fi
				PRELAB1=""
				POSTLAB1=""
				PRELAB2=""
				POSTLAB2=""
				PRELAB3=""
				POSTLAB3=""
			
				# Zenity <3 does not support custom buttons.
				if [ "$(zenity --version | cut -d '.' -f 1 )" -ge 3 ] ; then
					YES="--ok-label"
					NO="--cancel-label"
					OK="--ok-label"
					CONTINUE="--ok-label"
					CANCEL="--cancel-label"
					#EXTRABUTTON=""
				fi
		
#			elif [ "$i" = "kdialog" ] ; then
#		
#				# CAUTION: All 'kdialog' (TDE, KDE Plasma 4, KDE Plasma 5, KDE Plasma 6,...) are included here!
#			
#				DIALOG="kdialog"
#				if [ "$ICON" != "" ] ; then
#					WICON="--icon $ICON"
#				fi
#				WTITLE="--title"
#				WTEXT=""
#				H=""
#				W=""
#				LH=""
#				# No "--calendar" in TDE-kdialog + No "--date-format" both TDE and Plasma = There is no usable version of kdialog for calendars
#				#CALENDAR="--calendar"
#				#DATEFORMAT="--date-format %Y-%m-%d"
#				#WTIME="--timebox"
#				#TIMEFORMAT="--time-format %H:%M:%S"
#				DSEL="--getexistingdirectory"
#				FSEL="--getsavefilename"
#				#FSEL="--getopenfilename"
#				WRITE="--inputbox"
#				PREWRITE=""
#				COLUMN=""
#				PRINTCOLUMN1=""
#				PRINTCOLUMN2=""
#				HIDECOLUMN1=""
#				HIDECOLUMN2=""
#				#INPUTSEPARATOR=""
#				#OUTPUTSEPARATOR="--separate-output"
#				MONOLIST="--menu"
#				#MONOLIST="--combobox"
#				#MONOLIST="--radiolist"
#				MULTIPLELIST="--separate-output --checklist"
#				PRE=""
#				POST="off"
#				PRES=""
#				POSTS="on"
#			
#				INFO="--msgbox"
#				WAIT="--msgbox"
#			
#				QYN="--yesno"
#				QYNC="--yesnocancel"
#				WYN="--warningyesno"
#				WCC="--warningcontinuecancel"
#				WYNC="--warningyesnocancel"
#				WM="--sorry"
#				ERROR="--error"
#			
#				# No "--form" in any kdialog version
#				#FORM="--form"
#				#FORMT=""
#				#FORMSELPRE=""
#				#FORMSELPOST=""
#				#FORMCALPRE=""
#				#FORMCALPOST=""
#				#FORMCLPRE=""
#				#FORMCLPOST=""
#				#PRELAB1=""
#				#POSTLAB1=""
#				#PRELAB2=""
#				#POSTLAB2=""
#				#PRELAB3=""
#				#POSTLAB3=""
#			
#				# TDE-kdialog does not support custom buttons.
#				if [ "$(kdialog --version | grep -a Qt | grep -aEo "[0-9]" | head -n 1)" -ge 4 ] || [ "$(kdialog --version | grep -aEi kdialog | grep -aEo "[0-9]" | head -n 1)" -gt 1 ] ; then
#					YES="--yes-label"
#					NO="--no-label"
#					OK="--continue-label"
#					CONTINUE="--continue-label"
#					CANCEL="--cancel-label"
#					EXTRABUTTON="--cancel-label"
#				fi
		
			else
		
				true
		
			fi
		
		if [ "$DIALOG" != "" ] ; then break ; fi
		
		fi

	done

fi

if [ "$DIALOG" = "" ] ; then
	echo $"ERROR: No supported dialog is installed. $TITLE cannot continue."
	exit 1
fi


### TERMINAL SELECTION ########################################

if [ "$G" != "N" ] && [ "$(command -v lxterminal sakura xfce4-terminal)" = "" ] ; then $DIALOG $WICON $WTITLE "$TITLE" $WM    $WTEXT $"WARNING: Neither 'lxterminal', nor 'sakura' nor 'xfce4-terminal' are installed, $TITLE might fail." $H $W ; fi

TERMINAL () {
if [ "$G" = "N" ] ; then
	if [ "$TT" != "$TITLE" ] ; then echo "$TT" ; sleep 1 ; fi
	$COM
else
	if [ "$(command -v sakura)" != "" ] ; then
#		sakura -t "$TT" -e "$COM"  # https://bugs.debian.org/782396
		sakura -t "$TT" -x "$COM"  # sakura '-e' bug en Debian 13 "Trixie": Segment violation
	elif [ "$(command -v lxterminal)" != "" ] ; then
		lxterminal -t "$TT" -e "$COM"
	elif [ "$(command -v xfce4-terminal)" != "" ] ; then
		xfce4-terminal -T "$TT" -e "$COM"
	else
		x-terminal-emulator -t "$TT" -e "$COM"
	fi
fi
}


### ROOT CHECK ########################################

#if [ "$(cat /etc/passwd | grep -aE ^$(whoami): | cut -d ':' -f 3 )" -ne 0 ] ; then
if [ "$(id -u)" -ne 0 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"$TITLE must be launched as SuperUser.\n\nCannot continue." $H $W
	exit 1
fi
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/trinity/bin


### BASICFUN ########################################

ESP=$(printf '\302\240')

clean () {
if [ "$DEBUG" = "Y" ] ; then set +xv ; fi
if [ -n "$NEWUSERPASS" ] ; then  sed -i "s|$NEWUSERPASS|__NEWUSERPASS__|g" $ERRORLOG  ; fi
if [ -n "$NEWROOTPASS" ] ; then  sed -i "s|$NEWROOTPASS|__NEWROOTPASS__|g" $ERRORLOG  ; fi
if [ -n "$GUESTPASS"   ] ; then  sed -i "s|$GUESTPASS|__GUESTPASS__|g"     $ERRORLOG  ; fi
if [ -n "$LUKSPASS"    ] ; then  sed -i "s|$LUKSPASS|__LUKSPASS__|g"       $ERRORLOG  ; fi
if [ -n "$TCPASS"      ] ; then  sed -i "s|$TCPASS|__TCPASS__|g"           $ERRORLOG  ; fi
exec > >(tee -a "$ERRORLOG") 2>&1 ; if [ "$DEBUG" = "Y" ] ; then set -xv ; fi
if [ -e /tmp/iivar ] ; then cp -v /tmp/iivar /tmp/iivar_$(date +%Y%m%d_%H%M%S) ; fi
if [ -e $DTMP/chroot.log ] ; then mv -f $DTMP/chroot.log $HOME/chroot.log ; fi
rm -f $DTMP/iivar $DTMP/chrootscript $DTMP/chroot.log /dtmp/iivar /dtmp/chrootscript /dtmp/chroot.log /tmp/etc_fstab
rmdir /dtmp $DTMP
if [ "$CUSTOMEXCLUDE" = "" ] ; then rm -rf /tmp/exclude.list ; fi
unset COREBOOT COREBOOTTEXT EFICHECKTEXT EFIDET RECPARTS PARTOPT AUTOPROP AUTODEVTYPE AUTODEV AUTODEVDISK AUTODEVNPART AUTODTT CRYPTACTIVEPARTS LVMACTIVEPARTS BTRFSRAIDACTIVEPARTS MDADMACTIVEPARTS FINALRAIDPARTS HOMEFINALRAIDPARTS IPART HOMEPART DATAPART SWAPPART EFIPART CUSTOMPARTS FSIPART SEPARATE_HOME FSHOME SEPARATE_DATA FSDATA LABELIPART LABELHOME LABELDATA SNAPMETHOD NEWHOSTNAME NEWUSERNAME NEWUSERREALNAME NEWUSERPASS NEWROOTPASS GUESTNAME GUESTUSERNAME GUESTREALNAME GUESTPASS AUTOLOGIN LUKSPASS TCPASS LUKSTYPE GRUBVERSEL GRUBINSLOC
}

check_exit () {

TAILERRORLOG=$(cat "$ERRORLOG" | grep -aE "[a-zA-Z0-9\=\[]" | tail -n 10 )

echo $(date +%Y-%m-%d_%H:%M:%S)

clean

#if [ "$(cat /etc/passwd | grep -aE ^$(whoami): | cut -d ':' -f 3 )" -eq 0 ] ; then
if [ "$(id -u)" -eq 0 ] && [ "$DEBUG" = "Y" ] ; then
	RECERRORLOG="$ERRORLOG"
	for i in $(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | awk '{print $2}') ; do AUSER=$(users | sed 's| |\n|g' | grep -aE "^$i$" | head -n 1) ; if [ "$AUSER" != "" ] ; then
		HOMEERRORLOG=/home/$i/.${CNAME}.log
		RECERRORLOG="$RECERRORLOG $HOMEERRORLOG "
		cp -v --remove-destination $ERRORLOG $HOMEERRORLOG
		if [ "$(id -nu $i)" != "" ] ; then chown $(id -nu $i):$(id -ng $i) $HOMEERRORLOG ; else chown 1000:1000 $HOMEERRORLOG ; fi
		chmod 600 $HOMEERRORLOG ; if [ "$(stat -c %U $HOMEERRORLOG)" != "$i" ] ; then chmod 666 $HOMEERRORLOG ; fi
		break
	fi ; done
fi

$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"Stop due to error.\n\n$TAILERRORLOG\n" $H $W

exit 1

}

# "try again or exit" dialog window
input_error () {

echo $(date +%Y-%m-%d_%H:%M:%S)

$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"Something went wrong.\n\nDo you want to try again?" $H $W

if [ "$?" -ne 0 ] ; then
	clean
	exit 1
else
	$REFUN
fi

}


### ALREADY RUNNING ########################################

if [ "$CNAME" != "" ] && [ "$(lsof /usr/bin/$CNAME 2>>$ERRORLOG | grep -ai -c $CNAME)" -gt 1 ] ; then

	REPE=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"$CNAME seems to be already working. Having $CNAME working multiple times at the same time may cause problems.\n\nStop them all is recommended.\n\nPlease select an option:" $H $W $LH $COLUMN $COLUMN \
	$"Continue" " " \
	$"Stop now" " " \
	$"Stop them all" " " \
	| head -n 1 )

	if [ "$?" -ne 0 ] || [ "$REPE" = "" ] ; then
		exit 0
	fi

	case $REPE in

		$"Continue" )
			true
		;;

		$"Stop now" )
			exit 0
		;;

		$"Stop them all" )
			clean
			kill $(echo $(ps aux | grep -a "$CNAME" | grep -av 'grep ' | awk '{print $2}'))
		;;

	esac

fi


### LIVE CHECK ########################################

#if [ "$(cat /proc/cmdline | grep -aEi "boot=live| live-config | live-config$| live | live$|=live |=live$")" != "" ] || [ "$(ls /lib/live/mount/*)" != "" ] || [ "$(ls /usr/lib/live/mount/*)" != "" ] || [ "$(ls /run/live/*)" != "" ] ; then
#	LIVESESSION="Y"
#else
#	LIVESESSION="N"
#	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This does not seem to be a live session.\n\nCannot continue." $H $W
#	check_exit
#fi
#
#if [ -e /etc/iso-id ] || [ -e /etc/img-id ] || [ -e /etc/snapshotid ] || [ -e /etc/snapshot-id ] ; then
#	LIVESNAP="Y"
#fi


### WELCOME ########################################

if [ "$WELCOME" != "N" ] ; then

$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"Welcome to $TITLE.\n\n$TITLE is a tool to install the operating system to the internal disk.\n\n$TITLE is libre/free software, licensed according to 'GNU AGPL version 3.0'.\n\nIt is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY.\n\nMore information at www.picalibre.org\n" $H $W

if [ "$?" -ne 0 ] ; then
	exit 0
fi

fi


### TEMPLATE ########################################

#clean

if [ -e /tmp/iivar ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Do you want to use /tmp/iivar as template?\n\nIf in doubt, select 'No/Cancel'.\n" $H $W
	if [ "$?" -eq 0 ] ; then
		cat /tmp/iivar
		source /tmp/iivar
		TEMPLATE="Y"
	else
		rm -rf /tmp/iivar
	fi
fi


### CALCULATIONS ########################################

# minimum size check #####
#TOTAL=$(expr $(df | grep -a /dev/loop | awk '{print $2,$1}' | sort -n -r | head -n 1 | awk '{print $1}') \* 320 / 100)
SIZESFSM=$(df -m | grep -a /dev/loop | awk '{print $2,$1}' | sort -n -r | head -n 1 | awk '{print $1}')
MINSIZEDABSM=$(echo "scale=0 ; $SIZESFSM * 4 / 1" | bc -l )
if [ "$MINSIZEDABSM" = "" ] || [ "$MINSIZEDABSM" -eq 0 ] ; then
	check_exit
fi
MINSIZEDM=$(expr $MINSIZEDABSM + 500)
MINSIZEDG=$(echo "scale=1 ; $MINSIZEDM / 1024" | bc -l )

	if [ "$TEMPLATE" != "Y" ] ; then

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"PicaLibre is a completely libre/free operating system. More information at www.picalibre.org \n\nIn order to install PicaLibre, a minimum of $MINSIZEDG GiB ($MINSIZEDM MiB, recommended triple) of free internal disk is required, but if you want you can keep the already installed operating systems (in this case, if it is a privative operating system, it is recommended its previous defragmentation in order to improve the installation speed).\n\nIt is highly recommended to make frequent backup copies of the content stored on the disks, because there is always the risk of an unexpected accident. If you have not a recent backup of the files (documents, photos,...), you should consider canceling the installation and making a backup before continuing the installation.\n\nPartitioning and formatting will be necessary to install.\n\nDo you want to continue?\n" $H $W

if [ "$?" -ne 0 ] ; then
	exit 0
fi

	# End: if [ "$TEMPLATE" != "Y" ]
	fi

# swap size #####

RECSWAPSIZE=3600

RECSWAPSIZEMB=3775

if [ $(free -m | grep -aEi "^Mem" | awk '{print $2}') -le 1600 ] ; then
	RECSWAPSIZE2=3600
else
	RECSWAPSIZE2=$(expr $(free -m | grep -aEi "^Mem" | awk '{print $2}') \* 225 / 100)
	#RECSWAPSIZE2=$(calc $(free -m | grep -aEi "^Mem" | awk '{print $2}')*2.25)
	#RECSWAPSIZE2=$(echo $(free -m | grep -aEi "^Mem" | awk '{print $2}')*2.25 | bc -l)
fi

sel_swapfilesize () {
SWAPFILESIZE=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write the file size in MiB (1 GiB = 1024 MiB) that you want to save for 'on-disk complementary memory space' or 'swap space'.\n\nIt is recommended to assign between $RECSWAPSIZE (as minimum to be useful) and $RECSWAPSIZE2 MiB (i.e. a size slightly larger than twice the total RAM size of the computer).\n" $H $W $PREWRITE "$RECSWAPSIZE2")

	if [ "$?" -ne 0 ] ; then
	REFUN=sel_swapfilesize
	input_error ; return
	fi

	if [ "$SWAPFILESIZE" = "" ] ; then
	REFUN=sel_swapfilesize
	input_error ; return
	fi
}


### COREBOOT CHECK ########################################

# large_dir or metadata_csum_seed failed with GRUB <= 2.06-8  https://bugs.debian.org/1030846
if [ "$(dmesg | grep -aEi "gnuboot|gnu boot|gnu-boot|gnu_boot|canoeboot|libreboot|coreboot|linuxbios")" != "" ] ; then
	COREBOOT="Y"
	COREBOOTTEXT=$"This computer seems to have GNU Boot / Canoeboot / CoreBoot / LinuxBIOS.\n\n"
fi


### EFI CHECK ########################################

	if [ "$TEMPLATE" = "Y" ] ; then

if [ "$EFIDET" = "" ] ; then
if [ -e /sys/firmware/efi ] ; then
	find /sys/firmware/efi
	EFIDET="Y"
fi
fi

	else
	#if [ "$TEMPLATE" != "Y" ] ; then

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"

if [ -e /sys/firmware/efi ] ; then
	find /sys/firmware/efi
	EFIDET="Y"
	EFICHECKTEXT=$"This computer seems to have EFI.\n\n"
fi

# Check if partition table is GPT
DLIST=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " 0 " | grep -aEi ' disk' | awk '{print "/dev/"$1}' )
if [ "$DLIST" = "" ] ; then DLIST=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | grep -aEi ' ata| ide| pata| sata| scsi| sas| nvme| pci' | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}') ; fi  # In some computers the internal disk can be wrongly shown as removable.
if [ "$DLIST" = "" ] ; then DLIST=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}') ; fi  # In some computers the internal disk can be wrongly shown as removable.
for i in $DLIST ; do
	DTT=$(LANG=C parted -s $i print | grep -aEi 'Partition Tab' | awk '{print $NF}')
#	if [ "$DTT" != "msdos" ] ; then
	if [ "$DTT" = "gpt" ] ; then
	GPTDET="$i"
	echo "GPTDET=\"$GPTDET\""
	break
	fi
done

## Check if there is an EFI partition (ESP)
#for i in $(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " 0 " | grep -aEi ' part' | grep -a '1 ' | awk '{print $1}' ) ; do
#	EFIPART1=$(lsblk -r -n -o KNAME,RM,TYPE,FSTYPE | grep -aEi " 0 " | grep -aEi ' part' | grep -aE "^$i " | awk '{print $NF}' | grep -aEi fat )
#	EFIPART2=$(expr $(lsblk -r -n -b -o KNAME,RM,SIZE,TYPE | grep -aEi " 0 " | grep -aEi ' part' | grep -aE "^$i " | awk '{print $3}' | sort -n | head -n 1 ) / 1024 / 1024 / 1024 )
#	if [ "$EFIPART1" != "" ] && [ "$EFIPART2" -le 2 ] ; then
#	EFIDET=$(echo /dev/$i)
#	echo "EFIDET=\"$EFIDET\""
#	break
#	fi
#done

if [ "$EFIDET" = "" ] ; then
	echo "EFIDET="
	EFICHECKTEXT=$"This computer seems not to have EFI.\n\n"
fi

if [ "$EFIDET" != "" ] ; then

	EFITEXT1=$"The most common boot firmware on computers sold since the end of 2012 (since the privative Windows 8, and Apple computers with Intel processors since 2006) is 'EFI' while previously it was 'BIOS' (although there are others: GNU Boot / Canoeboot / CoreBoot / LinuxBIOS, OpenFirmware / OpenBoot / OpenBIOS, U-Boot, Yeeloong,...).\n\n${EFICHECKTEXT}"

	if [ "$(cat /etc/picalibre_version | cut -d '.' -f 1 )" = "x" ] || [ "$(cat /etc/picalibre_version | cut -d '.' -f 1 )" -ge 10 ] || [ "$(cat /etc/debian_version | cut -d '.' -f 1 )" -ge 10 ] || [ "$(cat /etc/devuan_version | sed -e 's|jessie|1|g' -e 's|ascii|2|g' -e 's|beowulf|3|g' -e 's|chimaera|4|g' -e 's|daedalus|5|g' -e 's|excalibur|6|g' | cut -d '.' -f 1 | sed 's|/ceres||g')" -ge 3 ] ; then
	
		EFITEXT2=$"If it is a computer with 'EFI', it is possible to disable forever the tendentiously self-named 'Secure Boot', 'Fast Startup' and 'Hibernation' before installing because they can be problematic to install systems other than the privative one installed by default (privative systems should continue working fine after these changes).\n\nIf it is a computer with 'EFI' but completely erase the internal disk is plausible, you can optionally use 'BIOS-MBR/msdos' instead of 'EFI' if you activate 'Legacy BIOS mode'/'Compatibility Support Module (CSM)' in EFI (if it is available!) and then create a 'msdos' partition table (remember that creating a new partition table, either 'msdos' for 'BIOS-MBR/msdos' or 'gpt' for 'EFI-GPT', will completely erase the disk).\n\nDo you want to continue the installation?\n"
		
	else
	
		EFITEXT2=$"If it is a computer with 'EFI', the misnamed 'Secure Boot', 'Fast Startup' and 'Hibernation' must be disabled forever before installing, so you must cancel the installation if you have not done it (privative systems should continue working fine after these changes).\n\nIf it is a computer with 'EFI' but completely erase the internal disk is plausible, you can optionally use 'BIOS-MBR/msdos' instead of 'EFI' if you activate 'Legacy BIOS mode'/'Compatibility Support Module (CSM)' in EFI (if it is available!) and then create a 'msdos' partition table (remember that creating a new partition table, either 'msdos' for 'BIOS-MBR/msdos' or 'gpt' for 'EFI-GPT', will completely erase the disk).\n\nDo you want to continue the installation?\n"
	
	fi

	$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT "${EFITEXT1}${EFITEXT2}" $H $W

	if [ "$?" -ne 0 ] ; then
		exit 0
	fi

fi

	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### NOMODESET OPTION ########################################

NOMODESETCHECK=$(cat /proc/cmdline | grep -aEio nomodeset )
echo "NOMODESETCHECK=\"$NOMODESETCHECK\"" | tee -a /tmp/iivar

# Keep only (note: xserver-xorg-video-modesetting is a virtual package provided by xserver-xorg-core) 'xserver-xorg-video-all|xserver-xorg-video-dummy|xserver-xorg-video-fbdev|xserver-xorg-video-modesetting|xserver-xorg-video-vesa'
#if [ "$NOMODESETCHECK" != "" ] ; then
#for i in ^xserver-xorg-video-amdgpu.* ^xserver-xorg-video-apm.* ^xserver-xorg-video-ark.* ^xserver-xorg-video-ast.* ^xserver-xorg-video-ati.* ^xserver-xorg-video-chips.* ^xserver-xorg-video-cirrus.* ^xserver-xorg-video-freedreno.* ^xserver-xorg-video-geode.* ^xserver-xorg-video-glamo.* ^xserver-xorg-video-glide.* ^xserver-xorg-video-glint.* ^xserver-xorg-video-i128.* ^xserver-xorg-video-i740.* ^xserver-xorg-video-intel.* ^xserver-xorg-video-ivtv.* ^xserver-xorg-video-mach64.* ^xserver-xorg-video-mga.* ^xserver-xorg-video-msm.* ^xserver-xorg-video-neomagic.* ^xserver-xorg-video-newport.* ^xserver-xorg-video-nouveau.* ^xserver-xorg-video-nv.* ^xserver-xorg-video-nvidia.* ^xserver-xorg-video-nvidia-legacy-304xx.* ^xserver-xorg-video-nvidia-legacy-340xx.* ^xserver-xorg-video-nvidia-legacy-390xx.* ^xserver-xorg-video-nvidia-tesla-418.* ^xserver-xorg-video-nvidia-tesla-440.* ^xserver-xorg-video-nvidia-tesla-450.* ^xserver-xorg-video-omap.* ^xserver-xorg-video-openchrome.* ^xserver-xorg-video-qxl.* ^xserver-xorg-video-r128.* ^xserver-xorg-video-radeon.* ^xserver-xorg-video-rendition.* ^xserver-xorg-video-s3.* ^xserver-xorg-video-savage.* ^xserver-xorg-video-siliconmotion.* ^xserver-xorg-video-sis.* ^xserver-xorg-video-sisusb.* ^xserver-xorg-video-sun.* ^xserver-xorg-video-tdfx.* ^xserver-xorg-video-tga.* ^xserver-xorg-video-trident.* ^xserver-xorg-video-tseng.* ^xserver-xorg-video-vmware.* ^xserver-xorg-video-voodoo.* ^nouveau.* ^nvidia.* ^libnvidia.* ^libcuda.* ^radeon.* ^virtualbox.* ; do apt-get purge -y $i ; done
#fi


### SNAPMETHOD ########################################

#	if [ "$TEMPLATE" != "Y" ] ; then
#
# If it is a live session, select snapshot install method
#
#snap_met () {
#
#CONFIRMTEXT=$"Please select the installation method (the first is recommended):"
#OPTION1=$"Install to internal disk with a new default user (recommended)"
#OPTION2=$"Install to internal disk with existing user settings"
#OPTION3=$"Stop now"
#
#SNAPMETHOD=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT "$CONFIRMTEXT" $H $W $LH $COLUMN $COLUMN "1" "$OPTION1" "2" "$OPTION2" "$OPTION3" | head -n 1 )
#
#	if [ "$?" -ne 0 ] || [ "$SNAPMETHOD" = "$OPTION3" ] ; then
#		exit 0
#	fi
#
#	if [ "$SNAPMETHOD" = "" ] ; then
#	REFUN=snap_met
#	input_error ; return
#	fi
#}
#snap_met
#
#if [ "$SNAPMETHOD" = "2" ] ; then
#	SNAPMETHOD=clone
#else
#	SNAPMETHOD=newconfig
#fi
#
#echo "SNAPMETHOD=\"$SNAPMETHOD\"" | tee -a /tmp/iivar
#
#	# End: if [ "$TEMPLATE" != "Y" ]
#	fi


### CLOCK ########################################

	if [ "$TEMPLATE" != "Y" ] ; then

YMD="$(date +%Y-%m-%d)"
if [ "$(date +%Y)" -lt 2025 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $WM    $WTEXT $"The clock seems to be in the past: $YMD \nIf it is a computer with a button battery to keep time, then the button battery probably needs to be replaced (if this is not the first time this computer is turned on), to prevent the clock reverting to the past every time the computer loses power." $H $W
fi

# Set time standard (localtime or UTC) of the hardware clock in /etc/adjtime
# Selecting 'LOCAL' makes life easier for novice users if more than one operating system is installed on the computer, and a more advanced user will have no trouble setting it.
#cp -av /etc/adjtime /etc/adjtimeCOP
if [ -e "/etc/adjtime" ] ; then
sed -i "s|^UTC.*|LOCAL|g" /etc/adjtime
else
cat > /etc/adjtime <<EOF
0.0 0 0.0
0
LOCAL
EOF
fi

# Set /etc/timezone

#DET_LOCALE=$(locale | grep -aE 'TIME' | grep -aE -o '\".*\"'| sed 's|"||g')
#if [ "$DET_LOCALE" != "en_GB.UTF-8" ] ; then
#	DIF_LOCALE="English - Great Britain"
#elif [ "$DET_LOCALE" != "en_US.UTF-8" ] ; then
#	DIF_LOCALE="English - USA"
#elif [ "$DET_LOCALE" != "es_ES.UTF-8" ] ; then
#	DIF_LOCALE="Español - España"
#else
#	DIF_LOCALE="Custom locale"
#fi

CONTINENT=$(cat /etc/timezone | cut -d '/' -f 1 )
CAPITAL=$(cat /etc/timezone | cut -d '/' -f 2 )

if [ "$CONTINENT" = "" ] || [ "$CAPITAL" = "" ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"Now a terminal dialog will be opened to set the local time." $H $W
	exec >/dev/tty
	TT=$"Reconfigure local time" ; COM="dpkg-reconfigure tzdata" ; TERMINAL
	if [ "$DEBUG" != "N" ] ; then
		exec > >(tee -a "$ERRORLOG") 2>&1
	fi
else
	$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"The current time zone of the system is continent: $CONTINENT, capital: $CAPITAL \n\nDo you want to change it?\n" $H $W
	if [ "$?" -eq 0 ] ; then
	exec >/dev/tty
	TT=$"Reconfigure local time" ; COM="dpkg-reconfigure tzdata" ; TERMINAL
	if [ "$DEBUG" != "N" ] ; then
		exec > >(tee -a "$ERRORLOG") 2>&1
	fi
	fi
fi

	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### LANGUAGE ########################################

	if [ "$TEMPLATE" != "Y" ] ; then

### set language

# dpkg-reconfigure locales  # if the 'locales' package is installed

#	# a lot of output... temporal turn off logging
#	if [ "$DEBUG" = "Y" ] ; then
#	set +xv
#	fi

LANGCOD=$(locale | grep -aEi 'LANG' | sed 's|.*=||g' | sort -r | head -n 1 )

# xx_XX
LANGNAME=$(grep -aEi ^\"$(locale | grep -aEi 'LANG' | sed 's|.*=||g' | sort -r | head -n 1 | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 )\" $LIBDEP/langcod.list | head -n 1 | awk -F "\t" '{print $2}' | sed "s|_|$ESP|g" | sed 's|"||g' )
if [ "$LANGNAME" = "" ] ; then
# xx
LANGNAME=$(grep -aEi ^\"$(locale | grep -aEi 'LANG' | sed 's|.*=||g' | sort -r | head -n 1 | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 | sed 's|_.*||g' )\" $LIBDEP/langcod.list | head -n 1 | awk -F "\t" '{print $2}' | sed "s|_|$ESP|g" | sed 's|"||g' )
fi
if [ "$LANGNAME" = "" ] ; then
LANGNAME="$LANGCOD"
fi

#	# after a lot of output... turn on logging
#	if [ "$DEBUG" = "Y" ] ; then
#	exec > >(tee -a "$ERRORLOG") 2>&1 ; set -xv
#	fi

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"The current language of the system is $LANGNAME ( $LANGCOD ).\n\nDo you want to change it?\n" $H $W

# If change language is Yes
if [ "$?" -eq 0 ] ; then

gen_langlist () {

#	# a lot of output... temporal turn off logging
#	if [ "$DEBUG" = "Y" ] ; then
#	set +xv
#	fi

# xx_XX
LANGLISTi=$(grep -aEi ^\"$(echo $i)\" $LIBDEP/langcod.list | head -n 1 | awk -F "\t" '{print $2}' | sed "s|_|$ESP|g" | sed 's|"||g' )
if [ "$LANGLISTi" = "" ] ; then
# xx
LANGLISTi=$(grep -aEi ^\"$(echo $i | sed "s|_.*||g")\" $LIBDEP/langcod.list | head -n 1 | awk -F "\t" '{print $2}' | sed "s|_|$ESP|g" | sed 's|"||g' )
fi
if [ "$LANGLISTi" = "" ] ; then
LANGLISTi="$i"
fi
echo "$LANGLISTi"

#	# after a lot of output... turn on logging
#	if [ "$DEBUG" = "Y" ] ; then
#	exec > >(tee -a "$ERRORLOG") 2>&1 ; set -xv
#	fi
}

lang_sel () {

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGLANG=$( echo $! )

#	# a lot of output... temporal turn off logging
#	if [ "$DEBUG" = "Y" ] ; then
#	set +xv
#	fi

LANGLIST=$(locale -a | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 | cut -d ' ' -f 1 | sort -u | while read i ; do printf "$i.UTF-8""\t" ; gen_langlist ; done)
if [ "$LANGLIST" = "" ] ; then
LANGLIST=$(ls /usr/lib/locale/ | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 | cut -d ' ' -f 1 | sort -u | while read i ; do printf "$i.UTF-8""\t" ; gen_langlist ; done)
fi

#	# after a lot of output... turn on logging
#	if [ "$DEBUG" = "Y" ] ; then
#	exec > >(tee -a "$ERRORLOG") 2>&1 ; set -xv
#	fi
	kill $PIDDIALOGLANG 2>/dev/null

PRE_LANGSEL=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select a language:" $H $W $LH $COLUMN $COLUMN $LANGLIST | head -n 1 )

	if [ "$?" -ne 0 ] ; then
		exit 0
	fi

	if [ "$PRE_LANGSEL" = "" ] ; then
		REFUN=lang_sel
		input_error ; return
	fi

LANGSEL=$(echo "$PRE_LANGSEL" | awk '{print $1}' )

echo "LANGSEL=$LANGSEL" | tee -a /tmp/iivar

# Generate locale if it does not exist
if [ ! -e "/usr/lib/locale/$(echo $LANGSEL | sed 's|\.UTF-8|.utf8|g')/LC_MESSAGES/" ] ; then
	if [ -e /etc/locale.gen ] ; then
		CHARSET="$(echo $LANGSEL | cut -s -d '.' -f 2 | cut -d '@' -f 1)"
		if [ "$CHARSET" = "" ] ; then
			CHARSET="UTF-8"
		fi
		sed -i -e "s|# $LANGSEL $CHARSET|$LANGSEL $CHARSET|" /etc/locale.gen
	fi
	locale-gen --keep-existing 2>&1
fi

}

lang_sel

# If change language is Yes
fi


### set kbmap

# dpkg-reconfigure keyboard-configuration

#	# a lot of output... temporal turn off logging
#	if [ "$DEBUG" = "Y" ] ; then
#	set +xv
#	fi

KBCOD=$(setxkbmap -query | grep -aEi "^layout" | sed "s|.*=||g" | awk '{print $NF}' | head -n 1 | tr "[A-Z]" "[a-z]")
if [ "$KBCOD" = "" ] ; then KBCOD=$(cat /etc/default/keyboard | grep -a 'XKBLAYOUT=' | sed "s|.*=||g" | sed 's|"||g' | tr "[A-Z]" "[a-z]") ; fi
if [ "$KBCOD" = "" ] ; then KBCOD=$(env | grep -aEi "^LANG=" | sed "s|.*=||g" | sed 's|"||g' | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 | cut -d '_' -f 2 | sed 's|"||g' | tr "[A-Z]" "[a-z]") ; fi

if [ "$KBCOD" != "" ] ; then
	KBNAME=$(grep -aEi ^\"$(echo $KBCOD)\" $LIBDEP/kbcod.list | head -n 1 | awk -F "\t" '{print $2}' | sed "s|_|$ESP|g" | sed 's|"||g')
	if [ "$KBNAME" = "" ] ; then
		KBNAME="$KBCOD"
	fi
else
	echo $"ERROR" KBCOD="$KBCOD"
fi

#	# after a lot of output... turn on logging
#	if [ "$DEBUG" = "Y" ] ; then
#	exec > >(tee -a "$ERRORLOG") 2>&1 ; set -xv
#	fi

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"The current keyboard map is $KBNAME ( $KBCOD ).\n\nDo you want to change it?\n" $H $W

# If change kbmap is Yes
if [ "$?" -eq 0 ] ; then

gen_kblist () {
KBLISTi=$(grep -aEi ^\"$(echo $i)\" $LIBDEP/kbcod.list | head -n 1 | awk -F "\t" '{print $2}' | sed "s|_|$ESP|g" | sed 's|"||g')
if [ "$KBLISTi" = "" ] ; then
	if [ "$(printf $i | wc -m)" -gt 2 ] ; then
		KBLISTi="(-)"
	else
		KBLISTi="$i"
	fi
fi
echo "$KBLISTi"
}

kb_sel () {

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGKB=$( echo $! )

#	# a lot of output... temporal turn off logging
#	if [ "$DEBUG" = "Y" ] ; then
#	set +xv
#	fi

# section 'Layout' in  /usr/share/console-setup/KeyboardNames.pl  /usr/share/doc/keyboard-configuration/xorg.lst  /usr/share/X11/xkb/rules/base.lst  ( /usr/share/doc/keyboard-configuration/xorg.lst -> ../../X11/xkb/rules/xorg.lst )

KBLIST=$(ls -p /usr/share/X11/xkb/symbols | grep -av '/' | while read i ; do printf "$i" ; printf "\t" ; gen_kblist ; done)

#	# after a lot of output... turn on logging
#	if [ "$DEBUG" = "Y" ] ; then
#	exec > >(tee -a "$ERRORLOG") 2>&1 ; set -xv
#	fi
	kill $PIDDIALOGKB 2>/dev/null

#KBSEL=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select a keyboard map:" $H $W $LH $COLUMN $COLUMN  "es" $"Spanish" "gb" $"English GB" "us" $"English USA" $KBLIST | head -n 1 )

PRE_KBSEL=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select a keyboard map:\n\n(You must not select a '(-)' option unless you are clear about what you do.)\n" $H $W $LH $COLUMN $COLUMN $KBLIST $"Advanced options" " " | head -n 1 )

	if [ "$?" -ne 0 ] ; then
		exit 0
	fi

	if [ "$PRE_KBSEL" = "" ] ; then
		REFUN=kb_sel
		input_error ; return
	fi

	if [ "$PRE_KBSEL" = $"Advanced options" ] ; then
		exec >/dev/tty
		TT=$"$TITLE" ; COM="dpkg-reconfigure keyboard-configuration" ; TERMINAL
		if [ "$DEBUG" != "N" ] ; then
			exec > >(tee -a "$ERRORLOG") 2>&1
		fi
		PRE_KBSEL=$(cat /etc/default/keyboard | grep -a 'XKBLAYOUT=' | sed "s|.*=||g" | sed 's|"||g' | tr "[A-Z]" "[a-z]")
	fi

# Test without modifying /etc/default/keyboard

	if [ "$(command -v setupcon)" != "" ] ; then cp --remove-destination /etc/default/keyboard ~/.keyboard ; sed -i "s|^XKBLAYOUT=.*|XKBLAYOUT=$PRE_KBSEL|g" ~/.keyboard ; setupcon -k ; fi
	if [ "$(command -v setxkbmap)" != "" ] ; then setxkbmap $PRE_KBSEL ; fi
	
	TEST_KBSEL=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please test the new keyboard map by typing for example hyphen, underscore, slash, parentheses, brackets, braces, comma, point, semicolon, colon, single quote, double quote, less than, greater than,...\n\nPress 'Yes/OK' to confirm or 'No/Cancel' to choose another keyboard map.\n" $H $W)

	if [ "$?" -ne 0 ] ; then
		kb_sel ; return
	fi
	
	if [ "$(command -v setupcon)" != "" ] ; then rm -f ~/.keyboard ; fi

KBSEL=$(echo "$PRE_KBSEL" | awk '{print $1}' )

echo "KBSEL=$KBSEL" | tee -a /tmp/iivar

}

kb_sel

# If change kbmap is Yes
fi

	# End: if [ "$TEMPLATE" != "Y" ]
	fi

if [ "$LANGSEL" != "" ] ; then

#update-locale LANG=$LANGSEL LANGUAGE=$LANGSEL locales=$LANGSEL
cat > /etc/default/locale <<EOF
LANG=$LANGSEL
LANGUAGE=$LANGSEL
locales=$LANGSEL
EOF

#export LC_ALL=$LANGSEL
#export LANG=$LANGSEL
#export LANGUAGE=$LANGSEL
#export locales=$LANGSEL
#export LC_ALL=

fi

if [ "$KBSEL" != "" ] ; then
sed -i "s|^XKBLAYOUT=.*|XKBLAYOUT=$KBSEL|g" /etc/default/keyboard
#if [ "$(command -v loadkeys)"  != "" ] ; then loadkeys $KBSEL ; fi  # loadkeys uses another keymap nomenclature
udevadm trigger --subsystem-match=input --action=change
if [ "$(command -v setupcon)" != "" ] ; then setupcon -k ; fi
if [ "$(command -v setxkbmap)" != "" ] ; then setxkbmap $KBSEL ; fi
fi


### Activate or inactivate encrypted volumes ########################################

act_crypt () {

CRYPTACTIVEPARTS=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' crypt' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' | grep -aEiv "^$i$" ; done | sort -u )
if [ "$CRYPTACTIVEPARTS" = "" ] ; then
	INACTIVECRYPTPARTS=$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'crypt' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u )
else
	INACTIVECRYPTPARTS=$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'crypt' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u | grep -av "$CRYPTACTIVEPARTS")
fi

if [ "$CRYPTACTIVEPARTS" != "" ] ; then
	INFOCRYPTACTIVEPARTS=$(echo $"Partitions that contain active encrypted volumes:" ; lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' crypt' | awk '{print "/dev/"$1}' | sort -u | while read i ; do echo "$i : $(lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' | grep -aEiv "^$i$" | tr "\n" " ")" ; done | sort -u ; echo \\n )
else
	INFOCRYPTACTIVEPARTS=""
fi

if [ "$INACTIVECRYPTPARTS" != "" ] ; then
	INFOINACTIVEQCRYPT=$"The partitions\n$INACTIVECRYPTPARTS\ncontain inactive encrypted volumes.\n\n"
else
	INFOINACTIVEQCRYPT=""
fi

if [ "$CRYPTACTIVEPARTS" != "" ] || [ "$INACTIVECRYPTPARTS" != "" ] ; then

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"

	if [ "$(command -v cryptsetup)" != "" ] ; then
	QCRYPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"${INFOCRYPTACTIVEPARTS}${INFOINACTIVEQCRYPT}Please select an option:" $H $W $LH $COLUMN $COLUMN $"Activate all identified encrypted volumes" " " $"Inactivate all activated encrypted volumes" " " $"Leave as is" " " | head -n 1 )
	elif [ "$(command -v dmsetup)" != "" ] ; then
	QCRYPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"${INFOCRYPTACTIVEPARTS}${INFOINACTIVEQCRYPT}Please select an option:" $H $W $LH $COLUMN $COLUMN $"Inactivate all activated encrypted volumes" " " $"Leave as is" " " | head -n 1 )
	else
	true
	fi

	case $QCRYPT in
	
		$"Activate all identified encrypted volumes" )

# Open all existing encrypted volumes WITH headers:
#cat << EOF > /tmp/opencrypt
cat > /tmp/opencrypt <<EOF
#!/bin/bash

CNAME=$CNAME
VERSION=$VERSION
TITLE=$TITLE

# Translations
if [ "\$LANG" = "" ] ; then export $(cat /etc/default/locale | grep -a 'LANG=') ; fi
TEXTDOMAIN=$TEXTDOMAIN
TEXTDOMAINDIR=$TEXTDOMAINDIR

ERRORLOG="$ERRORLOG"
if [ "$DEBUG" = "Y" ] ; then
	set -xv
fi
if [ "$DEBUG" != "N" ] ; then
exec > >(tee -a "\$ERRORLOG") 2>&1
echo "\$0" "\$*" >> "\$ERRORLOG"
fi

################################

CRYPTACTIVEPARTS=\$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' crypt' | awk '{print "/dev/"\$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s \$i | grep -aEiv ' disk' | awk '{print "/dev/"\$2}' | grep -aEiv "^\$i\$" ; done | sort -u )

if [ "\$CRYPTACTIVEPARTS" = "" ] ; then
	for i in \$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'crypt' | awk '{print "/dev/"\$1}' | sort -u ) ; do lsblk -r -n -o KNAME,SIZE,LABEL,UUID | grep -aE "^\$(echo \$i | sed 's|/dev/||g') " ; cryptsetup luksOpen \$i e\$(echo \$i | sed 's|/dev/||g') ; done
else
	for i in \$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'crypt' | awk '{print "/dev/"\$1}' | sort -u | grep -av "\$CRYPTACTIVEPARTS" ) ; do lsblk -r -n -o KNAME,SIZE,LABEL,UUID | grep -aE "^\$(echo \$i | sed 's|/dev/||g') " ; cryptsetup luksOpen \$i e\$(echo \$i | sed 's|/dev/||g') ; done
fi

EOF

chmod +x /tmp/opencrypt

exec >/dev/tty
TT="$TITLE" ; COM="bash /tmp/opencrypt" ; TERMINAL ; rm -f /tmp/opencrypt
if [ "$DEBUG" != "N" ] ; then
	exec > >(tee -a "$ERRORLOG") 2>&1
fi

		;;
	
		$"Inactivate all activated encrypted volumes" )
		lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' crypt' | awk '{print "/dev/"$1}' | sort -u | while read i ; do
			echo "$i"
			umount $i
			cryptsetup luksClose $i
			tcplay -u $i
			dmsetup remove $i
			## umount /dev/dm*
			#dmsetup remove_all
		done
		;;
	
		*)
		echo "\$?=$?"
		echo QCRYPT=$QCRYPT
		;;

	esac

fi

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

}

	if [ "$TEMPLATE" != "Y" ] ; then
act_crypt
	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### Activate or inactivate LVM ########################################

act_lvm () {

LVMACTIVEPARTS=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' lvm' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' | grep -aEiv "^$i$" ; done | sort -u )
if [ "$LVMACTIVEPARTS" = "" ] ; then
	INACTIVELVMPARTS=$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'lvm' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u )
else
	INACTIVELVMPARTS=$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'lvm' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u | grep -av "$LVMACTIVEPARTS")
fi

if [ "$LVMACTIVEPARTS" != "" ] ; then
#	INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; LANG=C pvscan | grep -aEiv 'Total: ' | grep -aEiv "No matching|No device" | awk '{if ( $4 !~ /\[/ ) print $4}' | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i-" | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $i " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" ))" ; done ; echo \\n )
#	INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; LANG=C pvscan | grep -aEiv 'Total: ' | grep -aEiv "No matching|No device" | awk '{if ( $3 == "VG" ) print $4}' | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i-" | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $i " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" ))" ; done ; echo \\n )
#	INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; lvs --noheadings --unbuffered -o vg_name,lv_name | sed 's|-|--|g' | sed "s|^ \+||g" | sed "s| \+$||g" | sed 's| |-|g' | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i " | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $(echo $i | grep -aEio ".*[a-zA-Z0-9]-[a-zA-Z0-9]" | sed "s|..$||g" | sed 's|--|-|g') " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]"))" ; done ; echo \\n )
	INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; lsblk -r -n -o NAME,KNAME,RM,TYPE | grep -aEi ' lvm' | awk '{if ( $4 == "lvm" ) print $1}' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i " | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $(echo $i | grep -aEio ".*[a-zA-Z0-9]-[a-zA-Z0-9]" | sed "s|..$||g" | sed 's|--|-|g') " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u))" ; done ; echo \\n )
else
	INFOLVMACTIVEPARTS=""
fi

if [ "$INACTIVELVMPARTS" != "" ] ; then
	INFOINACTIVELVMPARTS=$"The partitions\n$INACTIVELVMPARTS\nare part of inactive 'LVM' extended volumes.\n\n"
else
	INFOINACTIVELVMPARTS=""
fi

if [ "$(command -v vgchange)" != "" ] ; then if [ "$LVMACTIVEPARTS" != "" ] || [ "$INACTIVELVMPARTS" != "" ] ; then

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"

	QLVM=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"${INFOLVMACTIVEPARTS}${INFOINACTIVELVMPARTS}Please select an option:" $H $W $LH $COLUMN $COLUMN $"Activate all 'LVM' extended volumes" " " $"Inactivate all 'LVM' extended volumes" " " $"Leave as is" " " | head -n 1 )

	case $QLVM in
	
		$"Activate all 'LVM' extended volumes" )
		vgchange -ay
		#pvscan --cache -aay
		;;
	
		$"Inactivate all 'LVM' extended volumes" )
		lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' lvm' | awk '{print "/dev/"$1}' | sort -u | while read i ; do umount $i ; done
		vgchange -an
		;;
	
		*)
		echo "\$?=$?"
		echo QLVM=$QLVM
		;;

	esac

fi ; fi

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

}

	if [ "$TEMPLATE" != "Y" ] ; then
act_lvm
	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### Activate or inactivate RAID ########################################

act_mdadm () {

MDADMACTIVEPARTS=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' raid' | awk '{print "/dev/"$1}' | sort -u | while read i ; do mdadm --detail $i | grep -a " /dev/" | awk '{print $NF}' | sort -u | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done ; done | grep -aEi "[a-zA-Z0-9]" | sort -u )
if [ "$MDADMACTIVEPARTS" = "" ] ; then
	INACTIVEMDADMPARTS=$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'raid' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u )
else
	INACTIVEMDADMPARTS=$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'raid' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u | grep -av "$MDADMACTIVEPARTS")
fi

if [ "$MDADMACTIVEPARTS" != "" ] ; then
	INFOMDADMACTIVEPARTS=$(echo $"Active 'mdadm' RAID partitions systems:" ; lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' raid' | awk '{print "/dev/"$1}' | sort -u | while read i ; do echo $i $"formed by the partitions" $(mdadm --detail $i | grep -a " /dev/" | awk '{print $NF}' | sort -u | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u) ; done ; echo \\n )
else
	INFOMDADMACTIVEPARTS=""
fi

if [ "$INACTIVEMDADMPARTS" != "" ] ; then
	INFOINACTIVEMDADMPARTS=$"The partitions\n$INACTIVEMDADMPARTS\nare part of inactive RAID partitions systems.\n\n"
else
	INFOINACTIVEMDADMPARTS=""
fi

if [ "$(command -v mdadm)" != "" ] ; then if [ "$MDADMACTIVEPARTS" != "" ] || [ "$INACTIVEMDADMPARTS" != "" ] ; then

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"

	QMDADM=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"${INFOMDADMACTIVEPARTS}${INFOINACTIVEMDADMPARTS}Please select an option:" $H $W $LH $COLUMN $COLUMN $"Activate all RAID partitions systems" " " $"Inactivate all RAID partitions systems" " " $"Leave as is" " " | head -n 1 )

	case $QMDADM in
	
		$"Activate all RAID partitions systems" )
		mdadm --assemble --scan
		;;
	
		$"Inactivate all RAID partitions systems" )
		lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' raid' | awk '{print "/dev/"$1}' | sort -u | while read i ; do umount $i ; done
		mdadm --stop --scan
		;;
	
		*)
		echo "\$?=$?"
		echo QMDADM=$QMDADM
		;;

	esac

fi ; fi

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

}

	if [ "$TEMPLATE" != "Y" ] ; then
act_mdadm
	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### Collect partitions ########################################

ALLDEVS=$"List all devices (only for experts)"
INTDEVS=$"List only internal devices"

# lsblk - add inverse tree support (-s)  https://mirrors.kernel.org/pub/linux/utils/util-linux/v2.22/v2.22-ReleaseNotes	(Debian 8 "Jessie")

recparts () {

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"

CRYPTACTIVEPARTS=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' crypt' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' | grep -aEiv "^$i$" ; done | sort -u )
LVMACTIVEPARTS=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' lvm' | awk '{print "/dev/"$1}' | sort -u | while read i ; do lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' | grep -aEiv "^$i$" ; done | sort -u )
btrfs device scan ; BTRFSRAIDACTIVEPARTS=$(LANG=C btrfs filesystem show | sed ':a;N;$!ba;s|\n\t| |g' | grep -aEi "[a-zA-Z0-9]" | grep -aEi 'Total devices ' | grep -aEiv 'Total devices 1 ' | while read i ; do echo $i | sed 's| |\n|g' | grep -aE "^/dev/" | sort -u | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sed -n '2,$p' ; done | grep -aEi "[a-zA-Z0-9]" | sort -u )
MDADMACTIVEPARTS=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' raid' | awk '{print "/dev/"$1}' | sort -u | while read i ; do mdadm --detail $i | grep -a " /dev/" | awk '{print $NF}' | sort -u | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done ; done | grep -aEi "[a-zA-Z0-9]" | sort -u )

if [ "$(echo $SWAPPART | grep -aEio /dev/ )" != "" ] ; then
RECPARTS=$(echo "$CRYPTACTIVEPARTS $LVMACTIVEPARTS $BTRFSRAIDACTIVEPARTS $MDADMACTIVEPARTS $IPART $HOMEPART $DATAPART $SWAPPART $EFIPART" | sed 's| |\n|g' | grep -aE "[a-zA-Z0-9]" | grep -aE "[a-z]" | sort )
else
RECPARTS=$(echo "$CRYPTACTIVEPARTS $LVMACTIVEPARTS $BTRFSRAIDACTIVEPARTS $MDADMACTIVEPARTS $IPART $HOMEPART $DATAPART $EFIPART" | sed 's| |\n|g' | grep -aE "[a-zA-Z0-9]" | grep -aE "[a-z]" | sort )
fi

if [ "$CRYPTACTIVEPARTS" != "" ] ; then
INFOCRYPTACTIVEPARTS=$(echo $"Partitions that contain active encrypted volumes:" ; lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' crypt' | awk '{print "/dev/"$1}' | sort -u | while read i ; do echo "$i : $(lsblk -r -n -o NAME,KNAME,TYPE -s $i | grep -aEiv ' disk' | awk '{print "/dev/"$2}' | grep -aEiv "^$i$" | tr "\n" " ")" ; done | sort -u ; echo \\n )
else
INFOCRYPTACTIVEPARTS=""
fi

if [ "$LVMACTIVEPARTS" != "" ] ; then
#INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; LANG=C pvscan | grep -aEiv 'Total: ' | grep -aEiv "No matching|No device" | awk '{if ( $4 !~ /\[/ ) print $4}' | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i-" | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $i " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" ))" ; done ; echo \\n )
#INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; LANG=C pvscan | grep -aEiv 'Total: ' | grep -aEiv "No matching|No device" | awk '{if ( $3 == "VG" ) print $4}' | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i-" | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $i " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" ))" ; done ; echo \\n )
#INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; lvs --noheadings --unbuffered -o vg_name,lv_name | sed 's|-|--|g' | sed "s|^ \+||g" | sed "s| \+$||g" | sed 's| |-|g' | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i " | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $(echo $i | grep -aEio ".*[a-zA-Z0-9]-[a-zA-Z0-9]" | sed "s|..$||g" | sed 's|--|-|g') " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]"))" ; done ; echo \\n )
INFOLVMACTIVEPARTS=$(echo $"Active 'LVM' extended volumes:" ; lsblk -r -n -o NAME,KNAME,RM,TYPE | grep -aEi ' lvm' | awk '{if ( $4 == "lvm" ) print $1}' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do echo "$(echo $(lsblk -r -n -o NAME,KNAME | grep -aEi "^$i " | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$NF}' | sort -u ))"" '""$i""' "$"formed by the partitions ""$(echo $(pvscan | grep -aE " $(echo $i | grep -aEio ".*[a-zA-Z0-9]-[a-zA-Z0-9]" | sed "s|..$||g" | sed 's|--|-|g') " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u))" ; done ; echo \\n )
else
INFOLVMACTIVEPARTS=""
fi

if [ "$BTRFSRAIDACTIVEPARTS" != "" ] ; then
btrfs device scan ; INFOBTRFSACTIVEPARTS=$(echo $"Partitions that are part of 'btrfs' RAID partitions systems:" ; LANG=C btrfs filesystem show | sed ':a;N;$!ba;s|\n\t| |g' | grep -aEi "[a-zA-Z0-9]" | grep -aEi 'Total devices ' | grep -aEiv 'Total devices 1 ' | while read i ; do echo $(echo $i | sed 's| |\n|g' | grep -aE "^/dev/" | sort -u | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done) ; done | grep -aEi "[a-zA-Z0-9]" | sort -u ; echo \\n )
else
INFOBTRFSACTIVEPARTS=""
fi

if [ "$MDADMACTIVEPARTS" != "" ] ; then
INFOMDADMACTIVEPARTS=$(echo $"Active 'mdadm' RAID partitions systems:" ; lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' raid' | awk '{print "/dev/"$1}' | sort -u | while read i ; do echo $i $"formed by the partitions" $(mdadm --detail $i | grep -a " /dev/" | awk '{print $NF}' | sort -u | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" | while read j ; do lsblk -r -n -o NAME,KNAME,TYPE -s $j | grep -aEiv ' disk' | awk '{print "/dev/"$2}' ; done | sort -u) ; done ; echo \\n )
else
INFOMDADMACTIVEPARTS=""
fi

}


### RECOMMENDED SIZE ########################################

if [ "$EFIDET" != "" ] ; then
RECSIZEDM=$(expr \( 3 \* $MINSIZEDM \) + 1000 + $RECSWAPSIZE )
else
RECSIZEDM=$(expr \( 3 \* $MINSIZEDM \) + $RECSWAPSIZE )
fi
RECSIZEDG=$(echo "scale=1 ; $RECSIZEDM / 1024" | bc -l )


### AUTOMATIC PARTITIONING ########################################

autopart () {

	if [ "$AUTODEV" = "" ] || [ "$AUTODEVTYPE" = "" ] || [ "$AUTODEVDISK" = "" ] || [ "$AUTODTT" = "" ] || [ "$AUTOPROP" = "" ] ; then

AUTOPARTOPT=$($DIALOG $WICON $WTITLE "$AUTOPART" $MONOLIST $WTEXT $"Please select an option:" $H $W $LH $COLUMN $COLUMN $"Use the whole disk" " " $"Use a partition" " " "$OPENPARTEDITOR" " " $"Stop now" " " | head -n 1 )

if [ "$?" -ne 0 ] || [ "$AUTOPARTOPT" = "" ] ; then
	part_opt
	return 1
fi

case $AUTOPARTOPT in

	$"Stop now" )
		clean
		exit 0
	;;

	"$OPENPARTEDITOR" )
		if [ "$G" = "N" ] ; then
			exec >/dev/tty
			if [ "$(command -v parted)" != "" ] ; then
				parted
			elif [ "$(command -v cfdisk)" != "" ] ; then
				cfdisk
			else
				REFUN=autopart
				input_error ; return
			fi
			if [ "$DEBUG" != "N" ] ; then
				exec > >(tee -a "$ERRORLOG") 2>&1
			fi
		else
			if [ "$(command -v gparted)" != "" ] ; then
				su-to-root -X -c gparted
			elif [ "$(command -v partitionmanager)" != "" ] ; then
				su-to-root -X -c partitionmanager
			elif [ -e /usr/share/applications/gparted.desktop ] ; then
				$(cat /usr/share/applications/gparted.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/org.kde.partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/org.kde.partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			else
				REFUN=autopart
				input_error ; return
			fi
		fi
		autopart
		return
	;;

	$"Use the whole disk" )
		AUTODEV=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " 0 " | grep -aEi ' disk' | awk '{print "/dev/"$1}' | head -n 1 )
		if [ "$AUTODEV" = "" ] ; then AUTODEV=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | grep -aEi ' ata| ide| pata| sata| scsi| sas| nvme| pci' | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}' | head -n 1 ) ; fi  # In some computers the internal disk can be wrongly shown as removable.
		if [ "$AUTODEV" = "" ] ; then AUTODEV=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}' | head -n 1 ) ; fi  # In some computers the internal disk can be wrongly shown as removable.
		AUTODEVTYPE="DISK"
		echo "AUTODEV=$AUTODEV" | tee -a /tmp/iivar
		echo "AUTODEVTYPE=$AUTODEVTYPE" | tee -a /tmp/iivar
	
		if [ "$AUTODTT" = "" ] ; then
		# To define a specific partition table for the 'whole disk' autopartitioning mode, set the AUTODTT variable in the /tmp/iivar template such as:
		# aix   -> AIX
		# amiga -> Amiga RDB
		# bsd   -> BSD
		# dvh   -> SGI (Disk Volume Header)
		# gpt   -> GPT (GUID Partition Table)
		# mac   -> (Pre-GPT) Apple Partition Map (APM)
		# msdos -> DOS MBR
		# pc98  -> NEC PC-98
		# sun   -> Solaris
		# loop  -> Raw Disk Access (loopback)

		if [ "$EFIDET" != "" ] ; then
			AUTODTT="gpt"
		else
			AUTODTT="msdos"
		fi
		
		echo "AUTODTT=$AUTODTT" | tee -a /tmp/iivar
		
		fi
	;;

	$"Use a partition" )
	
INT=0
ADDOPT="$ALLDEVS"
sel_part () {
	
		recparts
	
#		if [ "$RECPARTS" = "" ] ; then
#			AUTOPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u )
#			AUTOPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
#		else
#			AUTOPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
#			AUTOPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
#		fi
		# restricted to real partitions to simplify (and avoid possible complications with parted)
		if [ "$RECPARTS" = "" ] ; then
			AUTOPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " $INT " | grep -aEi ' part' | awk '{print "/dev/"$1}' | sort -u )
			AUTOPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE | grep -aEi " $INT " | grep -aEi ' part' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
		else
			AUTOPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " $INT " | grep -aEi ' part' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
			AUTOPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE | grep -aEi " $INT " | grep -aEi ' part' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
		fi

		AUTODEV=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"For auto-partitioning, a partition with a minimum size of $RECSIZEDG GiB ($RECSIZEDM MiB) is required.\n\nPlease select a partition:\n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN $AUTOPARTLISTSIZE "$ADDOPT" " " | head -n 1 )
	
		if [ "$?" -ne 0 ] || [ "$AUTODEV" = "" ] ; then
			part_opt
			return 1
		fi
	
		if [ "$AUTODEV" = "$ALLDEVS" ] ; then
			INT=.
			ADDOPT="$INTDEVS"
			sel_part
			return
		fi
	
		if [ "$AUTODEV" = "$INTDEVS" ] ; then
			INT=0
			ADDOPT="$ALLDEVS"
			sel_part
			return
		fi
	
}
		sel_part || return 1
	
		AUTODEVTYPE="PART"
		echo "AUTODEV=$AUTODEV" | tee -a /tmp/iivar
		echo "AUTODEVTYPE=$AUTODEVTYPE" | tee -a /tmp/iivar
	;;

	* )
		echo "ERROR: AUTOPARTOPT=$AUTOPARTOPT"
		REFUN=part_opt
		input_error ; return
	;;

esac

if [ "$AUTODEV" = "" ] ; then
	REFUN=autopart
	input_error ; return
fi

# check space
AUTODEVSIZEM=$(expr $(lsblk -r -n -b -o SIZE "$AUTODEV" | head -n 1) / 1024 / 1024 )
AUTODEVSIZEG=$(echo "scale=1 ; $AUTODEVSIZEM / 1024" | bc -l )

if [ "$AUTODEVSIZEM" -lt "$RECSIZEDM" ] ; then
#if [ "$(echo ${AUTODEVSIZEM} '<' ${RECSIZEDM} | bc -l)" -eq 1 ] ; then

	LACKSPACE=$"The size of the selected $AUTODEV ($AUTODEVSIZEM MiB = $AUTODEVSIZEG GiB) is smaller than necessary ($RECSIZEDM MiB = $RECSIZEDG GiB) for auto-partitioning."

	$DIALOG $WICON $WTITLE $"Partition too small" $ERROR $WTEXT "$LACKSPACE" $H $W

	autopart
	return

fi


### partitioning proposal ########################################

AUTOPROP=/tmp/"$CNAME"_"$(date +%Y%m%d_%H%M%S)"
if [ -e "$AUTOPROP" ] ; then
	mv -f "$AUTOPROP" "$AUTOPROP".ant
fi
rm -rf "$AUTOPROP"

CHECK_LABELIPART=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEiv ^$(echo $AUTODEV | sed "s|^/dev/||g") | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^$DISTROLABEL$")
if [ "$CHECK_LABELIPART" = "" ] ; then
	AUTOLABELIPART="$DISTROLABEL"
else
	for i in {1..999} ; do
	CHECK_LABELIPART=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^${DISTROLABEL}_${i}$")
		if [ "$CHECK_LABELIPART" = "" ] ; then
			AUTOLABELIPART="${DISTROLABEL}_${i}"
			break
		fi
	done
fi

if [ "$G" = "N" ] ; then
	personal="home"
else
	personal=$"personal"
fi
CHECK_LABELHOME=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEiv ^$(echo $AUTODEV | sed "s|^/dev/||g") | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^$personal$")
if [ "$CHECK_LABELHOME" = "" ] ; then
	AUTOLABELHOME="$personal"
else
	for i in {1..999} ; do
	CHECK_LABELHOME=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^${personal}_${i}$")
		if [ "$CHECK_LABELHOME" = "" ] ; then
			AUTOLABELHOME="${personal}_${i}"
			break
		fi
	done
fi

# Detect if the disk is rotational or not
#lsblk -r -n -o ROTA -d $AUTODEV
#cat /sys/block/$(echo $AUTODEV | sed 's|/dev/||g')/queue/rotational

if   [ "$AUTODEVTYPE" = "DISK" ] ; then

AUTODEVDISK="$AUTODEV"
echo "AUTODEVDISK=$AUTODEV" | tee -a /tmp/iivar

if [ "$(echo "$AUTODEV" | grep -aE "[0-9]$")" != "" ] ; then
	AUTODEVDISKSUF="${AUTODEV}p"
else
	AUTODEVDISKSUF="$AUTODEV"
fi

	if [ "$EFIDET" != "" ] ; then
		if [ $(free -m | grep -aEi "^Mem" | awk '{print $2}') -le 3600 ] ; then
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
# Swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	vfat		EFI	esp	0G	$(expr 1000 - 32)	0$(echo "scale=2; ( 1000 - 32 - 1 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary				bios_grub	$(expr 1000 - 32)	1000	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	swap		swap		1000	$(expr $RECSWAPSIZEMB + 1000)	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
4	primary	ext4	/	$AUTOLABELIPART		$(expr $RECSWAPSIZEMB + 1000)	100%	$(echo "scale=2; ( $AUTODEVSIZEM - $RECSWAPSIZEMB - 1000) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			else
# Swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	vfat		EFI	esp	0G	$(expr 1000 - 32)	0$(echo "scale=2; ( 1000 - 32 - 1 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary				bios_grub	$(expr 1000 - 32)	1000	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	swap		swap		1000	$(expr $RECSWAPSIZEMB + 1000)	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
4	primary	ext4	/	$AUTOLABELIPART		$(expr $RECSWAPSIZEMB + 1000)	$(expr $RECSWAPSIZEMB + 1000 + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
5	primary	ext4	/home	$AUTOLABELHOME		$(expr $RECSWAPSIZEMB + 1000 + 45100)	100%	$(echo "scale=2; ( $AUTODEVSIZEM - $RECSWAPSIZEMB - 1000 - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			fi
		else
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
# No swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	vfat		EFI	esp	0G	$(expr 1000 - 32)	0$(echo "scale=2; ( 1000 - 32 - 1 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary				bios_grub	$(expr 1000 - 32)	1000	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	ext4	/	$AUTOLABELIPART		1000	100%	$(echo "scale=2; ( $AUTODEVSIZEM - 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			else
# No swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	vfat		EFI	esp	0G	$(expr 1000 - 32)	0$(echo "scale=2; ( 1000 - 32 - 1 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary				bios_grub	$(expr 1000 - 32)	1000	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	ext4	/	$AUTOLABELIPART		1000	$(expr 1000 + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
4	primary	ext4	/home	$AUTOLABELHOME		$(expr 1000 + 45100)	100%	$(echo "scale=2; ( $AUTODEVSIZEM - 1000 - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			fi
		fi
	elif [ "$COREBOOT" != "" ] ; then
		if [ $(free -m | grep -aEi "^Mem" | awk '{print $2}') -le 3600 ] ; then
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
# Swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	swap		swap		0G	$RECSWAPSIZEMB	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary	ext4	/	$AUTOLABELIPART		$RECSWAPSIZEMB	$(expr $AUTODEVSIZEM - 1000)	$(echo "scale=2; ( $AUTODEVSIZEM - $RECSWAPSIZEMB - 1000) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	ext3	/boot	boot	boot	$(expr $AUTODEVSIZEM - 1000)	100%	0$(echo "scale=2; ( 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			else
# Swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	swap		swap		0G	$RECSWAPSIZEMB	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary	ext4	/	$AUTOLABELIPART		$RECSWAPSIZEMB	$(expr $RECSWAPSIZEMB + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	ext3	/boot	boot	boot	$(expr $RECSWAPSIZEMB + 45100)	$(expr $RECSWAPSIZEMB + 45100 + 1000)	0$(echo "scale=2; ( 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
4	primary	ext4	/home	$AUTOLABELHOME		$(expr $RECSWAPSIZEMB + 45100 + 1000)	100%	$(echo "scale=2; ( $AUTODEVSIZEM - $RECSWAPSIZEMB - 45100 - 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			fi
		else
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
# No swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	ext4	/	$AUTOLABELIPART		0G	$(expr $AUTODEVSIZEM - 1000)	$(echo "scale=2; ( $AUTODEVSIZEM - 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary	ext3	/boot	boot	boot	$(expr $AUTODEVSIZEM - 1000)	100%	0$(echo "scale=2; ( 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			else
# No swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	ext4	/	$AUTOLABELIPART		0G	45100	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary	ext3	/boot	boot	boot	45100	$(expr 45100 + 1000)	0$(echo "scale=2; ( 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	ext4	/home	$AUTOLABELHOME		$(expr 45100 + 1000)	100%	$(echo "scale=2; ( $AUTODEVSIZEM - 45100 - 1000 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			fi
		fi
#	! [ "$EFIDET" != "" ] && ! [ "$COREBOOT" != "" ]
	else
		if [ $(free -m | grep -aEi "^Mem" | awk '{print $2}') -le 3600 ] ; then
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
# Swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	swap		swap		0G	$RECSWAPSIZEMB	$(echo "scale=2; ( $RECSWAPSIZEMB - 1 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary	ext4	/	$AUTOLABELIPART	boot	$RECSWAPSIZEMB	100%	$(echo "scale=2; ( $AUTODEVSIZEM - $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			else
# Swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	swap		swap		0G	$RECSWAPSIZEMB	$(echo "scale=2; ( $RECSWAPSIZEMB - 1 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary	ext4	/	$AUTOLABELIPART	boot	$RECSWAPSIZEMB	$(expr $RECSWAPSIZEMB + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
3	primary	ext4	/home	$AUTOLABELHOME		$(expr $RECSWAPSIZEMB + 45100)	100%	$(echo "scale=2; ( $AUTODEVSIZEM - $RECSWAPSIZEMB - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			fi
		else
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
# No swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	ext4	/	$AUTOLABELIPART	boot	0G	100%	$(echo "scale=2; ( $AUTODEVSIZEM - 1 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			else
# No swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
1	primary	ext4	/	$AUTOLABELIPART	boot	0G	45100	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
2	primary	ext4	/home	$AUTOLABELHOME		45100	100%	$(echo "scale=2; ( $AUTODEVSIZEM - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
			fi
		fi
	fi
elif [ "$AUTODEVTYPE" = "PART" ] ; then
AUTODEVNPART=$(echo "$AUTODEV" | sed "s|.*[a-zA-Z/:-]||g" )
	AUTODEVDISK=$(lsblk -r -n -o KNAME,TYPE -s $AUTODEV | grep -aEi ' disk' | awk '{print "/dev/"$1}' | sort -u)
	# fix around (mmc)blk devices with (mmc)blkXpY partitions (e.g. /dev/mmcblk0p1 ) and NVME devices with nvmeXnYpZ partitions (e.g. /dev/nvme0n1p1 ):
	AUTODEVDISKSUF=$(echo "$AUTODEV" | sed "s|${AUTODEVNPART}$||g" )
	CHECK_AUTODEVDISKSUF=$(echo "$AUTODEVDISKSUF" | grep -aEi "[0-9]p$")
	if [ "$CHECK_AUTODEVDISKSUF" != "" ] ; then
		PROP_AUTODEVDISK=$(echo "$AUTODEVDISKSUF" | sed "s|p$||g")
	else
		PROP_AUTODEVDISK=$AUTODEVDISKSUF
	fi
#fi
if [ "$(lsblk -r -n -o KNAME,RM,TYPE $PROP_AUTODEVDISK | grep -aEi ' disk')" = "" ] ; then
	check_exit
else
	AUTODEVDISK=$PROP_AUTODEVDISK
	echo "AUTODEVDISK=$AUTODEV" | tee -a /tmp/iivar
fi
parted -s $AUTODEVDISK print
parted -s $AUTODEVDISK unit B print
DTTDISK=$(LANG=C parted -s $AUTODEVDISK print | grep -aEi 'Partition Tab' | awk '{print $NF}')
# Partition numbering may not match their physical order on disk (the end partition is not necessarily the highest numbered partition).
#sfdisk --reorder $AUTODEVDISK ; sfdisk --verify $AUTODEVDISK
MPART=$(lsblk -r -n -o KNAME,RM,TYPE $AUTODEVDISK | grep -aEiv ' disk' | awk '{print $1}' | sed "s|.*[a-zA-Z/:-]||g" | sort -n | tail -n 1 )
ENDPARTN=$(parted -s $AUTODEVDISK unit B print | grep -aEi "^[0-9]|^ [0-9]" | awk '{print $3,$1,$5}' | grep -aEiv extend | sort -n | tail -n 1 | awk '{print $2}')
STARTM=$(parted -s $AUTODEVDISK unit MB print | grep -aEi "^$AUTODEVNPART |^ $AUTODEVNPART " | awk '{print $2}' | sed "s|[a-zA-Z/:-].*||g")
ENDPARTFM=$(parted -s $AUTODEVDISK unit MB print | grep -aEi "^$AUTODEVNPART |^ $AUTODEVNPART " | awk '{print $3}' | sed "s|[a-zA-Z/:-].*||g")
#LOGSEC=$(lsblk -r -n -o LOG-SEC $AUTODEV | head -n 1 )
#STARTM=$(expr $START \* $LOGSEC / 1000 / 1000 )
#ENDPARTFM=$(expr $END \* $LOGSEC / 1000 / 1000 )
EXISTSWAP=$(lsblk -r -n -o KNAME,RM,FSTYPE,TYPE,NAME $AUTODEVDISK | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | grep -aEi ' swap ' | awk '{print "/dev/"$1}' | sort -u )
	if [ "$EFIDET" != "" ] ; then
		if [ $(free -m | grep -aEi "^Mem" | awk '{print $2}') -le 3600 ] && [ "$EXISTSWAP" = "" ] ; then
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
				if [ "$(parted -s $AUTODEVDISK print | grep -a ' bios_grub')" = "" ] ; then
# Swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary				bios_grub	$STARTM	$(expr $STARTM + 32)	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	swap		swap		$(expr $STARTM + 32)	$(expr $STARTM + 32 + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 2)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + 32 + $RECSWAPSIZEMB )	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - 32 - $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# Swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	swap		swap		$STARTM	$(expr $STARTM + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $RECSWAPSIZEMB )	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			else
				if [ "$(parted -s $AUTODEVDISK print | grep -a ' bios_grub')" = "" ] ; then
# Swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary				bios_grub	$STARTM	$(expr $STARTM + 32)	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	swap		swap		$(expr $STARTM + 32)	$(expr $STARTM + 32 + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 2)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + 32 + $RECSWAPSIZEMB )	$(expr $STARTM + 32 + $RECSWAPSIZEMB + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 3)	primary	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + 32 + $RECSWAPSIZEMB + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - 32 - $RECSWAPSIZEMB - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# Swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	swap		swap		$STARTM	$(expr $STARTM + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $RECSWAPSIZEMB )	$(expr $STARTM + $RECSWAPSIZEMB + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 2)	primary	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + $RECSWAPSIZEMB + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $RECSWAPSIZEMB - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			fi
		else
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
				if [ "$(parted -s $AUTODEVDISK print | grep -a ' bios_grub')" = "" ] ; then
# No swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary				bios_grub	$STARTM	$(expr $STARTM + 32)	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + 32)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# No swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	ext4	/	$AUTOLABELIPART		$STARTM	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			else
				if [ "$(parted -s $AUTODEVDISK print | grep -a ' bios_grub')" = "" ] ; then
# No swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary				bios_grub	$STARTM	$(expr $STARTM + 32)	0$(echo "scale=2; ( 32 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + 32)	$(expr $STARTM + 32 + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 2)	primary	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + 32 + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - 32 - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# No swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	ext4	/	$AUTOLABELIPART		$STARTM	$(expr $STARTM + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			fi
		fi
	# ! [ "$EFIDET" != "" ]
	else

		if [ "$DTTDISK" = "msdos" ] || [ "$DTTDISK" = "dvh" ] ; then
			CHECK_EXT=$(parted -s $AUTODEVDISK print | grep -a ' extended')
			if [ "$CHECK_EXT" = "" ] ; then
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	extended					$STARTM	$ENDPARTFM
EOF
				MPART=$(expr $MPART + 1 )
				EXT=1
			else
				EXT=0
			fi
		fi

		if [ $(free -m | grep -aEi "^Mem" | awk '{print $2}') -le 3600 ] && [ "$EXISTSWAP" = "" ] ; then
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
				if [ "$DTTDISK" = "msdos" ] || [ "$DTTDISK" = "dvh" ] ; then
# Swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	logical	swap		swap		$(expr $STARTM + $EXT)	$(expr $STARTM + $EXT + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	logical	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $EXT + $RECSWAPSIZEMB )	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $EXT - $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# Swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	swap		swap		$STARTM	$(expr $STARTM + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $RECSWAPSIZEMB )	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			else
				if [ "$DTTDISK" = "msdos" ] || [ "$DTTDISK" = "dvh" ] ; then
# Swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	logical	swap		swap		$(expr $STARTM + $EXT)	$(expr $STARTM + $EXT + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	logical	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $EXT + $RECSWAPSIZEMB )	$(expr $STARTM + $EXT + $RECSWAPSIZEMB + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 2)	logical	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + $EXT + $RECSWAPSIZEMB + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $EXT - $RECSWAPSIZEMB - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# Swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	swap		swap		$STARTM	$(expr $STARTM + $RECSWAPSIZEMB )	$(echo "scale=2; ( $RECSWAPSIZEMB ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $RECSWAPSIZEMB )	$(expr $STARTM + $RECSWAPSIZEMB + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 2)	primary	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + $RECSWAPSIZEMB + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $RECSWAPSIZEMB - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			fi
		else
			if [ "$AUTODEVSIZEM" -lt 88600 ] ; then
				if [ "$DTTDISK" = "msdos" ] || [ "$DTTDISK" = "dvh" ] ; then
# No swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	logical	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $EXT)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $EXT ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# No swap, no home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	ext4	/	$AUTOLABELIPART		$STARTM	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			else
				if [ "$DTTDISK" = "msdos" ] || [ "$DTTDISK" = "dvh" ] ; then
# No swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	logical	ext4	/	$AUTOLABELIPART		$(expr $STARTM + $EXT)	$(expr $STARTM + $EXT + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	logical	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + $EXT + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - $EXT - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				else
# No swap, home.
cat >> "$AUTOPROP" <<EOF
PART	TYPE	FS	MPOINT	LABEL	FLAG	START	END	CALCULATEDSIZE
$(expr $MPART + 0)	primary	ext4	/	$AUTOLABELIPART		$STARTM	$(expr $STARTM + 45100)	$(echo "scale=2; ( 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
$(expr $MPART + 1)	primary	ext4	/home	$AUTOLABELHOME		$(expr $STARTM + 45100)	$ENDPARTFM	$(echo "scale=2; ( $ENDPARTFM - $STARTM - 45100 ) * 1000 * 1000 / 1024 / 1024 / 1024" | bc -l) GiB
EOF
				fi
			fi
		fi
	fi
else
	echo "ERROR: AUTODEVTYPE=$AUTODEVTYPE"
	REFUN=part_opt
	input_error ; return
fi

AUTOPROPTEXT=$(cat "$AUTOPROP" | grep -aEi "^[0-9]" | grep -aEiv extended | awk -F "\t" '{print $1"\t"$3"\t"$NF"\t"$4"\t"$5}' )

### ALL OK?

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"$AUTODEV ($AUTODEVSIZEM MiB = $AUTODEVSIZEG GiB) will be partitioned according to the following scheme saved in $AUTOPROP if you want.\n\n$AUTOPROPTEXT\n\nIf you want you can modify $AUTOPROP before continuing.\n\nDo you want to continue the installation in this way? (Otherwise the installer will return to the previous question.)\n\n" $H $W

if [ "$?" -ne 0 ] ; then
	rm -f "$AUTOPROP"
	unset AUTOPROP
	part_opt
	return 1
else
	echo "AUTOPROP=\"$AUTOPROP\"" | tee -a /tmp/iivar
	cat "$AUTOPROP"
fi

	# End: if [ "$AUTODEV" = "" ] || [ "$AUTODEVTYPE" = "" ] || [ "$AUTODEVDISK" = "" ] || [ "$AUTODTT" = "" ] || [ "$AUTOPROP" = "" ]
	fi

}


### PARTITIONING ########################################

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"

OPENPARTEDITOR=$"Open the partition manager"
AUTOPART=$"Automatic partitioning proposal"
DONOTFORMAT=$"Do not format"
ADVANCEDOPTIONS=$"Advanced options"
# /home:
NOHOMEPART=$"Do not use a separate /home partition"
# data:
NODATAPART=$"Do not use a separate partition"
# swap:
USESWAPFILE=$"Use a swap file (no a separate partition)"
NOSWAP=$"Do not use swap"

	if [ "$TEMPLATE" != "Y" ] ; then

NDISKS=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " 0 " | grep -aEi ' disk' | awk '{print $1}' | sort -u | grep -a -c ^ )
if [ "$NDISKS" -eq 0 ] ; then NDISKS=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | grep -aEi ' ata| ide| pata| sata| scsi| sas| nvme| pci' | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print $1}' | sort -u | grep -a -c ^ ) ; fi  # In some computers the internal disk can be wrongly shown as removable.
if [ "$NDISKS" -eq 0 ] ; then NDISKS=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print $1}' | sort -u | grep -a -c ^ ) ; fi  # In some computers the internal disk can be wrongly shown as removable.
if [ "$NDISKS" -gt 1 ] && [ "$(command -v mdadm btrfs)" != "" ] ; then
	RAIDTEXT=$"It seems that you have $NDISKS disks. If they are internal disks, you could create a RAID 1 (mirror) partitions system that can replicate in real time the content stored on the computer so that if one of the internal disks crashes you would have the content replicated on the other (obviously if the damage does not affect both disks). If you are interested in this option, you must create partitions of the same size on different internal disks.\n\n"
fi

PARTTEXT1=$"In order to install the system, a minimum of $MINSIZEDG GiB ($MINSIZEDM MiB, recommended triple) of free internal disk to create at least one partition formatted in 'ext4' (or other compatible file system as 'btrfs' or 'nilfs2') is required. This is the named 'system partition' ( / ).\n\nOptionally a separate partition to store the personal files (settings, documents, photos,...) may be created, the named '/home partition'. It is also possible to create a separated 'data partition' for storing some files (documents, photos,...) in order to work with them using different operating systems installed on the computer. It is recommended to create a /home or a data partition.\n\n"

if [ "$RECSWAPSIZE" = "$RECSWAPSIZE2" ] ; then
PARTTEXT2=$"Optionally it is possible to use a portion of the internal disk as complementary space to RAM (operational or working memory), the named 'on-disk complementary memory space' or 'swap space'. A swap partition may be created or an existing one may be used. The swap space is optional: it is useful in old computers and if you want to enable hibernation on laptops (not necessary to turn off the screen), but increases the disk usage (increases the power consumption and shorts the life of the disk). If you want to use a swap space, it is recommended to assign $RECSWAPSIZE MiB and create this partition before creating system, /home and data partitions.\n\n"
else
PARTTEXT2=$"Optionally it is possible to use a portion of the internal disk as complementary space to RAM (operational or working memory), the named 'on-disk complementary memory space' or 'swap space'. A swap partition may be created or an existing one may be used. The swap space is optional: it is useful in old computers and if you want to enable hibernation on laptops (not necessary to turn off the screen), but increases the disk usage (increases the power consumption and shorts the life of the disk). If you want to use a swap space, it is recommended to assign between $RECSWAPSIZE (as minimum to be useful) and $RECSWAPSIZE2 MiB (i.e. a size slightly larger than twice the total RAM size of the computer) and create this partition before creating system, /home and data partitions.\n\n"
fi

PARTEDITORTEXT1=$"If it is an 'EFI' installation, the first partition of the internal disk must be in FAT32 ('vfat') format with the 'esp' flag enabled and have an approximate size of 100-1000 MiB, this partition must NOT be reformatted if there are operating systems that you want to preserve. It is also recommended a small additional partition with a size of 1-32 MiB, without any format and with the 'bios_grub' flag enabled.\n\nIf it is a 'BIOS-MBR/msdos' installation, remember that you must create an 'extended' (not 'primary') partition across the entire free space of the internal disk if you want to have the possibility of more than 4 partitions.\n\nIf you want to completely erase the internal disk using the partition manager, create a 'msdos' partition table for 'BIOS-MBR/msdos' or 'gpt' for 'EFI-GPT'.\n\n"

PARTEDITORTEXT2=$"You can choose between an automatic partitioning proposal or open the partition manager to create the necessary partitions.\n\n(If you change something using the partition manager do not forget to click 'Apply', write down what can be interesting, and finally close it once it finishes.)\n"

part_opt () {

#PARTOPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT "${PARTTEXT1}${PARTTEXT2}${RAIDTEXT}${EFICHECKTEXT}${COREBOOTTEXT}${PARTEDITORTEXT1}${PARTEDITORTEXT2}" $H $W $LH $COLUMN $COLUMN "$OPENPARTEDITOR" " " "$AUTOPART" " " $"Stop now" " " | head -n 1 )
$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"${PARTTEXT1}${RAIDTEXT}" $H $W
$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"${PARTTEXT2}" $H $W
$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"${EFICHECKTEXT}${COREBOOTTEXT}${PARTEDITORTEXT1}" $H $W
PARTOPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT "${PARTEDITORTEXT2}" $H $W $LH $COLUMN $COLUMN "$AUTOPART" " " "$OPENPARTEDITOR" " " $"Stop now" " " | head -n 1 )

if [ "$?" -ne 0 ] || [ "$PARTOPT" = "" ] ; then
	clean
	exit 0
fi

case $PARTOPT in

	$"Stop now" )
		clean
		exit 0
	;;

	"$AUTOPART" )
		autopart
	;;

	"$OPENPARTEDITOR" )
		if [ "$G" = "N" ] ; then
			exec >/dev/tty
			if [ "$(command -v parted)" != "" ] ; then
				parted
			elif [ "$(command -v cfdisk)" != "" ] ; then
				cfdisk
			else
				REFUN=part_opt
				input_error ; return
			fi
			if [ "$DEBUG" != "N" ] ; then
				exec > >(tee -a "$ERRORLOG") 2>&1
			fi
		else
			if [ "$(command -v gparted)" != "" ] ; then
				su-to-root -X -c gparted
			elif [ "$(command -v partitionmanager)" != "" ] ; then
				su-to-root -X -c partitionmanager
			elif [ -e /usr/share/applications/gparted.desktop ] ; then
				$(cat /usr/share/applications/gparted.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			elif [ -e /usr/share/applications/org.kde.partitionmanager.desktop ] ; then
				$(cat /usr/share/applications/org.kde.partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
			else
				REFUN=part_opt
				input_error ; return
			fi
		fi
	;;

	* )
		echo "ERROR: PARTOPT=$PARTOPT"
		check_exit
	;;

esac

}

	else
part_opt () {
autopart
}
	# End: if [ "$TEMPLATE" != "Y" ]
	fi

part_opt

# printf "lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID \nread" > /tmp/lsblk-test ; chmod +x /tmp/lsblk-test ; TT=$"Disks" ; COM="bash /tmp/lsblk-test" ; TERMINAL ; rm -f /tmp/lsblk-test


### MANUAL PARTITIONING ########################################

#	if [ "$TEMPLATE" != "Y" ] ; then

if [ "$AUTOPROP" = "" ] ; then

### LUKS CRYPT CREATE ########################################

luks_crea () {

# set partitions

set_lukspart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	LUKSPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u )
	LUKSPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
else
	LUKSPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
	LUKSPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

LUKSPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select the partition on which you want to create a 'LUKS' encrypted volume.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}WARNING: The content of the selected partition will be ERASED: Please cancel if you don't want to do it! \n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN $LUKSPARTLISTSIZE | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$LUKSPART" = "" ] ; then
		return 1
	fi

}

set_lukspart || return 1


# set password

set_lukspass () {
LUKSPASS=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a password for the 'LUKS' encrypted volume on $LUKSPART \n" $H $W)

	if [ "$?" -ne 0 ] ; then
		return 1
	fi

	if [ "$LUKSPASS" = "" ] ; then
	REFUN=set_lukspass
	input_error ; return
	fi
}

set_lukspass || return 1


# set LUKS type (only cryptsetup >=2)

set_lukstype () {

GRUBVERN=$(dpkg -l | grep -aEi "^ii|^hi" | awk '{print $2,$3}' | grep -aEi "^grub" | sed "s|:.*||g" | grep -aEiv "^grub2 |\-choose\-|\-common |\-customizer |\-bin |\-dbg |\-dbgsym |\-disk |\-doc |\-efi |\-emu |\-firmware\-|\-grubby |\-image|\-installer |\-invaders |\-linuxbios |grub\-menu |\-mount\-|\-theme\-|\-rescue\-|\-splash|\-template" | awk '{print $2}' | awk -F '-|_' '{print $1}' | sort -u | tail -n 1)

if [ "$(echo ${GRUBVERN} '<' 2.06 | bc -l)" -eq 1 ] ; then
	GRUBLUKS=$"\n\nOnly LUKS1, not LUKS2, can be used for partitions involved in booting the operating system. If in doubt, use LUKS1."
else
	GRUBLUKS=$"\n\nLUKS2 is recommended."
fi

# https://savannah.gnu.org/bugs/?55093
# https://savannah.gnu.org/bugs/?59409
GRUBLUKS=$"\n\nLUKS2 is the general recommendation, but LUKS1 is preferable for the partition where /boot is (if a separate /boot partition is used, it is recommended to use LUKS2 for the system root partition)."

	PRE_LUKSTYPE=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"What LUKS encryption type do you want to use? $GRUBLUKS\n" $H $W $LH $COLUMN $COLUMN "luks2" " " "luks1" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$PRE_LUKSTYPE" = "" ] ; then
	REFUN=set_lukstype
	input_error ; return
	fi

	LUKSTYPE="--type ${PRE_LUKSTYPE}"

}

LUKSVERSION=$(cryptsetup --version | tr " " "\n" | grep -aEi "^[0-9]" | cut -d '.' -f 1 )

if [ "$LUKSVERSION" -ge 2 ] ; then
	set_lukstype || return 1
fi


# set random generator

set_luksrgen () {

	PRE_RGEN=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"What random generator do you want to use to generate the master key?\n\n'urandom' is faster but it might generate a weaker key. If in doubt, use 'urandom'.\n" $H $W $LH $COLUMN $COLUMN "urandom" " " "random" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$PRE_RGEN" = "" ] ; then
	REFUN=set_luksrgen
	input_error ; return
	fi

	RGEN="--use-${PRE_RGEN}"

}

set_luksrgen || return 1


# Create 'luks'

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGLUKS=$( echo $! )

if [ "$(lsblk -r -n -o FSTYPE $LUKSPART | head -n 1 | grep -aEi swap )" != "" ] ; then
	swapoff $LUKSPART
fi

umount $LUKSPART

# delete RAID header
if [ "$(lsblk -r -n -o FSTYPE $LUKSPART | head -n 1 | grep -aEi 'raid')" != "" ] ; then
	mdadm --zero-superblock $LUKSPART
fi

# clean partition
for n in {1..9} ; do wipefs -f -a $LUKSPART ; done

if [ "$(uname -r | grep -aE '^2.6.')" != "" ] && [ "$(uname -r | sed 's|[a-z]||g' | sed 's|-.*||g' | cut -d '.' -f 3 )" -lt 33 ] ; then
	printf "$LUKSPASS\n" | cryptsetup -q -v $LUKSTYPE $RGEN luksFormat $LUKSPART
else
	printf "$LUKSPASS\n" | cryptsetup -q -v $LUKSTYPE --cipher=aes-xts-plain64 $RGEN luksFormat $LUKSPART
fi

printf "$LUKSPASS\n" | cryptsetup luksOpen $LUKSPART e$(echo $LUKSPART | sed 's|/dev/||g')

echo "### Detail Information"
cryptsetup -v status e$(echo $LUKSPART | sed 's|/dev/||g')

LUKSUUID=$(lsblk -r -n -o UUID $LUKSPART | head -n 1 )
if [ "$LUKSUUID" = "" ] ; then LUKSUUID=$(blkid -o value -s UUID $LUKSPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
if [ "$LUKSUUID" = "" ] ; then LUKSUUID=$(find -L /dev/disk/by-uuid/ -samefile $LUKSPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi

if [ "$LUKSUUID" != "" ] ; then

cat /etc/crypttab
echo "e$(echo $LUKSPART | sed 's|/dev/||g')           UUID=$LUKSUUID               none            luks " >> /etc/crypttab
cat /etc/crypttab

else

LUKSPARTID=$(find -L /dev/disk/by-id/ -samefile $LUKSPART | sort | tail -n 1 )
if [ "$LUKSPARTID" = "" ] ; then
	LUKSPARTID=$(ls -l /dev/disk/by-id/* | grep -aE "$(echo $LUKSPART | sed 's|/dev/||g' )$" | grep -aEo '/dev/disk/by-id/.* ->' | sed 's| ->||g' | sort | tail -n 1 )
fi

if [ "$LUKSPARTID" = "" ] ; then
	REFUN=luks_crea
	input_error ; return
fi

cat /etc/crypttab
echo "e$(echo $LUKSPART | sed 's|/dev/||g')           $LUKSPARTID              none            luks " >> /etc/crypttab
cat /etc/crypttab

fi

#if [ -e /etc/cryptsetup-initramfs/conf-hook ] && [ "$(command -v cryptsetup)" != "" ] ; then if [ "$(cat /etc/cryptsetup-initramfs/conf-hook | grep -aE ^CRYPTSETUP= )" != "" ] ; then sed -i "s|^CRYPTSETUP=.*|CRYPTSETUP=y|g" /etc/cryptsetup-initramfs/conf-hook ; else echo 'CRYPTSETUP=y' >> /etc/cryptsetup-initramfs/conf-hook ; fi ; fi
#echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
#update-initramfs -u -v -k all

	kill $PIDDIALOGLUKS 2>/dev/null


# backup

dest_dialog () {
DEST=$($DIALOG $WICON $WTITLE $"Optionally you can select a folder/directory to dump a backup copy of the header of $LUKSPART" $DSEL /home/ $H $W)
}
dest_dialog || return 1

if [ "$DEST" != "" ] ; then

	if [ ! -d "$DEST" ] ; then
		REFUN=dest_dialog
		input_error ; return
	fi

	if [ -e "$DEST"/"$(echo $LUKSPART | sed 's|/dev/||g')" ] ; then
		mv -f "$DEST"/"$(echo $LUKSPART | sed 's|/dev/||g')" "$DEST"/"$(echo $LUKSPART | sed 's|/dev/||g')".ant
	fi

cryptsetup luksHeaderBackup $LUKSPART --header-backup-file "$DEST"/"$(echo $LUKSPART | sed 's|/dev/||g')"

fi

# delete plain-text passwords
if [ "$DEBUG" = "Y" ] ; then set +xv ; fi
sed -i "s|$LUKSPASS|__LUKSPASS__|g" $ERRORLOG
exec > >(tee -a "$ERRORLOG") 2>&1 ; if [ "$DEBUG" = "Y" ] ; then set -xv ; fi
unset LUKSPASS

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

}


### TC CRYPT CREATE ########################################

tc_crea () {

# set partitions

set_tcpart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	TCPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u )
	TCPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
else
	TCPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
	TCPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

TCPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select the partition on which you want to create a 'TC' encrypted volume.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}WARNING: The content of the selected partition will be ERASED: Please cancel if you don't want to do it! \n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN $TCPARTLISTSIZE | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$TCPART" = "" ] ; then
		return 1
	fi

}

set_tcpart || return 1


# set password

set_tcpass () {
TCPASS=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a password for the 'TC' encrypted volume on $TCPART \n" $H $W)

	if [ "$?" -ne 0 ] ; then
		return 1
	fi

	if [ "$TCPASS" = "" ] ; then
	REFUN=set_tcpass
	input_error ; return
	fi
}

set_tcpass || return 1


# set random generator

set_tcrgen () {

	PRE_RGEN=$($DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Do you want to use 'urandom' to generate the master key?\n\n'urandom' is faster but it might generate a weaker key. If in doubt, use 'urandom'.\n" $H $W)

	if [ "$?" -eq 0 ] ; then
	RGEN="-w"
	elif [ "$?" -eq 1 ] ; then
	RGEN=""
	else
	REFUN=set_tcrgen
	input_error ; return
	fi

}

set_tcrgen || return 1


# Create 'tc'

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGTC=$( echo $! )

if [ "$(lsblk -r -n -o FSTYPE $TCPART | head -n 1 | grep -aEi swap )" != "" ] ; then
	swapoff $TCPART
fi

umount $TCPART

# delete RAID header
if [ "$(lsblk -r -n -o FSTYPE $TCPART | head -n 1 | grep -aEi 'raid')" != "" ] ; then
	mdadm --zero-superblock $TCPART
fi

# clean partition
for n in {1..9} ; do wipefs -f -a $TCPART ; done

#printf "$TCPASS\n$TCPASS\ny\n" | tcplay --create -z --cipher=AES-256-XTS $RGEN -d $TCPART
if [ "$(command -v expect)" != "" ] ; then
	expect -c "spawn tcplay --create -z --cipher=AES-256-XTS $RGEN -d $TCPART ; expect Passphrase ; send \"$TCPASS\r\" ; expect Repeat ; send \"$TCPASS\r\" ; expect proceed ; send y\r ; interact "
else
	echo "tcplay --create -z --cipher=AES-256-XTS $RGEN -d $TCPART " > /tmp/tcscript
	chmod +x /tmp/tcscript
	exec >/dev/tty
	TT="$TITLE" ; COM="bash /tmp/tcscript" ; TERMINAL ; rm -f /tmp/tcscript
	if [ "$DEBUG" != "N" ] ; then
		exec > >(tee -a "$ERRORLOG") 2>&1
	fi
fi

printf "$TCPASS\n" | tcplay -d $TCPART -m e$(echo $TCPART | sed 's|/dev/||g')

echo "### Detail Information"
printf "$TCPASS\n" | tcplay -i -d $TCPART

# no identifiable header is created by tcplay: blank FSTYPE in lsblk, not listed in blkid, and no UUID.
TCPARTID=$(find -L /dev/disk/by-id/ -samefile $TCPART | sort | tail -n 1 )
if [ "$TCPARTID" = "" ] ; then
	TCPARTID=$(ls -l /dev/disk/by-id/* | grep -aE "$(echo $TCPART | sed 's|/dev/||g' )$" | grep -aEo '/dev/disk/by-id/.* ->' | sed 's| ->||g' | sort | tail -n 1 )
fi

if [ "$TCPARTID" = "" ] ; then
	REFUN=tc_crea
	input_error ; return
fi

cat /etc/crypttab
echo "e$(echo $TCPART | sed 's|/dev/||g')           $TCPARTID              none            tcrypt " >> /etc/crypttab
cat /etc/crypttab

#echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
#update-initramfs -u -v -k all

	kill $PIDDIALOGTC 2>/dev/null


# backup
# Option  --save-hdr-backup  only tcplay version >= 2
# In version 1, use option  --use-backup  in order to use the backup headers which are located at the end of the device.
if [ "$(tcplay -v | sed 's|[a-zA-Z -]||g' | cut -d '.' -f 1 )" -ge 2 ] ; then

	dest_dialog () {
	DEST=$($DIALOG $WICON $WTITLE $"Optionally you can select a folder/directory to dump a backup copy of the header of $TCPART" $DSEL /home/ $H $W)
	}
	dest_dialog || return 1

	if [ "$DEST" != "" ] ; then
		
		if [ ! -d "$DEST" ] ; then
			REFUN=dest_dialog
			input_error ; return
		fi
		
		if [ -e "$DEST"/"$(echo $TCPART | sed 's|/dev/||g')" ] ; then
			mv -f "$DEST"/"$(echo $TCPART | sed 's|/dev/||g')" "$DEST"/"$(echo $TCPART | sed 's|/dev/||g')".ant
		fi
	
	tcplay --modify -d $TCPART --save-hdr-backup="$DEST"/"$(echo $TCPART | sed 's|/dev/||g')"
	
	fi
fi

# delete plain-text passwords
if [ "$DEBUG" = "Y" ] ; then set +xv ; fi
sed -i "s|$TCPASS|__TCPASS__|g" $ERRORLOG
exec > >(tee -a "$ERRORLOG") 2>&1 ; if [ "$DEBUG" = "Y" ] ; then set -xv ; fi
unset TCPASS

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

}


### LVM CREATE ########################################

multiple_virtualpart_crea () {

	while [ "$(vgs --noheadings --unbuffered -o vg_free $LVMLABEL | sed "s|^ \+||g" | sed "s| \+$||g" | grep -aEio "[0-9]" | head -n 1)" -gt 0 ] ; do
	
		# Size
		
		LVMUNIT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select a unit:" $H $W $LH $COLUMN $COLUMN \
		"G" "GiB" \
		"S" $"% of the total size of the 'LVM' extended volume" \
		"F" $"% of the free space of the 'LVM' extended volume" \
		"C" $"Close" \
		| head -n 1 )

		if [ "$?" -ne 0 ] || [ "$LVMUNIT" = "" ] ; then
			REFUN=virtualpart_crea
			input_error ; return
		fi
		
		if [ "$LVMUNIT" = "C" ] || [ "$LVMUNIT" = $"Close" ] ; then
			return
		fi
		
		VGSIZE=$(LANG=C vgs --noheadings --unbuffered --nosuffix --units g -o vg_size $LVMLABEL | sed "s|^ \+||g" | sed "s| \+$||g")
		VGFREE=$(LANG=C vgs --noheadings --unbuffered --nosuffix --units g -o vg_free $LVMLABEL | sed "s|^ \+||g" | sed "s| \+$||g")
		
		if [ "$LVMUNIT" = "G" ] ; then
			PRE_LVSIZE_TEXT=$"$LVMLABEL has a total size of $VGSIZE GiB of which $VGFREE GiB of free space.\n\nPlease write an integer or decimal number. Only numbers, optionally point (.) or comma (,) as decimal separator, no letters or other characters.\n"
		else
			PRE_LVSIZE_TEXT=$"$LVMLABEL has a total size of $VGSIZE GiB of which $VGFREE GiB of free space.\n\nPlease write an integer, no letters or other characters.\n"
		fi
		
		PRE_LVSIZE=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT "$PRE_LVSIZE_TEXT" $H $W)
		
		if [ "$?" -ne 0 ] ; then
			REFUN=virtualpart_crea
			input_error ; return
		fi
		
		PROP_LVSIZE=$(echo "$PRE_LVSIZE" | sed 's| ||g' | sed 's|,|.|g')
		
		if [ "$PROP_LVSIZE" = "" ] ; then
			REFUN=virtualpart_crea
			input_error ; return
		fi
		
		if [ "$LVMUNIT" = "G" ] ; then
			CHECK_LVSIZE=$(echo "$PROP_LVSIZE" | sed "s|[0-9,.]||g")
		else
			CHECK_LVSIZE=$(echo "$PROP_LVSIZE" | sed "s|[0-9]||g")
		fi
		
		if [ "$CHECK_LVSIZE" != "" ] ; then
			REFUN=virtualpart_crea
			input_error ; return
		fi
		
		LVSIZE=$PROP_LVSIZE
		
		if [ "$LVMUNIT" = "G" ] ; then
			if [ "$(echo $LVSIZE '>' $VGFREE | bc -l)" -eq 1 ] ; then
				$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"$LVSIZE GiB is greater than $VGFREE GiB" $H $W
				multiple_virtualpart_crea
				return
			fi
		elif [ "$LVMUNIT" = "S" ] ; then
			PVGFREE=$(echo "scale=1 ; 100 * $VGFREE / $VGSIZE " | bc -l)
			if [ "$(echo $LVSIZE '>' $PVGFREE | bc -l)" -eq 1 ] ; then
				$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"$LVSIZE % is greater than $PVGFREE % " $H $W
				multiple_virtualpart_crea
				return
			fi
		else
			true
		fi

		# Label
		
		set_label_lv () {

		PRE_LVLABEL=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a label (a custom name) for the new virtual partition.\n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 16 characters.) \n" $H $W $PREWRITE "lv_$(date +%Y%m%d%H%M)")

		if [ "$?" -ne 0 ] ; then
			REFUN=set_label_lv
			input_error ; return
		fi

		LVLABEL=$(echo "$PRE_LVLABEL" | sed 's| ||g')

		NC_LVLABEL=$(printf "$LVLABEL" | wc -m)
		if [ "$NC_LVLABEL" -gt 16 ] ; then
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The label (custom name) has $NC_LVLABEL characters and the maximum length is 16 characters.\n\nPlease select other label." $H $W
			set_label_lv
			return
		fi

		if [ "$LVLABEL" = "" ] ; then
			REFUN=set_label_lv
			input_error ; return
		fi

		if [ "$LVLABEL" != "" ] ; then

		CHECK_LVLABEL=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^$LVLABEL$")

			if [ "$CHECK_LVLABEL" != "" ] ; then

			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

			set_label_lv
			return

			fi

		CHECK_LVLABEL_VG2=$(LANG=C pvscan | grep -aEiv 'Total: ' | grep -aEiv "No matching|No device" | awk '{if ( $3 == "VG" ) print $4}' | sort -u | grep -aE "[a-zA-Z0-9]" | grep -aE "^$LVLABEL$" )
		CHECK_LVLABEL_VG=$(lvs --noheadings --unbuffered -o vg_name | sed "s|^ \+||g" | sed "s| \+$||g" | grep -aE "^$LVLABEL$" )
		CHECK_LVLABEL_LV=$(lvs --noheadings --unbuffered -o lv_name | sed "s|^ \+||g" | sed "s| \+$||g" | grep -aE "^$LVLABEL$" )

			if [ "$CHECK_LVLABEL_VG2" != "" ] || [ "$CHECK_LVLABEL_VG" != "" ] || [ "$CHECK_LVLABEL_LV" != "" ] ; then

			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

			#$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"This label is already in use.\n\nDo you want to choose another (recommended)?\n\nIf not, the existing one will be forced to disassemble (this is dangerous).\n'Yes/OK' is recommended.\n" $H $W
			#
			#	if [ "$?" -eq 1 ] ; then
			#		lvremove -f $LVLABEL
			#		vgremove -f $LVLABEL
			#		LVDEVSLIST=$(echo $(pvscan | grep -aE " $LVLABEL " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" ))
			#		printf "y\n" | pvremove -ff $LVDEVSLIST
			#		lvm_crea
			#	else
					set_label_lvm
					return
			#	fi

			fi
		fi

		}

		set_label_lv || return 1
		
		# Creation

		if [ "$LVMUNIT" = "G" ] ; then
			lvcreate -y -n $LVLABEL -L ${LVSIZE}g $LVMLABEL
		elif [ "$LVMUNIT" = "S" ] ; then
			lvcreate -y -n $LVLABEL -l ${LVSIZE}%VG $LVMLABEL
		elif [ "$LVMUNIT" = "F" ] ; then
			lvcreate -y -n $LVLABEL -l ${LVSIZE}%FREE $LVMLABEL
		else
			REFUN=virtualpart_crea
			input_error ; return
		fi
		
		symlinks -drs /dev/ >>$ERRORLOG
		ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done
		
	done
	
	true

}

lvm_crea () {

# set partitions

INT=0
ADDOPT="$ALLDEVS"
set_lvmpart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	# not list raid lvm
	LVMPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | while read i ; do echo $PRE $i $POST ; done )
	LVMPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "'"$PRE"'","/dev/"$1"\t("$3")","'"$POST"'"}' | sort -u )
else
	LVMPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" | while read i ; do echo $PRE $i $POST ; done )
	LVMPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "'"$PRE"'","/dev/"$1"\t("$3")","'"$POST"'"}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

LVMPARTS=$($DIALOG $WICON $WTITLE "$TITLE" $MULTIPLELIST $WTEXT $"Please select the partitions that you want to join to form a 'LVM' extended volume.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}WARNING: The content of the selected partitions will be ERASED: Please cancel if you don't want to do it! \n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN $COLUMN $LVMPARTLISTSIZE $PRE "$ADDOPT" " " $POST | sed 's|(.*)||g' | sed 's|^TRUE||g')

	if [ "$?" -ne 0 ] || [ "$LVMPARTS" = "" ] ; then
		return 1
	fi

	if [ "$(echo "$LVMPARTS" | grep -a "$(echo $ALLDEVS | sed 's|(.*)||g')")" != "" ] ; then
		INT=.
		ADDOPT="$INTDEVS"
		set_lvmpart
		return
	fi

	if [ "$(echo "$LVMPARTS" | grep -a "$(echo $INTDEVS | sed 's|(.*)||g')")" != "" ] ; then
		INT=0
		ADDOPT="$ALLDEVS"
		set_lvmpart
		return
	fi

}

set_lvmpart || return 1


# set label

set_label_lvm () {

PRE_LVMLABEL=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a label (a custom name) for the new 'LVM' extended volume.\n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 16 characters.) \n" $H $W $PREWRITE "lvm_$(date +%Y%m%d%H%M)")

if [ "$?" -ne 0 ] ; then
	REFUN=set_label_lvm
	input_error ; return
fi

LVMLABEL=$(echo "$PRE_LVMLABEL" | sed 's| ||g')

NC_LVMLABEL=$(printf "$LVMLABEL" | wc -m)
if [ "$NC_LVMLABEL" -gt 16 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The label (custom name) has $NC_LVMLABEL characters and the maximum length is 16 characters.\n\nPlease select other label." $H $W
	set_label_lvm
	return
fi

if [ "$LVMLABEL" = "" ] ; then
	REFUN=set_label_lvm
	input_error ; return
fi

if [ "$LVMLABEL" != "" ] ; then

CHECK_LVMLABEL=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^$LVMLABEL$")

	if [ "$CHECK_LVMLABEL" != "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

	set_label_lvm
	return

	fi

CHECK_LVMLABEL_VG2=$(LANG=C pvscan | grep -aEiv 'Total: ' | grep -aEiv "No matching|No device" | awk '{if ( $3 == "VG" ) print $4}' | sort -u | grep -aE "[a-zA-Z0-9]" | grep -aE "^$LVMLABEL$" )
CHECK_LVMLABEL_VG=$(lvs --noheadings --unbuffered -o vg_name | sed "s|^ \+||g" | sed "s| \+$||g" | grep -aE "^$LVMLABEL$" )
CHECK_LVMLABEL_LV=$(lvs --noheadings --unbuffered -o lv_name | sed "s|^ \+||g" | sed "s| \+$||g" | grep -aE "^$LVMLABEL$" )

	if [ "$CHECK_LVMLABEL_VG2" != "" ] || [ "$CHECK_LVMLABEL_VG" != "" ] || [ "$CHECK_LVMLABEL_LV" != "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

	#$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"This label is already in use.\n\nDo you want to choose another (recommended)?\n\nIf not, the existing one will be forced to disassemble (this is dangerous).\n'Yes/OK' is recommended.\n" $H $W
	#
	#	if [ "$?" -eq 1 ] ; then
	#		lvremove -f $LVMLABEL
	#		vgremove -f $LVMLABEL
	#		LVMDEVSLIST=$(echo $(pvscan | grep -aE " $LVMLABEL " | awk '{print $2}' | sort -u | grep -av unknown | xargs -r0 readlink -m | grep -aEi "[a-zA-Z0-9]" ))
	#		printf "y\n" | pvremove -ff $LVMDEVSLIST
	#		lvm_crea
	#	else
			set_label_lvm
			return
	#	fi

	fi
fi

}

set_label_lvm || return 1


# Create 'lvm'

echo "$LVMPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do
	if [ "$(lsblk -r -n -o FSTYPE $i | head -n 1 | grep -aEi swap )" != "" ] ; then
		swapoff $i
	fi
done

echo "$LVMPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do umount $i ; done

# delete RAID header
echo "$LVMPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do
	if [ "$(lsblk -r -n -o FSTYPE $i | head -n 1 | grep -aEi 'raid')" != "" ] ; then
	mdadm --zero-superblock $i
	fi
done

LVMDEVSLIST=$(echo $(echo "$LVMPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u ))

pvcreate -y -ff --dataalignment 1m $LVMDEVSLIST

vgcreate -y -f $LVMLABEL $LVMDEVSLIST

virtualpart_crea () {

	VIRTUALPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"If in doubt, create a virtual partition that occupies all the free space of the 'LVM' extended volume.\n\nPlease select an option:" $H $W $LH $COLUMN $COLUMN \
	$"Create a virtual partition that occupies all the free space of the 'LVM' extended volume" " " \
	$"Create some virtual partitions within the 'LVM' extended volume" " " \
	| head -n 1 )

	if [ "$?" -ne 0 ] || [ "$VIRTUALPART" = "" ] ; then
		REFUN=virtualpart_crea
		input_error ; return
	fi

	case $VIRTUALPART in

		$"Create a virtual partition that occupies all the free space of the 'LVM' extended volume" )
			LVLABEL=$LVMLABEL
			lvcreate -y -n $LVLABEL -l 100%FREE $LVMLABEL
		;;

		$"Create some virtual partitions within the 'LVM' extended volume" )
			multiple_virtualpart_crea
			return
		;;

		* )
			REFUN=virtualpart_crea
			input_error ; return
		;;

	esac

}

virtualpart_crea || return 1

#lvcreate $LVMLABEL -L $(echo "scale=0 ; ($(pvscan | grep -a " $LVMLABEL " | awk '{print $2}' | while read i ; do lsblk -r -n -b -o SIZE $i ; done | sort -n | head -n 1 ) / 1024 / 1024) - (4 * $(pvscan | grep -a " $LVMLABEL " | grep -a -c ^))" | bc -l)M --type raid1 --mirrors 1 -n $LVMLABEL

echo "### Detail Information"
pvs
pvscan
echo ""
vgs
vgdisplay
echo ""
lvs
lvdisplay

#echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
#update-initramfs -u -v -k all


# backup

dest_dialog () {
	DEST=$($DIALOG $WICON $WTITLE $"Please select a folder/directory to dump a backup copy of the header of $LVMLABEL" $DSEL /home/ $H $W)

	if [ "$?" -ne 0 ] ; then
		REFUN=dest_dialog
		input_error ; return
	fi

	if [ "$DEST" = "" ] ; then
		REFUN=dest_dialog
		input_error ; return
	fi

	if [ ! -d "$DEST" ] ; then
		REFUN=dest_dialog
		input_error ; return
	fi
}

dest_dialog || return 1

if [ -e "$DEST"/"$LVMLABEL" ] ; then
	mv -f "$DEST"/"$LVMLABEL" "$DEST"/"$LVMLABEL".ant
fi

vgcfgbackup -f "$DEST"/"$LVMLABEL" "$LVMLABEL"

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

}


### BTRFS RAID CREATE ########################################

braid_crea () {

# No "N-Way" (traditional, mdadm) RAID-1. btrfs 'raid-1' has _always_ redundancy 2 copies, no redundancy N-devices copies. Linux ≥ 5.5 and btrfs-progs ≥ 5.4 introduce 'raid1c3' (redundancy 3 copies) and 'raid1c4' (redundancy 4 copies). https://btrfs.wiki.kernel.org/index.php/Manpage/mkfs.btrfs#PROFILES  =  https://btrfs.readthedocs.io/en/stable/mkfs.btrfs.html#profiles
if [ "$(uname -r | cut -d '.' -f 1)" -lt 5 ] || [ "$(uname -r | awk -F '.' '{print $1$2}')" -lt 55 ] || [ "$(btrfs --version | sed 's|[a-zA-Z -]||g' | cut -d '.' -f 1)" -lt 5 ] || [ "$(btrfs --version | sed 's|[a-zA-Z -]||g' | awk -F '.' '{print $1$2}')" -lt 54 ] ; then
	BRAIDPARTS_TEXT=2
	MINBRAIDPARTS=2
	MAXBRAIDPARTS=2
else
	BRAIDPARTS_TEXT="2-4"
	MINBRAIDPARTS=2
	MAXBRAIDPARTS=4
fi

# set partitions

INT=0
ADDOPT="$ALLDEVS"
set_braidpart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	BRAIDPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | while read i ; do echo $PRE $i $POST ; done )
	BRAIDPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "'"$PRE"'","/dev/"$1"\t("$3")","'"$POST"'"}' | sort -u )
else
	BRAIDPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" | while read i ; do echo $PRE $i $POST ; done )
	BRAIDPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "'"$PRE"'","/dev/"$1"\t("$3")","'"$POST"'"}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

BRAIDPARTS=$($DIALOG $WICON $WTITLE "$TITLE" $MULTIPLELIST $WTEXT $"Please select $BRAIDPARTS_TEXT partitions of different internal disks that you want to combine to form a 'btrfs' RAID 1 (mirror) partitions system.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}WARNING: The content of the selected partitions will be ERASED: Please cancel if you don't want to do it! \n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN $COLUMN $BRAIDPARTLISTSIZE $PRE "$ADDOPT" " " $POST | sed 's|(.*)||g' | sed 's|^TRUE||g')

	if [ "$?" -ne 0 ] || [ "$BRAIDPARTS" = "" ] ; then
		return 1
	fi

	if [ "$(echo "$BRAIDPARTS" | grep -a "$(echo $ALLDEVS | sed 's|(.*)||g')")" != "" ] ; then
		INT=.
		ADDOPT="$INTDEVS"
		set_braidpart
		return
	fi

	if [ "$(echo "$BRAIDPARTS" | grep -a "$(echo $INTDEVS | sed 's|(.*)||g')")" != "" ] ; then
		INT=0
		ADDOPT="$ALLDEVS"
		set_braidpart
		return
	fi

# check number
NBRAIDPARTS=$(echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | grep -a -c ^ )
NBRAIDTOTAL=$(echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEio ".*[a-zA-Z]" | grep -aEi "[a-zA-Z0-9]" | sort -u | grep -a -c ^ )
if [ "$NBRAIDPARTS" != "$NBRAIDTOTAL" ] || [ "$NBRAIDPARTS" -lt "$MINBRAIDPARTS" ] || [ "$NBRAIDPARTS" -gt "$MAXBRAIDPARTS" ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"It seems that you have not selected $BRAIDPARTS_TEXT partitions of different internal disks.\n\nDo you want to select again?" $H $W
		if [ "$?" -eq 0 ] ; then
			set_braidpart
			return
		else
			return 1
		fi
fi
if [ "$NBRAIDPARTS" -gt 2 ] ; then
	NBRAIDPARTSADD="c$NBRAIDPARTS"
fi

}

set_braidpart || return 1


# set label

set_label_braid () {

PRE_BRAIDLABEL=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"You can write a label (a custom name) for the new 'btrfs' RAID partitions system.\n\nIt may be left blank if you want, but labeling partitions is useful to identify them.\n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 16 characters.) \n" $H $W $PREWRITE "btr_$(date +%Y%m%d%H%M)")

BRAIDLABEL=$(echo "$PRE_BRAIDLABEL" | sed 's| ||g')

NC_BRAIDLABEL=$(printf "$BRAIDLABEL" | wc -m)
if [ "$NC_BRAIDLABEL" -gt 16 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The label (custom name) has $NC_BRAIDLABEL characters and the maximum length is 16 characters.\n\nPlease select other label." $H $W
	set_label_braid
	return
fi

if [ "$BRAIDLABEL" != "" ] ; then

CHECK_BRAIDLABEL=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^$BRAIDLABEL$")

	if [ "$CHECK_BRAIDLABEL" != "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

	set_label_braid
	return

	fi
fi

}

set_label_braid || return 1


# Create 'btrfs' RAID

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGBRAID=$( echo $! )

echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do
	if [ "$(lsblk -r -n -o FSTYPE $i | head -n 1 | grep -aEi swap )" != "" ] ; then
		swapoff $i
	fi
done

echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do umount $i ; done

# delete RAID header
echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do
	if [ "$(lsblk -r -n -o FSTYPE $i | head -n 1 | grep -aEi 'raid')" != "" ] ; then
	mdadm --zero-superblock $i
	fi
done

echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do for n in {1..9} ; do wipefs -f -a $i ; done ; done

BRAIDDEVSLIST=$(echo $(echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u ))

# btrfs raid
mkfs.btrfs -m raid1$NBRAIDPARTSADD -d raid1$NBRAIDPARTSADD $BRAIDDEVSLIST

if [ "$BRAIDLABEL" != "" ] ; then
	btrfs filesystem label $(echo "$BRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | head -n 1 ) $BRAIDLABEL
fi

echo "### Detail Information"
btrfs device scan ; btrfs filesystem show

#echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
#update-initramfs -u -v -k all

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

	kill $PIDDIALOGBRAID 2>/dev/null

}


### MDADM RAID CREATE ########################################

mdadm_crea () {

# set partitions

INT=0
ADDOPT="$ALLDEVS"
set_mdadmpart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	# not list raid
	MRAIDPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | while read i ; do echo $PRE $i $POST ; done )
	MRAIDPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "'"$PRE"'","/dev/"$1"\t("$3")","'"$POST"'"}' | sort -u )
else
	MRAIDPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" | while read i ; do echo $PRE $i $POST ; done )
	MRAIDPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "'"$PRE"'","/dev/"$1"\t("$3")","'"$POST"'"}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

MRAIDPARTS=$($DIALOG $WICON $WTITLE "$TITLE" $MULTIPLELIST $WTEXT $"Please select the partitions of different internal disks that you want to combine to form a 'mdadm' RAID 1 (mirror) partitions system.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}WARNING: The content of the selected partitions will be ERASED: Please cancel if you don't want to do it! \n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN $COLUMN $MRAIDPARTLISTSIZE $PRE "$ADDOPT" " " $POST | sed 's|(.*)||g' | sed 's|^TRUE||g')

	if [ "$?" -ne 0 ] || [ "$MRAIDPARTS" = "" ] ; then
		return 1
	fi

	if [ "$(echo "$MRAIDPARTS" | grep -a "$(echo $ALLDEVS | sed 's|(.*)||g')")" != "" ] ; then
		INT=.
		ADDOPT="$INTDEVS"
		set_mdadmpart
		return
	fi

	if [ "$(echo "$MRAIDPARTS" | grep -a "$(echo $INTDEVS | sed 's|(.*)||g')")" != "" ] ; then
		INT=0
		ADDOPT="$ALLDEVS"
		set_mdadmpart
		return
	fi

# check number
NMRAIDPARTS=$(echo "$MRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | grep -a -c ^ )
NMRAIDTOTAL=$(echo "$MRAIDPARTS" | sed 's| |\n|g' | grep -aEio ".*[a-zA-Z]" | grep -aEi "[a-zA-Z0-9]" | sort -u | grep -a -c ^ )
if [ "$NMRAIDPARTS" != "$NMRAIDTOTAL" ] || [ "$NMRAIDPARTS" -lt 2 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"It seems that you have not selected partitions of different internal disks.\n\nDo you want to select again?" $H $W
		if [ "$?" -eq 0 ] ; then
			set_mdadmpart
			return
		else
			return 1
		fi
fi

}

set_mdadmpart || return 1


# set label

set_label_mdadm () {

PRE_MRAIDLABEL=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"You can write a label (a custom name) for the new 'mdadm' RAID partitions system.\n\nIt may be left blank if you want, but labeling partitions is useful to identify them.\n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 16 characters.) \n" $H $W $PREWRITE "mdm_$(date +%Y%m%d%H%M)")

MRAIDLABEL=$(echo "$PRE_MRAIDLABEL" | sed 's| ||g')

NC_MRAIDLABEL=$(printf "$MRAIDLABEL" | wc -m)
if [ "$NC_MRAIDLABEL" -gt 16 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The label (custom name) has $NC_MRAIDLABEL characters and the maximum length is 16 characters.\n\nPlease select other label." $H $W
	set_label_mdadm
	return
fi

if [ "$MRAIDLABEL" != "" ] ; then

CHECK_MRAIDLABEL=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEi " 0 " | cut -d ' ' -f 3- | grep -aE "^$MRAIDLABEL$")

	if [ "$CHECK_MRAIDLABEL" != "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

	set_label_mdadm
	return

	fi
fi

}

set_label_mdadm || return 1


# set metadata

set_mdadm_metadata () {

	MRAIDMETADATA=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select the 'mdadm' RAID superblock type.\n\nSelect '0.90' if you want to use grub-legacy as boot manager and/or an old kernel version, but this configuration may be more problematic if the superblock is damaged, the maximum partition size is 4 TB = 4000 GB and the maximum number of partitions is 28.\n\n'1.2' is a more modern version (it may not work with old software).\n\nIn most cases, '1.2' is a good choice.\n" $H $W $LH $COLUMN $COLUMN "1.2" " " "0.90" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$MRAIDMETADATA" = "" ] ; then
		REFUN=set_mdadm_metadata
		input_error ; return
	fi

}

set_mdadm_metadata || return 1


# Create 'mdadm' RAID

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGMRAID=$( echo $! )

echo "$MRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do
	if [ "$(lsblk -r -n -o FSTYPE $i | head -n 1 | grep -aEi swap )" != "" ] ; then
		swapoff $i
	fi
done

echo "$MRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do umount $i ; done

echo "$MRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | while read i ; do mdadm --zero-superblock $i ; done

MRAIDDEVSNUM=$(echo "$MRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u | grep -a -c ^ )

MRAIDDEVSLIST=$(echo $(echo "$MRAIDPARTS" | sed 's| |\n|g' | grep -aEi "[a-zA-Z0-9]" | sort -u ))

for i in {1..999} ; do
	CHECKMD=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aE "^$(echo /dev/md$i | sed 's|/dev/||g') ")
	if [ "$CHECKMD" = "" ] ; then
		MRAIDNAME=/dev/md$i
		break
	fi
done

printf "y\n" | mdadm --create $MRAIDNAME --level=1 --metadata=$MRAIDMETADATA --name=$MRAIDLABEL --raid-devices=$MRAIDDEVSNUM $MRAIDDEVSLIST

echo "### Detail Information"
mdadm --detail $MRAIDNAME

#echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
#update-initramfs -u -v -k all

symlinks -drs /dev/ >>$ERRORLOG
ls -p /dev/ | grep -a / | while read i ; do rmdir -p /dev/$i 2>>$ERRORLOG ; done

	kill $PIDDIALOGMRAID 2>/dev/null

}


### ADVANCED OPTIONS ########################################

apartop () {

CREATELUKSCRYPT=$"Create a new 'LUKS' encrypted volume"
CREATETCCRYPT=$"Create a new 'TC' encrypted volume"
CREATELVM=$"Create a new 'LVM' extended volume"
CREATEBTRFSRAID=$"Create a new 'btrfs' RAID partitions system"
CREATEMDADMRAID=$"Create a new 'mdadm' RAID partitions system"
INACTIVEALLCRYPT=$"Inactivate all activated encrypted volumes"
INACTIVEALLLVM=$"Inactivate all 'LVM' extended volumes"
INACTIVEALLMDADM=$"Inactivate all RAID partitions systems"
CONTINST=$"Continue with the installation"

ADOPT=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"If you want you can create special partitions systems.\n\nWARNING: The content of the selected partitions will be ERASED: Please cancel if you don't want to do it! \n" $H $W $LH $COLUMN $COLUMN "$CREATELUKSCRYPT" " " "$CREATETCCRYPT" " " "$CREATELVM" " " "$CREATEBTRFSRAID" " " "$CREATEMDADMRAID" " " "$INACTIVEALLCRYPT" " " "$INACTIVEALLLVM" " " "$INACTIVEALLMDADM" " " "$CONTINST" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$ADOPT" = "" ] ; then
		return 1
	fi

	case $ADOPT in
		"$CONTINST" )
			return 1
		;;
		"$CREATELUKSCRYPT" )
			CRSW=cryptsetup
			if [ "$(command -v $CRSW )" != "" ] ; then
			luks_crea
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		"$CREATETCCRYPT" )
			CRSW=tcplay
			if [ "$(command -v $CRSW )" != "" ] ; then
			tc_crea
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		"$CREATELVM" )
			CRSW=lvm2
			if [ "$(command -v pvcreate)" != "" ] && [ "$(command -v vgcreate)" != "" ] && [ "$(command -v lvcreate)" != "" ] ; then
			lvm_crea
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		"$CREATEBTRFSRAID" )
			CRSW=btrfs
			if [ "$(command -v $CRSW )" != "" ] ; then
			braid_crea
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		"$CREATEMDADMRAID" )
			CRSW=mdadm
			if [ "$(command -v $CRSW )" != "" ] ; then
			mdadm_crea
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		"$INACTIVEALLCRYPT" )
			CRSW=cryptsetup
			if [ "$(command -v $CRSW )" != "" ] ; then
			act_crypt
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		"$INACTIVEALLLVM" )
			CRSW=lvm2
			if [ "$(command -v vgchange)" != "" ] ; then
			act_lvm
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		"$INACTIVEALLMDADM" )
			CRSW=mdadm
			if [ "$(command -v $CRSW )" != "" ] ; then
			act_mdadm
			apartop
			else
			$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The required '$CRSW' is not installed." $H $W
			apartop
			fi
		;;
		* )
			return 1
		;;
	esac
}


### SWAP ########################################

INT=0
ADDOPT="$ALLDEVS"
set_swap () {

recparts

if [ "$RECPARTS" = "" ] ; then
	SWAPPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u )
	SWAPPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
else
	SWAPPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
	SWAPPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

# Check if swap partition already exists
EXISTSWAP=$(lsblk -r -n -o KNAME,RM,FSTYPE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | grep -aEi ' swap ' | awk '{print "/dev/"$1}' | sort -u )
if [ "$EXISTSWAP" != "" ] ; then
EXISTSWAPTEXT=$"\n\nAlready existing swap partition:\n$EXISTSWAP"
fi

if [ "$RECSWAPSIZE" = "$RECSWAPSIZE2" ] ; then
SWAPPARTTEXT=$"It is possible to use a portion of the internal disk as complementary space to RAM (operational or working memory), the named 'on-disk complementary memory space' or 'swap space'.\n\nThe swap space is optional: it is useful in old computers and if you want to enable hibernation on laptops (not necessary to turn off the screen), but increases the disk usage (increases the power consumption and shorts the life of the disk).\n\nIf you want to use a swap space, it is recommended to assign $RECSWAPSIZE MiB.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}$EXISTSWAPTEXT\n\nPlease select an option:\n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)"
else
SWAPPARTTEXT=$"It is possible to use a portion of the internal disk as complementary space to RAM (operational or working memory), the named 'on-disk complementary memory space' or 'swap space'.\n\nThe swap space is optional: it is useful in old computers and if you want to enable hibernation on laptops (not necessary to turn off the screen), but increases the disk usage (increases the power consumption and shorts the life of the disk).\n\nIf you want to use a swap space, it is recommended to assign between $RECSWAPSIZE (as minimum to be useful) and $RECSWAPSIZE2 MiB (i.e. a size slightly larger than twice the total RAM size of the computer).\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}$EXISTSWAPTEXT\n\nPlease select an option:\n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)"
fi

SWAPPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT "$SWAPPARTTEXT" $H $W $LH $COLUMN $COLUMN "$NOSWAP" " " "$USESWAPFILE" " " $SWAPPARTLISTSIZE "$ADDOPT" " " "$ADVANCEDOPTIONS" " " | head -n 1 )

	if [ "$?" -ne 0 ] ; then
		REFUN=set_swap
		input_error ; return
	fi

	if [ "$SWAPPART" = "" ] ; then
		REFUN=set_swap
		input_error ; return
	fi

	if [ "$SWAPPART" = "$ALLDEVS" ] ; then
		INT=.
		ADDOPT="$INTDEVS"
		set_swap
		return
	fi

	if [ "$SWAPPART" = "$INTDEVS" ] ; then
		INT=0
		ADDOPT="$ALLDEVS"
		set_swap
		return
	fi

	if [ "$SWAPPART" != "$NOSWAP" ] ; then
		if [ "$RECSWAPSIZE" = "" ] ; then
			check_exit
		fi
	fi

	if [ "$SWAPPART" = "$USESWAPFILE" ] ; then
		sel_swapfilesize
	fi

	if [ "$SWAPPART" = "$ADVANCEDOPTIONS" ] ; then
		act_crypt
		act_lvm
		act_mdadm
		apartop
		set_swap
		return
	fi


	# check_space
	if [ "$SWAPPART" != "$NOSWAP" ] && [ "$SWAPPART" != "$USESWAPFILE" ] ; then
	
		SWAPPARTSIZEM=$(expr $(lsblk -r -n -b -o SIZE "$SWAPPART" | head -n 1) / 1024 / 1024 )
	
		if [ "$SWAPPARTSIZEM" -lt "$RECSWAPSIZE" ] ; then
		#if [ "$(echo ${SWAPPARTSIZEM} '<' ${RECSWAPSIZE} | bc -l)" -eq 1 ] ; then
	
			LACKSPACE=$"The size of the selected $SWAPPART partition ($SWAPPARTSIZEM MiB) is smaller than recommended ($RECSWAPSIZE MiB).\n\nDo you want to select another partition?"
		
			$DIALOG $WICON $WTITLE $"Small partition" $WYN   $WTEXT "$LACKSPACE" $H $W
		
				if [ "$?" -eq 0 ] ; then
					set_swap
					return
				else
					true
				fi
		fi
	
	fi

echo "SWAPPART=\"$SWAPPART\""

}

set_swap


### INSTALL PARTITION ########################################

INT=0
ADDOPT="$ALLDEVS"
set_ipart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	IPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u )
	IPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
else
	IPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
	IPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

IPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"A system root partition ( / ) with a minimum size of $MINSIZEDG GiB ($MINSIZEDM MiB, recommended triple) is required.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}Please select a partition to be used as system partition ( / ):\n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN $IPARTLISTSIZE "$ADDOPT" " " "$ADVANCEDOPTIONS" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$IPART" = "" ] ; then
		REFUN=set_ipart
		input_error ; return
	fi

	if [ "$IPART" = "$ALLDEVS" ] ; then
		INT=.
		ADDOPT="$INTDEVS"
		set_ipart
		return
	fi

	if [ "$IPART" = "$INTDEVS" ] ; then
		INT=0
		ADDOPT="$ALLDEVS"
		set_ipart
		return
	fi

	if [ "$IPART" = "$ADVANCEDOPTIONS" ] ; then
		act_crypt
		act_lvm
		act_mdadm
		apartop
		set_ipart
		return
	fi

	# check_space
	IPARTSIZEM=$(expr $(lsblk -r -n -b -o SIZE "$IPART" | head -n 1) / 1024 / 1024 )
	IPARTSIZEG=$(echo "scale=1 ; $IPARTSIZEM / 1024" | bc -l )

	if [ "$IPARTSIZEM" -lt "$MINSIZEDM" ] ; then
	#if [ "$(echo ${IPARTSIZEM} '<' ${MINSIZEDM} | bc -l)" -eq 1 ] ; then

		LACKSPACE=$"The size of the selected $IPART partition ($IPARTSIZEM MiB = $IPARTSIZEG GiB) is smaller than necessary ($MINSIZEDM MiB = $MINSIZEDG GiB)."
	
		$DIALOG $WICON $WTITLE $"Partition too small" $ERROR $WTEXT "$LACKSPACE" $H $W
	
			set_ipart
			return

	fi

	# check_space swapfile <-> ipart necessary
	if [ "$SWAPPART" = "$USESWAPFILE" ] && [ "$IPART" != "" ] ; then
	
		MINSIZEDSM=$(expr $MINSIZEDM + $SWAPFILESIZE )
		MINSIZEDSG=$(echo "scale=1 ; $MINSIZEDSM / 1024" | bc -l )

		if [ "$IPARTSIZEM" -lt "$MINSIZEDSM" ] ; then
		#if [ "$(echo ${IPARTSIZEM} '<' ${MINSIZEDSM} | bc -l)" -eq 1 ] ; then

			LACKSPACE=$"The size of the selected system partition ($IPARTSIZEM MiB = $IPARTSIZEG GiB) is smaller than necessary ($MINSIZEDSM MiB = $MINSIZEDSG GiB) with the selected file size for 'on-disk complementary memory space' or 'swap space'."
		
			$DIALOG $WICON $WTITLE $"Partition too small" $ERROR $WTEXT "$LACKSPACE" $H $W
		
				set_swap
				set_ipart
				return

		fi
	
	fi

	# check_space swapfile <-> ipart recommended
	if [ "$SWAPPART" = "$USESWAPFILE" ] && [ "$IPART" != "" ] ; then
	
		RECSIZEDSM=$(expr \( 3 \* $MINSIZEDM \) + $SWAPFILESIZE )
		RECSIZEDSG=$(echo "scale=1 ; $RECSIZEDSM / 1024" | bc -l )

		if [ "$IPARTSIZEM" -lt "$RECSIZEDSM" ] ; then
		#if [ "$(echo ${IPARTSIZEM} '<' ${RECSIZEDSM} | bc -l)" -eq 1 ] ; then

			LACKSPACE=$"The size of the selected system partition ($IPARTSIZEM MiB = $IPARTSIZEG GiB) is smaller than recommended ($RECSIZEDSM MiB = $RECSIZEDSG GiB) with the selected file size for 'on-disk complementary memory space' or 'swap space'.\n\nDo you want to select another option?"
		
			$DIALOG $WICON $WTITLE $"Small partition" $WYN   $WTEXT "$LACKSPACE" $H $W
		
				if [ "$?" -eq 0 ] ; then
					set_swap
					set_ipart
					return
				else
					true
				fi
		fi
	
	fi

}

set_ipart

echo "IPART=\"$IPART\""

btrfs device scan
CHECKBRAIDIPART=$(LANG=C btrfs filesystem show | sed ':a;N;$!ba;s|\n\t| |g' | grep -aEi "[a-zA-Z0-9]" | grep -aEi 'Total devices ' | grep -aEiv 'Total devices 1 ' | grep -aE " $IPART | $IPART$")

# set fs / part

set_fs_ipart () {

# nilfs2 limitations:  https://nilfs.sourceforge.io/en/current_status.html  https://docs.kernel.org/filesystems/nilfs2.html#caveats

FSLIST=""
if [ "$SWAPPART" = "$USESWAPFILE" ] ; then
	#for i in ext4 ext3 btrfs nilfs2 ; do
	for i in ext4 ext3 ; do
		if [ "$(command -v mkfs.$i)" != "" ] ; then FSLIST="$FSLIST $i $ESP" ; fi
	done
else
	for i in ext4 ext3 btrfs nilfs2 ; do
		if [ "$(command -v mkfs.$i)" != "" ] ; then FSLIST="$FSLIST $i $ESP" ; fi
	done
fi

if [ "$COREBOOT" = "" ] ; then
	FSIPARTTEXT=$"Please select a file system for the system partition ( / ).\n\nIf in doubt, select 'ext4'."
else
	# large_dir or metadata_csum_seed failed with GRUB <= 2.06-8  https://bugs.debian.org/1030846
	FSIPARTTEXT=$"Please select a file system for the system partition ( / ).\n\nThis computer seems to have GNU Boot / Canoeboot / CoreBoot / LinuxBIOS. Depending on the version, it might be necessary for /boot to be on a partition that uses 'ext3' as file system (simpler option) or 'ext4' without recent features (more complex option)."
fi

FSIPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT "$FSIPARTTEXT" $H $W $LH $COLUMN $COLUMN $FSLIST "$OPENPARTEDITOR" " " "$DONOTFORMAT" " " | head -n 1 )

if [ "$?" -ne 0 ] || [ "$FSIPART" = "" ] ; then
	REFUN=set_fs_ipart
	input_error ; return
fi

if [ "$FSIPART" = "$OPENPARTEDITOR" ] ; then

	if [ "$G" = "N" ] ; then
		exec >/dev/tty
		if [ "$(command -v parted)" != "" ] ; then
			parted
		elif [ "$(command -v cfdisk)" != "" ] ; then
			cfdisk
		else
			REFUN=set_fs_ipart
			input_error ; return
		fi
		if [ "$DEBUG" != "N" ] ; then
			exec > >(tee -a "$ERRORLOG") 2>&1
		fi
	else
		if [ "$(command -v gparted)" != "" ] ; then
			su-to-root -X -c gparted
		elif [ "$(command -v partitionmanager)" != "" ] ; then
			su-to-root -X -c partitionmanager
		elif [ -e /usr/share/applications/gparted.desktop ] ; then
			$(cat /usr/share/applications/gparted.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		elif [ -e /usr/share/applications/partitionmanager.desktop ] ; then
			$(cat /usr/share/applications/partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		elif [ -e /usr/share/applications/org.kde.partitionmanager.desktop ] ; then
			$(cat /usr/share/applications/org.kde.partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		else
			REFUN=set_fs_ipart
			input_error ; return
		fi
	fi

	FSIPART="$DONOTFORMAT"
fi

}

if [ "$CHECKBRAIDIPART" = "" ] ; then
	set_fs_ipart
else
	FSIPART="$DONOTFORMAT"
fi

echo "FSIPART=\"$FSIPART\""


# set label / part

set_label_ipart () {

PRE_LABELIPART=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"You can write a label (a custom name) for the new system partition ( / ).\n\nIt may be left blank if you want, but labeling partitions is useful to identify them. ('system' or '$DISTROLABEL' might be a good choice.) \n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 16 characters.) \n" $H $W $PREWRITE "$DISTROLABEL")

LABELIPART=$(echo "$PRE_LABELIPART" | sed 's| ||g')

NC_LABELIPART=$(printf "$LABELIPART" | wc -m)
if [ "$NC_LABELIPART" -gt 16 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The label (custom name) has $NC_LABELIPART characters and the maximum length is 16 characters.\n\nPlease select other label." $H $W
	set_label_ipart
	return
fi

if [ "$LABELIPART" != "" ] ; then

CHECK_LABELIPART=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEiv "^$(echo $IPART | sed 's|/dev/||g') " | cut -d ' ' -f 3- | grep -aE "^$LABELIPART$")

	if [ "$CHECK_LABELIPART" != "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

	set_label_ipart
	return

	fi
fi

}

if [ "$FSIPART" != "$DONOTFORMAT" ] && [ "$CHECKBRAIDIPART" = "" ] ; then
	set_label_ipart
	echo "LABELIPART=\"$LABELIPART\""
fi


### HOME PARTITION ########################################

INT=0
ADDOPT="$ALLDEVS"
set_homepart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	HOMEPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u )
	HOMEPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
else
	HOMEPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
	HOMEPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

HOMEPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"/home is where the personal files (settings, documents, photos,...) are stored.\n\nOptionally /home can be in a partition separated from the system partition ( / ) where applications are installed.\n\nIt is recommended to use a separate /home partition.\n\n${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}Please select an option:\n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN "$NOHOMEPART" " " $HOMEPARTLISTSIZE "$ADDOPT" " " "$ADVANCEDOPTIONS" " " | head -n 1 )

	if [ "$?" -ne 0 ] ; then
		REFUN=set_homepart
		input_error ; return
	fi

	if [ "$HOMEPART" = "" ] ; then
		REFUN=set_homepart
		input_error ; return
	fi

	if [ "$HOMEPART" = "$ALLDEVS" ] ; then
		INT=.
		ADDOPT="$INTDEVS"
		set_homepart
		return
	fi

	if [ "$HOMEPART" = "$INTDEVS" ] ; then
		INT=0
		ADDOPT="$ALLDEVS"
		set_homepart
		return
	fi

	if [ "$HOMEPART" = "$ADVANCEDOPTIONS" ] ; then
		act_crypt
		act_lvm
		act_mdadm
		apartop
		set_homepart
		return
	fi

	# check_space
	if [ "$HOMEPART" != "$NOHOMEPART" ] ; then
	
		HOMEPARTSIZEM=$(expr $(lsblk -r -n -b -o SIZE "$HOMEPART" | head -n 1) / 1024 / 1024 )
		HOMEPARTSIZEG=$(echo "scale=1 ; $HOMEPARTSIZEM / 1024" | bc -l )
	
		if [ "$HOMEPARTSIZEM" -lt "$MINSIZEDM" ] ; then
		#if [ "$(echo ${HOMEPARTSIZEM} '<' ${MINSIZEDM} | bc -l)" -eq 1 ] ; then
	
			LACKSPACE=$"The size of the selected $HOMEPART partition ($HOMEPARTSIZEM MiB = $HOMEPARTSIZEG GiB) is smaller than recommended ($MINSIZEDM MiB = $MINSIZEDG GiB).\n\nDo you want to select another partition?"
		
			$DIALOG $WICON $WTITLE $"Small partition" $WYN   $WTEXT "$LACKSPACE" $H $W
		
				if [ "$?" -eq 0 ] ; then
					set_homepart
					return
				else
					true
				fi
		fi
	fi

}

set_homepart

if [ "$HOMEPART" != "$NOHOMEPART" ] ; then
	echo "HOMEPART=\"$HOMEPART\""
	SEPARATE_HOME="Y"

	btrfs device scan
	CHECKBRAIDHOMEPART=$(LANG=C btrfs filesystem show | sed ':a;N;$!ba;s|\n\t| |g' | grep -aEi "[a-zA-Z0-9]" | grep -aEi 'Total devices ' | grep -aEiv 'Total devices 1 ' | grep -aE " $HOMEPART | $HOMEPART$")
else
	SEPARATE_HOME="N"
fi


# set fs /home part

set_fs_home () {

# nilfs2 limitations:  https://nilfs.sourceforge.io/en/current_status.html  https://docs.kernel.org/filesystems/nilfs2.html#caveats

FSLIST=""
for i in ext4 ext3 btrfs nilfs2 ; do
	if [ "$(command -v mkfs.$i)" != "" ] ; then FSLIST="$FSLIST $i $ESP" ; fi
done

FSHOME=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select a file system for the /home partition.\n\nIf in doubt, select 'ext4'." $H $W $LH $COLUMN $COLUMN $FSLIST "$OPENPARTEDITOR" " " "$DONOTFORMAT" " " | head -n 1 )

if [ "$?" -ne 0 ] || [ "$FSHOME" = "" ] ; then
	REFUN=set_fs_home
	input_error ; return
fi

if [ "$FSHOME" = "$OPENPARTEDITOR" ] ; then

	if [ "$G" = "N" ] ; then
		exec >/dev/tty
		if [ "$(command -v parted)" != "" ] ; then
			parted
		elif [ "$(command -v cfdisk)" != "" ] ; then
			cfdisk
		else
			REFUN=set_fs_home
			input_error ; return
		fi
		if [ "$DEBUG" != "N" ] ; then
			exec > >(tee -a "$ERRORLOG") 2>&1
		fi
	else
		if [ "$(command -v gparted)" != "" ] ; then
			su-to-root -X -c gparted
		elif [ "$(command -v partitionmanager)" != "" ] ; then
			su-to-root -X -c partitionmanager
		elif [ -e /usr/share/applications/gparted.desktop ] ; then
			$(cat /usr/share/applications/gparted.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		elif [ -e /usr/share/applications/partitionmanager.desktop ] ; then
			$(cat /usr/share/applications/partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		elif [ -e /usr/share/applications/org.kde.partitionmanager.desktop ] ; then
			$(cat /usr/share/applications/org.kde.partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		else
			REFUN=set_fs_home
			input_error ; return
		fi
	fi

	FSHOME="$DONOTFORMAT"
fi

}

if [ "$SEPARATE_HOME" = "Y" ] ; then

	if [ "$CHECKBRAIDHOMEPART" = "" ] ; then
		set_fs_home
	else
		FSHOME="$DONOTFORMAT"
	fi

	echo "FSHOME=\"$FSHOME\""

fi


# set label /home part

set_label_home () {

if [ "$G" = "N" ] ; then
	personal="home"
else
	personal=$"personal"
fi

PRE_LABELHOME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"You can write a label (a custom name) for the new /home partition.\n\nIt may be left blank if you want, but labeling partitions is useful to identify them. ('$personal' might be a good choice.) \n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 16 characters.) \n" $H $W $PREWRITE "$personal")

LABELHOME=$(echo "$PRE_LABELHOME" | sed 's| ||g')

NC_LABELHOME=$(printf "$LABELHOME" | wc -m)
if [ "$NC_LABELHOME" -gt 16 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The label (custom name) has $NC_LABELHOME characters and the maximum length is 16 characters.\n\nPlease select other label." $H $W
	set_label_home
	return
fi

if [ "$LABELHOME" != "" ] ; then

CHECK_LABELHOME=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEiv "^$(echo $HOMEPART | sed 's|/dev/||g') " | cut -d ' ' -f 3- | grep -aE "^$LABELHOME$")

	if [ "$CHECK_LABELHOME" != "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

	set_label_home
	return

	fi
fi

}

if [ "$SEPARATE_HOME" = "Y" ] ; then
	if [ "$FSHOME" != "$DONOTFORMAT" ] && [ "$CHECKBRAIDHOMEPART" = "" ] ; then
		set_label_home
		echo "LABELHOME=\"$LABELHOME\""
	fi
fi


### DATA PARTITION ########################################

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"A separated data partition for storing some files (documents, photos,...) is useful if you want to work with them using different operating systems installed on the computer.\n\nDo you want a data partition? \n" $H $W

if [ "$?" -eq 0 ] ; then

INT=0
ADDOPT="$ALLDEVS"
set_datapart () {

recparts

if [ "$RECPARTS" = "" ] ; then
	DATAPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u )
	DATAPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u )
else
	DATAPARTLIST=$(lsblk -r -n -o KNAME,RM,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
	DATAPARTLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE,NAME | grep -aEi " $INT " | grep -aEi ' part| crypt| raid| md| lvm| dm' | grep -aEiv '_rmeta_|_rimage_' | awk '{print "/dev/"$1"\t"$3}' | sort -u | grep -aEv "$(echo "$RECPARTS" | tr "\n" " " | tr " " "|" | sed 's:|:[^a-zA-Z0-9/-]|:g' | sed 's:|$::g')" )
fi

DATAPART=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"${INFOCRYPTACTIVEPARTS}${INFOLVMACTIVEPARTS}${INFOBTRFSACTIVEPARTS}${INFOMDADMACTIVEPARTS}Please select an option:\n\n(1 GB = 1000 MB; 1 GiB = 1024 MiB)" $H $W $LH $COLUMN $COLUMN "$NODATAPART" " " $DATAPARTLISTSIZE "$ADDOPT" " " "$ADVANCEDOPTIONS" " " | head -n 1 )

	if [ "$?" -ne 0 ] || [ "$DATAPART" = "" ] ; then
		REFUN=set_datapart
		input_error ; return
	fi

	if [ "$DATAPART" = "$ALLDEVS" ] ; then
		INT=.
		ADDOPT="$INTDEVS"
		set_datapart
		return
	fi

	if [ "$DATAPART" = "$INTDEVS" ] ; then
		INT=0
		ADDOPT="$ALLDEVS"
		set_datapart
		return
	fi

	if [ "$DATAPART" = "$ADVANCEDOPTIONS" ] ; then
		act_crypt
		act_lvm
		act_mdadm
		apartop
		set_datapart
		return
	fi

	# check_space
	if [ "$DATAPART" != "NODATAPART" ] ; then
	
		DATAPARTSIZEM=$(expr $(lsblk -r -n -b -o SIZE "$DATAPART" | head -n 1) / 1024 / 1024 )
		DATAPARTSIZEG=$(echo "scale=1 ; $DATAPARTSIZEM / 1024" | bc -l )
	
		if [ "$DATAPARTSIZEM" -lt "$MINSIZEDM" ] ; then
		#if [ "$(echo ${DATAPARTSIZEM} '<' ${MINSIZEDM} | bc -l)" -eq 1 ] ; then
	
			LACKSPACE=$"The size of the selected $DATAPART partition ($DATAPARTSIZEM MiB = $DATAPARTSIZEG GiB) is smaller than recommended ($MINSIZEDM MiB = $MINSIZEDG GiB).\n\nDo you want to select another partition?"
		
			$DIALOG $WICON $WTITLE $"Small partition" $WYN   $WTEXT "$LACKSPACE" $H $W
		
				if [ "$?" -eq 0 ] ; then
					set_datapart
					return
				else
					true
				fi
		fi
	fi

}

set_datapart

if [ "$DATAPART" != "$NODATAPART" ] ; then
	echo "DATAPART=\"$DATAPART\""
	SEPARATE_DATA="Y"

	btrfs device scan
	CHECKBRAIDDATAPART=$(LANG=C btrfs filesystem show | sed ':a;N;$!ba;s|\n\t| |g' | grep -aEi "[a-zA-Z0-9]" | grep -aEi 'Total devices ' | grep -aEiv 'Total devices 1 ' | grep -aE " $DATAPART | $DATAPART$")
else
	SEPARATE_DATA="N"
fi


# set fs data part

set_fs_data () {

# nilfs2 limitations:  https://nilfs.sourceforge.io/en/current_status.html  https://docs.kernel.org/filesystems/nilfs2.html#caveats

FSLIST=""
for i in ntfs vfat ext4 ext3 btrfs nilfs2 ; do
	if [ "$(command -v mkfs.$i)" != "" ] ; then FSLIST="$FSLIST $i $ESP" ; fi
done

FSDATA=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select a file system for the data partition.\n\n'ntfs' is recommended if you want to work with the same data using different users and/or operating systems, 'ext4' (or 'btrfs' or 'nilfs2') is recommended if you will use the same user and only GNU systems (in order to preserve permissions and owners, privative operating systems don't usually support this).\n\nIf in doubt, use 'ntfs'." $H $W $LH $COLUMN $COLUMN $FSLIST "$OPENPARTEDITOR" " " "$DONOTFORMAT" " " | head -n 1 )

if [ "$?" -ne 0 ] || [ "$FSDATA" = "" ] ; then
	REFUN=set_fs_data
	input_error ; return
fi

if [ "$FSDATA" = "$OPENPARTEDITOR" ] ; then

	if [ "$G" = "N" ] ; then
		exec >/dev/tty
		if [ "$(command -v parted)" != "" ] ; then
			parted
		elif [ "$(command -v cfdisk)" != "" ] ; then
			cfdisk
		else
			REFUN=set_fs_data
			input_error ; return
		fi
		if [ "$DEBUG" != "N" ] ; then
			exec > >(tee -a "$ERRORLOG") 2>&1
		fi
	else
		if [ "$(command -v gparted)" != "" ] ; then
			su-to-root -X -c gparted
		elif [ "$(command -v partitionmanager)" != "" ] ; then
			su-to-root -X -c partitionmanager
		elif [ -e /usr/share/applications/gparted.desktop ] ; then
			$(cat /usr/share/applications/gparted.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		elif [ -e /usr/share/applications/partitionmanager.desktop ] ; then
			$(cat /usr/share/applications/partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		elif [ -e /usr/share/applications/org.kde.partitionmanager.desktop ] ; then
			$(cat /usr/share/applications/org.kde.partitionmanager.desktop | grep -aE ^Exec= | sed "s|^Exec=||g")
		else
			REFUN=set_fs_data
			input_error ; return
		fi
	fi

	FSDATA="$DONOTFORMAT"
fi

}

if [ "$SEPARATE_DATA" = "Y" ] ; then

	if [ "$CHECKBRAIDDATAPART" = "" ] ; then
		set_fs_data
	else
		FSDATA="$DONOTFORMAT"
	fi

	echo "FSDATA=\"$FSDATA\""

fi


# set label data part

set_label_data () {

PRE_LABELDATA=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a label (a custom name) for the new data partition. ('data' might be a good choice.) \n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 16 characters.) \n" $H $W $PREWRITE $"data")

if [ "$?" -ne 0 ] ; then
	REFUN=set_label_data
	input_error ; return
fi

LABELDATA=$(echo "$PRE_LABELDATA" | sed 's| ||g')

NC_LABELDATA=$(printf "$LABELDATA" | wc -m)
if [ "$NC_LABELDATA" -gt 16 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The label (custom name) has $NC_LABELDATA characters and the maximum length is 16 characters.\n\nPlease select other label." $H $W
	set_label_data
	return
fi

if [ "$LABELDATA" = "" ] ; then
	REFUN=set_label_data
	input_error ; return
else

CHECK_LABELDATA=$(lsblk -r -n -o KNAME,RM,LABEL | grep -aEiv "^$(echo $DATAPART | sed 's|/dev/||g') " | cut -d ' ' -f 3- | grep -aE "^$LABELDATA$")

	if [ "$CHECK_LABELDATA" != "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"This label is already in use. Please select another." $H $W

	set_label_data
	return

	fi

fi

}

if [ "$SEPARATE_DATA" = "Y" ] ; then
	if [ "$FSDATA" != "$DONOTFORMAT" ] && [ "$CHECKBRAIDDATAPART" = "" ] ; then
		set_label_data
		echo "LABELDATA=\"$LABELDATA\""
	fi
fi


else
	SEPARATE_DATA="N"
# DATA PART Q END
fi


### MANUAL PARTITIONING END ########################################

else

### AUTO PARTITIONING ########################################

if [ "$AUTODEVDISKSUF" = "" ] ; then
	
	if   [ "$AUTODEVTYPE" = "DISK" ] ; then
	
		if [ "$(echo "$AUTODEV" | grep -aE "[0-9]$")" != "" ] ; then
			AUTODEVDISKSUF="${AUTODEV}p"
		else
			AUTODEVDISKSUF="$AUTODEV"
		fi
	
	elif [ "$AUTODEVTYPE" = "PART" ] ; then
	AUTODEVNPART=$(echo "$AUTODEV" | sed "s|.*[a-zA-Z/:-]||g" )
		AUTODEVDISK=$(lsblk -r -n -o KNAME,TYPE -s $AUTODEV | grep -aEi ' disk' | awk '{print "/dev/"$1}' | sort -u)
		# fix around (mmc)blk devices with (mmc)blkXpY partitions (e.g. /dev/mmcblk0p1 ) and NVME devices with nvmeXnYpZ partitions (e.g. /dev/nvme0n1p1 ):
		AUTODEVDISKSUF=$(echo "$AUTODEV" | sed "s|${AUTODEVNPART}$||g" )
		CHECK_AUTODEVDISKSUF=$(echo "$AUTODEVDISKSUF" | grep -aEi "[0-9]p$")
		if [ "$CHECK_AUTODEVDISKSUF" != "" ] ; then
			PROP_AUTODEVDISK=$(echo "$AUTODEVDISKSUF" | sed "s|p$||g")
		else
			PROP_AUTODEVDISK=$AUTODEVDISKSUF
		fi
	#fi
	
	else
		echo "ERROR: AUTODEVTYPE=$AUTODEVTYPE"
		kill $PIDDIALOGFORMATTING 2>/dev/null
		check_exit
	fi

fi


### set variables:

# /
if [ "$(cat "$AUTOPROP" | grep -a $'\t'/$'\t' | awk '{print $1}')" = "" ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"ERROR: System partition not detected.\n\nCannot continue." $H $W
	REFUN=part_opt
	input_error ; return
else
	IPART=${AUTODEVDISKSUF}$(cat "$AUTOPROP" | grep -a $'\t'/$'\t' | awk -F "\t" '{print $1}')
	LABELIPART="$(cat "$AUTOPROP" | grep -a $'\t'/$'\t' | awk -F "\t" '{print $5}')"
	FSIPART=$(cat "$AUTOPROP" | grep -a $'\t'/$'\t' | awk -F "\t" '{print $3}')
fi

# /home
if [ "$(cat "$AUTOPROP" | grep -a $'\t'/home$'\t' | awk '{print $1}')" = "" ] ; then
	SEPARATE_HOME="N"
else
	HOMEPART=${AUTODEVDISKSUF}$(cat "$AUTOPROP" | grep -a $'\t'/home$'\t' | awk -F "\t" '{print $1}')
	LABELHOME="$(cat "$AUTOPROP" | grep -a $'\t'/home$'\t' | awk -F "\t" '{print $5}')"
	FSHOME=$(cat "$AUTOPROP" | grep -a $'\t'/home$'\t' | awk -F "\t" '{print $3}')
	SEPARATE_HOME="Y"
fi

# swap
if [ "$(cat "$AUTOPROP" | grep -a $'\t'swap$'\t' | awk '{print $1}')" = "" ] ; then
	SWAPPART="$NOSWAP"
else
	SWAPPART=${AUTODEVDISKSUF}$(cat "$AUTOPROP" | grep -a $'\t'swap$'\t' | awk -F "\t" '{print $1}')
fi

# efi
if [ "$(cat "$AUTOPROP" | grep -a $'\t'efi$'\t' | awk '{print $1}')" != "" ] ; then
	EFIPART=${AUTODEVDISKSUF}$(cat "$AUTOPROP" | grep -a $'\t'efi$'\t' | awk -F "\t" '{print $1}')
fi

### AUTO PARTITIONING END ########################################


# End: if [ "$AUTOPROP" = "" ]
fi

## End: if [ "$TEMPLATE" != "Y" ]
#fi


### HOSTNAME ########################################

	if [ "$NEWHOSTNAME" = "" ] ; then

set_hostname () {

PROPHOSTNAME=$(echo $(cat /sys/class/dmi/id/sys_vendor | awk '{print $1}' | head -n 1 | tr -cd "[a-zA-Z0-9-]" ; cat /sys/class/dmi/id/product_name | head -n 1 | tr -cd "[a-zA-Z0-9-]") | sed 's| ||g' | tr "[A-Z]" "[a-z]" | tr -cd "[a-z0-9-]")
if [ "$PROPHOSTNAME" = "" ] ; then
PROPHOSTNAME=$(echo $(lshw | head -n 9 | grep -aEi 'vendor:|product:' | awk '{print $2}' | tac | tr -cd "[a-zA-Z0-9-]" ) | sed 's| ||g' | tr "[A-Z]" "[a-z]" | tr -cd "[a-z0-9-]")  # tac = sed -n '1!G;h;$p'
fi

PRE_NEWHOSTNAME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a 'hostname' (a name for the computer, for example a combination of brand, model and/or color, this name should be unique within the local network).\n\n(Lowercase and/or numbers only, hyphens are allowed as separators, but not spaces or other symbols, maximum length 63 characters.)\n" $H $W $PREWRITE "$PROPHOSTNAME")

if [ "$?" -ne 0 ] ; then
	REFUN=set_hostname
	input_error ; return
fi

NEWHOSTNAME=$(echo "$PRE_NEWHOSTNAME" | sed 's| ||g')

NC_NEWHOSTNAME=$(printf "$NEWHOSTNAME" | wc -m)
if [ "$NC_NEWHOSTNAME" -gt 63 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The 'hostname' (the computer name) has $NC_NEWHOSTNAME characters and the maximum length is 63 characters.\n\nPlease select another." $H $W
	set_hostname
	return
fi

if [ "$NEWHOSTNAME" = "" ] ; then
	REFUN=set_hostname
	input_error ; return
fi

}

set_hostname
echo "NEWHOSTNAME=\"$NEWHOSTNAME\"" | tee -a /tmp/iivar

	# End: if [ "$NEWHOSTNAME" = "" ]
	fi


### USERS AND PASSWORDS ########################################

	if [ "$TEMPLATE" != "Y" ] ; then

$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"For a good system security, you must configure at least two users: \n\n* An administrator user (named 'root') with SuperUser powers, whose password is requested when somebody attempts to do an action that could jeopardize the security or stability of the system.\n\n* A normal or usual user (or several, one for each person who usually uses the computer), who do daily or routine activities with the computer.\n\nNow you will be asked for a username and password for the normal or usual user, and a password for the administrator user (named 'root') with SuperUser powers.\n\nPlease think them well (and keep them secret!).\n" $H $W

	# End: if [ "$TEMPLATE" != "Y" ]
	fi

########################################

# 'su' (and GUI based on) defaults to 'root'. If the 'root' username is changed (1) or logging in as 'root' is disabled (2), then 'su' (and GUI based on) stops working: viable for servers, not for desktop. Changing the 'root' username can add little or nothing to the security because the new ID=0 username is easy to find for any logged-in user (3). Additionally, the 'root' password is easy to physically bypass (4) on directly used computers (5).
# (1) usermod -R /path/to/mounted/filesystem -l $NEWROOTNAME root  # -m -d /path/to/new/home  # If try it on the running system then error "usermod: user 'root' is currently used by process 1"
# (2) useradd -o -u 0 -g 0 -s $(command -v bash) -m -d /root/ $NEWROOTNAME ; printf "$NEWUSERPASS\n$NEWUSERPASS\n\n" | passwd $NEWROOTNAME ; usermod -s /bin/false root # /usr/sbin/nologin
# (3) On all native *NIX filesystems (also NFS and archive formats as tar), the ownership is stored as user and group (numeric) IDs (uid and gid) which is then mapped to resolve names using /etc/passwd and /etc/group. /etc/passwd requires 644 permissions in order to do userid (username <-> numeric ID) resolution. With 644 permissions, any user can find ID=0 username. If "chmod 600 /etc/passw*" then basic userid resolution stops working, so bash prompt will be "I have no name!@<hostname>#" and "ls -l" will show numeric ID instead of username in owner column. (Note that, in the rare case that there is a purely numeric username that matches an ID, then chown gives priority to the username, not the UID; it can be tested with 'id -u ID'.)
# (4) Changing the 'root' username allows to disable login as 'root' (for example in tty), but using the computer directly it is easy to physically bypass this via GRUB rescue, live system or plugging the internal disk into a laptop via (S)ATA-USB adapter (the first two can be avoided by disabling the option and setting some password in GRUB and in BIOS/EFI/u-boot/...). Note that, although it is not a 'root' username and password issue, disk encryption mitigates the vulnerabilities of directly used computers.
# (5) Login as 'root' should not be allowed in remote connections to the computer (e.g. ssh) in order to force double password (login username + su root) to elevate powers.

########################################

	if [ "$NEWUSERNAME" = "" ] ; then

# set username
set_username () {
PRE_NEWUSERNAME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a username for the normal or usual user.\n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 32 characters.)\n" $H $W)

if [ "$?" -ne 0 ] ; then
	REFUN=set_username
	input_error ; return
fi

NEWUSERNAME=$(echo "$PRE_NEWUSERNAME" | sed 's| ||g')

# Check username conflict
CHECK_NEWUSERNAME=$(cat /etc/passwd /etc/group | awk -F ':' '{if ($3 < 1000 || $1 == "nobody" || $1 == "nogroup") print $1}' | grep -aE "^$NEWUSERNAME$")
if [ "$CHECK_NEWUSERNAME" != "" ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"ERROR: The username matches an existing username." $H $W
	set_username ; return
fi

NC_NEWUSERNAME=$(printf "$NEWUSERNAME" | wc -m)
if [ "$NC_NEWUSERNAME" -gt 32 ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The username has $NC_NEWUSERNAME characters and the maximum length is 32 characters.\n\nPlease select other username." $H $W
	set_username
	return
fi

if [ "$NEWUSERNAME" = "" ] ; then
	REFUN=set_username
	input_error ; return
fi

}

set_username
echo "NEWUSERNAME=\"$NEWUSERNAME\"" | tee -a /tmp/iivar

	# End: if [ "$NEWUSERNAME" = "" ]
	fi


########################################

	if [ "$NEWUSERREALNAME" = "" ] ; then

# set "user's full name"
set_userfullname () {
NEWUSERREALNAME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write the new user's full name (you can use the same as before).\n\n(Spaces are allowed.)\n" $H $W $PREWRITE "$NEWUSERNAME")

	if [ "$?" -ne 0 ] ; then
	REFUN=set_userfullname
	input_error ; return
	fi

	if [ "$NEWUSERREALNAME" = "" ] ; then
	REFUN=set_userfullname
	input_error ; return
	fi
}

set_userfullname
echo "NEWUSERREALNAME=\"$NEWUSERREALNAME\"" | tee -a /tmp/iivar

	# End: if [ "$NEWUSERREALNAME" = "" ]
	fi


########################################

	if [ "$NEWUSERPASS" = "" ] ; then

# set user password
set_userpass () {
NEWUSERPASS=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a password for the normal or usual user.\n" $H $W)

	if [ "$?" -ne 0 ] ; then
	REFUN=set_userpass
	input_error ; return
	fi

	if [ "$NEWUSERPASS" = "" ] ; then
	REFUN=set_userpass
	input_error ; return
	fi
}

set_userpass
echo "NEWUSERPASS=\"$NEWUSERPASS\"" | tee -a /tmp/iivar

	# End: if [ "$NEWUSERPASS" = "" ]
	fi


########################################

	if [ "$NEWROOTPASS" = "" ] && [ "$SUDOCONFIG" != "Y" ] ; then

# set root password
set_rootpass () {
NEWROOTPASS=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a password for the administrator user (named 'root') with SuperUser powers.\n" $H $W)

	if [ "$?" -ne 0 ] ; then
	REFUN=set_rootpass
	input_error ; return
	fi

	if [ "$NEWROOTPASS" = "" ] ; then
	REFUN=set_rootpass
	input_error ; return
	fi
}

set_rootpass
echo "NEWROOTPASS=\"$NEWROOTPASS\"" | tee -a /tmp/iivar

	# End: if [ "$NEWROOTPASS" = "" ] && [ "$SUDOCONFIG" != "Y" ]
	fi


### GUEST USER ########################################

	if [ "$TEMPLATE" != "Y" ] ; then

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Do you want to create a 'guest' user for sporadic cases? \n" $H $W

if [ "$?" -eq 0 ] ; then

set_guestpass () {
GUESTPASS=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a password for the 'guest' user.\n" $H $W)

	if [ "$?" -ne 0 ] ; then
	REFUN=set_guestpass
	input_error ; return
	fi

	if [ "$GUESTPASS" = "" ] ; then
	REFUN=set_guestpass
	input_error ; return
	fi
}

set_guestuser () {
PRE_GUESTNAME=$($DIALOG $WICON $WTITLE "$TITLE" $WRITE $WTEXT $"Please write a name for the 'guest' user.\n\n(Letters and/or numbers only, hyphens and underscores are allowed as separators, but not spaces or other symbols, maximum length 32 characters.)\n" $H $W)

if [ "$?" -eq 0 ] ; then

	GUESTNAME=$(echo "$PRE_GUESTNAME" | sed 's| ||g')

	if [ "$GUESTNAME" = "$NEWUSERNAME" ] || [ "$GUESTNAME" = "$NEWUSERREALNAME" ] ; then
		$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"ERROR: The normal or usual user and the 'guest' user cannot have the same username." $H $W
		set_guestuser
		return
	fi

	# Check username conflict
	CHECK_GUESTNAME=$(cat /etc/passwd /etc/group | awk -F ':' '{if ($3 < 1000 || $1 == "nobody" || $1 == "nogroup") print $1}' | grep -aE "^$GUESTNAME$")
	if [ "$CHECK_GUESTNAME" != "" ] ; then
		$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"ERROR: The username matches an existing username." $H $W
		set_guestuser ; return
	fi

	NC_GUESTNAME=$(printf "$GUESTNAME" | wc -m)
	if [ "$NC_GUESTNAME" -gt 32 ] ; then
		$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"The username has $NC_GUESTNAME characters and the maximum length is 32 characters.\n\nPlease select other username." $H $W
		set_guestuser
		return
	fi

	if [ "$GUESTNAME" = "" ] ; then
		REFUN=set_guestuser
		input_error ; return
	fi

	echo "GUESTNAME=\"$GUESTNAME\"" | tee -a /tmp/iivar

	set_guestpass
	echo "GUESTPASS=\"$GUESTPASS\"" | tee -a /tmp/iivar

fi

}

set_guestuser

fi

	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### Autologin DisplayManager for DesktopEnvironment ########################################

	if [ "$AUTOLOGIN" = "" ] ; then

$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Do you want the computer to start without asking for the normal or usual user's password?\n\n'No/Cancel' is recommended for security reasons.\n" $H $W

if [ "$?" -eq 0 ] ; then
	AUTOLOGIN="Y"
else
	AUTOLOGIN="N"
fi

echo "AUTOLOGIN=\"$AUTOLOGIN\"" | tee -a /tmp/iivar

	# End: if [ "$AUTOLOGIN" = "" ]
	fi


### GRUB ########################################

UNAMER=$(echo "$(uname -mr) --- $(uname -a)")
echo UNAMER=$UNAMER

# Signed kernels since Debian 10 "Buster" (Devuan 3 "Beowulf")
if [ -e /etc/picalibre_version ] ; then cat /etc/picalibre_version >> "$ERRORLOG" ; PRE_PICAVERSION=$(cat /etc/picalibre_version | cut -d '.' -f 1 ) ; fi
if [ -e /etc/debian_version ] ; then cat /etc/debian_version >> "$ERRORLOG" ; PRE_DEBIANVERSION=$(cat /etc/debian_version | cut -d '.' -f 1 ) ; fi
if [ -e /etc/devuan_version ] ; then cat /etc/devuan_version >> "$ERRORLOG" ; PRE_DEVUANVERSION=$(expr $(cat /etc/devuan_version | sed -e 's|jessie|1|g' -e 's|ascii|2|g' -e 's|beowulf|3|g' -e 's|chimaera|4|g' -e 's|daedalus|5|g' -e 's|excalibur|6|g' | cut -d '.' -f 1 | sed 's|/ceres||g') + 7 ) ; fi
DEBIANVERSION=$(printf "$PRE_PICAVERSION\n$PRE_DEBIANVERSION\n$PRE_DEVUANVERSION" | sort -n -r | head -n 1 )


# check GRUB version
GRUBVERIN=$(echo $(dpkg -l | grep -aEi "^ii|^hi" | awk '{print $2}' | grep -aEi "^grub" | sed "s|:.*||g" | grep -aEiv "^grub2$|\-choose\-|\-common$|\-customizer$|\-bin$|\-dbg$|\-dbgsym$|\-disk$|\-doc$|\-efi$|\-emu$|\-firmware\-|\-grubby$|\-image|\-installer$|\-invaders$|\-linuxbios$|grub\-menu$|\-mount\-|\-theme\-|\-rescue\-|\-splash|\-template" ) | sed 's|grub-efi-amd64 grub-efi-amd64-signed|grub-efi-amd64|g' | sed 's|grub-efi-arm64 grub-efi-arm64-signed|grub-efi-arm64|g'| sed 's|grub-efi-ia32 grub-efi-ia32-signed|grub-efi-ia32|g')
# grub2, grub-efi and grub-linuxbios are dummy transitional packages
echo GRUBVERIN=$GRUBVERIN


	if [ "$GRUBVERSEL" = "" ] ; then

# GRUB options in function to the architecture

# architecture:
if [ "$SYSARC" = "" ] ; then
	
	if [ "$(uname -mr | grep -aEi 'amd64|x86_64|x86-64' )" != "" ] ; then SYSARC="amd64" ; fi
	if [ "$(uname -mr | grep -aEi 'armel|iop32x|ixp4xx|kirkwood|marvell|mv78xx0|orion5x|rpi|versatile|arm' )" != "" ] ; then SYSARC="armel" ; fi
	if [ "$(uname -mr | grep -aEi 'armhf|armmp|mx5|omap|vexpress|armv' )" != "" ] ; then SYSARC="armhf" ; fi
	if [ "$(uname -mr | grep -aEi 'arm64|aarch64' )" != "" ] ; then SYSARC="arm64" ; fi
	if [ "$(uname -mr | grep -aEi '386|486|586|686|x86_32|x86-32' )" != "" ] ; then SYSARC="i386" ; fi
	if [ "$(uname -mr | grep -aEi 'itanium|mckinley|ia64' )" != "" ] ; then SYSARC="ia64" ; fi
	if [ "$(uname -mr | grep -aEi 'loong64|loongarch64' )" != "" ] ; then SYSARC="loong64" ; fi
	if [ "$(uname -mr | grep -aEi 'bcm91|ip22|ip32|malta|mips|octeon' )" != "" ] ; then SYSARC="mips" ; fi
	if [ "$(uname -mr | grep -aEi 'loongson|malta|mips64|octeon' )" != "" ] ; then SYSARC="mips64el" ; fi
	if [ "$(uname -mr | grep -aEi 'loongson|bcm91|cobalt|malta|mips32|mipsel|octeon' )" != "" ] ; then SYSARC="mipsel" ; fi
	if [ "$(uname -mr | grep -aEi 'powerpc|powerpc64|ppc|ppc64' )" != "" ] ; then SYSARC="powerpc" ; fi
	if [ "$(uname -mr | grep -aEi 'powerpc64le|ppc64el|ppc64le' )" != "" ] ; then SYSARC="ppc64el" ; fi
	if [ "$(uname -mr | grep -aEi 'riscv64|rv64' )" != "" ] ; then SYSARC="riscv64" ; fi
	if [ "$(uname -mr | grep -aEi 's390x' )" != "" ] ; then SYSARC="s390x" ; fi
	if [ "$(uname -mr | grep -aEi 'sparc' )" != "" ] ; then SYSARC="sparc" ; fi
	if [ "$(uname -mr | grep -aEi 'sparc64' )" != "" ] ; then SYSARC="sparc64" ; fi
	
	if [ "$SYSARC" = "" ] ; then
		$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"ERROR: Processor type not identified ( $UNAMER ).\n\nCannot continue." $H $W
		check_exit
	fi
	
fi

	# GRUB options in function to the architecture
	# grub-legacy (Nov 2024 - since Debian 13 "Trixie") becomes just a "transistional" (sic) package to grub-pc
	unset GRUBVERLIST
	if [ "$SYSARC" = "amd64" ] ; then GRUBVERLIST=$(printf "grub-cloud-amd64 $ESP grub-coreboot $ESP grub-efi-amd64 $ESP grub-efi-ia32 $ESP grub-ieee1275 $ESP grub-pc $ESP grub-xen $ESP grub-xen-host $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "armel" ] ; then GRUBVERLIST=$(printf "grub-efi-arm $ESP grub-uboot $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "armhf" ] ; then GRUBVERLIST=$(printf "grub-efi-arm $ESP grub-uboot $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "arm64" ] ; then GRUBVERLIST=$(printf "grub-efi-arm64 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "hurd-i386" ] ; then GRUBVERLIST=$(printf "grub-coreboot $ESP grub-efi-ia32 $ESP grub-ieee1275 $ESP grub-pc $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "i386" ] ; then GRUBVERLIST=$(printf "grub-coreboot $ESP grub-efi-amd64 $ESP grub-efi-ia32 $ESP grub-ieee1275 $ESP grub-pc $ESP grub-xen $ESP grub-xen-host $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "ia64" ] ; then GRUBVERLIST=$(printf "grub-efi-ia64 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "kfreebsd-amd64" ] ; then GRUBVERLIST=$(printf "grub-coreboot $ESP grub-efi-amd64 $ESP grub-efi-ia32 $ESP grub-ieee1275 $ESP grub-pc $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "kfreebsd-i386" ] ; then GRUBVERLIST=$(printf "grub-coreboot $ESP grub-efi-ia32 $ESP grub-ieee1275 $ESP grub-pc $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "loong64" ] ; then GRUBVERLIST=$(printf "grub-efi-loong64 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "mipsel" ] ; then GRUBVERLIST=$(printf "grub-yeeloong $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "powerpc" ] ; then GRUBVERLIST=$(printf "grub-ieee1275 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "ppc64el" ] ; then GRUBVERLIST=$(printf "grub-ieee1275 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "riscv64" ] ; then GRUBVERLIST=$(printf "grub-efi-riscv64 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "sparc" ] ; then GRUBVERLIST=$(printf "grub-ieee1275 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "sparc64" ] ; then GRUBVERLIST=$(printf "grub-ieee1275 $ESP $GRUBVERLIST") ; fi
	if [ "$SYSARC" = "x32" ] ; then GRUBVERLIST=$(printf "grub-coreboot $ESP grub-efi-amd64 $ESP grub-efi-ia32 $ESP grub-ieee1275 $ESP grub-pc $ESP $GRUBVERLIST") ; fi

	if [ "$GRUBVERLIST" = "" ] ; then
		echo "ERROR: $(uname -mr) --- $(uname -a)"
#		check_exit
	fi

	# Preselect a GRUB version as the default proposal
	unset PRESELGRUB
if [ "$EFIDET" != "" ] ; then
	if [ "$SYSARC" = "amd64" ] ; then PRESELGRUB="grub-efi-amd64" ; fi
	if [ "$SYSARC" = "armel" ] ; then PRESELGRUB="grub-efi-arm" ; fi
	if [ "$SYSARC" = "armhf" ] ; then PRESELGRUB="grub-efi-arm" ; fi
	if [ "$SYSARC" = "arm64" ] ; then PRESELGRUB="grub-efi-arm64" ; fi
	if [ "$SYSARC" = "hurd-i386" ] ; then PRESELGRUB="grub-efi-ia32" ; fi
	if [ "$SYSARC" = "i386" ] ; then PRESELGRUB="grub-efi-ia32" ; fi
	if [ "$SYSARC" = "ia64" ] ; then PRESELGRUB="grub-efi-ia64" ; fi
	if [ "$SYSARC" = "kfreebsd-amd64" ] ; then PRESELGRUB="grub-efi-amd64" ; fi
	if [ "$SYSARC" = "kfreebsd-i386" ] ; then PRESELGRUB="grub-efi-ia32" ; fi
	if [ "$SYSARC" = "loong64" ] ; then PRESELGRUB="grub-efi-loong64" ; fi
	if [ "$SYSARC" = "mipsel" ] ; then PRESELGRUB="grub-yeeloong" ; fi
	if [ "$SYSARC" = "powerpc" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "ppc64el" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "riscv64" ] ; then PRESELGRUB="grub-efi-riscv64" ; fi
	if [ "$SYSARC" = "sparc" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "sparc64" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "x32" ] ; then PRESELGRUB="grub-efi-amd64" ; fi
else
	if [ "$SYSARC" = "amd64" ] ; then PRESELGRUB="grub-pc" ; fi
	if [ "$SYSARC" = "armel" ] ; then PRESELGRUB="grub-uboot" ; fi
	if [ "$SYSARC" = "armhf" ] ; then PRESELGRUB="grub-uboot" ; fi
	if [ "$SYSARC" = "arm64" ] ; then PRESELGRUB="grub-efi-arm64" ; fi
	if [ "$SYSARC" = "hurd-i386" ] ; then PRESELGRUB="grub-pc" ; fi
	if [ "$SYSARC" = "i386" ] ; then PRESELGRUB="grub-pc" ; fi
	if [ "$SYSARC" = "ia64" ] ; then PRESELGRUB="grub-efi-ia64" ; fi
	if [ "$SYSARC" = "kfreebsd-amd64" ] ; then PRESELGRUB="grub-pc" ; fi
	if [ "$SYSARC" = "kfreebsd-i386" ] ; then PRESELGRUB="grub-pc" ; fi
	if [ "$SYSARC" = "loong64" ] ; then PRESELGRUB="grub-efi-loong64" ; fi
	if [ "$SYSARC" = "mipsel" ] ; then PRESELGRUB="grub-yeeloong" ; fi
	if [ "$SYSARC" = "powerpc" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "ppc64el" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "riscv64" ] ; then PRESELGRUB="grub-efi-riscv64" ; fi
	if [ "$SYSARC" = "sparc" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "sparc64" ] ; then PRESELGRUB="grub-ieee1275" ; fi
	if [ "$SYSARC" = "x32" ] ; then PRESELGRUB="grub-pc" ; fi
fi


sel_grub () {

EFIGRUBVERIN=$(echo "$GRUBVERIN" | grep -aEi '\-efi' )

if [ "$EFIDET" != "" ] ; then
	# EFI
	if [ "$EFIGRUBVERIN" != "" ] ; then
		EFIGRUBTEXT=$"This computer seems to have EFI, if so grub-efi must be selected, $GRUBVERIN is probably a good choice."
#		PRESELGRUB=$GRUBVERIN
	else
		EFIGRUBTEXT=$"This computer seems to have EFI, if so grub-efi must be selected."
	fi
else
	# No EFI
	if [ "$EFIGRUBVERIN" != "" ] ; then
		EFIGRUBTEXT=$"This computer seems not to have EFI, if so a non-efi GRUB version must be selected, for example grub-pc for computers with BIOS (grub-coreboot for GNU Boot / Canoeboot / CoreBoot / LinuxBIOS, grub-ieee1275 for OpenFirmware / OpenBoot / OpenBIOS,...)."
	else
		EFIGRUBTEXT=$"This computer seems not to have EFI, if so a non-efi GRUB version must be selected, $GRUBVERIN is probably a good choice."
#		PRESELGRUB=$GRUBVERIN
	fi
fi

GRUBSELTEXT=$"GRUB bootloader is the responsible for booting the different installed systems when the computer is turned on.\n\nPlease select the GRUB version to install.\n\n$GRUBVERIN is installed.\n\n$EFIGRUBTEXT \n\nIf in doubt, select $PRESELGRUB (the first on the list).\n"

GRUBVERSEL=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT "$GRUBSELTEXT" $H $W $LH $COLUMN $COLUMN $PRESELGRUB " " $(echo "$GRUBVERLIST" | sed "s|$PRESELGRUB $ESP ||g") $"Do not install GRUB" " " | head -n 1 )

	if [ "$?" -ne 0 ] ; then
	REFUN=sel_grub
	input_error ; return
	fi

	if [ "$GRUBVERSEL" = "" ] ; then
	REFUN=sel_grub
	input_error ; return
	fi

if [ "$GRUBVERSEL" = $"Do not install GRUB" ] ; then
	GRUBVERSEL=""
fi

}

sel_grub

echo "GRUBVERSEL=\"$GRUBVERSEL\"" | tee -a /tmp/iivar

	# End: if [ "$GRUBVERSEL" = "" ]
	fi


	if [ "$GRUBINSLOC" = "" ] ; then

if [ "$GRUBVERSEL" != "" ] ; then

config_grub () {

SELGRUBINSLOC=$($DIALOG $WICON $WTITLE "$TITLE" $MONOLIST $WTEXT $"Please select where to install GRUB.\n\n'Installation disk' is usually a right choice, but 'First internal disk' may be a right option if the operating system is installed to a secondary disk other than the main disk (the boot order or priority of the disks can be set in BIOS/EFI).\n\nPlease select an option:" $H $W $LH $COLUMN $COLUMN $"Installation disk" " " $"First internal disk" " " $"Select disk" " " $"Installation partition" " " $"Do not install GRUB" " " | head -n 1 )

	if [ "$?" -ne 0 ] ; then
	REFUN=config_grub
	input_error ; return
	fi

	if [ "$SELGRUBINSLOC" = "" ] ; then
	REFUN=config_grub
	input_error ; return
	fi

case "$SELGRUBINSLOC" in

	$"Installation disk")
		GRUBINSLOC=$(lsblk -r -n -o KNAME,TYPE -s $IPART | grep -aEi ' disk' | awk '{print "/dev/"$1}' | sort -u)
		if [ "$GRUBINSLOC" = "" ] ; then
			IPARTDISKSUF=$(echo "$IPART" | sed "s|[0-9]\+$||g" )
			CHECK_IPARTDISKSUF=$(echo "$IPARTDISKSUF" | grep -aEi "[0-9]p$")
			if [ "$CHECK_IPARTDISKSUF" != "" ] ; then
				PROP_IPARTDISK=$(echo "$IPARTDISKSUF" | sed "s|p$||g")
			else
				PROP_IPARTDISK=$IPARTDISKSUF
			fi
			if [ "$(lsblk -r -n -o KNAME,RM,TYPE $PROP_IPARTDISK | grep -aEi ' disk')" = "" ] ; then
				check_exit
			else
				IPARTDISK=$(lsblk -r -n -o KNAME,RM,TYPE $PROP_IPARTDISK | grep -aEi ' disk' | awk '{print "/dev/"$1}' | sort -u)
			fi
			if [ "$IPARTDISK" = "" ] ; then check_exit ; fi
			GRUBINSLOC=$IPARTDISK
		fi
	;;

	$"First internal disk")
		if [ "$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' disk' | awk '{print "/dev/"$1}' | grep -a /dev/nvme0n1)" != "" ] ; then
			GRUBINSLOC="/dev/nvme0n1"
		elif [ "$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' disk' | awk '{print "/dev/"$1}' | grep -a /dev/sda)" != "" ] ; then
			GRUBINSLOC="/dev/sda"
		elif [ "$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' disk' | awk '{print "/dev/"$1}' | grep -a /dev/mmcblk0)" != "" ] ; then
			GRUBINSLOC="/dev/mmcblk0"
		else
			REFUN=config_grub
			input_error ; return
		fi
	;;

	$"Select disk")
INT=0
ADDOPT="$ALLDEVS"
seldis () {
		DISKLISTSIZE=$(lsblk -r -n -o KNAME,RM,SIZE,TYPE | grep -aEi " $INT " | grep -aEi ' disk' | awk '{print "'"$PRE"'","/dev/"$1"\t("$3")","'"$POST"'"}' | sort -u )
		PRE_GRUBINSLOC=$($DIALOG $WICON $WTITLE "$TITLE" $MULTIPLELIST $WTEXT $"Select disk:" $H $W $LH $COLUMN $COLUMN $COLUMN $DISKLISTSIZE $PRE "$ADDOPT" " " $POST | sed 's|(.*)||g' | sed 's|^TRUE||g')
		if [ "$?" -ne 0 ] || [ "$PRE_GRUBINSLOC" = "" ] ; then
			REFUN=config_grub
			input_error ; return
		fi
		if [ "$(echo $PRE_GRUBINSLOC | grep -a "$(echo $ALLDEVS | sed 's| (.*)||g')")" != "" ] ; then
			INT=.
			ADDOPT="$INTDEVS"
			seldis
			return
		fi
		if [ "$(echo $PRE_GRUBINSLOC | grep -a "$(echo $INTDEVS | sed 's| (.*)||g')")" != "" ] ; then
			INT=0
			ADDOPT="$ALLDEVS"
			seldis
			return
		fi
}
		seldis || return 1
		GRUBINSLOC="$PRE_GRUBINSLOC"
	;;

	$"Installation partition")
		GRUBINSLOC="part"
	;;

	$"Do not install GRUB")
		GRUBVERSEL=""
		GRUBINSLOC="No"
	;;

	*)
	echo "ERROR: SELGRUBINSLOC=$SELGRUBINSLOC"
	REFUN=config_grub
	input_error ; return
	;;

esac

}

	if [ "$AUTOPROP" = "" ] ; then

		config_grub

	else

		#$"Installation disk")
		GRUBINSLOC=$(lsblk -r -n -o KNAME,TYPE -s $IPART | grep -aEi ' disk' | awk '{print "/dev/"$1}' | sort -u)
		if [ "$GRUBINSLOC" = "" ] ; then
			IPARTDISKSUF=$(echo "$IPART" | sed "s|[0-9]\+$||g" )
			CHECK_IPARTDISKSUF=$(echo "$IPARTDISKSUF" | grep -aEi "[0-9]p$")
			if [ "$CHECK_IPARTDISKSUF" != "" ] ; then
				PROP_IPARTDISK=$(echo "$IPARTDISKSUF" | sed "s|p$||g")
			else
				PROP_IPARTDISK=$IPARTDISKSUF
			fi
			if [ "$(lsblk -r -n -o KNAME,RM,TYPE $PROP_IPARTDISK | grep -aEi ' disk')" = "" ] ; then
				check_exit
			else
				IPARTDISK=$(lsblk -r -n -o KNAME,RM,TYPE $PROP_IPARTDISK | grep -aEi ' disk' | awk '{print "/dev/"$1}' | sort -u)
			fi
			if [ "$IPARTDISK" = "" ] ; then check_exit ; fi
			GRUBINSLOC=$IPARTDISK
		fi

	fi

	echo "GRUBINSLOC=\"$GRUBINSLOC\"" | tee -a /tmp/iivar

fi

	# End: if [ "$GRUBINSLOC" = "" ]
	fi


### ALL OK ? ########################################

#cat /tmp/iivar
#source /tmp/iivar

	if [ "$TEMPLATE" != "Y" ] ; then

if [ "$FSIPART" != "$DONOTFORMAT" ] ; then
IPART_TEXT=$"The system will be installed on $IPART which will be formatted in $FSIPART\n\n"
else
IPART_TEXT=$"The system will be installed on $IPART which will not be formatted\n\n"
fi


if [ "$SEPARATE_HOME" = "Y" ] ; then
	if [ "$FSHOME" != "$DONOTFORMAT" ] ; then
	HOMEPART_TEXT=$"The /home partition will be $HOMEPART which will be formatted in $FSHOME\n\n"
	else
	HOMEPART_TEXT=$"The /home partition will be $HOMEPART which will not be formatted\n\n"
	fi
fi


if [ "$SEPARATE_DATA" = "Y" ] ; then
	if [ "$FSDATA" != "$DONOTFORMAT" ] ; then
	DATAPART_TEXT=$"The data partition will be $DATAPART which will be formatted in $FSDATA\n\n"
	else
	DATAPART_TEXT=$"The data partition will be $DATAPART which will not be formatted\n\n"
	fi
fi


if [ "$LABELIPART" != "" ] ; then
	LABELIPART_TEXT=$"The system partition label will be '$LABELIPART'\n\n"
fi


if [ "$LABELHOME" != "" ] ; then
	if [ "$FSHOME" != "$DONOTFORMAT" ] ; then
	LABELHOME_TEXT=$"The /home partition label will be '$LABELHOME'\n\n"
	fi
fi


if [ "$LABELDATA" != "" ] ; then
	if [ "$FSDATA" != "$DONOTFORMAT" ] ; then
	LABELDATA_TEXT=$"The data partition label will be '$LABELDATA'\n\n"
	fi
fi


if [ "$SWAPPART" = "$NOSWAP" ] ; then
SWAPCONFIG_TEXT=$"No swap will be used\n\n"
elif [ "$SWAPPART" = "$USESWAPFILE" ] ; then
SWAPCONFIG_TEXT=$"A swap file will be used (no a separate partition)\n\n"
else
SWAPCONFIG_TEXT=$"Swap partition will be $SWAPPART\n\n"
fi

if [ "$(echo $GRUBINSLOC | grep -a '/dev/')" != "" ] ; then
	GRUBTEXT=$"$GRUBVERSEL will be installed in $GRUBINSLOC"
elif [ "$GRUBVERSEL" != "" ] ; then
	GRUBTEXT=$"$GRUBVERSEL will be installed"
else
	GRUBTEXT=$"No GRUB will be installed"
fi

#if [ "$SNAPMETHOD" = "clone" ] ; then
#
#CONFIRMTEXT=$"${IPART_TEXT}${LABELIPART_TEXT}${HOMEPART_TEXT}${LABELHOME_TEXT}${DATAPART_TEXT}${LABELDATA_TEXT}${SWAPCONFIG_TEXT}Usernames and passwords will be as in the live session.\n\n$GRUBTEXT\n\nThe content of the partitions will be erased according to the choices made and the installation will start if you continue.\n\nDo you want to continue?\nPlease cancel if you don't want to do it! \n"
#
#$DIALOG $WICON $WTITLE $"Please review settings" $QYN   $WTEXT "$CONFIRMTEXT" $H $W
#
#	if [ "$?" -ne 0 ] ; then
#	clean
#	exit 0
#	fi
#
#else

CONFIRMTEXT=$"${IPART_TEXT}${LABELIPART_TEXT}${HOMEPART_TEXT}${LABELHOME_TEXT}${DATAPART_TEXT}${LABELDATA_TEXT}${SWAPCONFIG_TEXT}The 'hostname' (the name of the computer) will be '$NEWHOSTNAME'\n\nThe normal user name will be '$NEWUSERNAME'\n\nThe normal user's full name will be '$NEWUSERREALNAME'\n\nThe normal user password will be '$NEWUSERPASS'\n\nThe password for the administrator user (named 'root') with SuperUser powers will be '$NEWROOTPASS'\n\n$GRUBTEXT\n\nThe content of the partitions will be erased according to the choices made and the installation will start if you continue.\n\nDo you want to continue?\nPlease cancel if you don't want to do it! \n"

$DIALOG $WICON $WTITLE $"Please review settings" $QYN   $WTEXT "$CONFIRMTEXT" $H $W

	if [ "$?" -ne 0 ] ; then
		clean
		exit 0
	fi

#fi

	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### GRUBINSLOC RECORDING ########################################

if [ "$(echo $GRUBINSLOC | grep -a '/dev/')" != "" ] ; then
	echo  "================================================================================" > /etc/grubil
	echo $"The following information is saved in /etc/grubil but writing it on a paper can be helpful:" >> /etc/grubil
	echo $"During the installation, GRUB was installed in:" >> /etc/grubil
	echo $GRUBINSLOC >> /etc/grubil
	echo '=' >> /etc/grubil
	find -L /dev/disk/ -samefile $GRUBINSLOC >> /etc/grubil
	if [ "$(lsblk -r -n -o KNAME,TYPE -s $GRUBINSLOC | grep -a -c ^)" -eq 1 ] ; then
		parted $GRUBINSLOC print | head -n 2 >> /etc/grubil
	else
		lsblk -r -n -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID $GRUBINSLOC >> /etc/grubil
	fi
	echo  "================================================================================" >> /etc/grubil
fi


### START DIALOG 'FORMATTING' ########################################

$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
PIDDIALOGFORMATTING=$( echo $! )


### DISKS FORMATTING ########################################

umount --recursive $DTMP && sleep 3

lsblk -r -n -o MOUNTPOINT | grep -aE "^$(echo $DTMP | sed "s|/$||g")" | awk '{print length($1)"\t"$1}' | sort -n -r | cut -f 2 | while read i ; do umount "$i" && sleep 3 ; done

echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### blkid ##########"
blkid
echo "### by-id ##########"
ls -l /dev/disk/by-id/
echo "#############"


if [ "$AUTOPROP" != "" ] ; then
# AUTO PARTITIONING ########################################

if [ "$AUTODEVTYPE" = "DISK" ] ; then

	# umount
	lsblk -r -n -o KNAME,TYPE $AUTODEV | grep -aEiv ' disk' | awk '{print "/dev/"$1}' | while read i ; do swapoff $i ; done
	lsblk -r -n -o KNAME,TYPE $AUTODEV | grep -aEiv ' disk' | awk '{print "/dev/"$1}' | while read i ; do umount  $i ; done

	# Erase
	for n in {1..9} ; do wipefs -f -a $AUTODEV ; done
	dd if=/dev/zero of=$AUTODEV oflag=sync bs=1M count=10
	sync

	# Create a new partition table
	printf "Yes\n" | parted -s $AUTODEVDISK mklabel $AUTODTT
	blockdev --rereadpt $AUTODEVDISK
	partprobe $AUTODEVDISK
	REPET=0 ; while [ "$(lsblk -r -n $AUTODEVDISK )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done

elif [ "$AUTODEVTYPE" = "PART" ] ; then

	# umount
	swapoff $AUTODEV
	umount  $AUTODEV

	# delete RAID header
	if [ "$(lsblk -r -n -o FSTYPE $AUTODEV | head -n 1 | grep -aEi 'raid')" != "" ] ; then
		mdadm --zero-superblock $AUTODEV
	fi

	# Erase
	for n in {1..9} ; do wipefs -f -a $AUTODEV ; done
	dd if=/dev/zero of=$AUTODEV oflag=sync bs=1M count=10
	printf "Yes\n" | parted -s $AUTODEVDISK rm $AUTODEVNPART
	blockdev --rereadpt $AUTODEVDISK
	partprobe $AUTODEVDISK
	REPET=0 ; while [ "$(lsblk -r -n $AUTODEVDISK )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done

else
	echo "ERROR: AUTODEVTYPE=$AUTODEVTYPE"
	kill $PIDDIALOGFORMATTING 2>/dev/null
	check_exit
fi

# Create and format new partitions

if [ -e "/tmp/etc_fstab" ] ; then
	rm -rf /tmp/etc_fstab
fi

cat "$AUTOPROP" | grep -aEi "^[0-9]" | while read i ; do

	printf "Y\nI\n" | parted -s -a optimal $AUTODEVDISK mkpart $(echo "$i" | awk -F "\t" '{print $2" "$7" "$8}')
	blockdev --rereadpt $AUTODEVDISK
	partprobe $AUTODEVDISK
	REPET=0 ; while [ "$(lsblk -r -n $AUTODEVDISK )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
	
	# GPT part (re)name
	if [ "$AUTODTT" = "gpt" ] || [ "$AUTODTT" = "mac" ] || [ "$AUTODTT" = "pc98" ] ; then
		if [ "$(echo "$i" | awk -F "\t" '{print $5}')" != "" ] ; then
			parted -s -a optimal $AUTODEVDISK name $(echo "$i" | awk -F "\t" '{print $1}') "$(echo "$i" | awk -F "\t" '{print $5}')"
			blockdev --rereadpt $AUTODEVDISK
			partprobe $AUTODEVDISK
			REPET=0 ; while [ "$(lsblk -r -n $AUTODEVDISK )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
		elif [ "$(echo "$i" | awk -F "\t" '{print $6}')" != "" ] ; then
			parted -s -a optimal $AUTODEVDISK name $(echo "$i" | awk -F "\t" '{print $1}') "$(echo "$i" | awk -F "\t" '{print $6}')"
			blockdev --rereadpt $AUTODEVDISK
			partprobe $AUTODEVDISK
			REPET=0 ; while [ "$(lsblk -r -n $AUTODEVDISK )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
		else
			true
		fi
	fi

	NPARTi=$(echo "$i" | awk -F "\t" '{print $1}')
	FSi=$(echo "$i" | awk -F "\t" '{print $3}')
	LABi=$(echo "$i" | awk -F "\t" '{print $5}')
	MPi=$(echo "$i" | awk -F "\t" '{print $4}')

	if [ "$NPARTi" = "" ] ; then
		check_exit
	fi
	
	if [ "$FSi" != "" ] ; then
	
		# delete RAID header
		if [ "$(lsblk -r -n -o FSTYPE ${AUTODEVDISKSUF}$NPARTi | head -n 1 | grep -aEi 'raid')" != "" ] ; then
			mdadm --zero-superblock ${AUTODEVDISKSUF}$NPARTi
		fi

		# erase
		for n in {1..9} ; do wipefs -f -a ${AUTODEVDISKSUF}$NPARTi ; done
		
		# format
		if [ "$FSi" = "swap" ] ; then
			mkswap ${AUTODEVDISKSUF}$NPARTi
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		elif [ "$FSi" = "vfat" ] ; then
			mkfs.$FSi -F 32 ${AUTODEVDISKSUF}$NPARTi
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		elif [ "$FSi" = "ntfs" ] ; then
			mkfs.$FSi -Q ${AUTODEVDISKSUF}$NPARTi
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		else
			mkfs.$FSi ${AUTODEVDISKSUF}$NPARTi
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		fi
	
		# reserved blocks
		if [ "$FSi" = "ext4" ] || [ "$FSi" = "ext3" ] || [ "$FSi" = "ext2" ] ; then
			# Reserved blocks
			# Block size is usually 4096 bytes. Since Debian 7 "Wheezy", all tools should automatically align filesystems and partitions to the 4096 byte page size.
			#RESERVEDBLOCKS=$(calc 300*1024*1024/4096) = 76800
			#P300MBE3PC=$(calc 0.3/0.03) = 10
			P300MBE3PC=$(expr 30 / 3)
			# df
			SIZEPART=$(expr $(lsblk -r -n -b -o SIZE "${AUTODEVDISKSUF}$NPARTi" | head -n 1) / 1024 / 1024 / 1000)

			if [ "$SIZEPART" -ge 10 ] ; then
			tune2fs -r 76800 ${AUTODEVDISKSUF}$NPARTi
			else
			tune2fs -m 3 ${AUTODEVDISKSUF}$NPARTi
			fi
		fi
	
	fi
	
	#FSi=$(blkid -o value -s TYPE ${AUTODEVDISKSUF}$NPARTi )
	FSi=$(lsblk -r -n -o FSTYPE ${AUTODEVDISKSUF}$NPARTi | head -n 1 )
	
	# filesystem label
	if [ "$LABi" != "" ] ; then
		if [ "$FSi" = "ext4" ] || [ "$FSi" = "ext3" ] || [ "$FSi" = "ext2" ] ; then
			e2label ${AUTODEVDISKSUF}$NPARTi "$LABi"
		elif [ "$FSi" = "btrfs" ] ; then
			btrfs filesystem label ${AUTODEVDISKSUF}$NPARTi "$LABi"
		elif [ "$FSi" = "nilfs2" ] ; then
			nilfs-tune -L "$LABi" ${AUTODEVDISKSUF}$NPARTi
		elif [ "$FSi" = "swap" ] ; then
			swaplabel -L "$LABi" ${AUTODEVDISKSUF}$NPARTi
		elif [ "$FSi" = "jfs" ] ; then
			jfs_tune -L "$LABi" ${AUTODEVDISKSUF}$NPARTi
		elif [ "$FSi" = "reiserfs" ] ; then
			reiserfstune -l "$LABi" ${AUTODEVDISKSUF}$NPARTi
		elif [ "$FSi" = "xfs" ] ; then
			xfs_admin -L "$LABi" ${AUTODEVDISKSUF}$NPARTi
		elif [ "$FSi" = "exfat" ] ; then
			exfatlabel ${AUTODEVDISKSUF}$NPARTi "$LABi"
		elif [ "$FSi" = "ntfs" ] ; then
			ntfslabel ${AUTODEVDISKSUF}$NPARTi "$LABi"
		elif [ "$FSi" = "vfat" ] ; then
			dosfslabel ${AUTODEVDISKSUF}$NPARTi "$LABi"
		else
			echo "FSi=$FSi"
		fi
	fi
	
	# partition flag
	FLAGi=$(echo "$i" | awk -F "\t" '{print $6}')
	if [ "$FLAGi" != "" ] ; then
		echo "$FLAGi" | sed "s|,|\n|g" | grep -aEi "[a-zA-Z0-9]" | while read f ; do
			printf "I\n\n" | parted -s $AUTODEVDISK set $NPARTi $f on
			blockdev --rereadpt $AUTODEVDISK
			partprobe $AUTODEVDISK
			REPET=0 ; while [ "$(lsblk -r -n $AUTODEVDISK )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
			REPET=0 ; while [ "$(lsblk -r -n -o FSTYPE ${AUTODEVDISKSUF}$NPARTi | head -n 1 )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
		done
	fi

	# mount
	if [ "$MPi" != "" ] ; then
		mkdir -pv ${DTMP}$MPi
		mount -o rw ${AUTODEVDISKSUF}$NPARTi ${DTMP}$MPi
		PARTUUID=$(lsblk -r -n -o UUID "${AUTODEVDISKSUF}$NPARTi" | head -n 1 )
		if [ "$PARTUUID" = "" ] ; then PARTUUID=$(blkid -o value -s UUID "${AUTODEVDISKSUF}$NPARTi" | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
		if [ "$PARTUUID" = "" ] ; then PARTUUID=$(find -L /dev/disk/by-uuid/ -samefile "${AUTODEVDISKSUF}$NPARTi" | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
		PARTID=$(find -L /dev/disk/by-id/ -samefile "${AUTODEVDISKSUF}$NPARTi" | sort | tail -n 1 )
	
		if [ "$PARTID" != "" ] ; then
			if [ "$PARTUUID" != "" ] ; then
				if [ "$(cat /etc/mtab | grep -aEi "^${AUTODEVDISKSUF}$NPARTi |^$PARTID |^/dev/disk/by-uuid/$PARTUUID |^UUID=$PARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "${AUTODEVDISKSUF}$NPARTi" "${DTMP}$MPi"
				fi
			else
				if [ "$(cat /etc/mtab | grep -aEi "^${AUTODEVDISKSUF}$NPARTi |^$PARTID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "${AUTODEVDISKSUF}$NPARTi" "${DTMP}$MPi"
				fi
			fi
		else
			if [ "$PARTUUID" != "" ] ; then
				if [ "$(cat /etc/mtab | grep -aEi "^${AUTODEVDISKSUF}$NPARTi |^/dev/disk/by-uuid/$PARTUUID |^UUID=$PARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "${AUTODEVDISKSUF}$NPARTi" "${DTMP}$MPi"
				fi
			else
				if [ "$(cat /etc/mtab | grep -aEi "^${AUTODEVDISKSUF}$NPARTi " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "${AUTODEVDISKSUF}$NPARTi" "${DTMP}$MPi"
				fi
			fi
		fi
	
		# permissions
		if [ -e "$MPi" ] ; then
			ls -ld "$MPi"
			chmod --reference="$MPi" ${DTMP}$MPi
			ls -ld ${DTMP}$MPi
		fi
	
		# fstab - additional entries
		if [ "${AUTODEVDISKSUF}$NPARTi" != "$IPART" ] && [ "${AUTODEVDISKSUF}$NPARTi" != "$HOMEPART" ] && [ "${AUTODEVDISKSUF}$NPARTi" != "$SWAPPART" ] && [ "${AUTODEVDISKSUF}$NPARTi" != "$EFIPART" ] ; then
		
			if [ "$PARTUUID" != "" ] ; then

				if [ "$(command -v fsck.$FSi)" != "" ] ; then
					echo "UUID=$PARTUUID  $MPi              $FSi         relatime,errors=remount-ro  0  2" >> /tmp/etc_fstab
				else
					echo "UUID=$PARTUUID  $MPi              $FSi         relatime,errors=remount-ro  0  0" >> /tmp/etc_fstab
				fi

			else

				PARTID=$(find -L /dev/disk/by-id/ -samefile ${AUTODEVDISKSUF}$NPARTi | sort | tail -n 1 )
				if [ "$PARTID" = "" ] ; then
					PARTID=$(ls -l /dev/disk/by-id/* | grep -aE "$(echo ${AUTODEVDISKSUF}$NPARTi | sed 's|/dev/||g' )$" | grep -aEo '/dev/disk/by-id/.* ->' | sed 's| ->||g' | sort | tail -n 1 )
				fi

				if [ "$PARTUUID" = "" ] && [ "$PARTID" = "" ] ; then
					kill $PIDDIALOGFORMATTING 2>/dev/null
					check_exit
				fi
				
				if [ "$(command -v fsck.$FSi)" != "" ] ; then
					echo "$PARTID  $MPi              $FSi         relatime,errors=remount-ro  0  2" >> /tmp/etc_fstab
					echo "#UUID=$PARTUUID  $MPi              $FSi         relatime,errors=remount-ro  0  2" >> /tmp/etc_fstab
				else
					echo "$PARTID  $MPi              $FSi         relatime,errors=remount-ro  0  0" >> /tmp/etc_fstab
					echo "#UUID=$PARTUUID  $MPi              $FSi         relatime,errors=remount-ro  0  0" >> /tmp/etc_fstab
				fi
				
			fi
		
		fi
	
	fi

done
parted -s $AUTODEVDISK print
parted -s $AUTODEVDISK unit B print


else
# MANUAL PARTITIONING ########################################


### install partition

if [ "$(lsblk -r -n -o FSTYPE $IPART | head -n 1 | grep -aEi swap)" != "" ] ; then
	swapoff $IPART
fi

umount $IPART

if [ "$FSIPART" != "$DONOTFORMAT" ] ; then

	# delete RAID header
	if [ "$(lsblk -r -n -o FSTYPE $IPART | head -n 1 | grep -aEi 'raid')" != "" ] ; then
		mdadm --zero-superblock $IPART
	fi

	# erase
	for n in {1..9} ; do wipefs -f -a $IPART ; done
	
	# format
	if [ "$FSIPART" = "vfat" ] ; then
		mkfs.$FSIPART -F 32 "$IPART"
		if [ "$?" -ne 0 ] ; then
			kill $PIDDIALOGFORMATTING 2>/dev/null
			check_exit
		fi
	elif [ "$FSIPART" = "ntfs" ] ; then
		mkfs.$FSIPART -Q "$IPART"
		if [ "$?" -ne 0 ] ; then
			kill $PIDDIALOGFORMATTING 2>/dev/null
			check_exit
		fi
	else
		mkfs.$FSIPART "$IPART"
		if [ "$?" -ne 0 ] ; then
			kill $PIDDIALOGFORMATTING 2>/dev/null
			check_exit
		fi
	fi

	# reserved blocks
	if [ "$FSIPART" = "ext4" ] || [ "$FSIPART" = "ext3" ] || [ "$FSIPART" = "ext2" ] ; then
		# Reserved blocks
		# Block size is usually 4096 bytes. Since Debian 7 "Wheezy", all tools should automatically align filesystems and partitions to the 4096 byte page size.
		#RESERVEDBLOCKS=$(calc 300*1024*1024/4096) = 76800
		#P300MBE3PC=$(calc 0.3/0.03) = 10
		P300MBE3PC=$(expr 30 / 3)
		# df
		SIZEIPART=$(expr $(lsblk -r -n -b -o SIZE "$IPART" | head -n 1) / 1024 / 1024 / 1000)

		if [ "$SIZEIPART" -ge 10 ] ; then
		tune2fs -r 76800 "$IPART"
		else
		tune2fs -m 3 "$IPART"
		fi
	fi
	
	# 'boot' partition flag
	BOOTL=""
	for i in $(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi ' disk' | awk '{print "/dev/"$1}' ) ; do
		BOOTL=$BOOTL$(parted -s $i print | grep -aEi "^[0-9]|^ [0-9]" | grep -aEi ' boot' | awk '{print $1}')
	done
	if [ "$BOOTL" = "" ] && [ "$EFIDET" = "" ] ; then
		# set 'boot' partition flag
		IPARTNUM=$(echo "$IPART" | sed "s|.*[a-zA-Z/:-]||g" )
			# fix around (mmc)blk devices with (mmc)blkXpY partitions (e.g. /dev/mmcblk0p1 ) and NVME devices with nvmeXnYpZ partitions (e.g. /dev/nvme0n1p1 ):
			PREIDISK=$(echo "$IPART" | sed "s|${IPARTNUM}$||g" )
			CHECK_PREIDISK=$(echo "$PREIDISK" | grep -aEi "[0-9]p$")
			if [ "$CHECK_PREIDISK" != "" ] ; then
				IDISK=$(echo "$PREIDISK" | sed "s|p$||g")
			else
				IDISK=$PREIDISK
			fi
		printf "I\n\n" | parted -s $IDISK set $IPARTNUM boot on
		blockdev --rereadpt $IDISK
		partprobe $IDISK
		REPET=0 ; while [ "$(lsblk -r -n $IPART )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
		REPET=0 ; while [ "$(lsblk -r -n -o FSTYPE $IPART | head -n 1 )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
	fi

fi

FSIPART=$(lsblk -r -n -o FSTYPE $IPART | head -n 1 )

# filesystem label
if [ "$LABELIPART" != "" ] ; then
	if [ "$FSIPART" = "ext4" ] || [ "$FSIPART" = "ext3" ] || [ "$FSIPART" = "ext2" ] ; then
		e2label "$IPART" "$LABELIPART"
	elif [ "$FSIPART" = "btrfs" ] ; then
		btrfs filesystem label "$IPART" "$LABELIPART"
	elif [ "$FSIPART" = "nilfs2" ] ; then
		nilfs-tune -L "$LABELIPART" "$IPART"
	elif [ "$FSIPART" = "swap" ] ; then
		swaplabel -L "$LABELIPART" "$IPART"
	elif [ "$FSIPART" = "jfs" ] ; then
		jfs_tune -L "$LABELIPART" "$IPART"
	elif [ "$FSIPART" = "reiserfs" ] ; then
		reiserfstune -l "$LABELIPART" "$IPART"
	elif [ "$FSIPART" = "xfs" ] ; then
		xfs_admin -L "$LABELIPART" "$IPART"
	elif [ "$FSIPART" = "exfat" ] ; then
		exfatlabel "$IPART" "$LABELIPART"
	elif [ "$FSIPART" = "ntfs" ] ; then
		ntfslabel "$IPART" "$LABELIPART"
	elif [ "$FSIPART" = "vfat" ] ; then
		dosfslabel "$IPART" "$LABELIPART"
	else
		echo "FSIPART=$FSIPART"
	fi
fi

# mount
mkdir -pv $DTMP
mount -o rw $IPART $DTMP
IPARTUUID=$(lsblk -r -n -o UUID $IPART | head -n 1 )
if [ "$IPARTUUID" = "" ] ; then IPARTUUID=$(blkid -o value -s UUID $IPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
if [ "$IPARTUUID" = "" ] ; then IPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $IPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
IPARTID=$(find -L /dev/disk/by-id/ -samefile $IPART | sort | tail -n 1 )

if [ "$IPARTID" != "" ] ; then
	if [ "$IPARTUUID" != "" ] ; then
		if [ "$(cat /etc/mtab | grep -aEi "^$IPART |^$IPARTID |^/dev/disk/by-uuid/$IPARTUUID |^UUID=$IPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
			mount -o remount,rw "$IPART" "$DTMP"
		fi
	else
		if [ "$(cat /etc/mtab | grep -aEi "^$IPART |^$IPARTID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
			mount -o remount,rw "$IPART" "$DTMP"
		fi
	fi
else
	if [ "$IPARTUUID" != "" ] ; then
		if [ "$(cat /etc/mtab | grep -aEi "^$IPART |^/dev/disk/by-uuid/$IPARTUUID |^UUID=$IPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
			mount -o remount,rw "$IPART" "$DTMP"
		fi
	else
		if [ "$(cat /etc/mtab | grep -aEi "^$IPART " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
			mount -o remount,rw "$IPART" "$DTMP"
		fi
	fi
fi

# permissions
ls -ld /
chmod --reference=/ $DTMP
ls -ld $DTMP


### home partition

# separate /home only
if [ "$SEPARATE_HOME" = "Y" ] ; then

	if [ "$(lsblk -r -n -o FSTYPE $HOMEPART | head -n 1 | grep -aEi swap)" != "" ] ; then
		swapoff $HOMEPART
	fi

	umount $HOMEPART
	
	if [ "$FSHOME" != "$DONOTFORMAT" ] ; then
	
		# delete RAID header
		if [ "$(lsblk -r -n -o FSTYPE $HOMEPART | head -n 1 | grep -aEi 'raid')" != "" ] ; then
			mdadm --zero-superblock $HOMEPART
		fi
	
		# erase
		for n in {1..9} ; do wipefs -f -a $HOMEPART ; done
		
		# format
		if [ "$FSHOME" = "vfat" ] ; then
			mkfs.$FSHOME -F 32 "$HOMEPART"
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		elif [ "$FSHOME" = "ntfs" ] ; then
			mkfs.$FSHOME -Q "$HOMEPART"
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		else
			mkfs.$FSHOME "$HOMEPART"
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		fi
	
		# reserved blocks
		if [ "$FSHOME" = "ext4" ] || [ "$FSHOME" = "ext3" ] || [ "$FSHOME" = "ext2" ] ; then
			# Reserved blocks
			# Block size is usually 4096 bytes. Since Debian 7 "Wheezy", all tools should automatically align filesystems and partitions to the 4096 byte page size.
			#RESERVEDBLOCKS=$(calc 300*1024*1024/4096) = 76800
			#P300MBE3PC=$(calc 0.3/0.03) = 10
			P300MBE3PC=$(expr 30 / 3)
			# df
			SIZEHOME=$(expr $(lsblk -r -n -b -o SIZE "$HOMEPART" | head -n 1) / 1024 / 1024 / 1000)

			if [ "$SIZEHOME" -ge 10 ] ; then
			tune2fs -r 76800 "$HOMEPART"
			else
			tune2fs -m 3 "$HOMEPART"
			fi
		fi
	
	fi
	
	FSHOME=$(lsblk -r -n -o FSTYPE $HOMEPART | head -n 1 )
	
	# filesystem label
	if [ "$LABELHOME" != "" ] ; then
		if [ "$FSHOME" = "ext4" ] || [ "$FSHOME" = "ext3" ] || [ "$FSHOME" = "ext2" ] ; then
			e2label "$HOMEPART" "$LABELHOME"
		elif [ "$FSHOME" = "btrfs" ] ; then
			btrfs filesystem label "$HOMEPART" "$LABELHOME"
		elif [ "$FSHOME" = "nilfs2" ] ; then
			nilfs-tune -L "$LABELHOME" "$HOMEPART"
		elif [ "$FSHOME" = "swap" ] ; then
			swaplabel -L "$LABELHOME" "$HOMEPART"
		elif [ "$FSHOME" = "jfs" ] ; then
			jfs_tune -L "$LABELHOME" "$HOMEPART"
		elif [ "$FSHOME" = "reiserfs" ] ; then
			reiserfstune -l "$LABELHOME" "$HOMEPART"
		elif [ "$FSHOME" = "xfs" ] ; then
			xfs_admin -L "$LABELHOME" "$HOMEPART"
		elif [ "$FSHOME" = "exfat" ] ; then
			exfatlabel "$HOMEPART" "$LABELHOME"
		elif [ "$FSHOME" = "ntfs" ] ; then
			ntfslabel "$HOMEPART" "$LABELHOME"
		elif [ "$FSHOME" = "vfat" ] ; then
			dosfslabel "$HOMEPART" "$LABELHOME"
		else
			echo "FSHOME=$FSHOME"
		fi
	fi

	# mount
	mkdir -pv $DTMP/home
	mount -o rw $HOMEPART $DTMP/home
	HOMEPARTUUID=$(lsblk -r -n -o UUID $HOMEPART | head -n 1 )
	if [ "$HOMEPARTUUID" = "" ] ; then HOMEPARTUUID=$(blkid -o value -s UUID $HOMEPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	if [ "$HOMEPARTUUID" = "" ] ; then HOMEPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $HOMEPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	HOMEPARTID=$(find -L /dev/disk/by-id/ -samefile $HOMEPART | sort | tail -n 1 )
	
	if [ "$HOMEPARTID" != "" ] ; then
		if [ "$HOMEPARTUUID" != "" ] ; then
			if [ "$(cat /etc/mtab | grep -aEi "^$HOMEPART |^$HOMEPARTID |^/dev/disk/by-uuid/$HOMEPARTUUID |^UUID=$HOMEPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$HOMEPART" "$DTMP/home"
			fi
		else
			if [ "$(cat /etc/mtab | grep -aEi "^$HOMEPART |^$HOMEPARTID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$HOMEPART" "$DTMP/home"
			fi
		fi
	else
		if [ "$HOMEPARTUUID" != "" ] ; then
			if [ "$(cat /etc/mtab | grep -aEi "^$HOMEPART |^/dev/disk/by-uuid/$HOMEPARTUUID |^UUID=$HOMEPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$HOMEPART" "$DTMP/home"
			fi
		else
			if [ "$(cat /etc/mtab | grep -aEi "^$HOMEPART " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$HOMEPART" "$DTMP/home"
			fi
		fi
	fi

	# permissions
	ls -ld /home
	chmod --reference=/home $DTMP/home
	ls -ld $DTMP/home

fi


### data partition

# separate data part only
if [ "$SEPARATE_DATA" = "Y" ] ; then

	if [ "$(lsblk -r -n -o FSTYPE $DATAPART | head -n 1 | grep -aEi swap)" != "" ] ; then
		swapoff $DATAPART
	fi

	umount $DATAPART
	
	if [ "$FSDATA" != "$DONOTFORMAT" ] ; then
	
		# delete RAID header
		if [ "$(lsblk -r -n -o FSTYPE $DATAPART | head -n 1 | grep -aEi 'raid')" != "" ] ; then
			mdadm --zero-superblock $DATAPART
		fi
	
		# erase
		for n in {1..9} ; do wipefs -f -a $DATAPART ; done
		
		# format
		if [ "$FSDATA" = "vfat" ] ; then
			mkfs.$FSDATA -F 32 "$DATAPART"
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		elif [ "$FSDATA" = "ntfs" ] ; then
			mkfs.$FSDATA -Q "$DATAPART"
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		else
			mkfs.$FSDATA "$DATAPART"
			if [ "$?" -ne 0 ] ; then
				kill $PIDDIALOGFORMATTING 2>/dev/null
				check_exit
			fi
		fi
	
		# reserved blocks
		if [ "$FSDATA" = "ext4" ] || [ "$FSDATA" = "ext3" ] || [ "$FSDATA" = "ext2" ] ; then
			# Reserved blocks
			# Block size is usually 4096 bytes. Since Debian 7 "Wheezy", all tools should automatically align filesystems and partitions to the 4096 byte page size.
			#RESERVEDBLOCKS=$(calc 300*1024*1024/4096) = 76800
			#P300MBE3PC=$(calc 0.3/0.03) = 10
			P300MBE3PC=$(expr 30 / 3)
			# df
			SIZEDATA=$(expr $(lsblk -r -n -b -o SIZE "$DATAPART" | head -n 1) / 1024 / 1024 / 1000)

			if [ "$SIZEDATA" -ge 10 ] ; then
			tune2fs -r 76800 "$DATAPART"
			else
			tune2fs -m 3 "$DATAPART"
			fi
		fi
	
	fi
	
	FSDATA=$(lsblk -r -n -o FSTYPE $DATAPART | head -n 1 )
	
	# filesystem label
	if [ "$LABELDATA" != "" ] ; then
		if [ "$FSDATA" = "ext4" ] || [ "$FSDATA" = "ext3" ] || [ "$FSDATA" = "ext2" ] ; then
			e2label "$DATAPART" "$LABELDATA"
		elif [ "$FSDATA" = "btrfs" ] ; then
			btrfs filesystem label "$DATAPART" "$LABELDATA"
		elif [ "$FSDATA" = "nilfs2" ] ; then
			nilfs-tune -L "$LABELDATA" "$DATAPART"
		elif [ "$FSDATA" = "swap" ] ; then
			swaplabel -L "$LABELDATA" "$DATAPART"
		elif [ "$FSDATA" = "jfs" ] ; then
			jfs_tune -L "$LABELDATA" "$DATAPART"
		elif [ "$FSDATA" = "reiserfs" ] ; then
			reiserfstune -l "$LABELDATA" "$DATAPART"
		elif [ "$FSDATA" = "xfs" ] ; then
			xfs_admin -L "$LABELDATA" "$DATAPART"
		elif [ "$FSDATA" = "exfat" ] ; then
			exfatlabel "$DATAPART" "$LABELDATA"
		elif [ "$FSDATA" = "ntfs" ] ; then
			ntfslabel "$DATAPART" "$LABELDATA"
		elif [ "$FSDATA" = "vfat" ] ; then
			dosfslabel "$DATAPART" "$LABELDATA"
		else
			echo "FSDATA=$FSDATA"
		fi
	fi

	# mount
	mkdir -pv $DTMP/home/$NEWUSERNAME/$LABELDATA
	mount -o rw $DATAPART $DTMP/home/$NEWUSERNAME/$LABELDATA
	DATAPARTUUID=$(lsblk -r -n -o UUID $DATAPART | head -n 1 )
	if [ "$DATAPARTUUID" = "" ] ; then DATAPARTUUID=$(blkid -o value -s UUID $DATAPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	if [ "$DATAPARTUUID" = "" ] ; then DATAPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $DATAPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	DATAPARTID=$(find -L /dev/disk/by-id/ -samefile $DATAPART | sort | tail -n 1 )
	
	if [ "$DATAPARTID" != "" ] ; then
		if [ "$DATAPARTUUID" != "" ] ; then
			if [ "$(cat /etc/mtab | grep -aEi "^$DATAPART |^$DATAPARTID |^/dev/disk/by-uuid/$DATAPARTUUID |^UUID=$DATAPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$DATAPART" "$DTMP/home/$NEWUSERNAME/$LABELDATA"
			fi
		else
			if [ "$(cat /etc/mtab | grep -aEi "^$DATAPART |^$DATAPARTID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$DATAPART" "$DTMP/home/$NEWUSERNAME/$LABELDATA"
			fi
		fi
	else
		if [ "$DATAPARTUUID" != "" ] ; then
			if [ "$(cat /etc/mtab | grep -aEi "^$DATAPART |^/dev/disk/by-uuid/$DATAPARTUUID |^UUID=$DATAPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$DATAPART" "$DTMP/home/$NEWUSERNAME/$LABELDATA"
			fi
		else
			if [ "$(cat /etc/mtab | grep -aEi "^$DATAPART " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
				mount -o remount,rw "$DATAPART" "$DTMP/home/$NEWUSERNAME/$LABELDATA"
			fi
		fi
	fi

fi


### swap

case "$SWAPPART" in

"$NOSWAP" )

	true
;;

"$USESWAPFILE" )

	dd if=/dev/zero of=$DTMP/swapfile oflag=sync bs=1M count=$SWAPFILESIZE
	sync
	mkswap $DTMP/swapfile
	chmod 600 $DTMP/swapfile
;;

* )

	if [ "$(lsblk -r -n -o FSTYPE $SWAPPART | head -n 1 | grep -aEi swap)" = "" ] ; then

		umount $SWAPPART
	
		# delete RAID header
		if [ "$(lsblk -r -n -o FSTYPE $SWAPPART | head -n 1 | grep -aEi 'raid')" != "" ] ; then
			mdadm --zero-superblock $SWAPPART
		fi
	
		# clean partition
		for n in {1..9} ; do wipefs -f -a $SWAPPART ; done
		
		mkswap $SWAPPART
		
		# filesystem label
		if [ "$(lsblk -r -n -o LABEL | grep -ai swap)" = "" ] ; then
			swaplabel -L swap $SWAPPART
		fi

	fi
;;

esac


# MANUAL PARTITIONING END ########################################

# if [ "$AUTOPROP" = "" ] ; then

fi


# END DIALOG 'PLEASE WAIT' ########################################

kill $PIDDIALOGFORMATTING 2>/dev/null


### EFI PARTITION (ESP) ########################################

EFIGRUBVERSEL=$(echo "$GRUBVERSEL" | grep -aEi '\-efi' )

if [ "$EFIGRUBVERSEL" != "" ] ; then

	if [ "$EFIPART" = "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGEFIPARTSEARCH=$( echo $! )

	# EFI partition search - Option 1: searching by 'esp' partition flag
	DLIST=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " 0 " | grep -aEi ' disk' | awk '{print "/dev/"$1}' )
	if [ "$DLIST" = "" ] ; then DLIST=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | grep -aEi ' ata| ide| pata| sata| scsi| sas| nvme| pci' | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}') ; fi  # In some computers the internal disk can be wrongly shown as removable.
	if [ "$DLIST" = "" ] ; then DLIST=$(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}') ; fi  # In some computers the internal disk can be wrongly shown as removable.
	for i in $(lsblk -r -n -o KNAME,RM,TYPE $(echo $GRUBINSLOC | grep -a /dev/ ) | grep -aEi ' disk' | awk '{print "/dev/"$1}' ) $DLIST ; do
		PRE_EFIPART_N=$(parted -s $i print | grep -aEi "^[0-9]|^ [0-9]" | grep -aEi ' esp' | awk '{print $1}')
		CHECK_PRE_EFIPART_N=$(echo "$PRE_EFIPART_N" | grep -aE "[0-9]")
		if [ "${CHECK_PRE_EFIPART_N}" != "" ] ; then
				# fix around (mmc)blk devices with (mmc)blkXpY partitions (e.g. /dev/mmcblk0p1 ) and NVME devices with nvmeXnYpZ partitions (e.g. /dev/nvme0n1p1 ):
				CHECK_PRE_EFIPART=$(echo "$i" | grep -aEi "[0-9]$")
				if [ "$CHECK_PRE_EFIPART" != "" ] ; then
					PRE_EFIPART="${i}p${PRE_EFIPART_N}"
				else
					PRE_EFIPART="${i}${PRE_EFIPART_N}"
				fi
			#fi
			# check
			if [ "${PRE_EFIPART}" != "" ] ; then
				EFIPART1=$(lsblk -r -n -o FSTYPE ${PRE_EFIPART} | grep -aEi fat )
				EFIPART2=$(expr $(lsblk -r -n -b -o SIZE ${PRE_EFIPART} | sort -n | head -n 1 ) / 1024 / 1024 / 1024 )
				if [ "$EFIPART1" != "" ] && [ "$EFIPART2" -le 2 ] ; then
					EFIPART="${PRE_EFIPART}"
					break
				fi
			fi
		fi
	done

	if [ "$EFIPART" != "" ] ; then
		kill $PIDDIALOGEFIPARTSEARCH 2>/dev/null
	else
		# EFI partition search - Option 2: searching only by format and size, no 'esp' partition flag
		PLIST=$(lsblk -r -n -o KNAME,RM,TYPE | grep -aEi " 0 " | grep -aEi ' part' | awk '{print "/dev/"$1}' )
		if [ "$PLIST" = "" ] ; then PLIST=$(lsblk -r -n -o KNAME,RM,TYPE $(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | grep -aEi ' ata| ide| pata| sata| scsi| sas| nvme| pci' | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}') | grep -aEi ' part' | awk '{print "/dev/"$1}') ; fi  # In some computers the internal disk can be wrongly shown as removable.
		if [ "$PLIST" = "" ] ; then PLIST=$(lsblk -r -n -o KNAME,RM,TYPE $(lsblk -r -n -o KNAME,RM,TYPE $(echo $(ls -l /dev/disk/by-id/ | sed "s|.*/|/dev/|g")) | grep -aEi ' disk' | awk '{print "/dev/"$1}') | grep -aEi ' part' | awk '{print "/dev/"$1}') ; fi  # In some computers the internal disk can be wrongly shown as removable.
		for i in $(lsblk -r -n -o KNAME,RM,TYPE $(echo $GRUBINSLOC | grep -a /dev/ ) | grep -aEi ' part' | awk '{print "/dev/"$1}' ) $PLIST ; do
			# check
			EFIPART1=$(lsblk -r -n -o FSTYPE $i | grep -aEi fat )
			EFIPART2=$(expr $(lsblk -r -n -b -o SIZE $i | sort -n | head -n 1 ) / 1024 / 1024 / 1024 )
			if [ "$EFIPART1" != "" ] && [ "$EFIPART2" -le 2 ] ; then
				PRE_EFIPART="$i"
				kill $PIDDIALOGEFIPARTSEARCH 2>/dev/null
				$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Is $PRE_EFIPART the EFI partition (ESP)?\n\n(If you don't know what to answer, you may want to select 'Yes/OK'.)\n" $H $W
				if [ "$?" -eq 0 ] ; then
					EFIPART="${PRE_EFIPART}"
					# set 'esp' partition flag (but it should be done already, also the small partition with 'bios_grub' flag )
					EFIPARTNUM=$(echo "$EFIPART" | sed "s|.*[a-zA-Z/:-]||g" )
						# fix around (mmc)blk devices with (mmc)blkXpY partitions (e.g. /dev/mmcblk0p1 ) and NVME devices with nvmeXnYpZ partitions (e.g. /dev/nvme0n1p1 ):
						PREEFIDISK=$(echo "$EFIPART" | sed "s|${EFIPARTNUM}$||g" )
						CHECK_PREEFIDISK=$(echo "$PREEFIDISK" | grep -aEi "[0-9]p$")
						if [ "$CHECK_PREEFIDISK" != "" ] ; then
							EFIDISK=$(echo "$PREEFIDISK" | sed "s|p$||g")
						else
							EFIDISK=$PREEFIDISK
						fi
					#fi
					printf "I\n\n" | parted -s $EFIDISK set $EFIPARTNUM esp on
					blockdev --rereadpt $EFIDISK
					partprobe $EFIDISK
					REPET=0 ; while [ "$(lsblk -r -n $EFIPART )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
					REPET=0 ; while [ "$(lsblk -r -n -o FSTYPE $EFIPART | head -n 1 )" = "" ] && [ "$REPET" -lt 120 ] ; do REPET=$(expr $REPET + 1) ; sleep 1 ; done
					break
				fi
			fi
		done
	kill $PIDDIALOGEFIPARTSEARCH 2>/dev/null
	fi
	
	echo "EFIPART=\"$EFIPART\""
	
	# End: if [ "$EFIPART" = "" ]
	fi

	if [ "$EFIPART" != "" ] ; then
		# filesystem label
		if [ "$(lsblk -r -n -o LABEL | grep -ai EFI)" = "" ] ; then
			dosfslabel "$EFIPART" EFI
		fi
		# make mountpoint and mount it
		mkdir -pv $DTMP/boot/efi
		umount $EFIPART
		mount -o rw $EFIPART $DTMP/boot/efi
		EFIPARTUUID=$(lsblk -r -n -o UUID $EFIPART | head -n 1 )
		if [ "$EFIPARTUUID" = "" ] ; then EFIPARTUUID=$(blkid -o value -s UUID $EFIPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
		if [ "$EFIPARTUUID" = "" ] ; then EFIPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $EFIPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
		EFIPARTID=$(find -L /dev/disk/by-id/ -samefile $EFIPART | sort | tail -n 1 )
	
		if [ "$EFIPARTID" != "" ] ; then
			if [ "$EFIPARTUUID" != "" ] ; then
				if [ "$(cat /etc/mtab | grep -aEi "^$EFIPART |^$EFIPARTID |^/dev/disk/by-uuid/$EFIPARTUUID |^UUID=$EFIPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "$EFIPART" "$DTMP/boot/efi"
				fi
			else
				if [ "$(cat /etc/mtab | grep -aEi "^$EFIPART |^$EFIPARTID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "$EFIPART" "$DTMP/boot/efi"
				fi
			fi
		else
			if [ "$EFIPARTUUID" != "" ] ; then
				if [ "$(cat /etc/mtab | grep -aEi "^$EFIPART |^/dev/disk/by-uuid/$EFIPARTUUID |^UUID=$EFIPARTUUID " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "$EFIPART" "$DTMP/boot/efi"
				fi
			else
				if [ "$(cat /etc/mtab | grep -aEi "^$EFIPART " | awk '{print $4}' | sed 's|,|\n|g' | grep -aEi "^ro$")" != "" ] ; then
					mount -o remount,rw "$EFIPART" "$DTMP/boot/efi"
				fi
			fi
		fi
	
		if [ "$(lsblk -r -n -o MOUNTPOINT $EFIPART)" = "$DTMP/boot/efi" ] ; then
			EFIPARTTEXT=$"$EFIPART has been mounted on $DTMP/boot/efi \n"
		else
			check_exit
		fi
		
	else
		# no detected EFI partition (ESP)
		$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"No EFI partition (ESP) has been detected but grub-efi has been selected, so the GRUB installation will likely fail.\n\nDo you want to continue?" $H $W
		if [ "$?" -ne 0 ] ; then
		check_exit
		fi
		EFIPARTTEXT="The EFI partition (ESP) must be manually mounted on $DTMP/boot/efi \n"
	fi

fi


### ADDITIONAL CUSTOM PARTITIONS ########################################

if [ "$AUTOPROP" = "" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"$EFIPARTTEXT\nDo you want to add additional partitions? If you select 'Yes/OK' a terminal will now open for manual mounting of the partitions in $DTMP and 'fstab' will be opened for manual editing later in the installation. This is an option only for experts. Most people should select 'No/Cancel'.\n" $H $W

	if [ "$?" -eq 0 ] ; then
	
		if [ ! -e /tmp/etc_fstab ] && [ "$G" = "N" ] ; then
			lsblk -r -n -o KNAME,SIZE,UUID,LABEL,FSTYPE | grep -aEi "[a-zA-Z0-9]" | while read i ; do pDIR="$(echo "$i" | awk '{print $4}' | grep -aEio $(ls -p / | grep -a / | sed 's|/||g' | awk '{printf "^"$1"|"}' | sed "s:|$::g"))" ; if [ "$pDIR" != "" ] ; then vKNAME=$(echo "$i" | awk '{print $1}') ; vSIZE=$(echo "$i" | awk '{print $2}') ; vUUID=$(echo "$i" | awk '{print $3}') ; vLABEL=$(echo "$i" | awk '{print $4}' | sed "s|^$pDIR|$pDIR/|g" | sed "s|/$||g") ; vFS=$(echo "$i" | awk '{print $5}') ; DEV="/dev/$vKNAME" ; if [ "$(cat /etc/mtab | grep -aEi "$DTMP" | grep -aEi "$DEV " )" = "" ] && [ "$(lsblk -r -n -o MOUNTPOINT | grep -aEi "^$DTMP/$vLABEL$")" = "" ] ; then umount $DEV ; mkdir -pv $DTMP/$vLABEL ; mount -o rw $DEV $DTMP/$vLABEL ; DIR=$(echo $vLABEL | sed 's|correo|mail|g') ; if [ -e "/$DIR" ] ; then ls -ld /$DIR ; chmod --reference=/$DIR $DTMP/$vLABEL ; fi ; ls -ld $DTMP/$vLABEL ; fi ; fi ; done
		fi
		lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
	
		if [ "$G" = "N" ] ; then
			exec >/dev/tty
			bash
			if [ "$DEBUG" != "N" ] ; then
				exec > >(tee -a "$ERRORLOG") 2>&1
			fi
		else
			su-to-root -X -c x-terminal-emulator
		fi
	CUSTOMPARTS="Y"
	fi

fi


### FINAL RAID CONFIGURATION ########################################

if [ "$(command -v mdadm)" != "" ] ; then
	sed -i '/ was auto-generated/d' /etc/mdadm/mdadm.conf
	sed -i ':a;N;$!ba;s|\n  \+| |g' /etc/mdadm/mdadm.conf
	sed -i 's|^ARRAY|#ARRAY|g' /etc/mdadm/mdadm.conf
	mdadm --detail --verbose --scan >> /etc/mdadm/mdadm.conf
	sed -i ':a;N;$!ba;s|\n  \+| |g' /etc/mdadm/mdadm.conf
#echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
#update-initramfs -u -v -k all
fi


### END PARTITIONING ########################################


### INSTALL GRUB ########################################

if [ "$GRUBVERSEL" != "" ] ; then

# Internet test

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGINTERNET=$( echo $! )

ping -c 3 ftp.fau.de || ping -c 3 mirrorservice.org || ping -c 3 ftp.ch.debian.org

if [ "$?" -eq 0 ] ; then
	TESTINTERNET="Y"
else
	echo "No PING (no ICMP). Pass-through test..."
	wget http://ftp.fau.de -O /dev/null || wget http://mirrorservice.org -O /dev/null || wget http://ftp.ch.debian.org -O /dev/null
	if [ "$?" -eq 0 ] ; then
		echo "WGET (TCP connections) works. Internet OK."
		TESTINTERNET="Y"
	else
		echo $"No Internet connection."
		TESTINTERNET="N"
	fi
fi

	kill $PIDDIALOGINTERNET 2>/dev/null


# Install GRUB - P1 ########################################

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGGRUB1=$( echo $! )

REST_GRUB_THEME=$(cat /etc/default/grub | grep -aEi ^GRUB_THEME=)

os-prober

mkdir -pv /boot/grub/

if [ "$EFIGRUBVERSEL" != "" ] ; then
	mkdir -pv /boot/efi/
	mkdir -pv /boot/efi/EFI/
#	mkdir -pv /boot/efi/EFI/picalibre/
#	mkdir -pv /boot/efi/EFI/devuan/
#	mkdir -pv /boot/efi/EFI/debian/
fi

case "$GRUBVERSEL" in

	grub-gfxboot)
	if [ "$GRUBVERIN" != "$GRUBVERSEL" ] ; then
		if [ "$(ls /var/cache/apt/archives/ | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb )" != "" ] && [ "$TESTINTERNET" = "N" ] ; then
			#ls /var/cache/apt/archives/ | grep -aEi ^grub | sed 's|_.*||g' | while read i ; do DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^$i ; done
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^grub2 ^grub-pc efibootmgr
			cd /var/cache/apt/archives/
			dpkg -i $(ls | grep -aEi ^grub-common_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			#for i in $(dpkg -I ${GRUBVERSEL}-bin_*_${SYSARC}.deb     | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			for i in $(dpkg -I ${GRUBVERSEL}_*_${SYSARC}.deb    | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			dpkg -i $(ls | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			cd - 1>/dev/null
		elif [ "$TESTINTERNET" = "Y" ] ; then
			apt-get update -y
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^grub2 ^grub-pc efibootmgr
		
			if [ "$(apt-cache showpkg grub-gfxboot)" != "" ] ; then
				for i in $GRUBVERSEL grub-common os-prober ; do DEBIAN_FRONTEND=noninteractive apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" $i ; done
			else
				DEBIAN_FRONTEND=noninteractive apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" grub-common os-prober
				cd /var/cache/apt/archives/
				
				wget https://deb.picalibre.org/pool/main/gen/g/grub-gfxboot/grub-gfxboot_0.97-48+1_${SYSARC}.deb
				if [ "$?" -ne 0 ] ; then
					check_exit
				fi
				dpkg -i grub-gfxboot_*_${SYSARC}.deb
					if [ ! -e /boot/grub/menu.lst ] ; then
					dpkg -i grub-gfxboot_*_${SYSARC}.deb
					fi
				
				cd - 1>/dev/null
		
			fi
		else
			echo "No Internet, no .deb"
		fi
	fi
	;;

	grub-legacy)
	if [ "$GRUBVERIN" != "$GRUBVERSEL" ] ; then
		if [ "$(ls /var/cache/apt/archives/ | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb )" != "" ] && [ "$TESTINTERNET" = "N" ] ; then
			#ls /var/cache/apt/archives/ | grep -aEi ^grub | sed 's|_.*||g' | while read i ; do DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^$i ; done
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^grub2 ^grub-pc efibootmgr
			cd /var/cache/apt/archives/
			dpkg -i $(ls | grep -aEi ^grub-common_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			#for i in $(dpkg -I ${GRUBVERSEL}-bin_*_${SYSARC}.deb     | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			for i in $(dpkg -I ${GRUBVERSEL}_*_${SYSARC}.deb    | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			dpkg -i $(ls | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			cd - 1>/dev/null
		elif [ "$TESTINTERNET" = "Y" ] ; then
			apt-get update -y
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^grub2 ^grub-pc efibootmgr
			for i in $GRUBVERSEL grub-common os-prober ; do DEBIAN_FRONTEND=noninteractive apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" $i ; done
		else
			echo "No Internet, no .deb"
		fi
	fi
	;;

	grub-efi-amd64|grub-efi-arm|grub-efi-arm64|grub-efi-ia32|grub-efi-ia64|grub-efi-riscv64|grub-efi-loong64)
	if [ "$GRUBVERIN" != "$GRUBVERSEL" ] ; then
		if [ "$(ls /var/cache/apt/archives/ | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb )" != "" ] && [ "$TESTINTERNET" = "N" ] ; then
			#ls /var/cache/apt/archives/ | grep -aEi ^grub | sed 's|_.*||g' | while read i ; do DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^$i ; done
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			cd /var/cache/apt/archives/
			dpkg -i $(ls | grep -aEi ^grub-common_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			dpkg -i $(ls | grep -aEi ^grub2-common_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			for i in $(dpkg -I ${GRUBVERSEL}-bin_*_${SYSARC}.deb     | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			for i in $(dpkg -I ${GRUBVERSEL}_*_${SYSARC}.deb    | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			dpkg -i $(ls | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) $(ls | grep -aEi ^${GRUBVERSEL}-bin_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			if [ "$(ls /var/cache/apt/archives/ | grep -aEi ^${GRUBVERSEL}-signed_.*_${SYSARC}.deb )" != "" ] ; then
			dpkg -i $(ls | grep -aEi ^${GRUBVERSEL}-signed_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			fi
			cd - 1>/dev/null
		elif [ "$TESTINTERNET" = "Y" ] ; then
			apt-get update -y
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			for i in $GRUBVERSEL ${GRUBVERSEL}-signed ${GRUBVERSEL}-bin grub-common grub2-common os-prober ; do DEBIAN_FRONTEND=noninteractive apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" $i ; done
			DEBIAN_FRONTEND=noninteractive apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" efibootmgr
		else
			echo "No Internet, no .deb"
		fi
	fi
	;;

	grub-cloud-amd64|grub-coreboot|grub-ieee1275|grub-pc|grub-uboot|grub-xen|grub-xen-host|grub-yeeloong)
	if [ "$GRUBVERIN" != "$GRUBVERSEL" ] ; then
		if [ "$(ls /var/cache/apt/archives/ | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb )" != "" ] && [ "$TESTINTERNET" = "N" ] ; then
			#ls /var/cache/apt/archives/ | grep -aEi ^grub | sed 's|_.*||g' | while read i ; do DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^$i ; done
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			DEBIAN_FRONTEND=noninteractive apt-get purge -y efibootmgr
			cd /var/cache/apt/archives/
			dpkg -i $(ls | grep -aEi ^grub-common_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			dpkg -i $(ls | grep -aEi ^grub2-common_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			for i in $(dpkg -I ${GRUBVERSEL}-bin_*_${SYSARC}.deb     | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			for i in $(dpkg -I ${GRUBVERSEL}_*_${SYSARC}.deb    | grep -aE 'Depend:|Depends:' | sed 's|,| |g' | sed 's| |\n|g' | grep -aEi ^grub | cut -d ' ' -f 1 | sort -u ) ; do dpkg -i $(ls | grep -aEi ^${i}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) ; done
			dpkg -i $(ls | grep -aEi ^${GRUBVERSEL}_.*_${SYSARC}.deb | sort -Vr | head -n 1 ) $(ls | grep -aEi ^${GRUBVERSEL}-bin_.*_${SYSARC}.deb | sort -Vr | head -n 1 )
			cd - 1>/dev/null
		elif [ "$TESTINTERNET" = "Y" ] ; then
			apt-get update -y
			DEBIAN_FRONTEND=noninteractive apt-get purge -y --allow-remove-essential ^${GRUBVERIN}
			DEBIAN_FRONTEND=noninteractive apt-get purge -y efibootmgr
			for i in $GRUBVERSEL ${GRUBVERSEL}-bin grub-common grub2-common os-prober ; do DEBIAN_FRONTEND=noninteractive apt-get install --reinstall --no-install-recommends -y -o Dpkg::Options::="--force-confmiss" -o Dpkg::Options::="--force-confnew" $i ; done
		else
			echo "No Internet, no .deb"
		fi
	fi
	;;

	*)
	echo $"No GRUB installed."
	;;

esac

# Ensure the installation was satisfactory.
dpkg --configure -a

	kill $PIDDIALOGGRUB1 2>/dev/null

# End: if [ "$GRUBVERSEL" != "" ]
fi


### EXCLUDELIST ########################################

if [ "$CUSTOMEXCLUDE" != "" ] ; then
	echo CUSTOMEXCLUDE="$CUSTOMEXCLUDE"
	cat "$CUSTOMEXCLUDE"
	EXCLUDELIST="$CUSTOMEXCLUDE"
elif [ -e /tmp/exclude.list ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Do you want to use the existing /tmp/exclude.list ?\n\nIf in doubt, select 'No/Cancel'.\n" $H $W
	if [ "$?" -eq 0 ] ; then
		CUSTOMEXCLUDE="/tmp/exclude.list"
		echo CUSTOMEXCLUDE="$CUSTOMEXCLUDE"
		cat "$CUSTOMEXCLUDE"
		EXCLUDELIST="$CUSTOMEXCLUDE"
	else
		rm -rf /tmp/exclude.list
		cp -v --remove-destination $LIBDEP/exclude.list /tmp/exclude.list
		EXCLUDELIST="/tmp/exclude.list"
	fi
else
	cp -v --remove-destination $LIBDEP/exclude.list /tmp/exclude.list
	EXCLUDELIST="/tmp/exclude.list"
fi

if [ ! -f "$EXCLUDELIST" ] ; then
	check_exit
fi

if [ "$CUSTOMEXCLUDE" = "" ] ; then
	if [ "$SNAPMETHOD" = "clone" ] ; then
		sed -i "/.*persistent-net.*/d" "$EXCLUDELIST"
		sed -i "/.*picanet.*/d" "$EXCLUDELIST"
		sed -i "/.*wicd.*/d"    "$EXCLUDELIST"
		sed -i "/.*connman.*/d" "$EXCLUDELIST"
		sed -i "/.*Network.*/d" "$EXCLUDELIST"
		sed -i "/.*network.*/d" "$EXCLUDELIST"
		sed -i "/home\/\*\/*/d" "$EXCLUDELIST"
		sed -i "/root\/*\//d" "$EXCLUDELIST"
		echo "home/*/.ICEauthority" >> "$EXCLUDELIST"
		echo "home/*/.Xauthority" >> "$EXCLUDELIST"
		echo "root/.ICEauthority" >> "$EXCLUDELIST"
		echo "root/.Xauthority" >> "$EXCLUDELIST"
		echo "home/*/.gnupg" >> "$EXCLUDELIST"
		echo "home/*/.ccr" >> "$EXCLUDELIST"
		echo "home/*/.ssh" >> "$EXCLUDELIST"
		echo "root/.gnupg" >> "$EXCLUDELIST"
		echo "root/.ccr" >> "$EXCLUDELIST"
		echo "root/.ssh" >> "$EXCLUDELIST"
	else
		echo "home/*/*" >> "$EXCLUDELIST"
		echo "home/*/.[!.]*" >> "$EXCLUDELIST"
		echo "home/*/..?*" >> "$EXCLUDELIST"
		echo "root/*" >> "$EXCLUDELIST"
		echo "root/.[!.]*" >> "$EXCLUDELIST"
		echo "root/..?*" >> "$EXCLUDELIST"
	fi
fi

if [ "$CUSTOMEXCLUDE" = "" ] ; then
	for i in $(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | awk '{print $2}') ; do AUSER=$(users | sed 's| |\n|g' | grep -aE "^$i$" | head -n 1) ; if [ "$AUSER" != "" ] ; then if [ "$(id -nu $i)" != "" ] ; then chown $(id -nu $i):$(id -ng $i) /tmp/exclude.list ; else chown 1000:1000 /tmp/exclude.list ; fi ; break ; fi ; done
fi

if [ "$AUTOPROP" = "" ] ; then

	sel_exclude () {
		
		$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"The system copy will start now." $H $W
		
		if [ "$?" -ne 0 ] ; then
			
			PRE_CUSTOMEXCLUDE=$($DIALOG $WICON $WTITLE $"Select the custom list of exclusions to be used" $FSEL /home/ $H $W)
			if [ -f "$PRE_CUSTOMEXCLUDE" ] ; then
				CUSTOMEXCLUDE="$PRE_CUSTOMEXCLUDE"
				echo CUSTOMEXCLUDE="$CUSTOMEXCLUDE"
				cat "$CUSTOMEXCLUDE"
				EXCLUDELIST="$CUSTOMEXCLUDE"
			else
				REFUN=sel_exclude
				input_error ; return
			fi
			
		fi
		
	}
	sel_exclude

fi


### COPYSKEL ########################################

if [ "$SNAPMETHOD" != "clone" ] ; then
	COPYSKEL="Y"
fi


### INSTALL (COPY) ########################################

TOTAL=$(echo "scale=0 ; $(df | grep -aEi ^overlay | awk '{print $3,$1}' | sort -n -r | head -n 1 | awk '{print $1}') + ( $(df | grep -a /dev/loop | awk '{print $2,$1}' | sort -n -r | head -n 1 | awk '{print $1}') * 320 / 100 )" | bc -l )

if [ "$(dpkg -l | awk '{print $1,$2,$3}' | grep -aEi ' rsync | rsync:' | awk '{print $3}' | tr '.|-' '\t' | awk '{print $1}')" -gt 3 ] || [ "$(dpkg -l | awk '{print $1,$2,$3}' | grep -aEi ' rsync | rsync:' | awk '{print $3}' | tr '.|-' '\t' | awk '{print $1$2}')" -ge 31 ] ; then
	PROGRESS="--info=progress2"
else
	PROGRESS="--progress"
fi

# a lot of output... temporal turn off logging
#if [ "$DEBUG" = "Y" ] ; then
#echo "rsync will copy system files..."
#set +xv
#fi

# script rsync
RSYNC_SCRIPT="$CNAME"_rsync_"$(date +%Y%m%d_%H%M%S)"

cat > /tmp/${RSYNC_SCRIPT} <<EOF
#!/bin/bash

CNAME=$CNAME
VERSION=$VERSION
TITLE=$TITLE

# Translations
if [ "\$LANG" = "" ] ; then export $(cat /etc/default/locale | grep -a 'LANG=') ; fi
TEXTDOMAIN=$TEXTDOMAIN
TEXTDOMAINDIR=$TEXTDOMAINDIR

ERRORLOG="$ERRORLOG"
if [ "$DEBUG" = "Y" ] ; then
	set -xv
fi
if [ "$DEBUG" != "N" ] ; then
exec > >(tee -a "\$ERRORLOG") 2>&1
echo "\$0" "\$*" >> "\$ERRORLOG"
fi

################################

echo $"Please wait..."

# clean:
#rm -f /tmp/rsync_ii_ERROR

echo $"Copy in progress..."
echo $"The copy will end when it reaches (approximately):"
printf '~'
expr $TOTAL \* 1024 | rev | sed 's|...|&.|g;s|\.$||' | rev

# RSYNC
cd /
#set +xv
rsync -aHAXES $PROGRESS --log-file="$ERRORLOG" --exclude-from="$EXCLUDELIST" . "$DTMP"/

#if [ "\$?" -ne 0 ] ; then
#	printf "\n\n\n"
#	echo $"The copy seems to have failed! "
#	touch /tmp/rsync_ii_ERROR
#	sleep 5
#	exit 1
#fi

#exec > >(tee -a "$ERRORLOG") 2>&1 ; set -xv
sync
cd - 1>/dev/null

#echo " "
#echo $"Close this window or press the 'Enter/Return' key (usually the largest key on the keyboard after the 'space' key) to close."
#echo " "
#read KEY

EOF
chmod +x /tmp/${RSYNC_SCRIPT}

echo $(date +%Y-%m-%d_%H:%M:%S) $"Copy starts"

TT=$"Copying the system to the disk... Please wait..." ; COM="bash /tmp/${RSYNC_SCRIPT}" ; TERMINAL

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGDELEXCLUDE=$( echo $! )

# review "rsync --exclude-from=" work
rm -rfv $(cat "$EXCLUDELIST" | grep -aE "[a-zA-Z0-9]" | grep -aEiv "^/dev/|^/proc/|^/sys/|^/run/|^/var/run/|^/lib/live/|^/usr/lib/live/|^/var/lib/live/|^/tmp/|^/boot/grub/" | while read i ; do echo $DTMP/"$i" ; done)

find /var/spool/ | grep -aEiv /var/spool/cron/atjobs/.SEQ | while read i ; do if [ "$(dpkg -S "$i" 2>/dev/null)" = "" ] && [ ! -L "$i" ] ; then rm -v $DTMP/"$i" ; fi ; done

	kill $PIDDIALOGDELEXCLUDE 2>/dev/null

#if [ -e "/tmp/rsync_ii_ERROR" ] ; then
#	cat /tmp/${RSYNC_SCRIPT}
#	rm -rf /tmp/rsync_ii_ERROR
#	$DIALOG $WICON $WTITLE "$TITLE" $WYN   $WTEXT $"The copy seems to have failed! \n\nDo you want to continue? \n" $H $W
#	if [ "$?" -ne 0 ] ; then
#		check_exit
#	fi
#fi

echo "# ls /"
ls -FAl --full-time /
echo "# ls dest"
ls -FAl --full-time "$DTMP"/
TEST=$(ls -A "$DTMP"/) ; if [ "$TEST" = "" ] ; then check_exit ; fi

echo $(date +%Y-%m-%d_%H:%M:%S) $"Copy finished"
rm -f /tmp/${RSYNC_SCRIPT}

# after a lot of output... turn on logging
#if [ "$DEBUG" = "Y" ] ; then
#exec > >(tee -a "$ERRORLOG") 2>&1 ; set -xv
#fi


### COMPLEMENTARY TO EXCLUDE LIST ########################################

find $DTMP/var/log/ -type f | grep -aEi "\.gz$|\.old$|[0-9]$" | while read i ; do rm -f "$i" ; done

find $DTMP/var/log/ -type f | while read i ; do printf "" > "$i" ; done

rm -rf $DTMP/var/crash/*

if [ -e "$DTMP/etc/picanet-pw" ] ; then printf "" > "$DTMP/etc/picanet-pw" ; fi

#printf "" > "$DTMP/etc/resolv.conf"

sed -i -e "/^[a-zA-Z0-9/].*/d" -e "/.*\/dev\/.*/d" -e "/.*UUID=[a-zA-Z0-9].*/d" $DTMP/etc/fstab

#if [ ! -d "$DTMP/etc/fstab.d" ] ; then
#mkdir -v $DTMP/etc/fstab.d
#fi

if [ -e "$DTMP/etc/machine-id" ] ; then printf "" > $DTMP/etc/machine-id ; fi

if [ -e "$DTMP/var/lib/dbus/machine-id" ] ; then printf "" > $DTMP/var/lib/dbus/machine-id ; fi

if [ -e "$DTMP/etc/popularity-contest.conf" ] ; then rm -rf $DTMP/etc/popularity-contest.conf ; fi

if [ "$SNAPMETHOD" = "clone" ] || [ "$(cat "$EXCLUDELIST" | grep -aEi 'picanet|wicd|connman|NetworkManager|network')" = "" ] ; then
	true
else

if [ "$(dpkg -l | grep -aEi "^ii|^hi" | awk '{print $2}' | sed "s|:.*||g" | grep -aEi network-manager )" = "" ] ; then
cat > $DTMP/etc/network/interfaces <<EOF
# This file describes the network interfaces available on your system
# and how to activate them. For more information, read interfaces(5).

auto lo
iface lo inet loopback

auto /e*=e
iface e inet dhcp

EOF
fi

fi

# The content of /dev are recreated on every boot by 'udev' (previously 'makedev'), so it is not really necessary to clean /dev

# clean /dev/[dirs]
find $DTMP/dev/ -type d | sort | grep -aEi "[0-9]$" | while read i ; do rm -r $i ; done
# clean /dev/[files]
find $DTMP/dev/ ! -type d | sort | grep -aEi "/[0-9]|/hd|/sd|/vd|/ehd|/esd|/evd|/md|/dm|/crypt|/lvm|/mapper|/drbd|/disk|/mmcblk|/nvme|/block|/bsg|/bus|/char|/dri|/snapshot|/by-id/|/by-label/|/by-path/|/by-uuid/|[0-9]$|[0-9][a-z]$" | grep -aEiv "/loop|/tty|/vcs|/fb" | while read i ; do rm "$i" ; done

# make some basic files in /dev to ensure the system can boot properly before 'udev' starts
#mknod -m 622 $DTMP/dev/console c 5 1
#mknod -m 666 $DTMP/dev/null c 1 3
#mknod -m 666 $DTMP/dev/zero c 1 5
#mknod -m 666 $DTMP/dev/ptmx c 5 2
#mknod -m 666 $DTMP/dev/tty c 5 0
#mknod -m 444 $DTMP/dev/random c 1 8
#mknod -m 444 $DTMP/dev/urandom c 1 9
#chown -v root:tty $DTMP/dev/{console,ptmx,tty}
#
#ln -sv /proc/self/fd $DTMP/dev/fd
#ln -sv /proc/self/fd/0 $DTMP/dev/stdin
#ln -sv /proc/self/fd/1 $DTMP/dev/stdout
#ln -sv /proc/self/fd/2 $DTMP/dev/stderr
#ln -sv /proc/kcore $DTMP/dev/core
#ln -sv /run/shm $DTMP/dev/shm
#mkdir -v $DTMP/dev/pts


### FSTAB ########################################

# Since kernel Linux 2.6.30, "relatime" is the default mount option.

# If you know what you are doing, you can minimize writing to the internal disk editing /etc/default/tmpfs in order to change #RAMTMP=no to RAMTMP=yes and optionally set TMPFS_SIZE (see 'man tmpfs'). Note that hosting /tmp files in tmpfs competes against the use of RAM as execution memory of processes, and it can cause problems (view Debian bugs 630615 665635 666698 674517).


#cat << EOF > $DTMP/etc/fstab
cat > $DTMP/etc/fstab <<EOF
# /etc/fstab: static filesystem information.
#
# <file system>                            <mount point>     <type>       <options>              <dump>  <pass>
EOF


# rom

lsblk -r -n -o KNAME,RM,TYPE | grep -a ' rom' | awk '{print $1}' | while read i ; do
	NUMROM=$(echo "$i" | sed "s|.*[a-zA-Z/:-]||g")
	echo "/dev/${i}                                   /media/cdrom${NUMROM}     udf,iso9660  user,noauto,exec            0  0" >> $DTMP/etc/fstab
done


# system partition

if [ "$IPART" != "" ] ; then

	IPARTUUID=$(lsblk -r -n -o UUID $IPART | head -n 1 )
	if [ "$IPARTUUID" = "" ] ; then IPARTUUID=$(blkid -o value -s UUID $IPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	if [ "$IPARTUUID" = "" ] ; then IPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $IPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi

	#FSIPARTFINAL=$(blkid -o value -s TYPE $IPART )
	FSIPARTFINAL=$(lsblk -r -n -o FSTYPE $IPART | head -n 1 )

	if [ "$IPARTUUID" = "" ] || [ "$FSIPARTFINAL" = "" ] ; then
		check_exit
	fi

	if [ "$(command -v fsck.$FSIPARTFINAL)" != "" ] ; then
	echo "UUID=$IPARTUUID  /                 $FSIPARTFINAL         relatime,errors=remount-ro  0  1" >> $DTMP/etc/fstab
	else
	echo "UUID=$IPARTUUID  /                 $FSIPARTFINAL         relatime,errors=remount-ro  0  0" >> $DTMP/etc/fstab
	fi

else
	check_exit
fi


# /home partition

if [ "$SEPARATE_HOME" != "N" ] ; then

if [ "$HOMEPART" != "" ] ; then

	HOMEPARTUUID=$(lsblk -r -n -o UUID $HOMEPART | head -n 1 )
	if [ "$HOMEPARTUUID" = "" ] ; then HOMEPARTUUID=$(blkid -o value -s UUID $HOMEPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	if [ "$HOMEPARTUUID" = "" ] ; then HOMEPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $HOMEPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi

	FSHOMEFINAL=$(lsblk -r -n -o FSTYPE $HOMEPART | head -n 1 )

	if [ "$HOMEPARTUUID" = "" ] || [ "$FSHOMEFINAL" = "" ] ; then
		check_exit
	fi

	if [ "$(command -v fsck.$FSHOMEFINAL)" != "" ] ; then
	echo "UUID=$HOMEPARTUUID  /home             $FSHOMEFINAL         relatime,errors=remount-ro  0  2" >> $DTMP/etc/fstab
	else
	echo "UUID=$HOMEPARTUUID  /home             $FSHOMEFINAL         relatime,errors=remount-ro  0  0" >> $DTMP/etc/fstab
	fi

else
	check_exit
fi

fi


# data partition

if [ "$SEPARATE_DATA" = "Y" ] ; then

if [ "$DATAPART" != "" ] ; then

	DATAPARTUUID=$(lsblk -r -n -o UUID $DATAPART | head -n 1 )
	if [ "$DATAPARTUUID" = "" ] ; then DATAPARTUUID=$(blkid -o value -s UUID $DATAPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	if [ "$DATAPARTUUID" = "" ] ; then DATAPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $DATAPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi

	FSDATAFINAL=$(lsblk -r -n -o FSTYPE $DATAPART | head -n 1 )

	if [ "$DATAPARTUUID" = "" ] || [ "$FSDATAFINAL" = "" ] ; then
		check_exit
	fi

	if [ "$(command -v fsck.$FSDATAFINAL)" != "" ] ; then
	echo "UUID=$DATAPARTUUID  /home/$NEWUSERNAME/$LABELDATA  $FSDATAFINAL         relatime,errors=remount-ro  0  2" >> $DTMP/etc/fstab
	else
	echo "UUID=$DATAPARTUUID  /home/$NEWUSERNAME/$LABELDATA  $FSDATAFINAL         relatime,errors=remount-ro  0  0" >> $DTMP/etc/fstab
	fi

else
	check_exit
fi

fi


### swap partition

if [ "$SWAPPART" = "$NOSWAP" ] ; then
	
	true
	
elif [ "$SWAPPART" = "$USESWAPFILE" ] ; then
	
	echo "/swapfile                                  none              swap         sw                          0  0" >> $DTMP/etc/fstab
	
elif [ "$SWAPPART" != "" ] ; then
	
	SWAPPARTUUID=$(lsblk -r -n -o UUID $SWAPPART | head -n 1 )
	if [ "$SWAPPARTUUID" = "" ] ; then SWAPPARTUUID=$(blkid -o value -s UUID $SWAPPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	if [ "$SWAPPARTUUID" = "" ] ; then SWAPPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $SWAPPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi

	if [ "$SWAPPARTUUID" = "" ] ; then
		check_exit
	fi

	echo "UUID=$SWAPPARTUUID  none              swap         sw                          0  0" >> $DTMP/etc/fstab

else
	
	true
	
fi


### EFI partition

if [ "$EFIGRUBVERSEL" != "" ] ; then

if [ "$EFIPART" != "" ] ; then

	EFIPARTUUID=$(lsblk -r -n -o UUID $EFIPART | head -n 1 )
	if [ "$EFIPARTUUID" = "" ] ; then EFIPARTUUID=$(blkid -o value -s UUID $EFIPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	if [ "$EFIPARTUUID" = "" ] ; then EFIPARTUUID=$(find -L /dev/disk/by-uuid/ -samefile $EFIPART | head -n 1 | sed 's|/dev/disk/by-uuid/||g') ; fi
	
	EFIPARTFSFINAL=$(lsblk -r -n -o FSTYPE $EFIPART | head -n 1 )
	
	if [ "$(echo $EFIPARTFSFINAL | grep -aEi fat )" = "" ] ; then
		check_exit
	fi

	if [ "$EFIPARTUUID" = "" ] ; then
		check_exit
	fi

	echo "UUID=$EFIPARTUUID                             /boot/efi         vfat         umask=0077                  0  0" >> $DTMP/etc/fstab

else
	#check_exit
	true
fi

fi


echo " " >> $DTMP/etc/fstab


### Review /etc/crypttab UUID after formatting

cat $DTMP/etc/crypttab | awk '{print $1}' | grep -aEi "^[a-zA-Z0-9/]" | sort -u | while read i ; do
	echo $i
	lsblk -r -n -o NAME,KNAME,UUID | grep -aEi "^$i " -B1 | head -n 1 | awk '{print $3}' | grep -aEi "[a-zA-Z0-9]" | while read j ; do
		cat $DTMP/etc/crypttab
		sed -i "/^$i / s| UUID=[a-zA-Z0-9/-]\+ | UUID=$j |g" $DTMP/etc/crypttab
		awk -i inplace '!a[$0]++' $DTMP/etc/crypttab
		cat $DTMP/etc/crypttab
	done
done


### Additional partitions from custom $AUTOPROP

if [ ! -e /tmp/etc_fstab ] && [ "$G" = "N" ] ; then
	lsblk -r -n -o KNAME,SIZE,UUID,MOUNTPOINT,FSTYPE | grep -a "$DTMP" | while read i ; do vKNAME=$(echo "$i" | awk '{print $1}') ; vSIZE=$(echo "$i" | awk '{print $2}') ; vUUID=$(echo "$i" | awk '{print $3}') ; vMP=$(echo "$i" | awk '{print $4}' | sed "s|^$DTMP||g") ; if [ "$(echo "$i" | awk '{print $4}')" != "" ] && [ "$vMP" = "" ] ; then vMP="/" ; fi ; vFS=$(echo "$i" | awk '{print $5}') ; DEV="/dev/$vKNAME" ; if [ "$vMP" = "/var" ] || [ "$vMP" = "/var/www" ] || [ "$vMP" = "/var/lib" ] ; then vMO="relatime,errors=remount-ro,nodev,nosuid" ; elif [ "$vMP" = "/tmp" ] || [ "$vMP" = "/var/tmp" ] || [ "$vMP" = "/var/log" ] ; then vMO="relatime,errors=remount-ro,nodev,nosuid,noexec" ; elif [ "$vMP" = "/home" ] || [ "$vMP" = "/var/mail" ] || [ "$vMP" = "/var/correo" ] ; then vMO="relatime,errors=remount-ro,nodev,nosuid,noexec,usrquota,grpquota" ; else vMO="relatime,errors=remount-ro" ; fi ; if [ "$(command -v fsck.$vFS)" != "" ] ; then if [ "$vMP" = "/" ] ; then vORD=1 ; else vORD=2 ; fi ; else vORD=0 ; fi ; printf '%s \n%-43s %-17s %-12s %-65s %-2s %s\n' "# $vKNAME $vSIZE" "#UUID=$vUUID" "$vMP" "$vFS" "$vMO" 0 "$vORD" ; done | tee /tmp/etc_fstab
#	lsblk -r -n -o KNAME,SIZE,UUID,LABEL,FSTYPE | grep -aEi "[a-zA-Z0-9]" | while read i ; do pDIR="$(echo "$i" | awk '{print $4}' | grep -aEio $(ls -p / | grep -a / | sed 's|/||g' | awk '{printf "^"$1"|"}' | sed "s:|$::g"))" ; if [ "$pDIR" != "" ] ; then vKNAME=$(echo "$i" | awk '{print $1}') ; vSIZE=$(echo "$i" | awk '{print $2}') ; vUUID=$(echo "$i" | awk '{print $3}') ; vLABEL=$(echo "$i" | awk '{print $4}' | sed "s|^$pDIR|/$pDIR/|g" | sed "s|/$||g") ; vFS=$(echo "$i" | awk '{print $5}') ; if [ "$vLABEL" = "/var" ] || [ "$vLABEL" = "/var/www" ] || [ "$vLABEL" = "/var/lib" ] ; then vMP="relatime,errors=remount-ro,nodev,nosuid" ; elif [ "$vLABEL" = "/tmp" ] || [ "$vLABEL" = "/var/tmp" ] || [ "$vLABEL" = "/var/log" ] ; then vMP="relatime,errors=remount-ro,nodev,nosuid,noexec" ; elif [ "$vLABEL" = "/home" ] || [ "$vLABEL" = "/var/mail" ] || [ "$vLABEL" = "/var/correo" ] ; then vMP="relatime,errors=remount-ro,nodev,nosuid,noexec,usrquota,grpquota" ; else vMP="relatime,errors=remount-ro" ; fi ; if [ "$(command -v fsck.$vFS)" != "" ] ; then vORD=2 ; else vORD=0 ; fi ; printf '%s \n%-43s %-17s %-12s %-65s %-2s %s\n' "# $vKNAME $vSIZE" "#UUID=$vUUID" "$vLABEL" "$vFS" "$vMP" 0 "$vORD" ; fi ; done | tee /tmp/etc_fstab
fi

if [ -e /tmp/etc_fstab ] ; then
	cat /tmp/etc_fstab >> $DTMP/etc/fstab
	echo " " >> $DTMP/etc/fstab
fi


### Optionally custom fstab

if [ "$CUSTOMPARTS" = "Y" ] ; then

	$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"'fstab' will be opened for manual editing." $H $W

	if [ "$G" = "N" ] ; then
		if   [ "$(command -v nano)" != "" ] ; then
			EDITOR="nano"
		elif [ "$(command -v mcedit)" != "" ] ; then
			EDITOR="mcedit"
		else
			EDITOR="editor"
		fi
	else
		if   [ "$(command -v mousepad)" != "" ] ; then
			EDITOR="mousepad"
		elif [ "$(command -v kwrite)" != "" ] ; then
			EDITOR="kwrite"
		elif [ "$(command -v l3afpad)" != "" ] ; then
			EDITOR="l3afpad"
		elif [ "$(command -v leafpad)" != "" ] ; then
			EDITOR="leafpad"
		elif [ "$(command -v featherpad)" != "" ] ; then
			EDITOR="featherpad"
		elif [ "$(command -v juffed)" != "" ] ; then
			EDITOR="juffed"
		elif [ "$(command -v pluma)" != "" ] ; then
			EDITOR="pluma"
		elif [ "$(command -v gedit)" != "" ] ; then
			EDITOR="gedit"
		elif [ "$(command -v geany)" != "" ] ; then
			EDITOR="geany"
		elif [ "$(command -v kate)" != "" ] ; then
			EDITOR="kate"
		else
			EDITOR="xdg-open"
		fi
	fi

	if [ "$G" = "N" ] ; then
		exec >/dev/tty
	fi
 	
 	$EDITOR $DTMP/etc/fstab
	
	if [ "$G" = "N" ] ; then
		if [ "$DEBUG" != "N" ] ; then
			exec > >(tee -a "$ERRORLOG") 2>&1
		fi
	fi
fi


### SOME POST-COPY SETTINGS ########################################

# Revert the Fix "DM ERROR does not exist default.desktop"
if [ -e "$DTMP/usr/share/xsessions/default.desktop" ] ; then
	rm -rf $DTMP/usr/share/xsessions/default.desktop
fi

# restore original inittab
if [ -e "$DTMP/etc/inittab" ] && [ -e "$DTMP/usr/share/sysvinit/inittab" ] ; then
	cp -a --remove-destination $DTMP/usr/share/sysvinit/inittab $DTMP/etc/inittab
fi

# pmount may be globally allowed in live system
if [ "$(cat $DTMP/etc/pmount.allow | grep -a /dev/ )" != "" ] ; then
	sed -i "s|^/dev/|#/dev/|g" $DTMP/etc/pmount.allow
fi

# do hostname and hosts
echo "$NEWHOSTNAME" > $DTMP/etc/hostname

cat > $DTMP/etc/hosts <<EOF
127.0.0.1 localhost
127.0.1.1 $NEWHOSTNAME

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
EOF

# wicd
if [ -e "$DTMP/etc/wicd/wired-settings.conf" ] ; then
	sed -i "s|dhcphostname = .*|dhcphostname = $NEWHOSTNAME |g" $DTMP/etc/wicd/wired-settings.conf
fi


### OLD USER ########################################

OLDUSERNAME=$(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | head -n 1 | awk '{print $2}')

if [ "$OLDUSERNAME" != "" ] ; then

	echo "OLDUSERNAME=$OLDUSERNAME"
	OLDUSERGROUP=$OLDUSERNAME
	echo "OLDUSERGROUP=$OLDUSERNAME"

	if [ "$SNAPMETHOD" = "clone" ] ; then
		NEWUSERNAME=$OLDUSERNAME
		NEWUSERGROUP=$OLDUSERGROUP
		OLDUSERNAME=""
	fi

fi


### Autologin DisplayManager for DesktopEnvironment ########################################

if [ "$AUTOLOGIN" = "Y" ] ; then

# inittab
	if [ -e $DTMP/etc/inittab ] ; then
	#cp -a --remove-destination $DTMP/etc/inittab $DTMP/etc/inittabCOP
		CHECKINITTAB=$(cat $DTMP/etc/inittab | grep -aEv "^#" | grep -a ' --autologin')
		if [ "$CHECKINITTAB" = "" ] ; then
			NL=$(cat $DTMP/etc/inittab | grep -aE "^1:" | grep -a "getty " | sed "s|getty |getty --autologin $NEWUSERNAME |g")
			sed -i "s|^1:.*getty.*|#& #autologin|g" $DTMP/etc/inittab
			echo "" >> $DTMP/etc/inittab
			echo "# autologin:" >> $DTMP/etc/inittab
			echo "$NL" >> $DTMP/etc/inittab
		else
			if [ "$OLDUSERNAME" != "" ] ; then
#				sed -i "/ --autologin $OLDUSERNAME / s|^#||g" $DTMP/etc/inittab
				sed -i "s| --autologin $OLDUSERNAME | --autologin $NEWUSERNAME |g" $DTMP/etc/inittab
			fi
		fi
	fi

# lightdm
	if [ -f $DTMP/etc/lightdm/lightdm.conf ] ; then
	#cp -a --remove-destination $DTMP/etc/lightdm/lightdm.conf $DTMP/etc/lightdm/lightdm.confCOP
	sed -i 's|#autologin-user=|autologin-user=|g' $DTMP/etc/lightdm/lightdm.conf
	sed -i "s|^autologin-user=.*|autologin-user=$NEWUSERNAME|g" $DTMP/etc/lightdm/lightdm.conf
	sed -i 's|#autologin-user-timeout|autologin-user-timeout|g' $DTMP/etc/lightdm/lightdm.conf
	sed -i 's|^autologin-user-timeout=.*|autologin-user-timeout=0|g' $DTMP/etc/lightdm/lightdm.conf
	fi
	#find $DTMP/usr/lib/lightdm/lightdm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/lightdm/lightdm.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# lxdm
	if [ -f $DTMP/etc/lxdm/lxdm.conf ] ; then
	#cp -a --remove-destination $DTMP/etc/lxdm/lxdm.conf $DTMP/etc/lxdm/lxdm.confCOP
	sed -i 's|#autologin=|autologin=|g' $DTMP/etc/lxdm/lxdm.conf
	sed -i 's|# autologin=|autologin=|g' $DTMP/etc/lxdm/lxdm.conf
	sed -i "s|^autologin=.*|autologin=$NEWUSERNAME|g" $DTMP/etc/lxdm/lxdm.conf
	#sed -i 's|#timeout|timeout|g' $DTMP/etc/lxdm/lxdm.conf
	#sed -i 's|# timeout|timeout|g' $DTMP/etc/lxdm/lxdm.conf
	#sed -i 's|^timeout=.*|timeout=0|g' $DTMP/etc/lxdm/lxdm.conf
	fi
	#find $DTMP/usr/lib/lxdm/lxdm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/lxdm/lxdm.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# entrance (Enlightenment)
	if [ -f $DTMP/etc/entrance_config.cfg ] ; then
	#cp -a --remove-destination $DTMP/etc/entrance_config.cfg $DTMP/etc/entrance_config.cfgCOP
	sed -i -e '/autologin\/mode/ s|[0-9]|2|g' -e '/autologin\/user/ s|".*"|"$NEWUSERNAME"|g' $DTMP/etc/entrance_config.cfg
	fi
	#find $DTMP/usr/lib/entrance_config.cfg.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/entrance_config.cfg.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# KDE 3 / TDE (Trinity)
	if [ -f $DTMP/etc/kde3/kdm/kdmrc ] ; then
	sed -i 's|#UserList=|UserList=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|^UserList=.*|UserList=false|g' $DTMP/etc/kde3/kdm/kdmrc
	#sed -i 's|#GUIStyle=|GUIStyle=|g' $DTMP/etc/kde3/kdm/kdmrc
	#sed -i 's|^GUIStyle=.*|GUIStyle=Keramik|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|#GreetString=|GreetString=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|^GreetString=.*|GreetString=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|#LogoArea=|LogoArea=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|^LogoArea=.*|LogoArea=Logo|g' $DTMP/etc/kde3/kdm/kdmrc
	#cp -a --remove-destination $DTMP/etc/kde3/kdm/kdmrc $DTMP/etc/kde3/kdm/kdmrcCOP
	sed -i 's|#AutoReLogin=|AutoReLogin=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|^AutoReLogin=.*|AutoReLogin=true|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|#AutoLoginAgain=|AutoLoginAgain=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|^AutoLoginAgain=.*|AutoLoginAgain=true|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|#AutoLoginDelay=|AutoLoginDelay=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|^AutoLoginDelay=.*|AutoLoginDelay=0|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|#AutoLoginEnable=|AutoLoginEnable=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|^AutoLoginEnable=.*|AutoLoginEnable=true|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i 's|#AutoLoginUser=|AutoLoginUser=|g' $DTMP/etc/kde3/kdm/kdmrc
	sed -i "s|^AutoLoginUser=.*|AutoLoginUser=$NEWUSERNAME|g" $DTMP/etc/kde3/kdm/kdmrc
 	fi
	#  	if [ -d $DTMP/etc/default/kdm.d ] ; then
	#  	touch $DTMP/etc/default/kdm.d/live-autologin
	#  	fi

# TDE <R14
	if [ -f $DTMP/etc/trinity/kdm/kdmrc ] ; then
	sed -i 's|#UserList=|UserList=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|^UserList=.*|UserList=false|g' $DTMP/etc/trinity/kdm/kdmrc
	#sed -i 's|#GUIStyle=|GUIStyle=|g' $DTMP/etc/trinity/kdm/kdmrc
	#sed -i 's|^GUIStyle=.*|GUIStyle=Keramik|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|#GreetString=|GreetString=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|^GreetString=.*|GreetString=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|#LogoArea=|LogoArea=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|^LogoArea=.*|LogoArea=Logo|g' $DTMP/etc/trinity/kdm/kdmrc
	#cp -a --remove-destination $DTMP/etc/trinity/kdm/kdmrc $DTMP/etc/trinity/kdm/kdmrcCOP
	sed -i 's|#AutoReLogin=|AutoReLogin=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|^AutoReLogin=.*|AutoReLogin=true|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|#AutoLoginAgain=|AutoLoginAgain=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|^AutoLoginAgain=.*|AutoLoginAgain=true|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|#AutoLoginDelay=|AutoLoginDelay=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|^AutoLoginDelay=.*|AutoLoginDelay=0|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|#AutoLoginEnable=|AutoLoginEnable=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|^AutoLoginEnable=.*|AutoLoginEnable=true|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i 's|#AutoLoginUser=|AutoLoginUser=|g' $DTMP/etc/trinity/kdm/kdmrc
	sed -i "s|^AutoLoginUser=.*|AutoLoginUser=$NEWUSERNAME|g" $DTMP/etc/trinity/kdm/kdmrc
 	fi
	#  	if [ -d $DTMP/etc/default/kdm-trinity.d ] ; then
	#  	touch $DTMP/etc/default/kdm-trinity.d/live-autologin
	#  	fi

# TDE >=R14
	if [ -f $DTMP/etc/trinity/tdm/tdmrc ] ; then
	sed -i 's|#UserList=|UserList=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|^UserList=.*|UserList=false|g' $DTMP/etc/trinity/tdm/tdmrc
	#sed -i 's|#GUIStyle=|GUIStyle=|g' $DTMP/etc/trinity/tdm/tdmrc
	#sed -i 's|^GUIStyle=.*|GUIStyle=Keramik|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|#GreetString=|GreetString=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|^GreetString=.*|GreetString=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|#LogoArea=|LogoArea=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|^LogoArea=.*|LogoArea=Logo|g' $DTMP/etc/trinity/tdm/tdmrc
	#cp -a --remove-destination $DTMP/etc/trinity/tdm/tdmrc $DTMP/etc/trinity/tdm/tdmrcCOP
	sed -i 's|#AutoReLogin=|AutoReLogin=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|^AutoReLogin=.*|AutoReLogin=true|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|#AutoLoginAgain=|AutoLoginAgain=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|^AutoLoginAgain=.*|AutoLoginAgain=true|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|#AutoLoginDelay=|AutoLoginDelay=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|^AutoLoginDelay=.*|AutoLoginDelay=0|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|#AutoLoginEnable=|AutoLoginEnable=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|^AutoLoginEnable=.*|AutoLoginEnable=true|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i 's|#AutoLoginUser=|AutoLoginUser=|g' $DTMP/etc/trinity/tdm/tdmrc
	sed -i "s|^AutoLoginUser=.*|AutoLoginUser=$NEWUSERNAME|g" $DTMP/etc/trinity/tdm/tdmrc
 	fi
	#  	if [ -d $DTMP/etc/default/tdm-trinity.d ] ; then
	#  	touch $DTMP/etc/default/tdm-trinity.d/live-autologin
	#  	fi

# GDM-2
	if [ -f $DTMP/etc/gdm/gdm.conf ] ; then
	#cp -a --remove-destination $DTMP/etc/gdm/gdm.conf $DTMP/etc/gdm/gdm.confCOP
	sed -i 's|#  AutomaticLoginEnable =|AutomaticLoginEnable =|g' $DTMP/etc/gdm/gdm.conf
		if [ "$(cat $DTMP/etc/gdm/gdm.conf | grep -a AutomaticLoginEnable )" != "" ] ; then
			sed -i 's|^AutomaticLoginEnable =.*|AutomaticLoginEnable = true|g' $DTMP/etc/gdm/gdm.conf
		else
			echo " "
			echo "AutomaticLoginEnable = true" >> $DTMP/etc/gdm/gdm.conf
		fi
	sed -i 's|#  AutomaticLogin =|AutomaticLogin =|g' $DTMP/etc/gdm/gdm.conf
		if [ "$(cat $DTMP/etc/gdm/gdm.conf | grep -a AutomaticLogin )" != "" ] ; then
			sed -i "s|^AutomaticLogin =.*|AutomaticLogin = $NEWUSERNAME|g" $DTMP/etc/gdm/gdm.conf
		else
			echo "AutomaticLogin = $NEWUSERNAME" >> $DTMP/etc/gdm/gdm.conf
		fi
	fi
	#find $DTMP/usr/lib/gdm/gdm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/gdm/gdm.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# GDM-3
	if [ -f $DTMP/etc/gdm3/daemon.conf ] ; then
	#cp -a --remove-destination $DTMP/etc/gdm3/daemon.conf $DTMP/etc/gdm3/daemon.confCOP
	sed -i 's|#  AutomaticLoginEnable =|AutomaticLoginEnable =|g' $DTMP/etc/gdm3/daemon.conf
	sed -i 's|^AutomaticLoginEnable =.*|AutomaticLoginEnable = true|g' $DTMP/etc/gdm3/daemon.conf
	sed -i 's|#  AutomaticLogin =|AutomaticLogin =|g' $DTMP/etc/gdm3/daemon.conf
	sed -i "s|^AutomaticLogin =.*|AutomaticLogin = $NEWUSERNAME|g" $DTMP/etc/gdm3/daemon.conf
	fi
	#find $DTMP/usr/lib/gdm3/daemon.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/gdm3/daemon.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# KDE Plasma 4
	if [ -f $DTMP/etc/kde4/kdm/kdmrc ] ; then
	#cp -a --remove-destination $DTMP/etc/kde4/kdm/kdmrc $DTMP/etc/kde4/kdm/kdmrcCOP
	sed -i 's|#AutoLoginEnable=|AutoLoginEnable=|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|^AutoLoginEnable=.*|AutoLoginEnable=true|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|#AutoReLogin=|AutoReLogin=|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|^AutoReLogin=.*|AutoReLogin=true|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|#AutoLoginAgain=|AutoLoginAgain=|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|^AutoLoginAgain=.*|AutoLoginAgain=true|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|#AutoLoginDelay=|AutoLoginDelay=|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|^AutoLoginDelay=.*|AutoLoginDelay=0|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i 's|#AutoLoginUser=|AutoLoginUser=|g' $DTMP/etc/kde4/kdm/kdmrc
	sed -i "s|^AutoLoginUser=.*|AutoLoginUser=$NEWUSERNAME|g" $DTMP/etc/kde4/kdm/kdmrc
 	fi
	#  	if [ -d $DTMP/etc/default/kdm.d ] ; then
	#  	touch $DTMP/etc/default/kdm.d/live-autologin
	#  	fi

# KDE Plasma >=5: SDDM
	if [ -e $DTMP/etc/sddm/ ] ; then
		#if [ -f $DTMP/etc/sddm.conf ] ; then
		#cp -a --remove-destination $DTMP/etc/sddm.conf $DTMP/etc/sddm.confCOP
		#fi
		if [ "$(cat $DTMP/etc/sddm.conf | grep -aEv "^#" | grep -aEi 'Autologin')" != "" ] ; then
			sed -i "s|User=.*|User=$NEWUSERNAME|g" $DTMP/etc/sddm.conf
		else
			printf "\n[Autologin]\nRelogin=true\nSession=plasma.desktop\nUser=$NEWUSERNAME\n\n" >> $DTMP/etc/sddm.conf
		fi
 	fi
	#  	if [ -d $DTMP/etc/default/sddm.d ] ; then
	#  	touch $DTMP/etc/default/sddm.d/live-autologin
	#  	fi
	#find $DTMP/usr/lib/sddm/sddm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/sddm.conf.d          | grep -aEi autologin | while read i ; do rm -f "$i" ; done


# else of autologin, if autologin != Y
else

# inittab
	if [ -e $DTMP/etc/inittab ] ; then
		if [ -e $DTMP/etc/inittabCOP ] ; then
		mv -f $DTMP/etc/inittabCOP $DTMP/etc/inittab
		else
			if [ -e "$DTMP/usr/share/sysvinit/inittab" ] ; then
			cp -a --remove-destination $DTMP/usr/share/sysvinit/inittab $DTMP/etc/inittab
			else
				sed -i "/.* --autologin .*/d" $DTMP/etc/inittab
				sed -i "/^# autologin:.*/d" $DTMP/etc/inittab
				NL=$(cat $DTMP/etc/inittab | grep -aE "^#1:.*getty.* #autologin" | sed "s| #autologin.*||g" | sed "s|^#||g")
				sed -i "s|^#1:.*getty.* #autologin.*|$NL|g" $DTMP/etc/inittab
			fi
		fi
	fi

# lightdm
	if [ -f $DTMP/etc/lightdm/lightdm.conf ] ; then
		if [ -f $DTMP/etc/lightdm/lightdm.confCOP ] ; then
		mv -f $DTMP/etc/lightdm/lightdm.confCOP $DTMP/etc/lightdm/lightdm.conf
		fi
		sed -i 's|^autologin|#autologin|g' $DTMP/etc/lightdm/lightdm.conf
	fi
	#find $DTMP/usr/lib/lightdm/lightdm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/lightdm/lightdm.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# lxdm
	if [ -f $DTMP/etc/lxdm/lxdm.conf ] ; then
		if [ -f $DTMP/etc/lxdm/lxdm.confCOP ] ; then
		mv -f $DTMP/etc/lxdm/lxdm.confCOP $DTMP/etc/lxdm/lxdm.conf
		fi
		sed -i 's|^autologin|#autologin|g' $DTMP/etc/lxdm/lxdm.conf
	fi
	#find $DTMP/usr/lib/lxdm/lxdm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/lxdm/lxdm.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# entrance (Enlightenment)
	if [ -f $DTMP/etc/entrance_config.cfg ] ; then
		if [ -f $DTMP/etc/entrance_config.cfgCOP ] ; then
		mv -f $DTMP/etc/entrance_config.cfgCOP $DTMP/etc/entrance_config.cfg
		fi
		sed -i -e '/autologin\/mode/ s|[0-9]|0|g' $DTMP/etc/entrance_config.cfg
	fi
	#find $DTMP/usr/lib/entrance_config.cfg.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/entrance_config.cfg.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# KDE 3 / TDE (Trinity)
	if [ -f $DTMP/etc/kde3/kdm/kdmrc ] ; then
		if [ -f $DTMP/etc/kde3/kdm/kdmrcCOP ] ; then
		mv -f $DTMP/etc/kde3/kdm/kdmrcCOP $DTMP/etc/kde3/kdm/kdmrc
		fi
		sed -i 's|^AutoLogin|#AutoLogin|g' $DTMP/etc/kde3/kdm/kdmrc
		sed -i 's|^AutoReLogin|#AutoReLogin|g' $DTMP/etc/kde3/kdm/kdmrc
	fi

# TDE <R14
	if [ -f $DTMP/etc/trinity/kdm/kdmrc ] ; then
		if [ -f $DTMP/etc/trinity/kdm/kdmrcCOP ] ; then
		mv -f $DTMP/etc/trinity/kdm/kdmrcCOP $DTMP/etc/trinity/kdm/kdmrc
		fi
		sed -i 's|^AutoLogin|#AutoLogin|g' $DTMP/etc/trinity/kdm/kdmrc
		sed -i 's|^AutoReLogin|#AutoReLogin|g' $DTMP/etc/trinity/kdm/kdmrc
	fi

# TDE >=R14
	if [ -f $DTMP/etc/trinity/tdm/tdmrc ] ; then
		if [ -f $DTMP/etc/trinity/tdm/tdmrcCOP ] ; then
		mv -f $DTMP/etc/trinity/tdm/tdmrcCOP $DTMP/etc/trinity/tdm/tdmrc
		fi
		sed -i 's|^AutoLogin|#AutoLogin|g' $DTMP/etc/trinity/tdm/tdmrc
		sed -i 's|^AutoReLogin|#AutoReLogin|g' $DTMP/etc/trinity/tdm/tdmrc
	fi

# GDM-2
	if [ -f $DTMP/etc/gdm/gdm.conf ] ; then
		if [ -f $DTMP/etc/gdm/gdm.confCOP ] ; then
		mv -f $DTMP/etc/gdm/gdm.confCOP $DTMP/etc/gdm/gdm.conf
		fi
		sed -i 's|^AutomaticLogin|#AutomaticLogin|g' $DTMP/etc/gdm/gdm.conf
	fi
	#find $DTMP/usr/lib/gdm/gdm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/gdm/gdm.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# GDM-3
	if [ -f $DTMP/etc/gdm3/daemon.conf ] ; then
		if [ -f $DTMP/etc/gdm3/daemon.confCOP ] ; then
		mv -f $DTMP/etc/gdm3/daemon.confCOP $DTMP/etc/gdm3/daemon.conf
		fi
		sed -i 's|^AutomaticLogin|#AutomaticLogin|g' $DTMP/etc/gdm3/daemon.conf
	fi
	#find $DTMP/usr/lib/gdm3/daemon.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/gdm3/daemon.conf.d     | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# KDE Plasma 4
	if [ -f $DTMP/etc/kde4/kdm/kdmrc ] ; then
		if [ -f $DTMP/etc/kde4/kdm/kdmrcCOP ] ; then
		mv -f $DTMP/etc/kde4/kdm/kdmrcCOP $DTMP/etc/kde4/kdm/kdmrc
		fi
		sed -i 's|^AutoLogin|#AutoLogin|g' $DTMP/etc/kde4/kdm/kdmrc
		sed -i 's|^AutoReLogin|#AutoReLogin|g' $DTMP/etc/kde4/kdm/kdmrc
	fi

# KDE Plasma >=5: SDDM
	if [ -f $DTMP/etc/sddm.conf ] ; then
		if [ -f $DTMP/etc/sddm.confCOP ] ; then
		mv -f $DTMP/etc/sddm.confCOP $DTMP/etc/sddm.conf
		else
		rm -f $DTMP/etc/sddm.conf
		fi
	fi
	#find $DTMP/usr/lib/sddm/sddm.conf.d | grep -aEi autologin | while read i ; do rm -f "$i" ; done
	#find $DTMP/etc/sddm.conf.d          | grep -aEi autologin | while read i ; do rm -f "$i" ; done

# end of autologin
fi

for i in "$DTMP/usr/lib/lightdm/lightdm.conf.d/" "$DTMP/etc/lightdm/lightdm.conf.d/" "$DTMP/usr/lib/lxdm/lxdm.conf.d/" "$DTMP/etc/lxdm/lxdm.conf.d/" "$DTMP/usr/lib/entrance_config.cfg.d/" "$DTMP/etc/entrance_config.cfg.d/" "$DTMP/usr/lib/gdm/gdm.conf.d/" "$DTMP/etc/gdm/gdm.conf.d/" "$DTMP/usr/lib/gdm3/daemon.conf.d/" "$DTMP/etc/gdm3/daemon.conf.d/" "$DTMP/usr/lib/sddm/sddm.conf.d/" "$DTMP/etc/sddm.conf.d/" "$DTMP/etc/default" "$DTMP/etc/default/kdm.d/" "$DTMP/etc/default/kdm-trinity.d/" "$DTMP/etc/default/tdm-trinity.d/" "$DTMP/etc/default/sddm.d/" ; do if [ -e "$i" ] ; then echo "$i" ; find "$i" | grep -aEi autologin | while read a ; do rm -f "$a" ; done ; fi ; done

if [ -f $DTMP/etc/profile.d/zz-live-config_xinit.sh ] ; then
	rm -f $DTMP/etc/profile.d/zz-live-config_xinit.sh
fi


### Fix bug KDM-3/TDM 'No autodetect language' ########################################

# KDE 3 / TDE (Trinity)
if [ -f $DTMP/etc/kde3/kdm/kdmrc ] ; then
	if [ "$LANGSEL" != "" ] ; then
		LANGSEL5=$(echo $LANGSEL | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 )
		sed -i 's|#Language=|Language=|g' $DTMP/etc/kde3/kdm/kdmrc
		sed -i "s|^Language=.*|Language=$LANGSEL5|g" $DTMP/etc/kde3/kdm/kdmrc
	else
		DETLANG5=$(locale | grep -aEi 'LANG' | sed 's|.*=||g' | sort -r | head -n 1 | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 )
		sed -i 's|#Language=|Language=|g' $DTMP/etc/kde3/kdm/kdmrc
		sed -i "s|^Language=.*|Language=$DETLANG5|g" $DTMP/etc/kde3/kdm/kdmrc
	fi
fi

# TDE <R14
if [ -f $DTMP/etc/trinity/kdm/kdmrc ] ; then
	if [ "$LANGSEL" != "" ] ; then
		LANGSEL5=$(echo $LANGSEL | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 )
		sed -i 's|#Language=|Language=|g' $DTMP/etc/trinity/kdm/kdmrc
		sed -i "s|^Language=.*|Language=$LANGSEL5|g" $DTMP/etc/trinity/kdm/kdmrc
	else
		DETLANG5=$(locale | grep -aEi 'LANG' | sed 's|.*=||g' | sort -r | head -n 1 | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 )
		sed -i 's|#Language=|Language=|g' $DTMP/etc/trinity/kdm/kdmrc
		sed -i "s|^Language=.*|Language=$DETLANG5|g" $DTMP/etc/trinity/kdm/kdmrc
	fi
fi

# TDE >=R14
if [ -f $DTMP/etc/trinity/tdm/tdmrc ] ; then
	if [ "$LANGSEL" != "" ] ; then
		LANGSEL5=$(echo $LANGSEL | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 )
		sed -i 's|#Language=|Language=|g' $DTMP/etc/trinity/tdm/tdmrc
		sed -i "s|^Language=.*|Language=$LANGSEL5|g" $DTMP/etc/trinity/tdm/tdmrc
	else
		DETLANG5=$(locale | grep -aEi 'LANG' | sed 's|.*=||g' | sort -r | head -n 1 | cut -d '.' -f 1 | cut -d '@' -f 1 | cut -d ':' -f 1 )
		sed -i 's|#Language=|Language=|g' $DTMP/etc/trinity/tdm/tdmrc
		sed -i "s|^Language=.*|Language=$DETLANG5|g" $DTMP/etc/trinity/tdm/tdmrc
	fi
fi


### PRE-CHROOT ########################################

# prepare for chroot
mount --rbind /dev/ $DTMP/dev/
#mount --bind /dev/pts/ $DTMP/dev/pts/
mount --rbind /proc/ $DTMP/proc/
mount --rbind /sys/ $DTMP/sys/
mount --rbind /run/ $DTMP/run/

# copy 'iivar' to chroot environment
cp --remove-destination /tmp/iivar $DTMP/iivar


### CHROOTSCRIPT ########################################

#cat << EOF > $DTMP/chrootscript
cat > $DTMP/chrootscript <<EOF
#!/bin/bash

CNAME=$CNAME
VERSION=$VERSION
TITLE=$TITLE

# Translations
if [ "\$LANG" = "" ] ; then export $(cat /etc/default/locale | grep -a 'LANG=') ; fi
TEXTDOMAIN=$TEXTDOMAIN
TEXTDOMAINDIR=$TEXTDOMAINDIR

ERRORLOG="/chroot.log"
if [ -e "\$ERRORLOG" ] ; then
	mv -f \$ERRORLOG \${ERRORLOG}.ant
fi
if [ -e "\$ERRORLOG" ] ; then rm -rf "\$ERRORLOG" ; fi

if [ "$DEBUG" = "Y" ] ; then
	set -xv
fi
if [ "$DEBUG" != "N" ] ; then
exec > >(tee -a "\$ERRORLOG") 2>&1
echo "\$0" "\$*" >> "\$ERRORLOG"
echo "env:" >> "\$ERRORLOG"
env >> "\$ERRORLOG"
echo "set:" >> "\$ERRORLOG"
set >> "\$ERRORLOG"
fi

#######################################

cat /iivar

source /iivar

#udevadm control --reload-rules && udevadm trigger -v
mount -a

#######################################

# Delete live/d-i packages

for i in pica-ii pica-live-config ^live-.* ^di-utils ^partman-base ^base-installer debian-installer devuan-installer live-installer calamares ; do apt-get purge -y \$i ; done

dpkg -l | awk '{print \$2}' | grep -aEi "\-udeb$|\-udeb:" | while read i ; do apt-get purge -y ^\$i ; done

# undo dpkg-divert done by live-config
# divert live files must be deleted, otherwise there will be problems when trying to overwrite them

#pr -3 -a -J -T /var/lib/dpkg/diversions | awk '(index(\$3, "live-") != 0) {print \$1 }' | while read i ; do
#pr -3 -a -J -T /var/lib/dpkg/diversions | awk 'index(\$3, "live-") {print \$1 }' | while read i ; do
pr -3 -a -J -T /var/lib/dpkg/diversions | awk '\$3 ~ /live-/ {print \$1 }' | while read i ; do
        dpkg-divert --remove --rename "\$i"
done

# On a live system, original (initramfs-tools) update-initramfs is replaced with live (live-tools) live-update-initramfs (update-initramfs is disabled when operating in a live read-only system), so /usr/sbin/update-initramfs is a symlink to /bin/live-update-initramfs renaming the original as /usr/sbin/update-initramfs.orig.initramfs-tools

ls -FAl --full-time /usr/sbin/ | grep -aEi update-initramfs

#if [ -e /etc/cryptsetup-initramfs/conf-hook ] && [ "\$(command -v cryptsetup)" != "" ] ; then
#	if [ "\$(cat /etc/cryptsetup-initramfs/conf-hook | grep -aE ^CRYPTSETUP=y )" = "" ] ; then
#		if [ "\$(cat /etc/cryptsetup-initramfs/conf-hook | grep -aE ^CRYPTSETUP= )" != "" ] ; then
#			sed -i "s|^CRYPTSETUP=.*|CRYPTSETUP=y|g" /etc/cryptsetup-initramfs/conf-hook
#		else
#			echo 'CRYPTSETUP=y' >> /etc/cryptsetup-initramfs/conf-hook
#		fi
#	fi
#fi
if [ ! -e /etc/initramfs-tools/conf.d/initramfs-permissions ] ; then
	echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
else
	if [ "\$(cat /etc/initramfs-tools/conf.d/initramfs-permissions | grep -aE ^UMASK= )" = "" ] ; then
		echo 'UMASK=0077' > /etc/initramfs-tools/conf.d/initramfs-permissions
	elif [ "\$(cat /etc/initramfs-tools/conf.d/initramfs-permissions | grep -aE ^UMASK=0077 )" = "" ] ; then
		sed -i "s|^UMASK=.*|UMASK=0077|g" /etc/initramfs-tools/conf.d/initramfs-permissions
	else
		cat /etc/initramfs-tools/conf.d/initramfs-permissions | grep -aE ^UMASK=
	fi
fi

update-initramfs -u -v -k all

########################################

EOF


# append to chroot script, except in 'clone' mode

if [ "$SNAPMETHOD" != "clone" ] ; then

#cat << EOF >> $DTMP/chrootscript
cat >> $DTMP/chrootscript <<EOF

if [ -e /UERROR ] ; then rm -rf /UERROR ; fi

# delete 'user'
if [ "$NEWUSERNAME" != "user" ] && [ "$OLDUSERNAME" != "user" ] ; then
	userdel -f -r user
	rm -rf /home/user
	groupdel user
fi

# delete old user (including group and home)
if [ "$OLDUSERNAME" != "" ] ; then
	userdel -f -r $OLDUSERNAME
	rm -rf /home/$OLDUSERNAME
	groupdel $OLDUSERGROUP
fi

# create new user (including group)
groupadd -g 1000 $NEWUSERNAME
		if [ "\$?" -ne 0 ] ; then
			echo "\$LINENO" >> /UERROR
		fi
useradd -u 1000 -g 1000 -c "$NEWUSERREALNAME,,," -s \$(command -v bash) -m $NEWUSERNAME
		if [ "\$?" -ne 0 ] ; then
			echo "\$LINENO" >> /UERROR
		fi
printf "$NEWUSERPASS\n$NEWUSERPASS\n\n" | passwd $NEWUSERNAME
		if [ "\$?" -ne 0 ] ; then
			echo "\$LINENO" >> /UERROR
		fi

# add to supplementary groups, checking first if they exist
if [ "\$(dpkg -l | grep -aEi "^ii|^hi" | awk '{print \$2}' | sed "s|:.*||g" | grep -aEi "xserver-xorg|x11-session|x11-xserver|^cdm\$|^console-tdm\$|^edm\$|^entrance\$|^gdm\$|^gdm3\$|^kdm\$|^kdm-trinity\$|^lightdm\$|^lxdm\$|^ly\$|^mdm\$|^nodm\$|^qingy\$|^sddm\$|^slim\$|^tdm\$|^tdm-trinity\$|^wdm\$|^xdm\$")" != "" ] ; then
	GLIST="adm admin audio bluetooth cdrom cgroup crontab cups cupsadmin dialout dip disk fax floppy fuse input kvm lp lpadmin netdev plugdev powerdev pulse pulse-access pulse-rt qemu sambashare saned scanner ssh tape users vboxusers vlock video wireshark"
else
	GLIST="ssh users"
fi
for i in \$GLIST ; do
	CHECKGROUP=\$(cat /etc/group | awk -F ':' '{print \$1}' | grep -aE "^\$i\$")
	if [ "\$CHECKGROUP" != "" ] ; then
		echo "$NEWUSERNAME -> \$i"
		usermod -a -G \$i $NEWUSERNAME
	fi
done

if [ "$NEWROOTPASS" != "" ] ; then
	printf "$NEWROOTPASS\n$NEWROOTPASS\n\n" | passwd root
			if [ "\$?" -ne 0 ] ; then
				echo "\$LINENO" >> /UERROR
			fi
else
	passwd -l root
fi

# create nobody / nogroup if not exist
if [ "\$(cat /etc/passwd | cut -d ':' -f 1 | grep -aE ^nobody$ )" = "" ] && [ "\$(cat /etc/group | cut -d ':' -f 1 | grep -aE ^nogroup$ )" = "" ] ; then
	groupadd -g 65534 nogroup
	useradd -u 65534 -g 65534 nobody
fi

if [ "$GUESTNAME" != "" ] ; then

	# create guest user (including group)
	groupadd -g 2000 $GUESTNAME
	useradd -u 2000 -g 2000 -c "$GUESTNAME,,," -s \$(command -v bash) -m $GUESTNAME
	printf "$GUESTPASS\n$GUESTPASS\n\n" | passwd $GUESTNAME

	# add to supplementary groups, checking first if they exist
	if [ "\$(dpkg -l | grep -aEi "^ii|^hi" | awk '{print \$2}' | sed "s|:.*||g" | grep -aEi "xserver-xorg|x11-session|x11-xserver|^cdm\$|^console-tdm\$|^edm\$|^entrance\$|^gdm\$|^gdm3\$|^kdm\$|^kdm-trinity\$|^lightdm\$|^lxdm\$|^ly\$|^mdm\$|^nodm\$|^qingy\$|^sddm\$|^slim\$|^tdm\$|^tdm-trinity\$|^wdm\$|^xdm\$")" != "" ] ; then
		GLIST="audio bluetooth cdrom cgroup cups dialout dip disk fax floppy fuse input kvm lp netdev plugdev powerdev pulse pulse-access pulse-rt qemu sambashare saned scanner ssh tape users vboxusers vlock video"
	else
		GLIST="ssh users"
	fi
	for i in \$GLIST ; do
		CHECKGROUP=\$(cat /etc/group | awk -F ':' '{print \$1}' | grep -aE "^\$i\$")
		if [ "\$CHECKGROUP" != "" ] ; then
			echo "$GUESTNAME -> \$i"
			usermod -a -G \$i $GUESTNAME
		fi
	done

fi

#######################################

### Copy /etc/skel
cp -a --remove-destination /etc/skel/* /etc/skel/.[!.]* /etc/skel/..?* /root/
ls /home/ | grep -aiv 'lost+found' | while read i ; do cp -a --remove-destination /etc/skel/* /etc/skel/.[!.]* /etc/skel/..?* /home/"\$i"/ ; done
cp -a --remove-destination /etc/skel/* /etc/skel/.[!.]* /etc/skel/..?* /home/$NEWUSERNAME/
if [ "$GUESTNAME" != "" ] ; then cp -a --remove-destination /etc/skel/* /etc/skel/.[!.]* /etc/skel/..?* /home/$GUESTNAME/ ; fi
#ls /home/ | grep -aiv 'lost+found' | while read i ; do cp -a --remove-destination /etc/skel/{,.[!.],..?}* /home/"\$i"/ ; done
cp -a --remove-destination /root/.bashrcPICA /root/.bashrc
if [ "$SYSARC" = "amd64" ] || [ "$SYSARC" = "i386" ] || [ "$SYSARC" = "ia64" ] ; then sed -i -e '/presentation-mode/ s|false|true|g' -e '/dpms-enabled/ s|true|false|g' -e '/\("blank-on-ac"\|"dpms-on-ac-sleep"\|"dpms-on-ac-off"\)/ s|"[0-9]\+"|"0"|g' /root/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml ; fi
ls /home/ | grep -aiv 'lost+found' | while read i ; do cd /home/"\$i" ; cp -a --remove-destination .bashrcPICA .bashrc ; cd - ; done
if [ "$SYSARC" = "amd64" ] || [ "$SYSARC" = "i386" ] || [ "$SYSARC" = "ia64" ] ; then ls /home/ | grep -aiv 'lost+found' | while read i ; do cd /home/"\$i" ; sed -i -e '/presentation-mode/ s|false|true|g' -e '/dpms-enabled/ s|true|false|g' -e '/\("blank-on-ac"\|"dpms-on-ac-sleep"\|"dpms-on-ac-off"\)/ s|"[0-9]\+"|"0"|g' .config/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml ; cd - ; done ; fi
cp -a --remove-destination /home/$NEWUSERNAME/.bashrcPICA /home/$NEWUSERNAME/.bashrc
if [ "$SYSARC" = "amd64" ] || [ "$SYSARC" = "i386" ] || [ "$SYSARC" = "ia64" ] ; then sed -i -e '/presentation-mode/ s|false|true|g' -e '/dpms-enabled/ s|true|false|g' -e '/\("blank-on-ac"\|"dpms-on-ac-sleep"\|"dpms-on-ac-off"\)/ s|"[0-9]\+"|"0"|g' /home/$NEWUSERNAME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml ; fi
if [ "$GUESTNAME" != "" ] ; then
	cp -a --remove-destination /home/$GUESTNAME/.bashrcPICA /home/$GUESTNAME/.bashrc
	if [ "$SYSARC" = "amd64" ] || [ "$SYSARC" = "i386" ] || [ "$SYSARC" = "ia64" ] ; then sed -i -e '/presentation-mode/ s|false|true|g' -e '/dpms-enabled/ s|true|false|g' -e '/\("blank-on-ac"\|"dpms-on-ac-sleep"\|"dpms-on-ac-off"\)/ s|"[0-9]\+"|"0"|g' /home/$GUESTNAME/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml ; fi
fi
### Owners and permissions
ls /home/ | grep -aiv 'lost+found' | while read i ; do chown -R \$(id -nu "\$i"):\$(id -ng "\$i") /home/"\$i" ; done
chown -R \$(id -nu "$NEWUSERNAME"):\$(id -ng "$NEWUSERNAME") /home/$NEWUSERNAME
if [ "$GUESTNAME" != "" ] ; then chown -R \$(id -nu "$GUESTNAME"):\$(id -ng "$GUESTNAME") /home/$GUESTNAME ; fi
find /home/$NEWUSERNAME/ -type f | while read i ; do chmod 600 "\$i" ; done
find /home/$NEWUSERNAME/ -type d | while read i ; do chmod 700 "\$i" ; done
if [ "$GUESTNAME" != "" ] ; then
	find /home/$GUESTNAME/ -type f | while read i ; do chmod 666 "\$i" ; done
	find /home/$GUESTNAME/ -type d | while read i ; do chmod 777 "\$i" ; done
	find /home/$GUESTNAME/ -maxdepth 1 | grep -a bashrc | while read i ; do sed -i '/umask 007/ s|.*|umask 000|g' "\$i" ; done
fi
chown -R root:root /root
find /root/ -type f | while read i ; do chmod 600 "\$i" ; done
find /root/ -type d | while read i ; do chmod 700 "\$i" ; done
find /root/ -maxdepth 1 | grep -a bashrc | while read i ; do sed -i '/umask 007/ s|.*|umask 002\nchmod -R o= /root/|g' "\$i" ; done

# delete 'debug by default'
if [ -e /etc/pica-global ] ; then rm -rf /etc/pica-global ; fi

# delete Desktop
ls /home/ | grep -aiv 'lost+found' | while read i ; do
	if [ "\$(ls -A "/home/\$i/Desktop" | grep -aEiv "pica-ii.desktop|pica-man")" = "" ] ; then
		rm -rf "/home/\$i/Desktop"
	else
		rm -f /home/"\$i"/Desktop/pica-ii.desktop
	fi
done

#######################################

# delete OLDUSERNAME in /etc/sudoers*
# might not be needed with live-config, it uses %sudo
if [ "$OLDUSERNAME" != "" ] ; then
	find /etc/ -type f | grep -a /etc/sudoers | while read i ; do
		if [ "\$(cat "\$i" | grep -a "$OLDUSERNAME")" != "" ] ; then
			sed -i "/^$OLDUSERNAME\t.*/d" "\$i"
		fi
	done
fi

if [ -e /etc/sudoers.d/live ] ; then
	rm -rf /etc/sudoers.d/live
fi

#if [ "$FORCESUCONFIG" = "Y" ] ; then
	
	for OUSER in $NEWUSERNAME $GUESTNAME ; do
		for i in /home/\$OUSER/.trinity/share/config/kdesurc /home/\$OUSER/.trinity/share/config/tdesurc /home/\$OUSER/.kde/share/config/kdesurc /home/\$OUSER/.kde4/share/config/kdesurc ; do
			if [ -f "\$i" ] ; then
				CHECK=\$(cat "\$i" | grep -aEi 'super-user-command')
				if [ "\$CHECK" = "" ] ; then
					echo "" >> "\$i"
					echo "[super-user-command]" >> "\$i"
					echo "super-user-command=su" >> "\$i"
					chown \$(id -nu "\$OUSER"):\$(id -ng "\$OUSER") "\$i"
				else
					sed -i "s|command=sudo|command=su|g" "\$i"
					chown \$(id -nu "\$OUSER"):\$(id -ng "\$OUSER") "\$i"
				fi
				
				if [ "$SUDOCONFIG" = "Y" ] ; then
					sed -i 's|command=su|command=sudo|g' "\$i"
					chown \$(id -nu "\$OUSER"):\$(id -ng "\$OUSER") "\$i"
				fi
			fi
		done
	done
			
	for OUSER in $NEWUSERNAME $GUESTNAME ; do
		if [ -e /home/\$OUSER/.gconf/apps/gksu/%gconf.xml ] ; then
			sed -i '/sudo-mode/ s|true|false|g' /home/\$OUSER/.gconf/apps/gksu/%gconf.xml
			chown \$(id -nu "\$OUSER"):\$(id -ng "\$OUSER") /home/\$OUSER/.gconf/apps/gksu/%gconf.xml
			
			if [ "$SUDOCONFIG" = "Y" ] ; then
				sed -i '/sudo-mode/ s|false|true|g' /home/\$OUSER/.gconf/apps/gksu/%gconf.xml
				chown \$(id -nu "\$OUSER"):\$(id -ng "\$OUSER") /home/\$OUSER/.gconf/apps/gksu/%gconf.xml
			fi
		fi
	done
	
	for OUSER in $NEWUSERNAME $GUESTNAME ; do
		if [ -e /home/\$OUSER/.su-to-rootrc ] ; then
			sed -i 's|SU_TO_ROOT_SU=.*|SU_TO_ROOT_SU=su|g' /home/\$OUSER/.su-to-rootrc
			sed -i 's|SU_TO_ROOT=sudo|SU_TO_ROOT=su|g' /home/\$OUSER/.su-to-rootrc
			chown \$(id -nu "\$OUSER"):\$(id -ng "\$OUSER") /home/\$OUSER/.su-to-rootrc
			
			if [ "$SUDOCONFIG" = "Y" ] ; then
				sed -i 's|SU_TO_ROOT_SU=su|SU_TO_ROOT_SU=sudo|g' /home/\$OUSER/.su-to-rootrc
				sed -i 's|SU_TO_ROOT=su|SU_TO_ROOT=sudo|g' /home/\$OUSER/.su-to-rootrc
				chown \$(id -nu "\$OUSER"):\$(id -ng "\$OUSER") /home/\$OUSER/.su-to-rootrc
			fi
		fi
	done
	
#fi

# sudo disabling

if [ "$SUDOCONFIG" != "Y" ] ; then

	groupdel sudo
	groupdel wheel

	find /etc/ -type f | grep -a /etc/sudoers | while read i ; do sed -i "s|^.sudo|#&|g" "\$i" ; done
	find /etc/ -type f | grep -a /etc/sudoers | while read i ; do sed -i "s|^.wheel|#&|g" "\$i" ; done

else

	usermod -a -G sudo $NEWUSERNAME
	
	CHECKSUDO1=\$(cat /etc/sudoers | grep -aE "^%sudo")
	if [ "\$CHECKSUDO1" = "" ] ; then
		CHECKSUDO2=\$(cat /etc/sudoers | grep -aE "^#%sudo")
		if [ "\$CHECKSUDO2" = "" ] ; then
			echo "%sudo ALL=(ALL:ALL) ALL" >> /etc/sudoers
		else
			sed -i "s|^#%sudo|%sudo|g" /etc/sudoers
		fi
	fi

fi

#######################################

shadowconfig on

#######################################

#if [ -e "/etc/adjtime" ] ; then
#sed -i "s|^UTC.*|LOCAL|g" /etc/adjtime
#else
#cat > /etc/adjtime <<EOF
#0.0 0 0.0
#0
#LOCAL
#EOF
#fi

#if [ "$LANGSEL" != "" ] ; then
#	if [ "\$(dpkg -l | grep -aEi "^ii|^hi" | awk '{print \$2}' | grep -aEi "^locales-all$|^locales-all:")" = "" ] ; then
#		update-locale LANG=$LANGSEL LANGUAGE=$LANGSEL locales=$LANGSEL
#	fi
#fi

#######################################

EOF

fi


### NOMODESET OPTION ########################################

if [ "$NOMODESETCHECK" = "" ] ; then
	NOMODESETCHECK=$(cat /proc/cmdline | grep -aEio nomodeset )
fi

# Keep only (note: xserver-xorg-video-modesetting is a virtual package provided by xserver-xorg-core) 'xserver-xorg-video-all|xserver-xorg-video-dummy|xserver-xorg-video-fbdev|xserver-xorg-video-modesetting|xserver-xorg-video-vesa'
if [ "$NOMODESETCHECK" != "" ] ; then
echo 'for i in ^xserver-xorg-video-amdgpu.* ^xserver-xorg-video-apm.* ^xserver-xorg-video-ark.* ^xserver-xorg-video-ast.* ^xserver-xorg-video-ati.* ^xserver-xorg-video-chips.* ^xserver-xorg-video-cirrus.* ^xserver-xorg-video-freedreno.* ^xserver-xorg-video-geode.* ^xserver-xorg-video-glamo.* ^xserver-xorg-video-glide.* ^xserver-xorg-video-glint.* ^xserver-xorg-video-i128.* ^xserver-xorg-video-i740.* ^xserver-xorg-video-intel.* ^xserver-xorg-video-ivtv.* ^xserver-xorg-video-mach64.* ^xserver-xorg-video-mga.* ^xserver-xorg-video-msm.* ^xserver-xorg-video-neomagic.* ^xserver-xorg-video-newport.* ^xserver-xorg-video-nouveau.* ^xserver-xorg-video-nv.* ^xserver-xorg-video-nvidia.* ^xserver-xorg-video-nvidia-legacy-304xx.* ^xserver-xorg-video-nvidia-legacy-340xx.* ^xserver-xorg-video-nvidia-legacy-390xx.* ^xserver-xorg-video-nvidia-tesla-418.* ^xserver-xorg-video-nvidia-tesla-440.* ^xserver-xorg-video-nvidia-tesla-450.* ^xserver-xorg-video-omap.* ^xserver-xorg-video-openchrome.* ^xserver-xorg-video-qxl.* ^xserver-xorg-video-r128.* ^xserver-xorg-video-radeon.* ^xserver-xorg-video-rendition.* ^xserver-xorg-video-s3.* ^xserver-xorg-video-savage.* ^xserver-xorg-video-siliconmotion.* ^xserver-xorg-video-sis.* ^xserver-xorg-video-sisusb.* ^xserver-xorg-video-sun.* ^xserver-xorg-video-tdfx.* ^xserver-xorg-video-tga.* ^xserver-xorg-video-trident.* ^xserver-xorg-video-tseng.* ^xserver-xorg-video-vmware.* ^xserver-xorg-video-voodoo.* ^nouveau.* ^nvidia.* ^libnvidia.* ^libcuda.* ^radeon.* ^virtualbox.* ; do apt-get purge -y \$i ; done' >> $DTMP/chrootscript
fi


# postinst ########################################

#cat << EOF >> $DTMP/chrootscript
cat >> $DTMP/chrootscript <<EOF

if [ -e /etc/pica-postinst ] ; then rm /etc/pica-postinst ; fi
#if [ -e /etc/pica-postinstCOP ] ; then
#	rm /etc/pica-postinst ; mv -f /etc/pica-postinstCOP /etc/pica-postinst
#elif [ "\$(cat /etc/pica-postinst | grep -aE "^CLEAN=" | sed 's|CLEAN=||g' | grep -aEi "N")" != "" ] ; then
#	sed -i "/^CLEAN=/ s|=N|=Y|g"  /etc/pica-postinst
#	sed -i "/^CLEAN=/ s|=\"N|=\"Y|g"  /etc/pica-postinst
#else
#	true
#fi

if [ "\$(command -v postinst)" != "" ] ; then postinst ; fi

EOF


# Install GRUB - P2 ########################################

EOF=EOF

if [ "$GRUBVERSEL" != "" ] ; then

#cat << EOF >> $DTMP/chrootscript
cat >> $DTMP/chrootscript <<EOF

# Install GRUB - P2 ########################################

if [ "\$(cat /etc/default/grub | grep -aEi ^GRUB_ENABLE_CRYPTODISK=)" = "" ] ; then
	echo " " >> /etc/default/grub
	echo "GRUB_ENABLE_CRYPTODISK=y" >> /etc/default/grub
else
	sed -i "s|^GRUB_ENABLE_CRYPTODISK.*|GRUB_ENABLE_CRYPTODISK=y|g" /etc/default/grub
fi
# https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html#avoiding-the-extra-password-prompt

if [ "$REST_GRUB_THEME" != "" ] && [ "\$(cat /etc/default/grub | grep -aEi ^GRUB_THEME=)" = "" ] ; then
echo >> /etc/default/grub
echo $REST_GRUB_THEME >> /etc/default/grub
echo >> /etc/default/grub
fi


# grub-legacy shell does not work if grub files are not in /boot

echo "os-prober (1)"
os-prober


# RAID #####

## Open all existing encrypted volumes WITH headers:
#for i in \$(lsblk -r -n -o KNAME,RM,FSTYPE | grep -aEi 'crypt' | awk '{print "/dev/"\$1}' | sort -u ) ; do lsblk -r -n -o KNAME,SIZE,LABEL,UUID | grep -aE "^\$(echo \$i | sed 's|/dev/||g') " ; cryptsetup luksOpen \$i e\$(echo \$i | sed 's|/dev/||g') ; done

## Activate existing LVM:
#vgchange -ay

## Activate existing RAID:
#mdadm --assemble --scan

#if [ -e /GRUBRAID ] ; then rm -rf /GRUBRAID ; fi
#
#if [ "\$(echo \$GRUBINSLOC | grep -a '/dev/')" != "" ] ; then
#	if [ "\$(command -v mdadm)" != "" ] ; then
#		mdadm --detail $IPART | grep -a " /dev/" | awk '{print \$NF}' | grep -aEio ".*[a-zA-Z]" | sort -u -r | while read PREINSTALLDISK ; do
#				# fix around (mmc)blk devices with (mmc)blkXpY partitions (e.g. /dev/mmcblk0p1 ) and NVME devices with nvmeXnYpZ partitions (e.g. /dev/nvme0n1p1 ):
#				CHECK_PREINSTALLDISK=\$(echo "\$PREINSTALLDISK" | grep -aEi "[0-9]p$")
#				if [ "\$CHECK_PREINSTALLDISK" != "" ] ; then
#					INSTALLDISK=\$(echo "\$PREINSTALLDISK" | sed "s|p$||g")
#				else
#					INSTALLDISK=\$PREINSTALLDISK
#				fi
#			#fi
#			grub-install \$INSTALLDISK
#			if [ "\$?" -ne 0 ] ; then
#				grub-install --directory /usr/lib/grub/\$(ls -p /usr/lib/grub/ | grep -a / | tail -n 1) \$INSTALLDISK
#			fi
#			if [ "\$?" -eq 0 ] ; then
#				echo \$INSTALLDISK >> /GRUBRAID
#			fi
#		done
#	fi
#fi

# GRUBINSLOC #####

if [ -e /GRUBERROR ] ; then rm -rf /GRUBERROR ; fi

if [ "\$(echo \$GRUBINSLOC | grep -a '/dev/')" != "" ] ; then
	for i in \$GRUBINSLOC ; do
		echo "GRUB install \$i"
		grub-install \$i
		if [ "\$?" -ne 0 ] ; then
			grub-install --directory /usr/lib/grub/\$(ls -p /usr/lib/grub/ | grep -a / | tail -n 1) \$i
			if [ "\$?" -ne 0 ] ; then
#			if [ "\$?" -ne 0 ] && [ ! -e /GRUBRAID ] ; then
				echo "GRUBERROR=\"Y\"" > /GRUBERROR
			fi
		fi
	done
fi

#if [ -e /GRUBRAID ] ; then cat /GRUBRAID ; rm -rf /GRUBRAID ; fi

if [ "\$GRUBINSLOC" = "part" ] ; then

	if [ "\$GRUBVERSEL" = "grub-legacy" ] || [ "\$GRUBVERSEL" = "grub-gfxboot" ] ; then
	
		# grub-install fails to a partition: "error 22: No such partition"
	
		# The following command will probable give error 22 but gets the files in /boot (grub shell might not)
		grub-install $IPART
	
		# isolate the disk name and translate to the right number for grub
			# fix around (mmc)blk devices with (mmc)blkXpY partitions (e.g. /dev/mmcblk0p1 ) and NVME devices with nvmeXnYpZ partitions (e.g. /dev/nvme0n1p1 ):
			CHECK_IPART_P=\$(echo $IPART | grep -aEi "[0-9]p[0-9]")
			if [ "\$CHECK_IPART_P" != "" ] ; then
				CHECK_IPART_N=\$(echo $IPART | grep -aEi "[0-9]n[0-9]")
				if [ "\$CHECK_IPART_N" != "" ] ; then
					GRUBDEVNUM=\$(expr \$(echo $IPART | sed "s|p[0-9].*||g" | sed "s|.*[a-zA-Z/:-]||g" ) - 1 )
				else
					GRUBDEVNUM=\$(echo $IPART | sed "s|p[0-9].*||g" | sed "s|.*[a-zA-Z/:-]||g")
				fi
			else
				GRUBDEVNUM=\$(echo $IPART | sed 's|-||g' | cut -c 8 | tr "[a-j]" "[0-9]")
			fi
	
		# isolate the partition number
		IPARTNUM=\$(echo $IPART | sed "s|.*[a-zA-Z/:-]||g")
	
		# and reduce it by 1 for grub-1
		GRUBPARTNUM=\$(expr \$IPARTNUM - 1 )
	
		# finally get the finished grub root syntax
		GRUBROOT="(hd\$GRUBDEVNUM,\$GRUBPARTNUM)"
		echo "GRUBROOT=\"\$GRUBROOT\""
	
		# use grub shell in batch mode (grub-install fails to a partition)
		echo "grub-batch"
#		grub --batch <<-$EOF
grub --batch <<$EOF
root \$GRUBROOT
setup \$GRUBROOT
quit
$EOF
	else
		grub-install $IPART
		if [ "\$?" -ne 0 ] ; then
			grub-install --recheck --no-floppy --force --directory /usr/lib/grub/\$(ls -p /usr/lib/grub/ | grep -a / | tail -n 1) $IPART
			if [ "\$?" -ne 0 ] ; then
				echo "GRUBERROR=\"Y\"" > /GRUBERROR
			fi
		fi
	fi
fi

echo "os-prober (2)"
os-prober

### NOMODESET OPTION ########################################

if [ "\$NOMODESETCHECK" = "" ] ; then
	NOMODESETCHECK=\$(cat /proc/cmdline | grep -aEio nomodeset )
fi

if [ "\$NOMODESETCHECK" != "" ] ; then
	if [ -e "/etc/default/grub" ] ; then
		sed -i '/^GRUB_CMDLINE_LINUX="/ s|"\$| nomodeset i915.modeset=0 nouveau.modeset=0 nvidia.modeset=0 radeon.modeset=0 amdgpu.modeset=0 vga=normal"|g' /etc/default/grub
		sed -i '/^GRUB_CMDLINE_LINUX="/ s|GRUB_CMDLINE_LINUX=" nomodeset i915.modeset=0 nouveau.modeset=0 nvidia.modeset=0 radeon.modeset=0 amdgpu.modeset=0 vga=normal"|GRUB_CMDLINE_LINUX="nomodeset i915.modeset=0 nouveau.modeset=0 nvidia.modeset=0 radeon.modeset=0 amdgpu.modeset=0 vga=normal"|g' /etc/default/grub
		cat /etc/default/grub | grep -aEi GRUB_CMDLINE_LINUX
	fi
fi

#if [ "\$GRUBVERSEL" = "grub-legacy" ] || [ "\$GRUBVERSEL" = "grub-gfxboot" ] ; then
#	true
#else
#	grub-mkconfig -o /boot/grub/grub.cfg
#	if [ "\$?" -ne 0 ] ; then
#		grub-mkconfig -o /boot/grub/grub.cfg
#		if [ "\$?" -ne 0 ] ; then
#			echo "GRUBERROR=\"Y\"" > /GRUBERROR
#		fi
#	fi
#fi

echo "update-grub"
update-grub
if [ "\$?" -ne 0 ] ; then
	update-grub
	if [ "\$?" -ne 0 ] ; then
		echo "GRUBERROR=\"Y\"" > /GRUBERROR
	fi
fi

## update-grub-legacy IF EXISTS
if [ "\$GRUBVERSEL" = "grub-legacy" ] || [ "\$GRUBVERSEL" = "grub-gfxboot" ] ; then
	if [ -f $LIBDEP/update-grub-legacy ] ; then
		echo "update legacy"
		bash $LIBDEP/update-grub-legacy /boot/grub/menu.lst
	fi
fi

# for EFI only
EFIGRUBVERSEL=\$(echo "\$GRUBVERSEL" | grep -aEi '\-efi' )
if [ "\$EFIGRUBVERSEL" != "" ] ; then
	find /boot/efi/EFI/
	ls -FAl --full-time /boot/efi/EFI/
	ls -FAl --full-time /boot/efi/EFI/*/*
	find /boot/efi/EFI/ -type f | while read i ; do file "\$i" ; done
	efibootmgr --verbose

if [ ! -e /boot/efi/EFI/boot ] && [ ! -e /boot/efi/EFI/BOOT ] ; then
	mkdir -pv /boot/efi/EFI/boot
fi

BOOTPATH=/boot/efi/EFI/\$(ls -p /boot/efi/EFI/ | grep -a / | grep -aEi boot | sort -u | tail -n 1)

cpgrubtoboot () {
	for DISTRO in picalibre PICALIBRE devuan DEVUAN debian DEBIAN ; do
		BOOTGRUB=\$(ls /boot/efi/EFI/\$DISTRO/ | grep -aEi grub | grep -aEiv grubnet)
		if [ "\$BOOTGRUB" != "" ] ; then
			for i in \$BOOTGRUB ; do
				if [ "\$(echo \$i | grep -aEi "\.cfg$")" != "" ] ; then
					cp -av --remove-destination /boot/efi/EFI/\$DISTRO/\$i \$BOOTPATH/\$i
				else
					cp -av --remove-destination /boot/efi/EFI/\$DISTRO/\$i \$BOOTPATH/\$(echo \$i | sed 's|grub|boot|g')
				fi
				echo /boot/efi/EFI/\$DISTRO/\$i | tee -a /etc/grub-efi-boot
			done
			cat /etc/grub-efi-boot | sort -u -o /etc/grub-efi-boot
			break
		fi
	done
}

cpgrubtoboot

# efibootmgr
NPARTOS=\$(efibootmgr --verbose | grep -aEi picalibre | awk '{print \$1}' | tr -cd "[0-9]")
VORD=\$(efibootmgr --verbose | grep -aEi "^BootOrder" | awk '{print \$2}')
if [ "\$NPARTOS" != "" ] && [ "\$VORD" != "" ] ; then
	efibootmgr -o \$NPARTOS,\$(echo \$VORD | sed "s|\$NPARTOS,||g" | sed "s|,\$NPARTOS\$||g")
	if [ "\$?" -eq 0 ] ; then
		efibootmgr -O
		efibootmgr -o \$NPARTOS,\$(echo \$VORD | sed "s|\$NPARTOS,||g" | sed "s|,\$NPARTOS\$||g")
	fi
efibootmgr --verbose
fi

for i in debian DEBIAN devuan DEVUAN ; do
	if [ -e /boot/efi/EFI/\$i/ ] ; then rmdir /boot/efi/EFI/\$i/ ; fi
done

# End: if [ "\$EFIGRUBVERSEL" != "" ]
fi

EOF

# End: if [ "$GRUBVERSEL" != "" ]
fi


# Exec chrootscript ########################################

chmod +x $DTMP/chrootscript

#$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
#PIDDIALOGCHROOT=$( echo $! )

# run script in chroot using variables from copied "iivar"
TT="$TITLE" ; COM="chroot $DTMP $(command -v bash) /chrootscript" ; TERMINAL
#chroot $DTMP $(command -v bash) /chrootscript

#kill $PIDDIALOGCHROOT 2>/dev/null


### USER ERROR ########################################

if [ -e "$DTMP/UERROR" ] ; then
	cat "$DTMP/UERROR"
	cat -n "$DTMP/chrootscript" | grep -aEi -B2 "( ) ($(cat "$DTMP/UERROR" | tr "\n" "|" | sed "s:|$::g"))" | grep -aEv "ne 0 |/UERROR|^-" | sed "s|^[ 0-9\t]\+|ERROR: |g"
	check_exit
fi


### REVIEW GRUB POST-CHROOT ########################################

if [ "$GRUBVERSEL" != "" ] ; then

if [ -e "$DTMP/GRUBERROR" ] ; then
	rm -f "$DTMP/GRUBERROR"
	$DIALOG $WICON $WTITLE "$TITLE" $WM    $WTEXT $"ERROR: GRUB installation seems to have failed! " $H $W
fi

if [ "$G" = "N" ] ; then
	if   [ "$(command -v nano)" != "" ] ; then
		EDITOR="nano"
	elif [ "$(command -v mcedit)" != "" ] ; then
		EDITOR="mcedit"
	else
		EDITOR="editor"
	fi
else
	if   [ "$(command -v mousepad)" != "" ] ; then
		EDITOR="mousepad"
	elif [ "$(command -v kwrite)" != "" ] ; then
		EDITOR="kwrite"
	elif [ "$(command -v l3afpad)" != "" ] ; then
		EDITOR="l3afpad"
	elif [ "$(command -v leafpad)" != "" ] ; then
		EDITOR="leafpad"
	elif [ "$(command -v featherpad)" != "" ] ; then
		EDITOR="featherpad"
	elif [ "$(command -v juffed)" != "" ] ; then
		EDITOR="juffed"
	elif [ "$(command -v pluma)" != "" ] ; then
		EDITOR="pluma"
	elif [ "$(command -v gedit)" != "" ] ; then
		EDITOR="gedit"
	elif [ "$(command -v geany)" != "" ] ; then
		EDITOR="geany"
	elif [ "$(command -v kate)" != "" ] ; then
		EDITOR="kate"
	else
		EDITOR="xdg-open"
	fi
fi

if [ "$AUTOPROP" = "" ] ; then

	if [ -f $DTMP/boot/grub/grub.cfg ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Do you want to review /boot/grub/grub.cfg ?\n\nIf in doubt, select 'No/Cancel'.\n" $H $W
		if [ "$?" -eq 0 ] ; then
			if [ "$G" = "N" ] ; then
				exec >/dev/tty
			fi
		$EDITOR $DTMP/boot/grub/grub.cfg
			if [ "$G" = "N" ] ; then
				if [ "$DEBUG" != "N" ] ; then
					exec > >(tee -a "$ERRORLOG") 2>&1
				fi
			fi
		fi
	elif [ -f $DTMP/boot/grub/menu.lst ] ; then
	$DIALOG $WICON $WTITLE "$TITLE" $QYN   $WTEXT $"Do you want to review /boot/grub/menu.lst ?\n\nIf in doubt, select 'No/Cancel'.\n" $H $W
		if [ "$?" -eq 0 ] ; then
			if [ "$G" = "N" ] ; then
				exec >/dev/tty
			fi
		$EDITOR $DTMP/boot/grub/menu.lst
			if [ "$G" = "N" ] ; then
				if [ "$DEBUG" != "N" ] ; then
					exec > >(tee -a "$ERRORLOG") 2>&1
				fi
			fi
		fi
	else
		$DIALOG $WICON $WTITLE "$TITLE" $ERROR $WTEXT $"ERROR: GRUB installation failed! " $H $W
	fi

fi

fi


### RAID ########################################

	if [ "$TEMPLATE" != "Y" ] ; then

RAIDSYNC=$(cat /proc/mdstat | grep -aEio "finish=.*min" | sed 's|finish=||g' | sort -g -r | head -n 1 )
if [ "$RAIDSYNC" != "" ] ; then
	echo "RAID sync" "$RAIDSYNC"
	$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"The synchronization of the RAID partitions has not yet finished, missing $RAIDSYNC. If you turn off now, the synchronization will be interrupted and will continue the next time the computer is turned on. Note that while the synchronization has not been completed, the content will not be duplicated on different disks and you will see a warning 'RAID status not OK' at the boot of the operating system." $H $W
fi

	# End: if [ "$TEMPLATE" != "Y" ]
	fi


### Cleaning ########################################

echo $(date +%Y-%m-%d_%H:%M:%S)

	$DIALOG $WICON $WTITLE "$TITLE" $OK " " $WAIT  $WTEXT $"Please wait..." $H $W &
	PIDDIALOGEND=$( echo $! )

# delete plain-text passwords
if [ "$DEBUG" = "Y" ] ; then set +xv ; fi
sed -i "s|$NEWUSERPASS|__NEWUSERPASS__|g" $ERRORLOG
sed -i "s|$NEWROOTPASS|__NEWROOTPASS__|g" $ERRORLOG
if [ -n "$GUESTPASS" ] ; then sed -i "s|$GUESTPASS|__GUESTPASS__|g" $ERRORLOG ; fi
sed -i "s|$LUKSPASS|__LUKSPASS__|g" $ERRORLOG
sed -i "s|$TCPASS|__TCPASS__|g" $ERRORLOG
sed -i "s|$NEWUSERPASS|__NEWUSERPASS__|g" $DTMP/iivar
sed -i "s|$NEWROOTPASS|__NEWROOTPASS__|g" $DTMP/iivar
if [ -n "$GUESTPASS" ] ; then sed -i "s|$GUESTPASS|__GUESTPASS__|g" $DTMP/iivar ; fi
sed -i "s|$NEWUSERPASS|__NEWUSERPASS__|g" $DTMP/chrootscript
sed -i "s|$NEWROOTPASS|__NEWROOTPASS__|g" $DTMP/chrootscript
if [ -n "$GUESTPASS" ] ; then sed -i "s|$GUESTPASS|__GUESTPASS__|g" $DTMP/chrootscript ; fi
sed -i "s|$NEWUSERPASS|__NEWUSERPASS__|g" $DTMP/chroot.log
sed -i "s|$NEWROOTPASS|__NEWROOTPASS__|g" $DTMP/chroot.log
if [ -n "$GUESTPASS" ] ; then sed -i "s|$GUESTPASS|__GUESTPASS__|g" $DTMP/chroot.log ; fi
exec > >(tee -a "$ERRORLOG") 2>&1 ; if [ "$DEBUG" = "Y" ] ; then set -xv ; fi

# copy chroot logs
cp -v --remove-destination $ERRORLOG $DTMP/root/${CNAME}.log
cp -v --remove-destination $ERRORLOG $DTMP/home/$NEWUSERNAME/.${CNAME}.log
chown $(id -nu "$NEWUSERNAME"):$(id -ng "$NEWUSERNAME") $DTMP/home/$NEWUSERNAME/.${CNAME}.log
chmod 600 $DTMP/home/$NEWUSERNAME/.${CNAME}.log ; if [ "$(stat -c %U $DTMP/home/$NEWUSERNAME/.${CNAME}.log)" != "$NEWUSERNAME" ] ; then chmod 666 $DTMP/home/$NEWUSERNAME/.${CNAME}.log ; fi

cp -v --remove-destination $DTMP/iivar $DTMP/root/iivar_chroot
cp -v --remove-destination $DTMP/iivar $DTMP/home/$NEWUSERNAME/.iivar_chroot
chown $(id -nu "$NEWUSERNAME"):$(id -ng "$NEWUSERNAME") $DTMP/home/$NEWUSERNAME/.iivar_chroot
chmod 600 $DTMP/home/$NEWUSERNAME/.iivar_chroot ; if [ "$(stat -c %U $DTMP/home/$NEWUSERNAME/.iivar_chroot)" != "$NEWUSERNAME" ] ; then chmod 666 $DTMP/home/$NEWUSERNAME/.iivar_chroot ; fi

cp -v --remove-destination $DTMP/chrootscript $DTMP/root/chrootscript
cp -v --remove-destination $DTMP/chrootscript $DTMP/home/$NEWUSERNAME/.chrootscript
chown $(id -nu "$NEWUSERNAME"):$(id -ng "$NEWUSERNAME") $DTMP/home/$NEWUSERNAME/.chrootscript
chmod 600 $DTMP/home/$NEWUSERNAME/.chrootscript ; if [ "$(stat -c %U $DTMP/home/$NEWUSERNAME/.chrootscript)" != "$NEWUSERNAME" ] ; then chmod 666 $DTMP/home/$NEWUSERNAME/.chrootscript ; fi

cp -v --remove-destination $DTMP/chroot.log $DTMP/root/chroot.log
cp -v --remove-destination $DTMP/chroot.log $DTMP/home/$NEWUSERNAME/.chroot.log
chown $(id -nu "$NEWUSERNAME"):$(id -ng "$NEWUSERNAME") $DTMP/home/$NEWUSERNAME/.chroot.log
chmod 600 $DTMP/home/$NEWUSERNAME/.chroot.log ; if [ "$(stat -c %U $DTMP/home/$NEWUSERNAME/.chroot.log)" != "$NEWUSERNAME" ] ; then chmod 666 $DTMP/home/$NEWUSERNAME/.chroot.log ; fi

cp -v --remove-destination $DTMP/chrootscript $HOME/chrootscript
for i in $(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | awk '{print $2}') ; do AUSER=$(users | sed 's| |\n|g' | grep -aE "^$i$" | head -n 1) ; if [ "$AUSER" != "" ] ; then
	HOMECHROOTSCRIPT=/home/$i/.chrootscript
	mv -f $DTMP/chrootscript $HOMECHROOTSCRIPT
	chown $i:$i $HOMECHROOTSCRIPT
	chmod 600 $HOMECHROOTSCRIPT ; if [ "$(stat -c %U $HOMECHROOTSCRIPT)" != "$i" ] ; then chmod 666 $HOMECHROOTSCRIPT ; fi
	break
fi ; done

cp -v --remove-destination $DTMP/chroot.log $HOME/chroot.log
for i in $(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | awk '{print $2}') ; do AUSER=$(users | sed 's| |\n|g' | grep -aE "^$i$" | head -n 1) ; if [ "$AUSER" != "" ] ; then
	HOMECHROOTLOG=/home/$i/.chroot.log
	mv -f $DTMP/chroot.log $HOMECHROOTLOG
	chown $i:$i $HOMECHROOTLOG
	chmod 600 $HOMECHROOTLOG ; if [ "$(stat -c %U $HOMECHROOTLOG)" != "$i" ] ; then chmod 666 $HOMECHROOTLOG ; fi
	break
fi ; done

rm -f $DTMP/iivar $DTMP/chrootscript $DTMP/chroot.log /dtmp/iivar /dtmp/chrootscript /dtmp/chroot.log


### umount ########################################

### UMOUNT CHROOT ########################################

umount --recursive $DTMP/run && sleep 2
umount --recursive $DTMP/sys && sleep 2
umount --recursive $DTMP/proc && sleep 2
#umount --recursive $DTMP/dev/pts && sleep 2
#sleep 3
umount --recursive $DTMP/dev && sleep 2

umount --recursive $DTMP && sleep 3

umount $DTMP/run
umount $DTMP/sys
umount $DTMP/proc
#umount $DTMP/dev/pts
#sleep 3
umount $DTMP/dev

if [ "$SEPARATE_DATA" = "Y" ] ; then
	umount $DATAPART
fi

if [ "$SEPARATE_HOME" = "Y" ] ; then
	umount $HOMEPART
fi

if [ "$EFIPART" != "" ] ; then
	umount $EFIPART
fi

sleep 3
umount $IPART && sleep 3
lsblk -r -n -o MOUNTPOINT | grep -aE "^$(echo $DTMP | sed "s|/$||g")" | awk '{print length($1)"\t"$1}' | sort -n -r | cut -f 2 | while read i ; do umount "$i" && sleep 3 ; done
cat /etc/mtab | grep -aE " $(echo $DTMP | sed "s|/$||g")" | awk '{print length($2)"\t"$2}' | sort -n -r | cut -f 2 | while read i ; do umount "$i" && sleep 3 ; done
umount --recursive $DTMP && sleep 3
umount $DTMP && sleep 3
if [ "$(find $DTMP -type f)" = "" ] ; then find "$DTMP" -type d  | awk '{print length($1)"\t"$1}' | sort -n -r | cut -f 2 | while read i ; do rmdir "$i" ; done ; fi
rmdir $DTMP
echo "### mtab ##########"
cat /etc/mtab
echo "### findmnt ##########"
findmnt -u -R   # findmnt -l -u -R
echo "### lsblk ##########"
lsblk -o NAME,KNAME,RM,SIZE,RO,TYPE,FSTYPE,MOUNTPOINT,LABEL,UUID
echo "### mountinfo ##########"
cat /proc/self/mountinfo

	kill $PIDDIALOGEND 2>/dev/null


### END ########################################

	if [ "$TEMPLATE" != "Y" ] ; then

if [ "$EFIGRUBVERSEL" != "" ] ; then
	EFINOTE=$"\n\nIf when rebooting or turning on the computer, the operating system does not boot, you must enter in the EFI (typically the Del./Supr., Esc., F2 or F12 key at startup) and in Settings, Boot, (BBS) Priority, change the order. Additionally, in some EFI it is necessary to enter in the 'Security' or 'Boot Manager' section and 'Select as EFI file'/'Boot from file' /EFI/picalibre/grubxXX.efi (it is possible that previously in the 'Security' section you must 'Set supervisor password'). To save changes to EFI/BIOS, the key is usually F10."
fi

#if [ "$MOD_OS_NAME" = "" ] ; then
#	DEBIANNOTE=$"\n\n(PicaLibre is based on Debian/Devuan, and because its boot manager is used it is possible that on the startup screen you see this name instead of 'PicaLibre'.)"
#fi

$DIALOG $WICON $WTITLE "$TITLE" $INFO  $WTEXT $"$TITLE finished. You can reboot now. $DEBIANNOTE $EFINOTE \n\nThank you very much for using PicaLibre. Visit the website www.picalibre.org for more information.\n" $H $W

	# End: if [ "$TEMPLATE" != "Y" ]
	fi

echo $(date +%Y-%m-%d_%H:%M:%S) $"End" >> "$ERRORLOG"

clean

#if [ "$(cat /etc/passwd | grep -aE ^$(whoami): | cut -d ':' -f 3 )" -eq 0 ] ; then
if [ "$(id -u)" -eq 0 ] && [ "$DEBUG" = "Y" ] ; then
	RECERRORLOG="$ERRORLOG"
	for i in $(cat /etc/passwd | awk -F ':' '{print $3,$1}' | sort -n | grep -aEi "00[0-9] " | awk '{print $2}') ; do AUSER=$(users | sed 's| |\n|g' | grep -aE "^$i$" | head -n 1) ; if [ "$AUSER" != "" ] ; then
		HOMEERRORLOG=/home/$i/.${CNAME}.log
		RECERRORLOG="$RECERRORLOG $HOMEERRORLOG "
		cp -v --remove-destination $ERRORLOG $HOMEERRORLOG
		if [ "$(id -nu $i)" != "" ] ; then chown $(id -nu $i):$(id -ng $i) $HOMEERRORLOG ; else chown 1000:1000 $HOMEERRORLOG ; fi
		chmod 600 $HOMEERRORLOG ; if [ "$(stat -c %U $HOMEERRORLOG)" != "$i" ] ; then chmod 666 $HOMEERRORLOG ; fi
		break
	fi ; done
fi

if [ "$AUTOPOWEROFF" = "" ] ; then
	exit 0
else
	sleep $(echo 0"$AUTOPOWEROFF" | tr -cd "[0-9]")
	shutdown -hP 0
	sleep 10
	poweroff
fi

exit 0
