commit ebedfd152f090dd482807122442f499d654b0e77 Author: example <1916008@saec.ac.in> Date: Fri Dec 26 14:48:22 2025 +0530 Initial commit on 26 December, 2025 diff --git a/.env b/.env new file mode 100644 index 0000000..0a592df --- /dev/null +++ b/.env @@ -0,0 +1,4 @@ +DB_URL=jdbc:oracle:thin:@10.1.0.14:1521:chncorp +DB_USERNAME=fileadjust +DB_PASSWORD=fileadjust +FORCE_HTTPS=false \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ccf0dc7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +HELP.md +target/ +.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Logs ### +log/ +logs/ +*.log + +### File Uploads ### +uploads/file-data/* +!uploads/file-data/.gitkeep \ No newline at end of file diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..c0bcafe --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip diff --git a/mvnw b/mvnw new file mode 100644 index 0000000..bd8896b --- /dev/null +++ b/mvnw @@ -0,0 +1,295 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.4 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" + +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi +fi + +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi + +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..92450f9 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,189 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.4 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' + +$MAVEN_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ecc9884 --- /dev/null +++ b/pom.xml @@ -0,0 +1,125 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.9 + + + com.adjustment-file-management-system + adjustment-file-management-system + 0.0.1-SNAPSHOT + adjustment-file-management-system + Springboot Project For Adjustment File Management System + + + + + + + + + + + + + + + 21 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + org.springframework.boot + spring-boot-starter-data-rest + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.oracle.database.jdbc + ojdbc11 + runtime + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-test + test + + + io.github.cdimascio + java-dotenv + 5.2.2 + + + + + adjustment-file-management-system + + + org.apache.maven.plugins + maven-compiler-plugin + + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/adjustment_file_management_system/springboot/AdjustmentFileManagementSystemApplication.java b/src/main/java/com/adjustment_file_management_system/springboot/AdjustmentFileManagementSystemApplication.java new file mode 100644 index 0000000..0d941d4 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/AdjustmentFileManagementSystemApplication.java @@ -0,0 +1,32 @@ +package com.adjustment_file_management_system.springboot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +import com.adjustment_file_management_system.springboot.configuration.LogFolderInitializer; +import com.adjustment_file_management_system.springboot.configuration.LogReadyInitializer; + +import io.github.cdimascio.dotenv.Dotenv; +import io.github.cdimascio.dotenv.DotenvEntry; + +@SpringBootApplication +@EnableJpaAuditing(auditorAwareRef = "auditorAware") +public class AdjustmentFileManagementSystemApplication { + + static { + Dotenv dotEnv = Dotenv.configure().ignoreIfMissing().load(); + for(DotenvEntry entry : dotEnv.entries()) { + System.setProperty(entry.getKey(), entry.getValue()); + } + } + + public static void main(String[] args) { + SpringApplication app = new SpringApplication(AdjustmentFileManagementSystemApplication.class); + // Register pre-logging and post-logging listeners + app.addListeners(new LogFolderInitializer()); // creates logs folder & initial file + app.addListeners(new LogReadyInitializer()); // logs a startup info message + app.run(args); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/ApplicationConfiguration.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/ApplicationConfiguration.java new file mode 100644 index 0000000..aae20bd --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/ApplicationConfiguration.java @@ -0,0 +1,16 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Configuration +public class ApplicationConfiguration { + + @Bean + PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(12); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/AuditorAwareConfiguration.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/AuditorAwareConfiguration.java new file mode 100644 index 0000000..1647687 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/AuditorAwareConfiguration.java @@ -0,0 +1,42 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.AuditorAware; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import com.adjustment_file_management_system.springboot.model.AppUser; +import com.adjustment_file_management_system.springboot.repository.AppUserRepository; + +@Component("auditorAware") +public class AuditorAwareConfiguration implements AuditorAware { + + @Autowired + private AppUserRepository appUsrRepo; + + @Override + @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true) + public Optional getCurrentAuditor() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication == null || !authentication.isAuthenticated()) { + return Optional.empty(); + } + + // If it's already AppUser, no need to hit DB + Object principal = authentication.getPrincipal(); + if (principal instanceof AppUser user) { + return Optional.of(user); + } + + // Fetch AppUser from DB using username + String username = authentication.getName(); + return appUsrRepo.findByUsrName(username); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/CustomAuthenticationProvider.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/CustomAuthenticationProvider.java new file mode 100644 index 0000000..c8c0e92 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/CustomAuthenticationProvider.java @@ -0,0 +1,44 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Component; + +import com.adjustment_file_management_system.springboot.service.HomeService; + +@Component +public class CustomAuthenticationProvider implements AuthenticationProvider { + + @Autowired + private HomeService homeSer; + + @Autowired + private PasswordEncoder passEncode; + + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + String username = authentication.getName(); + String password = authentication.getCredentials().toString(); + + UserDetails usrDets = homeSer.loadUserByUsername(username); // throws UsernameNotFoundException if not found + + if (!passEncode.matches(password, usrDets.getPassword())) { + throw new BadCredentialsException("Invalid username or password"); + } + + return new UsernamePasswordAuthenticationToken(usrDets.getUsername(), usrDets.getPassword(), + usrDets.getAuthorities()); + } + + @Override + public boolean supports(Class authentication) { + return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/FileDataProperties.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/FileDataProperties.java new file mode 100644 index 0000000..ea39876 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/FileDataProperties.java @@ -0,0 +1,15 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import lombok.Getter; +import lombok.Setter; + +@Component +@Getter +@Setter +@ConfigurationProperties(prefix = "file.data") +public class FileDataProperties { + private String uploadDir; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/FileDataPropertiesConfiguration.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/FileDataPropertiesConfiguration.java new file mode 100644 index 0000000..b06eff9 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/FileDataPropertiesConfiguration.java @@ -0,0 +1,64 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import java.io.File; +import java.nio.file.Paths; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.system.ApplicationHome; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import jakarta.annotation.PostConstruct; +import lombok.Getter; + +@Configuration +@Getter +public class FileDataPropertiesConfiguration implements WebMvcConfigurer { + + @Autowired + private FileDataProperties fileDataProps; + + private File uploadDirFile; + + private static final Logger logger = LoggerFactory.getLogger(FileDataPropertiesConfiguration.class); + + @PostConstruct + public void init() { + try { + File baseDir; + ApplicationHome home = new ApplicationHome(FileDataPropertiesConfiguration.class); + + if (home.getSource() != null && home.getSource().isFile() && home.getSource().getName().endsWith(".jar")) { + // Running as a packaged JAR + baseDir = home.getDir(); + } else { + // Running from IDE -> use project root instead of target/classes + baseDir = new File(System.getProperty("user.dir")); + } + + // Create /images/product relative to baseDir + uploadDirFile = Paths.get(baseDir.getAbsolutePath(), fileDataProps.getUploadDir()).toFile(); + + if (!uploadDirFile.exists()) { + boolean created = uploadDirFile.mkdirs(); + if (created) { + logger.info("Created upload directory at: {}", uploadDirFile.getAbsolutePath()); + } else { + logger.error("Failed to create upload directory at: {}", uploadDirFile.getAbsolutePath()); + } + } + } catch (Exception e) { + logger.error("Exception in ProductImagePropertiesConfiguration.init(): {}", e.getMessage(), e); + } + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + String fullPath = uploadDirFile.toURI().toString(); + registry.addResourceHandler("uploads/file-data/**").addResourceLocations(fullPath); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/LogFolderInitializer.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/LogFolderInitializer.java new file mode 100644 index 0000000..537ef2b --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/LogFolderInitializer.java @@ -0,0 +1,100 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import org.springframework.boot.context.event.ApplicationStartingEvent; +import org.springframework.boot.system.ApplicationHome; +import org.springframework.context.ApplicationListener; +import org.springframework.util.ClassUtils; + +public class LogFolderInitializer implements ApplicationListener { + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public void onApplicationEvent(ApplicationStartingEvent event) { + File logFile = null; + try { + // Determine safe base folder + File baseDir = determineBaseFolder(); + + // Create logs folder + File logsDir = new File(baseDir, "logs"); + if (!logsDir.exists() && !logsDir.mkdirs()) { + writeError(logsDir, "Failed to create logs folder at: " + logsDir.getAbsolutePath(), null); + } + + // Create initial log file + logFile = new File(logsDir, "app-logs.txt"); + if (!logFile.exists()) { + logFile.createNewFile(); + } + + // Log pre-start messages + writeInfo(logFile, "Created log file at: " + logFile.getAbsolutePath()); + writeInfo(logFile, "LOG_ROOT set to: " + logsDir.getAbsolutePath()); + + // Set system property for logback-spring.xml + System.setProperty("LOG_ROOT", logsDir.getAbsolutePath()); + + } catch (IOException ioe) { + writeError(logFile, "Failed to create logs folder/file", ioe); + } + } + + /** Determine a safe base folder for logs/uploads */ + private File determineBaseFolder() { + try { + boolean devtoolsActive = ClassUtils.isPresent("org.springframework.boot.devtools.restart.RestartLauncher", + this.getClass().getClassLoader()); + + if (devtoolsActive) { + // IDE development: use user.dir (project root) to avoid DevTools restart loop + return new File(System.getProperty("user.dir")); + } else { + // JAR deployment: use folder containing the JAR + ApplicationHome home = new ApplicationHome(LogFolderInitializer.class); + return home.getDir(); + } + + } catch (Exception e) { + // Last resort: use temp directory + File tmpDir = new File(System.getProperty("java.io.tmpdir")); + tmpDir.mkdirs(); + return tmpDir; + } + } + + private void writeInfo(File logFile, String message) { + String timestamp = LocalDateTime.now().format(formatter); + if (logFile != null) { + try (PrintWriter pw = new PrintWriter(new FileWriter(logFile, true))) { + pw.println(timestamp + " INFO " + message); + } catch (IOException e) { + System.err.println(timestamp + " ERROR Failed to write INFO to log file: " + e.getMessage()); + } + } + System.out.println(timestamp + " INFO " + message); + } + + private void writeError(File logFile, String message, Throwable t) { + String timestamp = LocalDateTime.now().format(formatter); + if (logFile != null) { + try (PrintWriter pw = new PrintWriter(new FileWriter(logFile, true))) { + pw.println(timestamp + " ERROR " + message); + if (t != null) + t.printStackTrace(pw); + } catch (IOException e) { + System.err.println(timestamp + " ERROR Failed to write ERROR to log file: " + e.getMessage()); + } + } + System.err.println(timestamp + " ERROR " + message); + if (t != null) + t.printStackTrace(System.err); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/LogReadyInitializer.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/LogReadyInitializer.java new file mode 100644 index 0000000..49d02a7 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/LogReadyInitializer.java @@ -0,0 +1,18 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; + +public class LogReadyInitializer implements ApplicationListener { + + private static final Logger logger = LoggerFactory.getLogger(LogReadyInitializer.class); + + @Override + public void onApplicationEvent(ApplicationReadyEvent event) { + // TODO Auto-generated method stub + logger.info("Log folder and initial log file are ready at: {}", System.getProperty("LOG_ROOT")); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/configuration/SecurityConfiguration.java b/src/main/java/com/adjustment_file_management_system/springboot/configuration/SecurityConfiguration.java new file mode 100644 index 0000000..58c4f1e --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/configuration/SecurityConfiguration.java @@ -0,0 +1,90 @@ +package com.adjustment_file_management_system.springboot.configuration; + +import static org.springframework.security.config.Customizer.withDefaults; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; + +@Configuration +@EnableWebSecurity +public class SecurityConfiguration { + + private final CustomAuthenticationProvider custAuthProvider; + + public SecurityConfiguration(CustomAuthenticationProvider custAuthenProvider) { + this.custAuthProvider = custAuthenProvider; + } + + @Value("${app.security.force-https}") + private boolean isForceHttps; + + // List of all admin-only endpoints + private final List adminEndpoints = List.of("/home", "/redirect", "/file/upd-adjust", "/file/add-file", + "/file/upd-ejv-num", "/file/upd-file", "/file/view-file"); + + // --- AUTHENTICATION MANAGER (NO DEPRECATION) --- + @Bean + AuthenticationManager authManager(HttpSecurity http) throws Exception { + return http.getSharedObject(AuthenticationManagerBuilder.class).authenticationProvider(custAuthProvider) + .build(); + } + + // Return 404 for unauthenticated requests to admin endpoints + private final AuthenticationEntryPoint notFoundEntryPoint = (req, res, authException) -> { + if (adminEndpoints.contains(req.getRequestURI())) { + res.sendError(404); // hide existence + } else { + res.sendRedirect("/"); // fallback for login for other endpoints + } + }; + + // Return 404 for access denied on admin endpoints + private final AccessDeniedHandler adminNotFoundAccessDeniedHandler = (req, res, accessDeniedException) -> { + if (adminEndpoints.contains(req.getRequestURI())) { + res.sendError(404); // hide existence + } else { + res.sendRedirect("/"); // fallback for login for other endpoints + } + }; + + // disable default login form + @Bean + SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + // CSRF with Cookie repository for forms + AJAX + http.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())); + + // Force HTTPS if enabled + if (isForceHttps) { + http.redirectToHttps(withDefaults()); + } + + // Admin-only endpoints and general authorization + http.authorizeHttpRequests( + auth -> auth + .requestMatchers("/home", "/redirect", "/file/upd-adjust", "/file/add-file", + "/file/upd-ejv-num", "/file/upd-file", "/file/view-file") + .hasRole("ADMIN").anyRequest().permitAll()); + + // Custom access handlers + http.exceptionHandling(exceptionHandler -> exceptionHandler.authenticationEntryPoint(notFoundEntryPoint) + .accessDeniedHandler(adminNotFoundAccessDeniedHandler)); + + // Custom login and logout + http.formLogin(form -> form.loginPage("/").failureUrl("/").permitAll()) + .logout(logout -> logout.logoutUrl("/usr-logout").logoutSuccessUrl("/").invalidateHttpSession(true) + .clearAuthentication(true).permitAll()); + + return http.build(); + } +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/controller/FileDataController.java b/src/main/java/com/adjustment_file_management_system/springboot/controller/FileDataController.java new file mode 100644 index 0000000..47c000c --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/controller/FileDataController.java @@ -0,0 +1,82 @@ +package com.adjustment_file_management_system.springboot.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.adjustment_file_management_system.springboot.response_dto.FileDataResponseDTO; +import com.adjustment_file_management_system.springboot.response_dto.FundTypeResponseDTO; +import com.adjustment_file_management_system.springboot.service.FileDataService; + +@Controller +@RequestMapping("/file") +public class FileDataController { + + @Autowired + private FileDataService fileDataSer; + + @GetMapping("/view-file-det") + public String viewFileDetails(Model model, @RequestParam("file-num") String fileNum) { + FileDataResponseDTO fileDataResDTO = fileDataSer.getFileDataByFileNum(fileNum); + model.addAttribute("fileDatum", fileDataResDTO); + model.addAttribute("curPage", "view-file-det"); + return "file/view-file-detail"; + } + + @GetMapping("/add-file") + public String addFile(Model model) { + List fundTypeResDTOs = fileDataSer.getAllFundTypes(); + model.addAttribute("fundTypes", fundTypeResDTOs); + model.addAttribute("curPage", "add-file"); + return "file/add-file"; + } + + @GetMapping("/upd-ejv-num") + public String updEjvNum(Model model) { + List> fileDatum = fileDataSer.getAllFileData().stream().map(fileData -> { + Map fileDataMapObj = new HashMap(); + fileDataMapObj.put("fileNum", fileData.getFileDataNum()); + boolean asFinalFileStat = (fileData.getAsFinalFilePath() != null + && !fileData.getAsFinalFilePath().trim().equalsIgnoreCase("-")); + boolean ejvNumFileStat = (fileData.getEjvNumFilePath() != null + && !fileData.getEjvNumFilePath().trim().equalsIgnoreCase("-")); + boolean ejvNumStat = (!fileData.getEjvNum().trim().isEmpty() + && !fileData.getEjvNum().trim().equalsIgnoreCase("-")); + fileDataMapObj.put("asFinalFileStat", asFinalFileStat); + fileDataMapObj.put("ejvNumFileStat", ejvNumFileStat); + fileDataMapObj.put("ejvNumStat", ejvNumStat); + fileDataMapObj.put("ejvNum", fileData.getEjvNum()); + fileDataMapObj.put("ejvNumFile", fileData.getEjvNumFilePath()); + return fileDataMapObj; + }).toList(); + model.addAttribute("curPage", "upd-ejv-num"); + model.addAttribute("fileDatum", fileDatum); + return "file/update-ejv-number"; + } + + @GetMapping("/upd-file") + public String updFile(Model model) { + List fileDataResDTOs = fileDataSer.getAllFileData(); + List fundTypeResDTOs = fileDataSer.getAllFundTypes(); + model.addAttribute("fundTypes", fundTypeResDTOs); + model.addAttribute("fileDatum", fileDataResDTOs); + model.addAttribute("curPage", "upd-file"); + return "file/update-file"; + } + + @GetMapping("/view-file") + public String viewFile(Model model) { + List fileDataResDTOs = fileDataSer.getAllFileData(); + model.addAttribute("fileDatum", fileDataResDTOs); + model.addAttribute("curPage", "view-file"); + return "file/view-file"; + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/controller/HomeController.java b/src/main/java/com/adjustment_file_management_system/springboot/controller/HomeController.java new file mode 100644 index 0000000..69c2346 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/controller/HomeController.java @@ -0,0 +1,44 @@ +package com.adjustment_file_management_system.springboot.controller; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.adjustment_file_management_system.springboot.service.HomeService; + +@Controller +@RequestMapping("/") +public class HomeController { + + @Autowired + private HomeService homeSer; + + @GetMapping("/home") + public String homePage(Model model) { + Map stats = homeSer.getFileDataStat(); + model.addAttribute("curPage", "home"); + model.addAttribute("stats", stats); + return "home/home"; + } + + @GetMapping("/redirect") + public String usrRedirect(@RequestParam("usr-role") String usrRole) { + + return switch (usrRole) { + case "ROLE_ADMIN" -> "redirect:/home"; + default -> "redirect:/"; // fallback to login page + }; + + } + + @GetMapping("/") + public String loginPage() { + return "home/login"; + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/mapper/AdvanceTypeMapper.java b/src/main/java/com/adjustment_file_management_system/springboot/mapper/AdvanceTypeMapper.java new file mode 100644 index 0000000..f6f3080 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/mapper/AdvanceTypeMapper.java @@ -0,0 +1,22 @@ +package com.adjustment_file_management_system.springboot.mapper; + +import org.springframework.stereotype.Component; + +import com.adjustment_file_management_system.springboot.model.AdvanceType; +import com.adjustment_file_management_system.springboot.request_dto.AdvanceTypeRequestDTO; +import com.adjustment_file_management_system.springboot.response_dto.AdvanceTypeResponseDTO; + +@Component +public class AdvanceTypeMapper { + + public AdvanceTypeResponseDTO toAdvTypeResDTO(AdvanceType advType) { + return new AdvanceTypeResponseDTO(advType.getAdvTypeId(), advType.getAdvType()); + } + + public AdvanceType toAdvTypeEnt(AdvanceTypeRequestDTO advTypeReqDTO) { + AdvanceType advType = new AdvanceType(); + advType.setAdvType(advTypeReqDTO.getAdvType()); + return advType; + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/mapper/AppUserMapper.java b/src/main/java/com/adjustment_file_management_system/springboot/mapper/AppUserMapper.java new file mode 100644 index 0000000..e748651 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/mapper/AppUserMapper.java @@ -0,0 +1,18 @@ +package com.adjustment_file_management_system.springboot.mapper; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.adjustment_file_management_system.springboot.model.AppUser; +import com.adjustment_file_management_system.springboot.response_dto.AppUserResponseDTO; + +@Component +public class AppUserMapper { + @Autowired + private UserRoleMapper usrRoleMap; + + public AppUserResponseDTO toUsrResDTO(AppUser usr) { + return new AppUserResponseDTO(usr.getUsrId(), usr.getUsrName(), usrRoleMap.toUsrRoleResDTO(usr.getUsrRole()), + usr.getUsrPass()); + } +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/mapper/FileDataMapper.java b/src/main/java/com/adjustment_file_management_system/springboot/mapper/FileDataMapper.java new file mode 100644 index 0000000..e2afed3 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/mapper/FileDataMapper.java @@ -0,0 +1,127 @@ +package com.adjustment_file_management_system.springboot.mapper; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.adjustment_file_management_system.springboot.model.FileData; +import com.adjustment_file_management_system.springboot.repository.AdvanceTypeRepository; +import com.adjustment_file_management_system.springboot.repository.FundTypeRepository; +import com.adjustment_file_management_system.springboot.request_dto.FileDataRequestDTO; +import com.adjustment_file_management_system.springboot.response_dto.FileDataResponseDTO; + +@Component +public class FileDataMapper { + + @Autowired + private AdvanceTypeRepository advTypeRepo; + + @Autowired + private FundTypeRepository fundTypeRepo; + + @Autowired + private FundTypeMapper fundTypeMap; + + @Autowired + private AdvanceTypeMapper advTypeMap; + + public FileData toFileDataEnt(FileDataResponseDTO fileDataResDTO) { + FileData fileData = new FileData(); + fileData.setAdvType(advTypeRepo.findById(fileDataResDTO.getAdvTypeResDTO().getAdvTypeId()).get()); + fileData.setAsFileGenDate(fileDataResDTO.getAsFileGenDate()); + fileData.setAsFilePath(fileDataResDTO.getAsFilePath()); + fileData.setAsFinalFileGenDate(fileDataResDTO.getAsFinalFileGenDate()); + fileData.setAsFinalFilePath(fileDataResDTO.getAsFinalFilePath()); + fileData.setBalAmt(fileDataResDTO.getBalAmt()); + fileData.setDcFilePath(fileDataResDTO.getDcFilePath()); + fileData.setEjvNum(fileDataResDTO.getEjvNum()); + fileData.setEjvNumFileGenDate(fileDataResDTO.getEjvNumFileGenDate()); + fileData.setEjvNumFilePath(fileDataResDTO.getEjvNumFilePath()); + fileData.setFiAmt(fileDataResDTO.getFiAmt()); + fileData.setFiFileGenDate(fileDataResDTO.getFiFileGenDate()); + fileData.setFiFilePath(fileDataResDTO.getFiFilePath()); + fileData.setFileRmrk(fileDataResDTO.getFileRmrk()); + fileData.setFileDataNum(fileDataResDTO.getFileDataNum()); + fileData.setFileDataId(fileDataResDTO.getFileDataId()); + fileData.setFinYear(fileDataResDTO.getFinYear()); + fileData.setFundType(fundTypeRepo.findById(fileDataResDTO.getFundTypeResDTO().getFundTypeId()).get()); + fileData.setIrFilePath(fileDataResDTO.getIrFilePath()); + fileData.setPiAmt(fileDataResDTO.getPiAmt()); + fileData.setPiFileGenDate(fileDataResDTO.getPiFileGenDate()); + fileData.setPiFilePath(fileDataResDTO.getPiFilePath()); + fileData.setPoFilePath(fileDataResDTO.getPoFilePath()); + fileData.setRtgsFilePath(fileDataResDTO.getRtgsFilePath()); + fileData.setSrFilePath(fileDataResDTO.getSrFilePath()); + fileData.setTcFileGenDate(fileDataResDTO.getTcFileGenDate()); + fileData.setTcFilePath(fileDataResDTO.getTcFilePath()); + fileData.setVendName(fileDataResDTO.getVendName()); + return fileData; + } + + public FileData toFileDataEnt(FileDataRequestDTO fileDataReqDTO) { + FileData fileData = new FileData(); + fileData.setAdvType(advTypeRepo.findById(fileDataReqDTO.getAdvTypeId()).get()); + fileData.setAsFileGenDate(fileDataReqDTO.getAsFileGenDate()); + fileData.setAsFilePath(fileDataReqDTO.getAsFilePath()); + fileData.setAsFinalFileGenDate(fileDataReqDTO.getAsFinalFileGenDate()); + fileData.setAsFinalFilePath(fileDataReqDTO.getAsFinalFilePath()); + fileData.setBalAmt(fileDataReqDTO.getBalAmt()); + fileData.setDcFilePath(fileDataReqDTO.getDcFilePath()); + fileData.setEjvNum(fileDataReqDTO.getEjvNum()); + fileData.setEjvNumFilePath(fileDataReqDTO.getEjvNumFilePath()); + fileData.setFiAmt(fileDataReqDTO.getFiAmt()); + fileData.setFiFileGenDate(fileDataReqDTO.getFiFileGenDate()); + fileData.setFiFilePath(fileDataReqDTO.getFiFilePath()); + fileData.setFileDataNum(fileDataReqDTO.getFileDataNum()); + fileData.setFileRmrk(fileDataReqDTO.getFileRmrk()); + fileData.setFinYear(fileDataReqDTO.getFinYear()); + fileData.setFundType(fundTypeRepo.findById(fileDataReqDTO.getFundTypeId()).get()); + fileData.setIrFilePath(fileDataReqDTO.getIrFilePath()); + fileData.setPiAmt(fileDataReqDTO.getPiAmt()); + fileData.setPiFileGenDate(fileDataReqDTO.getPiFileGenDate()); + fileData.setPiFilePath(fileDataReqDTO.getPiFilePath()); + fileData.setPoFilePath(fileDataReqDTO.getPoFilePath()); + fileData.setRtgsFilePath(fileDataReqDTO.getRtgsFilePath()); + fileData.setSrFilePath(fileDataReqDTO.getSrFilePath()); + fileData.setTcFileGenDate(fileDataReqDTO.getTcFileGenDate()); + fileData.setTcFilePath(fileDataReqDTO.getTcFilePath()); + fileData.setVendName(fileDataReqDTO.getVendName()); + fileData.setEjvNumFileGenDate(fileDataReqDTO.getEjvNumFileGenDate()); + return fileData; + } + + public FileDataResponseDTO toFileDataResDTO(FileData fileData) { + FileDataResponseDTO fileDataResDTO = new FileDataResponseDTO(); + fileDataResDTO.setAsFileGenDate(fileData.getAsFileGenDate()); + fileDataResDTO.setAdvTypeResDTO( + advTypeMap.toAdvTypeResDTO(advTypeRepo.findById(fileData.getAdvType().getAdvTypeId()).get())); + fileDataResDTO.setAsFilePath(fileData.getAsFilePath()); + fileDataResDTO.setAsFinalFileGenDate(fileData.getAsFinalFileGenDate()); + fileDataResDTO.setAsFinalFilePath(fileData.getAsFinalFilePath()); + fileDataResDTO.setBalAmt(fileData.getBalAmt()); + fileDataResDTO.setDcFilePath(fileData.getDcFilePath()); + fileDataResDTO.setEjvNum(fileData.getEjvNum()); + fileDataResDTO.setEjvNumFilePath(fileData.getEjvNumFilePath()); + fileDataResDTO.setFiAmt(fileData.getFiAmt()); + fileDataResDTO.setFiFileGenDate(fileData.getFiFileGenDate()); + fileDataResDTO.setFiFilePath(fileData.getFiFilePath()); + fileDataResDTO.setFileDataId(fileData.getFileDataId()); + fileDataResDTO.setFileDataNum(fileData.getFileDataNum()); + fileDataResDTO.setFileRmrk(fileData.getFileRmrk()); + fileDataResDTO.setFinYear(fileData.getFinYear()); + fileDataResDTO.setFundTypeResDTO( + fundTypeMap.toFundTypeResDTO(fundTypeRepo.findById(fileData.getFundType().getFundTypeId()).get())); + fileDataResDTO.setIrFilePath(fileData.getIrFilePath()); + fileDataResDTO.setPiAmt(fileData.getPiAmt()); + fileDataResDTO.setPiFileGenDate(fileData.getPiFileGenDate()); + fileDataResDTO.setPiFilePath(fileData.getPiFilePath()); + fileDataResDTO.setPoFilePath(fileData.getPoFilePath()); + fileDataResDTO.setRtgsFilePath(fileData.getRtgsFilePath()); + fileDataResDTO.setSrFilePath(fileData.getSrFilePath()); + fileDataResDTO.setTcFileGenDate(fileData.getTcFileGenDate()); + fileDataResDTO.setTcFilePath(fileData.getTcFilePath()); + fileDataResDTO.setVendName(fileData.getVendName()); + fileDataResDTO.setEjvNumFileGenDate(fileData.getEjvNumFileGenDate()); + return fileDataResDTO; + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/mapper/FundTypeMapper.java b/src/main/java/com/adjustment_file_management_system/springboot/mapper/FundTypeMapper.java new file mode 100644 index 0000000..5a04e2e --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/mapper/FundTypeMapper.java @@ -0,0 +1,15 @@ +package com.adjustment_file_management_system.springboot.mapper; + +import org.springframework.stereotype.Component; + +import com.adjustment_file_management_system.springboot.model.FundType; +import com.adjustment_file_management_system.springboot.response_dto.FundTypeResponseDTO; + +@Component +public class FundTypeMapper { + + public FundTypeResponseDTO toFundTypeResDTO(FundType fundType) { + return new FundTypeResponseDTO(fundType.getFundTypeId(), fundType.getFundType()); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/mapper/UserRoleMapper.java b/src/main/java/com/adjustment_file_management_system/springboot/mapper/UserRoleMapper.java new file mode 100644 index 0000000..bc00bbc --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/mapper/UserRoleMapper.java @@ -0,0 +1,13 @@ +package com.adjustment_file_management_system.springboot.mapper; + +import org.springframework.stereotype.Component; + +import com.adjustment_file_management_system.springboot.model.UserRole; +import com.adjustment_file_management_system.springboot.response_dto.UserRoleResponseDTO; + +@Component +public class UserRoleMapper { + public UserRoleResponseDTO toUsrRoleResDTO(UserRole usrRole) { + return new UserRoleResponseDTO(usrRole.getUsrRoleId(), usrRole.getUsrRoleName()); + } +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/model/AdvanceType.java b/src/main/java/com/adjustment_file_management_system/springboot/model/AdvanceType.java new file mode 100644 index 0000000..c84413f --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/model/AdvanceType.java @@ -0,0 +1,43 @@ +package com.adjustment_file_management_system.springboot.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +//For local DB Server +/* @Table(name = "tbl_adv_type_det", schema = "GCC") */ +//For Production DB Server +@Table(name = "tbl_adv_type_det", schema = "fileadjust") +public class AdvanceType { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "adv_type_seq") + /* + * @SequenceGenerator(name = "adv_type_seq", sequenceName = "adv_type_id_seq", + * allocationSize = 1, schema = "GCC") + */ + @SequenceGenerator(name = "adv_type_seq", sequenceName = "adv_type_id_seq", allocationSize = 1, schema = "fileadjust") + @Column(name = "adv_type_id", nullable = false, updatable = false) + private Long advTypeId; + + @Column(name = "adv_type", nullable = false) + @NotBlank + private String advType; + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/model/AppUser.java b/src/main/java/com/adjustment_file_management_system/springboot/model/AppUser.java new file mode 100644 index 0000000..8e106dc --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/model/AppUser.java @@ -0,0 +1,52 @@ +package com.adjustment_file_management_system.springboot.model; + +import com.fasterxml.jackson.annotation.JsonBackReference; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@Table(name = "tbl_app_usr_det", schema = "fileadjust") +/* @Table(name = "tbl_app_usr_det", schema = "gcc") */ +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true, exclude = { "usrRole", "usrPass" }) +@NoArgsConstructor +@AllArgsConstructor +public class AppUser { + @Id + @Column(name = "usr_id", nullable = false, updatable = false) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "app_usr_seq") + /* + * @SequenceGenerator(name = "app_usr_seq", sequenceName = "usr_id_seq", + * allocationSize = 1, schema = "GCC") + */ + @SequenceGenerator(name = "app_usr_seq", sequenceName = "app_usr_id_seq", allocationSize = 1, schema = "fileadjust") + private Integer usrId; + + @Column(name = "usr_name", nullable = false) + @NotBlank + private String usrName; + + @Column(name = "usr_pass", nullable = false) + @NotBlank + private String usrPass; + + @ManyToOne + @JoinColumn(name = "usr_role_id", nullable = false, referencedColumnName = "usr_role_id") + @JsonBackReference + private UserRole usrRole; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/model/FileData.java b/src/main/java/com/adjustment_file_management_system/springboot/model/FileData.java new file mode 100644 index 0000000..f629a55 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/model/FileData.java @@ -0,0 +1,213 @@ +package com.adjustment_file_management_system.springboot.model; + +import java.util.Date; + +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.PrePersist; +import jakarta.persistence.PreUpdate; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@EntityListeners(AuditingEntityListener.class) +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true, exclude = { "advType", "fundType", "createdBy", + "updatedBy" }) +@AllArgsConstructor +@NoArgsConstructor +// For local DB Server +/* @Table(name = "tbl_file_data_det", schema = "GCC") */ +// For Production DB Server +@Table(name = "tbl_file_data_det", schema = "fileadjust") +public class FileData { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "file_data_seq") + /* + * @SequenceGenerator(name = "file_data_seq", sequenceName = "file_data_id_seq", + * allocationSize = 1, schema = "GCC") + */ + @SequenceGenerator(name = "file_data_seq", sequenceName = "file_data_id_seq", allocationSize = 1, schema = "fileadjust") + @Column(name = "file_data_id", nullable = false, updatable = false) + private Long fileDataId; + + @Column(name = "file_data_num", nullable = false, unique = true) + @NotBlank + private String fileDataNum; + + @Column(name = "fin_year", nullable = false) + @NotBlank + private String finYear; + + @Column(name = "as_file_path", nullable = false, length = 1000) + @NotBlank + private String asFilePath; + + @Column(name = "as_file_gen_date", nullable = false) + @Temporal(TemporalType.DATE) + @NotNull + private Date asFileGenDate; + + @Column(name = "pi_file_path", nullable = false, length = 1000) + @NotBlank + private String piFilePath; + + @Column(name = "pi_file_gen_date", nullable = false) + @Temporal(TemporalType.DATE) + @NotNull + private Date piFileGenDate; + + @Column(name = "pi_amt", nullable = false) + @NotNull + private Double piAmt; + + @Column(name = "fi_file_path", nullable = false, length = 1000) + @NotBlank + private String fiFilePath; + + @Column(name = "fi_amt", nullable = false) + @NotNull + private Double fiAmt; + + @Column(name = "fi_file_gen_date", nullable = false) + @Temporal(TemporalType.DATE) + @NotNull + private Date fiFileGenDate; + + @Column(name = "bal_amt", nullable = false) + @NotNull + private Double balAmt; + + @Column(name = "rtgs_file_path", nullable = false, length = 1000) + @NotBlank + private String rtgsFilePath; + + @Column(name = "po_file_path", nullable = false, length = 1000) + @NotBlank + private String poFilePath; + + @Column(name = "dc_file_path", nullable = false, length = 1000) + @NotBlank + private String dcFilePath; + + @Column(name = "sr_file_path", nullable = false, length = 1000) + @NotBlank + private String srFilePath; + + @Column(name = "ir_file_path", nullable = false, length = 1000) + @NotBlank + private String irFilePath; + + @Column(name = "as_final_file_path", nullable = false, length = 1000) + @NotBlank + private String asFinalFilePath; + + @Column(name = "as_final_file_gen_date", nullable = false) + @Temporal(TemporalType.DATE) + @NotNull + private Date asFinalFileGenDate; + + @Column(name = "ejv_num", nullable = false) + @NotBlank + private String ejvNum; + + @Column(name = "ejv_num_file_path", nullable = false, length = 1000) + @NotBlank + private String ejvNumFilePath; + + @Column(name = "ejv_num_file_gen_date", nullable = false) + @NotNull + @Temporal(TemporalType.DATE) + private Date ejvNumFileGenDate; + + @Column(name = "tc_file_path", nullable = false, length = 1000) + @NotBlank + private String tcFilePath; + + @Column(name = "tc_file_gen_date", nullable = false) + @Temporal(TemporalType.DATE) + @NotNull + private Date tcFileGenDate; + + @Column(name = "file_rmrk", nullable = false, length = 1000) + @NotBlank + private String fileRmrk; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "adv_type_id", referencedColumnName = "adv_type_id", nullable = false) + private AdvanceType advType; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "fund_type_id", referencedColumnName = "fund_type_id", nullable = false) + private FundType fundType; + + @Column(name = "vend_name", nullable = false) + @NotBlank + private String vendName; + + @CreatedBy + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "created_by_usr_id", referencedColumnName = "usr_id", updatable = false, nullable = false) + private AppUser createdBy; + + @LastModifiedBy + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "updated_by_usr_id", referencedColumnName = "usr_id", nullable = false) + private AppUser updatedBy; + + // User timestamp + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "usr_created_timestamp", nullable = false, updatable = false) + private Date usrCreatedTimestamp; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "usr_updated_timestamp", nullable = false) + private Date usrUpdatedTimestamp; + + // DB-managed timestamps + @CreatedDate + @Temporal(TemporalType.TIMESTAMP) + @Column(updatable = false, nullable = false, name = "db_created_timestamp") + private Date dbCreatedTimestamp; + + @LastModifiedDate + @Temporal(TemporalType.TIMESTAMP) + @Column(nullable = false, name = "db_updated_timestamp") + private Date dbUpdatedTimestamp; + + @PrePersist + public void onCreate() { + this.usrCreatedTimestamp = new Date(); + this.usrUpdatedTimestamp = new Date(); + } + + @PreUpdate + public void onUpdate() { + this.usrUpdatedTimestamp = new Date(); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/model/FundType.java b/src/main/java/com/adjustment_file_management_system/springboot/model/FundType.java new file mode 100644 index 0000000..7849b5e --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/model/FundType.java @@ -0,0 +1,43 @@ +package com.adjustment_file_management_system.springboot.model; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +//For local DB Server +/* @Table(name = "tbl_fund_type_det", schema = "GCC") */ +//For Production DB Server +@Table(name = "tbl_fund_type_det", schema = "fileadjust") +public class FundType { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "fund_type_seq") + /* + * @SequenceGenerator(name = "fund_type_seq", sequenceName = "fund_type_id_seq", + * allocationSize = 1, schema = "GCC") + */ + @SequenceGenerator(name = "fund_type_seq", sequenceName = "fund_type_id_seq", allocationSize = 1, schema = "fileadjust") + @Column(name = "fund_type_id", nullable = false, updatable = false) + private Long fundTypeId; + + @Column(name = "fund_type", nullable = false) + @NotBlank + private String fundType; + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/model/UserRole.java b/src/main/java/com/adjustment_file_management_system/springboot/model/UserRole.java new file mode 100644 index 0000000..c26fb78 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/model/UserRole.java @@ -0,0 +1,52 @@ +package com.adjustment_file_management_system.springboot.model; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonManagedReference; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import jakarta.persistence.SequenceGenerator; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Entity +@ToString(includeFieldNames = true, doNotUseGetters = true, exclude = { "appUsrs" }) +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +/* @Table(name = "tbl_usr_role_det", schema = "gcc") */ +@Table(name = "tbl_usr_role_det", schema = "fileadjust") +public class UserRole { + + @Id + @Column(name = "usr_role_id", nullable = false, updatable = false) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "usr_role_seq") + /* + * @SequenceGenerator(name = "usr_role_seq", sequenceName = "usr_role_id_seq", + * allocationSize = 1, schema = "GCC") + */ + @SequenceGenerator(name = "usr_role_seq", sequenceName = "usr_role_id_seq", allocationSize = 1, schema = "fileadjust") + private Integer usrRoleId; + + @Column(name = "usr_role_name", nullable = false) + @NotBlank + private String usrRoleName; + + @OneToMany(mappedBy = "usrRole", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) + @JsonManagedReference + private List appUsrs; + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/repository/AdvanceTypeRepository.java b/src/main/java/com/adjustment_file_management_system/springboot/repository/AdvanceTypeRepository.java new file mode 100644 index 0000000..ee44a46 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/repository/AdvanceTypeRepository.java @@ -0,0 +1,18 @@ +package com.adjustment_file_management_system.springboot.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import com.adjustment_file_management_system.springboot.model.AdvanceType; + +@Repository +public interface AdvanceTypeRepository extends JpaRepository { + + @Query(nativeQuery = true, value = "SELECT * FROM TBL_ADV_TYPE_DET WHERE ADV_TYPE = :advType") + Optional findAdvTypeByAdvType(@Param("advType") String advType); + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/repository/AppUserRepository.java b/src/main/java/com/adjustment_file_management_system/springboot/repository/AppUserRepository.java new file mode 100644 index 0000000..d674f54 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/repository/AppUserRepository.java @@ -0,0 +1,13 @@ +package com.adjustment_file_management_system.springboot.repository; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.adjustment_file_management_system.springboot.model.AppUser; + +@Repository +public interface AppUserRepository extends JpaRepository { + Optional findByUsrName(String usrName); +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/repository/FileDataRepository.java b/src/main/java/com/adjustment_file_management_system/springboot/repository/FileDataRepository.java new file mode 100644 index 0000000..112c112 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/repository/FileDataRepository.java @@ -0,0 +1,15 @@ +package com.adjustment_file_management_system.springboot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import com.adjustment_file_management_system.springboot.model.FileData; + +@Repository +public interface FileDataRepository extends JpaRepository { + + @Query(value = "SELECT fd FROM FileData fd WHERE fd.fileDataNum = ?1") + FileData findFileDataByFileDataNum(String fileDataNum); + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/repository/FundTypeRepository.java b/src/main/java/com/adjustment_file_management_system/springboot/repository/FundTypeRepository.java new file mode 100644 index 0000000..920e7a3 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/repository/FundTypeRepository.java @@ -0,0 +1,11 @@ +package com.adjustment_file_management_system.springboot.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.adjustment_file_management_system.springboot.model.FundType; + +@Repository +public interface FundTypeRepository extends JpaRepository { + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AddFileDataRequestDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AddFileDataRequestDTO.java new file mode 100644 index 0000000..576442a --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AddFileDataRequestDTO.java @@ -0,0 +1,34 @@ +package com.adjustment_file_management_system.springboot.request_dto; + +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.multipart.MultipartFile; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class AddFileDataRequestDTO { + + private String fileNum; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date asFileGenDate; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date piFileGenDate; + private Double piAmt; + private String fileRmrk; + private MultipartFile asFile; + private MultipartFile piFile; + private String finYear; + private String vendName; + private String advType; + private Long fundTypeId; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AdvanceTypeRequestDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AdvanceTypeRequestDTO.java new file mode 100644 index 0000000..28a37e1 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AdvanceTypeRequestDTO.java @@ -0,0 +1,18 @@ +package com.adjustment_file_management_system.springboot.request_dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class AdvanceTypeRequestDTO { + + private String advType; + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AppUserRequestDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AppUserRequestDTO.java new file mode 100644 index 0000000..cfa17d0 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/AppUserRequestDTO.java @@ -0,0 +1,17 @@ +package com.adjustment_file_management_system.springboot.request_dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@NoArgsConstructor +@AllArgsConstructor +public class AppUserRequestDTO { + private String usrName; + private String usrPass; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/request_dto/FileDataRequestDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/FileDataRequestDTO.java new file mode 100644 index 0000000..0f74d35 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/FileDataRequestDTO.java @@ -0,0 +1,44 @@ +package com.adjustment_file_management_system.springboot.request_dto; + +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@NoArgsConstructor +@AllArgsConstructor +public class FileDataRequestDTO { + private String fileDataNum; + private String asFilePath; + private Date asFileGenDate; + private String piFilePath; + private Date piFileGenDate; + private Double piAmt; + private String fiFilePath; + private Double fiAmt; + private Date fiFileGenDate; + private Double balAmt; + private String rtgsFilePath; + private String poFilePath; + private String dcFilePath; + private String srFilePath; + private String irFilePath; + private String asFinalFilePath; + private Date asFinalFileGenDate; + private String ejvNum; + private String ejvNumFilePath; + private String tcFilePath; + private Date tcFileGenDate; + private String fileRmrk; + private String vendName; + private String finYear; + private Long advTypeId; + private Long fundTypeId; + private Date ejvNumFileGenDate; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/request_dto/UpdateFileDataRequestDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/UpdateFileDataRequestDTO.java new file mode 100644 index 0000000..ad97788 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/request_dto/UpdateFileDataRequestDTO.java @@ -0,0 +1,50 @@ +package com.adjustment_file_management_system.springboot.request_dto; + +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.multipart.MultipartFile; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class UpdateFileDataRequestDTO { + + private String fileNum; + private String fileRmrk; + private String advType; + private Long fundTypeId; + private String vendName; + private MultipartFile poFile; + private MultipartFile dcFile; + private MultipartFile srFile; + private MultipartFile irFile; + private MultipartFile rtgsFile; + private MultipartFile piFile; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date piFileGenDate; + private Double piAmt; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date asFileGenDate; + private MultipartFile asFile; + private MultipartFile fiFile; + private Double fiAmt; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date fiFileGenDate; + private MultipartFile asFinalFile; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date asFinalFileGenDate; + @DateTimeFormat(pattern = "dd-MM-yyyy") + private Date tcFileGenDate; + private MultipartFile tcFile; + private Double balAmt; + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/response_dto/AdvanceTypeResponseDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/AdvanceTypeResponseDTO.java new file mode 100644 index 0000000..042c174 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/AdvanceTypeResponseDTO.java @@ -0,0 +1,19 @@ +package com.adjustment_file_management_system.springboot.response_dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class AdvanceTypeResponseDTO { + + private Long advTypeId; + private String advType; + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/response_dto/AppUserResponseDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/AppUserResponseDTO.java new file mode 100644 index 0000000..8a5e32a --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/AppUserResponseDTO.java @@ -0,0 +1,19 @@ +package com.adjustment_file_management_system.springboot.response_dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true, exclude = { "usrPass" }) +@AllArgsConstructor +@NoArgsConstructor +public class AppUserResponseDTO { + private Integer usrId; + private String usrName; + private UserRoleResponseDTO usrRole; + private String usrPass; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/response_dto/FileDataResponseDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/FileDataResponseDTO.java new file mode 100644 index 0000000..7d28b27 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/FileDataResponseDTO.java @@ -0,0 +1,46 @@ +package com.adjustment_file_management_system.springboot.response_dto; + +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class FileDataResponseDTO { + private Long fileDataId; + private String fileDataNum; + private String asFilePath; + private Date asFileGenDate; + private String piFilePath; + private Date piFileGenDate; + private Double piAmt; + private String fiFilePath; + private Double fiAmt; + private Date fiFileGenDate; + private Double balAmt; + private String rtgsFilePath; + private String poFilePath; + private String dcFilePath; + private String srFilePath; + private String irFilePath; + private String asFinalFilePath; + private Date asFinalFileGenDate; + private String ejvNum; + private String ejvNumFilePath; + private String tcFilePath; + private Date tcFileGenDate; + private String fileRmrk; + private String vendName; + private String finYear; + private AdvanceTypeResponseDTO advTypeResDTO; + private Date ejvNumFileGenDate; + private FundTypeResponseDTO fundTypeResDTO; + private Long daysPass; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/response_dto/FundTypeResponseDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/FundTypeResponseDTO.java new file mode 100644 index 0000000..d85c64e --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/FundTypeResponseDTO.java @@ -0,0 +1,17 @@ +package com.adjustment_file_management_system.springboot.response_dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(includeFieldNames = true, doNotUseGetters = true) +@NoArgsConstructor +@AllArgsConstructor +public class FundTypeResponseDTO { + private Long fundTypeId; + private String fundType; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/response_dto/ServiceResponseDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/ServiceResponseDTO.java new file mode 100644 index 0000000..29983c7 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/ServiceResponseDTO.java @@ -0,0 +1,19 @@ +package com.adjustment_file_management_system.springboot.response_dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@AllArgsConstructor +@NoArgsConstructor +public class ServiceResponseDTO { + + private boolean resStat; + private String res; + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/response_dto/UserRoleResponseDTO.java b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/UserRoleResponseDTO.java new file mode 100644 index 0000000..7b6d262 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/response_dto/UserRoleResponseDTO.java @@ -0,0 +1,17 @@ +package com.adjustment_file_management_system.springboot.response_dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +@Getter +@Setter +@ToString(doNotUseGetters = true, includeFieldNames = true) +@NoArgsConstructor +@AllArgsConstructor +public class UserRoleResponseDTO { + private Integer usrRoleId; + private String usrRoleName; +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/FileDataRestController.java b/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/FileDataRestController.java new file mode 100644 index 0000000..6018655 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/FileDataRestController.java @@ -0,0 +1,93 @@ +package com.adjustment_file_management_system.springboot.rest_controller; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.propertyeditors.CustomDateEditor; +import org.springframework.beans.propertyeditors.CustomNumberEditor; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.adjustment_file_management_system.springboot.request_dto.AddFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.request_dto.UpdateFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.response_dto.ServiceResponseDTO; +import com.adjustment_file_management_system.springboot.service.FileDataService; + +@RestController +@RequestMapping("/api/file") +public class FileDataRestController { + + @Autowired + private FileDataService fileDataSer; + + @InitBinder + public void initBinder(WebDataBinder binder) { + SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy"); + sdf.setLenient(false); + // true = allow empty string to be converted to null + binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true)); + binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class, true)); + } + + @PostMapping("/view-supp-docs") + public ResponseEntity viewSuppDocs(@RequestParam("file-type") String fileType, + @RequestParam("file-path") String filePath, @RequestParam("file-num") String fileNum) { + try { + byte[] fileData = fileDataSer.getFileBytes(fileType, filePath, fileNum); + String fileName = fileDataSer.getFileName(filePath); + return ResponseEntity.ok().contentType(MediaType.APPLICATION_PDF) + .header("Content-Disposition", "inline; filename=\"" + fileName + "\"").body(fileData); + } catch (IllegalArgumentException iae) { + return ResponseEntity.badRequest().body(iae.getMessage().getBytes(StandardCharsets.UTF_8)); + } catch (IOException ioe) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ioe.getMessage().getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(e.getMessage().getBytes(StandardCharsets.UTF_8)); + } + } + + @PostMapping("/add-file") + public ResponseEntity addFile(@ModelAttribute AddFileDataRequestDTO addFileDataReqDTO) { + ServiceResponseDTO serResDTO = fileDataSer.addFileData(addFileDataReqDTO); + if (serResDTO.isResStat()) { + return ResponseEntity.ok(serResDTO); + } else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(serResDTO); + } + } + + @PostMapping("/upd-file") + public ResponseEntity updFile(@ModelAttribute UpdateFileDataRequestDTO updFileDataReqDTO) { + ServiceResponseDTO serResDTO = fileDataSer.updFileData(updFileDataReqDTO); + if (serResDTO.isResStat()) { + return ResponseEntity.ok(serResDTO); + } else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(serResDTO); + } + } + + @PostMapping("/upd-ejv-num") + public ResponseEntity updEjvNum(@RequestParam("file-num") String fileNum, + @RequestParam("ejv-num") String ejvNum, @RequestParam("ejv-num-file") MultipartFile ejvNumFile) { + ServiceResponseDTO serResDTO = fileDataSer.updEjvNum(fileNum, ejvNumFile, ejvNum); + if (serResDTO.isResStat()) { + return ResponseEntity.ok(serResDTO); + } else { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(serResDTO); + } + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/HomeRestController.java b/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/HomeRestController.java new file mode 100644 index 0000000..d8bf504 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/rest_controller/HomeRestController.java @@ -0,0 +1,78 @@ +package com.adjustment_file_management_system.springboot.rest_controller; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.adjustment_file_management_system.springboot.request_dto.AppUserRequestDTO; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpSession; + +@RestController +@RequestMapping("/api") +public class HomeRestController { + + @Autowired + private AuthenticationManager authManager; + + @PostMapping("/val-app-usr-login") + public ResponseEntity valUsrLogin(@ModelAttribute AppUserRequestDTO appUsrReqDTO, HttpServletRequest req) { + Map res = new HashMap(); + try { + Authentication auth = authManager.authenticate( + new UsernamePasswordAuthenticationToken(appUsrReqDTO.getUsrName(), appUsrReqDTO.getUsrPass())); + + /** + * Store authentication in session so Spring Security knows the user is logged + * in + **/ + SecurityContext securityContext = SecurityContextHolder.createEmptyContext(); + securityContext.setAuthentication(auth); + SecurityContextHolder.setContext(securityContext); + + HttpSession httpSession = req.getSession(true); + httpSession.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, securityContext); + + // Authentication successful + res.put("result", true); + res.put("usrName", auth.getName()); + res.put("role", auth.getAuthorities()); + return ResponseEntity.ok(res); + } catch (AuthenticationException ae) { + + // 1️ Username not found (direct) + if (ae instanceof UsernameNotFoundException) { + res.put("result", false); + res.put("error", "User not found"); + return ResponseEntity.status(404).body(res); + } + + // 2 Wrong password (direct) + if (ae instanceof BadCredentialsException) { + res.put("result", false); + res.put("error", "Invalid username or password"); + return ResponseEntity.status(401).body(res); + } + // 3️ Default fallback + res.put("result", false); + res.put("error", "Authentication failed"); + return ResponseEntity.status(401).body(res); + } + } +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/service/FileDataService.java b/src/main/java/com/adjustment_file_management_system/springboot/service/FileDataService.java new file mode 100644 index 0000000..b7a782c --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/service/FileDataService.java @@ -0,0 +1,606 @@ +package com.adjustment_file_management_system.springboot.service; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import com.adjustment_file_management_system.springboot.configuration.FileDataPropertiesConfiguration; +import com.adjustment_file_management_system.springboot.mapper.AdvanceTypeMapper; +import com.adjustment_file_management_system.springboot.mapper.FileDataMapper; +import com.adjustment_file_management_system.springboot.mapper.FundTypeMapper; +import com.adjustment_file_management_system.springboot.repository.AdvanceTypeRepository; +import com.adjustment_file_management_system.springboot.repository.FileDataRepository; +import com.adjustment_file_management_system.springboot.repository.FundTypeRepository; +import com.adjustment_file_management_system.springboot.request_dto.AddFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.request_dto.AdvanceTypeRequestDTO; +import com.adjustment_file_management_system.springboot.request_dto.FileDataRequestDTO; +import com.adjustment_file_management_system.springboot.request_dto.UpdateFileDataRequestDTO; +import com.adjustment_file_management_system.springboot.response_dto.AdvanceTypeResponseDTO; +import com.adjustment_file_management_system.springboot.response_dto.FileDataResponseDTO; +import com.adjustment_file_management_system.springboot.response_dto.FundTypeResponseDTO; +import com.adjustment_file_management_system.springboot.response_dto.ServiceResponseDTO; + +@Service +public class FileDataService { + + @Autowired + private FileDataRepository fileDataRepo; + + @Autowired + private FolderService folderSer; + + @Autowired + private AdvanceTypeRepository advTypeRepo; + + @Autowired + private FundTypeRepository fundTypeRepo; + + @Autowired + private FundTypeMapper fundTypeMap; + + @Autowired + private FileDataPropertiesConfiguration fileDataPropsConfig; + + @Autowired + private FileDataMapper fileDataMap; + + @Autowired + private AdvanceTypeMapper advTypeMap; + + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy"); + + private static final Logger logger = LoggerFactory.getLogger(FileDataService.class); + + private static final Date placeHolderDate = new Date(0); + + // Clean file if error occurrs while adding file + private void cleanUpFiles(String... paths) { + for (String path : paths) { + folderSer.deleteFileIfExists(path); + } + } + + // Setting default values for new file + private void setDefaultFileDataValues(FileDataRequestDTO fileDataReqDTO) { + fileDataReqDTO.setAsFinalFileGenDate(placeHolderDate); + fileDataReqDTO.setAsFinalFilePath("-"); + fileDataReqDTO.setBalAmt(0.0); + fileDataReqDTO.setDcFilePath("-"); + fileDataReqDTO.setEjvNum("-"); + fileDataReqDTO.setEjvNumFilePath("-"); + fileDataReqDTO.setFiAmt(0.0); + fileDataReqDTO.setFiFileGenDate(placeHolderDate); + fileDataReqDTO.setFiFilePath("-"); + fileDataReqDTO.setPiFilePath("-"); + fileDataReqDTO.setPoFilePath("-"); + fileDataReqDTO.setRtgsFilePath("-"); + fileDataReqDTO.setSrFilePath("-"); + fileDataReqDTO.setIrFilePath("-"); + fileDataReqDTO.setTcFileGenDate(placeHolderDate); + fileDataReqDTO.setTcFilePath("-"); + fileDataReqDTO.setAsFilePath("-"); + fileDataReqDTO.setPiFilePath("-"); + fileDataReqDTO.setEjvNumFileGenDate(placeHolderDate); + } + + /** + * Helper method for file uploads, tracks uploaded files automatically. + */ + private void handleFileUpload(String fileNum, String type, Date date, MultipartFile file, + Consumer pathSetter, List uploadedFiles) throws IOException { + if (file == null || file.isEmpty()) { + return; + } + + String path = folderSer.saveFile(fileNum, type, date, file); + pathSetter.accept(path); + + // Track uploaded file for cleanup if something goes wrong later + uploadedFiles.add(path); + } + + /** + * Utility method for choosing first non-null value. + */ + private T firstNonNull(T a, T b) { + return (a != null) ? a : b; + } + + // Helper method for date modifying + public String formatForFlatpickr(Date date) { + if (date == null) { + return ""; + } + // Convert java.util.Date to LocalDate + LocalDate localDate = Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate(); + if (localDate.equals(LocalDate.of(1970, 1, 1))) { + return ""; + } + return localDate.format(formatter); + } + + /** + * Helper to update a field if not null + */ + private void updateIfNotNull(Consumer setter, T value) { + if (value != null) + setter.accept(value); + } + + /** + * Helper to update a String field if not blank + */ + private void updateIfNotBlank(Consumer setter, String value) { + if (value != null && !value.isBlank()) + setter.accept(value.trim()); + } + + /** + * Returns the file from Respective File Data Request DTO by type + */ + private MultipartFile getFileByType(Object obj, String type) { + if (obj instanceof AddFileDataRequestDTO addFileDataReqDTO) { + return switch (type) { + case "AS" -> addFileDataReqDTO.getAsFile(); + case "PI" -> addFileDataReqDTO.getPiFile(); + default -> null; + }; + } else if (obj instanceof UpdateFileDataRequestDTO updFileDataReqDTO) { + return switch (type) { + case "AS" -> updFileDataReqDTO.getAsFile(); + case "PI" -> updFileDataReqDTO.getPiFile(); + case "FI" -> updFileDataReqDTO.getFiFile(); + case "AS-Final" -> updFileDataReqDTO.getAsFinalFile(); + case "TC" -> updFileDataReqDTO.getTcFile(); + default -> null; + }; + } + return null; + } + + // Returns the file name from path + public String getFileName(String filePath) { + return Path.of(filePath).getFileName().toString(); + } + + // Calculates the number of days from present till the date of FI uploaded date + private void calculateDaysPass(FileDataResponseDTO fileDataResDTO) { + LocalDate fiFileGenDate = ((java.sql.Date) fileDataResDTO.getFiFileGenDate()).toLocalDate(); + LocalDate ejvNumFileGenDate = ((java.sql.Date) fileDataResDTO.getEjvNumFileGenDate()).toLocalDate(); + boolean fiFilePresent = !fileDataResDTO.getFiFilePath().equals("-"); + boolean ejvFilePresent = !fileDataResDTO.getEjvNumFilePath().equals("-"); + + if (!fiFileGenDate.equals(LocalDate.of(1970, 1, 1)) && fiFilePresent) { + long daysPassed; + if (ejvFilePresent && !ejvNumFileGenDate.equals(LocalDate.of(1970, 1, 1))) { + daysPassed = ChronoUnit.DAYS.between(fiFileGenDate, ejvNumFileGenDate); + } else { + daysPassed = ChronoUnit.DAYS.between(fiFileGenDate, LocalDate.now()); + } + fileDataResDTO.setDaysPass(daysPassed); + } else { + fileDataResDTO.setDaysPass(0L); + } + } + + // Extract the starting year from financial year string + private Integer extractStartYear(String finYear) { + if (finYear == null || !finYear.contains("-")) { + return 0; + } + try { + // Extract the part before the dash (e.g., "2020" from "2020-2021") + return Integer.parseInt(finYear.split("-")[0].trim()); + } catch (NumberFormatException nfe) { + nfe.printStackTrace(); + logger.info("Exception occurred while extracting the financial starting year: {}", nfe.getMessage()); + return 0; + } + } + + /** + * Extract the ending year from financial year string + **/ + private Integer extractEndYear(String finYear) { + if (finYear == null || !finYear.contains("-")) + return 0; + try { + return Integer.parseInt(finYear.split("-")[1].trim()); + } catch (NumberFormatException nfe) { + nfe.printStackTrace(); + logger.info("Exception occurred while extracting the financial end year: {}", nfe.getMessage()); + return 0; + } + } + + // Reads PDF bytes from the given file path of respective file number if valid + public byte[] getFileBytes(String fileType, String filePath, String fileNum) throws IOException { + fileType = fileType.trim(); + filePath = filePath.trim(); + fileNum = fileNum.trim(); + if (!StringUtils.hasText(fileType) || !StringUtils.hasText(filePath)) { + throw new IllegalArgumentException("Invalid request parameters"); + } + + switch (fileType) { + case "AS", "PI", "RTGS", "PO", "DC", "SR", "IR", "EJV-Number", "AS-Final", "FI", "TC" -> { + + // Remove duplicate prefix from filePath if present + if (filePath.startsWith("/uploads/file-data/")) { + filePath = filePath.substring("/uploads/file-data/".length()); + } else if (filePath.startsWith("uploads/file-data/")) { + filePath = filePath.substring("uploads/file-data/".length()); + } + + // Resolve relative path inside uploadDir + File baseDir = fileDataPropsConfig.getUploadDirFile(); + Path fullPath = Path.of(baseDir.getAbsolutePath(), filePath).normalize(); + + if (!Files.exists(fullPath)) { + throw new IOException("File not found for file number: " + fileNum); + } + return Files.readAllBytes(fullPath); + } + default -> + throw new IllegalArgumentException("Unknown file type: " + fileType + " for file number: " + fileNum); + } + } + + @Transactional(readOnly = true) + public FileDataResponseDTO getFileDataByFileNum(String fileNum) { + FileDataResponseDTO dto = fileDataMap.toFileDataResDTO(fileDataRepo.findFileDataByFileDataNum(fileNum)); + calculateDaysPass(dto); + return dto; + } + + @Transactional(readOnly = true) + public List getAllFileDataNum() { + return fileDataRepo.findAll().stream().map(fileData -> fileData.getFileDataNum()).toList(); + } + + @Transactional(readOnly = true) + public List getAllFileData() { + // Comparator for comparing financial year + Comparator comparator = Comparator + .comparing((FileDataResponseDTO dto) -> extractStartYear(dto.getFinYear())) + .thenComparing(dto -> extractEndYear(dto.getFinYear())); + + return fileDataRepo.findAll().stream().map(fileData -> { + FileDataResponseDTO dto = fileDataMap.toFileDataResDTO(fileData); + calculateDaysPass(dto); + return dto; + }).sorted(comparator).toList(); + } + + @Transactional(rollbackFor = Exception.class) + public ServiceResponseDTO addFileData(AddFileDataRequestDTO addFileDataReqDTO) { + List uploadedFiles = new ArrayList(); // Track uploaded file paths + + try { + String fileNum = addFileDataReqDTO.getFileNum().trim(); + String vendName = (addFileDataReqDTO.getVendName() != null + && !addFileDataReqDTO.getVendName().trim().isEmpty()) + ? addFileDataReqDTO.getVendName().trim().toUpperCase() + : "-"; + String advTypeName = addFileDataReqDTO.getAdvType().trim().toUpperCase(); + Double piAmt = addFileDataReqDTO.getPiAmt() != null ? addFileDataReqDTO.getPiAmt() : 0.0; + Date piFileGenDate = addFileDataReqDTO.getPiFileGenDate() != null ? addFileDataReqDTO.getPiFileGenDate() + : placeHolderDate; + Date asFileGenDate = addFileDataReqDTO.getAsFileGenDate() != null ? addFileDataReqDTO.getAsFileGenDate() + : placeHolderDate; + + // 1️. Get or create AdvanceType + AdvanceTypeResponseDTO advTypeResDTO = advTypeMap + .toAdvTypeResDTO(advTypeRepo.findAdvTypeByAdvType(advTypeName).orElseGet(() -> { + AdvanceTypeRequestDTO advTypeReqDTO = new AdvanceTypeRequestDTO(advTypeName); + return advTypeRepo.save(advTypeMap.toAdvTypeEnt(advTypeReqDTO)); + })); + + // 2️. Prepare DTO + FileDataRequestDTO fileDataReqDTO = new FileDataRequestDTO(); + fileDataReqDTO.setAdvTypeId(advTypeResDTO.getAdvTypeId()); + fileDataReqDTO.setFileDataNum(fileNum); + fileDataReqDTO.setFileRmrk(addFileDataReqDTO.getFileRmrk().trim()); + fileDataReqDTO.setFinYear(addFileDataReqDTO.getFinYear().trim()); + fileDataReqDTO.setFundTypeId(addFileDataReqDTO.getFundTypeId()); + fileDataReqDTO.setVendName(vendName); + fileDataReqDTO.setPiAmt(piAmt); + fileDataReqDTO.setAsFileGenDate(asFileGenDate); + fileDataReqDTO.setPiFileGenDate(piFileGenDate); + + // Set default values + setDefaultFileDataValues(fileDataReqDTO); + + // 3️. Handle file uploads + Map files = new HashMap(); + if (addFileDataReqDTO.getAsFile() != null) { + files.put("AS", addFileDataReqDTO.getAsFile()); + } + if (addFileDataReqDTO.getPiFile() != null) { + files.put("PI", addFileDataReqDTO.getPiFile()); + } + + Map> pathSetters = Map.of("AS", fileDataReqDTO::setAsFilePath, "PI", + fileDataReqDTO::setPiFilePath); + + for (String type : files.keySet()) { + MultipartFile file = files.get(type); + // use the dates already set + handleFileUpload(fileNum, type, "AS".equals(type) ? asFileGenDate : piFileGenDate, file, + pathSetters.get(type), uploadedFiles); + } + + // 4️. Save to DB + fileDataRepo.save(fileDataMap.toFileDataEnt(fileDataReqDTO)); + + logger.info("File saved with file number: {}", fileNum); + return new ServiceResponseDTO(true, "File added successfully"); + + } catch (IOException ioe) { + logger.error("Exception occurred in file upload part: {}", ioe.getMessage(), ioe); + ioe.printStackTrace(); + cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, "Failed to add the file. Error in file upload: " + ioe.getMessage()); + } catch (Exception e) { + logger.error("Exception occurred: {}", e.getMessage(), e); + e.printStackTrace(); + cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, "Failed to add the file. Error: " + e.getMessage()); + } + } + + @Transactional(rollbackFor = Exception.class) + public ServiceResponseDTO updFileData(UpdateFileDataRequestDTO updFileReqDTO) { + List uploadedFiles = new ArrayList(); // Track uploaded paths + + try { + String fileNum = updFileReqDTO.getFileNum().trim(); + FileDataResponseDTO fileDataResDTO = fileDataMap + .toFileDataResDTO(fileDataRepo.findFileDataByFileDataNum(fileNum)); + String advTypeName = updFileReqDTO.getAdvType().trim().toUpperCase(); + String reqVendName = updFileReqDTO.getVendName(); + String vendName = reqVendName != null ? reqVendName.trim().toUpperCase() : "-"; + + if (fileDataResDTO == null) { + return new ServiceResponseDTO(false, "File not found for file number: " + fileNum); + } + + // Get or create AdvanceType + AdvanceTypeResponseDTO advTypeResDTO = advTypeMap + .toAdvTypeResDTO(advTypeRepo.findAdvTypeByAdvType(advTypeName).orElseGet(() -> { + AdvanceTypeRequestDTO advTypeReqDTO = new AdvanceTypeRequestDTO(advTypeName); + return advTypeRepo.save(advTypeMap.toAdvTypeEnt(advTypeReqDTO)); + })); + + // Update simple fields + fileDataResDTO.setAdvTypeResDTO(advTypeResDTO); + fileDataResDTO.setVendName(vendName); + fileDataResDTO.setFundTypeResDTO( + fundTypeMap.toFundTypeResDTO(fundTypeRepo.findById(updFileReqDTO.getFundTypeId()).get())); + updateIfNotBlank(fileDataResDTO::setFileRmrk, updFileReqDTO.getFileRmrk()); + updateIfNotNull(fileDataResDTO::setPiAmt, updFileReqDTO.getPiAmt()); + updateIfNotNull(fileDataResDTO::setFiAmt, updFileReqDTO.getFiAmt()); + updateIfNotNull(fileDataResDTO::setBalAmt, updFileReqDTO.getBalAmt()); + + // Simple files (no dates) + Map simpleFiles = new HashMap(); + if (updFileReqDTO.getPoFile() != null) { + simpleFiles.put("PO", updFileReqDTO.getPoFile()); + } + if (updFileReqDTO.getDcFile() != null) { + simpleFiles.put("DC", updFileReqDTO.getDcFile()); + } + if (updFileReqDTO.getRtgsFile() != null) { + simpleFiles.put("RTGS", updFileReqDTO.getRtgsFile()); + } + if (updFileReqDTO.getSrFile() != null) { + simpleFiles.put("SR", updFileReqDTO.getSrFile()); + } + if (updFileReqDTO.getIrFile() != null) { + simpleFiles.put("IR", updFileReqDTO.getIrFile()); + } + + Map> simpleSetters = Map.of("PO", fileDataResDTO::setPoFilePath, "DC", + fileDataResDTO::setDcFilePath, "RTGS", fileDataResDTO::setRtgsFilePath, "SR", + fileDataResDTO::setSrFilePath, "IR", fileDataResDTO::setIrFilePath); + + // Handle simple files + for (Map.Entry entry : simpleFiles.entrySet()) { + handleFileUpload(fileNum, entry.getKey(), null, entry.getValue(), simpleSetters.get(entry.getKey()), + uploadedFiles); + } + + // Complex files (with dates) + Map complexFiles = new HashMap(); + if (updFileReqDTO.getAsFile() != null) { + complexFiles.put("AS", updFileReqDTO.getAsFile()); + } + if (updFileReqDTO.getPiFile() != null) { + complexFiles.put("PI", updFileReqDTO.getPiFile()); + } + if (updFileReqDTO.getFiFile() != null) { + complexFiles.put("FI", updFileReqDTO.getFiFile()); + } + if (updFileReqDTO.getAsFinalFile() != null) { + complexFiles.put("AS-Final", updFileReqDTO.getAsFinalFile()); + } + if (updFileReqDTO.getTcFile() != null) { + complexFiles.put("TC", updFileReqDTO.getTcFile()); + } + + Map currentDates = new HashMap(); + if (fileDataResDTO.getAsFileGenDate() != null) { + currentDates.put("AS", fileDataResDTO.getAsFileGenDate()); + } + if (fileDataResDTO.getPiFileGenDate() != null) { + currentDates.put("PI", fileDataResDTO.getPiFileGenDate()); + } + if (fileDataResDTO.getFiFileGenDate() != null) { + currentDates.put("FI", fileDataResDTO.getFiFileGenDate()); + } + if (fileDataResDTO.getAsFinalFileGenDate() != null) { + currentDates.put("AS-Final", fileDataResDTO.getAsFinalFileGenDate()); + } + if (fileDataResDTO.getTcFileGenDate() != null) { + currentDates.put("TC", fileDataResDTO.getTcFileGenDate()); + } + + Map newDates = new HashMap(); + if (updFileReqDTO.getAsFileGenDate() != null) { + newDates.put("AS", updFileReqDTO.getAsFileGenDate()); + } + if (updFileReqDTO.getPiFileGenDate() != null) { + newDates.put("PI", updFileReqDTO.getPiFileGenDate()); + } + if (updFileReqDTO.getFiFileGenDate() != null) { + newDates.put("FI", updFileReqDTO.getFiFileGenDate()); + } + if (updFileReqDTO.getAsFinalFileGenDate() != null) { + newDates.put("AS-Final", updFileReqDTO.getAsFinalFileGenDate()); + } + if (updFileReqDTO.getTcFileGenDate() != null) { + newDates.put("TC", updFileReqDTO.getTcFileGenDate()); + } + + Map> pathSetters = Map.of("AS", fileDataResDTO::setAsFilePath, "PI", + fileDataResDTO::setPiFilePath, "FI", fileDataResDTO::setFiFilePath, "AS-Final", + fileDataResDTO::setAsFinalFilePath, "TC", fileDataResDTO::setTcFilePath); + + Map> dateSetters = Map.of("AS", fileDataResDTO::setAsFileGenDate, "PI", + fileDataResDTO::setPiFileGenDate, "FI", fileDataResDTO::setFiFileGenDate, "AS-Final", + fileDataResDTO::setAsFinalFileGenDate, "TC", fileDataResDTO::setTcFileGenDate); + + // Handle complex files + for (String type : currentDates.keySet()) { + Date dateToUse = firstNonNull(newDates.get(type), currentDates.get(type)); + dateSetters.get(type).accept(dateToUse); + handleFileUpload(fileNum, type, dateToUse, getFileByType(updFileReqDTO, type), pathSetters.get(type), + uploadedFiles); + } + + // Save updated entity + fileDataRepo.save(fileDataMap.toFileDataEnt(fileDataResDTO)); + return new ServiceResponseDTO(true, "File updated successfully."); + + } catch (IOException ioe) { + logger.error("Exception occurred in file upload part: {}", ioe.getMessage(), ioe); + ioe.printStackTrace(); + cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, + "Failed to update the file. Error in file upload: " + ioe.getMessage()); + } catch (Exception e) { + logger.error("Exception occurred: {}", e.getMessage(), e); + e.printStackTrace(); + cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, "Failed to update the file. Error: " + e.getMessage()); + } + } + + @Transactional(rollbackFor = Exception.class) + public ServiceResponseDTO updEjvNum(String fileNum, MultipartFile ejvNumFile, String ejvNum) { + List uploadedFiles = new ArrayList(); // Track uploaded files + + try { + fileNum = fileNum.trim(); + ejvNum = ejvNum.trim(); + + // 1️. Find existing FileData + FileDataResponseDTO fileDataResDTO = fileDataMap + .toFileDataResDTO(fileDataRepo.findFileDataByFileDataNum(fileNum)); + + if (fileDataResDTO == null) { + return new ServiceResponseDTO(false, "File not found for file number: " + fileNum); + } + + // 2️. Update fields + fileDataResDTO.setEjvNum(ejvNum); + fileDataResDTO.setEjvNumFileGenDate(new Date()); + + // 3️. Handle file upload + if (ejvNumFile != null && !ejvNumFile.isEmpty()) { + handleFileUpload(fileNum, "EJV-Number", fileDataResDTO.getEjvNumFileGenDate(), ejvNumFile, + fileDataResDTO::setEjvNumFilePath, uploadedFiles); + } + + // 4️. Save updated entity + fileDataRepo.save(fileDataMap.toFileDataEnt(fileDataResDTO)); + + return new ServiceResponseDTO(true, "Updated the EJV Number successfully."); + + } catch (IOException ioe) { + logger.error("Exception occurred in file upload part: {}", ioe.getMessage(), ioe); + ioe.printStackTrace(); + cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, + "Failed to update the EJV Number. Error in file upload: " + ioe.getMessage()); + } catch (Exception e) { + logger.error("Exception occurred: {}", e.getMessage(), e); + e.printStackTrace(); + cleanUpFiles(uploadedFiles.toArray(new String[0])); // Delete all uploaded files + return new ServiceResponseDTO(false, "Failed to update the EJV Number. Error: " + e.getMessage()); + } + } + + @Transactional(readOnly = true) + public List getAllAdvTypes() { + // TODO Auto-generated method stub + return advTypeRepo.findAll().stream().map(advTypeMap::toAdvTypeResDTO).toList(); + } + + @Transactional(readOnly = true) + public List getAllFundTypes() { + // TODO Auto-generated method stub + return fundTypeRepo.findAll().stream().map(fundTypeMap::toFundTypeResDTO).toList(); + } + + @Transactional(readOnly = true) + public Long getAllAdjustFileData() { + return fileDataRepo.findAll().stream() + .filter(fileDatum -> fileDatum.getEjvNum() != null && fileDatum.getEjvNumFilePath() != null + && !fileDatum.getEjvNum().trim().equals("-") + && !fileDatum.getEjvNumFilePath().trim().equals("-")) + .count(); + } + + @Transactional(readOnly = true) + public Long getAllNotAdjustFileData() { + return fileDataRepo.findAll().stream().filter(fileDatum -> fileDatum.getEjvNum() != null + && fileDatum.getEjvNumFilePath() != null + && (fileDatum.getEjvNum().trim().equals("-") || fileDatum.getEjvNumFilePath().trim().equals("-"))) + .count(); + } + + @Transactional(readOnly = true) + public Long getAllItcFileData() { + return fileDataRepo.findAll().stream().filter(fileDatum -> fileDatum.getFileDataNum() != null + && fileDatum.getFileDataNum().toUpperCase().contains("I.T.C")).count(); + } + + @Transactional(readOnly = true) + public Long getAllEdpFileData() { + return fileDataRepo.findAll().stream().filter(fileDatum -> fileDatum.getFileDataNum() != null + && fileDatum.getFileDataNum().toUpperCase().contains("E.D.P")).count(); + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/service/FolderService.java b/src/main/java/com/adjustment_file_management_system/springboot/service/FolderService.java new file mode 100644 index 0000000..ed2e41b --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/service/FolderService.java @@ -0,0 +1,119 @@ +package com.adjustment_file_management_system.springboot.service; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Calendar; +import java.util.Date; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import com.adjustment_file_management_system.springboot.configuration.FileDataProperties; +import com.adjustment_file_management_system.springboot.configuration.FileDataPropertiesConfiguration; + +import jakarta.annotation.PostConstruct; + +@Service +public class FolderService { + + private static final Logger logger = LoggerFactory.getLogger(FolderService.class); + + @Autowired + private FileDataPropertiesConfiguration fileDataPropsConfig; + + @Autowired + private FileDataProperties fileDataProps; + + private Path fullUploadPath; + + @PostConstruct + public void init() throws IOException { + // Initialize absolute upload path after config is ready + fullUploadPath = fileDataPropsConfig.getUploadDirFile().toPath(); + Files.createDirectories(fullUploadPath); + } + + /** + * Save uploaded file in a structured directory: + * uploads/file-data/{fileNum}/{category}/{category-year.extension} + * + * @param fileNum File number (e.g., I.T.C.C.NO.C1/240/2024) + * @param fileType Category (AS, PI, RTGS) + * @param genDate Generation date for naming (if null, current date is used) + * @param file The uploaded MultipartFile + * @return relative path (for DB) + */ + public String saveFile(String fileNum, String fileType, Date genDate, MultipartFile file) throws IOException { + // Build target directory under the absolute upload path + Path targetDir = fullUploadPath.resolve(fileNum).resolve(fileType); + Files.createDirectories(targetDir); + + // Extract file extension + String originalName = file.getOriginalFilename(); + String extension = ""; + String baseName = "file"; // Fallback name + if (originalName != null && originalName.contains(".")) { + int dotIndex = originalName.lastIndexOf("."); + if (dotIndex >= 0) { + extension = originalName.substring(dotIndex); // Includes dot + baseName = originalName.substring(0, dotIndex); // Name without extension + } else { + baseName = originalName; + } + } + + /** + * Sanitize the base name by removing leading/trailing spaces, replacing spaces + * with underscore and removing special characters except _ and - + **/ + baseName = baseName.trim().replaceAll("\\s+", "_").replaceAll("[^a-zA-Z0-9_\\-]", ""); + + // Use provided date or fallback to current date + Calendar cal = Calendar.getInstance(); + if (genDate != null) { + cal.setTime(genDate); + } + int year = cal.get(Calendar.YEAR); + + // Build new filename: originalname-filetype-year.extension + String newFileName = baseName + "-" + fileType.toLowerCase() + "-" + year + extension; + + // Save file + Path targetPath = targetDir.resolve(newFileName); + file.transferTo(targetPath.toFile()); + + logger.info("Saved file to {}", targetPath.toAbsolutePath()); + + // Return relative path to store in DB + return "/" + + Paths.get(fileDataProps.getUploadDir(), fileNum, fileType, newFileName).toString().replace("\\", "/"); + + } + + /** + * Utility method to safely delete a file. + */ + public void deleteFileIfExists(String filePath) { + if (filePath != null && !filePath.equals("-")) { + try { + File file = new File(filePath); + if (file.exists() && file.isFile()) { + if (file.delete()) { + logger.info("Deleted orphan file: {}", filePath); + } else { + logger.warn("Failed to delete orphan file: {}", filePath); + } + } + } catch (Exception ex) { + logger.error("Error while deleting file {}: {}", filePath, ex.getMessage(), ex); + } + } + } + +} diff --git a/src/main/java/com/adjustment_file_management_system/springboot/service/HomeService.java b/src/main/java/com/adjustment_file_management_system/springboot/service/HomeService.java new file mode 100644 index 0000000..4eb5c07 --- /dev/null +++ b/src/main/java/com/adjustment_file_management_system/springboot/service/HomeService.java @@ -0,0 +1,64 @@ +package com.adjustment_file_management_system.springboot.service; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import com.adjustment_file_management_system.springboot.model.AppUser; +import com.adjustment_file_management_system.springboot.repository.AppUserRepository; +import com.adjustment_file_management_system.springboot.repository.FileDataRepository; + + +@Service +public class HomeService implements UserDetailsService { + + @Autowired + private AppUserRepository appUsrRepo; + + @Autowired + private FileDataRepository fileDataRepo; + + @Autowired + private FileDataService fileDataSer; + + private static final Logger logger = LoggerFactory.getLogger(HomeService.class); + + @Override + public UserDetails loadUserByUsername(String usrName) throws UsernameNotFoundException { + logger.info("Loading user: {}", usrName); + Optional optAppUsr = appUsrRepo.findByUsrName(usrName); + + AppUser appUsr = optAppUsr + .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + usrName)); + + // Uses Bcrypt for password verification + UserDetails userDetails = User.withUsername(appUsr.getUsrName()).password(appUsr.getUsrPass()) + .authorities(appUsr.getUsrRole().getUsrRoleName()).build(); + + return userDetails; + } + + public Map getFileDataStat() { + Map fileDatumStat = new HashMap(); + Long totFileDatum = fileDataRepo.count(); + Long totAdjustFileDatum = fileDataSer.getAllAdjustFileData(); + Long totNotAdjustFileDatum = fileDataSer.getAllNotAdjustFileData(); + Long totItcFileDatum = fileDataSer.getAllItcFileData(); + Long totEdpFileDatum = fileDataSer.getAllEdpFileData(); + fileDatumStat.put("totFile", totFileDatum); + fileDatumStat.put("totAdjustFile", totAdjustFileDatum); + fileDatumStat.put("totNotAdjustFile", totNotAdjustFileDatum); + fileDatumStat.put("totItcFile", totItcFileDatum); + fileDatumStat.put("totEdpFile", totEdpFileDatum); + return fileDatumStat; + } +} diff --git a/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 0000000..358f2a2 --- /dev/null +++ b/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,12 @@ +{"properties": [ + { + "name": "file.data.upload-dir", + "type": "java.lang.String", + "description": "Folder or Directory where all the uploaded files are stored" + }, + { + "name": "app.security.force-https", + "type": "java.lang.String", + "description": "Enables Forcing of HTTPS for CSRF" + } +]} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..e629843 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,48 @@ +spring.application.name=adjustment_file_management_system +server.port=8190 +server.address=0.0.0.0 +# 30 minutes +server.servlet.session.timeout=30m + +# =============================== +# Oracle Database Configuration +# =============================== +# Production DB server +# spring.datasource.url=jdbc:oracle:thin:@10.1.0.14:1521:chncorp +# spring.datasource.username=fileadjust +# spring.datasource.password=fileadjust +spring.datasource.url=${DB_URL} +spring.datasource.username=${DB_USERNAME} +spring.datasource.password=${DB_PASSWORD} +# Local DB server +# spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/XEPDB1 +# spring.datasource.username=gcc +# spring.datasource.password=product +spring.datasource.driver-class-name=oracle.jdbc.OracleDriver + +# =============================== +# JPA / Hibernate Config +# =============================== +# spring.jpa.database-platform=org.hibernate.dialect.OracleDialect +# spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +# spring.jpa.properties.hibernate.format_sql=true +spring.jpa.open-in-view=true +logging.level.org.hibernate.SQL=DEBUG +# logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE +logging.level.org.hibernate.type.descriptor.sql=TRACE + + +# Directory/Folder to store uploaded files (can be used anywhere in the app using @Value or Environment) +# Relative path inside project root +file.data.upload-dir=uploads/file-data/ + +# Max file size (single file) +spring.servlet.multipart.max-file-size=100MB + +# Max request size (total request size including multiple files) +spring.servlet.multipart.max-request-size=400MB + +# To enable forced HTTPS for CSRF (false for dev/testing and https is disabled, true for production only if https is enabled) +# (can be used anywhere in the app using @Value or Environment) +app.security.force-https=${FORCE_HTTPS:false} \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..9b1df54 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,33 @@ + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) [%thread] %logger - %msg%n + + + + + + + ${LOG_DIR}/app-logs.txt + + + + ${LOG_DIR}/app-logs.%d{yyyy-MM-dd}.txt + + + %d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger - %msg%n + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/bootstrap-5.3.2/css/bootstrap.min.css b/src/main/resources/static/bootstrap-5.3.2/css/bootstrap.min.css new file mode 100644 index 0000000..06ef212 --- /dev/null +++ b/src/main/resources/static/bootstrap-5.3.2/css/bootstrap.min.css @@ -0,0 +1,11794 @@ +@charset "UTF-8"; /*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root, +[data-bs-theme="light"] { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-primary-text-emphasis: #052c65; + --bs-secondary-text-emphasis: #2b2f32; + --bs-success-text-emphasis: #0a3622; + --bs-info-text-emphasis: #055160; + --bs-warning-text-emphasis: #664d03; + --bs-danger-text-emphasis: #58151c; + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: #cfe2ff; + --bs-secondary-bg-subtle: #e2e3e5; + --bs-success-bg-subtle: #d1e7dd; + --bs-info-bg-subtle: #cff4fc; + --bs-warning-bg-subtle: #fff3cd; + --bs-danger-bg-subtle: #f8d7da; + --bs-light-bg-subtle: #fcfcfd; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #9ec5fe; + --bs-secondary-border-subtle: #c4c8cb; + --bs-success-border-subtle: #a3cfbb; + --bs-info-border-subtle: #9eeaf9; + --bs-warning-border-subtle: #ffe69c; + --bs-danger-border-subtle: #f1aeb5; + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, + "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji"; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.15), + rgba(255, 255, 255, 0) + ); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #212529; + --bs-body-color-rgb: 33, 37, 41; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(33, 37, 41, 0.75); + --bs-secondary-color-rgb: 33, 37, 41; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(33, 37, 41, 0.5); + --bs-tertiary-color-rgb: 33, 37, 41; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: #0a58ca; + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-color: #212529; + --bs-highlight-bg: #fff3cd; + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545; +} +[data-bs-theme="dark"] { + /* color-scheme: dark; */ + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: #2b3035; + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: #6ea8fe; + --bs-secondary-text-emphasis: #a7acb1; + --bs-success-text-emphasis: #75b798; + --bs-info-text-emphasis: #6edff6; + --bs-warning-text-emphasis: #ffda6a; + --bs-danger-text-emphasis: #ea868f; + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #031633; + --bs-secondary-bg-subtle: #161719; + --bs-success-bg-subtle: #051b11; + --bs-info-bg-subtle: #032830; + --bs-warning-bg-subtle: #332701; + --bs-danger-bg-subtle: #2c0b0e; + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: #084298; + --bs-secondary-border-subtle: #41464b; + --bs-success-border-subtle: #0f5132; + --bs-info-border-subtle: #087990; + --bs-warning-border-subtle: #997404; + --bs-danger-border-subtle: #842029; + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-heading-color: inherit; + --bs-link-color: #6ea8fe; + --bs-link-hover-color: #8bb9fe; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: #e685b5; + --bs-highlight-color: #dee2e6; + --bs-highlight-bg: #664d03; + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #75b798; + --bs-form-valid-border-color: #75b798; + --bs-form-invalid-color: #ea868f; + --bs-form-invalid-border-color: #ea868f; +} +*, +::after, +::before { + box-sizing: border-box; +} +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; +} +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: 0.25; +} +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; + color: var(--bs-heading-color); +} +.h1, +h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + .h1, + h1 { + font-size: 2.5rem; + } +} +.h2, +h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + .h2, + h2 { + font-size: 2rem; + } +} +.h3, +h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + .h3, + h3 { + font-size: 1.75rem; + } +} +.h4, +h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + .h4, + h4 { + font-size: 1.5rem; + } +} +.h5, +h5 { + font-size: 1.25rem; +} +.h6, +h6 { + font-size: 1rem; +} +p { + margin-top: 0; + margin-bottom: 1rem; +} +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} +ol, +ul { + padding-left: 2rem; +} +dl, +ol, +ul { + margin-top: 0; + margin-bottom: 1rem; +} +ol ol, +ol ul, +ul ol, +ul ul { + margin-bottom: 0; +} +dt { + font-weight: 700; +} +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} +blockquote { + margin: 0 0 1rem; +} +b, +strong { + font-weight: bolder; +} +.small, +small { + font-size: 0.875em; +} +.mark, +mark { + padding: 0.1875em; + color: var(--bs-highlight-color); + background-color: var(--bs-highlight-bg); +} +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline; +} +a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); +} +a:not([href]):not([class]), +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} +code, +kbd, +pre, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} +figure { + margin: 0 0 1rem; +} +img, +svg { + vertical-align: middle; +} +table { + caption-side: bottom; + border-collapse: collapse; +} +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-secondary-color); + text-align: left; +} +th { + text-align: inherit; + text-align: -webkit-match-parent; +} +tbody, +td, +tfoot, +th, +thead, +tr { + border-color: inherit; + border-style: solid; + border-width: 0; +} +label { + display: inline-block; +} +button { + border-radius: 0; +} +button:focus:not(:focus-visible) { + outline: 0; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +button, +select { + text-transform: none; +} +[role="button"] { + cursor: pointer; +} +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} +[list]:not([type="date"]):not([type="datetime-local"]):not([type="month"]):not( + [type="week"] + ):not([type="time"])::-webkit-calendar-picker-indicator { + display: none !important; +} +[type="button"], +[type="reset"], +[type="submit"], +button { + -webkit-appearance: button; + appearance: button; +} +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled), +button:not(:disabled) { + cursor: pointer; +} +::-moz-focus-inner { + padding: 0; + border-style: none; +} +textarea { + resize: vertical; +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-year-field { + padding: 0; +} +::-webkit-inner-spin-button { + height: auto; +} +[type="search"] { + -webkit-appearance: textfield; + appearance: textfield; + outline-offset: -2px; +} +::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-color-swatch-wrapper { + padding: 0; +} +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} +::file-selector-button { + font: inherit; + -webkit-appearance: button; + appearance: button; +} +output { + display: inline-block; +} +iframe { + border: 0; +} +summary { + display: list-item; + cursor: pointer; +} +progress { + vertical-align: baseline; +} +[hidden] { + display: none !important; +} +.lead { + font-size: 1.25rem; + font-weight: 300; +} +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; +} +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} +.img-fluid { + max-width: 100%; + height: auto; +} +.img-thumbnail { + padding: 0.25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + max-width: 100%; + height: auto; +} +.figure { + display: inline-block; +} +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} +.figure-caption { + font-size: 0.875em; + color: var(--bs-secondary-color); +} +.container, +.container-fluid, +.container-lg, +.container-md, +.container-sm, +.container-xl, +.container-xxl { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container, + .container-sm { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container, + .container-md, + .container-sm { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container, + .container-lg, + .container-md, + .container-sm { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container, + .container-lg, + .container-md, + .container-sm, + .container-xl { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container, + .container-lg, + .container-md, + .container-sm, + .container-xl, + .container-xxl { + max-width: 1320px; + } +} +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} +.col { + flex: 1 0 0%; +} +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.33333333%; +} +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.66666667%; +} +.col-auto { + flex: 0 0 auto; + width: auto; +} +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} +.col-3 { + flex: 0 0 auto; + width: 25%; +} +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} +.col-6 { + flex: 0 0 auto; + width: 50%; +} +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} +.col-9 { + flex: 0 0 auto; + width: 75%; +} +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} +.col-12 { + flex: 0 0 auto; + width: 100%; +} +.offset-1 { + margin-left: 8.33333333%; +} +.offset-2 { + margin-left: 16.66666667%; +} +.offset-3 { + margin-left: 25%; +} +.offset-4 { + margin-left: 33.33333333%; +} +.offset-5 { + margin-left: 41.66666667%; +} +.offset-6 { + margin-left: 50%; +} +.offset-7 { + margin-left: 58.33333333%; +} +.offset-8 { + margin-left: 66.66666667%; +} +.offset-9 { + margin-left: 75%; +} +.offset-10 { + margin-left: 83.33333333%; +} +.offset-11 { + margin-left: 91.66666667%; +} +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0%; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: var(--bs-emphasis-color); + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-emphasis-color); + --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); + --bs-table-active-color: var(--bs-emphasis-color); + --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); + --bs-table-hover-color: var(--bs-emphasis-color); + --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); + width: 100%; + margin-bottom: 1rem; + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + color: var( + --bs-table-color-state, + var(--bs-table-color-type, var(--bs-table-color)) + ); + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px + var( + --bs-table-bg-state, + var(--bs-table-bg-type, var(--bs-table-accent-bg)) + ); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; +} +.caption-top { + caption-side: top; +} +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} +.table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width); +} +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-striped-columns > :not(caption) > tr > :nth-child(2n) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} +.table-active { + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg); +} +.table-hover > tbody > tr:hover > * { + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg); +} +.table-primary { + --bs-table-color: #000; + --bs-table-bg: #cfe2ff; + --bs-table-border-color: #a6b5cc; + --bs-table-striped-bg: #c5d7f2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bacbe6; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfd1ec; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: #e2e3e5; + --bs-table-border-color: #b5b6b7; + --bs-table-striped-bg: #d7d8da; + --bs-table-striped-color: #000; + --bs-table-active-bg: #cbccce; + --bs-table-active-color: #000; + --bs-table-hover-bg: #d1d2d4; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-success { + --bs-table-color: #000; + --bs-table-bg: #d1e7dd; + --bs-table-border-color: #a7b9b1; + --bs-table-striped-bg: #c7dbd2; + --bs-table-striped-color: #000; + --bs-table-active-bg: #bcd0c7; + --bs-table-active-color: #000; + --bs-table-hover-bg: #c1d6cc; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-info { + --bs-table-color: #000; + --bs-table-bg: #cff4fc; + --bs-table-border-color: #a6c3ca; + --bs-table-striped-bg: #c5e8ef; + --bs-table-striped-color: #000; + --bs-table-active-bg: #badce3; + --bs-table-active-color: #000; + --bs-table-hover-bg: #bfe2e9; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-warning { + --bs-table-color: #000; + --bs-table-bg: #fff3cd; + --bs-table-border-color: #ccc2a4; + --bs-table-striped-bg: #f2e7c3; + --bs-table-striped-color: #000; + --bs-table-active-bg: #e6dbb9; + --bs-table-active-color: #000; + --bs-table-hover-bg: #ece1be; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-danger { + --bs-table-color: #000; + --bs-table-bg: #f8d7da; + --bs-table-border-color: #c6acae; + --bs-table-striped-bg: #eccccf; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfc2c4; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5c7ca; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: #c6c7c8; + --bs-table-striped-bg: #ecedee; + --bs-table-striped-color: #000; + --bs-table-active-bg: #dfe0e1; + --bs-table-active-color: #000; + --bs-table-hover-bg: #e5e6e7; + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: #4d5154; + --bs-table-striped-bg: #2c3034; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #373b3e; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #323539; + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} +.col-form-label { + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} +.col-form-label-lg { + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); + font-size: 1.25rem; +} +.col-form-label-sm { + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); + font-size: 0.875rem; +} +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-secondary-color); +} +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type="file"] { + overflow: hidden; +} +.form-control[type="file"]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0; +} +.form-control::-webkit-datetime-edit { + display: block; + padding: 0; +} +.form-control::-moz-placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: var(--bs-secondary-bg); +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg); +} +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0; +} +.form-control-plaintext:focus { + outline: 0; +} +.form-control-plaintext.form-control-lg, +.form-control-plaintext.form-control-sm { + padding-right: 0; + padding-left: 0; +} +.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +textarea.form-control { + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color::-webkit-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} +.form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), + var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], +.form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: var(--bs-secondary-bg); +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color); +} +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +[data-bs-theme="dark"] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} +.form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + flex-shrink: 0; + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-print-color-adjust: exact; + print-color-adjust: exact; + /* print-color-adjust: exact; */ +} +.form-check-input[type="checkbox"] { + border-radius: 0.25em; +} +.form-check-input[type="radio"] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type="checkbox"] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type="radio"] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type="checkbox"]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input:disabled ~ .form-check-label, +.form-check-input[disabled] ~ .form-check-label { + cursor: default; + opacity: 0.5; +} +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check:disabled + .btn, +.btn-check[disabled] + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} +[data-bs-theme="dark"] + .form-switch + .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); +} +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + -webkit-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #b6d4fe; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + -moz-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #b6d4fe; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color); +} +.form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color); +} +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control-plaintext::-moz-placeholder, +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control-plaintext::placeholder, +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control-plaintext:not(:-moz-placeholder-shown), +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown), +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control-plaintext:-webkit-autofill, +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > .form-control-plaintext ~ label::after, +.form-floating > .form-control:focus ~ label::after, +.form-floating > .form-control:not(:placeholder-shown) ~ label::after, +.form-floating > .form-select ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > .form-control:-webkit-autofill ~ label { + color: rgba(var(--bs-body-color-rgb), 0.65); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; +} +.form-floating > .form-control:disabled ~ label, +.form-floating > :disabled ~ label { + color: #6c757d; +} +.form-floating > .form-control:disabled ~ label::after, +.form-floating > :disabled ~ label::after { + background-color: var(--bs-secondary-bg); +} +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-floating, +.input-group > .form-select { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-floating:focus-within, +.input-group > .form-select:focus { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); +} +.input-group-lg > .btn, +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.input-group-sm > .btn, +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3), +.input-group:not(.has-validation) + > .form-floating:not(:last-child) + > .form-control, +.input-group:not(.has-validation) + > .form-floating:not(:last-child) + > .form-select, +.input-group:not(.has-validation) + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4), +.input-group.has-validation + > .form-floating:nth-last-child(n + 3) + > .form-control, +.input-group.has-validation + > .form-floating:nth-last-child(n + 3) + > .form-select, +.input-group.has-validation + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu):not( + .form-floating + ) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group + > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not( + .valid-feedback + ):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: calc(var(--bs-border-width) * -1); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-valid-color); +} +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius); +} +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip, +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip { + display: block; +} +.form-control.is-valid, +.was-validated .form-control:valid { + border-color: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-valid:focus, +.was-validated .form-control:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-valid, +.was-validated .form-select:valid { + border-color: var(--bs-form-valid-border-color); +} +.form-select.is-valid:not([multiple]):not([size]), +.form-select.is-valid:not([multiple])[size="1"], +.was-validated .form-select:valid:not([multiple]):not([size]), +.was-validated .form-select:valid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-valid:focus, +.was-validated .form-select:valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.form-control-color.is-valid, +.was-validated .form-control-color:valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.form-check-input.is-valid, +.was-validated .form-check-input:valid { + border-color: var(--bs-form-valid-border-color); +} +.form-check-input.is-valid:checked, +.was-validated .form-check-input:valid:checked { + background-color: var(--bs-form-valid-color); +} +.form-check-input.is-valid:focus, +.was-validated .form-check-input:valid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.form-check-input.is-valid ~ .form-check-label, +.was-validated .form-check-input:valid ~ .form-check-label { + color: var(--bs-form-valid-color); +} +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} +.input-group > .form-control:not(:focus).is-valid, +.input-group > .form-floating:not(:focus-within).is-valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-control:not(:focus):valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.was-validated .input-group > .form-select:not(:focus):valid { + z-index: 3; +} +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-invalid-color); +} +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius); +} +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip, +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip { + display: block; +} +.form-control.is-invalid, +.was-validated .form-control:invalid { + border-color: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-invalid:focus, +.was-validated .form-control:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-invalid, +.was-validated .form-select:invalid { + border-color: var(--bs-form-invalid-border-color); +} +.form-select.is-invalid:not([multiple]):not([size]), +.form-select.is-invalid:not([multiple])[size="1"], +.was-validated .form-select:invalid:not([multiple]):not([size]), +.was-validated .form-select:invalid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-invalid:focus, +.was-validated .form-select:invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.form-control-color.is-invalid, +.was-validated .form-control-color:invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} +.form-check-input.is-invalid, +.was-validated .form-check-input:invalid { + border-color: var(--bs-form-invalid-border-color); +} +.form-check-input.is-invalid:checked, +.was-validated .form-check-input:invalid:checked { + background-color: var(--bs-form-invalid-color); +} +.form-check-input.is-invalid:focus, +.was-validated .form-check-input:invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.form-check-input.is-invalid ~ .form-check-label, +.was-validated .form-check-input:invalid ~ .form-check-label { + color: var(--bs-form-invalid-color); +} +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} +.input-group > .form-control:not(:focus).is-invalid, +.input-group > .form-floating:not(:focus-within).is-invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-control:not(:focus):invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.was-validated .input-group > .form-select:not(:focus):invalid { + z-index: 4; +} +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), + 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem + rgba(var(--bs-btn-focus-shadow-rgb), 0.5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, +.btn.active, +.btn.show, +.btn:first-child:active, +:not(.btn-check) + .btn:active { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, +.btn.active:focus-visible, +.btn.show:focus-visible, +.btn:first-child:active:focus-visible, +:not(.btn-check) + .btn:active:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn.disabled, +.btn:disabled, +fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0b5ed7; + --bs-btn-hover-border-color: #0a58ca; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0a58ca; + --bs-btn-active-border-color: #0a53be; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd; +} +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #5c636a; + --bs-btn-hover-border-color: #565e64; + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #565e64; + --bs-btn-active-border-color: #51585e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d; +} +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #157347; + --bs-btn-hover-border-color: #146c43; + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #146c43; + --bs-btn-active-border-color: #13653f; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #31d2f2; + --bs-btn-hover-border-color: #25cff2; + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #3dd5f3; + --bs-btn-active-border-color: #25cff2; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffca2c; + --bs-btn-hover-border-color: #ffc720; + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffcd39; + --bs-btn-active-border-color: #ffc720; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #bb2d3b; + --bs-btn-hover-border-color: #b02a37; + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #b02a37; + --bs-btn-active-border-color: #a52834; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #d3d4d5; + --bs-btn-hover-border-color: #c6c7c8; + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #c6c7c8; + --bs-btn-active-border-color: #babbbc; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #424649; + --bs-btn-hover-border-color: #373b3e; + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #4d5154; + --bs-btn-active-border-color: #373b3e; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} +.btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none; +} +.btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none; +} +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} +.btn-group-lg > .btn, +.btn-lg { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); +} +.btn-group-sm > .btn, +.btn-sm { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); +} +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} +.collapse:not(.show) { + display: none; +} +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} +.dropdown, +.dropdown-center, +.dropend, +.dropstart, +.dropup, +.dropup-center { + position: relative; +} +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc( + var(--bs-border-radius) - var(--bs-border-width) + ); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: var(--bs-box-shadow); + --bs-dropdown-link-color: var(--bs-body-color); + --bs-dropdown-link-hover-color: var(--bs-body-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid + var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0); +} +.dropdown-item:focus, +.dropdown-item:hover { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, +.dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, +.dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} +.dropdown-menu.show { + display: block; +} +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) + var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group-vertical > .btn, +.btn-group > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn.active, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:hover, +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn.active, +.btn-group > .btn:active, +.btn-group > .btn:focus, +.btn-group > .btn:hover { + z-index: 1; +} +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} +.btn-group { + border-radius: var(--bs-border-radius); +} +.btn-group > .btn-group:not(:first-child), +.btn-group > :not(.btn-check:first-child) + .btn { + margin-left: calc(var(--bs-border-width) * -1); +} +.btn-group > .btn-group:not(:last-child) > .btn, +.btn-group > .btn.dropdown-toggle-split:first-child, +.btn-group > .btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:not(:first-child) > .btn, +.btn-group > .btn:nth-child(n + 3), +.btn-group > :not(.btn-check) + .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, +.dropend .dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} +.btn-group-sm > .btn + .dropdown-toggle-split, +.btn-sm + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} +.btn-group-lg > .btn + .dropdown-toggle-split, +.btn-lg + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn-group:not(:first-child), +.btn-group-vertical > .btn:not(:first-child) { + margin-top: calc(var(--bs-border-width) * -1); +} +.btn-group-vertical > .btn-group:not(:last-child) > .btn, +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child) > .btn, +.btn-group-vertical > .btn ~ .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: 0 0; + border: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:focus, +.nav-link:hover { + color: var(--bs-nav-link-hover-color); +} +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.nav-link.disabled, +.nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} +.nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) + var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) + var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid + var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:focus, +.nav-tabs .nav-link:hover { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd; +} +.nav-pills .nav-link { + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); +} +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; +} +.nav-underline .nav-link:focus, +.nav-underline .nav-link:hover { + border-bottom-color: currentcolor; +} +.nav-underline .nav-link.active, +.nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; +} +.nav-fill .nav-item, +.nav-fill > .nav-link { + flex: 1 1 auto; + text-align: center; +} +.nav-justified .nav-item, +.nav-justified > .nav-link { + flex-basis: 0; + flex-grow: 1; + text-align: center; +} +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-lg, +.navbar > .container-md, +.navbar > .container-sm, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:focus, +.navbar-brand:hover { + color: var(--bs-navbar-brand-hover-color); +} +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link.active, +.navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:focus, +.navbar-text a:hover { + color: var(--bs-navbar-active-color); +} +.navbar-collapse { + flex-basis: 100%; + flex-grow: 1; + align-items: center; +} +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) + var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); +} +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} +.navbar-dark, +.navbar[data-bs-theme="dark"] { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +[data-bs-theme="dark"] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color); +} +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; + color: var(--bs-card-subtitle-color); +} +.card-text:last-child { + margin-bottom: 0; +} +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius) 0 0; +} +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) + var(--bs-card-inner-border-radius); +} +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); +} +.card-img, +.card-img-bottom, +.card-img-top { + width: 100%; +} +.card-img, +.card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card-img, +.card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-header, + .card-group > .card:not(:last-child) .card-img-top { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-footer, + .card-group > .card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-header, + .card-group > .card:not(:first-child) .card-img-top { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-footer, + .card-group > .card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0; + } +} +.accordion { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc( + var(--bs-border-radius) - (var(--bs-border-width)) + ); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-border-color: #86b7fe; + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle); +} +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 + var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: var(--bs-accordion-btn-focus-border-color); + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} +.accordion-header { + margin-bottom: 0; +} +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid + var(--bs-accordion-border-color); +} +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-body { + padding: var(--bs-accordion-body-padding-y) + var(--bs-accordion-body-padding-x); +} +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button, +.accordion-flush .accordion-item .accordion-button.collapsed { + border-radius: 0; +} +[data-bs-theme="dark"] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/"); +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none; +} +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid + var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.active > .page-link, +.page-link.active { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.disabled > .page-link, +.page-link.disabled { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} +.page-item:not(:first-child) .page-link { + margin-left: calc(var(--bs-border-width) * -1); +} +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); +} +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); +} +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} +.alert-heading { + color: inherit; +} +.alert-link { + font-weight: 700; + color: var(--bs-alert-link-color); +} +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} +.alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); +} +.alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); +} +.alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); +} +.alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); +} +.alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); +} +.alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); +} +.alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); +} +.alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); +} +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress, +.progress-stacked { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #0d6efd; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); +} +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} +.progress-bar-striped { + background-image: linear-gradient( + 45deg, + rgba(255, 255, 255, 0.15) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.15) 50%, + rgba(255, 255, 255, 0.15) 75%, + transparent 75%, + transparent + ); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} +.progress-stacked > .progress { + overflow: visible; +} +.progress-stacked > .progress > .progress-bar { + width: 100%; +} +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} +.list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #0d6efd; + --bs-list-group-active-border-color: #0d6efd; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); +} +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:focus, +.list-group-item-action:hover { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) + var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid + var(--bs-list-group-border-color); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, +.list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} +.list-group-item-primary { + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); +} +.list-group-item-secondary { + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); +} +.list-group-item-success { + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis); +} +.list-group-item-info { + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis); +} +.list-group-item-warning { + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); +} +.list-group-item-danger { + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); +} +.list-group-item-light { + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis); +} +.list-group-item-dark { + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); +} +.btn-close { + --bs-btn-close-color: #000; + --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.5; + --bs-btn-close-hover-opacity: 0.75; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; + --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + border: 0; + border-radius: 0.375rem; + opacity: var(--bs-btn-close-opacity); +} +.btn-close:hover { + color: var(--bs-btn-close-color); + text-decoration: none; + opacity: var(--bs-btn-close-hover-opacity); +} +.btn-close:focus { + outline: 0; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity); +} +.btn-close.disabled, +.btn-close:disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: var(--bs-btn-close-disabled-opacity); +} +.btn-close-white { + filter: var(--bs-btn-close-white-filter); +} +[data-bs-theme="dark"] .btn-close { + filter: var(--bs-btn-close-white-filter); +} +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid + var(--bs-toast-header-border-color); + border-top-left-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); + border-top-right-radius: calc( + var(--bs-toast-border-radius) - var(--bs-toast-border-width) + ); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: ; + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: var(--bs-box-shadow-sm); + --bs-modal-inner-border-radius: calc( + var(--bs-border-radius-lg) - (var(--bs-border-width)) + ); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: transform 0.3s ease-out; + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; +} +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + justify-content: space-between; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid + var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) + calc(var(--bs-modal-header-padding-x) * 0.5); + margin: calc(-0.5 * var(--bs-modal-header-padding-y)) + calc(-0.5 * var(--bs-modal-header-padding-x)) + calc(-0.5 * var(--bs-modal-header-padding-y)) auto; +} +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid + var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: var(--bs-box-shadow); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-footer, +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-footer, + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-footer, + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-footer, + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-footer, + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-footer, + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + margin: var(--bs-tooltip-margin); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow, +.bs-tooltip-top .tooltip-arrow { + bottom: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before, +.bs-tooltip-top .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) + calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow, +.bs-tooltip-end .tooltip-arrow { + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before, +.bs-tooltip-end .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) + 0; + border-right-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow, +.bs-tooltip-bottom .tooltip-arrow { + top: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before, +.bs-tooltip-bottom .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) + var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow, +.bs-tooltip-start .tooltip-arrow { + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before, +.bs-tooltip-start .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 + calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); +} +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc( + var(--bs-border-radius-lg) - var(--bs-border-width) + ); + --bs-popover-box-shadow: var(--bs-box-shadow); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: inherit; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::after, +.popover .popover-arrow::before { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow, +.bs-popover-top > .popover-arrow { + bottom: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::after, +.bs-popover-top > .popover-arrow::before { + border-width: var(--bs-popover-arrow-height) + calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="top"] > .popover-arrow::after, +.bs-popover-top > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow, +.bs-popover-end > .popover-arrow { + left: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::after, +.bs-popover-end > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) + 0; +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="right"] > .popover-arrow::after, +.bs-popover-end > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow, +.bs-popover-bottom > .popover-arrow { + top: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::after, +.bs-popover-bottom > .popover-arrow::before { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) + var(--bs-popover-arrow-height); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="bottom"] > .popover-arrow::after, +.bs-popover-bottom > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before, +.bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-header-bg); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow, +.bs-popover-start > .popover-arrow { + right: calc( + -1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width) + ); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after, +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::after, +.bs-popover-start > .popover-arrow::before { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 + calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-auto[data-popper-placement^="left"] > .popover-arrow::after, +.bs-popover-start > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} +.popover-header { + padding: var(--bs-popover-header-padding-y) + var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid + var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); +} +.popover-header:empty { + display: none; +} +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} +.carousel { + position: relative; +} +.carousel.pointer-event { + touch-action: pan-y; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} +.carousel-item-next, +.carousel-item-prev, +.carousel-item.active { + display: block; +} +.active.carousel-item-end, +.carousel-item-next:not(.carousel-item-start) { + transform: translateX(100%); +} +.active.carousel-item-start, +.carousel-item-prev:not(.carousel-item-end) { + transform: translateX(-100%); +} +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end, +.carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-end, +.carousel-fade .active.carousel-item-start { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-end, + .carousel-fade .active.carousel-item-start { + transition: none; + } +} +.carousel-control-next, +.carousel-control-prev { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: 0 0; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-next, + .carousel-control-prev { + transition: none; + } +} +.carousel-control-next:focus, +.carousel-control-next:hover, +.carousel-control-prev:focus, +.carousel-control-prev:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} +.carousel-control-prev { + left: 0; +} +.carousel-control-next { + right: 0; +} +.carousel-control-next-icon, +.carousel-control-prev-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} +.carousel-dark .carousel-control-next-icon, +.carousel-dark .carousel-control-prev-icon { + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} +[data-bs-theme="dark"] .carousel .carousel-control-next-icon, +[data-bs-theme="dark"] .carousel .carousel-control-prev-icon, +[data-bs-theme="dark"].carousel .carousel-control-next-icon, +[data-bs-theme="dark"].carousel .carousel-control-prev-icon { + filter: invert(1) grayscale(100); +} +[data-bs-theme="dark"] .carousel .carousel-indicators [data-bs-target], +[data-bs-theme="dark"].carousel .carousel-indicators [data-bs-target] { + background-color: #000; +} +[data-bs-theme="dark"] .carousel .carousel-caption, +[data-bs-theme="dark"].carousel .carousel-caption { + color: #000; +} +.spinner-border, +.spinner-grow { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite + var(--bs-spinner-animation-name); +} +@keyframes spinner-border { + to { + transform: rotate(360deg); + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, +.offcanvas-lg, +.offcanvas-md, +.offcanvas-sm, +.offcanvas-xl, +.offcanvas-xxl { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5; +} +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-sm.show:not(.hiding), + .offcanvas-sm.showing { + transform: none; + } + .offcanvas-sm.hiding, + .offcanvas-sm.show, + .offcanvas-sm.showing { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-md.show:not(.hiding), + .offcanvas-md.showing { + transform: none; + } + .offcanvas-md.hiding, + .offcanvas-md.show, + .offcanvas-md.showing { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-lg.show:not(.hiding), + .offcanvas-lg.showing { + transform: none; + } + .offcanvas-lg.hiding, + .offcanvas-lg.show, + .offcanvas-lg.showing { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xl.show:not(.hiding), + .offcanvas-xl.showing { + transform: none; + } + .offcanvas-xl.hiding, + .offcanvas-xl.show, + .offcanvas-xl.showing { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xxl.show:not(.hiding), + .offcanvas-xxl.showing { + transform: none; + } + .offcanvas-xxl.hiding, + .offcanvas-xxl.show, + .offcanvas-xxl.showing { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid + var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.show:not(.hiding), +.offcanvas.showing { + transform: none; +} +.offcanvas.hiding, +.offcanvas.show, +.offcanvas.showing { + visibility: visible; +} +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} +.offcanvas-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) + calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); +} +.offcanvas-title { + margin-bottom: 0; + line-height: var(--bs-offcanvas-title-line-height); +} +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} +.placeholder-xs { + min-height: 0.6em; +} +.placeholder-sm { + min-height: 0.8em; +} +.placeholder-lg { + min-height: 1.2em; +} +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient( + 130deg, + #000 55%, + rgba(0, 0, 0, 0.8) 75%, + #000 95% + ); + mask-image: linear-gradient( + 130deg, + #000 55%, + rgba(0, 0, 0, 0.8) 75%, + #000 95% + ); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; +} +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} +.text-bg-primary { + color: #fff !important; + background-color: RGBA( + var(--bs-primary-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-secondary { + color: #fff !important; + background-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-success { + color: #fff !important; + background-color: RGBA( + var(--bs-success-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-info { + color: #000 !important; + background-color: RGBA( + var(--bs-info-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-warning { + color: #000 !important; + background-color: RGBA( + var(--bs-warning-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-danger { + color: #fff !important; + background-color: RGBA( + var(--bs-danger-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-light { + color: #000 !important; + background-color: RGBA( + var(--bs-light-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.text-bg-dark { + color: #fff !important; + background-color: RGBA( + var(--bs-dark-rgb), + var(--bs-bg-opacity, 1) + ) !important; +} +.link-primary { + color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-primary:focus, +.link-primary:hover { + color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 10, + 88, + 202, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 10, + 88, + 202, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-secondary { + color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-secondary:focus, +.link-secondary:hover { + color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 86, + 94, + 100, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 86, + 94, + 100, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-success { + color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-success-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-success-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-success:focus, +.link-success:hover { + color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 20, + 108, + 67, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 20, + 108, + 67, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-info { + color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-info-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-info-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-info:focus, +.link-info:hover { + color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 61, + 213, + 243, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 61, + 213, + 243, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-warning { + color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-warning:focus, +.link-warning:hover { + color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 255, + 205, + 57, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 255, + 205, + 57, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-danger { + color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-danger:focus, +.link-danger:hover { + color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 176, + 42, + 55, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 176, + 42, + 55, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-light { + color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-light-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-light-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-light:focus, +.link-light:hover { + color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 249, + 250, + 251, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 249, + 250, + 251, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-dark { + color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-dark:focus, +.link-dark:hover { + color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; + -webkit-text-decoration-color: RGBA( + 26, + 30, + 33, + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + 26, + 30, + 33, + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-body-emphasis { + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 1) + ) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-body-emphasis:focus, +.link-body-emphasis:hover { + color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-opacity, 0.75) + ) !important; + -webkit-text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ) !important; + text-decoration-color: RGBA( + var(--bs-emphasis-color-rgb), + var(--bs-link-underline-opacity, 0.75) + ) !important; +} +.focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) + var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) + var(--bs-focus-ring-color); +} +.icon-link { + display: inline-flex; + gap: 0.375rem; + align-items: center; + -webkit-text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-opacity, 0.5) + ); + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-opacity, 0.5) + ); + text-underline-offset: 0.25em; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; +} +.icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: 0.2s ease-in-out transform; +} +@media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none; + } +} +.icon-link-hover:focus-visible > .bi, +.icon-link-hover:hover > .bi { + transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); +} +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; +} +.sticky-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; +} +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: -webkit-sticky; + position: sticky; + bottom: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} +.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption), +.visually-hidden:not(caption) { + position: absolute !important; +} +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.vr { + display: inline-block; + align-self: stretch; + width: var(--bs-border-width); + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; +} +.align-baseline { + vertical-align: baseline !important; +} +.align-top { + vertical-align: top !important; +} +.align-middle { + vertical-align: middle !important; +} +.align-bottom { + vertical-align: bottom !important; +} +.align-text-bottom { + vertical-align: text-bottom !important; +} +.align-text-top { + vertical-align: text-top !important; +} +.float-start { + float: left !important; +} +.float-end { + float: right !important; +} +.float-none { + float: none !important; +} +.object-fit-contain { + -o-object-fit: contain !important; + object-fit: contain !important; +} +.object-fit-cover { + -o-object-fit: cover !important; + object-fit: cover !important; +} +.object-fit-fill { + -o-object-fit: fill !important; + object-fit: fill !important; +} +.object-fit-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; +} +.object-fit-none { + -o-object-fit: none !important; + object-fit: none !important; +} +.opacity-0 { + opacity: 0 !important; +} +.opacity-25 { + opacity: 0.25 !important; +} +.opacity-50 { + opacity: 0.5 !important; +} +.opacity-75 { + opacity: 0.75 !important; +} +.opacity-100 { + opacity: 1 !important; +} +.overflow-auto { + overflow: auto !important; +} +.overflow-hidden { + overflow: hidden !important; +} +.overflow-visible { + overflow: visible !important; +} +.overflow-scroll { + overflow: scroll !important; +} +.overflow-x-auto { + overflow-x: auto !important; +} +.overflow-x-hidden { + overflow-x: hidden !important; +} +.overflow-x-visible { + overflow-x: visible !important; +} +.overflow-x-scroll { + overflow-x: scroll !important; +} +.overflow-y-auto { + overflow-y: auto !important; +} +.overflow-y-hidden { + overflow-y: hidden !important; +} +.overflow-y-visible { + overflow-y: visible !important; +} +.overflow-y-scroll { + overflow-y: scroll !important; +} +.d-inline { + display: inline !important; +} +.d-inline-block { + display: inline-block !important; +} +.d-block { + display: block !important; +} +.d-grid { + display: grid !important; +} +.d-inline-grid { + display: inline-grid !important; +} +.d-table { + display: table !important; +} +.d-table-row { + display: table-row !important; +} +.d-table-cell { + display: table-cell !important; +} +.d-flex { + display: flex !important; +} +.d-inline-flex { + display: inline-flex !important; +} +.d-none { + display: none !important; +} +.shadow { + box-shadow: var(--bs-box-shadow) !important; +} +.shadow-sm { + box-shadow: var(--bs-box-shadow-sm) !important; +} +.shadow-lg { + box-shadow: var(--bs-box-shadow-lg) !important; +} +.shadow-none { + box-shadow: none !important; +} +.focus-ring-primary { + --bs-focus-ring-color: rgba( + var(--bs-primary-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-secondary { + --bs-focus-ring-color: rgba( + var(--bs-secondary-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-success { + --bs-focus-ring-color: rgba( + var(--bs-success-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-info { + --bs-focus-ring-color: rgba( + var(--bs-info-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-warning { + --bs-focus-ring-color: rgba( + var(--bs-warning-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-danger { + --bs-focus-ring-color: rgba( + var(--bs-danger-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-light { + --bs-focus-ring-color: rgba( + var(--bs-light-rgb), + var(--bs-focus-ring-opacity) + ); +} +.focus-ring-dark { + --bs-focus-ring-color: rgba( + var(--bs-dark-rgb), + var(--bs-focus-ring-opacity) + ); +} +.position-static { + position: static !important; +} +.position-relative { + position: relative !important; +} +.position-absolute { + position: absolute !important; +} +.position-fixed { + position: fixed !important; +} +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} +.top-0 { + top: 0 !important; +} +.top-50 { + top: 50% !important; +} +.top-100 { + top: 100% !important; +} +.bottom-0 { + bottom: 0 !important; +} +.bottom-50 { + bottom: 50% !important; +} +.bottom-100 { + bottom: 100% !important; +} +.start-0 { + left: 0 !important; +} +.start-50 { + left: 50% !important; +} +.start-100 { + left: 100% !important; +} +.end-0 { + right: 0 !important; +} +.end-50 { + right: 50% !important; +} +.end-100 { + right: 100% !important; +} +.translate-middle { + transform: translate(-50%, -50%) !important; +} +.translate-middle-x { + transform: translateX(-50%) !important; +} +.translate-middle-y { + transform: translateY(-50%) !important; +} +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} +.border-0 { + border: 0 !important; +} +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-top-0 { + border-top: 0 !important; +} +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-end-0 { + border-right: 0 !important; +} +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-bottom-0 { + border-bottom: 0 !important; +} +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) + var(--bs-border-color) !important; +} +.border-start-0 { + border-left: 0 !important; +} +.border-primary { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-primary-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-secondary-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-success { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-success-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} +.border-warning { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-warning-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-danger { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-danger-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-light { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-light-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} +.border-black { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-black-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-white { + --bs-border-opacity: 1; + border-color: rgba( + var(--bs-white-rgb), + var(--bs-border-opacity) + ) !important; +} +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; +} +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; +} +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; +} +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; +} +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; +} +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; +} +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; +} +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important; +} +.border-1 { + border-width: 1px !important; +} +.border-2 { + border-width: 2px !important; +} +.border-3 { + border-width: 3px !important; +} +.border-4 { + border-width: 4px !important; +} +.border-5 { + border-width: 5px !important; +} +.border-opacity-10 { + --bs-border-opacity: 0.1; +} +.border-opacity-25 { + --bs-border-opacity: 0.25; +} +.border-opacity-50 { + --bs-border-opacity: 0.5; +} +.border-opacity-75 { + --bs-border-opacity: 0.75; +} +.border-opacity-100 { + --bs-border-opacity: 1; +} +.w-25 { + width: 25% !important; +} +.w-50 { + width: 50% !important; +} +.w-75 { + width: 75% !important; +} +.w-100 { + width: 100% !important; +} +.w-auto { + width: auto !important; +} +.mw-100 { + max-width: 100% !important; +} +.vw-100 { + width: 100vw !important; +} +.min-vw-100 { + min-width: 100vw !important; +} +.h-25 { + height: 25% !important; +} +.h-50 { + height: 50% !important; +} +.h-75 { + height: 75% !important; +} +.h-100 { + height: 100% !important; +} +.h-auto { + height: auto !important; +} +.mh-100 { + max-height: 100% !important; +} +.vh-100 { + height: 100vh !important; +} +.min-vh-100 { + min-height: 100vh !important; +} +.flex-fill { + flex: 1 1 auto !important; +} +.flex-row { + flex-direction: row !important; +} +.flex-column { + flex-direction: column !important; +} +.flex-row-reverse { + flex-direction: row-reverse !important; +} +.flex-column-reverse { + flex-direction: column-reverse !important; +} +.flex-grow-0 { + flex-grow: 0 !important; +} +.flex-grow-1 { + flex-grow: 1 !important; +} +.flex-shrink-0 { + flex-shrink: 0 !important; +} +.flex-shrink-1 { + flex-shrink: 1 !important; +} +.flex-wrap { + flex-wrap: wrap !important; +} +.flex-nowrap { + flex-wrap: nowrap !important; +} +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} +.justify-content-start { + justify-content: flex-start !important; +} +.justify-content-end { + justify-content: flex-end !important; +} +.justify-content-center { + justify-content: center !important; +} +.justify-content-between { + justify-content: space-between !important; +} +.justify-content-around { + justify-content: space-around !important; +} +.justify-content-evenly { + justify-content: space-evenly !important; +} +.align-items-start { + align-items: flex-start !important; +} +.align-items-end { + align-items: flex-end !important; +} +.align-items-center { + align-items: center !important; +} +.align-items-baseline { + align-items: baseline !important; +} +.align-items-stretch { + align-items: stretch !important; +} +.align-content-start { + align-content: flex-start !important; +} +.align-content-end { + align-content: flex-end !important; +} +.align-content-center { + align-content: center !important; +} +.align-content-between { + align-content: space-between !important; +} +.align-content-around { + align-content: space-around !important; +} +.align-content-stretch { + align-content: stretch !important; +} +.align-self-auto { + align-self: auto !important; +} +.align-self-start { + align-self: flex-start !important; +} +.align-self-end { + align-self: flex-end !important; +} +.align-self-center { + align-self: center !important; +} +.align-self-baseline { + align-self: baseline !important; +} +.align-self-stretch { + align-self: stretch !important; +} +.order-first { + order: -1 !important; +} +.order-0 { + order: 0 !important; +} +.order-1 { + order: 1 !important; +} +.order-2 { + order: 2 !important; +} +.order-3 { + order: 3 !important; +} +.order-4 { + order: 4 !important; +} +.order-5 { + order: 5 !important; +} +.order-last { + order: 6 !important; +} +.m-0 { + margin: 0 !important; +} +.m-1 { + margin: 0.25rem !important; +} +.m-2 { + margin: 0.5rem !important; +} +.m-3 { + margin: 1rem !important; +} +.m-4 { + margin: 1.5rem !important; +} +.m-5 { + margin: 3rem !important; +} +.m-auto { + margin: auto !important; +} +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-0 { + margin-top: 0 !important; +} +.mt-1 { + margin-top: 0.25rem !important; +} +.mt-2 { + margin-top: 0.5rem !important; +} +.mt-3 { + margin-top: 1rem !important; +} +.mt-4 { + margin-top: 1.5rem !important; +} +.mt-5 { + margin-top: 3rem !important; +} +.mt-auto { + margin-top: auto !important; +} +.me-0 { + margin-right: 0 !important; +} +.me-1 { + margin-right: 0.25rem !important; +} +.me-2 { + margin-right: 0.5rem !important; +} +.me-3 { + margin-right: 1rem !important; +} +.me-4 { + margin-right: 1.5rem !important; +} +.me-5 { + margin-right: 3rem !important; +} +.me-auto { + margin-right: auto !important; +} +.mb-0 { + margin-bottom: 0 !important; +} +.mb-1 { + margin-bottom: 0.25rem !important; +} +.mb-2 { + margin-bottom: 0.5rem !important; +} +.mb-3 { + margin-bottom: 1rem !important; +} +.mb-4 { + margin-bottom: 1.5rem !important; +} +.mb-5 { + margin-bottom: 3rem !important; +} +.mb-auto { + margin-bottom: auto !important; +} +.ms-0 { + margin-left: 0 !important; +} +.ms-1 { + margin-left: 0.25rem !important; +} +.ms-2 { + margin-left: 0.5rem !important; +} +.ms-3 { + margin-left: 1rem !important; +} +.ms-4 { + margin-left: 1.5rem !important; +} +.ms-5 { + margin-left: 3rem !important; +} +.ms-auto { + margin-left: auto !important; +} +.p-0 { + padding: 0 !important; +} +.p-1 { + padding: 0.25rem !important; +} +.p-2 { + padding: 0.5rem !important; +} +.p-3 { + padding: 1rem !important; +} +.p-4 { + padding: 1.5rem !important; +} +.p-5 { + padding: 3rem !important; +} +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-0 { + padding-top: 0 !important; +} +.pt-1 { + padding-top: 0.25rem !important; +} +.pt-2 { + padding-top: 0.5rem !important; +} +.pt-3 { + padding-top: 1rem !important; +} +.pt-4 { + padding-top: 1.5rem !important; +} +.pt-5 { + padding-top: 3rem !important; +} +.pe-0 { + padding-right: 0 !important; +} +.pe-1 { + padding-right: 0.25rem !important; +} +.pe-2 { + padding-right: 0.5rem !important; +} +.pe-3 { + padding-right: 1rem !important; +} +.pe-4 { + padding-right: 1.5rem !important; +} +.pe-5 { + padding-right: 3rem !important; +} +.pb-0 { + padding-bottom: 0 !important; +} +.pb-1 { + padding-bottom: 0.25rem !important; +} +.pb-2 { + padding-bottom: 0.5rem !important; +} +.pb-3 { + padding-bottom: 1rem !important; +} +.pb-4 { + padding-bottom: 1.5rem !important; +} +.pb-5 { + padding-bottom: 3rem !important; +} +.ps-0 { + padding-left: 0 !important; +} +.ps-1 { + padding-left: 0.25rem !important; +} +.ps-2 { + padding-left: 0.5rem !important; +} +.ps-3 { + padding-left: 1rem !important; +} +.ps-4 { + padding-left: 1.5rem !important; +} +.ps-5 { + padding-left: 3rem !important; +} +.gap-0 { + gap: 0 !important; +} +.gap-1 { + gap: 0.25rem !important; +} +.gap-2 { + gap: 0.5rem !important; +} +.gap-3 { + gap: 1rem !important; +} +.gap-4 { + gap: 1.5rem !important; +} +.gap-5 { + gap: 3rem !important; +} +.row-gap-0 { + row-gap: 0 !important; +} +.row-gap-1 { + row-gap: 0.25rem !important; +} +.row-gap-2 { + row-gap: 0.5rem !important; +} +.row-gap-3 { + row-gap: 1rem !important; +} +.row-gap-4 { + row-gap: 1.5rem !important; +} +.row-gap-5 { + row-gap: 3rem !important; +} +.column-gap-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; +} +.column-gap-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; +} +.column-gap-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; +} +.column-gap-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; +} +.column-gap-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; +} +.column-gap-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; +} +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} +.fs-5 { + font-size: 1.25rem !important; +} +.fs-6 { + font-size: 1rem !important; +} +.fst-italic { + font-style: italic !important; +} +.fst-normal { + font-style: normal !important; +} +.fw-lighter { + font-weight: lighter !important; +} +.fw-light { + font-weight: 300 !important; +} +.fw-normal { + font-weight: 400 !important; +} +.fw-medium { + font-weight: 500 !important; +} +.fw-semibold { + font-weight: 600 !important; +} +.fw-bold { + font-weight: 700 !important; +} +.fw-bolder { + font-weight: bolder !important; +} +.lh-1 { + line-height: 1 !important; +} +.lh-sm { + line-height: 1.25 !important; +} +.lh-base { + line-height: 1.5 !important; +} +.lh-lg { + line-height: 2 !important; +} +.text-start { + text-align: left !important; +} +.text-end { + text-align: right !important; +} +.text-center { + text-align: center !important; +} +.text-decoration-none { + text-decoration: none !important; +} +.text-decoration-underline { + text-decoration: underline !important; +} +.text-decoration-line-through { + text-decoration: line-through !important; +} +.text-lowercase { + text-transform: lowercase !important; +} +.text-uppercase { + text-transform: uppercase !important; +} +.text-capitalize { + text-transform: capitalize !important; +} +.text-wrap { + white-space: normal !important; +} +.text-nowrap { + white-space: nowrap !important; +} +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} +.text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; +} +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important; +} +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} +.text-opacity-25 { + --bs-text-opacity: 0.25; +} +.text-opacity-50 { + --bs-text-opacity: 0.5; +} +.text-opacity-75 { + --bs-text-opacity: 0.75; +} +.text-opacity-100 { + --bs-text-opacity: 1; +} +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; +} +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; +} +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; +} +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; +} +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; +} +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; +} +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; +} +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; +} +.link-opacity-10 { + --bs-link-opacity: 0.1; +} +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; +} +.link-opacity-25 { + --bs-link-opacity: 0.25; +} +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; +} +.link-opacity-50 { + --bs-link-opacity: 0.5; +} +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; +} +.link-opacity-75 { + --bs-link-opacity: 0.75; +} +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; +} +.link-opacity-100 { + --bs-link-opacity: 1; +} +.link-opacity-100-hover:hover { + --bs-link-opacity: 1; +} +.link-offset-1 { + text-underline-offset: 0.125em !important; +} +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; +} +.link-offset-2 { + text-underline-offset: 0.25em !important; +} +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; +} +.link-offset-3 { + text-underline-offset: 0.375em !important; +} +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; +} +.link-underline-primary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-primary-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-secondary { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-secondary-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-success { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-success-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-info { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-info-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-warning { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-warning-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-danger { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-danger-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-light { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-light-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline-dark { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; + text-decoration-color: rgba( + var(--bs-dark-rgb), + var(--bs-link-underline-opacity) + ) !important; +} +.link-underline { + --bs-link-underline-opacity: 1; + -webkit-text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; + text-decoration-color: rgba( + var(--bs-link-color-rgb), + var(--bs-link-underline-opacity, 1) + ) !important; +} +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; +} +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; +} +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; +} +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; +} +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; +} +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1; +} +.link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1; +} +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-primary-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-secondary-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-success-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-warning-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-danger-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-light-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-black-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-white-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-body-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-secondary-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-tertiary-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} +.bg-opacity-100 { + --bs-bg-opacity: 1; +} +.bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; +} +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; +} +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; +} +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; +} +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; +} +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; +} +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; +} +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; +} +.bg-gradient { + background-image: var(--bs-gradient) !important; +} +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; +} +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} +.pe-none { + pointer-events: none !important; +} +.pe-auto { + pointer-events: auto !important; +} +.rounded { + border-radius: var(--bs-border-radius) !important; +} +.rounded-0 { + border-radius: 0 !important; +} +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-circle { + border-radius: 50% !important; +} +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; +} +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; +} +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; +} +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; +} +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; +} +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; +} +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; +} +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; +} +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; +} +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; +} +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; +} +.visible { + visibility: visible !important; +} +.invisible { + visibility: hidden !important; +} +.z-n1 { + z-index: -1 !important; +} +.z-0 { + z-index: 0 !important; +} +.z-1 { + z-index: 1 !important; +} +.z-2 { + z-index: 2 !important; +} +.z-3 { + z-index: 3 !important; +} +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .object-fit-sm-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-sm-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-sm-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-sm-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-sm-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-inline-grid { + display: inline-grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .row-gap-sm-0 { + row-gap: 0 !important; + } + .row-gap-sm-1 { + row-gap: 0.25rem !important; + } + .row-gap-sm-2 { + row-gap: 0.5rem !important; + } + .row-gap-sm-3 { + row-gap: 1rem !important; + } + .row-gap-sm-4 { + row-gap: 1.5rem !important; + } + .row-gap-sm-5 { + row-gap: 3rem !important; + } + .column-gap-sm-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-sm-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-sm-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-sm-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-sm-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-sm-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .object-fit-md-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-md-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-md-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-md-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-md-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-inline-grid { + display: inline-grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .row-gap-md-0 { + row-gap: 0 !important; + } + .row-gap-md-1 { + row-gap: 0.25rem !important; + } + .row-gap-md-2 { + row-gap: 0.5rem !important; + } + .row-gap-md-3 { + row-gap: 1rem !important; + } + .row-gap-md-4 { + row-gap: 1.5rem !important; + } + .row-gap-md-5 { + row-gap: 3rem !important; + } + .column-gap-md-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-md-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-md-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-md-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-md-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-md-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .object-fit-lg-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-lg-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-lg-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-lg-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-lg-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-inline-grid { + display: inline-grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .row-gap-lg-0 { + row-gap: 0 !important; + } + .row-gap-lg-1 { + row-gap: 0.25rem !important; + } + .row-gap-lg-2 { + row-gap: 0.5rem !important; + } + .row-gap-lg-3 { + row-gap: 1rem !important; + } + .row-gap-lg-4 { + row-gap: 1.5rem !important; + } + .row-gap-lg-5 { + row-gap: 3rem !important; + } + .column-gap-lg-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-lg-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-lg-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-lg-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-lg-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-lg-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .object-fit-xl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-inline-grid { + display: inline-grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .row-gap-xl-0 { + row-gap: 0 !important; + } + .row-gap-xl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xl-3 { + row-gap: 1rem !important; + } + .row-gap-xl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xl-5 { + row-gap: 3rem !important; + } + .column-gap-xl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .object-fit-xxl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xxl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xxl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xxl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xxl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-inline-grid { + display: inline-grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .row-gap-xxl-0 { + row-gap: 0 !important; + } + .row-gap-xxl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xxl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xxl-3 { + row-gap: 1rem !important; + } + .row-gap-xxl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xxl-5 { + row-gap: 3rem !important; + } + .column-gap-xxl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xxl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xxl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xxl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xxl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xxl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-inline-grid { + display: inline-grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/src/main/resources/static/bootstrap-5.3.2/js/bootstrap.min.js b/src/main/resources/static/bootstrap-5.3.2/js/bootstrap.min.js new file mode 100644 index 0000000..3593c40 --- /dev/null +++ b/src/main/resources/static/bootstrap-5.3.2/js/bootstrap.min.js @@ -0,0 +1,2212 @@ +/*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +! function(t, e) { + "object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("@popperjs/core")) : "function" == typeof define && define.amd ? define(["@popperjs/core"], e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).bootstrap = e(t.Popper) +}(this, (function(t) { + "use strict"; + + function e(t) { + const e = Object.create(null, { + [Symbol.toStringTag]: { + value: "Module" + } + }); + if (t) + for (const i in t) + if ("default" !== i) { + const s = Object.getOwnPropertyDescriptor(t, i); + Object.defineProperty(e, i, s.get ? s : { + enumerable: !0, + get: () => t[i] + }) + } return e.default = t, Object.freeze(e) + } + const i = e(t), + s = new Map, + n = { + set(t, e, i) { + s.has(t) || s.set(t, new Map); + const n = s.get(t); + n.has(e) || 0 === n.size ? n.set(e, i) : console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(n.keys())[0]}.`) + }, + get: (t, e) => s.has(t) && s.get(t).get(e) || null, + remove(t, e) { + if (!s.has(t)) return; + const i = s.get(t); + i.delete(e), 0 === i.size && s.delete(t) + } + }, + o = "transitionend", + r = t => (t && window.CSS && window.CSS.escape && (t = t.replace(/#([^\s"#']+)/g, ((t, e) => `#${CSS.escape(e)}`))), t), + a = t => { + t.dispatchEvent(new Event(o)) + }, + l = t => !(!t || "object" != typeof t) && (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), + c = t => l(t) ? t.jquery ? t[0] : t : "string" == typeof t && t.length > 0 ? document.querySelector(r(t)) : null, + h = t => { + if (!l(t) || 0 === t.getClientRects().length) return !1; + const e = "visible" === getComputedStyle(t).getPropertyValue("visibility"), + i = t.closest("details:not([open])"); + if (!i) return e; + if (i !== t) { + const e = t.closest("summary"); + if (e && e.parentNode !== i) return !1; + if (null === e) return !1 + } + return e + }, + d = t => !t || t.nodeType !== Node.ELEMENT_NODE || !!t.classList.contains("disabled") || (void 0 !== t.disabled ? t.disabled : t.hasAttribute("disabled") && "false" !== t.getAttribute("disabled")), + u = t => { + if (!document.documentElement.attachShadow) return null; + if ("function" == typeof t.getRootNode) { + const e = t.getRootNode(); + return e instanceof ShadowRoot ? e : null + } + return t instanceof ShadowRoot ? t : t.parentNode ? u(t.parentNode) : null + }, + _ = () => { }, + g = t => { + t.offsetHeight + }, + f = () => window.jQuery && !document.body.hasAttribute("data-bs-no-jquery") ? window.jQuery : null, + m = [], + p = () => "rtl" === document.documentElement.dir, + b = t => { + var e; + e = () => { + const e = f(); + if (e) { + const i = t.NAME, + s = e.fn[i]; + e.fn[i] = t.jQueryInterface, e.fn[i].Constructor = t, e.fn[i].noConflict = () => (e.fn[i] = s, t.jQueryInterface) + } + }, "loading" === document.readyState ? (m.length || document.addEventListener("DOMContentLoaded", (() => { + for (const t of m) t() + })), m.push(e)) : e() + }, + v = (t, e = [], i = t) => "function" == typeof t ? t(...e) : i, + y = (t, e, i = !0) => { + if (!i) return void v(t); + const s = (t => { + if (!t) return 0; + let { + transitionDuration: e, + transitionDelay: i + } = window.getComputedStyle(t); + const s = Number.parseFloat(e), + n = Number.parseFloat(i); + return s || n ? (e = e.split(",")[0], i = i.split(",")[0], 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) : 0 + })(e) + 5; + let n = !1; + const r = ({ + target: i + }) => { + i === e && (n = !0, e.removeEventListener(o, r), v(t)) + }; + e.addEventListener(o, r), setTimeout((() => { + n || a(e) + }), s) + }, + w = (t, e, i, s) => { + const n = t.length; + let o = t.indexOf(e); + return -1 === o ? !i && s ? t[n - 1] : t[0] : (o += i ? 1 : -1, s && (o = (o + n) % n), t[Math.max(0, Math.min(o, n - 1))]) + }, + A = /[^.]*(?=\..*)\.|.*/, + E = /\..*/, + C = /::\d+$/, + T = {}; + let k = 1; + const $ = { + mouseenter: "mouseover", + mouseleave: "mouseout" + }, + S = new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]); + + function L(t, e) { + return e && `${e}::${k++}` || t.uidEvent || k++ + } + + function O(t) { + const e = L(t); + return t.uidEvent = e, T[e] = T[e] || {}, T[e] + } + + function I(t, e, i = null) { + return Object.values(t).find((t => t.callable === e && t.delegationSelector === i)) + } + + function D(t, e, i) { + const s = "string" == typeof e, + n = s ? i : e || i; + let o = M(t); + return S.has(o) || (o = t), [s, n, o] + } + + function N(t, e, i, s, n) { + if ("string" != typeof e || !t) return; + let [o, r, a] = D(e, i, s); + if (e in $) { + const t = t => function(e) { + if (!e.relatedTarget || e.relatedTarget !== e.delegateTarget && !e.delegateTarget.contains(e.relatedTarget)) return t.call(this, e) + }; + r = t(r) + } + const l = O(t), + c = l[a] || (l[a] = {}), + h = I(c, r, o ? i : null); + if (h) return void (h.oneOff = h.oneOff && n); + const d = L(r, e.replace(A, "")), + u = o ? function(t, e, i) { + return function s(n) { + const o = t.querySelectorAll(e); + for (let { + target: r + } = n; r && r !== this; r = r.parentNode) + for (const a of o) + if (a === r) return F(n, { + delegateTarget: r + }), s.oneOff && j.off(t, n.type, e, i), i.apply(r, [n]) + } + }(t, i, r) : function(t, e) { + return function i(s) { + return F(s, { + delegateTarget: t + }), i.oneOff && j.off(t, s.type, e), e.apply(t, [s]) + } + }(t, r); + u.delegationSelector = o ? i : null, u.callable = r, u.oneOff = n, u.uidEvent = d, c[d] = u, t.addEventListener(a, u, o) + } + + function P(t, e, i, s, n) { + const o = I(e[i], s, n); + o && (t.removeEventListener(i, o, Boolean(n)), delete e[i][o.uidEvent]) + } + + function x(t, e, i, s) { + const n = e[i] || {}; + for (const [o, r] of Object.entries(n)) o.includes(s) && P(t, e, i, r.callable, r.delegationSelector) + } + + function M(t) { + return t = t.replace(E, ""), $[t] || t + } + const j = { + on(t, e, i, s) { + N(t, e, i, s, !1) + }, + one(t, e, i, s) { + N(t, e, i, s, !0) + }, + off(t, e, i, s) { + if ("string" != typeof e || !t) return; + const [n, o, r] = D(e, i, s), a = r !== e, l = O(t), c = l[r] || {}, h = e.startsWith("."); + if (void 0 === o) { + if (h) + for (const i of Object.keys(l)) x(t, l, i, e.slice(1)); + for (const [i, s] of Object.entries(c)) { + const n = i.replace(C, ""); + a && !e.includes(n) || P(t, l, r, s.callable, s.delegationSelector) + } + } else { + if (!Object.keys(c).length) return; + P(t, l, r, o, n ? i : null) + } + }, + trigger(t, e, i) { + if ("string" != typeof e || !t) return null; + const s = f(); + let n = null, + o = !0, + r = !0, + a = !1; + e !== M(e) && s && (n = s.Event(e, i), s(t).trigger(n), o = !n.isPropagationStopped(), r = !n.isImmediatePropagationStopped(), a = n.isDefaultPrevented()); + const l = F(new Event(e, { + bubbles: o, + cancelable: !0 + }), i); + return a && l.preventDefault(), r && t.dispatchEvent(l), l.defaultPrevented && n && n.preventDefault(), l + } + }; + + function F(t, e = {}) { + for (const [i, s] of Object.entries(e)) try { + t[i] = s + } catch (e) { + Object.defineProperty(t, i, { + configurable: !0, + get: () => s + }) + } + return t + } + + function z(t) { + if ("true" === t) return !0; + if ("false" === t) return !1; + if (t === Number(t).toString()) return Number(t); + if ("" === t || "null" === t) return null; + if ("string" != typeof t) return t; + try { + return JSON.parse(decodeURIComponent(t)) + } catch (e) { + return t + } + } + + function H(t) { + return t.replace(/[A-Z]/g, (t => `-${t.toLowerCase()}`)) + } + const B = { + setDataAttribute(t, e, i) { + t.setAttribute(`data-bs-${H(e)}`, i) + }, + removeDataAttribute(t, e) { + t.removeAttribute(`data-bs-${H(e)}`) + }, + getDataAttributes(t) { + if (!t) return {}; + const e = {}, + i = Object.keys(t.dataset).filter((t => t.startsWith("bs") && !t.startsWith("bsConfig"))); + for (const s of i) { + let i = s.replace(/^bs/, ""); + i = i.charAt(0).toLowerCase() + i.slice(1, i.length), e[i] = z(t.dataset[s]) + } + return e + }, + getDataAttribute: (t, e) => z(t.getAttribute(`data-bs-${H(e)}`)) + }; + class q { + static get Default() { + return {} + } + static get DefaultType() { + return {} + } + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!') + } + _getConfig(t) { + return t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t + } + _configAfterMerge(t) { + return t + } + _mergeConfigObj(t, e) { + const i = l(e) ? B.getDataAttribute(e, "config") : {}; + return { + ...this.constructor.Default, + ..."object" == typeof i ? i : {}, + ...l(e) ? B.getDataAttributes(e) : {}, + ..."object" == typeof t ? t : {} + } + } + _typeCheckConfig(t, e = this.constructor.DefaultType) { + for (const [s, n] of Object.entries(e)) { + const e = t[s], + o = l(e) ? "element" : null == (i = e) ? `${i}` : Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase(); + if (!new RegExp(n).test(o)) throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${s}" provided type "${o}" but expected type "${n}".`) + } + var i + } + } + class W extends q { + constructor(t, e) { + super(), (t = c(t)) && (this._element = t, this._config = this._getConfig(e), n.set(this._element, this.constructor.DATA_KEY, this)) + } + dispose() { + n.remove(this._element, this.constructor.DATA_KEY), j.off(this._element, this.constructor.EVENT_KEY); + for (const t of Object.getOwnPropertyNames(this)) this[t] = null + } + _queueCallback(t, e, i = !0) { + y(t, e, i) + } + _getConfig(t) { + return t = this._mergeConfigObj(t, this._element), t = this._configAfterMerge(t), this._typeCheckConfig(t), t + } + static getInstance(t) { + return n.get(c(t), this.DATA_KEY) + } + static getOrCreateInstance(t, e = {}) { + return this.getInstance(t) || new this(t, "object" == typeof e ? e : null) + } + static get VERSION() { + return "5.3.2" + } + static get DATA_KEY() { + return `bs.${this.NAME}` + } + static get EVENT_KEY() { + return `.${this.DATA_KEY}` + } + static eventName(t) { + return `${t}${this.EVENT_KEY}` + } + } + const R = t => { + let e = t.getAttribute("data-bs-target"); + if (!e || "#" === e) { + let i = t.getAttribute("href"); + if (!i || !i.includes("#") && !i.startsWith(".")) return null; + i.includes("#") && !i.startsWith("#") && (i = `#${i.split("#")[1]}`), e = i && "#" !== i ? r(i.trim()) : null + } + return e + }, + K = { + find: (t, e = document.documentElement) => [].concat(...Element.prototype.querySelectorAll.call(e, t)), + findOne: (t, e = document.documentElement) => Element.prototype.querySelector.call(e, t), + children: (t, e) => [].concat(...t.children).filter((t => t.matches(e))), + parents(t, e) { + const i = []; + let s = t.parentNode.closest(e); + for (; s;) i.push(s), s = s.parentNode.closest(e); + return i + }, + prev(t, e) { + let i = t.previousElementSibling; + for (; i;) { + if (i.matches(e)) return [i]; + i = i.previousElementSibling + } + return [] + }, + next(t, e) { + let i = t.nextElementSibling; + for (; i;) { + if (i.matches(e)) return [i]; + i = i.nextElementSibling + } + return [] + }, + focusableChildren(t) { + const e = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((t => `${t}:not([tabindex^="-"])`)).join(","); + return this.find(e, t).filter((t => !d(t) && h(t))) + }, + getSelectorFromElement(t) { + const e = R(t); + return e && K.findOne(e) ? e : null + }, + getElementFromSelector(t) { + const e = R(t); + return e ? K.findOne(e) : null + }, + getMultipleElementsFromSelector(t) { + const e = R(t); + return e ? K.find(e) : [] + } + }, + V = (t, e = "hide") => { + const i = `click.dismiss${t.EVENT_KEY}`, + s = t.NAME; + j.on(document, i, `[data-bs-dismiss="${s}"]`, (function(i) { + if (["A", "AREA"].includes(this.tagName) && i.preventDefault(), d(this)) return; + const n = K.getElementFromSelector(this) || this.closest(`.${s}`); + t.getOrCreateInstance(n)[e]() + })) + }, + Q = ".bs.alert", + X = `close${Q}`, + Y = `closed${Q}`; + class U extends W { + static get NAME() { + return "alert" + } + close() { + if (j.trigger(this._element, X).defaultPrevented) return; + this._element.classList.remove("show"); + const t = this._element.classList.contains("fade"); + this._queueCallback((() => this._destroyElement()), this._element, t) + } + _destroyElement() { + this._element.remove(), j.trigger(this._element, Y), this.dispose() + } + static jQueryInterface(t) { + return this.each((function() { + const e = U.getOrCreateInstance(this); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } + } + V(U, "close"), b(U); + const G = '[data-bs-toggle="button"]'; + class J extends W { + static get NAME() { + return "button" + } + toggle() { + this._element.setAttribute("aria-pressed", this._element.classList.toggle("active")) + } + static jQueryInterface(t) { + return this.each((function() { + const e = J.getOrCreateInstance(this); + "toggle" === t && e[t]() + })) + } + } + j.on(document, "click.bs.button.data-api", G, (t => { + t.preventDefault(); + const e = t.target.closest(G); + J.getOrCreateInstance(e).toggle() + })), b(J); + const Z = ".bs.swipe", + tt = `touchstart${Z}`, + et = `touchmove${Z}`, + it = `touchend${Z}`, + st = `pointerdown${Z}`, + nt = `pointerup${Z}`, + ot = { + endCallback: null, + leftCallback: null, + rightCallback: null + }, + rt = { + endCallback: "(function|null)", + leftCallback: "(function|null)", + rightCallback: "(function|null)" + }; + class at extends q { + constructor(t, e) { + super(), this._element = t, t && at.isSupported() && (this._config = this._getConfig(e), this._deltaX = 0, this._supportPointerEvents = Boolean(window.PointerEvent), this._initEvents()) + } + static get Default() { + return ot + } + static get DefaultType() { + return rt + } + static get NAME() { + return "swipe" + } + dispose() { + j.off(this._element, Z) + } + _start(t) { + this._supportPointerEvents ? this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX) : this._deltaX = t.touches[0].clientX + } + _end(t) { + this._eventIsPointerPenTouch(t) && (this._deltaX = t.clientX - this._deltaX), this._handleSwipe(), v(this._config.endCallback) + } + _move(t) { + this._deltaX = t.touches && t.touches.length > 1 ? 0 : t.touches[0].clientX - this._deltaX + } + _handleSwipe() { + const t = Math.abs(this._deltaX); + if (t <= 40) return; + const e = t / this._deltaX; + this._deltaX = 0, e && v(e > 0 ? this._config.rightCallback : this._config.leftCallback) + } + _initEvents() { + this._supportPointerEvents ? (j.on(this._element, st, (t => this._start(t))), j.on(this._element, nt, (t => this._end(t))), this._element.classList.add("pointer-event")) : (j.on(this._element, tt, (t => this._start(t))), j.on(this._element, et, (t => this._move(t))), j.on(this._element, it, (t => this._end(t)))) + } + _eventIsPointerPenTouch(t) { + return this._supportPointerEvents && ("pen" === t.pointerType || "touch" === t.pointerType) + } + static isSupported() { + return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0 + } + } + const lt = ".bs.carousel", + ct = ".data-api", + ht = "next", + dt = "prev", + ut = "left", + _t = "right", + gt = `slide${lt}`, + ft = `slid${lt}`, + mt = `keydown${lt}`, + pt = `mouseenter${lt}`, + bt = `mouseleave${lt}`, + vt = `dragstart${lt}`, + yt = `load${lt}${ct}`, + wt = `click${lt}${ct}`, + At = "carousel", + Et = "active", + Ct = ".active", + Tt = ".carousel-item", + kt = Ct + Tt, + $t = { + ArrowLeft: _t, + ArrowRight: ut + }, + St = { + interval: 5e3, + keyboard: !0, + pause: "hover", + ride: !1, + touch: !0, + wrap: !0 + }, + Lt = { + interval: "(number|boolean)", + keyboard: "boolean", + pause: "(string|boolean)", + ride: "(boolean|string)", + touch: "boolean", + wrap: "boolean" + }; + class Ot extends W { + constructor(t, e) { + super(t, e), this._interval = null, this._activeElement = null, this._isSliding = !1, this.touchTimeout = null, this._swipeHelper = null, this._indicatorsElement = K.findOne(".carousel-indicators", this._element), this._addEventListeners(), this._config.ride === At && this.cycle() + } + static get Default() { + return St + } + static get DefaultType() { + return Lt + } + static get NAME() { + return "carousel" + } + next() { + this._slide(ht) + } + nextWhenVisible() { + !document.hidden && h(this._element) && this.next() + } + prev() { + this._slide(dt) + } + pause() { + this._isSliding && a(this._element), this._clearInterval() + } + cycle() { + this._clearInterval(), this._updateInterval(), this._interval = setInterval((() => this.nextWhenVisible()), this._config.interval) + } + _maybeEnableCycle() { + this._config.ride && (this._isSliding ? j.one(this._element, ft, (() => this.cycle())) : this.cycle()) + } + to(t) { + const e = this._getItems(); + if (t > e.length - 1 || t < 0) return; + if (this._isSliding) return void j.one(this._element, ft, (() => this.to(t))); + const i = this._getItemIndex(this._getActive()); + if (i === t) return; + const s = t > i ? ht : dt; + this._slide(s, e[t]) + } + dispose() { + this._swipeHelper && this._swipeHelper.dispose(), super.dispose() + } + _configAfterMerge(t) { + return t.defaultInterval = t.interval, t + } + _addEventListeners() { + this._config.keyboard && j.on(this._element, mt, (t => this._keydown(t))), "hover" === this._config.pause && (j.on(this._element, pt, (() => this.pause())), j.on(this._element, bt, (() => this._maybeEnableCycle()))), this._config.touch && at.isSupported() && this._addTouchEventListeners() + } + _addTouchEventListeners() { + for (const t of K.find(".carousel-item img", this._element)) j.on(t, vt, (t => t.preventDefault())); + const t = { + leftCallback: () => this._slide(this._directionToOrder(ut)), + rightCallback: () => this._slide(this._directionToOrder(_t)), + endCallback: () => { + "hover" === this._config.pause && (this.pause(), this.touchTimeout && clearTimeout(this.touchTimeout), this.touchTimeout = setTimeout((() => this._maybeEnableCycle()), 500 + this._config.interval)) + } + }; + this._swipeHelper = new at(this._element, t) + } + _keydown(t) { + if (/input|textarea/i.test(t.target.tagName)) return; + const e = $t[t.key]; + e && (t.preventDefault(), this._slide(this._directionToOrder(e))) + } + _getItemIndex(t) { + return this._getItems().indexOf(t) + } + _setActiveIndicatorElement(t) { + if (!this._indicatorsElement) return; + const e = K.findOne(Ct, this._indicatorsElement); + e.classList.remove(Et), e.removeAttribute("aria-current"); + const i = K.findOne(`[data-bs-slide-to="${t}"]`, this._indicatorsElement); + i && (i.classList.add(Et), i.setAttribute("aria-current", "true")) + } + _updateInterval() { + const t = this._activeElement || this._getActive(); + if (!t) return; + const e = Number.parseInt(t.getAttribute("data-bs-interval"), 10); + this._config.interval = e || this._config.defaultInterval + } + _slide(t, e = null) { + if (this._isSliding) return; + const i = this._getActive(), + s = t === ht, + n = e || w(this._getItems(), i, s, this._config.wrap); + if (n === i) return; + const o = this._getItemIndex(n), + r = e => j.trigger(this._element, e, { + relatedTarget: n, + direction: this._orderToDirection(t), + from: this._getItemIndex(i), + to: o + }); + if (r(gt).defaultPrevented) return; + if (!i || !n) return; + const a = Boolean(this._interval); + this.pause(), this._isSliding = !0, this._setActiveIndicatorElement(o), this._activeElement = n; + const l = s ? "carousel-item-start" : "carousel-item-end", + c = s ? "carousel-item-next" : "carousel-item-prev"; + n.classList.add(c), g(n), i.classList.add(l), n.classList.add(l), this._queueCallback((() => { + n.classList.remove(l, c), n.classList.add(Et), i.classList.remove(Et, c, l), this._isSliding = !1, r(ft) + }), i, this._isAnimated()), a && this.cycle() + } + _isAnimated() { + return this._element.classList.contains("slide") + } + _getActive() { + return K.findOne(kt, this._element) + } + _getItems() { + return K.find(Tt, this._element) + } + _clearInterval() { + this._interval && (clearInterval(this._interval), this._interval = null) + } + _directionToOrder(t) { + return p() ? t === ut ? dt : ht : t === ut ? ht : dt + } + _orderToDirection(t) { + return p() ? t === dt ? ut : _t : t === dt ? _t : ut + } + static jQueryInterface(t) { + return this.each((function() { + const e = Ot.getOrCreateInstance(this, t); + if ("number" != typeof t) { + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + } else e.to(t) + })) + } + } + j.on(document, wt, "[data-bs-slide], [data-bs-slide-to]", (function(t) { + const e = K.getElementFromSelector(this); + if (!e || !e.classList.contains(At)) return; + t.preventDefault(); + const i = Ot.getOrCreateInstance(e), + s = this.getAttribute("data-bs-slide-to"); + return s ? (i.to(s), void i._maybeEnableCycle()) : "next" === B.getDataAttribute(this, "slide") ? (i.next(), void i._maybeEnableCycle()) : (i.prev(), void i._maybeEnableCycle()) + })), j.on(window, yt, (() => { + const t = K.find('[data-bs-ride="carousel"]'); + for (const e of t) Ot.getOrCreateInstance(e) + })), b(Ot); + const It = ".bs.collapse", + Dt = `show${It}`, + Nt = `shown${It}`, + Pt = `hide${It}`, + xt = `hidden${It}`, + Mt = `click${It}.data-api`, + jt = "show", + Ft = "collapse", + zt = "collapsing", + Ht = `:scope .${Ft} .${Ft}`, + Bt = '[data-bs-toggle="collapse"]', + qt = { + parent: null, + toggle: !0 + }, + Wt = { + parent: "(null|element)", + toggle: "boolean" + }; + class Rt extends W { + constructor(t, e) { + super(t, e), this._isTransitioning = !1, this._triggerArray = []; + const i = K.find(Bt); + for (const t of i) { + const e = K.getSelectorFromElement(t), + i = K.find(e).filter((t => t === this._element)); + null !== e && i.length && this._triggerArray.push(t) + } + this._initializeChildren(), this._config.parent || this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), this._config.toggle && this.toggle() + } + static get Default() { + return qt + } + static get DefaultType() { + return Wt + } + static get NAME() { + return "collapse" + } + toggle() { + this._isShown() ? this.hide() : this.show() + } + show() { + if (this._isTransitioning || this._isShown()) return; + let t = []; + if (this._config.parent && (t = this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t => t !== this._element)).map((t => Rt.getOrCreateInstance(t, { + toggle: !1 + })))), t.length && t[0]._isTransitioning) return; + if (j.trigger(this._element, Dt).defaultPrevented) return; + for (const e of t) e.hide(); + const e = this._getDimension(); + this._element.classList.remove(Ft), this._element.classList.add(zt), this._element.style[e] = 0, this._addAriaAndCollapsedClass(this._triggerArray, !0), this._isTransitioning = !0; + const i = `scroll${e[0].toUpperCase() + e.slice(1)}`; + this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(zt), this._element.classList.add(Ft, jt), this._element.style[e] = "", j.trigger(this._element, Nt) + }), this._element, !0), this._element.style[e] = `${this._element[i]}px` + } + hide() { + if (this._isTransitioning || !this._isShown()) return; + if (j.trigger(this._element, Pt).defaultPrevented) return; + const t = this._getDimension(); + this._element.style[t] = `${this._element.getBoundingClientRect()[t]}px`, g(this._element), this._element.classList.add(zt), this._element.classList.remove(Ft, jt); + for (const t of this._triggerArray) { + const e = K.getElementFromSelector(t); + e && !this._isShown(e) && this._addAriaAndCollapsedClass([t], !1) + } + this._isTransitioning = !0, this._element.style[t] = "", this._queueCallback((() => { + this._isTransitioning = !1, this._element.classList.remove(zt), this._element.classList.add(Ft), j.trigger(this._element, xt) + }), this._element, !0) + } + _isShown(t = this._element) { + return t.classList.contains(jt) + } + _configAfterMerge(t) { + return t.toggle = Boolean(t.toggle), t.parent = c(t.parent), t + } + _getDimension() { + return this._element.classList.contains("collapse-horizontal") ? "width" : "height" + } + _initializeChildren() { + if (!this._config.parent) return; + const t = this._getFirstLevelChildren(Bt); + for (const e of t) { + const t = K.getElementFromSelector(e); + t && this._addAriaAndCollapsedClass([e], this._isShown(t)) + } + } + _getFirstLevelChildren(t) { + const e = K.find(Ht, this._config.parent); + return K.find(t, this._config.parent).filter((t => !e.includes(t))) + } + _addAriaAndCollapsedClass(t, e) { + if (t.length) + for (const i of t) i.classList.toggle("collapsed", !e), i.setAttribute("aria-expanded", e) + } + static jQueryInterface(t) { + const e = {}; + return "string" == typeof t && /show|hide/.test(t) && (e.toggle = !1), this.each((function() { + const i = Rt.getOrCreateInstance(this, e); + if ("string" == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t]() + } + })) + } + } + j.on(document, Mt, Bt, (function(t) { + ("A" === t.target.tagName || t.delegateTarget && "A" === t.delegateTarget.tagName) && t.preventDefault(); + for (const t of K.getMultipleElementsFromSelector(this)) Rt.getOrCreateInstance(t, { + toggle: !1 + }).toggle() + })), b(Rt); + const Kt = "dropdown", + Vt = ".bs.dropdown", + Qt = ".data-api", + Xt = "ArrowUp", + Yt = "ArrowDown", + Ut = `hide${Vt}`, + Gt = `hidden${Vt}`, + Jt = `show${Vt}`, + Zt = `shown${Vt}`, + te = `click${Vt}${Qt}`, + ee = `keydown${Vt}${Qt}`, + ie = `keyup${Vt}${Qt}`, + se = "show", + ne = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)', + oe = `${ne}.${se}`, + re = ".dropdown-menu", + ae = p() ? "top-end" : "top-start", + le = p() ? "top-start" : "top-end", + ce = p() ? "bottom-end" : "bottom-start", + he = p() ? "bottom-start" : "bottom-end", + de = p() ? "left-start" : "right-start", + ue = p() ? "right-start" : "left-start", + _e = { + autoClose: !0, + boundary: "clippingParents", + display: "dynamic", + offset: [0, 2], + popperConfig: null, + reference: "toggle" + }, + ge = { + autoClose: "(boolean|string)", + boundary: "(string|element)", + display: "string", + offset: "(array|string|function)", + popperConfig: "(null|object|function)", + reference: "(string|element|object)" + }; + class fe extends W { + constructor(t, e) { + super(t, e), this._popper = null, this._parent = this._element.parentNode, this._menu = K.next(this._element, re)[0] || K.prev(this._element, re)[0] || K.findOne(re, this._parent), this._inNavbar = this._detectNavbar() + } + static get Default() { + return _e + } + static get DefaultType() { + return ge + } + static get NAME() { + return Kt + } + toggle() { + return this._isShown() ? this.hide() : this.show() + } + show() { + if (d(this._element) || this._isShown()) return; + const t = { + relatedTarget: this._element + }; + if (!j.trigger(this._element, Jt, t).defaultPrevented) { + if (this._createPopper(), "ontouchstart" in document.documentElement && !this._parent.closest(".navbar-nav")) + for (const t of [].concat(...document.body.children)) j.on(t, "mouseover", _); + this._element.focus(), this._element.setAttribute("aria-expanded", !0), this._menu.classList.add(se), this._element.classList.add(se), j.trigger(this._element, Zt, t) + } + } + hide() { + if (d(this._element) || !this._isShown()) return; + const t = { + relatedTarget: this._element + }; + this._completeHide(t) + } + dispose() { + this._popper && this._popper.destroy(), super.dispose() + } + update() { + this._inNavbar = this._detectNavbar(), this._popper && this._popper.update() + } + _completeHide(t) { + if (!j.trigger(this._element, Ut, t).defaultPrevented) { + if ("ontouchstart" in document.documentElement) + for (const t of [].concat(...document.body.children)) j.off(t, "mouseover", _); + this._popper && this._popper.destroy(), this._menu.classList.remove(se), this._element.classList.remove(se), this._element.setAttribute("aria-expanded", "false"), B.removeDataAttribute(this._menu, "popper"), j.trigger(this._element, Gt, t) + } + } + _getConfig(t) { + if ("object" == typeof (t = super._getConfig(t)).reference && !l(t.reference) && "function" != typeof t.reference.getBoundingClientRect) throw new TypeError(`${Kt.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + return t + } + _createPopper() { + if (void 0 === i) throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)"); + let t = this._element; + "parent" === this._config.reference ? t = this._parent : l(this._config.reference) ? t = c(this._config.reference) : "object" == typeof this._config.reference && (t = this._config.reference); + const e = this._getPopperConfig(); + this._popper = i.createPopper(t, this._menu, e) + } + _isShown() { + return this._menu.classList.contains(se) + } + _getPlacement() { + const t = this._parent; + if (t.classList.contains("dropend")) return de; + if (t.classList.contains("dropstart")) return ue; + if (t.classList.contains("dropup-center")) return "top"; + if (t.classList.contains("dropdown-center")) return "bottom"; + const e = "end" === getComputedStyle(this._menu).getPropertyValue("--bs-position").trim(); + return t.classList.contains("dropup") ? e ? le : ae : e ? he : ce + } + _detectNavbar() { + return null !== this._element.closest(".navbar") + } + _getOffset() { + const { + offset: t + } = this._config; + return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t + } + _getPopperConfig() { + const t = { + placement: this._getPlacement(), + modifiers: [{ + name: "preventOverflow", + options: { + boundary: this._config.boundary + } + }, { + name: "offset", + options: { + offset: this._getOffset() + } + }] + }; + return (this._inNavbar || "static" === this._config.display) && (B.setDataAttribute(this._menu, "popper", "static"), t.modifiers = [{ + name: "applyStyles", + enabled: !1 + }]), { + ...t, + ...v(this._config.popperConfig, [t]) + } + } + _selectMenuItem({ + key: t, + target: e + }) { + const i = K.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)", this._menu).filter((t => h(t))); + i.length && w(i, e, t === Yt, !i.includes(e)).focus() + } + static jQueryInterface(t) { + return this.each((function() { + const e = fe.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + static clearMenus(t) { + if (2 === t.button || "keyup" === t.type && "Tab" !== t.key) return; + const e = K.find(oe); + for (const i of e) { + const e = fe.getInstance(i); + if (!e || !1 === e._config.autoClose) continue; + const s = t.composedPath(), + n = s.includes(e._menu); + if (s.includes(e._element) || "inside" === e._config.autoClose && !n || "outside" === e._config.autoClose && n) continue; + if (e._menu.contains(t.target) && ("keyup" === t.type && "Tab" === t.key || /input|select|option|textarea|form/i.test(t.target.tagName))) continue; + const o = { + relatedTarget: e._element + }; + "click" === t.type && (o.clickEvent = t), e._completeHide(o) + } + } + static dataApiKeydownHandler(t) { + const e = /input|textarea/i.test(t.target.tagName), + i = "Escape" === t.key, + s = [Xt, Yt].includes(t.key); + if (!s && !i) return; + if (e && !i) return; + t.preventDefault(); + const n = this.matches(ne) ? this : K.prev(this, ne)[0] || K.next(this, ne)[0] || K.findOne(ne, t.delegateTarget.parentNode), + o = fe.getOrCreateInstance(n); + if (s) return t.stopPropagation(), o.show(), void o._selectMenuItem(t); + o._isShown() && (t.stopPropagation(), o.hide(), n.focus()) + } + } + j.on(document, ee, ne, fe.dataApiKeydownHandler), j.on(document, ee, re, fe.dataApiKeydownHandler), j.on(document, te, fe.clearMenus), j.on(document, ie, fe.clearMenus), j.on(document, te, ne, (function(t) { + t.preventDefault(), fe.getOrCreateInstance(this).toggle() + })), b(fe); + const me = "backdrop", + pe = "show", + be = `mousedown.bs.${me}`, + ve = { + className: "modal-backdrop", + clickCallback: null, + isAnimated: !1, + isVisible: !0, + rootElement: "body" + }, + ye = { + className: "string", + clickCallback: "(function|null)", + isAnimated: "boolean", + isVisible: "boolean", + rootElement: "(element|string)" + }; + class we extends q { + constructor(t) { + super(), this._config = this._getConfig(t), this._isAppended = !1, this._element = null + } + static get Default() { + return ve + } + static get DefaultType() { + return ye + } + static get NAME() { + return me + } + show(t) { + if (!this._config.isVisible) return void v(t); + this._append(); + const e = this._getElement(); + this._config.isAnimated && g(e), e.classList.add(pe), this._emulateAnimation((() => { + v(t) + })) + } + hide(t) { + this._config.isVisible ? (this._getElement().classList.remove(pe), this._emulateAnimation((() => { + this.dispose(), v(t) + }))) : v(t) + } + dispose() { + this._isAppended && (j.off(this._element, be), this._element.remove(), this._isAppended = !1) + } + _getElement() { + if (!this._element) { + const t = document.createElement("div"); + t.className = this._config.className, this._config.isAnimated && t.classList.add("fade"), this._element = t + } + return this._element + } + _configAfterMerge(t) { + return t.rootElement = c(t.rootElement), t + } + _append() { + if (this._isAppended) return; + const t = this._getElement(); + this._config.rootElement.append(t), j.on(t, be, (() => { + v(this._config.clickCallback) + })), this._isAppended = !0 + } + _emulateAnimation(t) { + y(t, this._getElement(), this._config.isAnimated) + } + } + const Ae = ".bs.focustrap", + Ee = `focusin${Ae}`, + Ce = `keydown.tab${Ae}`, + Te = "backward", + ke = { + autofocus: !0, + trapElement: null + }, + $e = { + autofocus: "boolean", + trapElement: "element" + }; + class Se extends q { + constructor(t) { + super(), this._config = this._getConfig(t), this._isActive = !1, this._lastTabNavDirection = null + } + static get Default() { + return ke + } + static get DefaultType() { + return $e + } + static get NAME() { + return "focustrap" + } + activate() { + this._isActive || (this._config.autofocus && this._config.trapElement.focus(), j.off(document, Ae), j.on(document, Ee, (t => this._handleFocusin(t))), j.on(document, Ce, (t => this._handleKeydown(t))), this._isActive = !0) + } + deactivate() { + this._isActive && (this._isActive = !1, j.off(document, Ae)) + } + _handleFocusin(t) { + const { + trapElement: e + } = this._config; + if (t.target === document || t.target === e || e.contains(t.target)) return; + const i = K.focusableChildren(e); + 0 === i.length ? e.focus() : this._lastTabNavDirection === Te ? i[i.length - 1].focus() : i[0].focus() + } + _handleKeydown(t) { + "Tab" === t.key && (this._lastTabNavDirection = t.shiftKey ? Te : "forward") + } + } + const Le = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top", + Oe = ".sticky-top", + Ie = "padding-right", + De = "margin-right"; + class Ne { + constructor() { + this._element = document.body + } + getWidth() { + const t = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - t) + } + hide() { + const t = this.getWidth(); + this._disableOverFlow(), this._setElementAttributes(this._element, Ie, (e => e + t)), this._setElementAttributes(Le, Ie, (e => e + t)), this._setElementAttributes(Oe, De, (e => e - t)) + } + reset() { + this._resetElementAttributes(this._element, "overflow"), this._resetElementAttributes(this._element, Ie), this._resetElementAttributes(Le, Ie), this._resetElementAttributes(Oe, De) + } + isOverflowing() { + return this.getWidth() > 0 + } + _disableOverFlow() { + this._saveInitialAttribute(this._element, "overflow"), this._element.style.overflow = "hidden" + } + _setElementAttributes(t, e, i) { + const s = this.getWidth(); + this._applyManipulationCallback(t, (t => { + if (t !== this._element && window.innerWidth > t.clientWidth + s) return; + this._saveInitialAttribute(t, e); + const n = window.getComputedStyle(t).getPropertyValue(e); + t.style.setProperty(e, `${i(Number.parseFloat(n))}px`) + })) + } + _saveInitialAttribute(t, e) { + const i = t.style.getPropertyValue(e); + i && B.setDataAttribute(t, e, i) + } + _resetElementAttributes(t, e) { + this._applyManipulationCallback(t, (t => { + const i = B.getDataAttribute(t, e); + null !== i ? (B.removeDataAttribute(t, e), t.style.setProperty(e, i)) : t.style.removeProperty(e) + })) + } + _applyManipulationCallback(t, e) { + if (l(t)) e(t); + else + for (const i of K.find(t, this._element)) e(i) + } + } + const Pe = ".bs.modal", + xe = `hide${Pe}`, + Me = `hidePrevented${Pe}`, + je = `hidden${Pe}`, + Fe = `show${Pe}`, + ze = `shown${Pe}`, + He = `resize${Pe}`, + Be = `click.dismiss${Pe}`, + qe = `mousedown.dismiss${Pe}`, + We = `keydown.dismiss${Pe}`, + Re = `click${Pe}.data-api`, + Ke = "modal-open", + Ve = "show", + Qe = "modal-static", + Xe = { + backdrop: !0, + focus: !0, + keyboard: !0 + }, + Ye = { + backdrop: "(boolean|string)", + focus: "boolean", + keyboard: "boolean" + }; + class Ue extends W { + constructor(t, e) { + super(t, e), this._dialog = K.findOne(".modal-dialog", this._element), this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._isShown = !1, this._isTransitioning = !1, this._scrollBar = new Ne, this._addEventListeners() + } + static get Default() { + return Xe + } + static get DefaultType() { + return Ye + } + static get NAME() { + return "modal" + } + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + show(t) { + this._isShown || this._isTransitioning || j.trigger(this._element, Fe, { + relatedTarget: t + }).defaultPrevented || (this._isShown = !0, this._isTransitioning = !0, this._scrollBar.hide(), document.body.classList.add(Ke), this._adjustDialog(), this._backdrop.show((() => this._showElement(t)))) + } + hide() { + this._isShown && !this._isTransitioning && (j.trigger(this._element, xe).defaultPrevented || (this._isShown = !1, this._isTransitioning = !0, this._focustrap.deactivate(), this._element.classList.remove(Ve), this._queueCallback((() => this._hideModal()), this._element, this._isAnimated()))) + } + dispose() { + j.off(window, Pe), j.off(this._dialog, Pe), this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + handleUpdate() { + this._adjustDialog() + } + _initializeBackDrop() { + return new we({ + isVisible: Boolean(this._config.backdrop), + isAnimated: this._isAnimated() + }) + } + _initializeFocusTrap() { + return new Se({ + trapElement: this._element + }) + } + _showElement(t) { + document.body.contains(this._element) || document.body.append(this._element), this._element.style.display = "block", this._element.removeAttribute("aria-hidden"), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.scrollTop = 0; + const e = K.findOne(".modal-body", this._dialog); + e && (e.scrollTop = 0), g(this._element), this._element.classList.add(Ve), this._queueCallback((() => { + this._config.focus && this._focustrap.activate(), this._isTransitioning = !1, j.trigger(this._element, ze, { + relatedTarget: t + }) + }), this._dialog, this._isAnimated()) + } + _addEventListeners() { + j.on(this._element, We, (t => { + "Escape" === t.key && (this._config.keyboard ? this.hide() : this._triggerBackdropTransition()) + })), j.on(window, He, (() => { + this._isShown && !this._isTransitioning && this._adjustDialog() + })), j.on(this._element, qe, (t => { + j.one(this._element, Be, (e => { + this._element === t.target && this._element === e.target && ("static" !== this._config.backdrop ? this._config.backdrop && this.hide() : this._triggerBackdropTransition()) + })) + })) + } + _hideModal() { + this._element.style.display = "none", this._element.setAttribute("aria-hidden", !0), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._isTransitioning = !1, this._backdrop.hide((() => { + document.body.classList.remove(Ke), this._resetAdjustments(), this._scrollBar.reset(), j.trigger(this._element, je) + })) + } + _isAnimated() { + return this._element.classList.contains("fade") + } + _triggerBackdropTransition() { + if (j.trigger(this._element, Me).defaultPrevented) return; + const t = this._element.scrollHeight > document.documentElement.clientHeight, + e = this._element.style.overflowY; + "hidden" === e || this._element.classList.contains(Qe) || (t || (this._element.style.overflowY = "hidden"), this._element.classList.add(Qe), this._queueCallback((() => { + this._element.classList.remove(Qe), this._queueCallback((() => { + this._element.style.overflowY = e + }), this._dialog) + }), this._dialog), this._element.focus()) + } + _adjustDialog() { + const t = this._element.scrollHeight > document.documentElement.clientHeight, + e = this._scrollBar.getWidth(), + i = e > 0; + if (i && !t) { + const t = p() ? "paddingLeft" : "paddingRight"; + this._element.style[t] = `${e}px` + } + if (!i && t) { + const t = p() ? "paddingRight" : "paddingLeft"; + this._element.style[t] = `${e}px` + } + } + _resetAdjustments() { + this._element.style.paddingLeft = "", this._element.style.paddingRight = "" + } + static jQueryInterface(t, e) { + return this.each((function() { + const i = Ue.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t](e) + } + })) + } + } + j.on(document, Re, '[data-bs-toggle="modal"]', (function(t) { + const e = K.getElementFromSelector(this); + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), j.one(e, Fe, (t => { + t.defaultPrevented || j.one(e, je, (() => { + h(this) && this.focus() + })) + })); + const i = K.findOne(".modal.show"); + i && Ue.getInstance(i).hide(), Ue.getOrCreateInstance(e).toggle(this) + })), V(Ue), b(Ue); + const Ge = ".bs.offcanvas", + Je = ".data-api", + Ze = `load${Ge}${Je}`, + ti = "show", + ei = "showing", + ii = "hiding", + si = ".offcanvas.show", + ni = `show${Ge}`, + oi = `shown${Ge}`, + ri = `hide${Ge}`, + ai = `hidePrevented${Ge}`, + li = `hidden${Ge}`, + ci = `resize${Ge}`, + hi = `click${Ge}${Je}`, + di = `keydown.dismiss${Ge}`, + ui = { + backdrop: !0, + keyboard: !0, + scroll: !1 + }, + _i = { + backdrop: "(boolean|string)", + keyboard: "boolean", + scroll: "boolean" + }; + class gi extends W { + constructor(t, e) { + super(t, e), this._isShown = !1, this._backdrop = this._initializeBackDrop(), this._focustrap = this._initializeFocusTrap(), this._addEventListeners() + } + static get Default() { + return ui + } + static get DefaultType() { + return _i + } + static get NAME() { + return "offcanvas" + } + toggle(t) { + return this._isShown ? this.hide() : this.show(t) + } + show(t) { + this._isShown || j.trigger(this._element, ni, { + relatedTarget: t + }).defaultPrevented || (this._isShown = !0, this._backdrop.show(), this._config.scroll || (new Ne).hide(), this._element.setAttribute("aria-modal", !0), this._element.setAttribute("role", "dialog"), this._element.classList.add(ei), this._queueCallback((() => { + this._config.scroll && !this._config.backdrop || this._focustrap.activate(), this._element.classList.add(ti), this._element.classList.remove(ei), j.trigger(this._element, oi, { + relatedTarget: t + }) + }), this._element, !0)) + } + hide() { + this._isShown && (j.trigger(this._element, ri).defaultPrevented || (this._focustrap.deactivate(), this._element.blur(), this._isShown = !1, this._element.classList.add(ii), this._backdrop.hide(), this._queueCallback((() => { + this._element.classList.remove(ti, ii), this._element.removeAttribute("aria-modal"), this._element.removeAttribute("role"), this._config.scroll || (new Ne).reset(), j.trigger(this._element, li) + }), this._element, !0))) + } + dispose() { + this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose() + } + _initializeBackDrop() { + const t = Boolean(this._config.backdrop); + return new we({ + className: "offcanvas-backdrop", + isVisible: t, + isAnimated: !0, + rootElement: this._element.parentNode, + clickCallback: t ? () => { + "static" !== this._config.backdrop ? this.hide() : j.trigger(this._element, ai) + } : null + }) + } + _initializeFocusTrap() { + return new Se({ + trapElement: this._element + }) + } + _addEventListeners() { + j.on(this._element, di, (t => { + "Escape" === t.key && (this._config.keyboard ? this.hide() : j.trigger(this._element, ai)) + })) + } + static jQueryInterface(t) { + return this.each((function() { + const e = gi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } + } + j.on(document, hi, '[data-bs-toggle="offcanvas"]', (function(t) { + const e = K.getElementFromSelector(this); + if (["A", "AREA"].includes(this.tagName) && t.preventDefault(), d(this)) return; + j.one(e, li, (() => { + h(this) && this.focus() + })); + const i = K.findOne(si); + i && i !== e && gi.getInstance(i).hide(), gi.getOrCreateInstance(e).toggle(this) + })), j.on(window, Ze, (() => { + for (const t of K.find(si)) gi.getOrCreateInstance(t).show() + })), j.on(window, ci, (() => { + for (const t of K.find("[aria-modal][class*=show][class*=offcanvas-]")) "fixed" !== getComputedStyle(t).position && gi.getOrCreateInstance(t).hide() + })), V(gi), b(gi); + const fi = { + "*": ["class", "dir", "id", "lang", "role", /^aria-[\w-]*$/i], + a: ["target", "href", "title", "rel"], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ["src", "srcset", "alt", "title", "width", "height"], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }, + mi = new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]), + pi = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i, + bi = (t, e) => { + const i = t.nodeName.toLowerCase(); + return e.includes(i) ? !mi.has(i) || Boolean(pi.test(t.nodeValue)) : e.filter((t => t instanceof RegExp)).some((t => t.test(i))) + }, + vi = { + allowList: fi, + content: {}, + extraClass: "", + html: !1, + sanitize: !0, + sanitizeFn: null, + template: "
" + }, + yi = { + allowList: "object", + content: "object", + extraClass: "(string|function)", + html: "boolean", + sanitize: "boolean", + sanitizeFn: "(null|function)", + template: "string" + }, + wi = { + entry: "(string|element|function|null)", + selector: "(string|element)" + }; + class Ai extends q { + constructor(t) { + super(), this._config = this._getConfig(t) + } + static get Default() { + return vi + } + static get DefaultType() { + return yi + } + static get NAME() { + return "TemplateFactory" + } + getContent() { + return Object.values(this._config.content).map((t => this._resolvePossibleFunction(t))).filter(Boolean) + } + hasContent() { + return this.getContent().length > 0 + } + changeContent(t) { + return this._checkContent(t), this._config.content = { + ...this._config.content, + ...t + }, this + } + toHtml() { + const t = document.createElement("div"); + t.innerHTML = this._maybeSanitize(this._config.template); + for (const [e, i] of Object.entries(this._config.content)) this._setContent(t, i, e); + const e = t.children[0], + i = this._resolvePossibleFunction(this._config.extraClass); + return i && e.classList.add(...i.split(" ")), e + } + _typeCheckConfig(t) { + super._typeCheckConfig(t), this._checkContent(t.content) + } + _checkContent(t) { + for (const [e, i] of Object.entries(t)) super._typeCheckConfig({ + selector: e, + entry: i + }, wi) + } + _setContent(t, e, i) { + const s = K.findOne(i, t); + s && ((e = this._resolvePossibleFunction(e)) ? l(e) ? this._putElementInTemplate(c(e), s) : this._config.html ? s.innerHTML = this._maybeSanitize(e) : s.textContent = e : s.remove()) + } + _maybeSanitize(t) { + return this._config.sanitize ? function(t, e, i) { + if (!t.length) return t; + if (i && "function" == typeof i) return i(t); + const s = (new window.DOMParser).parseFromString(t, "text/html"), + n = [].concat(...s.body.querySelectorAll("*")); + for (const t of n) { + const i = t.nodeName.toLowerCase(); + if (!Object.keys(e).includes(i)) { + t.remove(); + continue + } + const s = [].concat(...t.attributes), + n = [].concat(e["*"] || [], e[i] || []); + for (const e of s) bi(e, n) || t.removeAttribute(e.nodeName) + } + return s.body.innerHTML + }(t, this._config.allowList, this._config.sanitizeFn) : t + } + _resolvePossibleFunction(t) { + return v(t, [this]) + } + _putElementInTemplate(t, e) { + if (this._config.html) return e.innerHTML = "", void e.append(t); + e.textContent = t.textContent + } + } + const Ei = new Set(["sanitize", "allowList", "sanitizeFn"]), + Ci = "fade", + Ti = "show", + ki = ".modal", + $i = "hide.bs.modal", + Si = "hover", + Li = "focus", + Oi = { + AUTO: "auto", + TOP: "top", + RIGHT: p() ? "left" : "right", + BOTTOM: "bottom", + LEFT: p() ? "right" : "left" + }, + Ii = { + allowList: fi, + animation: !0, + boundary: "clippingParents", + container: !1, + customClass: "", + delay: 0, + fallbackPlacements: ["top", "right", "bottom", "left"], + html: !1, + offset: [0, 6], + placement: "top", + popperConfig: null, + sanitize: !0, + sanitizeFn: null, + selector: !1, + template: '', + title: "", + trigger: "hover focus" + }, + Di = { + allowList: "object", + animation: "boolean", + boundary: "(string|element)", + container: "(string|element|boolean)", + customClass: "(string|function)", + delay: "(number|object)", + fallbackPlacements: "array", + html: "boolean", + offset: "(array|string|function)", + placement: "(string|function)", + popperConfig: "(null|object|function)", + sanitize: "boolean", + sanitizeFn: "(null|function)", + selector: "(string|boolean)", + template: "string", + title: "(string|element|function)", + trigger: "string" + }; + class Ni extends W { + constructor(t, e) { + if (void 0 === i) throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)"); + super(t, e), this._isEnabled = !0, this._timeout = 0, this._isHovered = null, this._activeTrigger = {}, this._popper = null, this._templateFactory = null, this._newContent = null, this.tip = null, this._setListeners(), this._config.selector || this._fixTitle() + } + static get Default() { + return Ii + } + static get DefaultType() { + return Di + } + static get NAME() { + return "tooltip" + } + enable() { + this._isEnabled = !0 + } + disable() { + this._isEnabled = !1 + } + toggleEnabled() { + this._isEnabled = !this._isEnabled + } + toggle() { + this._isEnabled && (this._activeTrigger.click = !this._activeTrigger.click, this._isShown() ? this._leave() : this._enter()) + } + dispose() { + clearTimeout(this._timeout), j.off(this._element.closest(ki), $i, this._hideModalHandler), this._element.getAttribute("data-bs-original-title") && this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title")), this._disposePopper(), super.dispose() + } + show() { + if ("none" === this._element.style.display) throw new Error("Please use show on visible elements"); + if (!this._isWithContent() || !this._isEnabled) return; + const t = j.trigger(this._element, this.constructor.eventName("show")), + e = (u(this._element) || this._element.ownerDocument.documentElement).contains(this._element); + if (t.defaultPrevented || !e) return; + this._disposePopper(); + const i = this._getTipElement(); + this._element.setAttribute("aria-describedby", i.getAttribute("id")); + const { + container: s + } = this._config; + if (this._element.ownerDocument.documentElement.contains(this.tip) || (s.append(i), j.trigger(this._element, this.constructor.eventName("inserted"))), this._popper = this._createPopper(i), i.classList.add(Ti), "ontouchstart" in document.documentElement) + for (const t of [].concat(...document.body.children)) j.on(t, "mouseover", _); + this._queueCallback((() => { + j.trigger(this._element, this.constructor.eventName("shown")), !1 === this._isHovered && this._leave(), this._isHovered = !1 + }), this.tip, this._isAnimated()) + } + hide() { + if (this._isShown() && !j.trigger(this._element, this.constructor.eventName("hide")).defaultPrevented) { + if (this._getTipElement().classList.remove(Ti), "ontouchstart" in document.documentElement) + for (const t of [].concat(...document.body.children)) j.off(t, "mouseover", _); + this._activeTrigger.click = !1, this._activeTrigger[Li] = !1, this._activeTrigger[Si] = !1, this._isHovered = null, this._queueCallback((() => { + this._isWithActiveTrigger() || (this._isHovered || this._disposePopper(), this._element.removeAttribute("aria-describedby"), j.trigger(this._element, this.constructor.eventName("hidden"))) + }), this.tip, this._isAnimated()) + } + } + update() { + this._popper && this._popper.update() + } + _isWithContent() { + return Boolean(this._getTitle()) + } + _getTipElement() { + return this.tip || (this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())), this.tip + } + _createTipElement(t) { + const e = this._getTemplateFactory(t).toHtml(); + if (!e) return null; + e.classList.remove(Ci, Ti), e.classList.add(`bs-${this.constructor.NAME}-auto`); + const i = (t => { + do { + t += Math.floor(1e6 * Math.random()) + } while (document.getElementById(t)); + return t + })(this.constructor.NAME).toString(); + return e.setAttribute("id", i), this._isAnimated() && e.classList.add(Ci), e + } + setContent(t) { + this._newContent = t, this._isShown() && (this._disposePopper(), this.show()) + } + _getTemplateFactory(t) { + return this._templateFactory ? this._templateFactory.changeContent(t) : this._templateFactory = new Ai({ + ...this._config, + content: t, + extraClass: this._resolvePossibleFunction(this._config.customClass) + }), this._templateFactory + } + _getContentForTemplate() { + return { + ".tooltip-inner": this._getTitle() + } + } + _getTitle() { + return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title") + } + _initializeOnDelegatedTarget(t) { + return this.constructor.getOrCreateInstance(t.delegateTarget, this._getDelegateConfig()) + } + _isAnimated() { + return this._config.animation || this.tip && this.tip.classList.contains(Ci) + } + _isShown() { + return this.tip && this.tip.classList.contains(Ti) + } + _createPopper(t) { + const e = v(this._config.placement, [this, t, this._element]), + s = Oi[e.toUpperCase()]; + return i.createPopper(this._element, t, this._getPopperConfig(s)) + } + _getOffset() { + const { + offset: t + } = this._config; + return "string" == typeof t ? t.split(",").map((t => Number.parseInt(t, 10))) : "function" == typeof t ? e => t(e, this._element) : t + } + _resolvePossibleFunction(t) { + return v(t, [this._element]) + } + _getPopperConfig(t) { + const e = { + placement: t, + modifiers: [{ + name: "flip", + options: { + fallbackPlacements: this._config.fallbackPlacements + } + }, { + name: "offset", + options: { + offset: this._getOffset() + } + }, { + name: "preventOverflow", + options: { + boundary: this._config.boundary + } + }, { + name: "arrow", + options: { + element: `.${this.constructor.NAME}-arrow` + } + }, { + name: "preSetPlacement", + enabled: !0, + phase: "beforeMain", + fn: t => { + this._getTipElement().setAttribute("data-popper-placement", t.state.placement) + } + }] + }; + return { + ...e, + ...v(this._config.popperConfig, [e]) + } + } + _setListeners() { + const t = this._config.trigger.split(" "); + for (const e of t) + if ("click" === e) j.on(this._element, this.constructor.eventName("click"), this._config.selector, (t => { + this._initializeOnDelegatedTarget(t).toggle() + })); + else if ("manual" !== e) { + const t = e === Si ? this.constructor.eventName("mouseenter") : this.constructor.eventName("focusin"), + i = e === Si ? this.constructor.eventName("mouseleave") : this.constructor.eventName("focusout"); + j.on(this._element, t, this._config.selector, (t => { + const e = this._initializeOnDelegatedTarget(t); + e._activeTrigger["focusin" === t.type ? Li : Si] = !0, e._enter() + })), j.on(this._element, i, this._config.selector, (t => { + const e = this._initializeOnDelegatedTarget(t); + e._activeTrigger["focusout" === t.type ? Li : Si] = e._element.contains(t.relatedTarget), e._leave() + })) + } + this._hideModalHandler = () => { + this._element && this.hide() + }, j.on(this._element.closest(ki), $i, this._hideModalHandler) + } + _fixTitle() { + const t = this._element.getAttribute("title"); + t && (this._element.getAttribute("aria-label") || this._element.textContent.trim() || this._element.setAttribute("aria-label", t), this._element.setAttribute("data-bs-original-title", t), this._element.removeAttribute("title")) + } + _enter() { + this._isShown() || this._isHovered ? this._isHovered = !0 : (this._isHovered = !0, this._setTimeout((() => { + this._isHovered && this.show() + }), this._config.delay.show)) + } + _leave() { + this._isWithActiveTrigger() || (this._isHovered = !1, this._setTimeout((() => { + this._isHovered || this.hide() + }), this._config.delay.hide)) + } + _setTimeout(t, e) { + clearTimeout(this._timeout), this._timeout = setTimeout(t, e) + } + _isWithActiveTrigger() { + return Object.values(this._activeTrigger).includes(!0) + } + _getConfig(t) { + const e = B.getDataAttributes(this._element); + for (const t of Object.keys(e)) Ei.has(t) && delete e[t]; + return t = { + ...e, + ..."object" == typeof t && t ? t : {} + }, t = this._mergeConfigObj(t), t = this._configAfterMerge(t), this._typeCheckConfig(t), t + } + _configAfterMerge(t) { + return t.container = !1 === t.container ? document.body : c(t.container), "number" == typeof t.delay && (t.delay = { + show: t.delay, + hide: t.delay + }), "number" == typeof t.title && (t.title = t.title.toString()), "number" == typeof t.content && (t.content = t.content.toString()), t + } + _getDelegateConfig() { + const t = {}; + for (const [e, i] of Object.entries(this._config)) this.constructor.Default[e] !== i && (t[e] = i); + return t.selector = !1, t.trigger = "manual", t + } + _disposePopper() { + this._popper && (this._popper.destroy(), this._popper = null), this.tip && (this.tip.remove(), this.tip = null) + } + static jQueryInterface(t) { + return this.each((function() { + const e = Ni.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + b(Ni); + const Pi = { + ...Ni.Default, + content: "", + offset: [0, 8], + placement: "right", + template: '', + trigger: "click" + }, + xi = { + ...Ni.DefaultType, + content: "(null|string|element|function)" + }; + class Mi extends Ni { + static get Default() { + return Pi + } + static get DefaultType() { + return xi + } + static get NAME() { + return "popover" + } + _isWithContent() { + return this._getTitle() || this._getContent() + } + _getContentForTemplate() { + return { + ".popover-header": this._getTitle(), + ".popover-body": this._getContent() + } + } + _getContent() { + return this._resolvePossibleFunction(this._config.content) + } + static jQueryInterface(t) { + return this.each((function() { + const e = Mi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + b(Mi); + const ji = ".bs.scrollspy", + Fi = `activate${ji}`, + zi = `click${ji}`, + Hi = `load${ji}.data-api`, + Bi = "active", + qi = "[href]", + Wi = ".nav-link", + Ri = `${Wi}, .nav-item > ${Wi}, .list-group-item`, + Ki = { + offset: null, + rootMargin: "0px 0px -25%", + smoothScroll: !1, + target: null, + threshold: [.1, .5, 1] + }, + Vi = { + offset: "(number|null)", + rootMargin: "string", + smoothScroll: "boolean", + target: "element", + threshold: "array" + }; + class Qi extends W { + constructor(t, e) { + super(t, e), this._targetLinks = new Map, this._observableSections = new Map, this._rootElement = "visible" === getComputedStyle(this._element).overflowY ? null : this._element, this._activeTarget = null, this._observer = null, this._previousScrollData = { + visibleEntryTop: 0, + parentScrollTop: 0 + }, this.refresh() + } + static get Default() { + return Ki + } + static get DefaultType() { + return Vi + } + static get NAME() { + return "scrollspy" + } + refresh() { + this._initializeTargetsAndObservables(), this._maybeEnableSmoothScroll(), this._observer ? this._observer.disconnect() : this._observer = this._getNewObserver(); + for (const t of this._observableSections.values()) this._observer.observe(t) + } + dispose() { + this._observer.disconnect(), super.dispose() + } + _configAfterMerge(t) { + return t.target = c(t.target) || document.body, t.rootMargin = t.offset ? `${t.offset}px 0px -30%` : t.rootMargin, "string" == typeof t.threshold && (t.threshold = t.threshold.split(",").map((t => Number.parseFloat(t)))), t + } + _maybeEnableSmoothScroll() { + this._config.smoothScroll && (j.off(this._config.target, zi), j.on(this._config.target, zi, qi, (t => { + const e = this._observableSections.get(t.target.hash); + if (e) { + t.preventDefault(); + const i = this._rootElement || window, + s = e.offsetTop - this._element.offsetTop; + if (i.scrollTo) return void i.scrollTo({ + top: s, + behavior: "smooth" + }); + i.scrollTop = s + } + }))) + } + _getNewObserver() { + const t = { + root: this._rootElement, + threshold: this._config.threshold, + rootMargin: this._config.rootMargin + }; + return new IntersectionObserver((t => this._observerCallback(t)), t) + } + _observerCallback(t) { + const e = t => this._targetLinks.get(`#${t.target.id}`), + i = t => { + this._previousScrollData.visibleEntryTop = t.target.offsetTop, this._process(e(t)) + }, + s = (this._rootElement || document.documentElement).scrollTop, + n = s >= this._previousScrollData.parentScrollTop; + this._previousScrollData.parentScrollTop = s; + for (const o of t) { + if (!o.isIntersecting) { + this._activeTarget = null, this._clearActiveClass(e(o)); + continue + } + const t = o.target.offsetTop >= this._previousScrollData.visibleEntryTop; + if (n && t) { + if (i(o), !s) return + } else n || t || i(o) + } + } + _initializeTargetsAndObservables() { + this._targetLinks = new Map, this._observableSections = new Map; + const t = K.find(qi, this._config.target); + for (const e of t) { + if (!e.hash || d(e)) continue; + const t = K.findOne(decodeURI(e.hash), this._element); + h(t) && (this._targetLinks.set(decodeURI(e.hash), e), this._observableSections.set(e.hash, t)) + } + } + _process(t) { + this._activeTarget !== t && (this._clearActiveClass(this._config.target), this._activeTarget = t, t.classList.add(Bi), this._activateParents(t), j.trigger(this._element, Fi, { + relatedTarget: t + })) + } + _activateParents(t) { + if (t.classList.contains("dropdown-item")) K.findOne(".dropdown-toggle", t.closest(".dropdown")).classList.add(Bi); + else + for (const e of K.parents(t, ".nav, .list-group")) + for (const t of K.prev(e, Ri)) t.classList.add(Bi) + } + _clearActiveClass(t) { + t.classList.remove(Bi); + const e = K.find(`${qi}.${Bi}`, t); + for (const t of e) t.classList.remove(Bi) + } + static jQueryInterface(t) { + return this.each((function() { + const e = Qi.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + j.on(window, Hi, (() => { + for (const t of K.find('[data-bs-spy="scroll"]')) Qi.getOrCreateInstance(t) + })), b(Qi); + const Xi = ".bs.tab", + Yi = `hide${Xi}`, + Ui = `hidden${Xi}`, + Gi = `show${Xi}`, + Ji = `shown${Xi}`, + Zi = `click${Xi}`, + ts = `keydown${Xi}`, + es = `load${Xi}`, + is = "ArrowLeft", + ss = "ArrowRight", + ns = "ArrowUp", + os = "ArrowDown", + rs = "Home", + as = "End", + ls = "active", + cs = "fade", + hs = "show", + ds = ".dropdown-toggle", + us = `:not(${ds})`, + _s = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', + gs = `.nav-link${us}, .list-group-item${us}, [role="tab"]${us}, ${_s}`, + fs = `.${ls}[data-bs-toggle="tab"], .${ls}[data-bs-toggle="pill"], .${ls}[data-bs-toggle="list"]`; + class ms extends W { + constructor(t) { + super(t), this._parent = this._element.closest('.list-group, .nav, [role="tablist"]'), this._parent && (this._setInitialAttributes(this._parent, this._getChildren()), j.on(this._element, ts, (t => this._keydown(t)))) + } + static get NAME() { + return "tab" + } + show() { + const t = this._element; + if (this._elemIsActive(t)) return; + const e = this._getActiveElem(), + i = e ? j.trigger(e, Yi, { + relatedTarget: t + }) : null; + j.trigger(t, Gi, { + relatedTarget: e + }).defaultPrevented || i && i.defaultPrevented || (this._deactivate(e, t), this._activate(t, e)) + } + _activate(t, e) { + t && (t.classList.add(ls), this._activate(K.getElementFromSelector(t)), this._queueCallback((() => { + "tab" === t.getAttribute("role") ? (t.removeAttribute("tabindex"), t.setAttribute("aria-selected", !0), this._toggleDropDown(t, !0), j.trigger(t, Ji, { + relatedTarget: e + })) : t.classList.add(hs) + }), t, t.classList.contains(cs))) + } + _deactivate(t, e) { + t && (t.classList.remove(ls), t.blur(), this._deactivate(K.getElementFromSelector(t)), this._queueCallback((() => { + "tab" === t.getAttribute("role") ? (t.setAttribute("aria-selected", !1), t.setAttribute("tabindex", "-1"), this._toggleDropDown(t, !1), j.trigger(t, Ui, { + relatedTarget: e + })) : t.classList.remove(hs) + }), t, t.classList.contains(cs))) + } + _keydown(t) { + if (![is, ss, ns, os, rs, as].includes(t.key)) return; + t.stopPropagation(), t.preventDefault(); + const e = this._getChildren().filter((t => !d(t))); + let i; + if ([rs, as].includes(t.key)) i = e[t.key === rs ? 0 : e.length - 1]; + else { + const s = [ss, os].includes(t.key); + i = w(e, t.target, s, !0) + } + i && (i.focus({ + preventScroll: !0 + }), ms.getOrCreateInstance(i).show()) + } + _getChildren() { + return K.find(gs, this._parent) + } + _getActiveElem() { + return this._getChildren().find((t => this._elemIsActive(t))) || null + } + _setInitialAttributes(t, e) { + this._setAttributeIfNotExists(t, "role", "tablist"); + for (const t of e) this._setInitialAttributesOnChild(t) + } + _setInitialAttributesOnChild(t) { + t = this._getInnerElement(t); + const e = this._elemIsActive(t), + i = this._getOuterElement(t); + t.setAttribute("aria-selected", e), i !== t && this._setAttributeIfNotExists(i, "role", "presentation"), e || t.setAttribute("tabindex", "-1"), this._setAttributeIfNotExists(t, "role", "tab"), this._setInitialAttributesOnTargetPanel(t) + } + _setInitialAttributesOnTargetPanel(t) { + const e = K.getElementFromSelector(t); + e && (this._setAttributeIfNotExists(e, "role", "tabpanel"), t.id && this._setAttributeIfNotExists(e, "aria-labelledby", `${t.id}`)) + } + _toggleDropDown(t, e) { + const i = this._getOuterElement(t); + if (!i.classList.contains("dropdown")) return; + const s = (t, s) => { + const n = K.findOne(t, i); + n && n.classList.toggle(s, e) + }; + s(ds, ls), s(".dropdown-menu", hs), i.setAttribute("aria-expanded", e) + } + _setAttributeIfNotExists(t, e, i) { + t.hasAttribute(e) || t.setAttribute(e, i) + } + _elemIsActive(t) { + return t.classList.contains(ls) + } + _getInnerElement(t) { + return t.matches(gs) ? t : K.findOne(gs, t) + } + _getOuterElement(t) { + return t.closest(".nav-item, .list-group-item") || t + } + static jQueryInterface(t) { + return this.each((function() { + const e = ms.getOrCreateInstance(this); + if ("string" == typeof t) { + if (void 0 === e[t] || t.startsWith("_") || "constructor" === t) throw new TypeError(`No method named "${t}"`); + e[t]() + } + })) + } + } + j.on(document, Zi, _s, (function(t) { + ["A", "AREA"].includes(this.tagName) && t.preventDefault(), d(this) || ms.getOrCreateInstance(this).show() + })), j.on(window, es, (() => { + for (const t of K.find(fs)) ms.getOrCreateInstance(t) + })), b(ms); + const ps = ".bs.toast", + bs = `mouseover${ps}`, + vs = `mouseout${ps}`, + ys = `focusin${ps}`, + ws = `focusout${ps}`, + As = `hide${ps}`, + Es = `hidden${ps}`, + Cs = `show${ps}`, + Ts = `shown${ps}`, + ks = "hide", + $s = "show", + Ss = "showing", + Ls = { + animation: "boolean", + autohide: "boolean", + delay: "number" + }, + Os = { + animation: !0, + autohide: !0, + delay: 5e3 + }; + class Is extends W { + constructor(t, e) { + super(t, e), this._timeout = null, this._hasMouseInteraction = !1, this._hasKeyboardInteraction = !1, this._setListeners() + } + static get Default() { + return Os + } + static get DefaultType() { + return Ls + } + static get NAME() { + return "toast" + } + show() { + j.trigger(this._element, Cs).defaultPrevented || (this._clearTimeout(), this._config.animation && this._element.classList.add("fade"), this._element.classList.remove(ks), g(this._element), this._element.classList.add($s, Ss), this._queueCallback((() => { + this._element.classList.remove(Ss), j.trigger(this._element, Ts), this._maybeScheduleHide() + }), this._element, this._config.animation)) + } + hide() { + this.isShown() && (j.trigger(this._element, As).defaultPrevented || (this._element.classList.add(Ss), this._queueCallback((() => { + this._element.classList.add(ks), this._element.classList.remove(Ss, $s), j.trigger(this._element, Es) + }), this._element, this._config.animation))) + } + dispose() { + this._clearTimeout(), this.isShown() && this._element.classList.remove($s), super.dispose() + } + isShown() { + return this._element.classList.contains($s) + } + _maybeScheduleHide() { + this._config.autohide && (this._hasMouseInteraction || this._hasKeyboardInteraction || (this._timeout = setTimeout((() => { + this.hide() + }), this._config.delay))) + } + _onInteraction(t, e) { + switch (t.type) { + case "mouseover": + case "mouseout": + this._hasMouseInteraction = e; + break; + case "focusin": + case "focusout": + this._hasKeyboardInteraction = e + } + if (e) return void this._clearTimeout(); + const i = t.relatedTarget; + this._element === i || this._element.contains(i) || this._maybeScheduleHide() + } + _setListeners() { + j.on(this._element, bs, (t => this._onInteraction(t, !0))), j.on(this._element, vs, (t => this._onInteraction(t, !1))), j.on(this._element, ys, (t => this._onInteraction(t, !0))), j.on(this._element, ws, (t => this._onInteraction(t, !1))) + } + _clearTimeout() { + clearTimeout(this._timeout), this._timeout = null + } + static jQueryInterface(t) { + return this.each((function() { + const e = Is.getOrCreateInstance(this, t); + if ("string" == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](this) + } + })) + } + } + return V(Is), b(Is), { + Alert: U, + Button: J, + Carousel: Ot, + Collapse: Rt, + Dropdown: fe, + Modal: Ue, + Offcanvas: gi, + Popover: Mi, + ScrollSpy: Qi, + Tab: ms, + Toast: Is, + Tooltip: Ni + } +})); +//# sourceMappingURL=bootstrap.min.js.map \ No newline at end of file diff --git a/src/main/resources/static/css/body-form-styles.css b/src/main/resources/static/css/body-form-styles.css new file mode 100644 index 0000000..ed516d5 --- /dev/null +++ b/src/main/resources/static/css/body-form-styles.css @@ -0,0 +1,192 @@ +body { + margin: 0; + padding: 0; + font-family: Arial, sans-serif; + background: linear-gradient(45deg, #f6f7fb, #4ca3b3); + background-repeat: no-repeat; +} + +.form-title { + text-align: center; + margin-bottom: 20px; + font-size: 1.8rem; + color: #003366; + text-decoration: underline; +} + +.header-row { + display: flex; + align-items: center; + gap: 20px; + margin-bottom: 20px; +} + +.back-button { + background-color: white; + border: 2px solid black !important; + border-radius: 4px; + padding: 10px 20px; + border-radius: 5px; + font-size: 16px; + position: relative; /* override absolute */ + color: #005f73; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; +} + +.back-button:hover { + background: #4ca3b3; + transform: scale(1.05); + color: #000000; +} + +.back-to-home-btn { + background-color: white; + border: 2px solid black !important; + border-radius: 4px; + padding: 10px 20px; + border-radius: 5px; + font-size: 16px; + position: relative; /* override absolute */ + color: #005f73; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; +} + +.back-to-home-btn:hover { + background: #4ca3b3; + transform: scale(1.05); + color: #000000; +} + +.required { + color: red; + font-weight: bold; +} + +.container { + padding: 20px; + max-width: 1200px; + margin: 0 auto; + width: 100%; +} + +h2 { + color: #0B3954; + margin-bottom: 30px; +} + +.form-container { + background: white; + padding: 30px; + border-radius: 10px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; + margin-bottom: 20px; +} + +.form-group { + margin-bottom: 20px; + display: flex; + flex-direction: column; +} + +.form-group label { + margin-bottom: 5px; + font-weight: bold; + color: #333; +} + +.form-control { + padding: 8px; + border: 1px solid #ddd; + border-radius: 4px; +} + +.file-input { + display: flex; + gap: 10px; +} + +.file-input button { + background: #f0f0f0; + border: none; + padding: 8px 15px; + border-radius: 4px; +} + +.radio-group { + display: flex; + gap: 20px; +} + +.radio-option { + display: flex; + align-items: center; + gap: 5px; +} + +.submit-btn { + display: flex; + justify-content: center; + margin-top: 20px; +} + +.submit-btn input[type="submit"]:disabled { + background-color: #cccccc; /* grey color */ + color: #666666; + cursor: not-allowed; +} + +.submit-btn input[type="submit"] { + background-color: #005f73; + color: #fff; + font-size: 1rem; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + transition: background 0.3s ease; +} + +.submit-btn input[type="submit"]:hover { + background: #005f05; +} +/* Responsive Design for Tablets */ +@media ( max-width : 768px) { + .form-row { + grid-template-columns: 1fr; + } + .form-container { + padding: 20px; + } + .form-title { + font-size: 1.5rem; + } + .form-control { + font-size: 1rem; + } +} + +/* Responsive Design for Mobile */ +@media ( max-width : 480px) { + .form-row { + grid-template-columns: 1fr; + } + .submit-btn input[type="submit"] { + width: 100%; + font-size: 1.2rem; + padding: 12px; + } + .form-container { + padding: 15px; + } + .form-title { + font-size: 1.2rem; + } +} \ No newline at end of file diff --git a/src/main/resources/static/css/btn-secondary-styles.css b/src/main/resources/static/css/btn-secondary-styles.css new file mode 100644 index 0000000..94e8f42 --- /dev/null +++ b/src/main/resources/static/css/btn-secondary-styles.css @@ -0,0 +1,12 @@ +.btn-secondary { + background-color: white !important; + color: black !important; + border: 2px solid black !important; + padding: 5px 10px; + border-radius: 4px; +} + +.btn-secondary:hover { + background-color: #6c757d !important; + color: white !important; +} \ No newline at end of file diff --git a/src/main/resources/static/css/datatable-styles.css b/src/main/resources/static/css/datatable-styles.css new file mode 100644 index 0000000..06273a1 --- /dev/null +++ b/src/main/resources/static/css/datatable-styles.css @@ -0,0 +1,98 @@ +#custom-info { + display: flex; + align-items: center; +} + +#custom-length { + display: flex; + align-items: center; + gap: 8px; /* Add spacing between dropdown and label */ + white-space: nowrap; /* Prevent wrapping */ +} + +.dataTables_length label { + display: flex; + align-items: center; + margin: 0; + gap: 5px; /* Adjust spacing between text and dropdown */ +} + +.dataTables_length select { + display: inline-block; + width: auto; /* Ensure dropdown adjusts to content */ +} + +#custom-pagination { + display: flex; + justify-content: flex-end; /* Align pagination to the right */ + align-items: center; +} + +.dataTables_filter { + display: none; +} + +/* Apply border-radius to the table */ +.det-table { + width: 125%; + border-collapse: separate; + border-spacing: 0; + border: 2px solid #f0f0f0; + margin-top: 20px; + font-family: Arial, sans-serif; + font-size: 14px; + table-layout: auto; + border-radius: 12px; + overflow: hidden; +} + +.det-table th, .det-table td { + border: 1px solid #e0e0e0; + padding: 12px; + text-align: center; +} + +.det-table td.no-word-wrap { + white-space: nowrap; +} + +.det-table th { + background-color: #005f73; + color: white; + text-align: center; +} + +.det-table tr:nth-child(even) { + background-color: #f9f9f9; +} + +.det-table tr:hover { + background-color: #f1f1f1; +} + +.det-table th, .det-table td { + text-align: center; +} + +.view-btn { + background-color: #005f73; + color: white; + padding: 5px 10px; + border: none; + border-radius: 4px; +} + +.view-btn:hover { + background-color: #005f05; +} + +@media (max-width: 767.98px) { + .btn-group { + width: 100%; + justify-content: center; + } + .btn-group .btn { + width: 48%; /* make buttons fill container nicely */ + margin: 1px; + } +} diff --git a/src/main/resources/static/css/header-styles.css b/src/main/resources/static/css/header-styles.css new file mode 100644 index 0000000..08d61d8 --- /dev/null +++ b/src/main/resources/static/css/header-styles.css @@ -0,0 +1,77 @@ +.header { + background-color: #005f73; + padding: 10px 20px; + display: flex; + align-items: center; + /* justify-content: space-between; */ + position: relative; + color: white; +} + +.header .logo-left img { + height: 60px; + width: 60px; + margin-right: 10px; +} + +.header .title { + text-align: center; + /* flex-grow: 1; */ + position: absolute; + transform: translateX(-50%); + left: 50% +} + +.header .title h2 { + margin: 0; + font-size: 1.5rem; +} + +.header .logos-right img { + height: 60px; + margin-left: 10px; +} + +.header .logo-left { + display: flex; + align-items: center; +} + +.header .logo-text { + display: flex; + flex-direction: column; + line-height: 1; +} + +.header .logo-text h2 { + margin: 0; + font-size: 0.8rem; + color: white; + font-weight: bold; +} + +.header .logo-text p { + margin: 0; + font-size: 0.5rem; + color: white; +} + +@media ( max-width : 480px) { + .header { + flex-direction: column; + align-items: flex-start; + position: relative; + } + .header .logo-left img { + margin-bottom: 10px; + } + .header .logos-right img { + margin-bottom: 10px; + } + .header .title { + position: static; /* Reset absolute positioning */ + transform: none; /* Remove the translate effect */ + margin-top: 10px; + text-align: center; /* Ensure the text stays centered */ + } +} \ No newline at end of file diff --git a/src/main/resources/static/css/home-styles.css b/src/main/resources/static/css/home-styles.css new file mode 100644 index 0000000..08dcc2f --- /dev/null +++ b/src/main/resources/static/css/home-styles.css @@ -0,0 +1,40 @@ +.button-row { + display: flex; + justify-content: center; + gap: 40px; + margin-top: 20px; +} + +.stats { + color: #005f73; + font-weight: bold; +} + +.custom-button { + padding: 15px 30px; + background: white; + border: 1px solid #ccc; + border-radius: 10px; + font-size: 1rem; + color: #005f73; + cursor: pointer; + transition: background-color 0.3s, transform 0.2s; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.custom-button:hover { + background: #4ca3b3; + transform: scale(1.05); + color: #000000; +} + +.custom-button:active { + transform: scale(0.95); +} + +@media (max-width : 768px) { + .button-row { + flex-direction: column; + gap: 20px; + } +} \ No newline at end of file diff --git a/src/main/resources/static/css/login-form-styles.css b/src/main/resources/static/css/login-form-styles.css new file mode 100644 index 0000000..3015eb7 --- /dev/null +++ b/src/main/resources/static/css/login-form-styles.css @@ -0,0 +1,272 @@ +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 100; + src: url("/poppins-23.0/fonts/devanagari/poppins-v23-devanagari-700.woff2") format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 200; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-200.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 300; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-300.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 400; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-regular.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 500; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-500.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 600; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-600.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 700; + src: url("../poppins-23.0/fonts/devanagari/poppins-v23-devanagari-700.woff2") + format("woff2"); +} + +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 100; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-100.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 200; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-200.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 300; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-300.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 400; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-regular.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 500; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-500.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 600; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-600.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 700; + src: url("../poppins-23.0/fonts/latin-ext/poppins-v23-latin-ext-700.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 100; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-100.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 200; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-200.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 300; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-300.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 400; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-regular.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 500; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-500.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 600; + src: url("../poppins-23.0/fonts/latin/poppins-v23-latin-600.woff2") + format("woff2"); +} +@font-face { + font-family: "Poppins"; + font-style: normal; + font-weight: 700; + src: url("/poppins-23.0/fonts/latin/poppins-v23-latin-700.woff2") + format("woff2"); +} + +* { + margin: 0; + border: 0; + padding: 0; + box-sizing: border-box; + font-family: "Poppins", sans-serif; +} + +body { + background: linear-gradient(45deg, #f6f7fb, #4ca3b3); + background-repeat: no-repeat; + min-height: 100vh; + min-width: 100vw; + display: flex; + align-items: center; + justify-content: center; + height: 100%; + margin: 0; + padding: 0; +} + +div.container { + background: white; + min-width: 320px; + min-height: 33vh; + padding: 2rem; + box-shadow: 5px 5px 15px rgba(0, 0, 0, 0.2); + border-radius: 8px; +} + +div h2 { + font-weight: 600; + margin-bottom: 2rem; + position: relative; +} + +.container h3, +.container h4 { + text-align: center; +} + +div h2::before { + content: ""; + position: absolute; + height: 4px; + width: 25px; + bottom: 3px; + left: 0; + border-radius: 8px; + background: #005f73; +} + +form { + display: flex; + flex-direction: column; +} + +.input-field { + position: relative; + margin-bottom: 1.5rem; /* instead of targeting only first-child */ +} + +.input-field .underline::before { + content: ""; + position: absolute; + height: 1px; + width: 100%; + bottom: -5px; + left: 0; + background: rgba(0, 0, 0, 0.2); +} + +.input-field .underline::after { + content: ""; + position: absolute; + height: 1px; + width: 100%; + bottom: -5px; + left: 0; + background: linear-gradient(45deg, #8e2de2, #4a00e0); + transform: scaleX(0); + transition: all 0.3s ease-in-out; + transform-origin: left; +} + +.input-field input:focus ~ .underline::after { + transform: scaleX(1); +} + +.input-field input { + outline: none; + font-size: 0.9rem; + color: rgba(0, 0, 0, 0.7); + width: 100%; +} + +.input-field input::placeholder { + color: rgba(0, 0, 0, 0.5); +} + +form input[type="submit"] { + margin-top: 2rem; + padding: 0.4rem; + width: 100%; + background: #005f73; + cursor: pointer; + color: white; + font-size: 0.9rem; + font-weight: 300; + border-radius: 4px; + transition: all 0.3s ease; +} + +form input[type="submit"]:hover { + letter-spacing: 0.5px; + background: #005f05; +} + +.small-logo { + width: 60px; + height: 60px; + display: block; + margin: 0 auto; /* Centers the image */ +} diff --git a/src/main/resources/static/css/view-file-detail-styles.css b/src/main/resources/static/css/view-file-detail-styles.css new file mode 100644 index 0000000..5c6db0c --- /dev/null +++ b/src/main/resources/static/css/view-file-detail-styles.css @@ -0,0 +1,58 @@ +.table-header { + background-color: #003366; + color: white; +} + +.table-bordered th, .table-bordered td { + border: 1px solid #003366; +} + +/* Make the cell a flex container so its contents are perfectly centered */ +.table-bordered td.status-cell { + display: flex; + align-items: center; /* vertical center */ + justify-content: center; /* horizontal center */ + padding: 8px; /* adjust if you want taller rows */ + vertical-align: middle; /* fallback */ +} + +.status-active, +.status-expired { + display: inline-flex; /* let the badge size to content */ + align-items: center; + justify-content: center; + padding: 6px 12px; /* pill padding */ + border-radius: 20px; /* pill */ + font-size: 14px; + font-weight: 700; + line-height: 1; + min-height: 32px; /* ensures nice vertical size */ + margin: 0; /* remove margins that push it off-center */ + white-space: nowrap; +} + +.fas.fa-eye { + background-color: white; + color: black; +} + +.fas.fa-eye:hover { + color: #6c757d; +} + +.pdf-container { + width: 100%; + height: 80vh; /* Responsive height: 80% of viewport height */ + overflow-y: auto; +} + +canvas { + width: 100% !important; /* Ensures canvas scales with container */ + height: auto !important; +} + +@media ( max-width : 768px) { + .responsive-text { + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/src/main/resources/static/css/view-file-styles.css b/src/main/resources/static/css/view-file-styles.css new file mode 100644 index 0000000..11736d3 --- /dev/null +++ b/src/main/resources/static/css/view-file-styles.css @@ -0,0 +1,60 @@ +.table-header { + background-color: #003366; + color: white; +} + +.table-bordered th, .table-bordered td { + border: 1px solid #003366; +} + +/* Make the cell a flex container so its contents are perfectly centered */ +.table-bordered td.status-cell { + display: flex; + align-items: center; /* vertical center */ + justify-content: center; /* horizontal center */ + padding: 8px; /* adjust if you want taller rows */ + vertical-align: middle; /* fallback */ +} + +.status-active, +.status-expired { + display: inline-flex; /* let the badge size to content */ + align-items: center; + justify-content: center; + padding: 6px 12px; /* pill padding */ + border-radius: 20px; /* pill */ + font-size: 14px; + font-weight: 700; + line-height: 1; + min-height: 32px; /* ensures nice vertical size */ + margin: 0; /* remove margins that push it off-center */ + white-space: nowrap; +} + +.pdf-container { + width: 100%; + height: 80vh; /* Responsive height: 80% of viewport height */ + overflow-y: auto; +} + +/* Colors (use contrast-friendly text color) */ +.status-active { + background-color: #28a745; + color: black +} + +.status-expired { + background-color: #dc3545; + color: black +} + +canvas { + width: 100% !important; /* Ensures canvas scales with container */ + height: auto !important; +} + +@media ( max-width : 768px) { + .responsive-text { + font-size: 0.9rem; + } +} \ No newline at end of file diff --git a/src/main/resources/static/datatables-1.13.6/css/dataTables.bootstrap5.min.css b/src/main/resources/static/datatables-1.13.6/css/dataTables.bootstrap5.min.css new file mode 100644 index 0000000..cb4962b --- /dev/null +++ b/src/main/resources/static/datatables-1.13.6/css/dataTables.bootstrap5.min.css @@ -0,0 +1,532 @@ +:root { + --dt-row-selected: 13, 110, 253; + --dt-row-selected-text: 255, 255, 255; + --dt-row-selected-link: 9, 10, 11; + --dt-row-stripe: 0, 0, 0; + --dt-row-hover: 0, 0, 0; + --dt-column-ordering: 0, 0, 0; + --dt-html-background: white; +} + +:root.dark { + --dt-html-background: rgb(33, 37, 41); +} + +table.dataTable td.dt-control { + text-align: center; + cursor: pointer; +} + +table.dataTable td.dt-control:before { + display: inline-block; + color: rgba(0, 0, 0, 0.5); + content: "►"; +} + +table.dataTable tr.dt-hasChild td.dt-control:before { + content: "▼"; +} + +html.dark table.dataTable td.dt-control:before { + color: rgba(255, 255, 255, 0.5); +} + +html.dark table.dataTable tr.dt-hasChild td.dt-control:before { + color: rgba(255, 255, 255, 0.5); +} + +table.dataTable thead > tr > th.sorting, +table.dataTable thead > tr > th.sorting_asc, +table.dataTable thead > tr > th.sorting_desc, +table.dataTable thead > tr > th.sorting_asc_disabled, +table.dataTable thead > tr > th.sorting_desc_disabled, +table.dataTable thead > tr > td.sorting, +table.dataTable thead > tr > td.sorting_asc, +table.dataTable thead > tr > td.sorting_desc, +table.dataTable thead > tr > td.sorting_asc_disabled, +table.dataTable thead > tr > td.sorting_desc_disabled { + cursor: pointer; + position: relative; + padding-right: 26px; +} + +table.dataTable thead > tr > th.sorting:before, +table.dataTable thead > tr > th.sorting:after, +table.dataTable thead > tr > th.sorting_asc:before, +table.dataTable thead > tr > th.sorting_asc:after, +table.dataTable thead > tr > th.sorting_desc:before, +table.dataTable thead > tr > th.sorting_desc:after, +table.dataTable thead > tr > th.sorting_asc_disabled:before, +table.dataTable thead > tr > th.sorting_asc_disabled:after, +table.dataTable thead > tr > th.sorting_desc_disabled:before, +table.dataTable thead > tr > th.sorting_desc_disabled:after, +table.dataTable thead > tr > td.sorting:before, +table.dataTable thead > tr > td.sorting:after, +table.dataTable thead > tr > td.sorting_asc:before, +table.dataTable thead > tr > td.sorting_asc:after, +table.dataTable thead > tr > td.sorting_desc:before, +table.dataTable thead > tr > td.sorting_desc:after, +table.dataTable thead > tr > td.sorting_asc_disabled:before, +table.dataTable thead > tr > td.sorting_asc_disabled:after, +table.dataTable thead > tr > td.sorting_desc_disabled:before, +table.dataTable thead > tr > td.sorting_desc_disabled:after { + position: absolute; + display: block; + opacity: 0.125; + right: 10px; + line-height: 9px; + font-size: 0.8em; +} + +table.dataTable thead > tr > th.sorting:before, +table.dataTable thead > tr > th.sorting_asc:before, +table.dataTable thead > tr > th.sorting_desc:before, +table.dataTable thead > tr > th.sorting_asc_disabled:before, +table.dataTable thead > tr > th.sorting_desc_disabled:before, +table.dataTable thead > tr > td.sorting:before, +table.dataTable thead > tr > td.sorting_asc:before, +table.dataTable thead > tr > td.sorting_desc:before, +table.dataTable thead > tr > td.sorting_asc_disabled:before, +table.dataTable thead > tr > td.sorting_desc_disabled:before { + bottom: 50%; + content: "▲"; + content: "▲"/""; +} + +table.dataTable thead > tr > th.sorting:after, +table.dataTable thead > tr > th.sorting_asc:after, +table.dataTable thead > tr > th.sorting_desc:after, +table.dataTable thead > tr > th.sorting_asc_disabled:after, +table.dataTable thead > tr > th.sorting_desc_disabled:after, +table.dataTable thead > tr > td.sorting:after, +table.dataTable thead > tr > td.sorting_asc:after, +table.dataTable thead > tr > td.sorting_desc:after, +table.dataTable thead > tr > td.sorting_asc_disabled:after, +table.dataTable thead > tr > td.sorting_desc_disabled:after { + top: 50%; + content: "▼"; + content: "▼"/""; +} + +table.dataTable thead > tr > th.sorting_asc:before, +table.dataTable thead > tr > th.sorting_desc:after, +table.dataTable thead > tr > td.sorting_asc:before, +table.dataTable thead > tr > td.sorting_desc:after { + opacity: 0.6; +} + +table.dataTable thead > tr > th.sorting_desc_disabled:after, +table.dataTable thead > tr > th.sorting_asc_disabled:before, +table.dataTable thead > tr > td.sorting_desc_disabled:after, +table.dataTable thead > tr > td.sorting_asc_disabled:before { + display: none; +} + +table.dataTable thead > tr > th:active, +table.dataTable thead > tr > td:active { + outline: none; +} + +div.dataTables_scrollBody > table.dataTable > thead > tr > th:before, +div.dataTables_scrollBody > table.dataTable > thead > tr > th:after, +div.dataTables_scrollBody > table.dataTable > thead > tr > td:before, +div.dataTables_scrollBody > table.dataTable > thead > tr > td:after { + display: none; +} + +div.dataTables_processing { + position: absolute; + top: 50%; + left: 50%; + width: 200px; + margin-left: -100px; + margin-top: -26px; + text-align: center; + padding: 2px; +} + +div.dataTables_processing > div:last-child { + position: relative; + width: 80px; + height: 15px; + margin: 1em auto; +} + +div.dataTables_processing > div:last-child > div { + position: absolute; + top: 0; + width: 13px; + height: 13px; + border-radius: 50%; + background: rgb(13, 110, 253); + background: rgb(var(--dt-row-selected)); + animation-timing-function: cubic-bezier(0, 1, 1, 0); +} + +div.dataTables_processing > div:last-child > div:nth-child(1) { + left: 8px; + animation: datatables-loader-1 0.6s infinite; +} + +div.dataTables_processing > div:last-child > div:nth-child(2) { + left: 8px; + animation: datatables-loader-2 0.6s infinite; +} + +div.dataTables_processing > div:last-child > div:nth-child(3) { + left: 32px; + animation: datatables-loader-2 0.6s infinite; +} + +div.dataTables_processing > div:last-child > div:nth-child(4) { + left: 56px; + animation: datatables-loader-3 0.6s infinite; +} + +@keyframes datatables-loader-1 { + 0% { + transform: scale(0); + } + + 100% { + transform: scale(1); + } +} +@keyframes datatables-loader-3 { + 0% { + transform: scale(1); + } + + 100% { + transform: scale(0); + } +} +@keyframes datatables-loader-2 { + 0% { + transform: translate(0, 0); + } + + 100% { + transform: translate(24px, 0); + } +} +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +table.dataTable th.dt-left, +table.dataTable td.dt-left { + text-align: left; +} + +table.dataTable th.dt-center, +table.dataTable td.dt-center, +table.dataTable td.dataTables_empty { + text-align: center; +} + +table.dataTable th.dt-right, +table.dataTable td.dt-right { + text-align: right; +} + +table.dataTable th.dt-justify, +table.dataTable td.dt-justify { + text-align: justify; +} + +table.dataTable th.dt-nowrap, +table.dataTable td.dt-nowrap { + white-space: nowrap; +} + +table.dataTable thead th, +table.dataTable thead td, +table.dataTable tfoot th, +table.dataTable tfoot td { + text-align: left; +} + +table.dataTable thead th.dt-head-left, +table.dataTable thead td.dt-head-left, +table.dataTable tfoot th.dt-head-left, +table.dataTable tfoot td.dt-head-left { + text-align: left; +} + +table.dataTable thead th.dt-head-center, +table.dataTable thead td.dt-head-center, +table.dataTable tfoot th.dt-head-center, +table.dataTable tfoot td.dt-head-center { + text-align: center; +} + +table.dataTable thead th.dt-head-right, +table.dataTable thead td.dt-head-right, +table.dataTable tfoot th.dt-head-right, +table.dataTable tfoot td.dt-head-right { + text-align: right; +} + +table.dataTable thead th.dt-head-justify, +table.dataTable thead td.dt-head-justify, +table.dataTable tfoot th.dt-head-justify, +table.dataTable tfoot td.dt-head-justify { + text-align: justify; +} + +table.dataTable thead th.dt-head-nowrap, +table.dataTable thead td.dt-head-nowrap, +table.dataTable tfoot th.dt-head-nowrap, +table.dataTable tfoot td.dt-head-nowrap { + white-space: nowrap; +} + +table.dataTable tbody th.dt-body-left, +table.dataTable tbody td.dt-body-left { + text-align: left; +} + +table.dataTable tbody th.dt-body-center, +table.dataTable tbody td.dt-body-center { + text-align: center; +} + +table.dataTable tbody th.dt-body-right, +table.dataTable tbody td.dt-body-right { + text-align: right; +} + +table.dataTable tbody th.dt-body-justify, +table.dataTable tbody td.dt-body-justify { + text-align: justify; +} + +table.dataTable tbody th.dt-body-nowrap, +table.dataTable tbody td.dt-body-nowrap { + white-space: nowrap; +} /*! Bootstrap 5 integration for DataTables + * + * ©2020 SpryMedia Ltd, all rights reserved. + * License: MIT datatables.net/license/mit + */ +table.dataTable { + clear: both; + margin-top: 6px !important; + margin-bottom: 6px !important; + max-width: none !important; + border-collapse: separate !important; + border-spacing: 0; +} + +table.dataTable td, +table.dataTable th { + -webkit-box-sizing: content-box; + box-sizing: content-box; +} + +table.dataTable td.dataTables_empty, +table.dataTable th.dataTables_empty { + text-align: center; +} + +table.dataTable.nowrap th, +table.dataTable.nowrap td { + white-space: nowrap; +} + +table.dataTable.table-striped > tbody > tr:nth-of-type(2n + 1) > * { + box-shadow: none; +} + +table.dataTable > tbody > tr { + background-color: transparent; +} + +table.dataTable > tbody > tr.selected > * { + box-shadow: inset 0 0 0 9999px rgb(13, 110, 253); + box-shadow: inset 0 0 0 9999px rgb(var(--dt-row-selected)); + color: rgb(255, 255, 255); + color: rgb(var(--dt-row-selected-text)); +} + +table.dataTable > tbody > tr.selected a { + color: rgb(9, 10, 11); + color: rgb(var(--dt-row-selected-link)); +} + +table.dataTable.table-striped > tbody > tr.odd > * { + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.05); +} + +table.dataTable.table-striped > tbody > tr.odd.selected > * { + box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.95); + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95); +} + +table.dataTable.table-hover > tbody > tr:hover > * { + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.075); +} + +table.dataTable.table-hover > tbody > tr.selected:hover > * { + box-shadow: inset 0 0 0 9999px rgba(13, 110, 253, 0.975); + box-shadow: inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.975); +} + +div.dataTables_wrapper div.dataTables_length label { + font-weight: normal; + text-align: left; + white-space: nowrap; +} + +div.dataTables_wrapper div.dataTables_length select { + width: auto; + display: inline-block; +} + +div.dataTables_wrapper div.dataTables_filter { + text-align: right; +} + +div.dataTables_wrapper div.dataTables_filter label { + font-weight: normal; + white-space: nowrap; + text-align: left; +} + +div.dataTables_wrapper div.dataTables_filter input { + margin-left: 0.5em; + display: inline-block; + width: auto; +} + +div.dataTables_wrapper div.dataTables_info { + padding-top: 0.85em; +} + +div.dataTables_wrapper div.dataTables_paginate { + margin: 0; + white-space: nowrap; + text-align: right; +} + +div.dataTables_wrapper div.dataTables_paginate ul.pagination { + margin: 2px 0; + white-space: nowrap; + justify-content: flex-end; +} + +div.dataTables_wrapper div.dt-row { + position: relative; +} + +div.dataTables_scrollHead table.dataTable { + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table { + border-top: none; + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +div.dataTables_scrollBody > table > thead .sorting:before, +div.dataTables_scrollBody > table > thead .sorting_asc:before, +div.dataTables_scrollBody > table > thead .sorting_desc:before, +div.dataTables_scrollBody > table > thead .sorting:after, +div.dataTables_scrollBody > table > thead .sorting_asc:after, +div.dataTables_scrollBody > table > thead .sorting_desc:after { + display: none; +} + +div.dataTables_scrollBody > table > tbody tr:first-child th, +div.dataTables_scrollBody > table > tbody tr:first-child td { + border-top: none; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner { + box-sizing: content-box; +} + +div.dataTables_scrollFoot > .dataTables_scrollFootInner > table { + margin-top: 0 !important; + border-top: none; +} + +@media screen and (max-width: 767px) { + div.dataTables_wrapper div.dataTables_length, + div.dataTables_wrapper div.dataTables_filter, + div.dataTables_wrapper div.dataTables_info, + div.dataTables_wrapper div.dataTables_paginate { + text-align: center; + } + div.dataTables_wrapper div.dataTables_paginate ul.pagination { + justify-content: center !important; + } +} + +table.dataTable.table-sm > thead > tr > th:not(.sorting_disabled) { + padding-right: 20px; +} + +table.table-bordered.dataTable { + border-right-width: 0; +} + +table.table-bordered.dataTable thead tr:first-child th, +table.table-bordered.dataTable thead tr:first-child td { + border-top-width: 1px; +} + +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-left-width: 0; +} + +table.table-bordered.dataTable th:first-child, +table.table-bordered.dataTable th:first-child, +table.table-bordered.dataTable td:first-child, +table.table-bordered.dataTable td:first-child { + border-left-width: 1px; +} + +table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable th:last-child, +table.table-bordered.dataTable td:last-child, +table.table-bordered.dataTable td:last-child { + border-right-width: 1px; +} + +table.table-bordered.dataTable th, +table.table-bordered.dataTable td { + border-bottom-width: 1px; +} + +div.dataTables_scrollHead table.table-bordered { + border-bottom-width: 0; +} + +div.table-responsive > div.dataTables_wrapper > div.row { + margin: 0; +} + +div.table-responsive + > div.dataTables_wrapper + > div.row + > div[class^="col-"]:first-child { + padding-left: 0; +} + +div.table-responsive + > div.dataTables_wrapper + > div.row + > div[class^="col-"]:last-child { + padding-right: 0; +} + +:root[data-bs-theme="dark"] { + --dt-row-hover: 255, 255, 255; + --dt-row-stripe: 255, 255, 255; + --dt-column-ordering: 255, 255, 255; +} diff --git a/src/main/resources/static/datatables-1.13.6/js/dataTables.bootstrap5.min.js b/src/main/resources/static/datatables-1.13.6/js/dataTables.bootstrap5.min.js new file mode 100644 index 0000000..274a5bb --- /dev/null +++ b/src/main/resources/static/datatables-1.13.6/js/dataTables.bootstrap5.min.js @@ -0,0 +1,80 @@ +/*! DataTables Bootstrap 5 integration + * 2020 SpryMedia Ltd - datatables.net/license + */ +! function(t) { + var n, r; + "function" == typeof define && define.amd ? define(["jquery", "datatables.net"], function(e) { + return t(e, window, document) + }) : "object" == typeof exports ? (n = require("jquery"), r = function(e, a) { + a.fn.dataTable || require("datatables.net")(e, a) + }, "undefined" == typeof window ? module.exports = function(e, a) { + return e = e || window, a = a || n(e), r(e, a), t(a, 0, e.document) + } : (r(window, n), module.exports = t(n, window, window.document))) : t(jQuery, window, document) +}(function(x, e, r, o) { + "use strict"; + var i = x.fn.dataTable; + return x.extend(!0, i.defaults, { + dom: "<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>><'row dt-row'<'col-sm-12'tr>><'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>", + renderer: "bootstrap" + }), x.extend(i.ext.classes, { + sWrapper: "dataTables_wrapper dt-bootstrap5", + sFilterInput: "form-control form-control-sm", + sLengthSelect: "form-select form-select-sm", + sProcessing: "dataTables_processing card", + sPageButton: "paginate_button page-item" + }), i.ext.renderer.pageButton.bootstrap = function(d, e, s, a, l, c) { + function u(e, a) { + for (var t, n, r = function(e) { + e.preventDefault(), x(e.currentTarget).hasClass("disabled") || b.page() == e.data.action || b.page(e.data.action).draw("page") + }, o = 0, i = a.length; o < i; o++) + if (t = a[o], Array.isArray(t)) u(e, t); + else { + switch (f = p = "", t) { + case "ellipsis": + p = "…", f = "disabled"; + break; + case "first": + p = g.sFirst, f = t + (0 < l ? "" : " disabled"); + break; + case "previous": + p = g.sPrevious, f = t + (0 < l ? "" : " disabled"); + break; + case "next": + p = g.sNext, f = t + (l < c - 1 ? "" : " disabled"); + break; + case "last": + p = g.sLast, f = t + (l < c - 1 ? "" : " disabled"); + break; + default: + p = t + 1, f = l === t ? "active" : "" + } + p && (n = -1 !== f.indexOf("disabled"), n = x("
  • ", { + class: m.sPageButton + " " + f, + id: 0 === s && "string" == typeof t ? d.sTableId + "_" + t : null + }).append(x("", { + href: n ? null : "#", + "aria-controls": d.sTableId, + "aria-disabled": n ? "true" : null, + "aria-label": w[t], + role: "link", + "aria-current": "active" === f ? "page" : null, + "data-dt-idx": t, + tabindex: n ? -1 : d.iTabIndex, + class: "page-link" + }).html(p)).appendTo(e), d.oApi._fnBindAction(n, { + action: t + }, r)) + } + } + var p, f, t, b = new i.Api(d), + m = d.oClasses, + g = d.oLanguage.oPaginate, + w = d.oLanguage.oAria.paginate || {}, + e = x(e); + try { + t = e.find(r.activeElement).data("dt-idx") + } catch (e) { } + var n = e.children("ul.pagination"); + n.length ? n.empty() : n = e.html("