diff --git a/usr/bin/archboot-aarch64-pacman-chroot-tarball.sh b/usr/bin/archboot-aarch64-pacman-chroot-tarball.sh deleted file mode 120000 index fc93ac8c9..000000000 --- a/usr/bin/archboot-aarch64-pacman-chroot-tarball.sh +++ /dev/null @@ -1 +0,0 @@ -../lib/archboot/run/chroot-tarball.sh \ No newline at end of file diff --git a/usr/bin/archboot-aarch64-pacman-chroot-tarball.sh b/usr/bin/archboot-aarch64-pacman-chroot-tarball.sh new file mode 100755 index 000000000..4c21cb2ab --- /dev/null +++ b/usr/bin/archboot-aarch64-pacman-chroot-tarball.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-3.0-or-later +# created by Tobias Powalowski +. /etc/archboot/defaults +. /usr/lib/archboot/common.sh +. /usr/lib/archboot/container.sh +if echo "${_BASENAME}" | grep -qw aarch64; then + _PACMAN_ARCH_CHROOT="${_PACMAN_AARCH64_CHROOT}" + _PACMAN_ARCH="${_PACMAN_AARCH64}" + _ARCH_VERSION="ArchLinuxARM-aarch64-latest.tar.gz" + _SERVER_PACMAN_ARCH="${_SERVER_PACMAN_AARCH64}" + _LATEST_ARCH="http://os.archlinuxarm.org/os/${_ARCH_VERSION}" + _CAP_ARCH="AARCH64" + _ARCH="aarch64" +elif echo "${_BASENAME}" | grep -qw riscv64; then + _PACMAN_ARCH_CHROOT="${_PACMAN_RISCV64_CHROOT}" + _PACMAN_ARCH="${_PACMAN_RISCV64}" + _ARCH_VERSION="archriscv-20220727.tar.zst" + _SERVER_PACMAN_ARCH="${_SERVER_PACMAN_RISCV64}" + _LATEST_ARCH="https://archriscv.felixc.at/images/${_ARCH_VERSION}" + _CAP_ARCH="RISCV64" + _ARCH="riscv64" +fi + +_usage () { + echo "CREATE ${_CAP_ARCH} PACMAN CHROOT" + echo "-----------------------------" + echo "This will create the ${_ARCH} pacman chroot tarball." + echo "usage: ${_BASENAME} " + exit 0 +} + +[[ -z "${1}" ]] && _usage + +_root_check + +echo "Starting container creation..." +# remove old files +[[ -f ${_PACMAN_ARCH_CHROOT} ]] && rm "${_PACMAN_ARCH_CHROOT}"{,.sig} 2>"${_NO_LOG}" +echo "Creating directory ${1}..." +mkdir -p "${1}"/"${_PACMAN_ARCH}" +echo "Downloading archlinux ${_ARCH}..." +! [[ -f ${_ARCH_VERSION} ]] && "${_DLPROG}" "${_LATEST_ARCH}" &>"${_NO_LOG}" +bsdtar -xf "${_ARCH_VERSION}" -C "${1}" +echo "Removing installation tarball..." +rm "${_ARCH_VERSION}" +sed -i -e '/^\[community\]/ { n ; s/^/#/ }' "${1}"/etc/pacman.conf +sed -i -e 's:^\[community\]:#\[community\]:g' "${1}"/etc/pacman.conf +_generate_keyring "${1}" || exit 1 +_fix_network "${1}" +# update container to latest packages +echo "Installing pacman to container..." +mkdir -p "${1}/${_PACMAN_ARCH}/var/lib/pacman" +#shellcheck disable=SC2086 +systemd-nspawn -D "${1}" pacman --root "/${_PACMAN_ARCH}" -Sy awk ${_KEYRING} --ignore systemd-resolvconf --noconfirm &>"${_NO_LOG}" +_generate_keyring "${1}/${_PACMAN_ARCH}" || exit 1 +_fix_network "${1}/${_PACMAN_ARCH}" +_CLEANUP_CONTAINER="1" _clean_container "${1}/${_PACMAN_ARCH}" 2>"${_NO_LOG}" +_CLEANUP_CACHE="1" _clean_cache "${1}/${_PACMAN_ARCH}" 2>"${_NO_LOG}" +echo "Generating tarball..." +tar -acf "${_PACMAN_ARCH_CHROOT}" -C "${1}"/"${_PACMAN_ARCH}" . &>"${_NO_LOG}" || exit 1 +echo "Removing ${1}..." +rm -r "${1}" +echo "Finished container tarball." +echo "Signing tarball..." +#shellcheck disable=SC2086 +sudo -u "${_USER}" gpg ${_GPG} ${_PACMAN_ARCH_CHROOT} || exit 1 +chown "${_USER}":"${_GROUP}" "${_PACMAN_ARCH_CHROOT}"{,.sig} || exit 1 +echo "Uploading tarball to ${_SERVER}:${_SERVER_PACMAN_ARCH}..." +sudo -u "${_USER}" scp "${_PACMAN_ARCH_CHROOT}"{,.sig} "${_SERVER}:${_SERVER_PACMAN_ARCH}" || exit 1 +echo "Finished." +# vim: set ft=sh ts=4 sw=4 et: diff --git a/usr/bin/archboot-clock.sh b/usr/bin/archboot-clock.sh index 136f1e037..180528874 100755 --- a/usr/bin/archboot-clock.sh +++ b/usr/bin/archboot-clock.sh @@ -86,7 +86,7 @@ _check _SET_TIME="" # automatic setup if ping -c1 www.google.com &>"${_NO_LOG}"; then - _ZONE="$(curl -s "http://ip-api.com/csv/?fields=timezone")" + _ZONE="$("${_DLPROG}" "http://ip-api.com/csv/?fields=timezone")" _auto_clock | _dialog --title " Clock Configuration " --no-mouse --gauge "Using ${_ZONE} and enable NTP timesyncd..." 6 70 0 _SET_TIME="1" fi diff --git a/usr/bin/archboot-pacsetup.sh b/usr/bin/archboot-pacsetup.sh index 6b5fb7240..c61183b84 100755 --- a/usr/bin/archboot-pacsetup.sh +++ b/usr/bin/archboot-pacsetup.sh @@ -20,7 +20,7 @@ _download_mirror() { _select_mirror() { # Download updated mirrorlist, if possible (only on x86_64) if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then - _COUNTRY="$(curl -s "http://ip-api.com/csv/?fields=countryCode")" + _COUNTRY="$("${_DLPROG}" "http://ip-api.com/csv/?fields=countryCode")" _DOWNLOAD="Downloading latest mirrorlist for Region ${_COUNTRY}..." _download_mirror | _dialog --title " Pacman Configuration " --no-mouse --gauge "${_DOWNLOAD}" 6 70 0 if grep -q '#Server = https:' /tmp/pacman_mirrorlist.txt; then diff --git a/usr/bin/archboot-riscv64-pacman-chroot-tarball.sh b/usr/bin/archboot-riscv64-pacman-chroot-tarball.sh deleted file mode 120000 index fc93ac8c9..000000000 --- a/usr/bin/archboot-riscv64-pacman-chroot-tarball.sh +++ /dev/null @@ -1 +0,0 @@ -../lib/archboot/run/chroot-tarball.sh \ No newline at end of file diff --git a/usr/bin/archboot-riscv64-pacman-chroot-tarball.sh b/usr/bin/archboot-riscv64-pacman-chroot-tarball.sh new file mode 100755 index 000000000..4c21cb2ab --- /dev/null +++ b/usr/bin/archboot-riscv64-pacman-chroot-tarball.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-3.0-or-later +# created by Tobias Powalowski +. /etc/archboot/defaults +. /usr/lib/archboot/common.sh +. /usr/lib/archboot/container.sh +if echo "${_BASENAME}" | grep -qw aarch64; then + _PACMAN_ARCH_CHROOT="${_PACMAN_AARCH64_CHROOT}" + _PACMAN_ARCH="${_PACMAN_AARCH64}" + _ARCH_VERSION="ArchLinuxARM-aarch64-latest.tar.gz" + _SERVER_PACMAN_ARCH="${_SERVER_PACMAN_AARCH64}" + _LATEST_ARCH="http://os.archlinuxarm.org/os/${_ARCH_VERSION}" + _CAP_ARCH="AARCH64" + _ARCH="aarch64" +elif echo "${_BASENAME}" | grep -qw riscv64; then + _PACMAN_ARCH_CHROOT="${_PACMAN_RISCV64_CHROOT}" + _PACMAN_ARCH="${_PACMAN_RISCV64}" + _ARCH_VERSION="archriscv-20220727.tar.zst" + _SERVER_PACMAN_ARCH="${_SERVER_PACMAN_RISCV64}" + _LATEST_ARCH="https://archriscv.felixc.at/images/${_ARCH_VERSION}" + _CAP_ARCH="RISCV64" + _ARCH="riscv64" +fi + +_usage () { + echo "CREATE ${_CAP_ARCH} PACMAN CHROOT" + echo "-----------------------------" + echo "This will create the ${_ARCH} pacman chroot tarball." + echo "usage: ${_BASENAME} " + exit 0 +} + +[[ -z "${1}" ]] && _usage + +_root_check + +echo "Starting container creation..." +# remove old files +[[ -f ${_PACMAN_ARCH_CHROOT} ]] && rm "${_PACMAN_ARCH_CHROOT}"{,.sig} 2>"${_NO_LOG}" +echo "Creating directory ${1}..." +mkdir -p "${1}"/"${_PACMAN_ARCH}" +echo "Downloading archlinux ${_ARCH}..." +! [[ -f ${_ARCH_VERSION} ]] && "${_DLPROG}" "${_LATEST_ARCH}" &>"${_NO_LOG}" +bsdtar -xf "${_ARCH_VERSION}" -C "${1}" +echo "Removing installation tarball..." +rm "${_ARCH_VERSION}" +sed -i -e '/^\[community\]/ { n ; s/^/#/ }' "${1}"/etc/pacman.conf +sed -i -e 's:^\[community\]:#\[community\]:g' "${1}"/etc/pacman.conf +_generate_keyring "${1}" || exit 1 +_fix_network "${1}" +# update container to latest packages +echo "Installing pacman to container..." +mkdir -p "${1}/${_PACMAN_ARCH}/var/lib/pacman" +#shellcheck disable=SC2086 +systemd-nspawn -D "${1}" pacman --root "/${_PACMAN_ARCH}" -Sy awk ${_KEYRING} --ignore systemd-resolvconf --noconfirm &>"${_NO_LOG}" +_generate_keyring "${1}/${_PACMAN_ARCH}" || exit 1 +_fix_network "${1}/${_PACMAN_ARCH}" +_CLEANUP_CONTAINER="1" _clean_container "${1}/${_PACMAN_ARCH}" 2>"${_NO_LOG}" +_CLEANUP_CACHE="1" _clean_cache "${1}/${_PACMAN_ARCH}" 2>"${_NO_LOG}" +echo "Generating tarball..." +tar -acf "${_PACMAN_ARCH_CHROOT}" -C "${1}"/"${_PACMAN_ARCH}" . &>"${_NO_LOG}" || exit 1 +echo "Removing ${1}..." +rm -r "${1}" +echo "Finished container tarball." +echo "Signing tarball..." +#shellcheck disable=SC2086 +sudo -u "${_USER}" gpg ${_GPG} ${_PACMAN_ARCH_CHROOT} || exit 1 +chown "${_USER}":"${_GROUP}" "${_PACMAN_ARCH_CHROOT}"{,.sig} || exit 1 +echo "Uploading tarball to ${_SERVER}:${_SERVER_PACMAN_ARCH}..." +sudo -u "${_USER}" scp "${_PACMAN_ARCH_CHROOT}"{,.sig} "${_SERVER}:${_SERVER_PACMAN_ARCH}" || exit 1 +echo "Finished." +# vim: set ft=sh ts=4 sw=4 et: diff --git a/usr/bin/archboot-secureboot-keys.sh b/usr/bin/archboot-secureboot-keys.sh index d33fa69ce..46165aa22 100755 --- a/usr/bin/archboot-secureboot-keys.sh +++ b/usr/bin/archboot-secureboot-keys.sh @@ -48,8 +48,8 @@ if [[ -n "${_DIR}" ]]; then ${NAME} EOF # download MS Certificates, else EFI might get broken! - curl -s -L -O https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt - curl -s -L -O https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt + "${_DLPROG}" -L -O https://www.microsoft.com/pkiops/certs/MicWinProPCA2011_2011-10-19.crt + "${_DLPROG}" -L -O https://www.microsoft.com/pkiops/certs/MicCorUEFCA2011_2011-06-27.crt sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_Win_db.esl MicWinProPCA2011_2011-10-19.crt sbsiglist --owner 77fa9abd-0359-4d32-bd60-28f4e78f784b --type x509 --output MS_UEFI_db.esl MicCorUEFCA2011_2011-06-27.crt cat MS_Win_db.esl MS_UEFI_db.esl > MS_db.esl diff --git a/usr/lib/archboot/bootloader.sh b/usr/lib/archboot/bootloader.sh index 743216315..877b303a6 100644 --- a/usr/lib/archboot/bootloader.sh +++ b/usr/lib/archboot/bootloader.sh @@ -15,9 +15,9 @@ _GRUB_ISO="/usr/share/archboot/grub/archboot-iso-grub.cfg" _prepare_shim_files () { # download packages from fedora server echo "Downloading fedora shim..." - curl -s --create-dirs -L -O --output-dir "${_SHIM}" ${_SHIM_URL}/${_SHIM_RPM} || exit 1 - curl -s --create-dirs -L -O --output-dir "${_SHIM32}" ${_SHIM_URL}/${_SHIM32_RPM} || exit 1 - curl -s --create-dirs -L -O --output-dir "${_SHIMAA64}" ${_SHIM_URL}/${_SHIM_AA64_RPM} || exit 1 + "${_DLPROG}" --create-dirs -L -O --output-dir "${_SHIM}" ${_SHIM_URL}/${_SHIM_RPM} || exit 1 + "${_DLPROG}" --create-dirs -L -O --output-dir "${_SHIM32}" ${_SHIM_URL}/${_SHIM32_RPM} || exit 1 + "${_DLPROG}" --create-dirs -L -O --output-dir "${_SHIMAA64}" ${_SHIM_URL}/${_SHIM_AA64_RPM} || exit 1 # unpack rpm echo "Unpacking rpms..." bsdtar -C "${_SHIM}" -xf "${_SHIM}"/*.rpm diff --git a/usr/lib/archboot/common.sh b/usr/lib/archboot/common.sh index e539c7772..28096eef3 100644 --- a/usr/lib/archboot/common.sh +++ b/usr/lib/archboot/common.sh @@ -8,7 +8,7 @@ _LOG="/dev/tty11" _NO_LOG="/dev/null" _ANSWER="/.${_BASENAME}" _LABEL="Exit" -_DLPROG="wget -q" +_DLPROG="curl -s" _MIRRORLIST="/etc/pacman.d/mirrorlist" _KERNELPKG="linux" _KEYRING="archlinux-keyring" diff --git a/usr/lib/archboot/container.sh b/usr/lib/archboot/container.sh index 30accbc7f..9f31f2212 100644 --- a/usr/lib/archboot/container.sh +++ b/usr/lib/archboot/container.sh @@ -43,7 +43,7 @@ _clean_cache() { _pacman_chroot() { if ! [[ -f ${3} && -f ${3}.sig ]]; then echo "Downloading ${3}..." - wget "${2}"/"${3}"{,.sig} &>"${_NO_LOG}" + "${_DLPROG} ""${2}"/"${3}"{,.sig} &>"${_NO_LOG}" else echo "Using local ${3}..." fi diff --git a/usr/lib/archboot/release.sh b/usr/lib/archboot/release.sh index 4974c13d8..cbee361c7 100644 --- a/usr/lib/archboot/release.sh +++ b/usr/lib/archboot/release.sh @@ -47,8 +47,8 @@ _create_iso() { # generate local iso in container #if [[ "${_ARCH}" == "x86_64" ]]; then # echo "Adding custom grub..." - # wget -q "https://archboot.com/src/grub/grub-2:2.06.r533.g78bc9a9b2-1-x86_64.pkg.tar.zst" -P "${_W_DIR}/var/cache/pacman/pkg" - # wget -q "https://archboot.com/src/grub/grub-2:2.06.r533.g78bc9a9b2-1-x86_64.pkg.tar.zst.sig" -P "${_W_DIR}/var/cache/pacman/pkg" + # "${_DLPROG} ""https://archboot.com/src/grub/grub-2:2.06.r533.g78bc9a9b2-1-x86_64.pkg.tar.zst" -P "${_W_DIR}/var/cache/pacman/pkg" + # "${_DLPROG} ""https://archboot.com/src/grub/grub-2:2.06.r533.g78bc9a9b2-1-x86_64.pkg.tar.zst.sig" -P "${_W_DIR}/var/cache/pacman/pkg" #fi ${_NSPAWN} "${_W_DIR}" /bin/bash -c "umount /tmp;rm -rf /tmp/*;archboot-${_ARCH}-iso.sh -g -s \ -c=${_CONFIG_LOCAL} -i=${_ISONAME}-local-${_ARCH}" || exit 1 diff --git a/usr/lib/archboot/run/chroot-tarball.sh b/usr/lib/archboot/run/chroot-tarball.sh index b4c6d7ef8..ef3b08996 100755 --- a/usr/lib/archboot/run/chroot-tarball.sh +++ b/usr/lib/archboot/run/chroot-tarball.sh @@ -40,7 +40,7 @@ echo "Starting container creation..." echo "Creating directory ${1}..." mkdir -p "${1}"/"${_PACMAN_ARCH}" echo "Downloading archlinux ${_ARCH}..." -! [[ -f ${_ARCH_VERSION} ]] && wget "${_LATEST_ARCH}" &>"${_NO_LOG}" +! [[ -f ${_ARCH_VERSION} ]] && "${_DLPROG} ""${_LATEST_ARCH}" &>"${_NO_LOG}" bsdtar -xf "${_ARCH_VERSION}" -C "${1}" echo "Removing installation tarball..." rm "${_ARCH_VERSION}" diff --git a/usr/lib/archboot/server.sh b/usr/lib/archboot/server.sh index d9aaf54c1..b933a4cea 100644 --- a/usr/lib/archboot/server.sh +++ b/usr/lib/archboot/server.sh @@ -22,7 +22,7 @@ _update_pacman_chroot() { [[ -d "${_ARCH_DIR}" ]] || mkdir "${_ARCH_DIR}" echo "Downloading pacman ${_ARCH} chroot..." [[ -f pacman-${_ARCH}-chroot-latest.tar.zst ]] && rm pacman-"${_ARCH}"-chroot-latest.tar.zst{,.sig} 2>"${_NO_LOG}" - wget "${_ARCH_CHROOT_PUBLIC}"/"${_PACMAN_CHROOT}"{,.sig} &>"${_NO_LOG}" + "${_DLPROG} ""${_ARCH_CHROOT_PUBLIC}"/"${_PACMAN_CHROOT}"{,.sig} &>"${_NO_LOG}" # verify download #shellcheck disable=SC2024 sudo -u "${_USER}" gpg --verify "${_PACMAN_CHROOT}.sig" &>"${_NO_LOG}" || exit 1 diff --git a/usr/lib/archboot/update/manage.sh b/usr/lib/archboot/update/manage.sh index edd8f3c0c..d9fab5cc8 100644 --- a/usr/lib/archboot/update/manage.sh +++ b/usr/lib/archboot/update/manage.sh @@ -137,36 +137,36 @@ _create_initramfs() { _download_latest_task() { # config - wget -q "${_SOURCE}${_ETC}/defaults?inline=false" -O "${_ETC}/defaults" + "${_DLPROG} ""${_SOURCE}${_ETC}/defaults?inline=false" -O "${_ETC}/defaults" # helper binaries # main binaries _SCRIPTS="quickinst setup clock launcher localize network pacsetup update copy-mountpoint rsync-backup restore-usbstick" for i in ${_SCRIPTS}; do - [[ -e "${_BIN}/${i}" ]] && wget -q "${_SOURCE}${_BIN}/archboot-${i}.sh?inline=false" -O "${_BIN}/${i}" + [[ -e "${_BIN}/${i}" ]] && "${_DLPROG} ""${_SOURCE}${_BIN}/archboot-${i}.sh?inline=false" -O "${_BIN}/${i}" done _SCRIPTS="binary-check.sh not-installed.sh secureboot-keys.sh mkkeys.sh hwsim.sh cpio,sh" for i in ${_SCRIPTS}; do - [[ -e "${_BIN}/${i}" ]] && wget -q "${_SOURCE}${_BIN}/archboot-${i}?inline=false" -O "${_BIN}/${i}" - [[ -e "${_BIN}/archboot-${i}" ]] && wget -q "${_SOURCE}${_BIN}/archboot-${i}?inline=false" -O "${_BIN}/archboot-${i}" + [[ -e "${_BIN}/${i}" ]] && "${_DLPROG} ""${_SOURCE}${_BIN}/archboot-${i}?inline=false" -O "${_BIN}/${i}" + [[ -e "${_BIN}/archboot-${i}" ]] && "${_DLPROG} ""${_SOURCE}${_BIN}/archboot-${i}?inline=false" -O "${_BIN}/archboot-${i}" done _TXT="guid-partition.txt guid.txt luks.txt lvm2.txt mbr-partition.txt md.txt" for i in ${_TXT}; do - [[ -e "${_HELP}/${i}" ]] && wget -q "${_SOURCE}${_HELP}/${i}?inline=false" -O "${_HELP}/${i}" + [[ -e "${_HELP}/${i}" ]] && "${_DLPROG} ""${_SOURCE}${_HELP}/${i}?inline=false" -O "${_HELP}/${i}" done # main libs LIBS="common.sh container.sh release.sh iso.sh login.sh cpio.sh" for i in ${LIBS}; do - wget -q "${_SOURCE}${_LIB}/${i}?inline=false" -O "${_LIB}/${i}" + "${_DLPROG} ""${_SOURCE}${_LIB}/${i}?inline=false" -O "${_LIB}/${i}" done # update libs LIBS="update.sh manage.sh desktop.sh xfce.sh gnome.sh plasma.sh sway.sh" for i in ${LIBS}; do - wget -q "${_SOURCE}${_UPDATE}/${i}?inline=false" -O "${_UPDATE}/${i}" + "${_DLPROG} ""${_SOURCE}${_UPDATE}/${i}?inline=false" -O "${_UPDATE}/${i}" done # run libs LIBS="container.sh release.sh" for i in ${LIBS}; do - wget -q "${_SOURCE}${_RUN}/${i}?inline=false" -O "${_RUN}/${i}" + "${_DLPROG} ""${_SOURCE}${_RUN}/${i}?inline=false" -O "${_RUN}/${i}" done # setup libs LIBS="autoconfiguration.sh quicksetup.sh base.sh blockdevices.sh bootloader.sh \ @@ -175,7 +175,7 @@ _download_latest_task() { bootloader_systemd_services.sh bootloader_uboot.sh btrfs.sh common.sh \ configuration.sh mountpoints.sh network.sh pacman.sh partition.sh storage.sh" for i in ${LIBS}; do - wget -q "${_SOURCE}${_INST}/${i}?inline=false" -O "${_INST}/${i}" + "${_DLPROG} ""${_SOURCE}${_INST}/${i}?inline=false" -O "${_INST}/${i}" done rm /.archboot } diff --git a/usr/lib/initcpio/install/archboot_net_common b/usr/lib/initcpio/install/archboot_net_common index 81a4699bd..adcaa7e94 100644 --- a/usr/lib/initcpio/install/archboot_net_common +++ b/usr/lib/initcpio/install/archboot_net_common @@ -5,11 +5,10 @@ build () { add_all_modules -f '_cs|b44|broadcom/bnx2x|brocade|cavium|chelsio|cisco|netronome|mellanox|myricom|qlogic|qualcomm' '/drivers/net/ethernet|/net/ipv4|/net/ipv6|/drivers/net/usb' - map add_binary ip getent ping wget + map add_binary ip getent ping add_file /usr/bin/archboot-network.sh /usr/bin/network # start dhcpcd on startup add_file "/usr/share/archboot/net/etc/systemd/network/10-wired-auto-dhcp.network" "/etc/systemd/network/10-wired-auto-dhcp.network" - add_file /etc/wgetrc } help ()